diff --git a/BuildLinux.sh b/BuildLinux.sh index 9b4709b6e4..f60e5c5f34 100755 --- a/BuildLinux.sh +++ b/BuildLinux.sh @@ -5,7 +5,7 @@ export ROOT=$(dirname $(readlink -f ${0})) set -e # exit on first error function check_available_memory_and_disk() { - FREE_MEM_GB=$(free -g -t | grep 'Mem:' | rev | cut -d" " -f1 | rev) + FREE_MEM_GB=$(free -g -t | grep 'Mem' | rev | cut -d" " -f1 | rev) MIN_MEM_GB=10 FREE_DISK_KB=$(df -k . | tail -1 | awk '{print $4}') diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt index 02a07ffd3b..a21cc1bb5c 100644 --- a/deps/CMakeLists.txt +++ b/deps/CMakeLists.txt @@ -253,6 +253,7 @@ include(JPEG/JPEG.cmake) include(TIFF/TIFF.cmake) include(wxWidgets/wxWidgets.cmake) include(OCCT/OCCT.cmake) +include(OpenCV/OpenCV.cmake) include(FREETYPE/FREETYPE.cmake) set(_dep_list @@ -264,6 +265,7 @@ set(_dep_list dep_NLopt dep_OpenVDB dep_OpenCSG + dep_OpenCV dep_CGAL dep_OpenSSL dep_GLFW diff --git a/deps/OpenCV/OpenCV.cmake b/deps/OpenCV/OpenCV.cmake new file mode 100644 index 0000000000..f19569e86e --- /dev/null +++ b/deps/OpenCV/OpenCV.cmake @@ -0,0 +1,72 @@ +if (MSVC) + set(_use_IPP "-DWITH_IPP=ON") +else () + set(_use_IPP "-DWITH_IPP=OFF") +endif () + +orcaslicer_add_cmake_project(OpenCV + URL https://github.com/opencv/opencv/archive/refs/tags/4.6.0.tar.gz + URL_HASH SHA256=1ec1cba65f9f20fe5a41fda1586e01c70ea0c9a6d7b67c9e13edf0cfe2239277 + CMAKE_ARGS + -DBUILD_SHARED_LIBS=0 + -DBUILD_PERE_TESTS=OFF + -DBUILD_TESTS=OFF + -DBUILD_opencv_python_tests=OFF + -DBUILD_EXAMPLES=OFF + -DBUILD_JASPER=OFF + -DBUILD_JAVA=OFF + -DBUILD_JPEG=ON + -DBUILD_APPS_LIST=version + -DBUILD_opencv_apps=OFF + -DBUILD_opencv_java=OFF + -DBUILD_OPENEXR=OFF + -DBUILD_PNG=ON + -DBUILD_TBB=OFF + -DBUILD_WEBP=OFF + -DBUILD_ZLIB=OFF + -DWITH_1394=OFF + -DWITH_CUDA=OFF + -DWITH_EIGEN=ON + ${_use_IPP} + -DWITH_ITT=OFF + -DWITH_FFMPEG=OFF + -DWITH_GPHOTO2=OFF + -DWITH_GSTREAMER=OFF + -DOPENCV_GAPI_GSTREAMER=OFF + -DWITH_GTK_2_X=OFF + -DWITH_JASPER=OFF + -DWITH_LAPACK=OFF + -DWITH_MATLAB=OFF + -DWITH_MFX=OFF + -DWITH_DIRECTX=OFF + -DWITH_DIRECTML=OFF + -DWITH_OPENCL=OFF + -DWITH_OPENCL_D3D11_NV=OFF + -DWITH_OPENCLAMDBLAS=OFF + -DWITH_OPENCLAMDFFT=OFF + -DWITH_OPENEXR=OFF + -DWITH_OPENJPEG=OFF + -DWITH_QUIRC=OFF + -DWITH_VTK=OFF + -DWITH_WEBP=OFF + -DENABLE_PRECOMPILED_HEADERS=OFF + -DINSTALL_TESTS=OFF + -DINSTALL_C_EXAMPLES=OFF + -DINSTALL_PYTHON_EXAMPLES=OFF + -DOPENCV_GENERATE_SETUPVARS=OFF + -DOPENCV_INSTALL_FFMPEG_DOWNLOAD_SCRIPT=OFF + -DBUILD_opencv_python2=OFF + -DBUILD_opencv_python3=OFF + -DWITH_OPENVINO=OFF + -DWITH_INF_ENGINE=OFF + -DWITH_NGRAPH=OFF + -DBUILD_WITH_STATIC_CRT=OFF#set /MDd /MD + -DBUILD_LIST=core,imgcodecs,imgproc,world + -DBUILD_opencv_highgui=OFF + -DWITH_ADE=OFF + -DBUILD_opencv_world=ON + -DWITH_PROTOBUF=OFF + -DWITH_WIN32UI=OFF + -DHAVE_WIN32UI=FALSE +) + diff --git a/localization/i18n/OrcaSlicer.pot b/localization/i18n/OrcaSlicer.pot index 5a109815d4..870f89f130 100644 --- a/localization/i18n/OrcaSlicer.pot +++ b/localization/i18n/OrcaSlicer.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-16 16:45+0200\n" +"POT-Creation-Date: 2024-04-28 18:11+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -2327,10 +2327,10 @@ msgstr "" msgid "AMS not connected" msgstr "" -msgid "Load Filament" +msgid "Load" msgstr "" -msgid "Unload Filament" +msgid "Unload" msgstr "" msgid "Ext Spool" @@ -2348,7 +2348,7 @@ msgstr "" msgid "Calibrating AMS..." msgstr "" -msgid "A problem occured during calibration. Click to view the solution." +msgid "A problem occurred during calibration. Click to view the solution." msgstr "" msgid "Calibrate again" @@ -2389,7 +2389,7 @@ msgstr "" msgid "" "Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically " -"load or unload filiament." +"load or unload filaments." msgstr "" msgid "Edit" @@ -2937,6 +2937,14 @@ msgid "" "automatically when current filament runs out" msgstr "" +msgid "Air Printing Detection" +msgstr "" + +msgid "" +"Detects clogging and filament grinding, halting printing immediately to " +"conserve time and filament." +msgstr "" + msgid "File" msgstr "" @@ -3323,18 +3331,6 @@ msgstr "" msgid "Nozzle clog pause" msgstr "" -msgid "MC" -msgstr "" - -msgid "MainBoard" -msgstr "" - -msgid "TH" -msgstr "" - -msgid "XCam" -msgstr "" - msgid "Unknown" msgstr "" @@ -3854,7 +3850,7 @@ msgstr "" msgid "Size:" msgstr "" -#, possible-boost-format +#, possible-c-format, possible-boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -3985,6 +3981,9 @@ msgstr "" msgid "Device" msgstr "" +msgid "Multi-device" +msgstr "" + msgid "Project" msgstr "" @@ -4024,6 +4023,9 @@ msgstr "" msgid "Send all" msgstr "" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "" @@ -4789,9 +4791,6 @@ msgstr "" msgid "Bed" msgstr "" -msgid "Unload" -msgstr "" - msgid "Debug Info" msgstr "" @@ -4959,9 +4958,6 @@ msgstr "" msgid "Update" msgstr "" -msgid "HMS" -msgstr "" - msgid "Don't show again" msgstr "" @@ -5201,6 +5197,12 @@ msgstr "" msgid "Filament Tangle Detect" msgstr "" +msgid "Nozzle Clumping Detection" +msgstr "" + +msgid "Check if the nozzle is clumping by filament or other foreign objects." +msgstr "" + msgid "Nozzle Type" msgstr "" @@ -5608,15 +5610,21 @@ msgstr "" msgid "prepare 3mf file..." msgstr "" +msgid "Download failed, unknown file format." +msgstr "" + msgid "downloading project ..." msgstr "" +msgid "Download failed, File size exception." +msgstr "" + #, possible-c-format, possible-boost-format msgid "Project downloaded %d%%" msgstr "" msgid "" -"Importing to Orca Slicer failed. Please download the file and manually " +"Importing to Bambu Studio failed. Please download the file and manually " "import it." msgstr "" @@ -5874,6 +5882,21 @@ msgstr "" msgid "Units" msgstr "" +msgid "Allow only one OrcaSlicer instance" +msgstr "" + +msgid "" +"On OSX there is always only one instance of app running by default. However " +"it is allowed to run multiple instances of same app from the command line. " +"In such case this settings will allow only one instance." +msgstr "" + +msgid "" +"If this is enabled, when starting OrcaSlicer and another instance of the " +"same OrcaSlicer is already running, that instance will be reactivated " +"instead." +msgstr "" + msgid "Home" msgstr "" @@ -5948,6 +5971,14 @@ msgid "" "each printer automatically." msgstr "" +msgid "Multi-device Management(Take effect after restarting Studio)." +msgstr "" + +msgid "" +"With this option enabled, you can send a task to multiple devices at the " +"same time and manage multiple devices." +msgstr "" + msgid "Network" msgstr "" @@ -6550,6 +6581,9 @@ msgstr "" msgid "Modifying the device name" msgstr "" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "" @@ -6601,6 +6635,26 @@ msgstr "" msgid "Unknown Failure" msgstr "" +msgid "" +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." +msgstr "" + +msgid "Can't find Pin Code?" +msgstr "" + +msgid "Pin Code" +msgstr "" + +msgid "Binding..." +msgstr "" + +msgid "Please confirm on the printer screen" +msgstr "" + +msgid "Log in failed. Please check the Pin Code." +msgstr "" + msgid "Log in printer" msgstr "" @@ -6769,8 +6823,8 @@ msgstr "" msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" msgid "Line width" @@ -7724,6 +7778,39 @@ msgstr "" msgid "resume" msgstr "" +msgid "Resume Printing" +msgstr "" + +msgid "Resume Printing(defects acceptable)" +msgstr "" + +msgid "Resume Printing(problem solved)" +msgstr "" + +msgid "Stop Printing" +msgstr "" + +msgid "Check Assistant" +msgstr "" + +msgid "Filament Extruded, Continue" +msgstr "" + +msgid "Not Extruded Yet, Retry" +msgstr "" + +msgid "Finished, Continue" +msgstr "" + +msgid "Load Filament" +msgstr "" + +msgid "Filament Loaded, Resume" +msgstr "" + +msgid "View Liveview" +msgstr "" + msgid "Confirm and Update Nozzle" msgstr "" @@ -9552,6 +9639,9 @@ msgstr "" msgid "Lightning" msgstr "" +msgid "Cross Hatch" +msgstr "" + msgid "Sparse infill anchor length" msgstr "" @@ -9713,10 +9803,10 @@ msgstr "" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" msgid "Support interface fan speed" @@ -12096,6 +12186,9 @@ msgstr "" msgid "load_obj: failed to parse" msgstr "" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "" @@ -12212,6 +12305,14 @@ msgstr "" msgid "The input value size must be 3." msgstr "" +msgid "" +"This machine type can only hold 16 history results per nozzle. You can " +"delete the existing historical results and then start calibration. Or you " +"can continue the calibration, but you cannot create new calibration " +"historical results. \n" +"Do you still want to continue the calibration?" +msgstr "" + msgid "Connecting to printer..." msgstr "" @@ -12221,6 +12322,19 @@ msgstr "" msgid "Flow Dynamics Calibration result has been saved to the printer" msgstr "" +#, possible-c-format, possible-boost-format +msgid "" +"There is already a historical calibration result with the same name: %s. " +"Only one of the results with the same name is saved. Are you sure you want " +"to override the historical result?" +msgstr "" + +#, possible-c-format, possible-boost-format +msgid "" +"This machine type can only hold %d history results per nozzle. This result " +"will not be saved." +msgstr "" + msgid "Internal Error" msgstr "" @@ -12446,9 +12560,6 @@ msgstr "" msgid "Printing Parameters" msgstr "" -msgid "- ℃" -msgstr "" - msgid "Plate Type" msgstr "" @@ -12492,12 +12603,6 @@ msgstr "" msgid "Step value" msgstr "" -msgid "0.5" -msgstr "" - -msgid "0.005" -msgstr "" - msgid "The nozzle diameter has been synchronized from the printer Settings" msgstr "" @@ -12525,10 +12630,14 @@ msgstr "" msgid "Action" msgstr "" +#, possible-c-format, possible-boost-format +msgid "This machine type can only hold %d history results per nozzle." +msgstr "" + msgid "Edit Flow Dynamics Calibration" msgstr "" -msgid "New Flow Dynamics Calibration" +msgid "New Flow Dynamic Calibration" msgstr "" msgid "Ok" @@ -12537,13 +12646,6 @@ msgstr "" msgid "The filament must be selected." msgstr "" -#, possible-c-format, possible-boost-format -msgid "" -"There is already a historical calibration result with the same name: %s. " -"Only one of the results with the same name is saved. Are you sure you want " -"to override the historical result?" -msgstr "" - msgid "Network lookup" msgstr "" @@ -12924,8 +13026,8 @@ msgid "" msgstr "" msgid "" -"We would rename the presets as \"Vendor Type Serial @printer you " -"selected\". \n" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" "To add preset for more printers, Please go to printer selection" msgstr "" @@ -13468,6 +13570,175 @@ msgid "" "Error: \"%2%\"" msgstr "" +msgid "" +"It has a small layer height, and results in almost negligible layer lines " +"and high printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has lower speeds " +"and acceleration, and the sparse infill pattern is Gyroid. So, it results in " +"much higher printing quality, but a much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a slightly " +"bigger layer height, and results in almost negligible layer lines, and " +"slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a bigger layer " +"height, and results in slightly visible layer lines, but shorter printing " +"time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"height, and results in almost invisible layer lines and higher printing " +"quality, but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost invisible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of 0.2 mm nozzle, it has a smaller layer " +"height, and results in minimal layer lines and higher printing quality, but " +"shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in minimal layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"It has a general layer height, and results in general layer lines and " +"printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in less apparent layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost negligible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and longer printing " +"time." +msgstr "" + +msgid "" +"It has a big layer height, and results in apparent layer lines and ordinary " +"printing quality and printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in much more apparent layer lines and much lower " +"printing quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and slight higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"It has a very big layer height, and results in very apparent layer lines, " +"low printing quality and general printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a bigger layer " +"height, and results in very apparent layer lines and much lower printing " +"quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a much bigger " +"layer height, and results in extremely apparent layer lines and much lower " +"printing quality, but much shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a slightly " +"smaller layer height, and results in slightly less but still apparent layer " +"lines and slightly higher printing quality, but longer printing time in some " +"printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a smaller layer " +"height, and results in less but still apparent layer lines and slightly " +"higher printing quality, but longer printing time in some printing cases." +msgstr "" + msgid "Connected to Obico successfully!" msgstr "" diff --git a/localization/i18n/ca/OrcaSlicer_ca.po b/localization/i18n/ca/OrcaSlicer_ca.po index cff4dbcc1a..8fcb6ede72 100644 --- a/localization/i18n/ca/OrcaSlicer_ca.po +++ b/localization/i18n/ca/OrcaSlicer_ca.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-16 16:45+0200\n" +"POT-Creation-Date: 2024-04-28 18:11+0800\n" "PO-Revision-Date: 2024-03-17 22:08+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -2426,11 +2426,11 @@ msgstr "Recàrrega automàtica" msgid "AMS not connected" msgstr "AMS no connectat" -msgid "Load Filament" -msgstr "Carregar Filament" +msgid "Load" +msgstr "" -msgid "Unload Filament" -msgstr "Descarregar Filament" +msgid "Unload" +msgstr "Descarregar" msgid "Ext Spool" msgstr "Bobina Ext" @@ -2447,7 +2447,7 @@ msgstr "Reintentar" msgid "Calibrating AMS..." msgstr "Calibrant AMS..." -msgid "A problem occured during calibration. Click to view the solution." +msgid "A problem occurred during calibration. Click to view the solution." msgstr "" "S'ha produït un problema durant el calibratge. Feu clic per veure la solució." @@ -2489,10 +2489,8 @@ msgstr "Agafar filament nou" msgid "" "Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically " -"load or unload filiament." +"load or unload filaments." msgstr "" -"Trieu una ranura AMS i premeu el botó \"Carregar\" o \"Descarregar\" per " -"carregar o descarregar el filament automàticament." msgid "Edit" msgstr "Editar" @@ -3115,6 +3113,14 @@ msgstr "" "AMS continuarà a una altra bobina amb les mateixes propietats del filament " "automàticament quan s'esgoti el filament actual" +msgid "Air Printing Detection" +msgstr "" + +msgid "" +"Detects clogging and filament grinding, halting printing immediately to " +"conserve time and filament." +msgstr "" + msgid "File" msgstr "Fitxer" @@ -3579,18 +3585,6 @@ msgstr "Pausa d'error de la primera capa" msgid "Nozzle clog pause" msgstr "Pausa d'obstrucció del broquet" -msgid "MC" -msgstr "MC" - -msgid "MainBoard" -msgstr "Placa Base" - -msgid "TH" -msgstr "TH" - -msgid "XCam" -msgstr "XCam" - msgid "Unknown" msgstr "Desconegut" @@ -4128,7 +4122,7 @@ msgstr "Volum:" msgid "Size:" msgstr "Mida:" -#, boost-format +#, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -4270,6 +4264,9 @@ msgstr "Previsualització" msgid "Device" msgstr "Dispositiu" +msgid "Multi-device" +msgstr "" + msgid "Project" msgstr "Projecte" @@ -4309,6 +4306,9 @@ msgstr "Imprimeix-ho tot" msgid "Send all" msgstr "Envia-ho tot" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "Dreceres de teclat" @@ -5108,9 +5108,6 @@ msgstr "Cambra" msgid "Bed" msgstr "Llit" -msgid "Unload" -msgstr "Descarregar" - msgid "Debug Info" msgstr "Informació de depuració" @@ -5297,9 +5294,6 @@ msgstr "Estat" msgid "Update" msgstr "Actualitzar" -msgid "HMS" -msgstr "HMS" - msgid "Don't show again" msgstr "No tornis a mostrar" @@ -5546,6 +5540,12 @@ msgstr "Permet senyals acústics" msgid "Filament Tangle Detect" msgstr "Detecció de filament enredat" +msgid "Nozzle Clumping Detection" +msgstr "" + +msgid "Check if the nozzle is clumping by filament or other foreign objects." +msgstr "" + msgid "Nozzle Type" msgstr "" @@ -6006,19 +6006,23 @@ msgstr "Important Model" msgid "prepare 3mf file..." msgstr "preparar el fitxer 3MF..." +msgid "Download failed, unknown file format." +msgstr "" + msgid "downloading project ..." msgstr "descarregant projecte ..." +msgid "Download failed, File size exception." +msgstr "" + #, c-format, boost-format msgid "Project downloaded %d%%" msgstr "Projecte descarregat %d%%" msgid "" -"Importing to Orca Slicer failed. Please download the file and manually " +"Importing to Bambu Studio failed. Please download the file and manually " "import it." msgstr "" -"La importació a Orca Slicer ha fallat. Descarregueu el fitxer manualment i " -"importeu-lo." msgid "Import SLA archive" msgstr "Importar fitxer SLA" @@ -6291,6 +6295,21 @@ msgstr "Imperial" msgid "Units" msgstr "Unitats" +msgid "Allow only one OrcaSlicer instance" +msgstr "" + +msgid "" +"On OSX there is always only one instance of app running by default. However " +"it is allowed to run multiple instances of same app from the command line. " +"In such case this settings will allow only one instance." +msgstr "" + +msgid "" +"If this is enabled, when starting OrcaSlicer and another instance of the " +"same OrcaSlicer is already running, that instance will be reactivated " +"instead." +msgstr "" + msgid "Home" msgstr "Inici" @@ -6372,6 +6391,14 @@ msgid "" "each printer automatically." msgstr "" +msgid "Multi-device Management(Take effect after restarting Studio)." +msgstr "" + +msgid "" +"With this option enabled, you can send a task to multiple devices at the " +"same time and manage multiple devices." +msgstr "" + msgid "Network" msgstr "" @@ -7024,6 +7051,9 @@ msgstr "Calibratge automàtic de flux mitjançant Micro Lidar" msgid "Modifying the device name" msgstr "Modificant el nom del dispositiu" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "Enviar a la targeta SD de la impressora" @@ -7079,6 +7109,26 @@ msgstr "Excedit el temps d'espera de l'informe d'inici de sessió" msgid "Unknown Failure" msgstr "Falla desconeguda" +msgid "" +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." +msgstr "" + +msgid "Can't find Pin Code?" +msgstr "" + +msgid "Pin Code" +msgstr "" + +msgid "Binding..." +msgstr "" + +msgid "Please confirm on the printer screen" +msgstr "" + +msgid "Log in failed. Please check the Pin Code." +msgstr "" + msgid "Log in printer" msgstr "Iniciar sessió a la impressora" @@ -7295,8 +7345,8 @@ msgstr "" msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "Quan graveu timelapse sense capçal d'impressió, es recomana afegir una " "\"Torre de Purga Timelapse\" \n" @@ -8332,6 +8382,39 @@ msgstr "Fet" msgid "resume" msgstr "" +msgid "Resume Printing" +msgstr "" + +msgid "Resume Printing(defects acceptable)" +msgstr "" + +msgid "Resume Printing(problem solved)" +msgstr "" + +msgid "Stop Printing" +msgstr "" + +msgid "Check Assistant" +msgstr "" + +msgid "Filament Extruded, Continue" +msgstr "" + +msgid "Not Extruded Yet, Retry" +msgstr "" + +msgid "Finished, Continue" +msgstr "" + +msgid "Load Filament" +msgstr "Carregar Filament" + +msgid "Filament Loaded, Resume" +msgstr "" + +msgid "View Liveview" +msgstr "" + msgid "Confirm and Update Nozzle" msgstr "Confirmar i Actualitzar el broquet" @@ -10662,6 +10745,9 @@ msgstr "Suport Cúbic" msgid "Lightning" msgstr "Llampec" +msgid "Cross Hatch" +msgstr "" + msgid "Sparse infill anchor length" msgstr "Longitud d'ancoratge de farciment poc dens" @@ -10864,15 +10950,15 @@ msgstr "Velocitat màxima del ventilador a la capa" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" "La velocitat del ventilador augmentarà linealment de zero a la capa " -"\"close_fan_the_first_x_layers\" al màxim a la capa " -"\"full_fan_speed_layer\". S'ignorarà \"full_fan_speed_layer\" si és inferior " -"a \"close_fan_the_first_x_layers\", en aquest cas el ventilador funcionarà a " +"\"close_fan_the_first_x_layers\" al màxim a la capa \"full_fan_speed_layer" +"\". S'ignorarà \"full_fan_speed_layer\" si és inferior a " +"\"close_fan_the_first_x_layers\", en aquest cas el ventilador funcionarà a " "la velocitat màxima permesa a la capa \"close_fan_the_first_x_layers\" + 1." msgid "Support interface fan speed" @@ -13859,6 +13945,9 @@ msgstr "Cancel·lat" msgid "load_obj: failed to parse" msgstr "load_obj: no s'ha pogut analitzar" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "El fitxer conté polígons amb més de 4 vèrtexs." @@ -13985,6 +14074,14 @@ msgstr "Seleccioneu el filament per calibrar." msgid "The input value size must be 3." msgstr "El valor de mida d'entrada ha de ser 3." +msgid "" +"This machine type can only hold 16 history results per nozzle. You can " +"delete the existing historical results and then start calibration. Or you " +"can continue the calibration, but you cannot create new calibration " +"historical results. \n" +"Do you still want to continue the calibration?" +msgstr "" + msgid "Connecting to printer..." msgstr "Connectant amb la impressora..." @@ -13996,6 +14093,19 @@ msgstr "" "El resultat del Calibratge de les Dinàmiques de Flux s'ha desat a la " "impressora" +#, c-format, boost-format +msgid "" +"There is already a historical calibration result with the same name: %s. " +"Only one of the results with the same name is saved. Are you sure you want " +"to override the historical result?" +msgstr "" + +#, c-format, boost-format +msgid "" +"This machine type can only hold %d history results per nozzle. This result " +"will not be saved." +msgstr "" + msgid "Internal Error" msgstr "Error intern" @@ -14304,9 +14414,6 @@ msgstr "" msgid "Printing Parameters" msgstr "Paràmetres d'impressió" -msgid "- ℃" -msgstr "- °C" - msgid "Plate Type" msgstr "Tipus de placa" @@ -14355,12 +14462,6 @@ msgstr "Al valor k" msgid "Step value" msgstr "Valor del pas" -msgid "0.5" -msgstr "0,5" - -msgid "0.005" -msgstr "0,005" - msgid "The nozzle diameter has been synchronized from the printer Settings" msgstr "" "El diàmetre del broquet s'ha sincronitzat des de la configuració d'impressora" @@ -14390,10 +14491,14 @@ msgstr "" msgid "Action" msgstr "Acció" +#, c-format, boost-format +msgid "This machine type can only hold %d history results per nozzle." +msgstr "" + msgid "Edit Flow Dynamics Calibration" msgstr "Editeu el Calibratge de Dinàmiques de Flux" -msgid "New Flow Dynamics Calibration" +msgid "New Flow Dynamic Calibration" msgstr "" msgid "Ok" @@ -14402,13 +14507,6 @@ msgstr "" msgid "The filament must be selected." msgstr "" -#, c-format, boost-format -msgid "" -"There is already a historical calibration result with the same name: %s. " -"Only one of the results with the same name is saved. Are you sure you want " -"to override the historical result?" -msgstr "" - msgid "Network lookup" msgstr "Cerca de xarxa" @@ -14825,8 +14923,8 @@ msgstr "" "Vols reescriure'l?" msgid "" -"We would rename the presets as \"Vendor Type Serial @printer you " -"selected\". \n" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" "To add preset for more printers, Please go to printer selection" msgstr "" "Canviaríem el nom dels perfils seleccionats com a \"Proveïdor Tipus " @@ -15452,6 +15550,175 @@ msgstr "" "Cos del missatge: \"%1%\"\n" "Error: \"%2%\"" +msgid "" +"It has a small layer height, and results in almost negligible layer lines " +"and high printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has lower speeds " +"and acceleration, and the sparse infill pattern is Gyroid. So, it results in " +"much higher printing quality, but a much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a slightly " +"bigger layer height, and results in almost negligible layer lines, and " +"slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a bigger layer " +"height, and results in slightly visible layer lines, but shorter printing " +"time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"height, and results in almost invisible layer lines and higher printing " +"quality, but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost invisible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of 0.2 mm nozzle, it has a smaller layer " +"height, and results in minimal layer lines and higher printing quality, but " +"shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in minimal layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"It has a general layer height, and results in general layer lines and " +"printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in less apparent layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost negligible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and longer printing " +"time." +msgstr "" + +msgid "" +"It has a big layer height, and results in apparent layer lines and ordinary " +"printing quality and printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in much more apparent layer lines and much lower " +"printing quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and slight higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"It has a very big layer height, and results in very apparent layer lines, " +"low printing quality and general printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a bigger layer " +"height, and results in very apparent layer lines and much lower printing " +"quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a much bigger " +"layer height, and results in extremely apparent layer lines and much lower " +"printing quality, but much shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a slightly " +"smaller layer height, and results in slightly less but still apparent layer " +"lines and slightly higher printing quality, but longer printing time in some " +"printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a smaller layer " +"height, and results in less but still apparent layer lines and slightly " +"higher printing quality, but longer printing time in some printing cases." +msgstr "" + msgid "Connected to Obico successfully!" msgstr "" @@ -15882,6 +16149,47 @@ msgstr "" "augmentar adequadament la temperatura del llit pot reduir la probabilitat de " "deformació." +#~ msgid "Unload Filament" +#~ msgstr "Descarregar Filament" + +#~ msgid "" +#~ "Choose an AMS slot then press \"Load\" or \"Unload\" button to " +#~ "automatically load or unload filiament." +#~ msgstr "" +#~ "Trieu una ranura AMS i premeu el botó \"Carregar\" o \"Descarregar\" per " +#~ "carregar o descarregar el filament automàticament." + +#~ msgid "MC" +#~ msgstr "MC" + +#~ msgid "MainBoard" +#~ msgstr "Placa Base" + +#~ msgid "TH" +#~ msgstr "TH" + +#~ msgid "XCam" +#~ msgstr "XCam" + +#~ msgid "HMS" +#~ msgstr "HMS" + +#~ msgid "" +#~ "Importing to Orca Slicer failed. Please download the file and manually " +#~ "import it." +#~ msgstr "" +#~ "La importació a Orca Slicer ha fallat. Descarregueu el fitxer manualment " +#~ "i importeu-lo." + +#~ msgid "- ℃" +#~ msgstr "- °C" + +#~ msgid "0.5" +#~ msgstr "0,5" + +#~ msgid "0.005" +#~ msgstr "0,005" + #~ msgid "active" #~ msgstr "actiu" diff --git a/localization/i18n/cs/OrcaSlicer_cs.po b/localization/i18n/cs/OrcaSlicer_cs.po index 5efa8aacff..839359384c 100644 --- a/localization/i18n/cs/OrcaSlicer_cs.po +++ b/localization/i18n/cs/OrcaSlicer_cs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-16 16:45+0200\n" +"POT-Creation-Date: 2024-04-28 18:11+0800\n" "PO-Revision-Date: 2023-09-30 15:15+0200\n" "Last-Translator: René Mošner \n" "Language-Team: \n" @@ -2380,11 +2380,11 @@ msgstr "Automatické Doplnění" msgid "AMS not connected" msgstr "AMS není připojen" -msgid "Load Filament" -msgstr "Zavézt Filament" +msgid "Load" +msgstr "" -msgid "Unload Filament" -msgstr "Vysunout Filament" +msgid "Unload" +msgstr "Vysunout" msgid "Ext Spool" msgstr "Ext Cívka" @@ -2401,7 +2401,7 @@ msgstr "Zkusit znovu" msgid "Calibrating AMS..." msgstr "Kalibruji AMS..." -msgid "A problem occured during calibration. Click to view the solution." +msgid "A problem occurred during calibration. Click to view the solution." msgstr "Během kalibrace došlo k problému. Kliknutím zobrazíte řešení." msgid "Calibrate again" @@ -2442,10 +2442,8 @@ msgstr "Vezměte nový filament" msgid "" "Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically " -"load or unload filiament." +"load or unload filaments." msgstr "" -"Vyberte slot AMS a poté stiskněte \" Načíst \" nebo \" Uvolnit \" pro " -"automatické načtení nebo vyjměte vlákno." msgid "Edit" msgstr "Upravit" @@ -3057,6 +3055,14 @@ msgstr "" "AMS bude pokračovat na další cívku se stejnými vlastnostmi filamentu " "automaticky, když dojde aktuální filament" +msgid "Air Printing Detection" +msgstr "" + +msgid "" +"Detects clogging and filament grinding, halting printing immediately to " +"conserve time and filament." +msgstr "" + msgid "File" msgstr "Soubor" @@ -3509,18 +3515,6 @@ msgstr "" msgid "Nozzle clog pause" msgstr "" -msgid "MC" -msgstr "MC" - -msgid "MainBoard" -msgstr "Základní deska" - -msgid "TH" -msgstr "TH" - -msgid "XCam" -msgstr "XCam" - msgid "Unknown" msgstr "Neznámý" @@ -4055,7 +4049,7 @@ msgstr "Objem:" msgid "Size:" msgstr "Velikost:" -#, boost-format +#, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -4196,6 +4190,9 @@ msgstr "Náhled" msgid "Device" msgstr "Zařízení" +msgid "Multi-device" +msgstr "" + msgid "Project" msgstr "Projekt" @@ -4235,6 +4232,9 @@ msgstr "Vytisknout vše" msgid "Send all" msgstr "Odeslat vše" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "Klávesové zkratky" @@ -5025,9 +5025,6 @@ msgstr "Komora" msgid "Bed" msgstr "Podložka" -msgid "Unload" -msgstr "Vysunout" - msgid "Debug Info" msgstr "Informace o ladění" @@ -5211,9 +5208,6 @@ msgstr "Stav" msgid "Update" msgstr "Aktualizovat" -msgid "HMS" -msgstr "HMS" - msgid "Don't show again" msgstr "Znovu Nezobrazovat" @@ -5461,6 +5455,12 @@ msgstr "Povolit zvuky upozornění" msgid "Filament Tangle Detect" msgstr "" +msgid "Nozzle Clumping Detection" +msgstr "" + +msgid "Check if the nozzle is clumping by filament or other foreign objects." +msgstr "" + msgid "Nozzle Type" msgstr "" @@ -5912,18 +5912,23 @@ msgstr "Import modelu" msgid "prepare 3mf file..." msgstr "připravte soubor 3mf..." +msgid "Download failed, unknown file format." +msgstr "" + msgid "downloading project ..." msgstr "stahuji projekt ..." +msgid "Download failed, File size exception." +msgstr "" + #, c-format, boost-format msgid "Project downloaded %d%%" msgstr "Projekt stažen %d%%" msgid "" -"Importing to Orca Slicer failed. Please download the file and manually " +"Importing to Bambu Studio failed. Please download the file and manually " "import it." msgstr "" -"Import do Orca Sliceru selhal. Stáhněte soubor a proveďte jeho ruční import." msgid "Import SLA archive" msgstr "" @@ -6189,6 +6194,21 @@ msgstr "Imperiální" msgid "Units" msgstr "Jednotky" +msgid "Allow only one OrcaSlicer instance" +msgstr "" + +msgid "" +"On OSX there is always only one instance of app running by default. However " +"it is allowed to run multiple instances of same app from the command line. " +"In such case this settings will allow only one instance." +msgstr "" + +msgid "" +"If this is enabled, when starting OrcaSlicer and another instance of the " +"same OrcaSlicer is already running, that instance will be reactivated " +"instead." +msgstr "" + msgid "Home" msgstr "" @@ -6265,6 +6285,14 @@ msgid "" "each printer automatically." msgstr "" +msgid "Multi-device Management(Take effect after restarting Studio)." +msgstr "" + +msgid "" +"With this option enabled, you can send a task to multiple devices at the " +"same time and manage multiple devices." +msgstr "" + msgid "Network" msgstr "" @@ -6901,6 +6929,9 @@ msgstr "Automatická kalibrace průtoku pomocí Mikro Lidar" msgid "Modifying the device name" msgstr "Úprava názvu zařízení" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "Odeslat do tiskárny SD kartu" @@ -6953,6 +6984,26 @@ msgstr "Časový limit pro obdržení hlášení o přihlášení vypršel" msgid "Unknown Failure" msgstr "Neznámá chyba" +msgid "" +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." +msgstr "" + +msgid "Can't find Pin Code?" +msgstr "" + +msgid "Pin Code" +msgstr "" + +msgid "Binding..." +msgstr "" + +msgid "Please confirm on the printer screen" +msgstr "" + +msgid "Log in failed. Please check the Pin Code." +msgstr "" + msgid "Log in printer" msgstr "Přihlaste se k tiskárně" @@ -7156,8 +7207,8 @@ msgstr "" msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "Při nahrávání časosběru bez nástrojové hlavy se doporučuje přidat " "\"Timelapse Wipe Tower\" \n" @@ -8176,6 +8227,39 @@ msgstr "Hotovo" msgid "resume" msgstr "" +msgid "Resume Printing" +msgstr "" + +msgid "Resume Printing(defects acceptable)" +msgstr "" + +msgid "Resume Printing(problem solved)" +msgstr "" + +msgid "Stop Printing" +msgstr "" + +msgid "Check Assistant" +msgstr "" + +msgid "Filament Extruded, Continue" +msgstr "" + +msgid "Not Extruded Yet, Retry" +msgstr "" + +msgid "Finished, Continue" +msgstr "" + +msgid "Load Filament" +msgstr "Zavézt Filament" + +msgid "Filament Loaded, Resume" +msgstr "" + +msgid "View Liveview" +msgstr "" + msgid "Confirm and Update Nozzle" msgstr "" @@ -10259,6 +10343,9 @@ msgstr "Kubický podepíraný" msgid "Lightning" msgstr "Blesky" +msgid "Cross Hatch" +msgstr "" + msgid "Sparse infill anchor length" msgstr "Délka kotvy vnitřní výplně" @@ -10454,10 +10541,10 @@ msgstr "Maximální otáčky ventilátoru ve vrstvě" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" "Otáčky ventilátoru se lineárně zvýší z nuly ve vrstvě " "\"close_fan_first_layers\" na maximum ve vrstvě \"full_fan_speed_layer\". " @@ -13237,6 +13324,9 @@ msgstr "Zrušeno" msgid "load_obj: failed to parse" msgstr "load_obj: nepodařilo se zpracovat" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "Soubor obsahuje polygon s více než 4 vrcholy." @@ -13362,6 +13452,14 @@ msgstr "Vyberte prosím filament pro kalibraci." msgid "The input value size must be 3." msgstr "Velikost vstupní hodnoty musí být 3." +msgid "" +"This machine type can only hold 16 history results per nozzle. You can " +"delete the existing historical results and then start calibration. Or you " +"can continue the calibration, but you cannot create new calibration " +"historical results. \n" +"Do you still want to continue the calibration?" +msgstr "" + msgid "Connecting to printer..." msgstr "Připojování k tiskárně..." @@ -13371,6 +13469,19 @@ msgstr "Výsledek neúspěšného testu byl zahozen." msgid "Flow Dynamics Calibration result has been saved to the printer" msgstr "Výsledek kalibrace dynamiky průtoku byl uložen do tiskárny" +#, c-format, boost-format +msgid "" +"There is already a historical calibration result with the same name: %s. " +"Only one of the results with the same name is saved. Are you sure you want " +"to override the historical result?" +msgstr "" + +#, c-format, boost-format +msgid "" +"This machine type can only hold %d history results per nozzle. This result " +"will not be saved." +msgstr "" + msgid "Internal Error" msgstr "Interní chyba" @@ -13667,9 +13778,6 @@ msgstr "" msgid "Printing Parameters" msgstr "Parametry tisku" -msgid "- ℃" -msgstr "- ℃" - msgid "Plate Type" msgstr "Typ Podložky" @@ -13717,12 +13825,6 @@ msgstr "Do hodnoty k" msgid "Step value" msgstr "Krok hodnoty" -msgid "0.5" -msgstr "0.5" - -msgid "0.005" -msgstr "0.005" - msgid "The nozzle diameter has been synchronized from the printer Settings" msgstr "Průměr trysky byl synchronizován z Nastavení tiskárny" @@ -13750,10 +13852,14 @@ msgstr "Aktualizace historických záznamů kalibrace dynamiky průtoku probíh msgid "Action" msgstr "Akce" +#, c-format, boost-format +msgid "This machine type can only hold %d history results per nozzle." +msgstr "" + msgid "Edit Flow Dynamics Calibration" msgstr "Upravit kalibraci dynamiky průtoku" -msgid "New Flow Dynamics Calibration" +msgid "New Flow Dynamic Calibration" msgstr "" msgid "Ok" @@ -13762,13 +13868,6 @@ msgstr "" msgid "The filament must be selected." msgstr "" -#, c-format, boost-format -msgid "" -"There is already a historical calibration result with the same name: %s. " -"Only one of the results with the same name is saved. Are you sure you want " -"to override the historical result?" -msgstr "" - msgid "Network lookup" msgstr "Vyhledávání v síti" @@ -14167,8 +14266,8 @@ msgid "" msgstr "" msgid "" -"We would rename the presets as \"Vendor Type Serial @printer you " -"selected\". \n" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" "To add preset for more printers, Please go to printer selection" msgstr "" @@ -14722,6 +14821,175 @@ msgid "" "Error: \"%2%\"" msgstr "" +msgid "" +"It has a small layer height, and results in almost negligible layer lines " +"and high printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has lower speeds " +"and acceleration, and the sparse infill pattern is Gyroid. So, it results in " +"much higher printing quality, but a much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a slightly " +"bigger layer height, and results in almost negligible layer lines, and " +"slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a bigger layer " +"height, and results in slightly visible layer lines, but shorter printing " +"time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"height, and results in almost invisible layer lines and higher printing " +"quality, but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost invisible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of 0.2 mm nozzle, it has a smaller layer " +"height, and results in minimal layer lines and higher printing quality, but " +"shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in minimal layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"It has a general layer height, and results in general layer lines and " +"printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in less apparent layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost negligible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and longer printing " +"time." +msgstr "" + +msgid "" +"It has a big layer height, and results in apparent layer lines and ordinary " +"printing quality and printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in much more apparent layer lines and much lower " +"printing quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and slight higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"It has a very big layer height, and results in very apparent layer lines, " +"low printing quality and general printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a bigger layer " +"height, and results in very apparent layer lines and much lower printing " +"quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a much bigger " +"layer height, and results in extremely apparent layer lines and much lower " +"printing quality, but much shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a slightly " +"smaller layer height, and results in slightly less but still apparent layer " +"lines and slightly higher printing quality, but longer printing time in some " +"printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a smaller layer " +"height, and results in less but still apparent layer lines and slightly " +"higher printing quality, but longer printing time in some printing cases." +msgstr "" + msgid "Connected to Obico successfully!" msgstr "" @@ -14883,8 +15151,8 @@ msgid "" msgstr "" "Plochou na podložku\n" "Věděli jste, že můžete rychle nastavit orientaci modelu tak, aby jedna z " -"jeho stěn spočívala na tiskovém podloží? Vyberte funkci \"Plochou na " -"podložku\" nebo stiskněte klávesu F." +"jeho stěn spočívala na tiskovém podloží? Vyberte funkci \"Plochou na podložku" +"\" nebo stiskněte klávesu F." #: resources/data/hints.ini: [hint:Object List] msgid "" @@ -15100,6 +15368,47 @@ msgid "" "probability of warping." msgstr "" +#~ msgid "Unload Filament" +#~ msgstr "Vysunout Filament" + +#~ msgid "" +#~ "Choose an AMS slot then press \"Load\" or \"Unload\" button to " +#~ "automatically load or unload filiament." +#~ msgstr "" +#~ "Vyberte slot AMS a poté stiskněte \" Načíst \" nebo \" Uvolnit \" pro " +#~ "automatické načtení nebo vyjměte vlákno." + +#~ msgid "MC" +#~ msgstr "MC" + +#~ msgid "MainBoard" +#~ msgstr "Základní deska" + +#~ msgid "TH" +#~ msgstr "TH" + +#~ msgid "XCam" +#~ msgstr "XCam" + +#~ msgid "HMS" +#~ msgstr "HMS" + +#~ msgid "" +#~ "Importing to Orca Slicer failed. Please download the file and manually " +#~ "import it." +#~ msgstr "" +#~ "Import do Orca Sliceru selhal. Stáhněte soubor a proveďte jeho ruční " +#~ "import." + +#~ msgid "- ℃" +#~ msgstr "- ℃" + +#~ msgid "0.5" +#~ msgstr "0.5" + +#~ msgid "0.005" +#~ msgstr "0.005" + #~ msgid "active" #~ msgstr "aktivní" diff --git a/localization/i18n/de/OrcaSlicer_de.po b/localization/i18n/de/OrcaSlicer_de.po index 3c49c3d81b..e2276b8ae1 100644 --- a/localization/i18n/de/OrcaSlicer_de.po +++ b/localization/i18n/de/OrcaSlicer_de.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-16 16:45+0200\n" +"POT-Creation-Date: 2024-04-28 18:11+0800\n" "PO-Revision-Date: \n" "Last-Translator: Heiko Liebscher \n" "Language-Team: \n" @@ -2441,10 +2441,10 @@ msgstr "Automatisch nachfüllen" msgid "AMS not connected" msgstr "AMS nicht verbunden" -msgid "Load Filament" -msgstr "Laden" +msgid "Load" +msgstr "" -msgid "Unload Filament" +msgid "Unload" msgstr "Entladen" msgid "Ext Spool" @@ -2462,7 +2462,7 @@ msgstr "Wiederholen" msgid "Calibrating AMS..." msgstr "AMS kalibrieren..." -msgid "A problem occured during calibration. Click to view the solution." +msgid "A problem occurred during calibration. Click to view the solution." msgstr "" "Während der Kalibrierung ist ein Problem aufgetreten. Klicken Sie hier, um " "die Lösung zu sehen." @@ -2505,10 +2505,8 @@ msgstr "Neues Filament holen" msgid "" "Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically " -"load or unload filiament." +"load or unload filaments." msgstr "" -"Wählen Sie einen AMS-Slot und drücken Sie dann \"Laden\" oder \"Entladen\", " -"um automatisch Filament zu laden oder zu entladen." msgid "Edit" msgstr "Bearbeiten" @@ -3146,6 +3144,14 @@ msgstr "" "AMS wechselt automatisch zu einer anderen Spule mit denselben " "Filamenteigenschaften, wenn das aktuelle Filament leer ist." +msgid "Air Printing Detection" +msgstr "" + +msgid "" +"Detects clogging and filament grinding, halting printing immediately to " +"conserve time and filament." +msgstr "" + msgid "File" msgstr "Datei" @@ -3629,18 +3635,6 @@ msgstr "Pause bei Fehler der ersten Schicht" msgid "Nozzle clog pause" msgstr "Pause bei Düsenverstopfung" -msgid "MC" -msgstr "MC" - -msgid "MainBoard" -msgstr "Mainboard" - -msgid "TH" -msgstr "TH" - -msgid "XCam" -msgstr "XCam" - msgid "Unknown" msgstr "Unbekannt" @@ -4182,7 +4176,7 @@ msgstr "Volumen:" msgid "Size:" msgstr "Größe:" -#, boost-format +#, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -4325,6 +4319,9 @@ msgstr "Vorschau" msgid "Device" msgstr "Gerät" +msgid "Multi-device" +msgstr "" + msgid "Project" msgstr "Projekt" @@ -4366,6 +4363,9 @@ msgstr "Alle Platten drucken" msgid "Send all" msgstr "Sende alle" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "Tastaturkürzel" @@ -5193,9 +5193,6 @@ msgstr "Cham" msgid "Bed" msgstr "Druckbett" -msgid "Unload" -msgstr "Entladen" - msgid "Debug Info" msgstr "Debug-Informationen" @@ -5385,9 +5382,6 @@ msgstr "Status" msgid "Update" msgstr "Update" -msgid "HMS" -msgstr "HMS" - msgid "Don't show again" msgstr "Nicht erneut anzeigen" @@ -5637,6 +5631,12 @@ msgstr "Erlaube akustische Signale" msgid "Filament Tangle Detect" msgstr "Filamentverwicklung erkannt" +msgid "Nozzle Clumping Detection" +msgstr "" + +msgid "Check if the nozzle is clumping by filament or other foreign objects." +msgstr "" + msgid "Nozzle Type" msgstr "Düsentyp" @@ -6107,19 +6107,23 @@ msgstr "Modell importieren" msgid "prepare 3mf file..." msgstr "3mf-Datei vorbereiten…" +msgid "Download failed, unknown file format." +msgstr "" + msgid "downloading project ..." msgstr "Projekt wird heruntergeladen..." +msgid "Download failed, File size exception." +msgstr "" + #, c-format, boost-format msgid "Project downloaded %d%%" msgstr "Projekt heruntergeladen %d%%" msgid "" -"Importing to Orca Slicer failed. Please download the file and manually " +"Importing to Bambu Studio failed. Please download the file and manually " "import it." msgstr "" -"Der Import in Orca Slicer ist fehlgeschlagen. Bitte laden Sie die Datei " -"manuell herunter und importieren Sie sie." msgid "Import SLA archive" msgstr "SLA-Archiv importieren" @@ -6395,6 +6399,21 @@ msgstr "Imperial" msgid "Units" msgstr "Einheiten" +msgid "Allow only one OrcaSlicer instance" +msgstr "" + +msgid "" +"On OSX there is always only one instance of app running by default. However " +"it is allowed to run multiple instances of same app from the command line. " +"In such case this settings will allow only one instance." +msgstr "" + +msgid "" +"If this is enabled, when starting OrcaSlicer and another instance of the " +"same OrcaSlicer is already running, that instance will be reactivated " +"instead." +msgstr "" + msgid "Home" msgstr "Startseite" @@ -6476,6 +6495,14 @@ msgstr "" "Wenn aktiviert, merkt sich Orca die Filament-/Prozesskonfiguration für jeden " "Drucker und wechselt automatisch." +msgid "Multi-device Management(Take effect after restarting Studio)." +msgstr "" + +msgid "" +"With this option enabled, you can send a task to multiple devices at the " +"same time and manage multiple devices." +msgstr "" + msgid "Network" msgstr "Netzwerk" @@ -7052,8 +7079,8 @@ msgstr "" msgid "" "Timelapse is not supported because Print sequence is set to \"By object\"." msgstr "" -"Zeitraffer wird nicht unterstützt, da die Druckreihenfolge auf \"Nach " -"Objekt\" eingestellt ist." +"Zeitraffer wird nicht unterstützt, da die Druckreihenfolge auf \"Nach Objekt" +"\" eingestellt ist." msgid "Errors" msgstr "Fehler" @@ -7138,6 +7165,9 @@ msgstr "Automatische Flusskalibrierung mit Micro Lidar" msgid "Modifying the device name" msgstr "Den Gerätenamen ändern" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "An MicroSD-Karte des Druckers senden" @@ -7194,6 +7224,26 @@ msgstr "Zeitüberschreitung beim Empfang des Anmeldeberichts" msgid "Unknown Failure" msgstr "Unbekannter Fehler" +msgid "" +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." +msgstr "" + +msgid "Can't find Pin Code?" +msgstr "" + +msgid "Pin Code" +msgstr "" + +msgid "Binding..." +msgstr "" + +msgid "Please confirm on the printer screen" +msgstr "" + +msgid "Log in failed. Please check the Pin Code." +msgstr "" + msgid "Log in printer" msgstr "Drucker anmelden" @@ -7428,13 +7478,13 @@ msgstr "" msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "Wenn Sie einen Zeitraffer ohne Werkzeugkopf aufnehmen, wird empfohlen, einen " "\"Timelapse Wischturm\" hinzuzufügen, indem Sie mit der rechten Maustaste " -"auf die leere Position der Bauplatte klicken und \"Primitiv hinzufügen\"-" -">\"Timelapse Wischturm\" wählen." +"auf die leere Position der Bauplatte klicken und \"Primitiv hinzufügen\"->" +"\"Timelapse Wischturm\" wählen." msgid "Line width" msgstr "Breite der Linie" @@ -8486,6 +8536,39 @@ msgstr "Erledigt" msgid "resume" msgstr "Fortsetzen" +msgid "Resume Printing" +msgstr "" + +msgid "Resume Printing(defects acceptable)" +msgstr "" + +msgid "Resume Printing(problem solved)" +msgstr "" + +msgid "Stop Printing" +msgstr "" + +msgid "Check Assistant" +msgstr "" + +msgid "Filament Extruded, Continue" +msgstr "" + +msgid "Not Extruded Yet, Retry" +msgstr "" + +msgid "Finished, Continue" +msgstr "" + +msgid "Load Filament" +msgstr "Laden" + +msgid "Filament Loaded, Resume" +msgstr "" + +msgid "View Liveview" +msgstr "" + msgid "Confirm and Update Nozzle" msgstr "Bestätigen und Düse aktualisieren" @@ -10821,6 +10904,9 @@ msgstr "Kubisch Stützen" msgid "Lightning" msgstr "Blitz" +msgid "Cross Hatch" +msgstr "" + msgid "Sparse infill anchor length" msgstr "Länge des Infill-Ankers" @@ -11031,13 +11117,13 @@ msgstr "Volle Lüfterdrehzahl ab Schicht" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" -"Die Lüftergeschwindigkeit wird linear von Null bei der " -"Schicht\"close_fan_the_first_x_layers\" auf das Maximum bei der Schicht " +"Die Lüftergeschwindigkeit wird linear von Null bei der Schicht" +"\"close_fan_the_first_x_layers\" auf das Maximum bei der Schicht " "\"full_fan_speed_layer\" erhöht. \"full_fan_speed_layer\" wird ignoriert, " "wenn es niedriger ist als \"close_fan_the_first_x_layers\",in diesem Fall " "läuft der Lüfter bei Schicht \"close_fan_the_first_x_layers\"+ 1 mit maximal " @@ -14037,6 +14123,9 @@ msgstr "Abgebrochen" msgid "load_obj: failed to parse" msgstr "load_obj: konnte nicht analysiert werden" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "Die Datei enthält Polygone mit mehr als 4 Eckpunkten." @@ -14165,6 +14254,14 @@ msgstr "Bitte wählen Sie das Filament zur Kalibrierung aus." msgid "The input value size must be 3." msgstr "Die Eingabewertgröße muss 3 sein." +msgid "" +"This machine type can only hold 16 history results per nozzle. You can " +"delete the existing historical results and then start calibration. Or you " +"can continue the calibration, but you cannot create new calibration " +"historical results. \n" +"Do you still want to continue the calibration?" +msgstr "" + msgid "Connecting to printer..." msgstr "Verbindung zum Drucker wird hergestellt..." @@ -14174,6 +14271,22 @@ msgstr "Das fehlgeschlagene Testergebnis wurde verworfen." msgid "Flow Dynamics Calibration result has been saved to the printer" msgstr "Flussdynamik-Kalibrierungsergebnis wurde auf dem Drucker gespeichert" +#, c-format, boost-format +msgid "" +"There is already a historical calibration result with the same name: %s. " +"Only one of the results with the same name is saved. Are you sure you want " +"to override the historical result?" +msgstr "" +"Es gibt bereits ein historisches Kalibrierungsergebnis mit dem gleichen " +"Namen: %s. Nur eines der Ergebnisse mit dem gleichen Namen wird gespeichert. " +"Sind Sie sicher, dass Sie das historische Ergebnis überschreiben möchten?" + +#, c-format, boost-format +msgid "" +"This machine type can only hold %d history results per nozzle. This result " +"will not be saved." +msgstr "" + msgid "Internal Error" msgstr "Interner Fehler" @@ -14484,9 +14597,6 @@ msgstr "" msgid "Printing Parameters" msgstr "Druckparameter" -msgid "- ℃" -msgstr "- ℃" - msgid "Plate Type" msgstr "Druckbetttyp" @@ -14535,12 +14645,6 @@ msgstr "bis zum k Wert" msgid "Step value" msgstr "Schrittweite" -msgid "0.5" -msgstr "0,5" - -msgid "0.005" -msgstr "0,005" - msgid "The nozzle diameter has been synchronized from the printer Settings" msgstr "Der Düsendurchmesser wurde aus den Druckereinstellungen synchronisiert" @@ -14568,11 +14672,15 @@ msgstr "Erneuern der historischen Flussdynamik-Kalibrierungsdatensätze" msgid "Action" msgstr "Aktivität" +#, c-format, boost-format +msgid "This machine type can only hold %d history results per nozzle." +msgstr "" + msgid "Edit Flow Dynamics Calibration" msgstr "Ändern der Flussdynamik-Kalibrierung" -msgid "New Flow Dynamics Calibration" -msgstr "Neue Flussdynamik-Kalibrierung" +msgid "New Flow Dynamic Calibration" +msgstr "" msgid "Ok" msgstr "Ok" @@ -14580,16 +14688,6 @@ msgstr "Ok" msgid "The filament must be selected." msgstr "Das Filament muss ausgewählt werden." -#, c-format, boost-format -msgid "" -"There is already a historical calibration result with the same name: %s. " -"Only one of the results with the same name is saved. Are you sure you want " -"to override the historical result?" -msgstr "" -"Es gibt bereits ein historisches Kalibrierungsergebnis mit dem gleichen " -"Namen: %s. Nur eines der Ergebnisse mit dem gleichen Namen wird gespeichert. " -"Sind Sie sicher, dass Sie das historische Ergebnis überschreiben möchten?" - msgid "Network lookup" msgstr "Netzwerk durchsuchen" @@ -15013,8 +15111,8 @@ msgstr "" "Möchten Sie es überschreiben?" msgid "" -"We would rename the presets as \"Vendor Type Serial @printer you " -"selected\". \n" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" "To add preset for more printers, Please go to printer selection" msgstr "" "Wir würden die Voreinstellungen als \"Hersteller Typ Seriennummer @Drucker, " @@ -15655,6 +15753,175 @@ msgstr "" "Nachrichtentext: \"%1%\"\n" "Fehler: \"%2%\"" +msgid "" +"It has a small layer height, and results in almost negligible layer lines " +"and high printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has lower speeds " +"and acceleration, and the sparse infill pattern is Gyroid. So, it results in " +"much higher printing quality, but a much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a slightly " +"bigger layer height, and results in almost negligible layer lines, and " +"slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a bigger layer " +"height, and results in slightly visible layer lines, but shorter printing " +"time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"height, and results in almost invisible layer lines and higher printing " +"quality, but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost invisible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of 0.2 mm nozzle, it has a smaller layer " +"height, and results in minimal layer lines and higher printing quality, but " +"shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in minimal layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"It has a general layer height, and results in general layer lines and " +"printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in less apparent layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost negligible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and longer printing " +"time." +msgstr "" + +msgid "" +"It has a big layer height, and results in apparent layer lines and ordinary " +"printing quality and printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in much more apparent layer lines and much lower " +"printing quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and slight higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"It has a very big layer height, and results in very apparent layer lines, " +"low printing quality and general printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a bigger layer " +"height, and results in very apparent layer lines and much lower printing " +"quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a much bigger " +"layer height, and results in extremely apparent layer lines and much lower " +"printing quality, but much shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a slightly " +"smaller layer height, and results in slightly less but still apparent layer " +"lines and slightly higher printing quality, but longer printing time in some " +"printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a smaller layer " +"height, and results in less but still apparent layer lines and slightly " +"higher printing quality, but longer printing time in some printing cases." +msgstr "" + msgid "Connected to Obico successfully!" msgstr "Erfolgreich mit Obico verbunden!" @@ -16097,6 +16364,50 @@ msgstr "" "wie z.B. ABS, durch eine entsprechende Erhöhung der Heizbetttemperatur die " "Wahrscheinlichkeit von Verwerfungen verringert werden kann." +#~ msgid "Unload Filament" +#~ msgstr "Entladen" + +#~ msgid "" +#~ "Choose an AMS slot then press \"Load\" or \"Unload\" button to " +#~ "automatically load or unload filiament." +#~ msgstr "" +#~ "Wählen Sie einen AMS-Slot und drücken Sie dann \"Laden\" oder \"Entladen" +#~ "\", um automatisch Filament zu laden oder zu entladen." + +#~ msgid "MC" +#~ msgstr "MC" + +#~ msgid "MainBoard" +#~ msgstr "Mainboard" + +#~ msgid "TH" +#~ msgstr "TH" + +#~ msgid "XCam" +#~ msgstr "XCam" + +#~ msgid "HMS" +#~ msgstr "HMS" + +#~ msgid "" +#~ "Importing to Orca Slicer failed. Please download the file and manually " +#~ "import it." +#~ msgstr "" +#~ "Der Import in Orca Slicer ist fehlgeschlagen. Bitte laden Sie die Datei " +#~ "manuell herunter und importieren Sie sie." + +#~ msgid "- ℃" +#~ msgstr "- ℃" + +#~ msgid "0.5" +#~ msgstr "0,5" + +#~ msgid "0.005" +#~ msgstr "0,005" + +#~ msgid "New Flow Dynamics Calibration" +#~ msgstr "Neue Flussdynamik-Kalibrierung" + #~ msgid "" #~ "The 3mf file version is in Beta and it is newer than the current " #~ "OrcaSlicer version." @@ -16403,8 +16714,8 @@ msgstr "" #~ msgstr "Keine dünnen Schichten (EXPERIMENTELL)" #~ msgid "" -#~ "We would rename the presets as \"Vendor Type Serial @printer you " -#~ "selected\". \n" +#~ "We would rename the presets as \"Vendor Type Serial @printer you selected" +#~ "\". \n" #~ "To add preset for more prinetrs, Please go to printer selection" #~ msgstr "" #~ "Wir würden die Voreinstellungen als \"Hersteller Typ Seriennummer " diff --git a/localization/i18n/en/OrcaSlicer_en.po b/localization/i18n/en/OrcaSlicer_en.po index 00eea2416e..ecc46ba4e3 100644 --- a/localization/i18n/en/OrcaSlicer_en.po +++ b/localization/i18n/en/OrcaSlicer_en.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-16 16:45+0200\n" +"POT-Creation-Date: 2024-04-28 18:11+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -2348,10 +2348,10 @@ msgstr "" msgid "AMS not connected" msgstr "AMS not connected" -msgid "Load Filament" -msgstr "Load" +msgid "Load" +msgstr "" -msgid "Unload Filament" +msgid "Unload" msgstr "Unload" msgid "Ext Spool" @@ -2369,8 +2369,8 @@ msgstr "Retry" msgid "Calibrating AMS..." msgstr "Calibrating AMS..." -msgid "A problem occured during calibration. Click to view the solution." -msgstr "A problem occured during calibration. Click to view the solution." +msgid "A problem occurred during calibration. Click to view the solution." +msgstr "A problem occurred during calibration. Click to view the solution." msgid "Calibrate again" msgstr "Calibrate again" @@ -2410,10 +2410,8 @@ msgstr "Grab new filament" msgid "" "Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically " -"load or unload filiament." +"load or unload filaments." msgstr "" -"Choose an AMS slot then press \"Load\" or \"Unload\" to automatically load " -"or unload filament." msgid "Edit" msgstr "Edit" @@ -3015,6 +3013,14 @@ msgstr "" "AMS will continue to another spool with the same filament properties " "automatically when current filament runs out." +msgid "Air Printing Detection" +msgstr "" + +msgid "" +"Detects clogging and filament grinding, halting printing immediately to " +"conserve time and filament." +msgstr "" + msgid "File" msgstr "File" @@ -3462,18 +3468,6 @@ msgstr "" msgid "Nozzle clog pause" msgstr "" -msgid "MC" -msgstr "MC" - -msgid "MainBoard" -msgstr "MainBoard" - -msgid "TH" -msgstr "TH" - -msgid "XCam" -msgstr "XCam" - msgid "Unknown" msgstr "Unknown" @@ -3996,7 +3990,7 @@ msgstr "Volume:" msgid "Size:" msgstr "Size:" -#, boost-format +#, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -4136,6 +4130,9 @@ msgstr "Preview" msgid "Device" msgstr "Device" +msgid "Multi-device" +msgstr "" + msgid "Project" msgstr "Project" @@ -4175,6 +4172,9 @@ msgstr "Print all" msgid "Send all" msgstr "Send all" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "Keyboard Shortcuts" @@ -4950,9 +4950,6 @@ msgstr "Cham" msgid "Bed" msgstr "Bed" -msgid "Unload" -msgstr "Unload" - msgid "Debug Info" msgstr "Debug Info" @@ -5122,9 +5119,6 @@ msgstr "Status" msgid "Update" msgstr "Update" -msgid "HMS" -msgstr "HMS" - msgid "Don't show again" msgstr "Don't show again" @@ -5370,6 +5364,12 @@ msgstr "" msgid "Filament Tangle Detect" msgstr "" +msgid "Nozzle Clumping Detection" +msgstr "" + +msgid "Check if the nozzle is clumping by filament or other foreign objects." +msgstr "" + msgid "Nozzle Type" msgstr "" @@ -5808,15 +5808,21 @@ msgstr "Importing Model" msgid "prepare 3mf file..." msgstr "preparing 3mf file..." +msgid "Download failed, unknown file format." +msgstr "" + msgid "downloading project ..." msgstr "downloading project ..." +msgid "Download failed, File size exception." +msgstr "" + #, c-format, boost-format msgid "Project downloaded %d%%" msgstr "Project downloaded %d%%" msgid "" -"Importing to Orca Slicer failed. Please download the file and manually " +"Importing to Bambu Studio failed. Please download the file and manually " "import it." msgstr "" @@ -6083,6 +6089,21 @@ msgstr "Imperial" msgid "Units" msgstr "Units" +msgid "Allow only one OrcaSlicer instance" +msgstr "" + +msgid "" +"On OSX there is always only one instance of app running by default. However " +"it is allowed to run multiple instances of same app from the command line. " +"In such case this settings will allow only one instance." +msgstr "" + +msgid "" +"If this is enabled, when starting OrcaSlicer and another instance of the " +"same OrcaSlicer is already running, that instance will be reactivated " +"instead." +msgstr "" + msgid "Home" msgstr "" @@ -6159,6 +6180,14 @@ msgid "" "each printer automatically." msgstr "" +msgid "Multi-device Management(Take effect after restarting Studio)." +msgstr "" + +msgid "" +"With this option enabled, you can send a task to multiple devices at the " +"same time and manage multiple devices." +msgstr "" + msgid "Network" msgstr "" @@ -6792,6 +6821,9 @@ msgstr "" msgid "Modifying the device name" msgstr "Modifying the device name" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "Send to Printer MicroSD card" @@ -6844,6 +6876,26 @@ msgstr "Receive login report timeout" msgid "Unknown Failure" msgstr "Unknown Failure" +msgid "" +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." +msgstr "" + +msgid "Can't find Pin Code?" +msgstr "" + +msgid "Pin Code" +msgstr "" + +msgid "Binding..." +msgstr "" + +msgid "Please confirm on the printer screen" +msgstr "" + +msgid "Log in failed. Please check the Pin Code." +msgstr "" + msgid "Log in printer" msgstr "Log in printer" @@ -7046,13 +7098,13 @@ msgstr "" msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgid "Line width" msgstr "Line width" @@ -8043,6 +8095,39 @@ msgstr "Done" msgid "resume" msgstr "" +msgid "Resume Printing" +msgstr "" + +msgid "Resume Printing(defects acceptable)" +msgstr "" + +msgid "Resume Printing(problem solved)" +msgstr "" + +msgid "Stop Printing" +msgstr "" + +msgid "Check Assistant" +msgstr "" + +msgid "Filament Extruded, Continue" +msgstr "" + +msgid "Not Extruded Yet, Retry" +msgstr "" + +msgid "Finished, Continue" +msgstr "" + +msgid "Load Filament" +msgstr "Load" + +msgid "Filament Loaded, Resume" +msgstr "" + +msgid "View Liveview" +msgstr "" + msgid "Confirm and Update Nozzle" msgstr "" @@ -10039,6 +10124,9 @@ msgstr "Support Cubic" msgid "Lightning" msgstr "Lightning" +msgid "Cross Hatch" +msgstr "" + msgid "Sparse infill anchor length" msgstr "" @@ -10208,10 +10296,10 @@ msgstr "Full fan speed at layer" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" msgid "Support interface fan speed" @@ -12786,6 +12874,9 @@ msgstr "Canceled" msgid "load_obj: failed to parse" msgstr "load_obj: failed to parse" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "The file contains polygons with more than 4 vertices." @@ -12902,6 +12993,14 @@ msgstr "" msgid "The input value size must be 3." msgstr "" +msgid "" +"This machine type can only hold 16 history results per nozzle. You can " +"delete the existing historical results and then start calibration. Or you " +"can continue the calibration, but you cannot create new calibration " +"historical results. \n" +"Do you still want to continue the calibration?" +msgstr "" + msgid "Connecting to printer..." msgstr "" @@ -12911,6 +13010,19 @@ msgstr "" msgid "Flow Dynamics Calibration result has been saved to the printer" msgstr "" +#, c-format, boost-format +msgid "" +"There is already a historical calibration result with the same name: %s. " +"Only one of the results with the same name is saved. Are you sure you want " +"to override the historical result?" +msgstr "" + +#, c-format, boost-format +msgid "" +"This machine type can only hold %d history results per nozzle. This result " +"will not be saved." +msgstr "" + msgid "Internal Error" msgstr "" @@ -13136,9 +13248,6 @@ msgstr "" msgid "Printing Parameters" msgstr "" -msgid "- ℃" -msgstr "" - msgid "Plate Type" msgstr "Plate Type" @@ -13182,12 +13291,6 @@ msgstr "" msgid "Step value" msgstr "" -msgid "0.5" -msgstr "" - -msgid "0.005" -msgstr "" - msgid "The nozzle diameter has been synchronized from the printer Settings" msgstr "" @@ -13215,10 +13318,14 @@ msgstr "" msgid "Action" msgstr "" +#, c-format, boost-format +msgid "This machine type can only hold %d history results per nozzle." +msgstr "" + msgid "Edit Flow Dynamics Calibration" msgstr "" -msgid "New Flow Dynamics Calibration" +msgid "New Flow Dynamic Calibration" msgstr "" msgid "Ok" @@ -13227,13 +13334,6 @@ msgstr "" msgid "The filament must be selected." msgstr "" -#, c-format, boost-format -msgid "" -"There is already a historical calibration result with the same name: %s. " -"Only one of the results with the same name is saved. Are you sure you want " -"to override the historical result?" -msgstr "" - msgid "Network lookup" msgstr "" @@ -13614,8 +13714,8 @@ msgid "" msgstr "" msgid "" -"We would rename the presets as \"Vendor Type Serial @printer you " -"selected\". \n" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" "To add preset for more printers, Please go to printer selection" msgstr "" @@ -14159,6 +14259,175 @@ msgid "" "Error: \"%2%\"" msgstr "" +msgid "" +"It has a small layer height, and results in almost negligible layer lines " +"and high printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has lower speeds " +"and acceleration, and the sparse infill pattern is Gyroid. So, it results in " +"much higher printing quality, but a much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a slightly " +"bigger layer height, and results in almost negligible layer lines, and " +"slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a bigger layer " +"height, and results in slightly visible layer lines, but shorter printing " +"time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"height, and results in almost invisible layer lines and higher printing " +"quality, but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost invisible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of 0.2 mm nozzle, it has a smaller layer " +"height, and results in minimal layer lines and higher printing quality, but " +"shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in minimal layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"It has a general layer height, and results in general layer lines and " +"printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in less apparent layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost negligible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and longer printing " +"time." +msgstr "" + +msgid "" +"It has a big layer height, and results in apparent layer lines and ordinary " +"printing quality and printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in much more apparent layer lines and much lower " +"printing quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and slight higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"It has a very big layer height, and results in very apparent layer lines, " +"low printing quality and general printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a bigger layer " +"height, and results in very apparent layer lines and much lower printing " +"quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a much bigger " +"layer height, and results in extremely apparent layer lines and much lower " +"printing quality, but much shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a slightly " +"smaller layer height, and results in slightly less but still apparent layer " +"lines and slightly higher printing quality, but longer printing time in some " +"printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a smaller layer " +"height, and results in less but still apparent layer lines and slightly " +"higher printing quality, but longer printing time in some printing cases." +msgstr "" + msgid "Connected to Obico successfully!" msgstr "" @@ -14531,6 +14800,31 @@ msgid "" "probability of warping." msgstr "" +#~ msgid "Unload Filament" +#~ msgstr "Unload" + +#~ msgid "" +#~ "Choose an AMS slot then press \"Load\" or \"Unload\" button to " +#~ "automatically load or unload filiament." +#~ msgstr "" +#~ "Choose an AMS slot then press \"Load\" or \"Unload\" to automatically " +#~ "load or unload filament." + +#~ msgid "MC" +#~ msgstr "MC" + +#~ msgid "MainBoard" +#~ msgstr "MainBoard" + +#~ msgid "TH" +#~ msgstr "TH" + +#~ msgid "XCam" +#~ msgstr "XCam" + +#~ msgid "HMS" +#~ msgstr "HMS" + #~ msgid "active" #~ msgstr "active" diff --git a/localization/i18n/es/OrcaSlicer_es.po b/localization/i18n/es/OrcaSlicer_es.po index b3fed2c507..5e7e22aba2 100644 --- a/localization/i18n/es/OrcaSlicer_es.po +++ b/localization/i18n/es/OrcaSlicer_es.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-16 16:45+0200\n" +"POT-Creation-Date: 2024-04-28 18:11+0800\n" "PO-Revision-Date: \n" "Last-Translator: Carlos Fco. Caruncho Serrano \n" "Language-Team: \n" @@ -2435,11 +2435,11 @@ msgstr "Auto Rellenado" msgid "AMS not connected" msgstr "AMS no conectado" -msgid "Load Filament" -msgstr "Cargar" +msgid "Load" +msgstr "" -msgid "Unload Filament" -msgstr "Descargar" +msgid "Unload" +msgstr "Descarga" msgid "Ext Spool" msgstr "Carrete Externo" @@ -2456,7 +2456,7 @@ msgstr "Reintentar" msgid "Calibrating AMS..." msgstr "Calibración de AMS..." -msgid "A problem occured during calibration. Click to view the solution." +msgid "A problem occurred during calibration. Click to view the solution." msgstr "" "Se ha producido un problema durante la calibración. Haga clic para ver la " "solución." @@ -2499,10 +2499,8 @@ msgstr "Grab new filament" msgid "" "Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically " -"load or unload filiament." +"load or unload filaments." msgstr "" -"Elija una ranura AMS y pulse el botón \"Cargar\" o \"Descargar\" para cargar " -"o descargar automáticamente el filamento." msgid "Edit" msgstr "Editar" @@ -3128,6 +3126,14 @@ msgstr "" "El AMS continuará con otra bobina con las mismas propiedades de filamento " "automáticamente cuando el filamento se termine" +msgid "Air Printing Detection" +msgstr "" + +msgid "" +"Detects clogging and filament grinding, halting printing immediately to " +"conserve time and filament." +msgstr "" + msgid "File" msgstr "Archivo" @@ -3602,18 +3608,6 @@ msgstr "Pausa de error de primera capa" msgid "Nozzle clog pause" msgstr "Pausa de obstrucción de boquilla" -msgid "MC" -msgstr "MC" - -msgid "MainBoard" -msgstr "Placa Base" - -msgid "TH" -msgstr "TH" - -msgid "XCam" -msgstr "XCam" - msgid "Unknown" msgstr "Desconocido" @@ -4153,7 +4147,7 @@ msgstr "Volumen:" msgid "Size:" msgstr "Tamaño:" -#, boost-format +#, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -4295,6 +4289,9 @@ msgstr "Previsualización" msgid "Device" msgstr "Dispositivo" +msgid "Multi-device" +msgstr "" + msgid "Project" msgstr "Proyecto" @@ -4334,6 +4331,9 @@ msgstr "Imprimir todo" msgid "Send all" msgstr "Mandar todo" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "Atajos de teclado" @@ -5128,9 +5128,6 @@ msgstr "Costura" msgid "Bed" msgstr "Cama" -msgid "Unload" -msgstr "Descarga" - msgid "Debug Info" msgstr "Información de Depuración" @@ -5320,9 +5317,6 @@ msgstr "Estado" msgid "Update" msgstr "Actualizar" -msgid "HMS" -msgstr "HMS" - msgid "Don't show again" msgstr "No mostrar de nuevo" @@ -5568,6 +5562,12 @@ msgstr "Permitir Sonido de Aviso" msgid "Filament Tangle Detect" msgstr "Detección de Enredos de Filamentos" +msgid "Nozzle Clumping Detection" +msgstr "" + +msgid "Check if the nozzle is clumping by filament or other foreign objects." +msgstr "" + msgid "Nozzle Type" msgstr "" @@ -6033,19 +6033,23 @@ msgstr "Importando modelo" msgid "prepare 3mf file..." msgstr "preparar el archivo 3mf..." +msgid "Download failed, unknown file format." +msgstr "" + msgid "downloading project ..." msgstr "descargando proyecto..." +msgid "Download failed, File size exception." +msgstr "" + #, c-format, boost-format msgid "Project downloaded %d%%" msgstr "Proyecto descargado %d%%" msgid "" -"Importing to Orca Slicer failed. Please download the file and manually " +"Importing to Bambu Studio failed. Please download the file and manually " "import it." msgstr "" -"La importación a Orca Slicer ha fallado. Descargue el archivo e impórtelo " -"manualmente." msgid "Import SLA archive" msgstr "Importar archivo SLA" @@ -6322,6 +6326,21 @@ msgstr "Imperial" msgid "Units" msgstr "Unidades" +msgid "Allow only one OrcaSlicer instance" +msgstr "" + +msgid "" +"On OSX there is always only one instance of app running by default. However " +"it is allowed to run multiple instances of same app from the command line. " +"In such case this settings will allow only one instance." +msgstr "" + +msgid "" +"If this is enabled, when starting OrcaSlicer and another instance of the " +"same OrcaSlicer is already running, that instance will be reactivated " +"instead." +msgstr "" + msgid "Home" msgstr "Página de Inicio" @@ -6400,6 +6419,14 @@ msgid "" "each printer automatically." msgstr "" +msgid "Multi-device Management(Take effect after restarting Studio)." +msgstr "" + +msgid "" +"With this option enabled, you can send a task to multiple devices at the " +"same time and manage multiple devices." +msgstr "" + msgid "Network" msgstr "Red" @@ -7052,6 +7079,9 @@ msgstr "Calibración automática de caudal usando Micro Lidar" msgid "Modifying the device name" msgstr "Modificar el nombre del dispositivo" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "Enviar a la tarjeta SD de la impresora" @@ -7109,6 +7139,26 @@ msgstr "Receive login report timeout" msgid "Unknown Failure" msgstr "Error Desconocido" +msgid "" +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." +msgstr "" + +msgid "Can't find Pin Code?" +msgstr "" + +msgid "Pin Code" +msgstr "" + +msgid "Binding..." +msgstr "" + +msgid "Please confirm on the printer screen" +msgstr "" + +msgid "Log in failed. Please check the Pin Code." +msgstr "" + msgid "Log in printer" msgstr "Iniciar sesión en la impresora" @@ -7326,8 +7376,8 @@ msgstr "" msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "Cuando grabamos timelapse sin cabezal de impresión, es recomendable añadir " "un \"Torre de Purga de Intervalo\" \n" @@ -8367,6 +8417,39 @@ msgstr "Hecho" msgid "resume" msgstr "" +msgid "Resume Printing" +msgstr "" + +msgid "Resume Printing(defects acceptable)" +msgstr "" + +msgid "Resume Printing(problem solved)" +msgstr "" + +msgid "Stop Printing" +msgstr "" + +msgid "Check Assistant" +msgstr "" + +msgid "Filament Extruded, Continue" +msgstr "" + +msgid "Not Extruded Yet, Retry" +msgstr "" + +msgid "Finished, Continue" +msgstr "" + +msgid "Load Filament" +msgstr "Cargar" + +msgid "Filament Loaded, Resume" +msgstr "" + +msgid "View Liveview" +msgstr "" + msgid "Confirm and Update Nozzle" msgstr "Confirmar y Actualizar la Boquilla" @@ -10710,6 +10793,9 @@ msgstr "Soporte Cúbico" msgid "Lightning" msgstr "Rayo" +msgid "Cross Hatch" +msgstr "" + msgid "Sparse infill anchor length" msgstr "Longitud del anclaje de relleno de baja densidad" @@ -10914,10 +11000,10 @@ msgstr "Velocidad máxima del ventilador en la capa" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" "La velocidad de ventilador se incrementará linealmente de cero a " "\"close_fan_the_first_x_layers\" al máximo de capa \"full_fan_speed_layer\". " @@ -13412,10 +13498,9 @@ msgstr "" "NOTA: Las superficies inferior y superior no se verán afectadas por este " "valor para evitar huecos visuales en el exterior del modelo. Ajuste \"Umbral " "de una perímetro\" en la configuración avanzada para ajustar la sensibilidad " -"de lo que se considera una superficie superior. El \"Umbral de una " -"perímetro\" sólo es visible si este valor es superior al valor " -"predeterminado de 0,5, o si las superficies superiores de una soel perímetro " -"están activadas." +"de lo que se considera una superficie superior. El \"Umbral de una perímetro" +"\" sólo es visible si este valor es superior al valor predeterminado de 0,5, " +"o si las superficies superiores de una soel perímetro están activadas." msgid "First layer minimum wall width" msgstr "Ancho mínimo del perímetro de la primera capa" @@ -13914,6 +13999,9 @@ msgstr "Canceled" msgid "load_obj: failed to parse" msgstr "load_obj: failed to parse" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "The file contains polygons with more than 4 vertices." @@ -14039,6 +14127,14 @@ msgstr "Por favor, seleccione el filamento para calibrar." msgid "The input value size must be 3." msgstr "El valor de tamaño de entrada debe ser 3." +msgid "" +"This machine type can only hold 16 history results per nozzle. You can " +"delete the existing historical results and then start calibration. Or you " +"can continue the calibration, but you cannot create new calibration " +"historical results. \n" +"Do you still want to continue the calibration?" +msgstr "" + msgid "Connecting to printer..." msgstr "Conectando a la impresora." @@ -14050,6 +14146,19 @@ msgstr "" "El resultado de la Calibración de Dinámicas de Flujo se ha salvado en la " "impresora" +#, c-format, boost-format +msgid "" +"There is already a historical calibration result with the same name: %s. " +"Only one of the results with the same name is saved. Are you sure you want " +"to override the historical result?" +msgstr "" + +#, c-format, boost-format +msgid "" +"This machine type can only hold %d history results per nozzle. This result " +"will not be saved." +msgstr "" + msgid "Internal Error" msgstr "Error interno" @@ -14115,12 +14224,12 @@ msgstr "" "wiki.\n" "\n" "Normalmente la calibración es innecesaria. Cuando se inicia una impresión de " -"un solo color/material, con la opción \"Calibración de la dinámica de " -"caudal\" marcada en el menú de inicio de impresión, la impresora seguirá el " -"método antiguo, calibrar el filamento antes de la impresión; Cuando se " -"inicia una impresión de varios colores/materiales, la impresora utilizará el " -"parámetro de compensación por defecto para el filamento durante cada cambio " -"de filamento que tendrá un buen resultado en la mayoría de los casos.\n" +"un solo color/material, con la opción \"Calibración de la dinámica de caudal" +"\" marcada en el menú de inicio de impresión, la impresora seguirá el método " +"antiguo, calibrar el filamento antes de la impresión; Cuando se inicia una " +"impresión de varios colores/materiales, la impresora utilizará el parámetro " +"de compensación por defecto para el filamento durante cada cambio de " +"filamento que tendrá un buen resultado en la mayoría de los casos.\n" "\n" "Tenga en cuenta que hay algunos casos en los que el resultado de la " "calibración no es fiable: el uso de una placa de textura para hacer la " @@ -14362,9 +14471,6 @@ msgstr "" msgid "Printing Parameters" msgstr "Parámetros de Impresión" -msgid "- ℃" -msgstr "- ℃" - msgid "Plate Type" msgstr "Plate Type" @@ -14414,12 +14520,6 @@ msgstr "Al valor k" msgid "Step value" msgstr "Valor del paso" -msgid "0.5" -msgstr "0.5" - -msgid "0.005" -msgstr "0.005" - msgid "The nozzle diameter has been synchronized from the printer Settings" msgstr "" "El diámetro de la boquilla has sido sincronizado desde los ajustes de " @@ -14450,10 +14550,14 @@ msgstr "" msgid "Action" msgstr "Acción" +#, c-format, boost-format +msgid "This machine type can only hold %d history results per nozzle." +msgstr "" + msgid "Edit Flow Dynamics Calibration" msgstr "Editar Calibración de Dinámicas de Flujo" -msgid "New Flow Dynamics Calibration" +msgid "New Flow Dynamic Calibration" msgstr "" msgid "Ok" @@ -14462,13 +14566,6 @@ msgstr "" msgid "The filament must be selected." msgstr "" -#, c-format, boost-format -msgid "" -"There is already a historical calibration result with the same name: %s. " -"Only one of the results with the same name is saved. Are you sure you want " -"to override the historical result?" -msgstr "" - msgid "Network lookup" msgstr "Búsqueda de red" @@ -14887,8 +14984,8 @@ msgstr "" "¿Quieres reescribirlo?" msgid "" -"We would rename the presets as \"Vendor Type Serial @printer you " -"selected\". \n" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" "To add preset for more printers, Please go to printer selection" msgstr "" "Cambiaríamos el nombre de los preajustes a \"Número de serie del Vendedor " @@ -15514,6 +15611,175 @@ msgstr "" "Cuerpo del mensaje: \"%1%\" \n" "Error: \"%2%\"" +msgid "" +"It has a small layer height, and results in almost negligible layer lines " +"and high printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has lower speeds " +"and acceleration, and the sparse infill pattern is Gyroid. So, it results in " +"much higher printing quality, but a much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a slightly " +"bigger layer height, and results in almost negligible layer lines, and " +"slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a bigger layer " +"height, and results in slightly visible layer lines, but shorter printing " +"time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"height, and results in almost invisible layer lines and higher printing " +"quality, but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost invisible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of 0.2 mm nozzle, it has a smaller layer " +"height, and results in minimal layer lines and higher printing quality, but " +"shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in minimal layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"It has a general layer height, and results in general layer lines and " +"printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in less apparent layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost negligible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and longer printing " +"time." +msgstr "" + +msgid "" +"It has a big layer height, and results in apparent layer lines and ordinary " +"printing quality and printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in much more apparent layer lines and much lower " +"printing quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and slight higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"It has a very big layer height, and results in very apparent layer lines, " +"low printing quality and general printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a bigger layer " +"height, and results in very apparent layer lines and much lower printing " +"quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a much bigger " +"layer height, and results in extremely apparent layer lines and much lower " +"printing quality, but much shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a slightly " +"smaller layer height, and results in slightly less but still apparent layer " +"lines and slightly higher printing quality, but longer printing time in some " +"printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a smaller layer " +"height, and results in less but still apparent layer lines and slightly " +"higher printing quality, but longer printing time in some printing cases." +msgstr "" + msgid "Connected to Obico successfully!" msgstr "¡Conectado a Obico con éxito!" @@ -15950,6 +16216,47 @@ msgstr "" "aumentar adecuadamente la temperatura del lecho térmico puede reducir la " "probabilidad de deformaciones." +#~ msgid "Unload Filament" +#~ msgstr "Descargar" + +#~ msgid "" +#~ "Choose an AMS slot then press \"Load\" or \"Unload\" button to " +#~ "automatically load or unload filiament." +#~ msgstr "" +#~ "Elija una ranura AMS y pulse el botón \"Cargar\" o \"Descargar\" para " +#~ "cargar o descargar automáticamente el filamento." + +#~ msgid "MC" +#~ msgstr "MC" + +#~ msgid "MainBoard" +#~ msgstr "Placa Base" + +#~ msgid "TH" +#~ msgstr "TH" + +#~ msgid "XCam" +#~ msgstr "XCam" + +#~ msgid "HMS" +#~ msgstr "HMS" + +#~ msgid "" +#~ "Importing to Orca Slicer failed. Please download the file and manually " +#~ "import it." +#~ msgstr "" +#~ "La importación a Orca Slicer ha fallado. Descargue el archivo e impórtelo " +#~ "manualmente." + +#~ msgid "- ℃" +#~ msgstr "- ℃" + +#~ msgid "0.5" +#~ msgstr "0.5" + +#~ msgid "0.005" +#~ msgstr "0.005" + #~ msgid "active" #~ msgstr "activo" @@ -16220,8 +16527,8 @@ msgstr "" #~ msgstr "Capas de baja densidad (EXPERIMENTAL)" #~ msgid "" -#~ "We would rename the presets as \"Vendor Type Serial @printer you " -#~ "selected\". \n" +#~ "We would rename the presets as \"Vendor Type Serial @printer you selected" +#~ "\". \n" #~ "To add preset for more prinetrs, Please go to printer selection" #~ msgstr "" #~ "Cambiaremos el nombre de los perfiles a \"Tipo Número de Serie @impresora " diff --git a/localization/i18n/fr/OrcaSlicer_fr.po b/localization/i18n/fr/OrcaSlicer_fr.po index 808fa612fd..5f8f7f5c08 100644 --- a/localization/i18n/fr/OrcaSlicer_fr.po +++ b/localization/i18n/fr/OrcaSlicer_fr.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-16 16:45+0200\n" +"POT-Creation-Date: 2024-04-28 18:11+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Guislain Cyril, Thomas Lété\n" @@ -2443,11 +2443,11 @@ msgstr "Recharge Automatique" msgid "AMS not connected" msgstr "AMS non connecté" -msgid "Load Filament" -msgstr "Charger" +msgid "Load" +msgstr "" -msgid "Unload Filament" -msgstr "Déchargement" +msgid "Unload" +msgstr "Décharger" msgid "Ext Spool" msgstr "Bobine Ext" @@ -2464,7 +2464,7 @@ msgstr "Réessayer" msgid "Calibrating AMS..." msgstr "Étalonnage de l'AMS…" -msgid "A problem occured during calibration. Click to view the solution." +msgid "A problem occurred during calibration. Click to view the solution." msgstr "" "Un problème est survenu lors de la calibration. Cliquez pour voir la " "solution." @@ -2507,10 +2507,8 @@ msgstr "Saisir un nouveau filament" msgid "" "Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically " -"load or unload filiament." +"load or unload filaments." msgstr "" -"Choisissez un emplacement AMS puis appuyez sur le bouton correspondant pour " -"Charger ou Décharger le filament." msgid "Edit" msgstr "Éditer" @@ -3151,6 +3149,14 @@ msgstr "" "L'AMS passera automatiquement à une autre bobine avec les mêmes propriétés " "de filament lorsque la bobine actuelle est épuisé" +msgid "Air Printing Detection" +msgstr "" + +msgid "" +"Detects clogging and filament grinding, halting printing immediately to " +"conserve time and filament." +msgstr "" + msgid "File" msgstr "Fichier" @@ -3623,18 +3629,6 @@ msgstr "Pause en cas d'erreur de la première couche" msgid "Nozzle clog pause" msgstr "Pause en cas de buse bouchée" -msgid "MC" -msgstr "MC" - -msgid "MainBoard" -msgstr "Carte mère" - -msgid "TH" -msgstr "TH" - -msgid "XCam" -msgstr "XCam" - msgid "Unknown" msgstr "Inconnu" @@ -4172,7 +4166,7 @@ msgstr "Le volume:" msgid "Size:" msgstr "Taille:" -#, boost-format +#, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -4316,6 +4310,9 @@ msgstr "Aperçu" msgid "Device" msgstr "Appareil" +msgid "Multi-device" +msgstr "" + msgid "Project" msgstr "Projet" @@ -4355,6 +4352,9 @@ msgstr "Tout imprimer" msgid "Send all" msgstr "Tout envoyer" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "Raccourcis Clavier" @@ -5183,9 +5183,6 @@ msgstr "Chamb" msgid "Bed" msgstr "Plateau" -msgid "Unload" -msgstr "Décharger" - msgid "Debug Info" msgstr "Les informations de débogage" @@ -5373,9 +5370,6 @@ msgstr "État" msgid "Update" msgstr "Mise à jour" -msgid "HMS" -msgstr "HMS" - msgid "Don't show again" msgstr "Ne plus afficher" @@ -5624,6 +5618,12 @@ msgstr "Autoriser le son d’invite" msgid "Filament Tangle Detect" msgstr "Détection de filament coincé" +msgid "Nozzle Clumping Detection" +msgstr "" + +msgid "Check if the nozzle is clumping by filament or other foreign objects." +msgstr "" + msgid "Nozzle Type" msgstr "Type de buse" @@ -6092,19 +6092,23 @@ msgstr "Importation du modèle" msgid "prepare 3mf file..." msgstr "préparation du fichier 3mf..." +msgid "Download failed, unknown file format." +msgstr "" + msgid "downloading project ..." msgstr "téléchargement du projet..." +msgid "Download failed, File size exception." +msgstr "" + #, c-format, boost-format msgid "Project downloaded %d%%" msgstr "Projet téléchargé à %d%%" msgid "" -"Importing to Orca Slicer failed. Please download the file and manually " +"Importing to Bambu Studio failed. Please download the file and manually " "import it." msgstr "" -"L’importation vers OrcaSlicer a échoué. Veuillez télécharger le fichier et " -"l’importer manuellement." msgid "Import SLA archive" msgstr "Importer les archives SLA" @@ -6390,6 +6394,21 @@ msgstr "Impérial" msgid "Units" msgstr "Unités" +msgid "Allow only one OrcaSlicer instance" +msgstr "" + +msgid "" +"On OSX there is always only one instance of app running by default. However " +"it is allowed to run multiple instances of same app from the command line. " +"In such case this settings will allow only one instance." +msgstr "" + +msgid "" +"If this is enabled, when starting OrcaSlicer and another instance of the " +"same OrcaSlicer is already running, that instance will be reactivated " +"instead." +msgstr "" + msgid "Home" msgstr "Accueil" @@ -6482,6 +6501,14 @@ msgstr "" "Si cette option est activée, Orca se souviendra de la configuration du " "filament/processus pour chaque imprimante et la modifiera automatiquement." +msgid "Multi-device Management(Take effect after restarting Studio)." +msgstr "" + +msgid "" +"With this option enabled, you can send a task to multiple devices at the " +"same time and manage multiple devices." +msgstr "" + msgid "Network" msgstr "Réseau" @@ -7154,6 +7181,9 @@ msgstr "Calibration automatique du débit à l’aide du Micro-Lidar" msgid "Modifying the device name" msgstr "Modification du nom de l'appareil" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "Envoyer sur la carte SD de l'imprimante" @@ -7211,6 +7241,26 @@ msgstr "Délai d'expiration du rapport de connexion" msgid "Unknown Failure" msgstr "Erreur inconnue" +msgid "" +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." +msgstr "" + +msgid "Can't find Pin Code?" +msgstr "" + +msgid "Pin Code" +msgstr "" + +msgid "Binding..." +msgstr "" + +msgid "Please confirm on the printer screen" +msgstr "" + +msgid "Log in failed. Please check the Pin Code." +msgstr "" + msgid "Log in printer" msgstr "Connectez-vous à l'imprimante" @@ -7450,8 +7500,8 @@ msgstr "" msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "Lorsque vous enregistrez un timelapse sans tête d’outil, il est recommandé " "d’ajouter une \"Tour d’essuyage timelapse\".\n" @@ -7603,9 +7653,9 @@ msgid "" "Bed temperature when cool plate is installed. Value 0 means the filament " "does not support to print on the Cool Plate" msgstr "" -"Il s'agit de la température du plateau lorsque le plateau froid (\"Cool " -"plate\") est installé. Une valeur à 0 signifie que ce filament ne peut pas " -"être imprimé sur le plateau froid." +"Il s'agit de la température du plateau lorsque le plateau froid (\"Cool plate" +"\") est installé. Une valeur à 0 signifie que ce filament ne peut pas être " +"imprimé sur le plateau froid." msgid "Engineering plate" msgstr "Plaque Engineering" @@ -8524,6 +8574,39 @@ msgstr "Terminé" msgid "resume" msgstr "reprendre" +msgid "Resume Printing" +msgstr "" + +msgid "Resume Printing(defects acceptable)" +msgstr "" + +msgid "Resume Printing(problem solved)" +msgstr "" + +msgid "Stop Printing" +msgstr "" + +msgid "Check Assistant" +msgstr "" + +msgid "Filament Extruded, Continue" +msgstr "" + +msgid "Not Extruded Yet, Retry" +msgstr "" + +msgid "Finished, Continue" +msgstr "" + +msgid "Load Filament" +msgstr "Charger" + +msgid "Filament Loaded, Resume" +msgstr "" + +msgid "View Liveview" +msgstr "" + msgid "Confirm and Update Nozzle" msgstr "Confirmation et mise à jour de la buse" @@ -10893,6 +10976,9 @@ msgstr "Support Cubique" msgid "Lightning" msgstr "Lightning" +msgid "Cross Hatch" +msgstr "" + msgid "Sparse infill anchor length" msgstr "Longueur de l’ancrage de remplissage interne" @@ -11100,10 +11186,10 @@ msgstr "Ventilateur à pleine vitesse à la couche" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" "La vitesse du ventilateur augmentera de manière linéaire à partir de zéro à " "la couche \"close_fan_the_first_x_layers\" jusqu’au maximum à la couche " @@ -12747,8 +12833,8 @@ msgid "" "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to " "close all holes in the model." msgstr "" -"Utilisez « Pair-impair » pour les modèles d'avion 3DLabPrint. Utilisez " -"« Fermer les trous » pour fermer tous les trous du modèle." +"Utilisez « Pair-impair » pour les modèles d'avion 3DLabPrint. Utilisez « " +"Fermer les trous » pour fermer tous les trous du modèle." msgid "Regular" msgstr "Standard" @@ -13511,8 +13597,8 @@ msgid "" "Wipe tower is only compatible with relative mode. It is recommended on most " "printers. Default is checked" msgstr "" -"L’extrusion relative est recommandée lors de l’utilisation de l’option " -"« label_objects ». Certains extrudeurs fonctionnent mieux avec cette option " +"L’extrusion relative est recommandée lors de l’utilisation de l’option « " +"label_objects ». Certains extrudeurs fonctionnent mieux avec cette option " "non verrouillée (mode d’extrusion absolu). La tour d’essuyage n’est " "compatible qu’avec le mode relatif. Il est recommandé sur la plupart des " "imprimantes. L’option par défaut est cochée" @@ -14138,6 +14224,9 @@ msgstr "Annulé" msgid "load_obj: failed to parse" msgstr "load_obj : échec de l'analyse" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "Le fichier contient des polygones comportant plus de 4 sommets." @@ -14266,6 +14355,14 @@ msgstr "Veuillez sélectionner le filament à calibrer." msgid "The input value size must be 3." msgstr "La valeur saisie doit être 3." +msgid "" +"This machine type can only hold 16 history results per nozzle. You can " +"delete the existing historical results and then start calibration. Or you " +"can continue the calibration, but you cannot create new calibration " +"historical results. \n" +"Do you still want to continue the calibration?" +msgstr "" + msgid "Connecting to printer..." msgstr "Connexion à l’imprimante…" @@ -14277,6 +14374,22 @@ msgstr "" "Le résultat de la calibration dynamique du débit a été enregistré sur " "l’imprimante" +#, c-format, boost-format +msgid "" +"There is already a historical calibration result with the same name: %s. " +"Only one of the results with the same name is saved. Are you sure you want " +"to override the historical result?" +msgstr "" +"Il existe déjà un résultat d’étalonnage antérieur portant le même nom : %s. " +"Un seul des résultats portant le même nom est sauvegardé. Êtes-vous sûr de " +"vouloir remplacer le résultat antérieur ?" + +#, c-format, boost-format +msgid "" +"This machine type can only hold %d history results per nozzle. This result " +"will not be saved." +msgstr "" + msgid "Internal Error" msgstr "Erreur interne" @@ -14341,9 +14454,9 @@ msgstr "" "Wiki.\n" "\n" "Habituellement, la calibration est inutile. Lorsque vous démarrez une " -"impression d'une seule couleur/matériau, avec l'option \"Calibration du " -"débit\" cochée dans le menu de démarrage de l'impression, l'imprimante " -"suivra l'ancienne méthode de calibration du filament avant l'impression.\n" +"impression d'une seule couleur/matériau, avec l'option \"Calibration du débit" +"\" cochée dans le menu de démarrage de l'impression, l'imprimante suivra " +"l'ancienne méthode de calibration du filament avant l'impression.\n" "Lorsque vous démarrez une impression multi-couleurs/matériaux, l'imprimante " "utilise le paramètre de compensation par défaut pour le filament lors de " "chaque changement de filament, ce qui donne un bon résultat dans la plupart " @@ -14604,9 +14717,6 @@ msgstr "" msgid "Printing Parameters" msgstr "Paramètres d’impression" -msgid "- ℃" -msgstr "- ℃" - msgid "Plate Type" msgstr "Type de plaque" @@ -14654,12 +14764,6 @@ msgstr "À la valeur K" msgid "Step value" msgstr "Intervalle" -msgid "0.5" -msgstr "0.5" - -msgid "0.005" -msgstr "0.005" - msgid "The nozzle diameter has been synchronized from the printer Settings" msgstr "" "Le diamètre de la buse a été synchronisé à partir des paramètres de " @@ -14689,11 +14793,15 @@ msgstr "Actualisation de historique des calibrations dynamiques du débit" msgid "Action" msgstr "Action" +#, c-format, boost-format +msgid "This machine type can only hold %d history results per nozzle." +msgstr "" + msgid "Edit Flow Dynamics Calibration" msgstr "Editer la calibration dynamique du débit" -msgid "New Flow Dynamics Calibration" -msgstr "Nouvelle calibration de la dynamique du flux" +msgid "New Flow Dynamic Calibration" +msgstr "" msgid "Ok" msgstr "" @@ -14701,16 +14809,6 @@ msgstr "" msgid "The filament must be selected." msgstr "Le filament doit être sélectionné." -#, c-format, boost-format -msgid "" -"There is already a historical calibration result with the same name: %s. " -"Only one of the results with the same name is saved. Are you sure you want " -"to override the historical result?" -msgstr "" -"Il existe déjà un résultat d’étalonnage antérieur portant le même nom : %s. " -"Un seul des résultats portant le même nom est sauvegardé. Êtes-vous sûr de " -"vouloir remplacer le résultat antérieur ?" - msgid "Network lookup" msgstr "Recherche de réseau" @@ -15136,8 +15234,8 @@ msgstr "" "Voulez-vous le réécrire ?" msgid "" -"We would rename the presets as \"Vendor Type Serial @printer you " -"selected\". \n" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" "To add preset for more printers, Please go to printer selection" msgstr "" "Nous renommerions les préréglages en « Vendor Type Serial @printer you " @@ -15786,6 +15884,175 @@ msgstr "" "Corps du message : « %1% »\n" "Erreur : « %2% »" +msgid "" +"It has a small layer height, and results in almost negligible layer lines " +"and high printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has lower speeds " +"and acceleration, and the sparse infill pattern is Gyroid. So, it results in " +"much higher printing quality, but a much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a slightly " +"bigger layer height, and results in almost negligible layer lines, and " +"slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a bigger layer " +"height, and results in slightly visible layer lines, but shorter printing " +"time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"height, and results in almost invisible layer lines and higher printing " +"quality, but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost invisible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of 0.2 mm nozzle, it has a smaller layer " +"height, and results in minimal layer lines and higher printing quality, but " +"shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in minimal layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"It has a general layer height, and results in general layer lines and " +"printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in less apparent layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost negligible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and longer printing " +"time." +msgstr "" + +msgid "" +"It has a big layer height, and results in apparent layer lines and ordinary " +"printing quality and printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in much more apparent layer lines and much lower " +"printing quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and slight higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"It has a very big layer height, and results in very apparent layer lines, " +"low printing quality and general printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a bigger layer " +"height, and results in very apparent layer lines and much lower printing " +"quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a much bigger " +"layer height, and results in extremely apparent layer lines and much lower " +"printing quality, but much shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a slightly " +"smaller layer height, and results in slightly less but still apparent layer " +"lines and slightly higher printing quality, but longer printing time in some " +"printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a smaller layer " +"height, and results in less but still apparent layer lines and slightly " +"higher printing quality, but longer printing time in some printing cases." +msgstr "" + msgid "Connected to Obico successfully!" msgstr "Connexion à Obico réussie !" @@ -16231,6 +16498,50 @@ msgstr "" "déformer, tels que l’ABS, une augmentation appropriée de la température du " "plateau chauffant peut réduire la probabilité de déformation." +#~ msgid "Unload Filament" +#~ msgstr "Déchargement" + +#~ msgid "" +#~ "Choose an AMS slot then press \"Load\" or \"Unload\" button to " +#~ "automatically load or unload filiament." +#~ msgstr "" +#~ "Choisissez un emplacement AMS puis appuyez sur le bouton correspondant " +#~ "pour Charger ou Décharger le filament." + +#~ msgid "MC" +#~ msgstr "MC" + +#~ msgid "MainBoard" +#~ msgstr "Carte mère" + +#~ msgid "TH" +#~ msgstr "TH" + +#~ msgid "XCam" +#~ msgstr "XCam" + +#~ msgid "HMS" +#~ msgstr "HMS" + +#~ msgid "" +#~ "Importing to Orca Slicer failed. Please download the file and manually " +#~ "import it." +#~ msgstr "" +#~ "L’importation vers OrcaSlicer a échoué. Veuillez télécharger le fichier " +#~ "et l’importer manuellement." + +#~ msgid "- ℃" +#~ msgstr "- ℃" + +#~ msgid "0.5" +#~ msgstr "0.5" + +#~ msgid "0.005" +#~ msgstr "0.005" + +#~ msgid "New Flow Dynamics Calibration" +#~ msgstr "Nouvelle calibration de la dynamique du flux" + #~ msgid "" #~ "The 3mf file version is in Beta and it is newer than the current " #~ "OrcaSlicer version." @@ -16471,8 +16782,8 @@ msgstr "" #~ "thickness (top+bottom solid layers)" #~ msgstr "" #~ "Ajoutez du remplissage solide à proximité des surfaces inclinées pour " -#~ "garantir l'épaisseur verticale de la coque (couches solides " -#~ "supérieure+inférieure)." +#~ "garantir l'épaisseur verticale de la coque (couches solides supérieure" +#~ "+inférieure)." #~ msgid "Further reduce solid infill on walls (beta)" #~ msgstr "Réduire davantage le remplissage solide des parois (expérimental)" diff --git a/localization/i18n/hu/OrcaSlicer_hu.po b/localization/i18n/hu/OrcaSlicer_hu.po index cd7da5973b..a664257664 100644 --- a/localization/i18n/hu/OrcaSlicer_hu.po +++ b/localization/i18n/hu/OrcaSlicer_hu.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-16 16:45+0200\n" +"POT-Creation-Date: 2024-04-28 18:11+0800\n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -2361,11 +2361,11 @@ msgstr "" msgid "AMS not connected" msgstr "Az AMS nincs csatlakoztatva" -msgid "Load Filament" -msgstr "Filament betöltés" +msgid "Load" +msgstr "" -msgid "Unload Filament" -msgstr "Filament kitöltése" +msgid "Unload" +msgstr "Kitöltés" msgid "Ext Spool" msgstr "Kül. tekercs" @@ -2382,7 +2382,7 @@ msgstr "Újra" msgid "Calibrating AMS..." msgstr "AMS kalibrálása..." -msgid "A problem occured during calibration. Click to view the solution." +msgid "A problem occurred during calibration. Click to view the solution." msgstr "" "A kalibráció során probléma merült fel. Kattintson a megoldás " "megtekintéséhez." @@ -2425,10 +2425,8 @@ msgstr "Grab new filament" msgid "" "Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically " -"load or unload filiament." +"load or unload filaments." msgstr "" -"Válassz egy AMS rekeszt, majd nyomd meg a \"Load\" vagy \"Unload\" gombot a " -"filament automatikus be- vagy kitöltéséhez." msgid "Edit" msgstr "Szerkesztés" @@ -3038,6 +3036,14 @@ msgstr "" "Az AMS automatikusan egy másik, azonos tulajdonságú filamentre vált, ha az " "aktuális filament kifogy." +msgid "Air Printing Detection" +msgstr "" + +msgid "" +"Detects clogging and filament grinding, halting printing immediately to " +"conserve time and filament." +msgstr "" + msgid "File" msgstr "Fájl" @@ -3485,18 +3491,6 @@ msgstr "" msgid "Nozzle clog pause" msgstr "" -msgid "MC" -msgstr "MC" - -msgid "MainBoard" -msgstr "MainBoard" - -msgid "TH" -msgstr "TH" - -msgid "XCam" -msgstr "XCam" - msgid "Unknown" msgstr "Ismeretlen" @@ -4019,7 +4013,7 @@ msgstr "Térfogat:" msgid "Size:" msgstr "Méret:" -#, boost-format +#, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -4159,6 +4153,9 @@ msgstr "Előnézet" msgid "Device" msgstr "Nyomtató" +msgid "Multi-device" +msgstr "" + msgid "Project" msgstr "Projekt" @@ -4198,6 +4195,9 @@ msgstr "Összes nyomtatása" msgid "Send all" msgstr "Összes elküldése" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "Gyorsbillentyűk" @@ -4973,9 +4973,6 @@ msgstr "Cham" msgid "Bed" msgstr "Asztal" -msgid "Unload" -msgstr "Kitöltés" - msgid "Debug Info" msgstr "Hibakeresési infó" @@ -5145,9 +5142,6 @@ msgstr "Állapot" msgid "Update" msgstr "Frissítés" -msgid "HMS" -msgstr "HMS" - msgid "Don't show again" msgstr "Ne mutasd újra" @@ -5394,6 +5388,12 @@ msgstr "" msgid "Filament Tangle Detect" msgstr "" +msgid "Nozzle Clumping Detection" +msgstr "" + +msgid "Check if the nozzle is clumping by filament or other foreign objects." +msgstr "" + msgid "Nozzle Type" msgstr "" @@ -5835,15 +5835,21 @@ msgstr "Modell importálása" msgid "prepare 3mf file..." msgstr "3mf fájl előkészítése..." +msgid "Download failed, unknown file format." +msgstr "" + msgid "downloading project ..." msgstr "projekt letöltése ..." +msgid "Download failed, File size exception." +msgstr "" + #, c-format, boost-format msgid "Project downloaded %d%%" msgstr "Projekt letöltve %d%%" msgid "" -"Importing to Orca Slicer failed. Please download the file and manually " +"Importing to Bambu Studio failed. Please download the file and manually " "import it." msgstr "" @@ -6111,6 +6117,21 @@ msgstr "Angolszász" msgid "Units" msgstr "Mértékegység" +msgid "Allow only one OrcaSlicer instance" +msgstr "" + +msgid "" +"On OSX there is always only one instance of app running by default. However " +"it is allowed to run multiple instances of same app from the command line. " +"In such case this settings will allow only one instance." +msgstr "" + +msgid "" +"If this is enabled, when starting OrcaSlicer and another instance of the " +"same OrcaSlicer is already running, that instance will be reactivated " +"instead." +msgstr "" + msgid "Home" msgstr "" @@ -6187,6 +6208,14 @@ msgid "" "each printer automatically." msgstr "" +msgid "Multi-device Management(Take effect after restarting Studio)." +msgstr "" + +msgid "" +"With this option enabled, you can send a task to multiple devices at the " +"same time and manage multiple devices." +msgstr "" + msgid "Network" msgstr "" @@ -6827,6 +6856,9 @@ msgstr "" msgid "Modifying the device name" msgstr "Eszköz nevének módosítása" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "Küldés a nyomtatóban lévő MicroSD kártyára" @@ -6882,6 +6914,26 @@ msgstr "Receive login report timeout" msgid "Unknown Failure" msgstr "Ismeretlen hiba" +msgid "" +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." +msgstr "" + +msgid "Can't find Pin Code?" +msgstr "" + +msgid "Pin Code" +msgstr "" + +msgid "Binding..." +msgstr "" + +msgid "Please confirm on the printer screen" +msgstr "" + +msgid "Log in failed. Please check the Pin Code." +msgstr "" + msgid "Log in printer" msgstr "Bejelentkezés a nyomtatóra" @@ -7085,8 +7137,8 @@ msgstr "" msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "Ha a nyomtatófej nélküli timelapse engedélyezve van, javasoljuk, hogy " "helyezz el a tálcán egy „Timelapse törlőtornyot“. Ehhez kattints jobb " @@ -8093,6 +8145,39 @@ msgstr "Done" msgid "resume" msgstr "" +msgid "Resume Printing" +msgstr "" + +msgid "Resume Printing(defects acceptable)" +msgstr "" + +msgid "Resume Printing(problem solved)" +msgstr "" + +msgid "Stop Printing" +msgstr "" + +msgid "Check Assistant" +msgstr "" + +msgid "Filament Extruded, Continue" +msgstr "" + +msgid "Not Extruded Yet, Retry" +msgstr "" + +msgid "Finished, Continue" +msgstr "" + +msgid "Load Filament" +msgstr "Filament betöltés" + +msgid "Filament Loaded, Resume" +msgstr "" + +msgid "View Liveview" +msgstr "" + msgid "Confirm and Update Nozzle" msgstr "" @@ -10110,6 +10195,9 @@ msgstr "Támasz kocka" msgid "Lightning" msgstr "Világítás" +msgid "Cross Hatch" +msgstr "" + msgid "Sparse infill anchor length" msgstr "" @@ -10279,10 +10367,10 @@ msgstr "Teljes ventilátor fordulatszám ennél a rétegnél" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" msgid "Support interface fan speed" @@ -12877,6 +12965,9 @@ msgstr "Canceled" msgid "load_obj: failed to parse" msgstr "load_obj: failed to parse" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "The file contains polygons with more than 4 vertices." @@ -12993,6 +13084,14 @@ msgstr "" msgid "The input value size must be 3." msgstr "" +msgid "" +"This machine type can only hold 16 history results per nozzle. You can " +"delete the existing historical results and then start calibration. Or you " +"can continue the calibration, but you cannot create new calibration " +"historical results. \n" +"Do you still want to continue the calibration?" +msgstr "" + msgid "Connecting to printer..." msgstr "" @@ -13002,6 +13101,19 @@ msgstr "" msgid "Flow Dynamics Calibration result has been saved to the printer" msgstr "" +#, c-format, boost-format +msgid "" +"There is already a historical calibration result with the same name: %s. " +"Only one of the results with the same name is saved. Are you sure you want " +"to override the historical result?" +msgstr "" + +#, c-format, boost-format +msgid "" +"This machine type can only hold %d history results per nozzle. This result " +"will not be saved." +msgstr "" + msgid "Internal Error" msgstr "" @@ -13227,9 +13339,6 @@ msgstr "" msgid "Printing Parameters" msgstr "" -msgid "- ℃" -msgstr "" - msgid "Plate Type" msgstr "Plate Type" @@ -13273,12 +13382,6 @@ msgstr "" msgid "Step value" msgstr "" -msgid "0.5" -msgstr "" - -msgid "0.005" -msgstr "" - msgid "The nozzle diameter has been synchronized from the printer Settings" msgstr "" @@ -13306,10 +13409,14 @@ msgstr "" msgid "Action" msgstr "" +#, c-format, boost-format +msgid "This machine type can only hold %d history results per nozzle." +msgstr "" + msgid "Edit Flow Dynamics Calibration" msgstr "" -msgid "New Flow Dynamics Calibration" +msgid "New Flow Dynamic Calibration" msgstr "" msgid "Ok" @@ -13318,13 +13425,6 @@ msgstr "" msgid "The filament must be selected." msgstr "" -#, c-format, boost-format -msgid "" -"There is already a historical calibration result with the same name: %s. " -"Only one of the results with the same name is saved. Are you sure you want " -"to override the historical result?" -msgstr "" - msgid "Network lookup" msgstr "" @@ -13705,8 +13805,8 @@ msgid "" msgstr "" msgid "" -"We would rename the presets as \"Vendor Type Serial @printer you " -"selected\". \n" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" "To add preset for more printers, Please go to printer selection" msgstr "" @@ -14249,6 +14349,175 @@ msgid "" "Error: \"%2%\"" msgstr "" +msgid "" +"It has a small layer height, and results in almost negligible layer lines " +"and high printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has lower speeds " +"and acceleration, and the sparse infill pattern is Gyroid. So, it results in " +"much higher printing quality, but a much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a slightly " +"bigger layer height, and results in almost negligible layer lines, and " +"slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a bigger layer " +"height, and results in slightly visible layer lines, but shorter printing " +"time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"height, and results in almost invisible layer lines and higher printing " +"quality, but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost invisible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of 0.2 mm nozzle, it has a smaller layer " +"height, and results in minimal layer lines and higher printing quality, but " +"shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in minimal layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"It has a general layer height, and results in general layer lines and " +"printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in less apparent layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost negligible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and longer printing " +"time." +msgstr "" + +msgid "" +"It has a big layer height, and results in apparent layer lines and ordinary " +"printing quality and printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in much more apparent layer lines and much lower " +"printing quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and slight higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"It has a very big layer height, and results in very apparent layer lines, " +"low printing quality and general printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a bigger layer " +"height, and results in very apparent layer lines and much lower printing " +"quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a much bigger " +"layer height, and results in extremely apparent layer lines and much lower " +"printing quality, but much shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a slightly " +"smaller layer height, and results in slightly less but still apparent layer " +"lines and slightly higher printing quality, but longer printing time in some " +"printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a smaller layer " +"height, and results in less but still apparent layer lines and slightly " +"higher printing quality, but longer printing time in some printing cases." +msgstr "" + msgid "Connected to Obico successfully!" msgstr "" @@ -14621,6 +14890,31 @@ msgid "" "probability of warping." msgstr "" +#~ msgid "Unload Filament" +#~ msgstr "Filament kitöltése" + +#~ msgid "" +#~ "Choose an AMS slot then press \"Load\" or \"Unload\" button to " +#~ "automatically load or unload filiament." +#~ msgstr "" +#~ "Válassz egy AMS rekeszt, majd nyomd meg a \"Load\" vagy \"Unload\" gombot " +#~ "a filament automatikus be- vagy kitöltéséhez." + +#~ msgid "MC" +#~ msgstr "MC" + +#~ msgid "MainBoard" +#~ msgstr "MainBoard" + +#~ msgid "TH" +#~ msgstr "TH" + +#~ msgid "XCam" +#~ msgstr "XCam" + +#~ msgid "HMS" +#~ msgstr "HMS" + #~ msgid "active" #~ msgstr "aktív" diff --git a/localization/i18n/it/OrcaSlicer_it.po b/localization/i18n/it/OrcaSlicer_it.po index 90fcb198d9..40036ff6ef 100644 --- a/localization/i18n/it/OrcaSlicer_it.po +++ b/localization/i18n/it/OrcaSlicer_it.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-16 16:45+0200\n" +"POT-Creation-Date: 2024-04-28 18:11+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -2431,11 +2431,11 @@ msgstr "Ricarica automatica" msgid "AMS not connected" msgstr "AMS non collegato" -msgid "Load Filament" -msgstr "Carica" +msgid "Load" +msgstr "" -msgid "Unload Filament" -msgstr "Scarica Filamento" +msgid "Unload" +msgstr "Scarica" msgid "Ext Spool" msgstr "Bobina esterna" @@ -2452,7 +2452,7 @@ msgstr "Riprova" msgid "Calibrating AMS..." msgstr "Calibrazione AMS..." -msgid "A problem occured during calibration. Click to view the solution." +msgid "A problem occurred during calibration. Click to view the solution." msgstr "" "Si è verificato un problema durante la calibrazione. Clicca per visualizzare " "la soluzione." @@ -2495,10 +2495,8 @@ msgstr "Prendo un nuovo filamento" msgid "" "Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically " -"load or unload filiament." +"load or unload filaments." msgstr "" -"Seleziona uno slot AMS, premi \"Carica\" o \"Scarica\" per caricare o " -"scaricare automaticamente il filamento." msgid "Edit" msgstr "Modifica" @@ -3126,6 +3124,14 @@ msgstr "" "L'AMS passerà automaticamente a un altro filamento con stesse proprietà " "quando il filamento corrente si esaurisce" +msgid "Air Printing Detection" +msgstr "" + +msgid "" +"Detects clogging and filament grinding, halting printing immediately to " +"conserve time and filament." +msgstr "" + msgid "File" msgstr "File" @@ -3592,18 +3598,6 @@ msgstr "Pausa in caso di errore nel primo layer" msgid "Nozzle clog pause" msgstr "Pausa in caso di intasamento del nozzle" -msgid "MC" -msgstr "MC" - -msgid "MainBoard" -msgstr "MainBoard" - -msgid "TH" -msgstr "TH" - -msgid "XCam" -msgstr "XCam" - msgid "Unknown" msgstr "Sconosciuto" @@ -4141,7 +4135,7 @@ msgstr "Volume:" msgid "Size:" msgstr "Dimensione:" -#, boost-format +#, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -4283,6 +4277,9 @@ msgstr "Anteprima" msgid "Device" msgstr "Dispositivo" +msgid "Multi-device" +msgstr "" + msgid "Project" msgstr "Progetto" @@ -4322,6 +4319,9 @@ msgstr "Stampa tutto" msgid "Send all" msgstr "Invia tutto" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "Scorciatoie Tastiera" @@ -5118,9 +5118,6 @@ msgstr "Camera" msgid "Bed" msgstr "Piano" -msgid "Unload" -msgstr "Scarica" - msgid "Debug Info" msgstr "Informazioni di debug" @@ -5307,9 +5304,6 @@ msgstr "Stato" msgid "Update" msgstr "Aggiorna" -msgid "HMS" -msgstr "HMS" - msgid "Don't show again" msgstr "Non mostrare più" @@ -5555,6 +5549,12 @@ msgstr "Consenti suono di richiesta" msgid "Filament Tangle Detect" msgstr "Rilevamento del groviglio del filamento" +msgid "Nozzle Clumping Detection" +msgstr "" + +msgid "Check if the nozzle is clumping by filament or other foreign objects." +msgstr "" + msgid "Nozzle Type" msgstr "" @@ -6021,19 +6021,23 @@ msgstr "Importazione del modello" msgid "prepare 3mf file..." msgstr "preparazione file 3mf..." +msgid "Download failed, unknown file format." +msgstr "" + msgid "downloading project ..." msgstr "Download progetto..." +msgid "Download failed, File size exception." +msgstr "" + #, c-format, boost-format msgid "Project downloaded %d%%" msgstr "Progetto scaricato %d%%" msgid "" -"Importing to Orca Slicer failed. Please download the file and manually " +"Importing to Bambu Studio failed. Please download the file and manually " "import it." msgstr "" -"L'importazione di Orca Slicer non è riuscita. Si prega di scaricare il file " -"e importarlo manualmente." msgid "Import SLA archive" msgstr "Importa archivio SLA" @@ -6307,6 +6311,21 @@ msgstr "Imperiale" msgid "Units" msgstr "Unità" +msgid "Allow only one OrcaSlicer instance" +msgstr "" + +msgid "" +"On OSX there is always only one instance of app running by default. However " +"it is allowed to run multiple instances of same app from the command line. " +"In such case this settings will allow only one instance." +msgstr "" + +msgid "" +"If this is enabled, when starting OrcaSlicer and another instance of the " +"same OrcaSlicer is already running, that instance will be reactivated " +"instead." +msgstr "" + msgid "Home" msgstr "Home" @@ -6385,6 +6404,14 @@ msgid "" "each printer automatically." msgstr "" +msgid "Multi-device Management(Take effect after restarting Studio)." +msgstr "" + +msgid "" +"With this option enabled, you can send a task to multiple devices at the " +"same time and manage multiple devices." +msgstr "" + msgid "Network" msgstr "Rete" @@ -7037,6 +7064,9 @@ msgstr "Calibrazione automatica del flusso tramite Micro Lidar" msgid "Modifying the device name" msgstr "Modifica nome del dispositivo" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "Invia a microSD stampante" @@ -7092,6 +7122,26 @@ msgstr "Timeout ricezione del rapporto di login" msgid "Unknown Failure" msgstr "Fallimento sconosciuto" +msgid "" +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." +msgstr "" + +msgid "Can't find Pin Code?" +msgstr "" + +msgid "Pin Code" +msgstr "" + +msgid "Binding..." +msgstr "" + +msgid "Please confirm on the printer screen" +msgstr "" + +msgid "Log in failed. Please check the Pin Code." +msgstr "" + msgid "Log in printer" msgstr "Log in stampante" @@ -7310,8 +7360,8 @@ msgstr "" msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "Quando si registra un timelapse senza testa di stampa, si consiglia di " "aggiungere un \"Timelapse Torre di pulizia\"\n" @@ -8361,6 +8411,39 @@ msgstr "Fine" msgid "resume" msgstr "" +msgid "Resume Printing" +msgstr "" + +msgid "Resume Printing(defects acceptable)" +msgstr "" + +msgid "Resume Printing(problem solved)" +msgstr "" + +msgid "Stop Printing" +msgstr "" + +msgid "Check Assistant" +msgstr "" + +msgid "Filament Extruded, Continue" +msgstr "" + +msgid "Not Extruded Yet, Retry" +msgstr "" + +msgid "Finished, Continue" +msgstr "" + +msgid "Load Filament" +msgstr "Carica" + +msgid "Filament Loaded, Resume" +msgstr "" + +msgid "View Liveview" +msgstr "" + msgid "Confirm and Update Nozzle" msgstr "Conferma e aggiorna l'ugello" @@ -8456,8 +8539,8 @@ msgid "" msgstr "" "È stato rilevato un aggiornamento importante che deve essere eseguito prima " "che la stampa possa continuare. Si desidera aggiornare ora? È possibile " -"effettuare l'aggiornamento anche in un secondo momento da \"Aggiorna " -"firmware\"." +"effettuare l'aggiornamento anche in un secondo momento da \"Aggiorna firmware" +"\"." msgid "" "The firmware version is abnormal. Repairing and updating are required before " @@ -10712,6 +10795,9 @@ msgstr "Supporto cubico" msgid "Lightning" msgstr "Lightning" +msgid "Cross Hatch" +msgstr "" + msgid "Sparse infill anchor length" msgstr "Lunghezza dell'ancora di riempimento sparsa" @@ -10919,17 +11005,16 @@ msgstr "Massima velocità della ventola al layer" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" "La velocità della ventola aumenterà linearmente da zero al livello " -"\"close_fan_the_first_x_layers\" al massimo al livello " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" verrà ignorato se " -"inferiore a \"close_fan_the_first_x_layers\", nel qual caso la ventola " -"funzionerà alla massima velocità consentita al livello " -"\"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" al massimo al livello \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" verrà ignorato se inferiore a " +"\"close_fan_the_first_x_layers\", nel qual caso la ventola funzionerà alla " +"massima velocità consentita al livello \"close_fan_the_first_x_layers\" + 1." msgid "Support interface fan speed" msgstr "Supporta la velocità della ventola dell'interfaccia" @@ -13931,6 +14016,9 @@ msgstr "Annullato" msgid "load_obj: failed to parse" msgstr "load_obj: analisi non riuscita" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "Il file contiene poligoni con più di 4 vertici." @@ -14059,6 +14147,14 @@ msgstr "Selezionare il filamento da calibrare." msgid "The input value size must be 3." msgstr "La dimensione del valore di input deve essere 3." +msgid "" +"This machine type can only hold 16 history results per nozzle. You can " +"delete the existing historical results and then start calibration. Or you " +"can continue the calibration, but you cannot create new calibration " +"historical results. \n" +"Do you still want to continue the calibration?" +msgstr "" + msgid "Connecting to printer..." msgstr "Collegamento alla stampante..." @@ -14070,6 +14166,19 @@ msgstr "" "Il risultato della calibrazione di Flow Dynamics è stato salvato nella " "stampante" +#, c-format, boost-format +msgid "" +"There is already a historical calibration result with the same name: %s. " +"Only one of the results with the same name is saved. Are you sure you want " +"to override the historical result?" +msgstr "" + +#, c-format, boost-format +msgid "" +"This machine type can only hold %d history results per nozzle. This result " +"will not be saved." +msgstr "" + msgid "Internal Error" msgstr "Errore interno" @@ -14385,9 +14494,6 @@ msgstr "" msgid "Printing Parameters" msgstr "Parametri di stampa" -msgid "- ℃" -msgstr "- °C" - msgid "Plate Type" msgstr "Tipo di piatto" @@ -14437,12 +14543,6 @@ msgstr "Al valore k" msgid "Step value" msgstr "Valore del passaggio" -msgid "0.5" -msgstr "0.5" - -msgid "0.005" -msgstr "0.005" - msgid "The nozzle diameter has been synchronized from the printer Settings" msgstr "" "Il diametro del nozzle è stato sincronizzato dalle impostazioni della " @@ -14472,10 +14572,14 @@ msgstr "Aggiornamento dei record storici di calibrazione di Flow Dynamics" msgid "Action" msgstr "Azione" +#, c-format, boost-format +msgid "This machine type can only hold %d history results per nozzle." +msgstr "" + msgid "Edit Flow Dynamics Calibration" msgstr "Modifica calibrazione dinamica flusso (Edit Flow Dynamics)" -msgid "New Flow Dynamics Calibration" +msgid "New Flow Dynamic Calibration" msgstr "" msgid "Ok" @@ -14484,13 +14588,6 @@ msgstr "" msgid "The filament must be selected." msgstr "" -#, c-format, boost-format -msgid "" -"There is already a historical calibration result with the same name: %s. " -"Only one of the results with the same name is saved. Are you sure you want " -"to override the historical result?" -msgstr "" - msgid "Network lookup" msgstr "Ricerca network" @@ -14903,8 +15000,8 @@ msgstr "" "Vuoi riscriverlo?" msgid "" -"We would rename the presets as \"Vendor Type Serial @printer you " -"selected\". \n" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" "To add preset for more printers, Please go to printer selection" msgstr "" "Rinomineremo le preimpostazioni come \"Tipo di fornitore seriale @printer " @@ -15537,6 +15634,175 @@ msgstr "" "Corpo messaggio: \"%1%\"\n" "Errore: \"%2%\"" +msgid "" +"It has a small layer height, and results in almost negligible layer lines " +"and high printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has lower speeds " +"and acceleration, and the sparse infill pattern is Gyroid. So, it results in " +"much higher printing quality, but a much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a slightly " +"bigger layer height, and results in almost negligible layer lines, and " +"slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a bigger layer " +"height, and results in slightly visible layer lines, but shorter printing " +"time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"height, and results in almost invisible layer lines and higher printing " +"quality, but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost invisible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of 0.2 mm nozzle, it has a smaller layer " +"height, and results in minimal layer lines and higher printing quality, but " +"shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in minimal layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"It has a general layer height, and results in general layer lines and " +"printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in less apparent layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost negligible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and longer printing " +"time." +msgstr "" + +msgid "" +"It has a big layer height, and results in apparent layer lines and ordinary " +"printing quality and printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in much more apparent layer lines and much lower " +"printing quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and slight higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"It has a very big layer height, and results in very apparent layer lines, " +"low printing quality and general printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a bigger layer " +"height, and results in very apparent layer lines and much lower printing " +"quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a much bigger " +"layer height, and results in extremely apparent layer lines and much lower " +"printing quality, but much shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a slightly " +"smaller layer height, and results in slightly less but still apparent layer " +"lines and slightly higher printing quality, but longer printing time in some " +"printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a smaller layer " +"height, and results in less but still apparent layer lines and slightly " +"higher printing quality, but longer printing time in some printing cases." +msgstr "" + msgid "Connected to Obico successfully!" msgstr "" @@ -15966,6 +16232,47 @@ msgstr "" "aumentare in modo appropriato la temperatura del piano riscaldato può " "ridurre la probabilità di deformazione." +#~ msgid "Unload Filament" +#~ msgstr "Scarica Filamento" + +#~ msgid "" +#~ "Choose an AMS slot then press \"Load\" or \"Unload\" button to " +#~ "automatically load or unload filiament." +#~ msgstr "" +#~ "Seleziona uno slot AMS, premi \"Carica\" o \"Scarica\" per caricare o " +#~ "scaricare automaticamente il filamento." + +#~ msgid "MC" +#~ msgstr "MC" + +#~ msgid "MainBoard" +#~ msgstr "MainBoard" + +#~ msgid "TH" +#~ msgstr "TH" + +#~ msgid "XCam" +#~ msgstr "XCam" + +#~ msgid "HMS" +#~ msgstr "HMS" + +#~ msgid "" +#~ "Importing to Orca Slicer failed. Please download the file and manually " +#~ "import it." +#~ msgstr "" +#~ "L'importazione di Orca Slicer non è riuscita. Si prega di scaricare il " +#~ "file e importarlo manualmente." + +#~ msgid "- ℃" +#~ msgstr "- °C" + +#~ msgid "0.5" +#~ msgstr "0.5" + +#~ msgid "0.005" +#~ msgstr "0.005" + #~ msgid "active" #~ msgstr "attivo" @@ -16244,8 +16551,8 @@ msgstr "" #~ msgstr "Nessun layer sparso (SPERIMENTALE)" #~ msgid "" -#~ "We would rename the presets as \"Vendor Type Serial @printer you " -#~ "selected\". \n" +#~ "We would rename the presets as \"Vendor Type Serial @printer you selected" +#~ "\". \n" #~ "To add preset for more prinetrs, Please go to printer selection" #~ msgstr "" #~ "Rinomineremo le impostazioni predefinite come \"Tipo di fornitore seriale " diff --git a/localization/i18n/ja/OrcaSlicer_ja.po b/localization/i18n/ja/OrcaSlicer_ja.po index 0b8dd2e837..413509eb33 100644 --- a/localization/i18n/ja/OrcaSlicer_ja.po +++ b/localization/i18n/ja/OrcaSlicer_ja.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-16 16:45+0200\n" +"POT-Creation-Date: 2024-04-28 18:11+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -2333,11 +2333,11 @@ msgstr "" msgid "AMS not connected" msgstr "AMS が接続されていません" -msgid "Load Filament" -msgstr "ロード" +msgid "Load" +msgstr "" -msgid "Unload Filament" -msgstr "アンロード" +msgid "Unload" +msgstr "アンロード" msgid "Ext Spool" msgstr "外部スプールホルダー" @@ -2354,7 +2354,7 @@ msgstr "再試行" msgid "Calibrating AMS..." msgstr "AMS キャリブレーション" -msgid "A problem occured during calibration. Click to view the solution." +msgid "A problem occurred during calibration. Click to view the solution." msgstr "" "キャリブレーション中に問題が発生しました。クリックして解決策をご確認くださ" "い。" @@ -2397,10 +2397,8 @@ msgstr "Grab new filament" msgid "" "Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically " -"load or unload filiament." +"load or unload filaments." msgstr "" -"AMS スロットを選択し、[ロード] または [アンロード] をタップすると、フィラメン" -"トが自動的にロードまたはアンロードされます。" msgid "Edit" msgstr "編集" @@ -2982,6 +2980,14 @@ msgid "" "automatically when current filament runs out" msgstr "使用中のフィラメントが切れた時に、同じ属性のフィラメントに切り替えます" +msgid "Air Printing Detection" +msgstr "" + +msgid "" +"Detects clogging and filament grinding, halting printing immediately to " +"conserve time and filament." +msgstr "" + msgid "File" msgstr "ファイル" @@ -3408,18 +3414,6 @@ msgstr "" msgid "Nozzle clog pause" msgstr "" -msgid "MC" -msgstr "MC" - -msgid "MainBoard" -msgstr "メインボード" - -msgid "TH" -msgstr "TH" - -msgid "XCam" -msgstr "XCam" - msgid "Unknown" msgstr "不明" @@ -3941,7 +3935,7 @@ msgstr "ボリューム" msgid "Size:" msgstr "サイズ:" -#, boost-format +#, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -4077,6 +4071,9 @@ msgstr "プレビュー" msgid "Device" msgstr "デバイス" +msgid "Multi-device" +msgstr "" + msgid "Project" msgstr "プロジェクト" @@ -4116,6 +4113,9 @@ msgstr "造形開始 (全プレート)" msgid "Send all" msgstr "送信 (全プレート)" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "ショートカット" @@ -4884,9 +4884,6 @@ msgstr "筐体" msgid "Bed" msgstr "ベッド" -msgid "Unload" -msgstr "アンロード" - msgid "Debug Info" msgstr "デバッグ情報" @@ -5056,9 +5053,6 @@ msgstr "デバイス状態" msgid "Update" msgstr "更新" -msgid "HMS" -msgstr "HMS" - msgid "Don't show again" msgstr "次回から表示しない" @@ -5298,6 +5292,12 @@ msgstr "" msgid "Filament Tangle Detect" msgstr "" +msgid "Nozzle Clumping Detection" +msgstr "" + +msgid "Check if the nozzle is clumping by filament or other foreign objects." +msgstr "" + msgid "Nozzle Type" msgstr "" @@ -5730,15 +5730,21 @@ msgstr "モデルをインポート" msgid "prepare 3mf file..." msgstr "3mfファイルを準備" +msgid "Download failed, unknown file format." +msgstr "" + msgid "downloading project ..." msgstr "プロジェクトをダウンロード中" +msgid "Download failed, File size exception." +msgstr "" + #, c-format, boost-format msgid "Project downloaded %d%%" msgstr "プロジェクトをダウンロード %d%%" msgid "" -"Importing to Orca Slicer failed. Please download the file and manually " +"Importing to Bambu Studio failed. Please download the file and manually " "import it." msgstr "" @@ -6005,6 +6011,21 @@ msgstr "インチ" msgid "Units" msgstr "単位" +msgid "Allow only one OrcaSlicer instance" +msgstr "" + +msgid "" +"On OSX there is always only one instance of app running by default. However " +"it is allowed to run multiple instances of same app from the command line. " +"In such case this settings will allow only one instance." +msgstr "" + +msgid "" +"If this is enabled, when starting OrcaSlicer and another instance of the " +"same OrcaSlicer is already running, that instance will be reactivated " +"instead." +msgstr "" + msgid "Home" msgstr "" @@ -6081,6 +6102,14 @@ msgid "" "each printer automatically." msgstr "" +msgid "Multi-device Management(Take effect after restarting Studio)." +msgstr "" + +msgid "" +"With this option enabled, you can send a task to multiple devices at the " +"same time and manage multiple devices." +msgstr "" + msgid "Network" msgstr "" @@ -6692,6 +6721,9 @@ msgstr "" msgid "Modifying the device name" msgstr "デバイス名を変更" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "プリンターのSDカードに送信" @@ -6745,6 +6777,26 @@ msgstr "Receive login report timeout" msgid "Unknown Failure" msgstr "不明な失敗" +msgid "" +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." +msgstr "" + +msgid "Can't find Pin Code?" +msgstr "" + +msgid "Pin Code" +msgstr "" + +msgid "Binding..." +msgstr "" + +msgid "Please confirm on the printer screen" +msgstr "" + +msgid "Log in failed. Please check the Pin Code." +msgstr "" + msgid "Log in printer" msgstr "プリンターを登録" @@ -6942,8 +6994,8 @@ msgstr "" msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "ヘッド無しのタイムラプスビデオを録画する時に、「タイムラプスプライムタワー」" "を追加してください。プレートで右クリックして、「プリミティブを追加」→「タイム" @@ -7919,6 +7971,39 @@ msgstr "Done" msgid "resume" msgstr "" +msgid "Resume Printing" +msgstr "" + +msgid "Resume Printing(defects acceptable)" +msgstr "" + +msgid "Resume Printing(problem solved)" +msgstr "" + +msgid "Stop Printing" +msgstr "" + +msgid "Check Assistant" +msgstr "" + +msgid "Filament Extruded, Continue" +msgstr "" + +msgid "Not Extruded Yet, Retry" +msgstr "" + +msgid "Finished, Continue" +msgstr "" + +msgid "Load Filament" +msgstr "ロード" + +msgid "Filament Loaded, Resume" +msgstr "" + +msgid "View Liveview" +msgstr "" + msgid "Confirm and Update Nozzle" msgstr "" @@ -9846,6 +9931,9 @@ msgstr "キュービックサポート" msgid "Lightning" msgstr "ライトニング" +msgid "Cross Hatch" +msgstr "" + msgid "Sparse infill anchor length" msgstr "" @@ -10010,10 +10098,10 @@ msgstr "最大回転速度の積層" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" msgid "Support interface fan speed" @@ -12514,6 +12602,9 @@ msgstr "Canceled" msgid "load_obj: failed to parse" msgstr "load_obj: failed to parse" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "The file contains polygons with more than 4 vertices." @@ -12630,6 +12721,14 @@ msgstr "" msgid "The input value size must be 3." msgstr "" +msgid "" +"This machine type can only hold 16 history results per nozzle. You can " +"delete the existing historical results and then start calibration. Or you " +"can continue the calibration, but you cannot create new calibration " +"historical results. \n" +"Do you still want to continue the calibration?" +msgstr "" + msgid "Connecting to printer..." msgstr "" @@ -12639,6 +12738,19 @@ msgstr "" msgid "Flow Dynamics Calibration result has been saved to the printer" msgstr "" +#, c-format, boost-format +msgid "" +"There is already a historical calibration result with the same name: %s. " +"Only one of the results with the same name is saved. Are you sure you want " +"to override the historical result?" +msgstr "" + +#, c-format, boost-format +msgid "" +"This machine type can only hold %d history results per nozzle. This result " +"will not be saved." +msgstr "" + msgid "Internal Error" msgstr "" @@ -12864,9 +12976,6 @@ msgstr "" msgid "Printing Parameters" msgstr "" -msgid "- ℃" -msgstr "" - msgid "Plate Type" msgstr "Plate Type" @@ -12910,12 +13019,6 @@ msgstr "" msgid "Step value" msgstr "" -msgid "0.5" -msgstr "" - -msgid "0.005" -msgstr "" - msgid "The nozzle diameter has been synchronized from the printer Settings" msgstr "" @@ -12943,10 +13046,14 @@ msgstr "" msgid "Action" msgstr "" +#, c-format, boost-format +msgid "This machine type can only hold %d history results per nozzle." +msgstr "" + msgid "Edit Flow Dynamics Calibration" msgstr "" -msgid "New Flow Dynamics Calibration" +msgid "New Flow Dynamic Calibration" msgstr "" msgid "Ok" @@ -12955,13 +13062,6 @@ msgstr "" msgid "The filament must be selected." msgstr "" -#, c-format, boost-format -msgid "" -"There is already a historical calibration result with the same name: %s. " -"Only one of the results with the same name is saved. Are you sure you want " -"to override the historical result?" -msgstr "" - msgid "Network lookup" msgstr "" @@ -13342,8 +13442,8 @@ msgid "" msgstr "" msgid "" -"We would rename the presets as \"Vendor Type Serial @printer you " -"selected\". \n" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" "To add preset for more printers, Please go to printer selection" msgstr "" @@ -13885,6 +13985,175 @@ msgid "" "Error: \"%2%\"" msgstr "" +msgid "" +"It has a small layer height, and results in almost negligible layer lines " +"and high printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has lower speeds " +"and acceleration, and the sparse infill pattern is Gyroid. So, it results in " +"much higher printing quality, but a much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a slightly " +"bigger layer height, and results in almost negligible layer lines, and " +"slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a bigger layer " +"height, and results in slightly visible layer lines, but shorter printing " +"time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"height, and results in almost invisible layer lines and higher printing " +"quality, but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost invisible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of 0.2 mm nozzle, it has a smaller layer " +"height, and results in minimal layer lines and higher printing quality, but " +"shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in minimal layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"It has a general layer height, and results in general layer lines and " +"printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in less apparent layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost negligible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and longer printing " +"time." +msgstr "" + +msgid "" +"It has a big layer height, and results in apparent layer lines and ordinary " +"printing quality and printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in much more apparent layer lines and much lower " +"printing quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and slight higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"It has a very big layer height, and results in very apparent layer lines, " +"low printing quality and general printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a bigger layer " +"height, and results in very apparent layer lines and much lower printing " +"quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a much bigger " +"layer height, and results in extremely apparent layer lines and much lower " +"printing quality, but much shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a slightly " +"smaller layer height, and results in slightly less but still apparent layer " +"lines and slightly higher printing quality, but longer printing time in some " +"printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a smaller layer " +"height, and results in less but still apparent layer lines and slightly " +"higher printing quality, but longer printing time in some printing cases." +msgstr "" + msgid "Connected to Obico successfully!" msgstr "" @@ -14236,6 +14505,31 @@ msgid "" "probability of warping." msgstr "" +#~ msgid "Unload Filament" +#~ msgstr "アンロード" + +#~ msgid "" +#~ "Choose an AMS slot then press \"Load\" or \"Unload\" button to " +#~ "automatically load or unload filiament." +#~ msgstr "" +#~ "AMS スロットを選択し、[ロード] または [アンロード] をタップすると、フィラ" +#~ "メントが自動的にロードまたはアンロードされます。" + +#~ msgid "MC" +#~ msgstr "MC" + +#~ msgid "MainBoard" +#~ msgstr "メインボード" + +#~ msgid "TH" +#~ msgstr "TH" + +#~ msgid "XCam" +#~ msgstr "XCam" + +#~ msgid "HMS" +#~ msgstr "HMS" + #~ msgid "active" #~ msgstr "アクティブ" diff --git a/localization/i18n/ko/OrcaSlicer_ko.po b/localization/i18n/ko/OrcaSlicer_ko.po index 524c6194c9..13eb863830 100644 --- a/localization/i18n/ko/OrcaSlicer_ko.po +++ b/localization/i18n/ko/OrcaSlicer_ko.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-16 16:45+0200\n" +"POT-Creation-Date: 2024-04-28 18:11+0800\n" "PO-Revision-Date: 2024-04-11 18:46+0900\n" "Last-Translator: Hotsolidinfill <138652683+Hotsolidinfill@users.noreply." "github.com>, crwusiz \n" @@ -2379,11 +2379,11 @@ msgstr "자동 리필" msgid "AMS not connected" msgstr "AMS가 연결되지 않음" -msgid "Load Filament" -msgstr "필라멘트 넣기" +msgid "Load" +msgstr "" -msgid "Unload Filament" -msgstr "필라멘트 언로드" +msgid "Unload" +msgstr "언로드" msgid "Ext Spool" msgstr "외부 스풀" @@ -2400,7 +2400,7 @@ msgstr "재시도" msgid "Calibrating AMS..." msgstr "AMS 교정 중..." -msgid "A problem occured during calibration. Click to view the solution." +msgid "A problem occurred during calibration. Click to view the solution." msgstr "교정하는 동안 문제가 발생했습니다. 솔루션을 보려면 클릭하세요." msgid "Calibrate again" @@ -2441,10 +2441,8 @@ msgstr "새 필라멘트 가져오기" msgid "" "Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically " -"load or unload filiament." +"load or unload filaments." msgstr "" -"AMS 슬롯을 선택한 후 \"넣기\" 또는 \"빼기\" 버튼을 눌러 필라멘트를 자동으로 " -"넣거나 뺍니다." msgid "Edit" msgstr "편집" @@ -3041,6 +3039,14 @@ msgstr "" "AMS는 현재 필라멘트가 소진되면 동일한 필라멘트 특성을 가진 다른 스풀로 자동으" "로 이동합니다" +msgid "Air Printing Detection" +msgstr "" + +msgid "" +"Detects clogging and filament grinding, halting printing immediately to " +"conserve time and filament." +msgstr "" + msgid "File" msgstr "파일" @@ -3487,18 +3493,6 @@ msgstr "첫번째 레이어 오류 일시중지" msgid "Nozzle clog pause" msgstr "노즐 막힘 일시 중지" -msgid "MC" -msgstr "MC" - -msgid "MainBoard" -msgstr "메인보드" - -msgid "TH" -msgstr "TH" - -msgid "XCam" -msgstr "XCam" - msgid "Unknown" msgstr "알 수 없는" @@ -4031,7 +4025,7 @@ msgstr "용량:" msgid "Size:" msgstr "크기:" -#, boost-format +#, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -4171,6 +4165,9 @@ msgstr "미리 보기" msgid "Device" msgstr "장치" +msgid "Multi-device" +msgstr "" + msgid "Project" msgstr "프로젝트" @@ -4210,6 +4207,9 @@ msgstr "모두 출력" msgid "Send all" msgstr "모두 전송" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "키보드 단축키" @@ -4989,9 +4989,6 @@ msgstr "챔버" msgid "Bed" msgstr "베드" -msgid "Unload" -msgstr "언로드" - msgid "Debug Info" msgstr "디버그 정보" @@ -5174,9 +5171,6 @@ msgstr "상태" msgid "Update" msgstr "업데이트" -msgid "HMS" -msgstr "HMS" - msgid "Don't show again" msgstr "다시 표시하지 않음" @@ -5419,6 +5413,12 @@ msgstr "프롬프트 소리 허용" msgid "Filament Tangle Detect" msgstr "필라멘트 엉킴 감지" +msgid "Nozzle Clumping Detection" +msgstr "" + +msgid "Check if the nozzle is clumping by filament or other foreign objects." +msgstr "" + msgid "Nozzle Type" msgstr "" @@ -5868,19 +5868,23 @@ msgstr "모델 가져오는 중" msgid "prepare 3mf file..." msgstr "3mf 파일 준비..." +msgid "Download failed, unknown file format." +msgstr "" + msgid "downloading project ..." msgstr "프로젝트 다운로드 중 ..." +msgid "Download failed, File size exception." +msgstr "" + #, c-format, boost-format msgid "Project downloaded %d%%" msgstr "프로젝트 다운로드 %d%%" msgid "" -"Importing to Orca Slicer failed. Please download the file and manually " +"Importing to Bambu Studio failed. Please download the file and manually " "import it." msgstr "" -"Orca Slicer로 가져오는 데 실패했습니다. 파일을 다운로드하여 수동으로 가져오세" -"요." msgid "Import SLA archive" msgstr "SLA 압축파일 가져오기" @@ -6147,6 +6151,21 @@ msgstr "야드파운드법" msgid "Units" msgstr "단위" +msgid "Allow only one OrcaSlicer instance" +msgstr "" + +msgid "" +"On OSX there is always only one instance of app running by default. However " +"it is allowed to run multiple instances of same app from the command line. " +"In such case this settings will allow only one instance." +msgstr "" + +msgid "" +"If this is enabled, when starting OrcaSlicer and another instance of the " +"same OrcaSlicer is already running, that instance will be reactivated " +"instead." +msgstr "" + msgid "Home" msgstr "홈" @@ -6223,6 +6242,14 @@ msgid "" "each printer automatically." msgstr "" +msgid "Multi-device Management(Take effect after restarting Studio)." +msgstr "" + +msgid "" +"With this option enabled, you can send a task to multiple devices at the " +"same time and manage multiple devices." +msgstr "" + msgid "Network" msgstr "네트워크" @@ -6850,6 +6877,9 @@ msgstr "마이크로 라이다를 사용한 자동 유량 교정" msgid "Modifying the device name" msgstr "장치 이름 수정" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "프린터 SD 카드로 보내기" @@ -6901,6 +6931,26 @@ msgstr "로그인 보고서 수신 시간 초과" msgid "Unknown Failure" msgstr "알 수 없는 실패" +msgid "" +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." +msgstr "" + +msgid "Can't find Pin Code?" +msgstr "" + +msgid "Pin Code" +msgstr "" + +msgid "Binding..." +msgstr "" + +msgid "Please confirm on the printer screen" +msgstr "" + +msgid "Log in failed. Please check the Pin Code." +msgstr "" + msgid "Log in printer" msgstr "프린터 로그인" @@ -7105,8 +7155,8 @@ msgstr "" msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "툴헤드 없이 시간 경과를 기록할 경우 \"타임랩스 닦기 타워\"를 추가하는 것이 좋" "습니다\n" @@ -8116,6 +8166,39 @@ msgstr "완료" msgid "resume" msgstr "" +msgid "Resume Printing" +msgstr "" + +msgid "Resume Printing(defects acceptable)" +msgstr "" + +msgid "Resume Printing(problem solved)" +msgstr "" + +msgid "Stop Printing" +msgstr "" + +msgid "Check Assistant" +msgstr "" + +msgid "Filament Extruded, Continue" +msgstr "" + +msgid "Not Extruded Yet, Retry" +msgstr "" + +msgid "Finished, Continue" +msgstr "" + +msgid "Load Filament" +msgstr "필라멘트 넣기" + +msgid "Filament Loaded, Resume" +msgstr "" + +msgid "View Liveview" +msgstr "" + msgid "Confirm and Update Nozzle" msgstr "노즐 확인 및 업데이트" @@ -10292,6 +10375,9 @@ msgstr "정육면체 지지대" msgid "Lightning" msgstr "번개" +msgid "Cross Hatch" +msgstr "" + msgid "Sparse infill anchor length" msgstr "드문 채우기 고정점 길이" @@ -10483,10 +10569,10 @@ msgstr "팬 최대 속도 레이어" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" "팬 속도는 \"close_fan_the_first_x_layers\" 의 0에서 \"full_fan_speed_layer\" " "의 최고 속도까지 선형적으로 증가합니다. \"full_fan_speed_layer\"가 " @@ -13290,6 +13376,9 @@ msgstr "취소됨" msgid "load_obj: failed to parse" msgstr "load_obj: 구문 분석에 실패" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "이 파일에는 꼭지점이 4개 이상인 다각형이 포함되어 있습니다." @@ -13413,6 +13502,14 @@ msgstr "교정할 필라멘트를 선택하세요." msgid "The input value size must be 3." msgstr "입력 값 크기는 3이어야 합니다." +msgid "" +"This machine type can only hold 16 history results per nozzle. You can " +"delete the existing historical results and then start calibration. Or you " +"can continue the calibration, but you cannot create new calibration " +"historical results. \n" +"Do you still want to continue the calibration?" +msgstr "" + msgid "Connecting to printer..." msgstr "프린터에 연결하는 중..." @@ -13422,6 +13519,19 @@ msgstr "실패한 테스트 결과가 삭제되었습니다." msgid "Flow Dynamics Calibration result has been saved to the printer" msgstr "동적 유량 교정 결과가 프린터에 저장되었습니다" +#, c-format, boost-format +msgid "" +"There is already a historical calibration result with the same name: %s. " +"Only one of the results with the same name is saved. Are you sure you want " +"to override the historical result?" +msgstr "" + +#, c-format, boost-format +msgid "" +"This machine type can only hold %d history results per nozzle. This result " +"will not be saved." +msgstr "" + msgid "Internal Error" msgstr "내부 오류" @@ -13707,9 +13817,6 @@ msgstr "" msgid "Printing Parameters" msgstr "출력 매개변수" -msgid "- ℃" -msgstr "- ℃" - msgid "Plate Type" msgstr "플레이트 타입" @@ -13756,12 +13863,6 @@ msgstr "K 값으로" msgid "Step value" msgstr "단계 값" -msgid "0.5" -msgstr "0.5" - -msgid "0.005" -msgstr "0.005" - msgid "The nozzle diameter has been synchronized from the printer Settings" msgstr "노즐 직경이 프린터 설정에서 동기화되었습니다" @@ -13789,10 +13890,14 @@ msgstr "과거 동적 유량 교정 기록 새로 고침" msgid "Action" msgstr "실행" +#, c-format, boost-format +msgid "This machine type can only hold %d history results per nozzle." +msgstr "" + msgid "Edit Flow Dynamics Calibration" msgstr "동적 유량 교정 편집" -msgid "New Flow Dynamics Calibration" +msgid "New Flow Dynamic Calibration" msgstr "" msgid "Ok" @@ -13801,13 +13906,6 @@ msgstr "" msgid "The filament must be selected." msgstr "" -#, c-format, boost-format -msgid "" -"There is already a historical calibration result with the same name: %s. " -"Only one of the results with the same name is saved. Are you sure you want " -"to override the historical result?" -msgstr "" - msgid "Network lookup" msgstr "네트워크 조회" @@ -14215,8 +14313,8 @@ msgstr "" "다시 작성하시겠습니까?" msgid "" -"We would rename the presets as \"Vendor Type Serial @printer you " -"selected\". \n" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" "To add preset for more printers, Please go to printer selection" msgstr "" "사전 설정의 이름을 \"선택한 공급업체 유형 직렬 @프린터\"로 변경합니다.\n" @@ -14815,6 +14913,175 @@ msgstr "" "메시지 본문: \"%1%\"\n" "오류: \"%2%\"" +msgid "" +"It has a small layer height, and results in almost negligible layer lines " +"and high printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has lower speeds " +"and acceleration, and the sparse infill pattern is Gyroid. So, it results in " +"much higher printing quality, but a much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a slightly " +"bigger layer height, and results in almost negligible layer lines, and " +"slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a bigger layer " +"height, and results in slightly visible layer lines, but shorter printing " +"time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"height, and results in almost invisible layer lines and higher printing " +"quality, but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost invisible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of 0.2 mm nozzle, it has a smaller layer " +"height, and results in minimal layer lines and higher printing quality, but " +"shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in minimal layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"It has a general layer height, and results in general layer lines and " +"printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in less apparent layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost negligible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and longer printing " +"time." +msgstr "" + +msgid "" +"It has a big layer height, and results in apparent layer lines and ordinary " +"printing quality and printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in much more apparent layer lines and much lower " +"printing quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and slight higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"It has a very big layer height, and results in very apparent layer lines, " +"low printing quality and general printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a bigger layer " +"height, and results in very apparent layer lines and much lower printing " +"quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a much bigger " +"layer height, and results in extremely apparent layer lines and much lower " +"printing quality, but much shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a slightly " +"smaller layer height, and results in slightly less but still apparent layer " +"lines and slightly higher printing quality, but longer printing time in some " +"printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a smaller layer " +"height, and results in less but still apparent layer lines and slightly " +"higher printing quality, but longer printing time in some printing cases." +msgstr "" + msgid "Connected to Obico successfully!" msgstr "Obico에 성공적으로 연결되었습니다!" @@ -15238,6 +15505,47 @@ msgstr "" "ABS 등 뒤틀림이 발생하기 쉬운 소재를 출력할 때, 히트베드 온도를 적절하게 높이" "면 뒤틀림 가능성을 줄일 수 있다는 사실을 알고 계셨나요?" +#~ msgid "Unload Filament" +#~ msgstr "필라멘트 언로드" + +#~ msgid "" +#~ "Choose an AMS slot then press \"Load\" or \"Unload\" button to " +#~ "automatically load or unload filiament." +#~ msgstr "" +#~ "AMS 슬롯을 선택한 후 \"넣기\" 또는 \"빼기\" 버튼을 눌러 필라멘트를 자동으" +#~ "로 넣거나 뺍니다." + +#~ msgid "MC" +#~ msgstr "MC" + +#~ msgid "MainBoard" +#~ msgstr "메인보드" + +#~ msgid "TH" +#~ msgstr "TH" + +#~ msgid "XCam" +#~ msgstr "XCam" + +#~ msgid "HMS" +#~ msgstr "HMS" + +#~ msgid "" +#~ "Importing to Orca Slicer failed. Please download the file and manually " +#~ "import it." +#~ msgstr "" +#~ "Orca Slicer로 가져오는 데 실패했습니다. 파일을 다운로드하여 수동으로 가져" +#~ "오세요." + +#~ msgid "- ℃" +#~ msgstr "- ℃" + +#~ msgid "0.5" +#~ msgstr "0.5" + +#~ msgid "0.005" +#~ msgstr "0.005" + #~ msgid "active" #~ msgstr "활성화" @@ -15493,8 +15801,8 @@ msgstr "" #~ msgstr "드문 레이어 없음(실험적)" #~ msgid "" -#~ "We would rename the presets as \"Vendor Type Serial @printer you " -#~ "selected\". \n" +#~ "We would rename the presets as \"Vendor Type Serial @printer you selected" +#~ "\". \n" #~ "To add preset for more prinetrs, Please go to printer selection" #~ msgstr "" #~ "사전 설정의 이름을 \"선택한 공급업체 유형 직렬 @프린터\"로 변경합니다.\n" diff --git a/localization/i18n/list.txt b/localization/i18n/list.txt index 381e1b1f66..68eb1c4cf3 100644 --- a/localization/i18n/list.txt +++ b/localization/i18n/list.txt @@ -159,6 +159,7 @@ src/slic3r/Utils/FlashAir.cpp src/slic3r/Utils/MKS.cpp src/slic3r/Utils/OctoPrint.cpp src/slic3r/Utils/Repetier.cpp +src/slic3r/Utils/ProfileDescription.hpp src/slic3r/Utils/Obico.cpp src/slic3r/Utils/SimplyPrint.cpp src/slic3r/Utils/Flashforge.cpp diff --git a/localization/i18n/nl/OrcaSlicer_nl.po b/localization/i18n/nl/OrcaSlicer_nl.po index d77c007a59..f589c3343c 100644 --- a/localization/i18n/nl/OrcaSlicer_nl.po +++ b/localization/i18n/nl/OrcaSlicer_nl.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-16 16:45+0200\n" +"POT-Creation-Date: 2024-04-28 18:11+0800\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -2378,10 +2378,10 @@ msgstr "" msgid "AMS not connected" msgstr "AMS niet aangesloten" -msgid "Load Filament" -msgstr "Filament laden" +msgid "Load" +msgstr "" -msgid "Unload Filament" +msgid "Unload" msgstr "Lossen" msgid "Ext Spool" @@ -2399,7 +2399,7 @@ msgstr "Opnieuw proberen" msgid "Calibrating AMS..." msgstr "AMS kalibreren..." -msgid "A problem occured during calibration. Click to view the solution." +msgid "A problem occurred during calibration. Click to view the solution." msgstr "" "Er is een probleem opgetreden tijdens de kalibratie. Klik om de oplossing te " "bekijken." @@ -2442,10 +2442,8 @@ msgstr "Grab new filament" msgid "" "Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically " -"load or unload filiament." +"load or unload filaments." msgstr "" -"Kies een AMS sleuf en druk op de \"Laden\" of \"Verwijderen\" knop om het " -"filament automatisch te laden of te verwijderen." msgid "Edit" msgstr "Bewerken" @@ -3059,6 +3057,14 @@ msgstr "" "AMS gaat automatisch verder met een andere spoel met dezelfde filament " "eigenschappen wanneer het huidige filament op is." +msgid "Air Printing Detection" +msgstr "" + +msgid "" +"Detects clogging and filament grinding, halting printing immediately to " +"conserve time and filament." +msgstr "" + msgid "File" msgstr "Bestand" @@ -3514,18 +3520,6 @@ msgstr "" msgid "Nozzle clog pause" msgstr "" -msgid "MC" -msgstr "MC" - -msgid "MainBoard" -msgstr "Moederbord" - -msgid "TH" -msgstr "th" - -msgid "XCam" -msgstr "XCam" - msgid "Unknown" msgstr "Onbekend" @@ -4048,7 +4042,7 @@ msgstr "Volume:" msgid "Size:" msgstr "Maat:" -#, boost-format +#, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -4188,6 +4182,9 @@ msgstr "Voorvertoning" msgid "Device" msgstr "Apparaat" +msgid "Multi-device" +msgstr "" + msgid "Project" msgstr "Project" @@ -4227,6 +4224,9 @@ msgstr "Print alles" msgid "Send all" msgstr "Alles verzenden" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "Sneltoesten" @@ -5002,9 +5002,6 @@ msgstr "Kamer" msgid "Bed" msgstr "Printbed" -msgid "Unload" -msgstr "Lossen" - msgid "Debug Info" msgstr "Informatie over Debuggen" @@ -5174,9 +5171,6 @@ msgstr "Status" msgid "Update" msgstr "Updaten" -msgid "HMS" -msgstr "HMS" - msgid "Don't show again" msgstr "Niet nogmaals tonen" @@ -5431,6 +5425,12 @@ msgstr "" msgid "Filament Tangle Detect" msgstr "" +msgid "Nozzle Clumping Detection" +msgstr "" + +msgid "Check if the nozzle is clumping by filament or other foreign objects." +msgstr "" + msgid "Nozzle Type" msgstr "" @@ -5883,15 +5883,21 @@ msgstr "Model importeren" msgid "prepare 3mf file..." msgstr "voorbereiden van 3mf bestand..." +msgid "Download failed, unknown file format." +msgstr "" + msgid "downloading project ..." msgstr "project downloaden..." +msgid "Download failed, File size exception." +msgstr "" + #, c-format, boost-format msgid "Project downloaded %d%%" msgstr "Project %d%% gedownload" msgid "" -"Importing to Orca Slicer failed. Please download the file and manually " +"Importing to Bambu Studio failed. Please download the file and manually " "import it." msgstr "" @@ -6163,6 +6169,21 @@ msgstr "Imperiaal" msgid "Units" msgstr "Eenheden" +msgid "Allow only one OrcaSlicer instance" +msgstr "" + +msgid "" +"On OSX there is always only one instance of app running by default. However " +"it is allowed to run multiple instances of same app from the command line. " +"In such case this settings will allow only one instance." +msgstr "" + +msgid "" +"If this is enabled, when starting OrcaSlicer and another instance of the " +"same OrcaSlicer is already running, that instance will be reactivated " +"instead." +msgstr "" + msgid "Home" msgstr "" @@ -6240,6 +6261,14 @@ msgid "" "each printer automatically." msgstr "" +msgid "Multi-device Management(Take effect after restarting Studio)." +msgstr "" + +msgid "" +"With this option enabled, you can send a task to multiple devices at the " +"same time and manage multiple devices." +msgstr "" + msgid "Network" msgstr "" @@ -6889,6 +6918,9 @@ msgstr "" msgid "Modifying the device name" msgstr "De naam van het apparaat wijzigen" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "Verzenden naar de MicroSD-kaart in de printer" @@ -6943,6 +6975,26 @@ msgstr "Receive login report timeout" msgid "Unknown Failure" msgstr "Onbekende fout" +msgid "" +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." +msgstr "" + +msgid "Can't find Pin Code?" +msgstr "" + +msgid "Pin Code" +msgstr "" + +msgid "Binding..." +msgstr "" + +msgid "Please confirm on the printer screen" +msgstr "" + +msgid "Log in failed. Please check the Pin Code." +msgstr "" + msgid "Log in printer" msgstr "Inloggen op printer" @@ -7151,8 +7203,8 @@ msgstr "" msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "Bij het opnemen van timelapse zonder toolhead is het aan te raden om een " "„Timelapse Wipe Tower” toe te voegen \n" @@ -8170,6 +8222,39 @@ msgstr "Done" msgid "resume" msgstr "" +msgid "Resume Printing" +msgstr "" + +msgid "Resume Printing(defects acceptable)" +msgstr "" + +msgid "Resume Printing(problem solved)" +msgstr "" + +msgid "Stop Printing" +msgstr "" + +msgid "Check Assistant" +msgstr "" + +msgid "Filament Extruded, Continue" +msgstr "" + +msgid "Not Extruded Yet, Retry" +msgstr "" + +msgid "Finished, Continue" +msgstr "" + +msgid "Load Filament" +msgstr "Filament laden" + +msgid "Filament Loaded, Resume" +msgstr "" + +msgid "View Liveview" +msgstr "" + msgid "Confirm and Update Nozzle" msgstr "" @@ -10200,6 +10285,9 @@ msgstr "Ondersteuning Cubic" msgid "Lightning" msgstr "Lightning" +msgid "Cross Hatch" +msgstr "" + msgid "Sparse infill anchor length" msgstr "" @@ -10372,10 +10460,10 @@ msgstr "Volledige snelheid op laag" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" msgid "Support interface fan speed" @@ -12991,6 +13079,9 @@ msgstr "Canceled" msgid "load_obj: failed to parse" msgstr "load_obj: failed to parse" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "The file contains polygons with more than 4 vertices." @@ -13107,6 +13198,14 @@ msgstr "" msgid "The input value size must be 3." msgstr "" +msgid "" +"This machine type can only hold 16 history results per nozzle. You can " +"delete the existing historical results and then start calibration. Or you " +"can continue the calibration, but you cannot create new calibration " +"historical results. \n" +"Do you still want to continue the calibration?" +msgstr "" + msgid "Connecting to printer..." msgstr "" @@ -13116,6 +13215,19 @@ msgstr "" msgid "Flow Dynamics Calibration result has been saved to the printer" msgstr "" +#, c-format, boost-format +msgid "" +"There is already a historical calibration result with the same name: %s. " +"Only one of the results with the same name is saved. Are you sure you want " +"to override the historical result?" +msgstr "" + +#, c-format, boost-format +msgid "" +"This machine type can only hold %d history results per nozzle. This result " +"will not be saved." +msgstr "" + msgid "Internal Error" msgstr "" @@ -13341,9 +13453,6 @@ msgstr "" msgid "Printing Parameters" msgstr "" -msgid "- ℃" -msgstr "" - msgid "Plate Type" msgstr "Plate Type" @@ -13387,12 +13496,6 @@ msgstr "" msgid "Step value" msgstr "" -msgid "0.5" -msgstr "" - -msgid "0.005" -msgstr "" - msgid "The nozzle diameter has been synchronized from the printer Settings" msgstr "" @@ -13420,10 +13523,14 @@ msgstr "" msgid "Action" msgstr "" +#, c-format, boost-format +msgid "This machine type can only hold %d history results per nozzle." +msgstr "" + msgid "Edit Flow Dynamics Calibration" msgstr "" -msgid "New Flow Dynamics Calibration" +msgid "New Flow Dynamic Calibration" msgstr "" msgid "Ok" @@ -13432,13 +13539,6 @@ msgstr "" msgid "The filament must be selected." msgstr "" -#, c-format, boost-format -msgid "" -"There is already a historical calibration result with the same name: %s. " -"Only one of the results with the same name is saved. Are you sure you want " -"to override the historical result?" -msgstr "" - msgid "Network lookup" msgstr "" @@ -13819,8 +13919,8 @@ msgid "" msgstr "" msgid "" -"We would rename the presets as \"Vendor Type Serial @printer you " -"selected\". \n" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" "To add preset for more printers, Please go to printer selection" msgstr "" @@ -14363,6 +14463,175 @@ msgid "" "Error: \"%2%\"" msgstr "" +msgid "" +"It has a small layer height, and results in almost negligible layer lines " +"and high printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has lower speeds " +"and acceleration, and the sparse infill pattern is Gyroid. So, it results in " +"much higher printing quality, but a much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a slightly " +"bigger layer height, and results in almost negligible layer lines, and " +"slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a bigger layer " +"height, and results in slightly visible layer lines, but shorter printing " +"time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"height, and results in almost invisible layer lines and higher printing " +"quality, but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost invisible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of 0.2 mm nozzle, it has a smaller layer " +"height, and results in minimal layer lines and higher printing quality, but " +"shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in minimal layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"It has a general layer height, and results in general layer lines and " +"printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in less apparent layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost negligible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and longer printing " +"time." +msgstr "" + +msgid "" +"It has a big layer height, and results in apparent layer lines and ordinary " +"printing quality and printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in much more apparent layer lines and much lower " +"printing quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and slight higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"It has a very big layer height, and results in very apparent layer lines, " +"low printing quality and general printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a bigger layer " +"height, and results in very apparent layer lines and much lower printing " +"quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a much bigger " +"layer height, and results in extremely apparent layer lines and much lower " +"printing quality, but much shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a slightly " +"smaller layer height, and results in slightly less but still apparent layer " +"lines and slightly higher printing quality, but longer printing time in some " +"printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a smaller layer " +"height, and results in less but still apparent layer lines and slightly " +"higher printing quality, but longer printing time in some printing cases." +msgstr "" + msgid "Connected to Obico successfully!" msgstr "" @@ -14735,6 +15004,31 @@ msgid "" "probability of warping." msgstr "" +#~ msgid "Unload Filament" +#~ msgstr "Lossen" + +#~ msgid "" +#~ "Choose an AMS slot then press \"Load\" or \"Unload\" button to " +#~ "automatically load or unload filiament." +#~ msgstr "" +#~ "Kies een AMS sleuf en druk op de \"Laden\" of \"Verwijderen\" knop om het " +#~ "filament automatisch te laden of te verwijderen." + +#~ msgid "MC" +#~ msgstr "MC" + +#~ msgid "MainBoard" +#~ msgstr "Moederbord" + +#~ msgid "TH" +#~ msgstr "th" + +#~ msgid "XCam" +#~ msgstr "XCam" + +#~ msgid "HMS" +#~ msgstr "HMS" + #~ msgid "active" #~ msgstr "Actief" diff --git a/localization/i18n/pl/OrcaSlicer_pl.po b/localization/i18n/pl/OrcaSlicer_pl.po index c586c0561a..69f559d8ad 100644 --- a/localization/i18n/pl/OrcaSlicer_pl.po +++ b/localization/i18n/pl/OrcaSlicer_pl.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: OrcaSlicer 2.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-16 16:45+0200\n" +"POT-Creation-Date: 2024-04-28 18:11+0800\n" "PO-Revision-Date: \n" "Last-Translator: Krzysztof Morga \n" "Language-Team: \n" @@ -2418,11 +2418,11 @@ msgstr "Auto. uzupełnienie" msgid "AMS not connected" msgstr "AMS niepodłączony" -msgid "Load Filament" -msgstr "Ładuj" +msgid "Load" +msgstr "" -msgid "Unload Filament" -msgstr "Wyładuj" +msgid "Unload" +msgstr "Wyładowaj" msgid "Ext Spool" msgstr "Ext Spool" @@ -2439,7 +2439,7 @@ msgstr "Ponów" msgid "Calibrating AMS..." msgstr "Kalibracja AMS..." -msgid "A problem occured during calibration. Click to view the solution." +msgid "A problem occurred during calibration. Click to view the solution." msgstr "" "Wystąpił problem podczas kalibracji. Kliknij, aby zobaczyć rozwiązanie." @@ -2485,10 +2485,8 @@ msgstr "" msgid "" "Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically " -"load or unload filiament." +"load or unload filaments." msgstr "" -"Wybierz Slot AMS, a następnie naciśnij przycisk \"Ładuj\" lub \"Wyładuj\" ," -"aby automatycznie załadować lub wyładować filament." msgid "Edit" msgstr "Edytuj" @@ -3123,6 +3121,14 @@ msgstr "" "AMS automatycznie przełączy się na inną szpule z tym samym rodzajem " "filamentu, gdy obecny filament się skończy" +msgid "Air Printing Detection" +msgstr "" + +msgid "" +"Detects clogging and filament grinding, halting printing immediately to " +"conserve time and filament." +msgstr "" + msgid "File" msgstr "Plik" @@ -3590,18 +3596,6 @@ msgstr "Pauza z powodu błędu pierwszej warstwy" msgid "Nozzle clog pause" msgstr "Pauza z powodu zatkanej dyszy" -msgid "MC" -msgstr "MC (Płytka główna)" - -msgid "MainBoard" -msgstr "MainBoard (Płyta główna)" - -msgid "TH" -msgstr "TH" - -msgid "XCam" -msgstr "XCam" - msgid "Unknown" msgstr "Nieznany" @@ -4137,7 +4131,7 @@ msgstr "Objętość:" msgid "Size:" msgstr "Rozmiar:" -#, boost-format +#, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -4278,6 +4272,9 @@ msgstr "Podgląd" msgid "Device" msgstr "Urządzenie" +msgid "Multi-device" +msgstr "" + msgid "Project" msgstr "Projekt" @@ -4318,6 +4315,9 @@ msgstr "Drukuj wszystko" msgid "Send all" msgstr "Wyślij wszystko" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "Skróty klawiszowe" @@ -5138,9 +5138,6 @@ msgstr "Cham" msgid "Bed" msgstr "Stół" -msgid "Unload" -msgstr "Wyładowaj" - msgid "Debug Info" msgstr "Informacje debugowania" @@ -5326,9 +5323,6 @@ msgstr "Status" msgid "Update" msgstr "Aktualizacja" -msgid "HMS" -msgstr "Stan drukarki (HMS)" - msgid "Don't show again" msgstr "Nie pokazuj ponownie" @@ -5581,6 +5575,12 @@ msgstr "Zezwól na dźwiękowe powiadomienia" msgid "Filament Tangle Detect" msgstr "Wykrywanie splątanych filamentów" +msgid "Nozzle Clumping Detection" +msgstr "" + +msgid "Check if the nozzle is clumping by filament or other foreign objects." +msgstr "" + msgid "Nozzle Type" msgstr "Rodzaj dyszy" @@ -6041,18 +6041,23 @@ msgstr "Importowanie modelu" msgid "prepare 3mf file..." msgstr "przygotuj plik 3mf..." +msgid "Download failed, unknown file format." +msgstr "" + msgid "downloading project ..." msgstr "pobieranie projektu ..." +msgid "Download failed, File size exception." +msgstr "" + #, c-format, boost-format msgid "Project downloaded %d%%" msgstr "Projekt pobrany w %d%%" msgid "" -"Importing to Orca Slicer failed. Please download the file and manually " +"Importing to Bambu Studio failed. Please download the file and manually " "import it." msgstr "" -"Import do Orca Slicer nie powiódł się. Pobierz plik i zaimportuj go ręcznie." msgid "Import SLA archive" msgstr "Importuj archiwum SLA" @@ -6330,6 +6335,21 @@ msgstr "Imperialny" msgid "Units" msgstr "Jednostki" +msgid "Allow only one OrcaSlicer instance" +msgstr "" + +msgid "" +"On OSX there is always only one instance of app running by default. However " +"it is allowed to run multiple instances of same app from the command line. " +"In such case this settings will allow only one instance." +msgstr "" + +msgid "" +"If this is enabled, when starting OrcaSlicer and another instance of the " +"same OrcaSlicer is already running, that instance will be reactivated " +"instead." +msgstr "" + msgid "Home" msgstr "Strona główna" @@ -6419,6 +6439,14 @@ msgstr "" "Jeśli ta opcja jest włączona, Orca będzie automatycznie zapamiętywać i " "przełączać konfigurację filamentu/procesu dla każdej drukarki." +msgid "Multi-device Management(Take effect after restarting Studio)." +msgstr "" + +msgid "" +"With this option enabled, you can send a task to multiple devices at the " +"same time and manage multiple devices." +msgstr "" + msgid "Network" msgstr "Sieć" @@ -7072,6 +7100,9 @@ msgstr "Automatyczna kalibracja przepływu za pomocą mikrolidaru" msgid "Modifying the device name" msgstr "Modyfikacja nazwy urządzenia" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "Wysłać na kartę SD drukarki" @@ -7124,6 +7155,26 @@ msgstr "Czas oczekiwania na otrzymanie raportu logowania minął" msgid "Unknown Failure" msgstr "Nieznana awaria" +msgid "" +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." +msgstr "" + +msgid "Can't find Pin Code?" +msgstr "" + +msgid "Pin Code" +msgstr "" + +msgid "Binding..." +msgstr "" + +msgid "Please confirm on the printer screen" +msgstr "" + +msgid "Log in failed. Please check the Pin Code." +msgstr "" + msgid "Log in printer" msgstr "Zaloguj się do drukarki" @@ -7346,8 +7397,8 @@ msgstr "" msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "Podczas nagrywania timelapse'a bez głowicy narzędziowej zaleca się dodanie " "\"Timelaps - Wieża Czyszcząca\" \n" @@ -8398,6 +8449,39 @@ msgstr "Gotowe" msgid "resume" msgstr "wznów" +msgid "Resume Printing" +msgstr "" + +msgid "Resume Printing(defects acceptable)" +msgstr "" + +msgid "Resume Printing(problem solved)" +msgstr "" + +msgid "Stop Printing" +msgstr "" + +msgid "Check Assistant" +msgstr "" + +msgid "Filament Extruded, Continue" +msgstr "" + +msgid "Not Extruded Yet, Retry" +msgstr "" + +msgid "Finished, Continue" +msgstr "" + +msgid "Load Filament" +msgstr "Ładuj" + +msgid "Filament Loaded, Resume" +msgstr "" + +msgid "View Liveview" +msgstr "" + msgid "Confirm and Update Nozzle" msgstr "Potwierdź i zaktualizuj dyszę" @@ -9226,10 +9310,10 @@ msgid "" msgstr "" "Unikaj ruchów nad obrysami-\n" "Maksymalna długość objazdu przy unikaniu przejeżdżania nad obrysami. Jeśli " -"objazd miałby wykroczyć poza tę wartość, funkcja \"unikaj ruchów nad " -"obrysami\" zostanie zignorowana dla tej ścieżki. Długość objazdu można " -"zdefiniować jako wartość absolutna lub obliczona procentowo (np. 50%) z " -"długości ruchu bezpośredniego." +"objazd miałby wykroczyć poza tę wartość, funkcja \"unikaj ruchów nad obrysami" +"\" zostanie zignorowana dla tej ścieżki. Długość objazdu można zdefiniować " +"jako wartość absolutna lub obliczona procentowo (np. 50%) z długości ruchu " +"bezpośredniego." msgid "mm or %" msgstr "mm lub %" @@ -9798,9 +9882,9 @@ msgid "" "quality for needle and small details" msgstr "" "Włącz tę opcję, aby zwolnić prędkość druku, aby czas końcowej warstwy nie " -"był krótszy niż próg czasu warstwy w \"Próg maksymalnej prędkości " -"wentylatora\", tak aby warstwa mogła być chłodzona przez dłuższy czas. Może " -"to poprawić jakość chłodzenia dla igieł i małych detali" +"był krótszy niż próg czasu warstwy w \"Próg maksymalnej prędkości wentylatora" +"\", tak aby warstwa mogła być chłodzona przez dłuższy czas. Może to poprawić " +"jakość chłodzenia dla igieł i małych detali" msgid "Normal printing" msgstr "Normalne drukowanie" @@ -10726,6 +10810,9 @@ msgstr "Podpora sześcienna" msgid "Lightning" msgstr "Piorun" +msgid "Cross Hatch" +msgstr "" + msgid "Sparse infill anchor length" msgstr "Długość kotwiczenia wypełnienia" @@ -10933,10 +11020,10 @@ msgstr "Pełna prędkość wentylatora na warstwie" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" "Prędkość wentylatora będzie stopniowo zwiększana liniowo od zera na warstwie " "\"close_fan_the_first_x_layers\" do maksymalnej na warstwie " @@ -12463,8 +12550,8 @@ msgstr "" "poklatkowy po zakończeniu drukowania. Jeśli wybrany jest tryb \"Wygładź\", " "głowica narzędziowa przesunie się nad wieżę po wydrukowaniu każdej warstwy, " "a następnie zrobi zdjęcie. Ponieważ stopiony filament może wyciekać z dyszy " -"podczas robienia zdjęcia, wieża czyszcząca jest wymagana w trybie " -"\"Wygładź\" do czyszczenia dyszy." +"podczas robienia zdjęcia, wieża czyszcząca jest wymagana w trybie \"Wygładź" +"\" do czyszczenia dyszy." msgid "Traditional" msgstr "Tradycyjny" @@ -12544,10 +12631,10 @@ msgid "" "triangle mesh slicing. The gap closing operation may reduce the final print " "resolution, therefore it is advisable to keep the value reasonably low." msgstr "" -"Szpary mniejsze niż dwukrotność wartości parametru \"promień zamykania " -"szpar\" zostaną zamknięte przy cięciu. Operacja zamykania szpar może " -"zmniejszyć finalną rozdzielczość wydruku, więc zalecane jest ustawienie tej " -"wartości na rozsądnie niskim poziomie." +"Szpary mniejsze niż dwukrotność wartości parametru \"promień zamykania szpar" +"\" zostaną zamknięte przy cięciu. Operacja zamykania szpar może zmniejszyć " +"finalną rozdzielczość wydruku, więc zalecane jest ustawienie tej wartości na " +"rozsądnie niskim poziomie." msgid "Slicing Mode" msgstr "Tryb cięcia" @@ -13916,6 +14003,9 @@ msgstr "Anulowano" msgid "load_obj: failed to parse" msgstr "load_obj: nie udało się przetworzyć" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "Plik zawiera wielokąty z więcej niż 4 wierzchołkami." @@ -14042,6 +14132,14 @@ msgstr "Proszę wybrać filament do kalibracji." msgid "The input value size must be 3." msgstr "Rozmiar wartości wejściowej musi wynosić 3." +msgid "" +"This machine type can only hold 16 history results per nozzle. You can " +"delete the existing historical results and then start calibration. Or you " +"can continue the calibration, but you cannot create new calibration " +"historical results. \n" +"Do you still want to continue the calibration?" +msgstr "" + msgid "Connecting to printer..." msgstr "Łączenie z drukarką..." @@ -14051,6 +14149,21 @@ msgstr "Nieudany wynik testu został odrzucony." msgid "Flow Dynamics Calibration result has been saved to the printer" msgstr "Wynik Kalibracji Dynamiki Przepływu został zapisany w drukarce" +#, c-format, boost-format +msgid "" +"There is already a historical calibration result with the same name: %s. " +"Only one of the results with the same name is saved. Are you sure you want " +"to override the historical result?" +msgstr "" +"W historii kalibracji istnieje już wynik o nazwie: %s. Czy na pewno chcesz " +"zastąpić poprzedni wynik?" + +#, c-format, boost-format +msgid "" +"This machine type can only hold %d history results per nozzle. This result " +"will not be saved." +msgstr "" + msgid "Internal Error" msgstr "Błąd wewnętrzny" @@ -14357,9 +14470,6 @@ msgstr "" msgid "Printing Parameters" msgstr "Parametry drukowania" -msgid "- ℃" -msgstr "- ℃" - msgid "Plate Type" msgstr "Typ Płyty" @@ -14407,12 +14517,6 @@ msgstr "Do wartości K" msgid "Step value" msgstr "Wartość kroku" -msgid "0.5" -msgstr "0.5" - -msgid "0.005" -msgstr "0.005" - msgid "The nozzle diameter has been synchronized from the printer Settings" msgstr "Średnica dyszy została zsynchronizowana z ustawień drukarki" @@ -14440,11 +14544,15 @@ msgstr "Odświeżanie historii zapisów kalibracji Flow Dynamics" msgid "Action" msgstr "Akcja" +#, c-format, boost-format +msgid "This machine type can only hold %d history results per nozzle." +msgstr "" + msgid "Edit Flow Dynamics Calibration" msgstr "Edytuj Kalibrację Dynamiki Przepływu" -msgid "New Flow Dynamics Calibration" -msgstr "Nowa Kalibracji Dynamiki Przepływu" +msgid "New Flow Dynamic Calibration" +msgstr "" msgid "Ok" msgstr "Ok" @@ -14452,15 +14560,6 @@ msgstr "Ok" msgid "The filament must be selected." msgstr "Należy wybrać filament." -#, c-format, boost-format -msgid "" -"There is already a historical calibration result with the same name: %s. " -"Only one of the results with the same name is saved. Are you sure you want " -"to override the historical result?" -msgstr "" -"W historii kalibracji istnieje już wynik o nazwie: %s. Czy na pewno chcesz " -"zastąpić poprzedni wynik?" - msgid "Network lookup" msgstr "Wyszukiwanie w sieci" @@ -14878,8 +14977,8 @@ msgstr "" "Czy chcesz go zastąpić?" msgid "" -"We would rename the presets as \"Vendor Type Serial @printer you " -"selected\". \n" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" "To add preset for more printers, Please go to printer selection" msgstr "" "Nazwa profilu zostanie zmieniona na \"Producent Typ Rodzaj @nazwa drukarki, " @@ -15511,6 +15610,175 @@ msgstr "" "Treść wiadomości: \"%1%\"\n" "Błąd: \"%2%\"" +msgid "" +"It has a small layer height, and results in almost negligible layer lines " +"and high printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has lower speeds " +"and acceleration, and the sparse infill pattern is Gyroid. So, it results in " +"much higher printing quality, but a much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a slightly " +"bigger layer height, and results in almost negligible layer lines, and " +"slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a bigger layer " +"height, and results in slightly visible layer lines, but shorter printing " +"time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"height, and results in almost invisible layer lines and higher printing " +"quality, but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost invisible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of 0.2 mm nozzle, it has a smaller layer " +"height, and results in minimal layer lines and higher printing quality, but " +"shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in minimal layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"It has a general layer height, and results in general layer lines and " +"printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in less apparent layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost negligible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and longer printing " +"time." +msgstr "" + +msgid "" +"It has a big layer height, and results in apparent layer lines and ordinary " +"printing quality and printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in much more apparent layer lines and much lower " +"printing quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and slight higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"It has a very big layer height, and results in very apparent layer lines, " +"low printing quality and general printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a bigger layer " +"height, and results in very apparent layer lines and much lower printing " +"quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a much bigger " +"layer height, and results in extremely apparent layer lines and much lower " +"printing quality, but much shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a slightly " +"smaller layer height, and results in slightly less but still apparent layer " +"lines and slightly higher printing quality, but longer printing time in some " +"printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a smaller layer " +"height, and results in less but still apparent layer lines and slightly " +"higher printing quality, but longer printing time in some printing cases." +msgstr "" + msgid "Connected to Obico successfully!" msgstr "Pomyślnie połączono z SimplyPrint!" @@ -15944,6 +16212,50 @@ msgstr "" "takimi jak ABS, odpowiednie zwiększenie temperatury podgrzewanej płyty może " "zmniejszyć prawdopodobieństwo odkształceń." +#~ msgid "Unload Filament" +#~ msgstr "Wyładuj" + +#~ msgid "" +#~ "Choose an AMS slot then press \"Load\" or \"Unload\" button to " +#~ "automatically load or unload filiament." +#~ msgstr "" +#~ "Wybierz Slot AMS, a następnie naciśnij przycisk \"Ładuj\" lub \"Wyładuj" +#~ "\" ,aby automatycznie załadować lub wyładować filament." + +#~ msgid "MC" +#~ msgstr "MC (Płytka główna)" + +#~ msgid "MainBoard" +#~ msgstr "MainBoard (Płyta główna)" + +#~ msgid "TH" +#~ msgstr "TH" + +#~ msgid "XCam" +#~ msgstr "XCam" + +#~ msgid "HMS" +#~ msgstr "Stan drukarki (HMS)" + +#~ msgid "" +#~ "Importing to Orca Slicer failed. Please download the file and manually " +#~ "import it." +#~ msgstr "" +#~ "Import do Orca Slicer nie powiódł się. Pobierz plik i zaimportuj go " +#~ "ręcznie." + +#~ msgid "- ℃" +#~ msgstr "- ℃" + +#~ msgid "0.5" +#~ msgstr "0.5" + +#~ msgid "0.005" +#~ msgstr "0.005" + +#~ msgid "New Flow Dynamics Calibration" +#~ msgstr "Nowa Kalibracji Dynamiki Przepływu" + #~ msgid "If you would like to try Bambu Studio Beta, you may click to" #~ msgstr "Jeśli chciałbyś wypróbować OrcaSlicer Beta, możesz kliknąć tutaj." @@ -16992,8 +17304,8 @@ msgstr "" #~ "Elevation is too low for object. Use the \"Pad around object\" feature to " #~ "print the object without elevation." #~ msgstr "" -#~ "Podniesienie zbyt małe dla modelu. Użyj funkcji \"Podkładka wokół " -#~ "modelu\", aby wydrukować model bez podniesienia." +#~ "Podniesienie zbyt małe dla modelu. Użyj funkcji \"Podkładka wokół modelu" +#~ "\", aby wydrukować model bez podniesienia." #~ msgid "" #~ "The endings of the support pillars will be deployed on the gap between " @@ -17314,10 +17626,6 @@ msgstr "" #~ msgid "Connection to the printer failed" #~ msgstr "Nie udało się połączyć z drukarką" -#~ msgid "A problem occurred during calibration. Click to view the solution." -#~ msgstr "" -#~ "Wystąpił problem podczas kalibracji. Kliknij, aby zobaczyć rozwiązanie." - #~ msgid "" #~ "All the selected objects are on the locked plate,\n" #~ "We cannot do auto-arrange on these objects." diff --git a/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po b/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po index df6ba6fd86..71a7e201de 100644 --- a/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po +++ b/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: OrcaSlicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-10 22:59+0800\n" +"POT-Creation-Date: 2024-04-28 18:11+0800\n" "PO-Revision-Date: 2024-04-16 11:17-0300\n" "Last-Translator: \n" "Language-Team: Portuguese, Brazilian\n" @@ -115,8 +115,13 @@ msgid "Lay on face" msgstr "Ajustar face à superfície" #, boost-format -msgid "Filament count exceeds the maximum number that painting tool supports. only the first %1% filaments will be available in painting tool." -msgstr "A contagem de filamentos excede o número máximo que a ferramenta de pintura suporta. Apenas os primeiros %1% filamentos estarão disponíveis na ferramenta de pintura." +msgid "" +"Filament count exceeds the maximum number that painting tool supports. only " +"the first %1% filaments will be available in painting tool." +msgstr "" +"A contagem de filamentos excede o número máximo que a ferramenta de pintura " +"suporta. Apenas os primeiros %1% filamentos estarão disponíveis na " +"ferramenta de pintura." msgid "Color Painting" msgstr "Pintura de cores" @@ -528,7 +533,9 @@ msgid "Cut by Plane" msgstr "Cortar por Plano" msgid "non-manifold edges be caused by cut tool, do you want to fix it now?" -msgstr "as arestas abertas podem ser causadas pela ferramenta de corte, você quer corrigi-las agora?" +msgstr "" +"as arestas abertas podem ser causadas pela ferramenta de corte, você quer " +"corrigi-las agora?" msgid "Repairing model object" msgstr "Reparando objeto do modelo" @@ -549,8 +556,12 @@ msgid "Decimate ratio" msgstr "Taxa de decimação" #, boost-format -msgid "Processing model '%1%' with more than 1M triangles could be slow. It is highly recommended to simplify the model." -msgstr "Processar modelo '%1%' com mais de 1M de triângulos pode ser lento. É altamente recomendável simplificar o modelo." +msgid "" +"Processing model '%1%' with more than 1M triangles could be slow. It is " +"highly recommended to simplify the model." +msgstr "" +"Processar modelo '%1%' com mais de 1M de triângulos pode ser lento. É " +"altamente recomendável simplificar o modelo." msgid "Simplify model" msgstr "Simplificar modelo" @@ -559,7 +570,8 @@ msgid "Simplify" msgstr "Simplificar" msgid "Simplification is currently only allowed when a single part is selected" -msgstr "A simplificação só é permitida quando uma única peça é selecionada no momento" +msgstr "" +"A simplificação só é permitida quando uma única peça é selecionada no momento" msgid "Error" msgstr "Erro" @@ -591,7 +603,8 @@ msgid "%1%" msgstr "%1%" msgid "Can't apply when proccess preview." -msgstr "Não é possível aplicar quando a visualização do processo está em andamento." +msgstr "" +"Não é possível aplicar quando a visualização do processo está em andamento." msgid "Operation already cancelling. Please wait few seconds." msgstr "Operação já sendo cancelada. Por favor, aguarde alguns segundos." @@ -718,14 +731,20 @@ msgstr "Fonte padrão" msgid "Advanced" msgstr "Avançado" -msgid "The text cannot be written using the selected font. Please try choosing a different font." -msgstr "O texto não pode ser escrito usando a fonte selecionada. Por favor, tente escolher uma fonte diferente." +msgid "" +"The text cannot be written using the selected font. Please try choosing a " +"different font." +msgstr "" +"O texto não pode ser escrito usando a fonte selecionada. Por favor, tente " +"escolher uma fonte diferente." msgid "Embossed text cannot contain only white spaces." msgstr "Texto em relevo não pode conter apenas espaços em branco." msgid "Text contains character glyph (represented by '?') unknown by font." -msgstr "O texto contém um glifo de caractere (representado por '?') desconhecido pela fonte." +msgstr "" +"O texto contém um glifo de caractere (representado por '?') desconhecido " +"pela fonte." msgid "Text input doesn't show font skew." msgstr "A entrada de texto não mostra a inclinação da fonte." @@ -979,10 +998,12 @@ msgid "Rotate text Clock-wise." msgstr "Girar o texto no sentido horário." msgid "Unlock the text's rotation when moving text along the object's surface." -msgstr "Desbloquear a rotação do texto ao movê-lo ao longo da superfície do objeto." +msgstr "" +"Desbloquear a rotação do texto ao movê-lo ao longo da superfície do objeto." msgid "Lock the text's rotation when moving text along the object's surface." -msgstr "Bloquear a rotação do texto ao movê-lo ao longo da superfície do objeto." +msgstr "" +"Bloquear a rotação do texto ao movê-lo ao longo da superfície do objeto." msgid "Select from True Type Collection." msgstr "Selecionar da Coleção True Type." @@ -994,8 +1015,13 @@ msgid "Orient the text towards the camera." msgstr "Orientar o texto em direção à câmera." #, boost-format -msgid "Can't load exactly same font(\"%1%\"). Aplication selected a similar one(\"%2%\"). You have to specify font for enable edit text." -msgstr "Não é possível carregar a mesma fonte exatamente (\"%1%\"). A aplicação selecionou uma similar (\"%2%\"). Você deve especificar uma fonte para habilitar a edição de texto." +msgid "" +"Can't load exactly same font(\"%1%\"). Aplication selected a similar " +"one(\"%2%\"). You have to specify font for enable edit text." +msgstr "" +"Não é possível carregar a mesma fonte exatamente (\"%1%\"). A aplicação " +"selecionou uma similar (\"%2%\"). Você deve especificar uma fonte para " +"habilitar a edição de texto." msgid "No symbol" msgstr "Sem símbolo" @@ -1110,8 +1136,12 @@ msgstr "Tipo de traço indefinido" msgid "Path can't be healed from selfintersection and multiple points." msgstr "O caminho não pode ser reparado de auto-interseção e pontos múltiplos." -msgid "Final shape constains selfintersection or multiple points with same coordinate." -msgstr "A forma final contém auto-interseção ou múltiplos pontos com mesma coordenada." +msgid "" +"Final shape constains selfintersection or multiple points with same " +"coordinate." +msgstr "" +"A forma final contém auto-interseção ou múltiplos pontos com mesma " +"coordenada." #, boost-format msgid "Shape is marked as invisible (%1%)." @@ -1232,7 +1262,8 @@ msgstr "O arquivo NÃO existe (%1%)." #, boost-format msgid "Filename has to end with \".svg\" but you selected %1%" -msgstr "O nome do arquivo precisa terminar com \".svg\", mas você selecionou %1%" +msgstr "" +"O nome do arquivo precisa terminar com \".svg\", mas você selecionou %1%" #, boost-format msgid "Nano SVG parser can't load from file (%1%)." @@ -1338,7 +1369,9 @@ msgid "%1% was replaced with %2%" msgstr "%1% foi substituído por %2%" msgid "The configuration may be generated by a newer version of OrcaSlicer." -msgstr "A configuração pode ter sido gerada por uma versão mais recente do OrcaSlicer." +msgstr "" +"A configuração pode ter sido gerada por uma versão mais recente do " +"OrcaSlicer." msgid "Some values have been replaced. Please check them:" msgstr "Alguns valores foram substituídos. Por favor, verifique-os:" @@ -1353,23 +1386,36 @@ msgid "Machine" msgstr "Máquina" msgid "Configuration package was loaded, but some values were not recognized." -msgstr "O pacote de configuração foi carregado, mas alguns valores não foram reconhecidos." +msgstr "" +"O pacote de configuração foi carregado, mas alguns valores não foram " +"reconhecidos." #, boost-format -msgid "Configuration file \"%1%\" was loaded, but some values were not recognized." -msgstr "O arquivo de configuração \"%1%\" foi carregado, mas alguns valores não foram reconhecidos." +msgid "" +"Configuration file \"%1%\" was loaded, but some values were not recognized." +msgstr "" +"O arquivo de configuração \"%1%\" foi carregado, mas alguns valores não " +"foram reconhecidos." msgid "V" msgstr "V" -msgid "OrcaSlicer will terminate because of running out of memory.It may be a bug. It will be appreciated if you report the issue to our team." -msgstr "OrcaSlicer será encerrado devido à falta de memória. Pode ser um bug. Agradecemos se você relatar o problema para nossa equipe." +msgid "" +"OrcaSlicer will terminate because of running out of memory.It may be a bug. " +"It will be appreciated if you report the issue to our team." +msgstr "" +"OrcaSlicer será encerrado devido à falta de memória. Pode ser um bug. " +"Agradecemos se você relatar o problema para nossa equipe." msgid "Fatal error" msgstr "Erro fatal" -msgid "OrcaSlicer will terminate because of a localization error. It will be appreciated if you report the specific scenario this issue happened." -msgstr "OrcaSlicer será encerrado devido a um erro de localização. Agradecemos se você relatar o cenário específico em que esse problema ocorreu." +msgid "" +"OrcaSlicer will terminate because of a localization error. It will be " +"appreciated if you report the specific scenario this issue happened." +msgstr "" +"OrcaSlicer será encerrado devido a um erro de localização. Agradecemos se " +"você relatar o cenário específico em que esse problema ocorreu." msgid "Critical error" msgstr "Erro crítico" @@ -1395,10 +1441,12 @@ msgid "Connect %s failed! [SN:%s, code=%s]" msgstr "Falha na conexão %s! [SN:%s, código=%s]" msgid "" -"Orca Slicer requires the Microsoft WebView2 Runtime to operate certain features.\n" +"Orca Slicer requires the Microsoft WebView2 Runtime to operate certain " +"features.\n" "Click Yes to install it now." msgstr "" -"Orca Slicer requer o tempo de execução Microsoft WebView2 para operar determinados recursos.\n" +"Orca Slicer requer o tempo de execução Microsoft WebView2 para operar " +"determinados recursos.\n" "Clique em Sim para instalá-lo agora." msgid "WebView2 Runtime" @@ -1434,11 +1482,14 @@ msgstr "Informações" msgid "" "The OrcaSlicer configuration file may be corrupted and cannot be parsed.\n" "OrcaSlicer has attempted to recreate the configuration file.\n" -"Please note, application settings will be lost, but printer profiles will not be affected." +"Please note, application settings will be lost, but printer profiles will " +"not be affected." msgstr "" -"O arquivo de configuração do OrcaSlicer pode estar corrompido e não pode ser analisado.\n" +"O arquivo de configuração do OrcaSlicer pode estar corrompido e não pode ser " +"analisado.\n" "O OrcaSlicer tentou recriar o arquivo de configuração.\n" -"Por favor, note que as configurações do aplicativo serão perdidas, mas os perfis de impressora não serão afetados." +"Por favor, note que as configurações do aplicativo serão perdidas, mas os " +"perfis de impressora não serão afetados." msgid "Rebuild" msgstr "Reconstruindo" @@ -1464,26 +1515,40 @@ msgstr "Escolha um arquivo (gcode/3mf):" msgid "Some presets are modified." msgstr "Alguns presets foram modificados." -msgid "You can keep the modifield presets to the new project, discard or save changes as new presets." -msgstr "Você pode manter os modelos modificados no novo projeto, descartar ou salvar as alterações como novos modelos." +msgid "" +"You can keep the modifield presets to the new project, discard or save " +"changes as new presets." +msgstr "" +"Você pode manter os modelos modificados no novo projeto, descartar ou salvar " +"as alterações como novos modelos." msgid "User logged out" msgstr "Usuário desconectado" msgid "new or open project file is not allowed during the slicing process!" -msgstr "criar ou abrir um arquivo de projeto novo não é permitido durante o processo de fatiamento!" +msgstr "" +"criar ou abrir um arquivo de projeto novo não é permitido durante o processo " +"de fatiamento!" msgid "Open Project" msgstr "Abrir Projeto" -msgid "The version of Orca Slicer is too low and needs to be updated to the latest version before it can be used normally" -msgstr "A versão do Orca Slicer é muito antiga e precisa ser atualizada para a versão mais recente antes de poder ser usada normalmente" +msgid "" +"The version of Orca Slicer is too low and needs to be updated to the latest " +"version before it can be used normally" +msgstr "" +"A versão do Orca Slicer é muito antiga e precisa ser atualizada para a " +"versão mais recente antes de poder ser usada normalmente" msgid "Privacy Policy Update" msgstr "Atualização da Política de Privacidade" -msgid "The number of user presets cached in the cloud has exceeded the upper limit, newly created user presets can only be used locally." -msgstr "O número de presets de usuário em cache na nuvem excedeu o limite superior, os presets de usuário recém-criados só podem ser usados localmente." +msgid "" +"The number of user presets cached in the cloud has exceeded the upper limit, " +"newly created user presets can only be used locally." +msgstr "" +"O número de presets de usuário em cache na nuvem excedeu o limite superior, " +"os presets de usuário recém-criados só podem ser usados localmente." msgid "Sync user presets" msgstr "Sincronizar presets do usuário" @@ -1673,12 +1738,17 @@ msgid "Orca String Hell" msgstr "Orca String Hell" msgid "" -"This model features text embossment on the top surface. For optimal results, it is advisable to set the 'One Wall Threshold(min_width_top_surface)' to 0 for the 'Only One Wall on Top Surfaces' to work best.\n" +"This model features text embossment on the top surface. For optimal results, " +"it is advisable to set the 'One Wall Threshold(min_width_top_surface)' to 0 " +"for the 'Only One Wall on Top Surfaces' to work best.\n" "Yes - Change these settings automatically\n" "No - Do not change these settings for me" msgstr "" -"Este modelo possui texto em alto relevo na superfície superior. Para obter os melhores resultados, é aconselhável definir o 'Limiar de perímetro único'\n" -" (min_width_top_surface)' como 0 para que 'Apenas uma Parede nas Superfícies Superiores' funcione melhor.\n" +"Este modelo possui texto em alto relevo na superfície superior. Para obter " +"os melhores resultados, é aconselhável definir o 'Limiar de perímetro " +"único'\n" +" (min_width_top_surface)' como 0 para que 'Apenas uma Parede nas Superfícies " +"Superiores' funcione melhor.\n" "Sim - Alterar essas configurações automaticamente\n" "Não - Não alterar essas configurações para mim" @@ -1861,7 +1931,8 @@ msgid "Auto orientation" msgstr "Orientação Automática" msgid "Auto orient the object to improve print quality." -msgstr "Orientar automaticamente o objeto para melhorar a qualidade de impressão." +msgstr "" +"Orientar automaticamente o objeto para melhorar a qualidade de impressão." msgid "Split the selected object into mutiple objects" msgstr "Dividir o objeto selecionado em vários objetos" @@ -1960,13 +2031,16 @@ msgid "Right click the icon to fix model object" msgstr "Clique com o botão direito no ícone para corrigir o objeto do modelo" msgid "Right button click the icon to drop the object settings" -msgstr "Clique com o botão direito no ícone para descartar as configurações do objeto" +msgstr "" +"Clique com o botão direito no ícone para descartar as configurações do objeto" msgid "Click the icon to reset all settings of the object" msgstr "Clique no ícone para redefinir todas as configurações do objeto" msgid "Right button click the icon to drop the object printable property" -msgstr "Clique com o botão direito no ícone para descartar a propriedade imprimível do objeto" +msgstr "" +"Clique com o botão direito no ícone para descartar a propriedade imprimível " +"do objeto" msgid "Click the icon to toggle printable property of the object" msgstr "Clique no ícone para alternar a propriedade imprimível do objeto" @@ -1998,8 +2072,12 @@ msgstr "Adicionar Modificador" msgid "Switch to per-object setting mode to edit modifier settings." msgstr "Mude para o modo de configuração por objeto para editar modificadores." -msgid "Switch to per-object setting mode to edit process settings of selected objects." -msgstr "Mude para o modo de configuração por objeto para editar processos dos objetos selecionados." +msgid "" +"Switch to per-object setting mode to edit process settings of selected " +"objects." +msgstr "" +"Mude para o modo de configuração por objeto para editar processos dos " +"objetos selecionados." msgid "Delete connector from object which is a part of cut" msgstr "Excluir conector do objeto que é parte do corte" @@ -2010,19 +2088,25 @@ msgstr "Excluir peça sólida do objeto que é peça do corte" msgid "Delete negative volume from object which is a part of cut" msgstr "Excluir volume negativo do objeto que é parte do corte" -msgid "To save cut correspondence you can delete all connectors from all related objects." -msgstr "Para salvar a correspondência de corte, você pode excluir todos os conectores de todos os objetos relacionados." +msgid "" +"To save cut correspondence you can delete all connectors from all related " +"objects." +msgstr "" +"Para salvar a correspondência de corte, você pode excluir todos os " +"conectores de todos os objetos relacionados." msgid "" "This action will break a cut correspondence.\n" "After that model consistency can't be guaranteed .\n" "\n" -"To manipulate with solid parts or negative volumes you have to invalidate cut infornation first." +"To manipulate with solid parts or negative volumes you have to invalidate " +"cut infornation first." msgstr "" "Esta ação irá quebrar a correspondência de corte.\n" "Depois disso, a consistência do modelo não pode ser garantida.\n" "\n" -"Para manipular peças sólidas ou volumes negativos, você deve invalidar as informações de corte primeiro." +"Para manipular peças sólidas ou volumes negativos, você deve invalidar as " +"informações de corte primeiro." msgid "Delete all connectors" msgstr "Excluir todos os conectores" @@ -2072,11 +2156,18 @@ msgstr "Camada" msgid "Selection conflicts" msgstr "Conflitos de seleção" -msgid "If first selected item is an object, the second one should also be object." -msgstr "Se o primeiro item selecionado for um objeto, o segundo também deve ser um objeto." +msgid "" +"If first selected item is an object, the second one should also be object." +msgstr "" +"Se o primeiro item selecionado for um objeto, o segundo também deve ser um " +"objeto." -msgid "If first selected item is a part, the second one should be part in the same object." -msgstr "Se o primeiro item selecionado for uma peça, o segundo deve ser uma peça no mesmo objeto." +msgid "" +"If first selected item is a part, the second one should be part in the same " +"object." +msgstr "" +"Se o primeiro item selecionado for uma peça, o segundo deve ser uma peça no " +"mesmo objeto." msgid "The type of the last solid object part is not to be changed." msgstr "O tipo da última peça do objeto sólido não deve ser alterado." @@ -2134,7 +2225,8 @@ msgid "Invalid numeric." msgstr "Número inválido." msgid "one cell can only be copied to one or multiple cells in the same column" -msgstr "uma célula só pode ser copiada para uma ou várias células na mesma coluna" +msgstr "" +"uma célula só pode ser copiada para uma ou várias células na mesma coluna" msgid "multiple cells copy is not supported" msgstr "a cópia de múltiplas células não é suportada" @@ -2293,7 +2385,8 @@ msgid "Failed to connect to cloud service" msgstr "Falha ao conectar ao serviço de nuvem" msgid "Please click on the hyperlink above to view the cloud service status" -msgstr "Por favor, clique no link acima para visualizar o status do serviço de nuvem" +msgstr "" +"Por favor, clique no link acima para visualizar o status do serviço de nuvem" msgid "Failed to connect to the printer" msgstr "Falha ao conectar à impressora" @@ -2325,11 +2418,11 @@ msgstr "Recarga Automática" msgid "AMS not connected" msgstr "AMS não conectado" -msgid "Load Filament" -msgstr "Carregar Filamento" +msgid "Load" +msgstr "" -msgid "Unload Filament" -msgstr "Descarregar Filamento" +msgid "Unload" +msgstr "Descarregar" msgid "Ext Spool" msgstr "Bobina Externa" @@ -2346,7 +2439,7 @@ msgstr "Tentar Novamente" msgid "Calibrating AMS..." msgstr "Calibrando AMS..." -msgid "A problem occured during calibration. Click to view the solution." +msgid "A problem occurred during calibration. Click to view the solution." msgstr "Ocorreu um problema durante a calibração. Clique para ver a solução." msgid "Calibrate again" @@ -2385,8 +2478,12 @@ msgstr "Verificar localização do filamento" msgid "Grab new filament" msgstr "Pegar novo filamento" -msgid "Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically load or unload filiament." -msgstr "Escolha um slot AMS e pressione o botão \"Carregar\" ou \"Descarregar\" para carregar ou descarregar automaticamente o filamento." +msgid "" +"Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically " +"load or unload filaments." +msgstr "" +"Escolha um slot AMS e pressione o botão \"Carregar\" ou \"Descarregar\" para " +"carregar ou descarregar automaticamente o filamento." msgid "Edit" msgstr "Editar" @@ -2417,21 +2514,29 @@ msgstr "Organizando" msgid "Arranging canceled." msgstr "Organização cancelada." -msgid "Arranging is done but there are unpacked items. Reduce spacing and try again." -msgstr "A organização foi concluída, mas há itens desembalados. Reduza o espaçamento e tente novamente." +msgid "" +"Arranging is done but there are unpacked items. Reduce spacing and try again." +msgstr "" +"A organização foi concluída, mas há itens desembalados. Reduza o espaçamento " +"e tente novamente." msgid "Arranging done." msgstr "Organização concluída." -msgid "Arrange failed. Found some exceptions when processing object geometries." -msgstr "Organização falhou. Encontrou algumas exceções ao processar geometrias de objetos." +msgid "" +"Arrange failed. Found some exceptions when processing object geometries." +msgstr "" +"Organização falhou. Encontrou algumas exceções ao processar geometrias de " +"objetos." #, c-format, boost-format msgid "" -"Arrangement ignored the following objects which can't fit into a single bed:\n" +"Arrangement ignored the following objects which can't fit into a single " +"bed:\n" "%s" msgstr "" -"A organização ignorou os seguintes objetos que não podem caber em uma única mesa:\n" +"A organização ignorou os seguintes objetos que não podem caber em uma única " +"mesa:\n" "%s" msgid "" @@ -2491,7 +2596,9 @@ msgid "Task canceled." msgstr "Tarefa cancelada." msgid "Upload task timed out. Please check the network status and try again." -msgstr "O tempo para envio da tarefa expirou. Verifique o estado da rede e tente novamente." +msgstr "" +"O tempo para envio da tarefa expirou. Verifique o estado da rede e tente " +"novamente." msgid "Cloud service connection failed. Please try again." msgstr "Falha na conexão com o serviço de nuvem. Por favor, tente novamente." @@ -2499,8 +2606,12 @@ msgstr "Falha na conexão com o serviço de nuvem. Por favor, tente novamente." msgid "Print file not found. please slice again." msgstr "Arquivo de impressão não encontrado. Por favor, fatie novamente." -msgid "The print file exceeds the maximum allowable size (1GB). Please simplify the model and slice again." -msgstr "O arquivo de impressão excede o tamanho máximo permitido (1GB). Por favor, simplifique o modelo e fatie novamente." +msgid "" +"The print file exceeds the maximum allowable size (1GB). Please simplify the " +"model and slice again." +msgstr "" +"O arquivo de impressão excede o tamanho máximo permitido (1GB). Por favor, " +"simplifique o modelo e fatie novamente." msgid "Failed to send the print job. Please try again." msgstr "Falha ao enviar o trabalho de impressão. Por favor, tente novamente." @@ -2508,17 +2619,28 @@ msgstr "Falha ao enviar o trabalho de impressão. Por favor, tente novamente." msgid "Failed to upload file to ftp. Please try again." msgstr "Falha ao enviar o arquivo via FTP. Por favor, tente novamente." -msgid "Check the current status of the bambu server by clicking on the link above." +msgid "" +"Check the current status of the bambu server by clicking on the link above." msgstr "Verifique o estado atual do servidor Bambu clicando no link acima." -msgid "The size of the print file is too large. Please adjust the file size and try again." -msgstr "O tamanho do arquivo de impressão é muito grande. Por favor, ajuste o tamanho do arquivo e tente novamente." +msgid "" +"The size of the print file is too large. Please adjust the file size and try " +"again." +msgstr "" +"O tamanho do arquivo de impressão é muito grande. Por favor, ajuste o " +"tamanho do arquivo e tente novamente." msgid "Print file not found, Please slice it again and send it for printing." -msgstr "Arquivo de impressão não encontrado. Por favor, fatie-o novamente e envie para impressão." +msgstr "" +"Arquivo de impressão não encontrado. Por favor, fatie-o novamente e envie " +"para impressão." -msgid "Failed to upload print file to FTP. Please check the network status and try again." -msgstr "Falha ao enviar o arquivo de impressão via FTP. Por favor, verifique o estado da rede e tente novamente." +msgid "" +"Failed to upload print file to FTP. Please check the network status and try " +"again." +msgstr "" +"Falha ao enviar o arquivo de impressão via FTP. Por favor, verifique o " +"estado da rede e tente novamente." msgid "Sending print job over LAN" msgstr "Enviando trabalho de impressão via LAN" @@ -2540,11 +2662,14 @@ msgstr "Enviando configuração de impressão" #, c-format, boost-format msgid "Successfully sent. Will automatically jump to the device page in %ss" -msgstr "Enviado com sucesso. Irá saltar automaticamente para a página do dispositivo em %ss" +msgstr "" +"Enviado com sucesso. Irá saltar automaticamente para a página do dispositivo " +"em %ss" #, c-format, boost-format msgid "Successfully sent. Will automatically jump to the next page in %ss" -msgstr "Enviado com sucesso. Irá saltar automaticamente para a próxima página em %ss" +msgstr "" +"Enviado com sucesso. Irá saltar automaticamente para a próxima página em %ss" msgid "An SD card needs to be inserted before printing via LAN." msgstr "Um cartão SD precisa ser inserido antes de imprimir via LAN." @@ -2565,8 +2690,12 @@ msgstr "Um cartão SD precisa ser inserido antes de enviar para a impressora." msgid "Importing SLA archive" msgstr "Importando arquivo SLA" -msgid "The SLA archive doesn't contain any presets. Please activate some SLA printer preset first before importing that SLA archive." -msgstr "O arquivo SLA não contém nenhum perfil. Por favor, ative alguns perfis de impressora SLA antes de importar esse arquivo SLA." +msgid "" +"The SLA archive doesn't contain any presets. Please activate some SLA " +"printer preset first before importing that SLA archive." +msgstr "" +"O arquivo SLA não contém nenhum perfil. Por favor, ative alguns perfis de " +"impressora SLA antes de importar esse arquivo SLA." msgid "Importing canceled." msgstr "Importação cancelada." @@ -2574,14 +2703,21 @@ msgstr "Importação cancelada." msgid "Importing done." msgstr "Importação concluída." -msgid "The imported SLA archive did not contain any presets. The current SLA presets were used as fallback." -msgstr "O arquivo SLA importado não contém nenhum perfil. Os perfis SLA atuais foram usados como alternativa." +msgid "" +"The imported SLA archive did not contain any presets. The current SLA " +"presets were used as fallback." +msgstr "" +"O arquivo SLA importado não contém nenhum perfil. Os perfis SLA atuais foram " +"usados como alternativa." msgid "You cannot load SLA project with a multi-part object on the bed" -msgstr "Você não pode carregar um projeto SLA com um objeto de várias peças na mesa" +msgstr "" +"Você não pode carregar um projeto SLA com um objeto de várias peças na mesa" msgid "Please check your object list before preset changing." -msgstr "Por favor, verifique sua lista de objetos antes de mudar a configuração predefinida." +msgstr "" +"Por favor, verifique sua lista de objetos antes de mudar a configuração " +"predefinida." msgid "Attention!" msgstr "Atenção!" @@ -2619,14 +2755,24 @@ msgstr "O Orca Slicer é licenciado sob " msgid "GNU Affero General Public License, version 3" msgstr "Licença Pública Geral Affero GNU, versão 3" -msgid "Orca Slicer is based on BambuStudio by Bambulab, which is from PrusaSlicer by Prusa Research. PrusaSlicer is from Slic3r by Alessandro Ranellucci and the RepRap community" -msgstr "O Orca Slicer é baseado no BambuStudio da Bambulab, que é derivado do PrusaSlicer da Prusa Research. O PrusaSlicer vem do Slic3r de Alessandro Ranellucci e da comunidade RepRap" +msgid "" +"Orca Slicer is based on BambuStudio by Bambulab, which is from PrusaSlicer " +"by Prusa Research. PrusaSlicer is from Slic3r by Alessandro Ranellucci and " +"the RepRap community" +msgstr "" +"O Orca Slicer é baseado no BambuStudio da Bambulab, que é derivado do " +"PrusaSlicer da Prusa Research. O PrusaSlicer vem do Slic3r de Alessandro " +"Ranellucci e da comunidade RepRap" msgid "Libraries" msgstr "Bibliotecas" -msgid "This software uses open source components whose copyright and other proprietary rights belong to their respective owners" -msgstr "Este software utiliza componentes open source cujos direitos autorais e outros direitos de propriedade pertencem aos seus respectivos proprietários" +msgid "" +"This software uses open source components whose copyright and other " +"proprietary rights belong to their respective owners" +msgstr "" +"Este software utiliza componentes open source cujos direitos autorais e " +"outros direitos de propriedade pertencem aos seus respectivos proprietários" #, c-format, boost-format msgid "About %s" @@ -2642,10 +2788,15 @@ msgid "BambuStudio is originally based on PrusaSlicer by PrusaResearch." msgstr "BambuStudio é originalmente baseado no PrusaSlicer pela PrusaResearch." msgid "PrusaSlicer is originally based on Slic3r by Alessandro Ranellucci." -msgstr "PrusaSlicer é originalmente baseado no Slic3r por Alessandro Ranellucci." +msgstr "" +"PrusaSlicer é originalmente baseado no Slic3r por Alessandro Ranellucci." -msgid "Slic3r was created by Alessandro Ranellucci with the help of many other contributors." -msgstr "Slic3r foi criado por Alessandro Ranellucci com a ajuda de muitos outros colaboradores." +msgid "" +"Slic3r was created by Alessandro Ranellucci with the help of many other " +"contributors." +msgstr "" +"Slic3r foi criado por Alessandro Ranellucci com a ajuda de muitos outros " +"colaboradores." msgid "Version" msgstr "Versão" @@ -2683,7 +2834,9 @@ msgid "SN" msgstr "SN" msgid "Setting AMS slot information while printing is not supported" -msgstr "A configuração das informações do slot AMS durante a impressão não é suportada" +msgstr "" +"A configuração das informações do slot AMS durante a impressão não é " +"suportada" msgid "Factors of Flow Dynamics Calibration" msgstr "Fatores de Calibração de Dinâmica de Fluxo" @@ -2698,7 +2851,9 @@ msgid "Factor N" msgstr "Fator N" msgid "Setting Virtual slot information while printing is not supported" -msgstr "A configuração de informações do slot virtual durante a impressão não é suportada" +msgstr "" +"A configuração de informações do slot virtual durante a impressão não é " +"suportada" msgid "Are you sure you want to clear the filament information?" msgstr "Tem certeza de que deseja limpar as informações do filamento?" @@ -2721,8 +2876,14 @@ msgstr "Cor Personalizada" msgid "Dynamic flow calibration" msgstr "Calibração dinâmica do fluxo" -msgid "The nozzle temp and max volumetric speed will affect the calibration results. Please fill in the same values as the actual printing. They can be auto-filled by selecting a filament preset." -msgstr "A temperatura do bico e a fluxo volumétrico máximo afetarão os resultados da calibração. Preencha os mesmos valores que a impressão atual. Eles podem ser preenchidos automaticamente selecionando um perfil de filamento." +msgid "" +"The nozzle temp and max volumetric speed will affect the calibration " +"results. Please fill in the same values as the actual printing. They can be " +"auto-filled by selecting a filament preset." +msgstr "" +"A temperatura do bico e a fluxo volumétrico máximo afetarão os resultados da " +"calibração. Preencha os mesmos valores que a impressão atual. Eles podem ser " +"preenchidos automaticamente selecionando um perfil de filamento." msgid "Nozzle Diameter" msgstr "Diâmetro do bico" @@ -2754,8 +2915,14 @@ msgstr "Iniciar calibração" msgid "Next" msgstr "Próximo" -msgid "Calibration completed. Please find the most uniform extrusion line on your hot bed like the picture below, and fill the value on its left side into the factor K input box." -msgstr "Calibração concluída. Por favor, encontre a linha de extrusão mais uniforme na sua mesa aquecida como na imagem abaixo, e preencha o valor do seu lado esquerdo na caixa de entrada do fator K." +msgid "" +"Calibration completed. Please find the most uniform extrusion line on your " +"hot bed like the picture below, and fill the value on its left side into the " +"factor K input box." +msgstr "" +"Calibração concluída. Por favor, encontre a linha de extrusão mais uniforme " +"na sua mesa aquecida como na imagem abaixo, e preencha o valor do seu lado " +"esquerdo na caixa de entrada do fator K." msgid "Save" msgstr "Salvar" @@ -2786,8 +2953,11 @@ msgstr "Passo" msgid "AMS Slots" msgstr "Espaços do AMS" -msgid "Note: Only the AMS slots loaded with the same material type can be selected." -msgstr "Nota: Apenas os espaços do AMS carregados com o mesmo tipo de material podem ser selecionadas." +msgid "" +"Note: Only the AMS slots loaded with the same material type can be selected." +msgstr "" +"Nota: Apenas os espaços do AMS carregados com o mesmo tipo de material podem " +"ser selecionadas." msgid "Enable AMS" msgstr "Ativar AMS" @@ -2804,11 +2974,22 @@ msgstr "Imprimir com o filamento montado na parte de trás do chassi" msgid "Current Cabin humidity" msgstr "Umidade da cabine atual" -msgid "Please change the desiccant when it is too wet. The indicator may not represent accurately in following cases : when the lid is open or the desiccant pack is changed. it take hours to absorb the moisture, low temperatures also slow down the process." -msgstr "Por favor, mude o dessecante quando estiver muito úmido. O indicador pode não representar com precisão nos casos a seguir: quando a tampa está aberta ou quando o dessecante é trocado. Leva horas para absorver a umidade, baixas temperaturas também atrasam o processo." +msgid "" +"Please change the desiccant when it is too wet. The indicator may not " +"represent accurately in following cases : when the lid is open or the " +"desiccant pack is changed. it take hours to absorb the moisture, low " +"temperatures also slow down the process." +msgstr "" +"Por favor, mude o dessecante quando estiver muito úmido. O indicador pode " +"não representar com precisão nos casos a seguir: quando a tampa está aberta " +"ou quando o dessecante é trocado. Leva horas para absorver a umidade, baixas " +"temperaturas também atrasam o processo." -msgid "Config which AMS slot should be used for a filament used in the print job" -msgstr "Configure qual espaço do AMS deve ser usado para um filamento usado no trabalho de impressão" +msgid "" +"Config which AMS slot should be used for a filament used in the print job" +msgstr "" +"Configure qual espaço do AMS deve ser usado para um filamento usado no " +"trabalho de impressão" msgid "Filament used in this print job" msgstr "Filamento usado neste trabalho de impressão" @@ -2831,8 +3012,12 @@ msgstr "Imprimir com filamentos no AMS" msgid "Print with filaments mounted on the back of the chassis" msgstr "Imprimir com filamentos montados na parte de trás do chassi" -msgid "When the current material run out, the printer will continue to print in the following order." -msgstr "Quando o material atual acabar, a impressora continuará a imprimir na seguinte ordem." +msgid "" +"When the current material run out, the printer will continue to print in the " +"following order." +msgstr "" +"Quando o material atual acabar, a impressora continuará a imprimir na " +"seguinte ordem." msgid "Group" msgstr "Grupo" @@ -2840,15 +3025,22 @@ msgstr "Grupo" msgid "The printer does not currently support auto refill." msgstr "A impressora atualmente não suporta recarga automática." -msgid "AMS filament backup is not enabled, please enable it in the AMS settings." -msgstr "O backup de filamento do AMS não está ativado, por favor, ative-o nas configurações do AMS." +msgid "" +"AMS filament backup is not enabled, please enable it in the AMS settings." +msgstr "" +"O backup de filamento do AMS não está ativado, por favor, ative-o nas " +"configurações do AMS." msgid "" -"If there are two identical filaments in AMS, AMS filament backup will be enabled. \n" -"(Currently supporting automatic supply of consumables with the same brand, material type, and color)" +"If there are two identical filaments in AMS, AMS filament backup will be " +"enabled. \n" +"(Currently supporting automatic supply of consumables with the same brand, " +"material type, and color)" msgstr "" -"Se houver dois filamentos idênticos no AMS, o backup de filamento do AMS será ativado. \n" -"(Atualmente suportando o fornecimento automático de consumíveis da mesma marca, tipo de material e cor)" +"Se houver dois filamentos idênticos no AMS, o backup de filamento do AMS " +"será ativado. \n" +"(Atualmente suportando o fornecimento automático de consumíveis da mesma " +"marca, tipo de material e cor)" msgid "DRY" msgstr "SECO" @@ -2862,35 +3054,77 @@ msgstr "Configurações do AMS" msgid "Insertion update" msgstr "Atualização de inserção" -msgid "The AMS will automatically read the filament information when inserting a new Bambu Lab filament. This takes about 20 seconds." -msgstr "O AMS irá ler automaticamente as informações do filamento ao inserir um novo filamento da Bambu Lab. Isso leva cerca de 20 segundos." +msgid "" +"The AMS will automatically read the filament information when inserting a " +"new Bambu Lab filament. This takes about 20 seconds." +msgstr "" +"O AMS irá ler automaticamente as informações do filamento ao inserir um novo " +"filamento da Bambu Lab. Isso leva cerca de 20 segundos." -msgid "Note: if a new filament is inserted during printing, the AMS will not automatically read any information until printing is completed." -msgstr "Nota: se um novo filamento for inserido durante a impressão, o AMS não irá ler automaticamente nenhuma informação até que a impressão seja concluída." +msgid "" +"Note: if a new filament is inserted during printing, the AMS will not " +"automatically read any information until printing is completed." +msgstr "" +"Nota: se um novo filamento for inserido durante a impressão, o AMS não irá " +"ler automaticamente nenhuma informação até que a impressão seja concluída." -msgid "When inserting a new filament, the AMS will not automatically read its information, leaving it blank for you to enter manually." -msgstr "Ao inserir um novo filamento, o AMS não irá ler automaticamente suas informações, deixando-o em branco para você inserir manualmente." +msgid "" +"When inserting a new filament, the AMS will not automatically read its " +"information, leaving it blank for you to enter manually." +msgstr "" +"Ao inserir um novo filamento, o AMS não irá ler automaticamente suas " +"informações, deixando-o em branco para você inserir manualmente." msgid "Power on update" msgstr "Atualização de inicialização" -msgid "The AMS will automatically read the information of inserted filament on start-up. It will take about 1 minute.The reading process will roll filament spools." -msgstr "O AMS irá ler automaticamente as informações do filamento inserido na inicialização. Levará cerca de 1 minuto. O processo de leitura irá girar as bobinas de filamento." +msgid "" +"The AMS will automatically read the information of inserted filament on " +"start-up. It will take about 1 minute.The reading process will roll filament " +"spools." +msgstr "" +"O AMS irá ler automaticamente as informações do filamento inserido na " +"inicialização. Levará cerca de 1 minuto. O processo de leitura irá girar as " +"bobinas de filamento." -msgid "The AMS will not automatically read information from inserted filament during startup and will continue to use the information recorded before the last shutdown." -msgstr "O AMS não irá ler automaticamente informações do filamento inserido durante a inicialização e continuará a usar as informações registradas antes do último desligamento." +msgid "" +"The AMS will not automatically read information from inserted filament " +"during startup and will continue to use the information recorded before the " +"last shutdown." +msgstr "" +"O AMS não irá ler automaticamente informações do filamento inserido durante " +"a inicialização e continuará a usar as informações registradas antes do " +"último desligamento." msgid "Update remaining capacity" msgstr "Atualizar capacidade restante" -msgid "The AMS will estimate Bambu filament's remaining capacity after the filament info is updated. During printing, remaining capacity will be updated automatically." -msgstr "O AMS irá estimar a capacidade restante do filamento Bambu após as informações do filamento serem atualizadas. Durante a impressão, a capacidade restante será atualizada automaticamente." +msgid "" +"The AMS will estimate Bambu filament's remaining capacity after the filament " +"info is updated. During printing, remaining capacity will be updated " +"automatically." +msgstr "" +"O AMS irá estimar a capacidade restante do filamento Bambu após as " +"informações do filamento serem atualizadas. Durante a impressão, a " +"capacidade restante será atualizada automaticamente." msgid "AMS filament backup" msgstr "Backup de filamento do AMS" -msgid "AMS will continue to another spool with the same properties of filament automatically when current filament runs out" -msgstr "O AMS continuará para outra bobina com as mesmas propriedades do filamento automaticamente quando o filamento atual acabar" +msgid "" +"AMS will continue to another spool with the same properties of filament " +"automatically when current filament runs out" +msgstr "" +"O AMS continuará para outra bobina com as mesmas propriedades do filamento " +"automaticamente quando o filamento atual acabar" + +msgid "Air Printing Detection" +msgstr "" + +msgid "" +"Detects clogging and filament grinding, halting printing immediately to " +"conserve time and filament." +msgstr "" msgid "File" msgstr "Arquivo" @@ -2898,11 +3132,19 @@ msgstr "Arquivo" msgid "Calibration" msgstr "Calibração" -msgid "Failed to download the plug-in. Please check your firewall settings and vpn software, check and retry." -msgstr "Falha ao baixar o plug-in. Verifique as configurações do seu firewall e software vpn, verifique e tente novamente." +msgid "" +"Failed to download the plug-in. Please check your firewall settings and vpn " +"software, check and retry." +msgstr "" +"Falha ao baixar o plug-in. Verifique as configurações do seu firewall e " +"software vpn, verifique e tente novamente." -msgid "Failed to install the plug-in. Please check whether it is blocked or deleted by anti-virus software." -msgstr "Falha ao instalar o plug-in. Verifique se ele está bloqueado ou excluído pelo software antivírus." +msgid "" +"Failed to install the plug-in. Please check whether it is blocked or deleted " +"by anti-virus software." +msgstr "" +"Falha ao instalar o plug-in. Verifique se ele está bloqueado ou excluído " +"pelo software antivírus." msgid "click here to see more info" msgstr "clique aqui para ver mais informações" @@ -2910,14 +3152,22 @@ msgstr "clique aqui para ver mais informações" msgid "Please home all axes (click " msgstr "Por favor, mandar a origem todos os eixos (clique " -msgid ") to locate the toolhead's position. This prevents device moving beyond the printable boundary and causing equipment wear." -msgstr ") para localizar a posição da extrusora. Isso impede que o dispositivo se mova além do limite imprimível e cause desgaste no equipamento." +msgid "" +") to locate the toolhead's position. This prevents device moving beyond the " +"printable boundary and causing equipment wear." +msgstr "" +") para localizar a posição da extrusora. Isso impede que o dispositivo se " +"mova além do limite imprimível e cause desgaste no equipamento." msgid "Go Home" msgstr "Ir para Ínicio" -msgid "A error occurred. Maybe memory of system is not enough or it's a bug of the program" -msgstr "Ocorreu um erro. Talvez a memória do sistema não seja suficiente ou seja um bug do programa" +msgid "" +"A error occurred. Maybe memory of system is not enough or it's a bug of the " +"program" +msgstr "" +"Ocorreu um erro. Talvez a memória do sistema não seja suficiente ou seja um " +"bug do programa" msgid "Please save project and restart the program. " msgstr "Por favor, salve o projeto e reinicie o programa. " @@ -2973,7 +3223,9 @@ msgstr "Cópia do G-Code temporário para o G-Code de saída falhou" #, boost-format msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" -msgstr "Agendando o envio para `%1%`. Veja Janela -> Fila de Envio do Anfitrião de Impressão" +msgstr "" +"Agendando o envio para `%1%`. Veja Janela -> Fila de Envio do Anfitrião de " +"Impressão" msgid "Origin" msgstr "Origem" @@ -2981,11 +3233,18 @@ msgstr "Origem" msgid "Size in X and Y of the rectangular plate." msgstr "Tamanho em X e Y da mesa retangular." -msgid "Distance of the 0,0 G-code coordinate from the front left corner of the rectangle." -msgstr "Distância da coordenada do G-Code 0,0 do canto frontal esquerdo do retângulo." +msgid "" +"Distance of the 0,0 G-code coordinate from the front left corner of the " +"rectangle." +msgstr "" +"Distância da coordenada do G-Code 0,0 do canto frontal esquerdo do retângulo." -msgid "Diameter of the print bed. It is assumed that origin (0,0) is located in the center." -msgstr "Diâmetro da mesa de impressão. É assumido que a origem (0,0) está localizada no centro." +msgid "" +"Diameter of the print bed. It is assumed that origin (0,0) is located in the " +"center." +msgstr "" +"Diâmetro da mesa de impressão. É assumido que a origem (0,0) está localizada " +"no centro." msgid "Rectangular" msgstr "Retangular" @@ -3023,8 +3282,10 @@ msgstr "Erro! Modelo inválido" msgid "The selected file contains no geometry." msgstr "O arquivo selecionado não contém geometria." -msgid "The selected file contains several disjoint areas. This is not supported." -msgstr "O arquivo selecionado contém várias áreas disjuntas. Isso não é suportado." +msgid "" +"The selected file contains several disjoint areas. This is not supported." +msgstr "" +"O arquivo selecionado contém várias áreas disjuntas. Isso não é suportado." msgid "Choose a file to import bed texture from (PNG/SVG):" msgstr "Escolha um arquivo para importar a textura da mesa (PNG/SVG):" @@ -3035,11 +3296,19 @@ msgstr "Escolha um arquivo STL para importar o modelo da mesa:" msgid "Bed Shape" msgstr "Forma da Mesa" -msgid "The recommended minimum temperature is less than 190 degree or the recommended maximum temperature is greater than 300 degree.\n" -msgstr "A temperatura mínima recomendada é inferior a 190 graus ou a temperatura máxima recomendada é superior a 300 graus.\n" +msgid "" +"The recommended minimum temperature is less than 190 degree or the " +"recommended maximum temperature is greater than 300 degree.\n" +msgstr "" +"A temperatura mínima recomendada é inferior a 190 graus ou a temperatura " +"máxima recomendada é superior a 300 graus.\n" -msgid "The recommended minimum temperature cannot be higher than the recommended maximum temperature.\n" -msgstr "A temperatura mínima recomendada não pode ser superior à temperatura máxima recomendada.\n" +msgid "" +"The recommended minimum temperature cannot be higher than the recommended " +"maximum temperature.\n" +msgstr "" +"A temperatura mínima recomendada não pode ser superior à temperatura máxima " +"recomendada.\n" msgid "Please check.\n" msgstr "Por favor, verifique.\n" @@ -3049,13 +3318,18 @@ msgid "" "Please make sure whether to use the temperature to print.\n" "\n" msgstr "" -"O bico pode ficar bloqueado quando a temperatura estiver fora da faixa recomendada.\n" +"O bico pode ficar bloqueado quando a temperatura estiver fora da faixa " +"recomendada.\n" "Por favor, certifique-se de usar a temperatura para imprimir.\n" "\n" #, c-format, boost-format -msgid "Recommended nozzle temperature of this filament type is [%d, %d] degree centigrade" -msgstr "A temperatura do bico recomendada para este tipo de filamento é [%d, %d] graus centígrados" +msgid "" +"Recommended nozzle temperature of this filament type is [%d, %d] degree " +"centigrade" +msgstr "" +"A temperatura do bico recomendada para este tipo de filamento é [%d, %d] " +"graus centígrados" msgid "" "Too small max volumetric speed.\n" @@ -3065,8 +3339,14 @@ msgstr "" "Redefinir para 0,5" #, c-format, boost-format -msgid "Current chamber temperature is higher than the material's safe temperature,it may result in material softening and clogging.The maximum safe temperature for the material is %d" -msgstr "A temperatura da câmara atual está mais alta do que a temperatura segura do material, pode resultar em amolecimento e entupimento do material. A temperatura máxima segura para o material é %d" +msgid "" +"Current chamber temperature is higher than the material's safe temperature," +"it may result in material softening and clogging.The maximum safe " +"temperature for the material is %d" +msgstr "" +"A temperatura da câmara atual está mais alta do que a temperatura segura do " +"material, pode resultar em amolecimento e entupimento do material. A " +"temperatura máxima segura para o material é %d" msgid "" "Too small layer height.\n" @@ -3092,15 +3372,19 @@ msgstr "" "A altura da primeira camada será redefinida para 0.2." msgid "" -"This setting is only used for model size tunning with small value in some cases.\n" +"This setting is only used for model size tunning with small value in some " +"cases.\n" "For example, when model size has small error and hard to be assembled.\n" "For large size tuning, please use model scale function.\n" "\n" "The value will be reset to 0." msgstr "" -"Esta configuração é usada apenas para ajustar o tamanho do modelo com um valor pequeno em alguns casos.\n" -"Por exemplo, quando o tamanho do modelo tem um pequeno erro e é difícil de ser montado.\n" -"Para ajustes de tamanho grandes, por favor, use a função de escala do modelo.\n" +"Esta configuração é usada apenas para ajustar o tamanho do modelo com um " +"valor pequeno em alguns casos.\n" +"Por exemplo, quando o tamanho do modelo tem um pequeno erro e é difícil de " +"ser montado.\n" +"Para ajustes de tamanho grandes, por favor, use a função de escala do " +"modelo.\n" "\n" "O valor será redefinido para 0." @@ -3112,33 +3396,43 @@ msgid "" "The value will be reset to 0." msgstr "" "Uma compensação de pé de elefante muito grande é irrazoável.\n" -"Se realmente tiver um efeito sério de pé de elefante, por favor, verifique outras configurações.\n" +"Se realmente tiver um efeito sério de pé de elefante, por favor, verifique " +"outras configurações.\n" "Por exemplo, se a temperatura da mesa estiver muito alta.\n" "\n" "O valor será redefinido para 0." -msgid "Alternate extra wall does't work well when ensure vertical shell thickness is set to All. " -msgstr "O perímetro extra alternado não funciona bem quando a espessura vertical da está definida para Todos. " +msgid "" +"Alternate extra wall does't work well when ensure vertical shell thickness " +"is set to All. " +msgstr "" +"O perímetro extra alternado não funciona bem quando a espessura vertical da " +"está definida para Todos. " msgid "" "Change these settings automatically? \n" -"Yes - Change ensure vertical shell thickness to Moderate and enable alternate extra wall\n" +"Yes - Change ensure vertical shell thickness to Moderate and enable " +"alternate extra wall\n" "No - Dont use alternate extra wall" msgstr "" "Alterar essas configurações automaticamente?\n" -"Sim - Alterar a espessura vertical do perímetro para Moderado e ativar o perímetro extra alternado\n" +"Sim - Alterar a espessura vertical do perímetro para Moderado e ativar o " +"perímetro extra alternado\n" "Não - Não usar o perímetro extra alternado" msgid "" -"Prime tower does not work when Adaptive Layer Height or Independent Support Layer Height is on.\n" +"Prime tower does not work when Adaptive Layer Height or Independent Support " +"Layer Height is on.\n" "Which do you want to keep?\n" "YES - Keep Prime Tower\n" "NO - Keep Adaptive Layer Height and Independent Support Layer Height" msgstr "" -"A torre de priming não funciona quando a Altura de Camada Adaptativa ou a Altura de Camada de Suporte Independente está ativada.\n" +"A torre de priming não funciona quando a Altura de Camada Adaptativa ou a " +"Altura de Camada de Suporte Independente está ativada.\n" "Qual você deseja manter?\n" "SIM - Manter a Torre de Priming\n" -"NÃO - Manter a Altura de Camada Adaptativa e a Altura de Camada de Suporte Independente" +"NÃO - Manter a Altura de Camada Adaptativa e a Altura de Camada de Suporte " +"Independente" msgid "" "Prime tower does not work when Adaptive Layer Height is on.\n" @@ -3146,7 +3440,8 @@ msgid "" "YES - Keep Prime Tower\n" "NO - Keep Adaptive Layer Height" msgstr "" -"A torre de priming não funciona quando a Altura de Camada Adaptativa está ativada.\n" +"A torre de priming não funciona quando a Altura de Camada Adaptativa está " +"ativada.\n" "Qual você deseja manter?\n" "SIM - Manter a Torre de Priming\n" "NÃO - Manter a Altura de Camada Adaptativa" @@ -3157,7 +3452,8 @@ msgid "" "YES - Keep Prime Tower\n" "NO - Keep Independent Support Layer Height" msgstr "" -"A torre de priming não funciona quando a Altura da Camada de Suporte Independente está ativada.\n" +"A torre de priming não funciona quando a Altura da Camada de Suporte " +"Independente está ativada.\n" "Qual você deseja manter?\n" "SIM - Manter a Torre de Priming\n" "NÃO - Manter a Altura da Camada de Suporte Independente" @@ -3176,8 +3472,13 @@ msgstr "" "seam_slope_start_height precisa ser menor que layer_height.\n" "Redefinir para 0." -msgid "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." -msgstr "O modo espiral só funciona quando o perímetro é igual a 1, o suporte está desativado, as camadas de topo são 0, a densidade de preenchimento não sólido é 0 e o tipo de timelapse é tradicional." +msgid "" +"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." +msgstr "" +"O modo espiral só funciona quando o perímetro é igual a 1, o suporte está " +"desativado, as camadas de topo são 0, a densidade de preenchimento não " +"sólido é 0 e o tipo de timelapse é tradicional." msgid " But machines with I3 structure will not generate timelapse videos." msgstr " Mas máquinas com estrutura I3 não gerarão vídeos de timelapse." @@ -3270,7 +3571,8 @@ msgid "Paused due to AMS lost" msgstr "Pausado devido à perda do AMS" msgid "Paused due to low speed of the heat break fan" -msgstr "Pausado devido a baixa velocidade do ventilador do bloco de aquecimento" +msgstr "" +"Pausado devido a baixa velocidade do ventilador do bloco de aquecimento" msgid "Paused due to chamber temperature control error" msgstr "Pausado devido a erro no controle de temperatura da câmara" @@ -3296,18 +3598,6 @@ msgstr "Pausa de erro na primeira camada" msgid "Nozzle clog pause" msgstr "Pausa de obstrução do bico" -msgid "MC" -msgstr "MC" - -msgid "MainBoard" -msgstr "Placa principal" - -msgid "TH" -msgstr "TH" - -msgid "XCam" -msgstr "XCam" - msgid "Unknown" msgstr "Desconhecido" @@ -3332,19 +3622,38 @@ msgstr "Verificação falhou." msgid "Update failed." msgstr "Atualização falhou." -msgid "The current chamber temperature or the target chamber temperature exceeds 45℃.In order to avoid extruder clogging,low temperature filament(PLA/PETG/TPU) is not allowed to be loaded." -msgstr "A temperatura atual da câmara ou a temperatura da câmara alvo excede 45℃. Para evitar obstrução do extrusor, não é permitido carregar filamento de baixa temperatura (PLA/PETG/TPU)." +msgid "" +"The current chamber temperature or the target chamber temperature exceeds " +"45℃.In order to avoid extruder clogging,low temperature filament(PLA/PETG/" +"TPU) is not allowed to be loaded." +msgstr "" +"A temperatura atual da câmara ou a temperatura da câmara alvo excede 45℃. " +"Para evitar obstrução do extrusor, não é permitido carregar filamento de " +"baixa temperatura (PLA/PETG/TPU)." -msgid "Low temperature filament(PLA/PETG/TPU) is loaded in the extruder.In order to avoid extruder clogging,it is not allowed to set the chamber temperature above 45℃." -msgstr "Filamento de baixa temperatura (PLA/PETG/TPU) está carregado na extrusora. Para evitar obstrução do extrusor, não é permitido ajustar a temperatura da câmara acima de 45℃." +msgid "" +"Low temperature filament(PLA/PETG/TPU) is loaded in the extruder.In order to " +"avoid extruder clogging,it is not allowed to set the chamber temperature " +"above 45℃." +msgstr "" +"Filamento de baixa temperatura (PLA/PETG/TPU) está carregado na extrusora. " +"Para evitar obstrução do extrusor, não é permitido ajustar a temperatura da " +"câmara acima de 45℃." -msgid "When you set the chamber temperature below 40℃, the chamber temperature control will not be activated. And the target chamber temperature will automatically be set to 0℃." -msgstr "Quando você definir a temperatura da câmara abaixo de 40℃, o controle de temperatura da câmara não será ativado. E a temperatura alvo da câmara será automaticamente definida como 0℃." +msgid "" +"When you set the chamber temperature below 40℃, the chamber temperature " +"control will not be activated. And the target chamber temperature will " +"automatically be set to 0℃." +msgstr "" +"Quando você definir a temperatura da câmara abaixo de 40℃, o controle de " +"temperatura da câmara não será ativado. E a temperatura alvo da câmara será " +"automaticamente definida como 0℃." msgid "Failed to start printing job" msgstr "Falha ao iniciar o trabalho de impressão" -msgid "This calibration does not support the currently selected nozzle diameter" +msgid "" +"This calibration does not support the currently selected nozzle diameter" msgstr "Esta calibração não suporta o diâmetro do bico atualmente selecionado" msgid "Current flowrate cali param is invalid" @@ -3365,11 +3674,19 @@ msgstr "TPU não é suportado pelo AMS." msgid "Bambu PET-CF/PA6-CF is not supported by AMS." msgstr "Bambu PET-CF/PA6-CF não é suportado pelo AMS." -msgid "Damp PVA will become flexible and get stuck inside AMS,please take care to dry it before use." -msgstr "O PVA úmido se tornará flexível e ficará preso dentro do AMS, por favor, tenha cuidado para secá-lo antes de usar." +msgid "" +"Damp PVA will become flexible and get stuck inside AMS,please take care to " +"dry it before use." +msgstr "" +"O PVA úmido se tornará flexível e ficará preso dentro do AMS, por favor, " +"tenha cuidado para secá-lo antes de usar." -msgid "CF/GF filaments are hard and brittle, It's easy to break or get stuck in AMS, please use with caution." -msgstr "Os filamentos CF/GF são duros e quebradiços, é fácil quebrar ou ficar preso no AMS, por favor, use com cautela." +msgid "" +"CF/GF filaments are hard and brittle, It's easy to break or get stuck in " +"AMS, please use with caution." +msgstr "" +"Os filamentos CF/GF são duros e quebradiços, é fácil quebrar ou ficar preso " +"no AMS, por favor, use com cautela." msgid "default" msgstr "padrão" @@ -3379,7 +3696,9 @@ msgid "Edit Custom G-code (%1%)" msgstr "Editar G-Code personalizado (%1%)" msgid "Built-in placeholders (Double click item to add to G-code)" -msgstr "Marcadores de posição incorporados (Clique duas vezes no item para adicionar ao G-code)" +msgstr "" +"Marcadores de posição incorporados (Clique duas vezes no item para adicionar " +"ao G-code)" msgid "Search gcode placeholders" msgstr "Procurar marcadores de posição do G-code" @@ -3817,8 +4136,12 @@ msgid "Size:" msgstr "Tamanho:" #, c-format, boost-format -msgid "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please separate the conflicted objects farther (%s <-> %s)." -msgstr "Foram encontrados conflitos de caminhos de G-code na camada %d, z = %.2lf mm. Por favor, separe mais os objetos em conflito (%s <-> %s)." +msgid "" +"Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " +"separate the conflicted objects farther (%s <-> %s)." +msgstr "" +"Foram encontrados conflitos de caminhos de G-code na camada %d, z = %.2lf " +"mm. Por favor, separe mais os objetos em conflito (%s <-> %s)." msgid "An object is layed over the boundary of plate." msgstr "Um objeto está sobre a borda da mesa." @@ -3834,10 +4157,12 @@ msgstr "Apenas o objeto em edição está visível." msgid "" "An object is laid over the boundary of plate or exceeds the height limit.\n" -"Please solve the problem by moving it totally on or off the plate, and confirming that the height is within the build volume." +"Please solve the problem by moving it totally on or off the plate, and " +"confirming that the height is within the build volume." msgstr "" "Um objeto está sobre a borda da mesa ou ultrapassa o limite de altura.\n" -"Por favor, resolva o problema movendo-o totalmente para dentro ou para fora da mesa, e confirmando que a altura está dentro do volume de impressão." +"Por favor, resolva o problema movendo-o totalmente para dentro ou para fora " +"da mesa, e confirmando que a altura está dentro do volume de impressão." msgid "Calibration step selection" msgstr "Seleção de etapa de calibração" @@ -3858,10 +4183,12 @@ msgid "Calibration program" msgstr "Programa de calibração" msgid "" -"The calibration program detects the status of your device automatically to minimize deviation.\n" +"The calibration program detects the status of your device automatically to " +"minimize deviation.\n" "It keeps the device performing optimally." msgstr "" -"O programa de calibração detecta automaticamente o estado do seu dispositivo para minimizar desvios.\n" +"O programa de calibração detecta automaticamente o estado do seu dispositivo " +"para minimizar desvios.\n" "Mantém o dispositivo com desempenho ideal." msgid "Calibration Flow" @@ -3949,6 +4276,9 @@ msgstr "Pré-visualizar" msgid "Device" msgstr "Dispositivo" +msgid "Multi-device" +msgstr "" + msgid "Project" msgstr "Projeto" @@ -3988,6 +4318,9 @@ msgstr "Imprimir tudo" msgid "Send all" msgstr "Enviar tudo" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "Atalhos de Teclado" @@ -4345,8 +4678,10 @@ msgstr "Escolha um diretório" #, c-format, boost-format msgid "There is %d config exported. (Only non-system configs)" msgid_plural "There are %d configs exported. (Only non-system configs)" -msgstr[0] "Foi exportada uma configuração (%d). (Apenas configurações não do sistema)" -msgstr[1] "Foram exportadas %d configurações. (Apenas configurações não do sistema)" +msgstr[0] "" +"Foi exportada uma configuração (%d). (Apenas configurações não do sistema)" +msgstr[1] "" +"Foram exportadas %d configurações. (Apenas configurações não do sistema)" msgid "Export result" msgstr "Resultado da exportação" @@ -4356,16 +4691,23 @@ msgstr "Selecione o perfil para carregar:" #, c-format, boost-format msgid "There is %d config imported. (Only non-system and compatible configs)" -msgid_plural "There are %d configs imported. (Only non-system and compatible configs)" -msgstr[0] "Foi importada uma configuração (%d). (Apenas configurações compatíveis e não do sistema)" -msgstr[1] "Foram importadas %d configurações. (Apenas configurações compatíveis e não do sistema)" +msgid_plural "" +"There are %d configs imported. (Only non-system and compatible configs)" +msgstr[0] "" +"Foi importada uma configuração (%d). (Apenas configurações compatíveis e não " +"do sistema)" +msgstr[1] "" +"Foram importadas %d configurações. (Apenas configurações compatíveis e não " +"do sistema)" msgid "" "\n" -"Hint: Make sure you have added the corresponding printer before importing the configs." +"Hint: Make sure you have added the corresponding printer before importing " +"the configs." msgstr "" "\n" -"Dica: Certifique-se de ter adicionado a impressora correspondente antes de importar as configurações." +"Dica: Certifique-se de ter adicionado a impressora correspondente antes de " +"importar as configurações." msgid "Import result" msgstr "Resultado da importação" @@ -4396,28 +4738,42 @@ msgid "Synchronization" msgstr "Sincronização" msgid "The device cannot handle more conversations. Please retry later." -msgstr "O dispositivo não pode lidar com mais conversas. Por favor, tente novamente mais tarde." +msgstr "" +"O dispositivo não pode lidar com mais conversas. Por favor, tente novamente " +"mais tarde." msgid "Player is malfunctioning. Please reinstall the system player." -msgstr "O reprodutor está com problemas. Por favor, reinstale o reprodutor do sistema." +msgstr "" +"O reprodutor está com problemas. Por favor, reinstale o reprodutor do " +"sistema." msgid "The player is not loaded, please click \"play\" button to retry." -msgstr "O reprodutor não está carregado, por favor, clique no botão \"Reproduzir\" para tentar novamente." +msgstr "" +"O reprodutor não está carregado, por favor, clique no botão \"Reproduzir\" " +"para tentar novamente." msgid "Please confirm if the printer is connected." msgstr "Por favor, confirme se a impressora está conectada." -msgid "The printer is currently busy downloading. Please try again after it finishes." -msgstr "A impressora está sendo baixada no momento. Tente novamente após terminar." +msgid "" +"The printer is currently busy downloading. Please try again after it " +"finishes." +msgstr "" +"A impressora está sendo baixada no momento. Tente novamente após terminar." msgid "Printer camera is malfunctioning." msgstr "A câmera da impressora está com problemas." msgid "Problem occured. Please update the printer firmware and try again." -msgstr "Ocorreu um problema. Por favor, atualize o firmware da impressora e tente novamente." +msgstr "" +"Ocorreu um problema. Por favor, atualize o firmware da impressora e tente " +"novamente." -msgid "LAN Only Liveview is off. Please turn on the liveview on printer screen." -msgstr "Liveview via LAN está desativado. Por favor, ative a liveview na tela da impressora." +msgid "" +"LAN Only Liveview is off. Please turn on the liveview on printer screen." +msgstr "" +"Liveview via LAN está desativado. Por favor, ative a liveview na tela da " +"impressora." msgid "Please enter the IP of printer to connect." msgstr "Por favor, digite o IP da impressora para conectar." @@ -4428,8 +4784,12 @@ msgstr "Inicializando..." msgid "Connection Failed. Please check the network and try again" msgstr "Falha na conexão. Por favor, verifique a rede e tente novamente" -msgid "Please check the network and try again, You can restart or update the printer if the issue persists." -msgstr "Por favor, verifique a rede e tente novamente, você pode reiniciar ou atualizar a impressora se o problema persistir." +msgid "" +"Please check the network and try again, You can restart or update the " +"printer if the issue persists." +msgstr "" +"Por favor, verifique a rede e tente novamente, você pode reiniciar ou " +"atualizar a impressora se o problema persistir." msgid "The printer has been logged out and cannot connect." msgstr "A impressora foi desconectada e não pode se conectar." @@ -4548,8 +4908,12 @@ msgstr "Falha ao carregar" msgid "Initialize failed (Device connection not ready)!" msgstr "Inicialização falhou (Conexão do dispositivo não está pronta)!" -msgid "Browsing file in SD card is not supported in current firmware. Please update the printer firmware." -msgstr "Procurar arquivo no cartão SD não é suportado no firmware atual. Por favor, atualize o firmware da impressora." +msgid "" +"Browsing file in SD card is not supported in current firmware. Please update " +"the printer firmware." +msgstr "" +"Procurar arquivo no cartão SD não é suportado no firmware atual. Por favor, " +"atualize o firmware da impressora." msgid "Initialize failed (Storage unavailable, insert SD card.)!" msgstr "Inicialização falhou (falha no armazenamento, insira o cartão SD.)!" @@ -4566,9 +4930,14 @@ msgstr "Inicialização falhou (%s)!" #, c-format, boost-format msgid "You are going to delete %u file from printer. Are you sure to continue?" -msgid_plural "You are going to delete %u files from printer. Are you sure to continue?" -msgstr[0] "Você está prestes a excluir %u arquivo da impressora. Tem certeza de que deseja continuar?" -msgstr[1] "Você está prestes a excluir %u arquivos da impressora. Tem certeza de que deseja continuar?" +msgid_plural "" +"You are going to delete %u files from printer. Are you sure to continue?" +msgstr[0] "" +"Você está prestes a excluir %u arquivo da impressora. Tem certeza de que " +"deseja continuar?" +msgstr[1] "" +"Você está prestes a excluir %u arquivos da impressora. Tem certeza de que " +"deseja continuar?" msgid "Delete files" msgstr "Excluir arquivos" @@ -4589,8 +4958,12 @@ msgstr "Falha ao obter informação do modelo da impressora." msgid "Failed to parse model information." msgstr "Falha ao analisar a informação do modelo." -msgid "The .gcode.3mf file contains no G-code data.Please slice it with Orca Slicer and export a new .gcode.3mf file." -msgstr "O arquivo .gcode.3mf não contém dados de G-code. Por favor, fatie com Orca Slicer e exporte um novo arquivo .gcode.3mf." +msgid "" +"The .gcode.3mf file contains no G-code data.Please slice it with Orca Slicer " +"and export a new .gcode.3mf file." +msgstr "" +"O arquivo .gcode.3mf não contém dados de G-code. Por favor, fatie com Orca " +"Slicer e exporte um novo arquivo .gcode.3mf." #, c-format, boost-format msgid "File '%s' was lost! Please download it again." @@ -4620,11 +4993,17 @@ msgstr "Download concluído" msgid "Downloading %d%%..." msgstr "Baixando %d%%..." -msgid "Reconnecting the printer, the operation cannot be completed immediately, please try again later." -msgstr "Reconectando a impressora, a operação não pôde ser concluída imediatamente, por favor, tente novamente mais tarde." +msgid "" +"Reconnecting the printer, the operation cannot be completed immediately, " +"please try again later." +msgstr "" +"Reconectando a impressora, a operação não pôde ser concluída imediatamente, " +"por favor, tente novamente mais tarde." -msgid "Over 4 studio/handy are using remote access, you can close some and try again." -msgstr "Mais de 4 estúdio/prático estão usando o acesso remoto, você pode fechar alguns e tentar novamente." +msgid "" +"Over 4 systems/handy are using remote access, you can close some and try " +"again." +msgstr "" msgid "File does not exist." msgstr "O arquivo não existe." @@ -4709,8 +5088,11 @@ msgstr "" msgid "How do you like this printing file?" msgstr "O que você achou deste arquivo de impressão?" -msgid "(The model has already been rated. Your rating will overwrite the previous rating.)" -msgstr "(O modelo já foi avaliado. Sua avaliação substituirá a avaliação anterior.)" +msgid "" +"(The model has already been rated. Your rating will overwrite the previous " +"rating.)" +msgstr "" +"(O modelo já foi avaliado. Sua avaliação substituirá a avaliação anterior.)" msgid "Rate" msgstr "Avaliar" @@ -4751,9 +5133,6 @@ msgstr "Filhote" msgid "Bed" msgstr "Mesa" -msgid "Unload" -msgstr "Descarregar" - msgid "Debug Info" msgstr "Informações de Depuração" @@ -4787,8 +5166,12 @@ msgstr "Camada: %s" msgid "Layer: %d/%d" msgstr "Camada: %d/%d" -msgid "Please heat the nozzle to above 170 degree before loading or unloading filament." -msgstr "Aqueça o bico a mais de 170 graus antes de carregar ou descarregar o filamento." +msgid "" +"Please heat the nozzle to above 170 degree before loading or unloading " +"filament." +msgstr "" +"Aqueça o bico a mais de 170 graus antes de carregar ou descarregar o " +"filamento." msgid "Still unload" msgstr "Ainda descarregando" @@ -4799,8 +5182,13 @@ msgstr "Ainda carregando" msgid "Please select an AMS slot before calibration" msgstr "Selecione um slot AMS antes da calibração" -msgid "Cannot read filament info: the filament is loaded to the tool head,please unload the filament and try again." -msgstr "Não é possível ler as informações do filamento: o filamento está carregado na cabeça da ferramenta, por favor, descarregue o filamento e tente novamente." +msgid "" +"Cannot read filament info: the filament is loaded to the tool head,please " +"unload the filament and try again." +msgstr "" +"Não é possível ler as informações do filamento: o filamento está carregado " +"na cabeça da ferramenta, por favor, descarregue o filamento e tente " +"novamente." msgid "This only takes effect during printing" msgstr "Isso só tem efeito durante a impressão" @@ -4866,17 +5254,21 @@ msgid " can not be opened\n" msgstr " não pode ser aberto\n" msgid "" -"The following issues occurred during the process of uploading images. Do you want to ignore them?\n" +"The following issues occurred during the process of uploading images. Do you " +"want to ignore them?\n" "\n" msgstr "" -"Os seguintes problemas ocorreram durante o processo de carregamento das imagens. Você deseja ignorá-los?\n" +"Os seguintes problemas ocorreram durante o processo de carregamento das " +"imagens. Você deseja ignorá-los?\n" "\n" msgid "info" msgstr "informação" msgid "Synchronizing the printing results. Please retry a few seconds later." -msgstr "Sincronizando os resultados da impressão. Por favor, tente novamente alguns segundos depois." +msgstr "" +"Sincronizando os resultados da impressão. Por favor, tente novamente alguns " +"segundos depois." msgid "Upload failed\n" msgstr "Falha no envio\n" @@ -4889,7 +5281,8 @@ msgid "" "\n" " error code: " msgstr "" -"O resultado do seu comentário não pode ser enviado devido a alguns motivos. Como segue:\n" +"O resultado do seu comentário não pode ser enviado devido a alguns motivos. " +"Como segue:\n" "\n" " código de erro: " @@ -4905,8 +5298,12 @@ msgstr "" "\n" "Gostaria de ser redirecionado para a página da web para avaliar?" -msgid "Some of your images failed to upload. Would you like to redirect to the webpage for rating?" -msgstr "Algumas de suas imagens não puderam ser carregadas. Gostaria de ser redirecionado para a página da web para avaliar?" +msgid "" +"Some of your images failed to upload. Would you like to redirect to the " +"webpage for rating?" +msgstr "" +"Algumas de suas imagens não puderam ser carregadas. Gostaria de ser " +"redirecionado para a página da web para avaliar?" msgid "You can select up to 16 images." msgstr "Você pode selecionar até 16 imagens." @@ -4915,7 +5312,8 @@ msgid "" "At least one successful print record of this print profile is required \n" "to give a positive rating(4 or 5stars)." msgstr "" -"Pelo menos um registro de impressão bem-sucedido deste perfil de impressão é necessário \n" +"Pelo menos um registro de impressão bem-sucedido deste perfil de impressão é " +"necessário \n" "para dar uma avaliação positiva (4 ou 5 estrelas)." msgid "Status" @@ -4924,9 +5322,6 @@ msgstr "Status" msgid "Update" msgstr "Atualizar" -msgid "HMS" -msgstr "HMS" - msgid "Don't show again" msgstr "Não mostrar novamente" @@ -4960,20 +5355,22 @@ msgstr "Pular" msgid "Newer 3mf version" msgstr "Nova versão 3mf" -msgid "The 3mf file version is in Beta and it is newer than the current Bambu Studio version." -msgstr "A versão do arquivo 3mf está em Beta e é mais recente que a versão atual do Bambu Studio." +msgid "" +"The 3mf file version is in Beta and it is newer than the current OrcaSlicer " +"version." +msgstr "" -msgid "If you would like to try Bambu Studio Beta, you may click to" -msgstr "Se você gostaria de testar o Bambu Studio Beta, clique para" +msgid "If you would like to try Orca Slicer Beta, you may click to" +msgstr "" msgid "Download Beta Version" msgstr "Baixar versão beta" -msgid "The 3mf file version is newer than the current Bambu Studio version." -msgstr "A versão do arquivo 3mf é mais recente que a versão atual do Bambu Studio." +msgid "The 3mf file version is newer than the current Orca Slicer version." +msgstr "" -msgid "Update your Bambu Studio could enable all functionality in the 3mf file." -msgstr "Atualizar seu Bambu Studio pode habilitar todas as funcionalidades do arquivo 3mf." +msgid "Update your Orca Slicer could enable all functionality in the 3mf file." +msgstr "" msgid "Current Version: " msgstr "Versão Atual: " @@ -5110,8 +5507,12 @@ msgstr "Camadas" msgid "Range" msgstr "Intervalo" -msgid "The application cannot run normally because OpenGL version is lower than 2.0.\n" -msgstr "A aplicação não pode ser executada normalmente porque a versão do OpenGL é inferior a 2.0.\n" +msgid "" +"The application cannot run normally because OpenGL version is lower than " +"2.0.\n" +msgstr "" +"A aplicação não pode ser executada normalmente porque a versão do OpenGL é " +"inferior a 2.0.\n" msgid "Please upgrade your graphics card driver." msgstr "Por favor, atualize o driver da sua placa de vídeo." @@ -5147,8 +5548,12 @@ msgstr "Sensibilidade da pausa é" msgid "Enable detection of build plate position" msgstr "Ativar detecção da posição da mesa" -msgid "The localization tag of build plate is detected, and printing is paused if the tag is not in predefined range." -msgstr "A etiqueta de localização da mesa é detectada e a impressão é pausada se a etiqueta não estiver na faixa predefinida." +msgid "" +"The localization tag of build plate is detected, and printing is paused if " +"the tag is not in predefined range." +msgstr "" +"A etiqueta de localização da mesa é detectada e a impressão é pausada se a " +"etiqueta não estiver na faixa predefinida." msgid "First Layer Inspection" msgstr "Inspeção da Primeira Camada" @@ -5162,6 +5567,12 @@ msgstr "Permitir som de alerta" msgid "Filament Tangle Detect" msgstr "Detecção de emaranhado de filamento" +msgid "Nozzle Clumping Detection" +msgstr "" + +msgid "Check if the nozzle is clumping by filament or other foreign objects." +msgstr "" + msgid "Nozzle Type" msgstr "Tipo de bico" @@ -5266,17 +5677,28 @@ msgstr "Definir filamentos para usar" msgid "Search plate, object and part." msgstr "Pesquisar mesa, objeto e peça." -msgid "No AMS filaments. Please select a printer in 'Device' page to load AMS info." -msgstr "Sem filamentos AMS. Por favor, selecione uma impressora na página 'Dispositivo' para carregar informações AMS." +msgid "" +"No AMS filaments. Please select a printer in 'Device' page to load AMS info." +msgstr "" +"Sem filamentos AMS. Por favor, selecione uma impressora na página " +"'Dispositivo' para carregar informações AMS." msgid "Sync filaments with AMS" msgstr "Sincronizar filamentos com AMS" -msgid "Sync filaments with AMS will drop all current selected filament presets and colors. Do you want to continue?" -msgstr "Sincronizar filamentos com AMS eliminará todas os presets de filamento e cores selecionadas atualmente. Deseja continuar?" +msgid "" +"Sync filaments with AMS will drop all current selected filament presets and " +"colors. Do you want to continue?" +msgstr "" +"Sincronizar filamentos com AMS eliminará todas os presets de filamento e " +"cores selecionadas atualmente. Deseja continuar?" -msgid "Already did a synchronization, do you want to sync only changes or resync all?" -msgstr "Já foi feita uma sincronização, deseja sincronizar apenas as alterações ou ressincronizar tudo?" +msgid "" +"Already did a synchronization, do you want to sync only changes or resync " +"all?" +msgstr "" +"Já foi feita uma sincronização, deseja sincronizar apenas as alterações ou " +"ressincronizar tudo?" msgid "Sync" msgstr "Sincronizar" @@ -5287,16 +5709,26 @@ msgstr "Ressincronizar" msgid "There are no compatible filaments, and sync is not performed." msgstr "Não há filamentos compatíveis, e a sincronização não é realizada." -msgid "There are some unknown filaments mapped to generic preset. Please update Orca Slicer or restart Orca Slicer to check if there is an update to system presets." -msgstr "Alguns filamentos desconhecidos foram mapeados para preset genérico. Por favor, atualize o Orca Slicer ou reinicie o Orca Slicer para verificar se há uma atualização para presets do sistema." +msgid "" +"There are some unknown filaments mapped to generic preset. Please update " +"Orca Slicer or restart Orca Slicer to check if there is an update to system " +"presets." +msgstr "" +"Alguns filamentos desconhecidos foram mapeados para preset genérico. Por " +"favor, atualize o Orca Slicer ou reinicie o Orca Slicer para verificar se há " +"uma atualização para presets do sistema." #, boost-format msgid "Do you want to save changes to \"%1%\"?" msgstr "Deseja salvar as alterações em \"%1%\"?" #, c-format, boost-format -msgid "Successfully unmounted. The device %s(%s) can now be safely removed from the computer." -msgstr "Desmontado com sucesso. O dispositivo %s(%s) agora pode ser removido com segurança do computador." +msgid "" +"Successfully unmounted. The device %s(%s) can now be safely removed from the " +"computer." +msgstr "" +"Desmontado com sucesso. O dispositivo %s(%s) agora pode ser removido com " +"segurança do computador." #, c-format, boost-format msgid "Ejecting of device %s(%s) has failed." @@ -5308,14 +5740,30 @@ msgstr "Projeto não salvo anterior detectado, deseja restaurá-lo?" msgid "Restore" msgstr "Restaurar" -msgid "The current hot bed temperature is relatively high. The nozzle may be clogged when printing this filament in a closed enclosure. Please open the front door and/or remove the upper glass." -msgstr "A temperatura atual da mesa aquecida está relativamente alta. A boquilha pode ficar obstruída ao imprimir este filamento em um compartimento fechado. Por favor, abra a porta frontal e/ou remova o vidro superior." +msgid "" +"The current hot bed temperature is relatively high. The nozzle may be " +"clogged when printing this filament in a closed enclosure. Please open the " +"front door and/or remove the upper glass." +msgstr "" +"A temperatura atual da mesa aquecida está relativamente alta. A boquilha " +"pode ficar obstruída ao imprimir este filamento em um compartimento fechado. " +"Por favor, abra a porta frontal e/ou remova o vidro superior." -msgid "The nozzle hardness required by the filament is higher than the default nozzle hardness of the printer. Please replace the hardened nozzle or filament, otherwise, the nozzle will be attrited or damaged." -msgstr "A dureza do bico necessária pelo filamento é maior do que a dureza padrão do bico da impressora. Por favor, substitua a boquilha endurecida ou o filamento, caso contrário, a boquilha será desgastada ou danificada." +msgid "" +"The nozzle hardness required by the filament is higher than the default " +"nozzle hardness of the printer. Please replace the hardened nozzle or " +"filament, otherwise, the nozzle will be attrited or damaged." +msgstr "" +"A dureza do bico necessária pelo filamento é maior do que a dureza padrão do " +"bico da impressora. Por favor, substitua a boquilha endurecida ou o " +"filamento, caso contrário, a boquilha será desgastada ou danificada." -msgid "Enabling traditional timelapse photography may cause surface imperfections. It is recommended to change to smooth mode." -msgstr "A habilitação da fotografia tradicional em timelapse pode causar imperfeições na superfície. É recomendado mudar para o modo suave." +msgid "" +"Enabling traditional timelapse photography may cause surface imperfections. " +"It is recommended to change to smooth mode." +msgstr "" +"A habilitação da fotografia tradicional em timelapse pode causar " +"imperfeições na superfície. É recomendado mudar para o modo suave." msgid "Expand sidebar" msgstr "Expandir barra lateral" @@ -5328,21 +5776,30 @@ msgid "Loading file: %s" msgstr "Carregando arquivo: %s" msgid "The 3mf is not supported by OrcaSlicer, load geometry data only." -msgstr "O 3mf não é suportado pelo OrcaSlicer, carregar apenas dados de geometria." +msgstr "" +"O 3mf não é suportado pelo OrcaSlicer, carregar apenas dados de geometria." msgid "Load 3mf" msgstr "Carregar 3mf" #, c-format, boost-format -msgid "The 3mf's version %s is newer than %s's version %s, Found following keys unrecognized:" -msgstr "A versão %s do 3mf é mais recente do que a versão %s do %s, encontradas as seguintes chaves não reconhecidas:" +msgid "" +"The 3mf's version %s is newer than %s's version %s, Found following keys " +"unrecognized:" +msgstr "" +"A versão %s do 3mf é mais recente do que a versão %s do %s, encontradas as " +"seguintes chaves não reconhecidas:" msgid "You'd better upgrade your software.\n" msgstr "Será melhor atualizar o seu software.\n" #, c-format, boost-format -msgid "The 3mf's version %s is newer than %s's version %s, Suggest to upgrade your software." -msgstr "A versão %s do 3mf é mais recente do que a versão %s do %s, sugerimos atualizar seu software." +msgid "" +"The 3mf's version %s is newer than %s's version %s, Suggest to upgrade your " +"software." +msgstr "" +"A versão %s do 3mf é mais recente do que a versão %s do %s, sugerimos " +"atualizar seu software." msgid "Invalid values found in the 3mf:" msgstr "Valores inválidos encontrados no 3mf:" @@ -5351,32 +5808,46 @@ msgid "Please correct them in the param tabs" msgstr "Por favor, corrija-os nas guias de parâmetros" msgid "The 3mf has following modified G-codes in filament or printer presets:" -msgstr "O 3mf possui os seguintes G-codes modificados em presets de filamento ou impressora:" +msgstr "" +"O 3mf possui os seguintes G-codes modificados em presets de filamento ou " +"impressora:" -msgid "Please confirm that these modified G-codes are safe to prevent any damage to the machine!" -msgstr "Por favor, confirme se esses G-codes modificados são seguros para evitar qualquer dano à máquina!" +msgid "" +"Please confirm that these modified G-codes are safe to prevent any damage to " +"the machine!" +msgstr "" +"Por favor, confirme se esses G-codes modificados são seguros para evitar " +"qualquer dano à máquina!" msgid "Modified G-codes" msgstr "G-codes modificados" msgid "The 3mf has following customized filament or printer presets:" -msgstr "O 3mf possui os seguintes perfis de filamento ou impressora personalizados:" +msgstr "" +"O 3mf possui os seguintes perfis de filamento ou impressora personalizados:" -msgid "Please confirm that the G-codes within these presets are safe to prevent any damage to the machine!" -msgstr "Por favor, confirme se os G-codes dentro desses presets são seguros para evitar qualquer dano à máquina!" +msgid "" +"Please confirm that the G-codes within these presets are safe to prevent any " +"damage to the machine!" +msgstr "" +"Por favor, confirme se os G-codes dentro desses presets são seguros para " +"evitar qualquer dano à máquina!" msgid "Customized Preset" msgstr "Perfil Personalizado" msgid "Name of components inside step file is not UTF8 format!" -msgstr "O nome dos componentes dentro do arquivo STEP não está no formato UTF-8!" +msgstr "" +"O nome dos componentes dentro do arquivo STEP não está no formato UTF-8!" msgid "The name may show garbage characters!" msgstr "O nome pode exibir caracteres inválidos!" #, boost-format msgid "Failed loading file \"%1%\". An invalid configuration was found." -msgstr "Falha ao carregar o arquivo \"%1%\". Foi encontrada uma configuração inválida." +msgstr "" +"Falha ao carregar o arquivo \"%1%\". Foi encontrada uma configuração " +"inválida." msgid "Objects with zero volume removed" msgstr "Objetos com volume zero removidos" @@ -5401,7 +5872,8 @@ msgid "" "the file be loaded as a single object having multiple parts?" msgstr "" "Este arquivo contém vários objetos posicionados em alturas múltiplas.\n" -"Em vez de considerá-los como múltiplos objetos, o arquivo deve ser carregado\n" +"Em vez de considerá-los como múltiplos objetos, o arquivo deve ser " +"carregado\n" "como um único objeto com múltiplas peças?" msgid "Multi-part object detected" @@ -5416,8 +5888,12 @@ msgstr "Objeto com múltiplas peças foi detectado" msgid "The file does not contain any geometry data." msgstr "O arquivo não contém dados de geometria." -msgid "Your object appears to be too large, Do you want to scale it down to fit the heat bed automatically?" -msgstr "Seu objeto parece ser muito grande. Deseja dimensioná-lo para caber na mesa de aquecimento automaticamente?" +msgid "" +"Your object appears to be too large, Do you want to scale it down to fit the " +"heat bed automatically?" +msgstr "" +"Seu objeto parece ser muito grande. Deseja dimensioná-lo para caber na mesa " +"de aquecimento automaticamente?" msgid "Object too large" msgstr "Objeto muito grande" @@ -5518,18 +5994,23 @@ msgstr "Fatiando Mesa %d" msgid "Please resolve the slicing errors and publish again." msgstr "Por favor, resolva os erros de fatiamento e publique novamente." -msgid "Network Plug-in is not detected. Network related features are unavailable." -msgstr "O plug-in de rede não está detectado. Recursos relacionados à rede estão indisponíveis." +msgid "" +"Network Plug-in is not detected. Network related features are unavailable." +msgstr "" +"O plug-in de rede não está detectado. Recursos relacionados à rede estão " +"indisponíveis." msgid "" "Preview only mode:\n" "The loaded file contains gcode only, Can not enter the Prepare page" msgstr "" "Modo somente de visualização:\n" -"O arquivo carregado contém apenas código G, não é possível acessar a página de Preparação" +"O arquivo carregado contém apenas código G, não é possível acessar a página " +"de Preparação" msgid "You can keep the modified presets to the new project or discard them" -msgstr "Você pode manter os presets modificados no novo projeto ou descartá-los" +msgstr "" +"Você pode manter os presets modificados no novo projeto ou descartá-los" msgid "Creating a new project" msgstr "Criando um novo projeto" @@ -5539,10 +6020,12 @@ msgstr "Carregar Projeto" msgid "" "Failed to save the project.\n" -"Please check whether the folder exists online or if other programs open the project file." +"Please check whether the folder exists online or if other programs open the " +"project file." msgstr "" "Falha ao salvar o projeto.\n" -"Por favor, verifique se a pasta existe online ou se outros programas estão com o arquivo do projeto aberto." +"Por favor, verifique se a pasta existe online ou se outros programas estão " +"com o arquivo do projeto aberto." msgid "Save project" msgstr "Salvar Projeto" @@ -5553,15 +6036,23 @@ msgstr "Importando Modelo" msgid "prepare 3mf file..." msgstr "preparar o arquivo 3mf..." +msgid "Download failed, unknown file format." +msgstr "" + msgid "downloading project ..." msgstr "baixando projeto..." +msgid "Download failed, File size exception." +msgstr "" + #, c-format, boost-format msgid "Project downloaded %d%%" msgstr "Projeto baixado %d%%" -msgid "Importing to Orca Slicer failed. Please download the file and manually import it." -msgstr "A importação para o Orca Slicer falhou. Por favor, baixe o arquivo e importe manualmente." +msgid "" +"Importing to Bambu Studio failed. Please download the file and manually " +"import it." +msgstr "" msgid "Import SLA archive" msgstr "Importar arquivo SLA" @@ -5627,17 +6118,27 @@ msgid "The provided file name is not valid." msgstr "O nome de arquivo fornecido não é válido." msgid "The following characters are not allowed by a FAT file system:" -msgstr "Os seguintes caracteres não são permitidos por um sistema de arquivos FAT:" +msgstr "" +"Os seguintes caracteres não são permitidos por um sistema de arquivos FAT:" msgid "Save Sliced file as:" msgstr "Salvar arquivo fatiado como:" #, c-format, boost-format -msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer." -msgstr "O arquivo %s foi enviado para o espaço de armazenamento da impressora e pode ser visualizado na impressora." +msgid "" +"The file %s has been sent to the printer's storage space and can be viewed " +"on the printer." +msgstr "" +"O arquivo %s foi enviado para o espaço de armazenamento da impressora e pode " +"ser visualizado na impressora." -msgid "Unable to perform boolean operation on model meshes. Only positive parts will be kept. You may fix the meshes and try agian." -msgstr "Não é possível executar a operação booleana em malhas de modelo. Somente partes positivas serão mantidas. Você pode consertar as malhas e tentar novamente." +msgid "" +"Unable to perform boolean operation on model meshes. Only positive parts " +"will be kept. You may fix the meshes and try agian." +msgstr "" +"Não é possível executar a operação booleana em malhas de modelo. Somente " +"partes positivas serão mantidas. Você pode consertar as malhas e tentar " +"novamente." #, boost-format msgid "Reason: part \"%1%\" is empty." @@ -5656,17 +6157,20 @@ msgid "Reason: \"%1%\" and another part have no intersection." msgstr "Motivo: \"%1%\" e outra parte não tem intersecção." msgid "" -"Are you sure you want to store original SVGs with their local paths into the 3MF file?\n" +"Are you sure you want to store original SVGs with their local paths into the " +"3MF file?\n" "If you hit 'NO', all SVGs in the project will not be editable any more." msgstr "" -"Você tem certeza de que deseja armazenar os SVGs originais com seus caminhos locais no arquivo 3MF?\n" +"Você tem certeza de que deseja armazenar os SVGs originais com seus caminhos " +"locais no arquivo 3MF?\n" "Se pressionar 'NÃO', todos os SVGs no projeto não serão mais editáveis." msgid "Private protection" msgstr "Proteção privada" msgid "Is the printer ready? Is the print sheet in place, empty and clean?" -msgstr "A impressora está pronta? O folha de impressão está no lugar, vazia e limpa?" +msgstr "" +"A impressora está pronta? O folha de impressão está no lugar, vazia e limpa?" msgid "Upload and Print" msgstr "Enviar e Imprimir" @@ -5685,7 +6189,9 @@ msgid "Send to printer" msgstr "Enviar para a impressora" msgid "Custom supports and color painting were removed before repairing." -msgstr "Os suportes personalizados e a pintura de cores foram removidos antes do reparo." +msgstr "" +"Os suportes personalizados e a pintura de cores foram removidos antes do " +"reparo." msgid "Optimize Rotation" msgstr "Otimizar Rotação" @@ -5735,12 +6241,22 @@ msgstr "Triângulos: %1%\n" msgid "Tips:" msgstr "Dicas:" -msgid "\"Fix Model\" feature is currently only on Windows. Please repair the model on Orca Slicer(windows) or CAD softwares." -msgstr "A função \"Corrigir Modelo\" está atualmente disponível apenas no Windows. Por favor, repare o modelo no Orca Slicer (Windows) ou softwares CAD." +msgid "" +"\"Fix Model\" feature is currently only on Windows. Please repair the model " +"on Orca Slicer(windows) or CAD softwares." +msgstr "" +"A função \"Corrigir Modelo\" está atualmente disponível apenas no Windows. " +"Por favor, repare o modelo no Orca Slicer (Windows) ou softwares CAD." #, c-format, boost-format -msgid "Plate% d: %s is not suggested to be used to print filament %s(%s). If you still want to do this printing, please set this filament's bed temperature to non zero." -msgstr "Mesa %d: %s não é recomendada para ser usada para imprimir filamento %s(%s). Se você ainda quiser fazer esta impressão, por favor, defina a temperatura de mesa deste filamento para zero" +msgid "" +"Plate% d: %s is not suggested to be used to print filament %s(%s). If you " +"still want to do this printing, please set this filament's bed temperature " +"to non zero." +msgstr "" +"Mesa %d: %s não é recomendada para ser usada para imprimir filamento %s(%s). " +"Se você ainda quiser fazer esta impressão, por favor, defina a temperatura " +"de mesa deste filamento para zero" msgid "Switching the language requires application restart.\n" msgstr "Mudar o idioma requer reiniciar o aplicativo.\n" @@ -5752,7 +6268,8 @@ msgid "Language selection" msgstr "Seleção de Idioma" msgid "Switching application language while some presets are modified." -msgstr "A mudança do idioma do aplicativo enquanto alguns presets estão modificados." +msgstr "" +"A mudança do idioma do aplicativo enquanto alguns presets estão modificados." msgid "Changing application language" msgstr "Alterando o idioma do aplicativo" @@ -5811,6 +6328,21 @@ msgstr "Imperial" msgid "Units" msgstr "Unidades" +msgid "Allow only one OrcaSlicer instance" +msgstr "" + +msgid "" +"On OSX there is always only one instance of app running by default. However " +"it is allowed to run multiple instances of same app from the command line. " +"In such case this settings will allow only one instance." +msgstr "" + +msgid "" +"If this is enabled, when starting OrcaSlicer and another instance of the " +"same OrcaSlicer is already running, that instance will be reactivated " +"instead." +msgstr "" + msgid "Home" msgstr "Início" @@ -5832,14 +6364,19 @@ msgid "" "Touchpad: Alt+move for rotation, Shift+move for panning." msgstr "" "Selecione o estilo de navegação da câmera.\n" -"Padrão: LMB + mover para rotacionar, RMB/MMB + mover para movimento lateral.\n" +"Padrão: LMB + mover para rotacionar, RMB/MMB + mover para movimento " +"lateral.\n" "Touchpad: Alt + mover para rotacionar, Shift + mover para movimento lateral." msgid "Zoom to mouse position" msgstr "Zoom para a posição do mouse" -msgid "Zoom in towards the mouse pointer's position in the 3D view, rather than the 2D window center." -msgstr "Dar zoom em direção à posição do ponteiro do mouse na visualização 3D, em vez do centro da janela 2D." +msgid "" +"Zoom in towards the mouse pointer's position in the 3D view, rather than the " +"2D window center." +msgstr "" +"Dar zoom em direção à posição do ponteiro do mouse na visualização 3D, em " +"vez do centro da janela 2D." msgid "Use free camera" msgstr "Usar câmera livre" @@ -5871,7 +6408,8 @@ msgstr "Volumes de descarga: Auto-calcular toda vez que a cor mudar." msgid "If enabled, auto-calculate everytime the color changed." msgstr "Se ativado, auto-calcular toda vez que a cor mudar." -msgid "Flushing volumes: Auto-calculate every time when the filament is changed." +msgid "" +"Flushing volumes: Auto-calculate every time when the filament is changed." msgstr "Volumes de descarga: Auto-calcular toda vez que a cor mudar." msgid "If enabled, auto-calculate every time when filament is changed" @@ -5880,14 +6418,27 @@ msgstr "Se ativo, auto-calcular toda vez que a cor mudar" msgid "Remember printer configuration" msgstr "Lembrar configuração da impressora" -msgid "If enabled, Orca will remember and switch filament/process configuration for each printer automatically." -msgstr "Se ativo, Orca vai lembrar e alternar a configuração de filamento/processo para cada impressora automaticamente." +msgid "" +"If enabled, Orca will remember and switch filament/process configuration for " +"each printer automatically." +msgstr "" +"Se ativo, Orca vai lembrar e alternar a configuração de filamento/processo " +"para cada impressora automaticamente." + +msgid "Multi-device Management(Take effect after restarting Studio)." +msgstr "" + +msgid "" +"With this option enabled, you can send a task to multiple devices at the " +"same time and manage multiple devices." +msgstr "" msgid "Network" msgstr "Rede" msgid "Auto sync user presets(Printer/Filament/Process)" -msgstr "Sincronização automática de presets do usuário(Impressora/Filamento/Processo)" +msgstr "" +"Sincronização automática de presets do usuário(Impressora/Filamento/Processo)" msgid "User Sync" msgstr "Sincronização do Usuário" @@ -5908,19 +6459,23 @@ msgid "Associate .3mf files to OrcaSlicer" msgstr "Associar arquivos .3mf ao OrcaSlicer" msgid "If enabled, sets OrcaSlicer as default application to open .3mf files" -msgstr "Se ativado, define OrcaSlicer como aplicativo padrão para abrir arquivos .3mf" +msgstr "" +"Se ativado, define OrcaSlicer como aplicativo padrão para abrir arquivos .3mf" msgid "Associate .stl files to OrcaSlicer" msgstr "Associar arquivos .stl ao OrcaSlicer" msgid "If enabled, sets OrcaSlicer as default application to open .stl files" -msgstr "Se ativado, define OrcaSlicer como aplicativo padrão para abrir arquivos .stl" +msgstr "" +"Se ativado, define OrcaSlicer como aplicativo padrão para abrir arquivos .stl" msgid "Associate .step/.stp files to OrcaSlicer" msgstr "Associar arquivos .step/.stp ao OrcaSlicer" msgid "If enabled, sets OrcaSlicer as default application to open .step files" -msgstr "Se ativado, define OrcaSlicer como aplicativo padrão para abrir arquivos .step" +msgstr "" +"Se ativado, define OrcaSlicer como aplicativo padrão para abrir arquivos ." +"step" msgid "Maximum recent projects" msgstr "Máximo de projetos recentes" @@ -5937,8 +6492,11 @@ msgstr "Sem avisos ao carregar 3MF com códigos G modificados" msgid "Auto-Backup" msgstr "Backup Automático" -msgid "Backup your project periodically for restoring from the occasional crash." -msgstr "Faça backup do seu projeto periodicamente para restaurar de falhas ocasionais." +msgid "" +"Backup your project periodically for restoring from the occasional crash." +msgstr "" +"Faça backup do seu projeto periodicamente para restaurar de falhas " +"ocasionais." msgid "every" msgstr "cada" @@ -6160,7 +6718,8 @@ msgid "Jump to model publish web page" msgstr "Ir para a página web de publicação de modelos" msgid "Note: The preparation may takes several minutes. Please be patiant." -msgstr "Nota: A preparação pode levar vários minutos. Por favor, seja paciente." +msgstr "" +"Nota: A preparação pode levar vários minutos. Por favor, seja paciente." msgid "Publish" msgstr "Publicar" @@ -6337,49 +6896,90 @@ msgid "Synchronizing device information time out" msgstr "Tempo limite de sincronização das informações do dispositivo" msgid "Cannot send the print job when the printer is updating firmware" -msgstr "Não é possível enviar o trabalho de impressão quando a impressora está atualizando o firmware" +msgstr "" +"Não é possível enviar o trabalho de impressão quando a impressora está " +"atualizando o firmware" -msgid "The printer is executing instructions. Please restart printing after it ends" -msgstr "A impressora está executando instruções. Por favor, reinicie a impressão após terminar" +msgid "" +"The printer is executing instructions. Please restart printing after it ends" +msgstr "" +"A impressora está executando instruções. Por favor, reinicie a impressão " +"após terminar" msgid "The printer is busy on other print job" msgstr "A impressora está ocupada com outro trabalho de impressão" #, c-format, boost-format -msgid "Filament %s exceeds the number of AMS slots. Please update the printer firmware to support AMS slot assignment." -msgstr "O filamento %s excede o número de slots AMS. Por favor, atualize o firmware da impressora para suportar a atribuição de slots AMS." +msgid "" +"Filament %s exceeds the number of AMS slots. Please update the printer " +"firmware to support AMS slot assignment." +msgstr "" +"O filamento %s excede o número de slots AMS. Por favor, atualize o firmware " +"da impressora para suportar a atribuição de slots AMS." -msgid "Filament exceeds the number of AMS slots. Please update the printer firmware to support AMS slot assignment." -msgstr "O filamento excede o número de slots AMS. Por favor, atualize o firmware da impressora para suportar a atribuição de slots AMS." +msgid "" +"Filament exceeds the number of AMS slots. Please update the printer firmware " +"to support AMS slot assignment." +msgstr "" +"O filamento excede o número de slots AMS. Por favor, atualize o firmware da " +"impressora para suportar a atribuição de slots AMS." -msgid "Filaments to AMS slots mappings have been established. You can click a filament above to change its mapping AMS slot" -msgstr "Foram estabelecidos mapeamentos de filamentos para slots AMS. Você pode clicar em um filamento acima para mudar seu slot AMS mapeado" +msgid "" +"Filaments to AMS slots mappings have been established. You can click a " +"filament above to change its mapping AMS slot" +msgstr "" +"Foram estabelecidos mapeamentos de filamentos para slots AMS. Você pode " +"clicar em um filamento acima para mudar seu slot AMS mapeado" -msgid "Please click each filament above to specify its mapping AMS slot before sending the print job" -msgstr "Por favor, clique em cada filamento acima para especificar seu slot AMS mapeado antes de enviar o trabalho de impressão" +msgid "" +"Please click each filament above to specify its mapping AMS slot before " +"sending the print job" +msgstr "" +"Por favor, clique em cada filamento acima para especificar seu slot AMS " +"mapeado antes de enviar o trabalho de impressão" #, c-format, boost-format -msgid "Filament %s does not match the filament in AMS slot %s. Please update the printer firmware to support AMS slot assignment." -msgstr "O filamento %s não corresponde ao filamento no slot AMS %s. Por favor, atualize o firmware da impressora para suportar a atribuição de slots AMS." +msgid "" +"Filament %s does not match the filament in AMS slot %s. Please update the " +"printer firmware to support AMS slot assignment." +msgstr "" +"O filamento %s não corresponde ao filamento no slot AMS %s. Por favor, " +"atualize o firmware da impressora para suportar a atribuição de slots AMS." -msgid "Filament does not match the filament in AMS slot. Please update the printer firmware to support AMS slot assignment." -msgstr "O filamento não corresponde ao filamento no slot AMS. Por favor, atualize o firmware da impressora para suportar a atribuição de slots AMS." +msgid "" +"Filament does not match the filament in AMS slot. Please update the printer " +"firmware to support AMS slot assignment." +msgstr "" +"O filamento não corresponde ao filamento no slot AMS. Por favor, atualize o " +"firmware da impressora para suportar a atribuição de slots AMS." -msgid "The printer firmware only supports sequential mapping of filament => AMS slot." -msgstr "O firmware da impressora só suporta mapeamento sequencial de filamento => slot AMS." +msgid "" +"The printer firmware only supports sequential mapping of filament => AMS " +"slot." +msgstr "" +"O firmware da impressora só suporta mapeamento sequencial de filamento => " +"slot AMS." msgid "An SD card needs to be inserted before printing." msgstr "Um cartão SD precisa ser inserido antes de imprimir." #, c-format, boost-format -msgid "The selected printer (%s) is incompatible with the chosen printer profile in the slicer (%s)." -msgstr "A impressora selecionada (%s) é incompatível com o perfil escolhido de impressora no fatiador (%s)." +msgid "" +"The selected printer (%s) is incompatible with the chosen printer profile in " +"the slicer (%s)." +msgstr "" +"A impressora selecionada (%s) é incompatível com o perfil escolhido de " +"impressora no fatiador (%s)." msgid "An SD card needs to be inserted to record timelapse." msgstr "Um cartão SD precisa ser inserido para gravar o timelapse." -msgid "Cannot send the print job to a printer whose firmware is required to get updated." -msgstr "Não é possível enviar o trabalho de impressão para uma impressora cujo firmware precisa ser atualizado." +msgid "" +"Cannot send the print job to a printer whose firmware is required to get " +"updated." +msgstr "" +"Não é possível enviar o trabalho de impressão para uma impressora cujo " +"firmware precisa ser atualizado." msgid "Cannot send the print job for empty plate" msgstr "Não é possível enviar o trabalho de impressão para uma mesa vazia" @@ -6387,11 +6987,18 @@ msgstr "Não é possível enviar o trabalho de impressão para uma mesa vazia" msgid "This printer does not support printing all plates" msgstr "Esta impressora não suporta a impressão em todas as mesas" -msgid "When enable spiral vase mode, machines with I3 structure will not generate timelapse videos." -msgstr "Quando o modo vaso espiral está ativado, máquinas com estrutura I3 não irão gerar vídeos timelapse." +msgid "" +"When enable spiral vase mode, machines with I3 structure will not generate " +"timelapse videos." +msgstr "" +"Quando o modo vaso espiral está ativado, máquinas com estrutura I3 não irão " +"gerar vídeos timelapse." -msgid "Timelapse is not supported because Print sequence is set to \"By object\"." -msgstr "Timelapse não é suportado porque a sequência de impressão está configurada para \"Por objeto\"." +msgid "" +"Timelapse is not supported because Print sequence is set to \"By object\"." +msgstr "" +"Timelapse não é suportado porque a sequência de impressão está configurada " +"para \"Por objeto\"." msgid "Errors" msgstr "Erros" @@ -6399,11 +7006,23 @@ msgstr "Erros" msgid "Please check the following:" msgstr "Por favor, verifique o seguinte:" -msgid "The printer type selected when generating G-Code is not consistent with the currently selected printer. It is recommended that you use the same printer type for slicing." -msgstr "O tipo de impressora selecionado ao gerar o G-Code não está consistente com a impressora atualmente selecionada. É recomendado que você use o mesmo tipo de impressora para fatiar." +msgid "" +"The printer type selected when generating G-Code is not consistent with the " +"currently selected printer. It is recommended that you use the same printer " +"type for slicing." +msgstr "" +"O tipo de impressora selecionado ao gerar o G-Code não está consistente com " +"a impressora atualmente selecionada. É recomendado que você use o mesmo tipo " +"de impressora para fatiar." -msgid "There are some unknown filaments in the AMS mappings. Please check whether they are the required filaments. If they are okay, press \"Confirm\" to start printing." -msgstr "Há alguns filamentos desconhecidos nos mapeamentos AMS. Por favor, verifique se eles são os filamentos necessários. Se estiverem corretos, pressione \"Confirmar\" para iniciar a impressão." +msgid "" +"There are some unknown filaments in the AMS mappings. Please check whether " +"they are the required filaments. If they are okay, press \"Confirm\" to " +"start printing." +msgstr "" +"Há alguns filamentos desconhecidos nos mapeamentos AMS. Por favor, verifique " +"se eles são os filamentos necessários. Se estiverem corretos, pressione " +"\"Confirmar\" para iniciar a impressão." #, c-format, boost-format msgid "nozzle in preset: %s %s" @@ -6413,21 +7032,39 @@ msgstr "bico no perfil: %s %s" msgid "nozzle memorized: %.1f %s" msgstr "bico memorizado: %.1f %s" -msgid "Your nozzle diameter in sliced file is not consistent with memorized nozzle. If you changed your nozzle lately, please go to Device > Printer Parts to change settings." -msgstr "Seu diâmetro de bico no arquivo fatiado não é consistente com o bico memorizado. Se você mudou seu bico recentemente, vá para Dispositivo > Partes da impressora para alterar as configurações." +msgid "" +"Your nozzle diameter in sliced file is not consistent with memorized nozzle. " +"If you changed your nozzle lately, please go to Device > Printer Parts to " +"change settings." +msgstr "" +"Seu diâmetro de bico no arquivo fatiado não é consistente com o bico " +"memorizado. Se você mudou seu bico recentemente, vá para Dispositivo > " +"Partes da impressora para alterar as configurações." #, c-format, boost-format -msgid "Printing high temperature material(%s material) with %s may cause nozzle damage" -msgstr "Imprimir material de temperatura alta (material %s) com %s poderá causar danos ao bico" +msgid "" +"Printing high temperature material(%s material) with %s may cause nozzle " +"damage" +msgstr "" +"Imprimir material de temperatura alta (material %s) com %s poderá causar " +"danos ao bico" msgid "Please fix the error above, otherwise printing cannot continue." -msgstr "Por favor, corrija o erro acima, caso contrário a impressão não poderá continuar." +msgstr "" +"Por favor, corrija o erro acima, caso contrário a impressão não poderá " +"continuar." -msgid "Please click the confirm button if you still want to proceed with printing." -msgstr "Por favor, clique no botão de confirmação se ainda deseja prosseguir com a impressão." +msgid "" +"Please click the confirm button if you still want to proceed with printing." +msgstr "" +"Por favor, clique no botão de confirmação se ainda deseja prosseguir com a " +"impressão." -msgid "Connecting to the printer. Unable to cancel during the connection process." -msgstr "Conectando à impressora. Não é possível cancelar durante o processo de conexão." +msgid "" +"Connecting to the printer. Unable to cancel during the connection process." +msgstr "" +"Conectando à impressora. Não é possível cancelar durante o processo de " +"conexão." msgid "Preparing print job" msgstr "Preparando trabalho de impressão" @@ -6438,8 +7075,12 @@ msgstr "Dados de arquivo de impressão anormais. Por favor, fatie novamente" msgid "The name length exceeds the limit." msgstr "O comprimento do nome excede o limite." -msgid "Caution to use! Flow calibration on Textured PEI Plate may fail due to the scattered surface." -msgstr "Cuidado ao usar! A calibração de fluxo no PEI Texturizado pode falhar devido à superfície irregular." +msgid "" +"Caution to use! Flow calibration on Textured PEI Plate may fail due to the " +"scattered surface." +msgstr "" +"Cuidado ao usar! A calibração de fluxo no PEI Texturizado pode falhar devido " +"à superfície irregular." msgid "Automatic flow calibration using Micro Lidar" msgstr "Calibração automática de fluxo usando Micro Lidar" @@ -6447,17 +7088,26 @@ msgstr "Calibração automática de fluxo usando Micro Lidar" msgid "Modifying the device name" msgstr "Modificando o nome do dispositivo" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "Enviar para o cartão SD da impressora" msgid "Cannot send the print task when the upgrade is in progress" -msgstr "Não é possível enviar a tarefa de impressão quando a atualização está em progresso" +msgstr "" +"Não é possível enviar a tarefa de impressão quando a atualização está em " +"progresso" msgid "The selected printer is incompatible with the chosen printer presets." -msgstr "A impressora selecionada é incompatível com os perfis de impressora escolhidos." +msgstr "" +"A impressora selecionada é incompatível com os perfis de impressora " +"escolhidos." msgid "An SD card needs to be inserted before send to printer SD card." -msgstr "Um cartão SD precisa ser inserido antes de enviar para o cartão SD da impressora." +msgstr "" +"Um cartão SD precisa ser inserido antes de enviar para o cartão SD da " +"impressora." msgid "The printer is required to be in the same LAN as Orca Slicer." msgstr "A impressora deve estar na mesma LAN do Orca Slicer." @@ -6498,6 +7148,26 @@ msgstr "Tempo esgotado ao receber o relatório de login" msgid "Unknown Failure" msgstr "Falha desconhecida" +msgid "" +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." +msgstr "" + +msgid "Can't find Pin Code?" +msgstr "" + +msgid "Pin Code" +msgstr "" + +msgid "Binding..." +msgstr "" + +msgid "Please confirm on the printer screen" +msgstr "" + +msgid "Log in failed. Please check the Pin Code." +msgstr "" + msgid "Log in printer" msgstr "Entrar na impressora" @@ -6513,8 +7183,19 @@ msgstr "Ler e aceitar" msgid "Terms and Conditions" msgstr "Termos e Condições" -msgid "Thank you for purchasing a Bambu Lab device.Before using your Bambu Lab device, please read the termsand conditions.By clicking to agree to use your Bambu Lab device, you agree to abide by the Privacy Policyand Terms of Use(collectively, the \"Terms\"). If you do not comply with or agree to the Bambu Lab Privacy Policy, please do not use Bambu Lab equipment and services." -msgstr "Obrigado por adquirir um dispositivo Bambu Lab. Antes de usar seu dispositivo Bambu Lab, leia os termos e condições. Ao clicar para concordar em usar seu dispositivo Bambu Lab, você concorda em cumprir a Política de Privacidade e os Termos de Uso (coletivamente, os \"Termos\"). Se você não concordar ou não cumprir com a Política de Privacidade da Bambu Lab, não use os equipamentos e serviços da Bambu Lab." +msgid "" +"Thank you for purchasing a Bambu Lab device.Before using your Bambu Lab " +"device, please read the termsand conditions.By clicking to agree to use your " +"Bambu Lab device, you agree to abide by the Privacy Policyand Terms of " +"Use(collectively, the \"Terms\"). If you do not comply with or agree to the " +"Bambu Lab Privacy Policy, please do not use Bambu Lab equipment and services." +msgstr "" +"Obrigado por adquirir um dispositivo Bambu Lab. Antes de usar seu " +"dispositivo Bambu Lab, leia os termos e condições. Ao clicar para concordar " +"em usar seu dispositivo Bambu Lab, você concorda em cumprir a Política de " +"Privacidade e os Termos de Uso (coletivamente, os \"Termos\"). Se você não " +"concordar ou não cumprir com a Política de Privacidade da Bambu Lab, não use " +"os equipamentos e serviços da Bambu Lab." msgid "and" msgstr "e" @@ -6529,8 +7210,32 @@ msgid "Statement about User Experience Improvement Program" msgstr "Declaração sobre o Programa de Melhoria da Experiência do Usuário" #, c-format, boost-format -msgid "In the 3D Printing community, we learn from each other's successes and failures to adjust our own slicing parameters and settings. %s follows the same principle and uses machine learning to improve its performance from the successes and failures of the vast number of prints by our users. We are training %s to be smarter by feeding them the real-world data. If you are willing, this service will access information from your error logs and usage logs, which may include information described in Privacy Policy. We will not collect any Personal Data by which an individual can be identified directly or indirectly, including without limitation names, addresses, payment information, or phone numbers. By enabling this service, you agree to these terms and the statement about Privacy Policy." -msgstr "Na comunidade de Impressão 3D, aprendemos com os sucessos e falhas uns dos outros para ajustar nossos próprios parâmetros de fatiamento e configurações. %s segue o mesmo princípio e utiliza aprendizado de máquina para melhorar seu desempenho a partir dos sucessos e falhas do grande número de impressões feitas por nossos usuários. Estamos treinando %s para ser mais inteligente alimentando-os com dados do mundo real. Se você concordar, este serviço acessará informações de seus registros de erros e registros de uso, que podem incluir informações descritas na Política de Privacidade. Não coletaremos quaisquer Dados Pessoais pelos quais um indivíduo possa ser identificado diretamente ou indiretamente, incluindo, sem limitação, nomes, endereços, informações de pagamento ou números de telefone. Ao ativar este serviço, você concorda com estes termos e com a declaração sobre a Política de Privacidade." +msgid "" +"In the 3D Printing community, we learn from each other's successes and " +"failures to adjust our own slicing parameters and settings. %s follows the " +"same principle and uses machine learning to improve its performance from the " +"successes and failures of the vast number of prints by our users. We are " +"training %s to be smarter by feeding them the real-world data. If you are " +"willing, this service will access information from your error logs and usage " +"logs, which may include information described in Privacy Policy. We will " +"not collect any Personal Data by which an individual can be identified " +"directly or indirectly, including without limitation names, addresses, " +"payment information, or phone numbers. By enabling this service, you agree " +"to these terms and the statement about Privacy Policy." +msgstr "" +"Na comunidade de Impressão 3D, aprendemos com os sucessos e falhas uns dos " +"outros para ajustar nossos próprios parâmetros de fatiamento e " +"configurações. %s segue o mesmo princípio e utiliza aprendizado de máquina " +"para melhorar seu desempenho a partir dos sucessos e falhas do grande número " +"de impressões feitas por nossos usuários. Estamos treinando %s para ser mais " +"inteligente alimentando-os com dados do mundo real. Se você concordar, este " +"serviço acessará informações de seus registros de erros e registros de uso, " +"que podem incluir informações descritas na Política de Privacidade. Não " +"coletaremos quaisquer Dados Pessoais pelos quais um indivíduo possa ser " +"identificado diretamente ou indiretamente, incluindo, sem limitação, nomes, " +"endereços, informações de pagamento ou números de telefone. Ao ativar este " +"serviço, você concorda com estes termos e com a declaração sobre a Política " +"de Privacidade." msgid "Statement on User Experience Improvement Plan" msgstr "Declaração sobre o Plano de Melhoria da Experiência do Usuário" @@ -6548,7 +7253,8 @@ msgid "Please log in first." msgstr "Por favor, faça login primeiro." msgid "There was a problem connecting to the printer. Please try again." -msgstr "Houve um problema ao conectar-se à impressora. Por favor, tente novamente." +msgstr "" +"Houve um problema ao conectar-se à impressora. Por favor, tente novamente." msgid "Failed to log out." msgstr "Falha ao desconectar." @@ -6565,23 +7271,36 @@ msgid "Search in preset" msgstr "Pesquisar nos predefinidos" msgid "Click to reset all settings to the last saved preset." -msgstr "Clique para redefinir todas as configurações para o último predefinido salvo." +msgstr "" +"Clique para redefinir todas as configurações para o último predefinido salvo." -msgid "Prime tower is required for smooth timeplase. There may be flaws on the model without prime tower. Are you sure you want to disable prime tower?" -msgstr "A torre de purga é necessária para um timelapse suave. Pode haver falhas no modelo sem a torre de purga. Tem certeza de que deseja desativar a torre de purga?" +msgid "" +"Prime tower is required for smooth timeplase. There may be flaws on the " +"model without prime tower. Are you sure you want to disable prime tower?" +msgstr "" +"A torre de purga é necessária para um timelapse suave. Pode haver falhas no " +"modelo sem a torre de purga. Tem certeza de que deseja desativar a torre de " +"purga?" -msgid "Prime tower is required for smooth timelapse. There may be flaws on the model without prime tower. Do you want to enable prime tower?" -msgstr "A torre de purga é necessária para um timelapse suave. Pode haver falhas no modelo sem a torre de purga. Deseja ativar a torre de purga?" +msgid "" +"Prime tower is required for smooth timelapse. There may be flaws on the " +"model without prime tower. Do you want to enable prime tower?" +msgstr "" +"A torre de purga é necessária para um timelapse suave. Pode haver falhas no " +"modelo sem a torre de purga. Deseja ativar a torre de purga?" msgid "Still print by object?" msgstr "Ainda imprimir por objeto?" msgid "" -"We have added an experimental style \"Tree Slim\" that features smaller support volume but weaker strength.\n" +"We have added an experimental style \"Tree Slim\" that features smaller " +"support volume but weaker strength.\n" "We recommend using it with: 0 interface layers, 0 top distance, 2 walls." msgstr "" -"Adicionamos um estilo experimental \"Tree Slim\" que apresenta um volume de suporte menor, mas uma resistência mais fraca.\n" -"Recomendamos usar com: 0 camadas de interface, 0 distância superior, 2 paredes." +"Adicionamos um estilo experimental \"Tree Slim\" que apresenta um volume de " +"suporte menor, mas uma resistência mais fraca.\n" +"Recomendamos usar com: 0 camadas de interface, 0 distância superior, 2 " +"paredes." msgid "" "Change these settings automatically? \n" @@ -6592,18 +7311,35 @@ msgstr "" "Sim - Alterar essas configurações automaticamente\n" "Não - Não alterar essas configurações para mim" -msgid "For \"Tree Strong\" and \"Tree Hybrid\" styles, we recommend the following settings: at least 2 interface layers, at least 0.1mm top z distance or using support materials on interface." -msgstr "Para os estilos \"Tree Strong\" e \"Tree Hybrid\", recomendamos as seguintes configurações: pelo menos 2 camadas de interface, pelo menos 0.1mm de distância superior em z ou uso de materiais de suporte na interface." +msgid "" +"For \"Tree Strong\" and \"Tree Hybrid\" styles, we recommend the following " +"settings: at least 2 interface layers, at least 0.1mm top z distance or " +"using support materials on interface." +msgstr "" +"Para os estilos \"Tree Strong\" e \"Tree Hybrid\", recomendamos as seguintes " +"configurações: pelo menos 2 camadas de interface, pelo menos 0.1mm de " +"distância superior em z ou uso de materiais de suporte na interface." msgid "" -"When using support material for the support interface, We recommend the following settings:\n" -"0 top z distance, 0 interface spacing, concentric pattern and disable independent support layer height" +"When using support material for the support interface, We recommend the " +"following settings:\n" +"0 top z distance, 0 interface spacing, concentric pattern and disable " +"independent support layer height" msgstr "" -"Ao usar material de suporte para a interface de suporte, recomendamos as seguintes configurações:\n" -"distância z superior 0, espaçamento de interface 0, padrão concêntrico e desabilitar altura de camada de suporte independente" +"Ao usar material de suporte para a interface de suporte, recomendamos as " +"seguintes configurações:\n" +"distância z superior 0, espaçamento de interface 0, padrão concêntrico e " +"desabilitar altura de camada de suporte independente" -msgid "Enabling this option will modify the model's shape. If your print requires precise dimensions or is part of an assembly, it's important to double-check whether this change in geometry impacts the functionality of your print." -msgstr "Habilitar esta opção modificará a forma do modelo. Se sua impressão exigir dimensões precisas ou fizer parte de uma montagem, é importante verificar duplamente se essa mudança na geometria afeta a funcionalidade da sua impressão." +msgid "" +"Enabling this option will modify the model's shape. If your print requires " +"precise dimensions or is part of an assembly, it's important to double-check " +"whether this change in geometry impacts the functionality of your print." +msgstr "" +"Habilitar esta opção modificará a forma do modelo. Se sua impressão exigir " +"dimensões precisas ou fizer parte de uma montagem, é importante verificar " +"duplamente se essa mudança na geometria afeta a funcionalidade da sua " +"impressão." msgid "Are you sure you want to enable this option?" msgstr "Tem certeza de que deseja habilitar esta opção?" @@ -6617,8 +7353,13 @@ msgstr "" "A altura da camada é muito pequena.\n" "Ela será definida como altura mínima da camada\n" -msgid "Layer height exceeds the limit in Printer Settings -> Extruder -> Layer height limits ,this may cause printing quality issues." -msgstr "A altura da camada excede o limite em Configurações da Impressora -> Extrusora -> Limites de altura da camada, isso pode causar problemas de qualidade de impressão." +msgid "" +"Layer height exceeds the limit in Printer Settings -> Extruder -> Layer " +"height limits ,this may cause printing quality issues." +msgstr "" +"A altura da camada excede o limite em Configurações da Impressora -> " +"Extrusora -> Limites de altura da camada, isso pode causar problemas de " +"qualidade de impressão." msgid "Adjust to the set range automatically? \n" msgstr "Ajustar automaticamente à faixa definida? \n" @@ -6629,18 +7370,39 @@ msgstr "Ajustar" msgid "Ignore" msgstr "Ignorar" -msgid "Experimental feature: Retracting and cutting off the filament at a greater distance during filament changes to minimize flush.Although it can notably reduce flush, it may also elevate the risk of nozzle clogs or other printing complications." -msgstr "Recurso experimental: Retrair e cortar o filamento a uma distância maior durante mudanças de filamento para minimizar a descarga. Embora possa reduzir notavelmente a descarga, ele também pode elevar o risco de bolhas no bico ou outras complicações de impressão." - -msgid "Experimental feature: Retracting and cutting off the filament at a greater distance during filament changes to minimize flush.Although it can notably reduce flush, it may also elevate the risk of nozzle clogs or other printing complications.Please use with the latest printer firmware." -msgstr "Recurso experimental: Retrair e cortar o filamento a uma distância maior durante mudanças de filamento para minimizar a descarga. Embora possa reduzir notavelmente a descarga, ele também pode elevar o risco de bolhas no bico ou outras complicações de impressão. Por favor, use com o firmware mais recente da impressora." +msgid "" +"Experimental feature: Retracting and cutting off the filament at a greater " +"distance during filament changes to minimize flush.Although it can notably " +"reduce flush, it may also elevate the risk of nozzle clogs or other " +"printing complications." +msgstr "" +"Recurso experimental: Retrair e cortar o filamento a uma distância maior " +"durante mudanças de filamento para minimizar a descarga. Embora possa " +"reduzir notavelmente a descarga, ele também pode elevar o risco de bolhas no " +"bico ou outras complicações de impressão." msgid "" -"When recording timelapse without toolhead, it is recommended to add a \"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add Primitive\"->\"Timelapse Wipe Tower\"." +"Experimental feature: Retracting and cutting off the filament at a greater " +"distance during filament changes to minimize flush.Although it can notably " +"reduce flush, it may also elevate the risk of nozzle clogs or other printing " +"complications.Please use with the latest printer firmware." msgstr "" -"Ao gravar um timelapse sem aparecer a hotend, é recomendável adicionar uma \"Torre de Limpeza de Timelapse\" \n" -"clique com o botão direito na posição vazia da mesa e escolha \"Adicionar Primitivo\"->\"Torre de Limpeza de Timelapse\"." +"Recurso experimental: Retrair e cortar o filamento a uma distância maior " +"durante mudanças de filamento para minimizar a descarga. Embora possa " +"reduzir notavelmente a descarga, ele também pode elevar o risco de bolhas no " +"bico ou outras complicações de impressão. Por favor, use com o firmware mais " +"recente da impressora." + +msgid "" +"When recording timelapse without toolhead, it is recommended to add a " +"\"Timelapse Wipe Tower\" \n" +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." +msgstr "" +"Ao gravar um timelapse sem aparecer a hotend, é recomendável adicionar uma " +"\"Torre de Limpeza de Timelapse\" \n" +"clique com o botão direito na posição vazia da mesa e escolha \"Adicionar " +"Primitivo\"->\"Torre de Limpeza de Timelapse\"." msgid "Line width" msgstr "Largura da linha" @@ -6678,8 +7440,15 @@ msgstr "Velocidade de outras camadas" msgid "Overhang speed" msgstr "Velocidade em overhangs" -msgid "This is the speed for various overhang degrees. Overhang degrees are expressed as a percentage of line width. 0 speed means no slowing down for the overhang degree range and wall speed is used" -msgstr "Esta é a velocidade para vários graus de avanço. Os graus de avanço são expressos como uma porcentagem da largura da linha. A velocidade 0 significa que não há desaceleração para o intervalo de graus de avanço e a velocidade do perímetro é usada" +msgid "" +"This is the speed for various overhang degrees. Overhang degrees are " +"expressed as a percentage of line width. 0 speed means no slowing down for " +"the overhang degree range and wall speed is used" +msgstr "" +"Esta é a velocidade para vários graus de avanço. Os graus de avanço são " +"expressos como uma porcentagem da largura da linha. A velocidade 0 significa " +"que não há desaceleração para o intervalo de graus de avanço e a velocidade " +"do perímetro é usada" msgid "Bridge" msgstr "Ponte" @@ -6726,16 +7495,20 @@ msgstr "Frequente" #, c-format, boost-format msgid "" "Following line %s contains reserved keywords.\n" -"Please remove it, or will beat G-code visualization and printing time estimation." +"Please remove it, or will beat G-code visualization and printing time " +"estimation." msgid_plural "" "Following lines %s contain reserved keywords.\n" -"Please remove them, or will beat G-code visualization and printing time estimation." +"Please remove them, or will beat G-code visualization and printing time " +"estimation." msgstr[0] "" "A linha %s seguinte contém palavras-chave reservadas.\n" -"Por favor, remova-a, ou afetará a visualização do código G e a estimativa de tempo de impressão." +"Por favor, remova-a, ou afetará a visualização do código G e a estimativa de " +"tempo de impressão." msgstr[1] "" "As linhas %s seguintes contêm palavras-chave reservadas.\n" -"Por favor, remova-as, ou afetará a visualização do código G e a estimativa de tempo de impressão." +"Por favor, remova-as, ou afetará a visualização do código G e a estimativa " +"de tempo de impressão." msgid "Reserved keywords found" msgstr "Palavras-chave reservadas encontradas" @@ -6753,7 +7526,8 @@ msgid "Recommended nozzle temperature" msgstr "Temperatura recomendada do bico" msgid "Recommended nozzle temperature range of this filament. 0 means no set" -msgstr "Faixa de temperatura recomendada para esta boquilha. 0 significa não definido" +msgstr "" +"Faixa de temperatura recomendada para esta boquilha. 0 significa não definido" msgid "Print chamber temperature" msgstr "Temperatura da câmara de impressão" @@ -6770,26 +7544,44 @@ msgstr "Temperatura do bico ao imprimir" msgid "Cool plate" msgstr "Cool plate (Mesa fria)" -msgid "Bed temperature when cool plate is installed. Value 0 means the filament does not support to print on the Cool Plate" -msgstr "Temperatura da mesa quando a cool plate (mesa fria) está instalada. Valor 0 significa que o filamento não suporta impressão na cool plate" +msgid "" +"Bed temperature when cool plate is installed. Value 0 means the filament " +"does not support to print on the Cool Plate" +msgstr "" +"Temperatura da mesa quando a cool plate (mesa fria) está instalada. Valor 0 " +"significa que o filamento não suporta impressão na cool plate" msgid "Engineering plate" msgstr "Mesa de engenharia" -msgid "Bed temperature when engineering plate is installed. Value 0 means the filament does not support to print on the Engineering Plate" -msgstr "Temperatura da mesa quando a mesa de engenharia está instalada. Valor 0 significa que o filamento não suporta impressão na Mesa de Engenharia" +msgid "" +"Bed temperature when engineering plate is installed. Value 0 means the " +"filament does not support to print on the Engineering Plate" +msgstr "" +"Temperatura da mesa quando a mesa de engenharia está instalada. Valor 0 " +"significa que o filamento não suporta impressão na Mesa de Engenharia" msgid "Smooth PEI Plate / High Temp Plate" msgstr "Mesa PEI lisa / Mesa de alta temperatura" -msgid "Bed temperature when Smooth PEI Plate/High temperature plate is installed. Value 0 means the filament does not support to print on the Smooth PEI Plate/High Temp Plate" -msgstr "Temperatura da mesa quando a mesa PEI lisa/ de alta temperatura está instalada. O valor 0 significa que o filamento não suporta a impressão na Mesa PEI lisa/Mesa de Alta Temperatura" +msgid "" +"Bed temperature when Smooth PEI Plate/High temperature plate is installed. " +"Value 0 means the filament does not support to print on the Smooth PEI Plate/" +"High Temp Plate" +msgstr "" +"Temperatura da mesa quando a mesa PEI lisa/ de alta temperatura está " +"instalada. O valor 0 significa que o filamento não suporta a impressão na " +"Mesa PEI lisa/Mesa de Alta Temperatura" msgid "Textured PEI Plate" msgstr "Mesa PEI Texturizada" -msgid "Bed temperature when Textured PEI Plate is installed. Value 0 means the filament does not support to print on the Textured PEI Plate" -msgstr "Temperatura da mesa quando a mesa PEI texturizada está instalada. O valor 0 significa que o filamento não suporta impressão na mesa PEI texturizada" +msgid "" +"Bed temperature when Textured PEI Plate is installed. Value 0 means the " +"filament does not support to print on the Textured PEI Plate" +msgstr "" +"Temperatura da mesa quando a mesa PEI texturizada está instalada. O valor 0 " +"significa que o filamento não suporta impressão na mesa PEI texturizada" msgid "Volumetric speed limitation" msgstr "Limitação de fluxo volumétrico" @@ -6806,14 +7598,27 @@ msgstr "Ventilador de resfriamento da peça" msgid "Min fan speed threshold" msgstr "Limiar de velocidade mínima do ventilador" -msgid "Part cooling fan speed will start to run at min speed when the estimated layer time is no longer than the layer time in setting. When layer time is shorter than threshold, fan speed is interpolated between the minimum and maximum fan speed according to layer printing time" -msgstr "A velocidade do ventilador de resfriamento da peça começará a funcionar na velocidade mínima quando o tempo estimado da camada não for mais longo do que o tempo da camada ajustado. Quando o tempo da camada for menor que o limite, a velocidade do ventilador é interpolada entre a velocidade mínima e máxima de acordo com o tempo de impressão da camada" +msgid "" +"Part cooling fan speed will start to run at min speed when the estimated " +"layer time is no longer than the layer time in setting. When layer time is " +"shorter than threshold, fan speed is interpolated between the minimum and " +"maximum fan speed according to layer printing time" +msgstr "" +"A velocidade do ventilador de resfriamento da peça começará a funcionar na " +"velocidade mínima quando o tempo estimado da camada não for mais longo do " +"que o tempo da camada ajustado. Quando o tempo da camada for menor que o " +"limite, a velocidade do ventilador é interpolada entre a velocidade mínima e " +"máxima de acordo com o tempo de impressão da camada" msgid "Max fan speed threshold" msgstr "Limiar de velocidade máxima do ventilador" -msgid "Part cooling fan speed will be max when the estimated layer time is shorter than the setting value" -msgstr "A velocidade do ventilador de resfriamento da peça será máxima quando o tempo estimado da camada for menor que o valor ajustado" +msgid "" +"Part cooling fan speed will be max when the estimated layer time is shorter " +"than the setting value" +msgstr "" +"A velocidade do ventilador de resfriamento da peça será máxima quando o " +"tempo estimado da camada for menor que o valor ajustado" msgid "Auxiliary part cooling fan" msgstr "Ventilador auxiliar de resfriamento da peça" @@ -6840,13 +7645,15 @@ msgid "Wipe tower parameters" msgstr "Parâmetros da torre de limpeza" msgid "Toolchange parameters with single extruder MM printers" -msgstr "Parâmetros de troca de ferramentas com impressoras MM de extrusora única" +msgstr "" +"Parâmetros de troca de ferramentas com impressoras MM de extrusora única" msgid "Ramming settings" msgstr "Configurações de empurrar" msgid "Toolchange parameters with multi extruder MM printers" -msgstr "Parâmetros de troca de ferramentas com impressoras MM de múltiplas extrusoras" +msgstr "" +"Parâmetros de troca de ferramentas com impressoras MM de múltiplas extrusoras" msgid "Printable space" msgstr "Espaço de impressão" @@ -6937,7 +7744,8 @@ msgid "" "\n" "Shall I disable it in order to enable Firmware Retraction?" msgstr "" -"A opção de Limpeza não está disponível ao usar o modo de Retração de Firmware.\n" +"A opção de Limpeza não está disponível ao usar o modo de Retração de " +"Firmware.\n" "\n" "Deseja desativá-lo para habilitar a Retração de Firmware?" @@ -6948,8 +7756,12 @@ msgid "Detached" msgstr "Desanexado" #, c-format, boost-format -msgid "%d Filament Preset and %d Process Preset is attached to this printer. Those presets would be deleted if the printer is deleted." -msgstr "%d Preset de Filamento e %d Preset de Processo estão vinculados a esta impressora. Esses presets serão excluídos se a impressora for deletada." +msgid "" +"%d Filament Preset and %d Process Preset is attached to this printer. Those " +"presets would be deleted if the printer is deleted." +msgstr "" +"%d Preset de Filamento e %d Preset de Processo estão vinculados a esta " +"impressora. Esses presets serão excluídos se a impressora for deletada." msgid "Presets inherited by other presets can not be deleted!" msgstr "Os perfis herdados por outros perfis não podem ser excluídos!" @@ -6971,10 +7783,12 @@ msgstr[1] "Os seguintes perfis também serão excluídos." msgid "" "Are you sure to delete the selected preset? \n" -"If the preset corresponds to a filament currently in use on your printer, please reset the filament information for that slot." +"If the preset corresponds to a filament currently in use on your printer, " +"please reset the filament information for that slot." msgstr "" "Tem certeza de que deseja excluir o perfil selecionado? \n" -"Se o perfil corresponde a um filamento atualmente em uso em sua impressora, redefina as informações do filamento para esse slot." +"Se o perfil corresponde a um filamento atualmente em uso em sua impressora, " +"redefina as informações do filamento para esse slot." #, boost-format msgid "Are you sure to %1% the selected preset?" @@ -6990,7 +7804,8 @@ msgid "Click to reset current value and attach to the global value." msgstr "Clique para redefinir o valor atual e anexá-lo ao valor global." msgid "Click to drop current modify and reset to saved value." -msgstr "Clique para descartar a modificação atual e redefinir para o valor salvo." +msgstr "" +"Clique para descartar a modificação atual e redefinir para o valor salvo." msgid "Process Settings" msgstr "Configurações do Processo" @@ -7061,12 +7876,20 @@ msgid "Preset \"%1%\" contains the following unsaved changes:" msgstr "O perfil \"%1%\" contém as seguintes alterações não salvas:" #, boost-format -msgid "Preset \"%1%\" is not compatible with the new printer profile and it contains the following unsaved changes:" -msgstr "O perfil \"%1%\" não é compatível com o novo perfil da impressora e contém as seguintes alterações não salvas:" +msgid "" +"Preset \"%1%\" is not compatible with the new printer profile and it " +"contains the following unsaved changes:" +msgstr "" +"O perfil \"%1%\" não é compatível com o novo perfil da impressora e contém " +"as seguintes alterações não salvas:" #, boost-format -msgid "Preset \"%1%\" is not compatible with the new process profile and it contains the following unsaved changes:" -msgstr "O perfil \"%1%\" não é compatível com o novo perfil de processo e contém as seguintes alterações não salvas:" +msgid "" +"Preset \"%1%\" is not compatible with the new process profile and it " +"contains the following unsaved changes:" +msgstr "" +"O perfil \"%1%\" não é compatível com o novo perfil de processo e contém as " +"seguintes alterações não salvas:" #, boost-format msgid "You have changed some settings of preset \"%1%\". " @@ -7081,20 +7904,27 @@ msgstr "" msgid "" "\n" -"Would you like to keep these changed settings(modified value) after switching preset?" +"Would you like to keep these changed settings(modified value) after " +"switching preset?" msgstr "" "\n" -"Você gostaria de manter estas configurações alteradas (valores modificados) após mudar o preset?" +"Você gostaria de manter estas configurações alteradas (valores modificados) " +"após mudar o preset?" -msgid "You have previously modified your settings and are about to overwrite them with new ones." -msgstr "Você modificou suas configurações anteriormente e está prestes a substituí-las por novas." +msgid "" +"You have previously modified your settings and are about to overwrite them " +"with new ones." +msgstr "" +"Você modificou suas configurações anteriormente e está prestes a substituí-" +"las por novas." msgid "" "\n" "Do you want to keep your current modified settings, or use preset settings?" msgstr "" "\n" -"Você quer manter suas configurações atuais modificadas ou usar as configurações predefinidas?" +"Você quer manter suas configurações atuais modificadas ou usar as " +"configurações predefinidas?" msgid "" "\n" @@ -7121,21 +7951,29 @@ msgstr "Selecione os perfis para comparar" msgid "Transfer" msgstr "Transferir" -msgid "You can only transfer to current active profile because it has been modified." -msgstr "Só é possível transferir para o perfil ativo atual porque ele foi modificado." +msgid "" +"You can only transfer to current active profile because it has been modified." +msgstr "" +"Só é possível transferir para o perfil ativo atual porque ele foi modificado." msgid "" "Transfer the selected options from left preset to the right.\n" -"Note: New modified presets will be selected in settings tabs after close this dialog." +"Note: New modified presets will be selected in settings tabs after close " +"this dialog." msgstr "" "Transfira as opções selecionadas do perfil à esquerda para o da direita.\n" -"Nota: Novos perfis modificados serão selecionados nas guias de configurações após fechar este diálogo." +"Nota: Novos perfis modificados serão selecionados nas guias de configurações " +"após fechar este diálogo." msgid "Transfer values from left to right" msgstr "Transferir valores da esquerda para a direita" -msgid "If enabled, this dialog can be used for transfer selected values from left to right preset." -msgstr "Se ativo, este diálogo pode ser usado para transferir valores selecionados do perfil à esquerda para o da direita." +msgid "" +"If enabled, this dialog can be used for transfer selected values from left " +"to right preset." +msgstr "" +"Se ativo, este diálogo pode ser usado para transferir valores selecionados " +"do perfil à esquerda para o da direita." msgid "Add File" msgstr "Adicionar arquivo" @@ -7196,7 +8034,8 @@ msgid "" "%s will update the configuration package, Otherwise it won't be able to start" msgstr "" "O pacote de configuração é incompatível com a aplicação atual.\n" -"%s atualizará o pacote de configuração, caso contrário, não será possível iniciar" +"%s atualizará o pacote de configuração, caso contrário, não será possível " +"iniciar" #, c-format, boost-format msgid "Exit %s" @@ -7218,13 +8057,27 @@ msgid "Ramming customization" msgstr "Customização de ramming" msgid "" -"Ramming denotes the rapid extrusion just before a tool change in a single-extruder MM printer. Its purpose is to properly shape the end of the unloaded filament so it does not prevent insertion of the new filament and can itself be reinserted later. This phase is important and different materials can require different extrusion speeds to get the good shape. For this reason, the extrusion rates during ramming are adjustable.\n" +"Ramming denotes the rapid extrusion just before a tool change in a single-" +"extruder MM printer. Its purpose is to properly shape the end of the " +"unloaded filament so it does not prevent insertion of the new filament and " +"can itself be reinserted later. This phase is important and different " +"materials can require different extrusion speeds to get the good shape. For " +"this reason, the extrusion rates during ramming are adjustable.\n" "\n" -"This is an expert-level setting, incorrect adjustment will likely lead to jams, extruder wheel grinding into filament etc." +"This is an expert-level setting, incorrect adjustment will likely lead to " +"jams, extruder wheel grinding into filament etc." msgstr "" -"O moldeamento de extremidade denota a extrusão rápida logo antes de uma troca de ferramentas em uma impressora MM de extrusão única. Seu propósito é dar forma adequadamente à extremidade do filamento descarregado para que não impeça a inserção do novo filamento e possa ser reinserido posteriormente. Essa fase é importante e diferentes materiais podem exigir velocidades de extrusão diferentes para obter uma boa forma. Por esse motivo, as taxas de extrusão durante o moldeamento de extremidade são ajustáveis.\n" +"O moldeamento de extremidade denota a extrusão rápida logo antes de uma " +"troca de ferramentas em uma impressora MM de extrusão única. Seu propósito é " +"dar forma adequadamente à extremidade do filamento descarregado para que não " +"impeça a inserção do novo filamento e possa ser reinserido posteriormente. " +"Essa fase é importante e diferentes materiais podem exigir velocidades de " +"extrusão diferentes para obter uma boa forma. Por esse motivo, as taxas de " +"extrusão durante o moldeamento de extremidade são ajustáveis.\n" "\n" -"Esta é uma configuração de nível especialista, ajustes incorretos provavelmente resultarão em travamentos, moagem da roda de extrusão no filamento, etc." +"Esta é uma configuração de nível especialista, ajustes incorretos " +"provavelmente resultarão em travamentos, moagem da roda de extrusão no " +"filamento, etc." msgid "Total ramming time" msgstr "Tempo total de moldeamento de extremidade" @@ -7250,8 +8103,13 @@ msgstr "Recalcular" msgid "Flushing volumes for filament change" msgstr "Volumes de limpeza para troca de filamento" -msgid "Orca would re-calculate your flushing volumes everytime the filaments color changed. You could disable the auto-calculate in Orca Slicer > Preferences" -msgstr "O Orca recalculará seus volumes de limpeza toda vez que a cor dos filamentos for alterada. Você pode desativar o cálculo automático em Orca Slicer > Preferências" +msgid "" +"Orca would re-calculate your flushing volumes everytime the filaments color " +"changed. You could disable the auto-calculate in Orca Slicer > Preferences" +msgstr "" +"O Orca recalculará seus volumes de limpeza toda vez que a cor dos filamentos " +"for alterada. Você pode desativar o cálculo automático em Orca Slicer > " +"Preferências" msgid "Flushing volume (mm³) for each filament pair." msgstr "Volume de limpeza (mm³) para cada par de filamentos." @@ -7345,8 +8203,14 @@ msgstr "Shift+A" msgid "Shift+R" msgstr "Shift+R" -msgid "Auto orientates selected objects or all objects.If there are selected objects, it just orientates the selected ones.Otherwise, it will orientates all objects in the current disk." -msgstr "Orienta automaticamente os objetos selecionados ou todos os objetos. Se houver objetos selecionados, ele apenas orientará os selecionados. Caso contrário, orientará todos os objetos no disco atual." +msgid "" +"Auto orientates selected objects or all objects.If there are selected " +"objects, it just orientates the selected ones.Otherwise, it will orientates " +"all objects in the current disk." +msgstr "" +"Orienta automaticamente os objetos selecionados ou todos os objetos. Se " +"houver objetos selecionados, ele apenas orientará os selecionados. Caso " +"contrário, orientará todos os objetos no disco atual." msgid "Shift+Tab" msgstr "Shift+Tab" @@ -7556,8 +8420,11 @@ msgstr "informações de atualização da versão %s:" msgid "Network plug-in update" msgstr "Atualização do plug-in de rede" -msgid "Click OK to update the Network plug-in when Orca Slicer launches next time." -msgstr "Clique em OK para atualizar o plug-in de rede quando o Orca Slicer for iniciado novamente." +msgid "" +"Click OK to update the Network plug-in when Orca Slicer launches next time." +msgstr "" +"Clique em OK para atualizar o plug-in de rede quando o Orca Slicer for " +"iniciado novamente." #, c-format, boost-format msgid "A new Network plug-in(%s) available, Do you want to install it?" @@ -7575,17 +8442,57 @@ msgstr "Concluído" msgid "resume" msgstr "retomar" +msgid "Resume Printing" +msgstr "" + +msgid "Resume Printing(defects acceptable)" +msgstr "" + +msgid "Resume Printing(problem solved)" +msgstr "" + +msgid "Stop Printing" +msgstr "" + +msgid "Check Assistant" +msgstr "" + +msgid "Filament Extruded, Continue" +msgstr "" + +msgid "Not Extruded Yet, Retry" +msgstr "" + +msgid "Finished, Continue" +msgstr "" + +msgid "Load Filament" +msgstr "Carregar Filamento" + +msgid "Filament Loaded, Resume" +msgstr "" + +msgid "View Liveview" +msgstr "" + msgid "Confirm and Update Nozzle" msgstr "Confirmar e Atualizar Bico" msgid "LAN Connection Failed (Sending print file)" msgstr "Falha na conexão LAN (enviando arquivo de impressão)" -msgid "Step 1, please confirm Orca Slicer and your printer are in the same LAN." -msgstr "Passo 1, por favor, confirme se o Orca Slicer e sua impressora estão na mesma LAN." +msgid "" +"Step 1, please confirm Orca Slicer and your printer are in the same LAN." +msgstr "" +"Passo 1, por favor, confirme se o Orca Slicer e sua impressora estão na " +"mesma LAN." -msgid "Step 2, if the IP and Access Code below are different from the actual values on your printer, please correct them." -msgstr "Passo 2, se o IP e o Código de Acesso abaixo forem diferentes dos valores reais na sua impressora, corrija-os." +msgid "" +"Step 2, if the IP and Access Code below are different from the actual values " +"on your printer, please correct them." +msgstr "" +"Passo 2, se o IP e o Código de Acesso abaixo forem diferentes dos valores " +"reais na sua impressora, corrija-os." msgid "IP" msgstr "PI" @@ -7597,7 +8504,8 @@ msgid "Where to find your printer's IP and Access Code?" msgstr "Onde encontrar o IP e o Código de Acesso da sua impressora?" msgid "Step 3: Ping the IP address to check for packet loss and latency." -msgstr "Passo 3: Pingue o endereço IP para verificar a perda de pacotes e a latência." +msgstr "" +"Passo 3: Pingue o endereço IP para verificar a perda de pacotes e a latência." msgid "Test" msgstr "Testar" @@ -7648,14 +8556,30 @@ msgstr "Falha na atualização" msgid "Updating successful" msgstr "Atualização bem-sucedida" -msgid "Are you sure you want to update? This will take about 10 minutes. Do not turn off the power while the printer is updating." -msgstr "Tem certeza de que deseja atualizar? Isso levará cerca de 10 minutos. Não desligue a energia enquanto a impressora estiver atualizando." +msgid "" +"Are you sure you want to update? This will take about 10 minutes. Do not " +"turn off the power while the printer is updating." +msgstr "" +"Tem certeza de que deseja atualizar? Isso levará cerca de 10 minutos. Não " +"desligue a energia enquanto a impressora estiver atualizando." -msgid "An important update was detected and needs to be run before printing can continue. Do you want to update now? You can also update later from 'Upgrade firmware'." -msgstr "Uma atualização importante foi detectada e precisa ser executada antes que a impressão possa continuar. Deseja atualizar agora? Você também pode atualizar posteriormente em 'Atualizar firmware'." +msgid "" +"An important update was detected and needs to be run before printing can " +"continue. Do you want to update now? You can also update later from 'Upgrade " +"firmware'." +msgstr "" +"Uma atualização importante foi detectada e precisa ser executada antes que a " +"impressão possa continuar. Deseja atualizar agora? Você também pode " +"atualizar posteriormente em 'Atualizar firmware'." -msgid "The firmware version is abnormal. Repairing and updating are required before printing. Do you want to update now? You can also update later on printer or update next time starting the studio." -msgstr "A versão do firmware está anormal. É necessário reparar e atualizar antes de imprimir. Deseja atualizar agora? Você também pode atualizar mais tarde na impressora ou na próxima vez que iniciar o estúdio." +msgid "" +"The firmware version is abnormal. Repairing and updating are required before " +"printing. Do you want to update now? You can also update later on printer or " +"update next time starting the studio." +msgstr "" +"A versão do firmware está anormal. É necessário reparar e atualizar antes de " +"imprimir. Deseja atualizar agora? Você também pode atualizar mais tarde na " +"impressora ou na próxima vez que iniciar o estúdio." msgid "Extension Board" msgstr "Mesa de Extensão" @@ -7713,7 +8637,9 @@ msgid "Copying of file %1% to %2% failed: %3%" msgstr "Falha ao copiar o arquivo %1% para %2%: %3%" msgid "Need to check the unsaved changes before configuration updates." -msgstr "É necessário verificar as alterações não salvas antes das atualizações de configuração." +msgstr "" +"É necessário verificar as alterações não salvas antes das atualizações de " +"configuração." msgid "Configuration package: " msgstr "Pacote de configuração: " @@ -7724,19 +8650,28 @@ msgstr " atualizado para " msgid "Open G-code file:" msgstr "Abrir arquivo G-code:" -msgid "One object has empty initial layer and can't be printed. Please Cut the bottom or enable supports." -msgstr "Um objeto tem uma primeira camada vazia e não pode ser impresso. Por favor, corte a base ou habilite os suportes." +msgid "" +"One object has empty initial layer and can't be printed. Please Cut the " +"bottom or enable supports." +msgstr "" +"Um objeto tem uma primeira camada vazia e não pode ser impresso. Por favor, " +"corte a base ou habilite os suportes." #, boost-format msgid "Object can't be printed for empty layer between %1% and %2%." -msgstr "O objeto não pode ser impresso devido a uma camada vazia entre %1% e %2%." +msgstr "" +"O objeto não pode ser impresso devido a uma camada vazia entre %1% e %2%." #, boost-format msgid "Object: %1%" msgstr "Objeto: %1%" -msgid "Maybe parts of the object at these height are too thin, or the object has faulty mesh" -msgstr "Talvez partes do objeto nessa altura sejam muito finas, ou o objeto tenha uma malha com falhas" +msgid "" +"Maybe parts of the object at these height are too thin, or the object has " +"faulty mesh" +msgstr "" +"Talvez partes do objeto nessa altura sejam muito finas, ou o objeto tenha " +"uma malha com falhas" msgid "No object can be printed. Maybe too small" msgstr "Nenhum objeto pode ser impresso. Talvez seja muito pequeno" @@ -7796,10 +8731,16 @@ msgstr "Múltiplo" #, boost-format msgid "Failed to calculate line width of %1%. Can not get value of \"%2%\" " -msgstr "Falha ao calcular a largura da linha de %1%. Não é possível obter o valor de \"%2%\". " +msgstr "" +"Falha ao calcular a largura da linha de %1%. Não é possível obter o valor de " +"\"%2%\". " -msgid "Invalid spacing supplied to Flow::with_spacing(), check your layer height and extrusion width" -msgstr "Espaçamento inválido fornecido para Flow::with_spacing(), verifique a altura da camada e a largura da extrusão." +msgid "" +"Invalid spacing supplied to Flow::with_spacing(), check your layer height " +"and extrusion width" +msgstr "" +"Espaçamento inválido fornecido para Flow::with_spacing(), verifique a altura " +"da camada e a largura da extrusão." msgid "undefined error" msgstr "erro indefinido" @@ -7895,8 +8836,11 @@ msgid "write callback failed" msgstr "falha na chamada de escrita" #, boost-format -msgid "%1% is too close to exclusion area, there may be collisions when printing." -msgstr "%1% está muito perto da área de exclusão, pode haver colisões durante a impressão." +msgid "" +"%1% is too close to exclusion area, there may be collisions when printing." +msgstr "" +"%1% está muito perto da área de exclusão, pode haver colisões durante a " +"impressão." #, boost-format msgid "%1% is too close to others, and collisions may be caused." @@ -7910,7 +8854,9 @@ msgid " is too close to others, there may be collisions when printing." msgstr " está muito perto de outros, pode haver colisões durante a impressão." msgid " is too close to exclusion area, there may be collisions when printing." -msgstr " está muito perto da área de exclusão, pode haver colisões durante a impressão." +msgstr "" +" está muito perto da área de exclusão, pode haver colisões durante a " +"impressão." msgid "Prime Tower" msgstr "Torre Principal" @@ -7921,67 +8867,128 @@ msgstr " está muito perto de outros, e colisões podem ocorrer.\n" msgid " is too close to exclusion area, and collisions will be caused.\n" msgstr " está muito perto da área de exclusão, e ocorrerão colisões.\n" -msgid "Can not print multiple filaments which have large difference of temperature together. Otherwise, the extruder and nozzle may be blocked or damaged during printing" -msgstr "Não é possível imprimir vários filamentos que têm grande diferença de temperatura juntos. Caso contrário, o extrusor e a bocal podem ficar bloqueados ou danificados durante a impressão" +msgid "" +"Can not print multiple filaments which have large difference of temperature " +"together. Otherwise, the extruder and nozzle may be blocked or damaged " +"during printing" +msgstr "" +"Não é possível imprimir vários filamentos que têm grande diferença de " +"temperatura juntos. Caso contrário, o extrusor e a bocal podem ficar " +"bloqueados ou danificados durante a impressão" msgid "No extrusions under current settings." msgstr "Nenhuma extrusão com as configurações atuais." -msgid "Smooth mode of timelapse is not supported when \"by object\" sequence is enabled." -msgstr "O modo suave do timelapse não é suportado quando a sequência \"por objeto\" está ativada." +msgid "" +"Smooth mode of timelapse is not supported when \"by object\" sequence is " +"enabled." +msgstr "" +"O modo suave do timelapse não é suportado quando a sequência \"por objeto\" " +"está ativada." -msgid "Please select \"By object\" print sequence to print multiple objects in spiral vase mode." -msgstr "Por favor, selecione a sequência de impressão \"Por objeto\" para imprimir vários objetos no modo vaso espiral." +msgid "" +"Please select \"By object\" print sequence to print multiple objects in " +"spiral vase mode." +msgstr "" +"Por favor, selecione a sequência de impressão \"Por objeto\" para imprimir " +"vários objetos no modo vaso espiral." -msgid "The spiral vase mode does not work when an object contains more than one materials." -msgstr "O modo de vaso espiral não funciona quando um objeto contém mais de um material." +msgid "" +"The spiral vase mode does not work when an object contains more than one " +"materials." +msgstr "" +"O modo de vaso espiral não funciona quando um objeto contém mais de um " +"material." #, boost-format msgid "The object %1% exceeds the maximum build volume height." msgstr "O objeto %1% excede a altura máxima do volume de impressão." #, boost-format -msgid "While the object %1% itself fits the build volume, its last layer exceeds the maximum build volume height." -msgstr "Embora o objeto %1% em si se ajuste ao volume de impressão, sua última camada excede a altura máxima do volume de impressão." +msgid "" +"While the object %1% itself fits the build volume, its last layer exceeds " +"the maximum build volume height." +msgstr "" +"Embora o objeto %1% em si se ajuste ao volume de impressão, sua última " +"camada excede a altura máxima do volume de impressão." -msgid "You might want to reduce the size of your model or change current print settings and retry." -msgstr "Você pode querer reduzir o tamanho do seu modelo ou alterar as configurações de impressão atuais e tentar novamente." +msgid "" +"You might want to reduce the size of your model or change current print " +"settings and retry." +msgstr "" +"Você pode querer reduzir o tamanho do seu modelo ou alterar as configurações " +"de impressão atuais e tentar novamente." msgid "Variable layer height is not supported with Organic supports." msgstr "A altura de camada variável não é suportada com suportes orgânicos." -msgid "Different nozzle diameters and different filament diameters is not allowed when prime tower is enabled." -msgstr "Diâmetros de bocal diferentes e diâmetros de filamento diferentes não são permitidos quando a torre principal está ativada." +msgid "" +"Different nozzle diameters and different filament diameters is not allowed " +"when prime tower is enabled." +msgstr "" +"Diâmetros de bocal diferentes e diâmetros de filamento diferentes não são " +"permitidos quando a torre principal está ativada." -msgid "The Wipe Tower is currently only supported with the relative extruder addressing (use_relative_e_distances=1)." -msgstr "A Torre de Limpeza atualmente só é suportada com o endereçamento relativo do extrusor (use_relative_e_distances=1)." +msgid "" +"The Wipe Tower is currently only supported with the relative extruder " +"addressing (use_relative_e_distances=1)." +msgstr "" +"A Torre de Limpeza atualmente só é suportada com o endereçamento relativo do " +"extrusor (use_relative_e_distances=1)." -msgid "Ooze prevention is currently not supported with the prime tower enabled." -msgstr "A prevenção de oozing não é atualmente suportada com a torre principal ativada." +msgid "" +"Ooze prevention is currently not supported with the prime tower enabled." +msgstr "" +"A prevenção de oozing não é atualmente suportada com a torre principal " +"ativada." -msgid "The prime tower is currently only supported for the Marlin, RepRap/Sprinter, RepRapFirmware and Repetier G-code flavors." -msgstr "A torre principal atualmente só é suportada para os G-code tipo Marlin, RepRap/Sprinter, RepRapFirmware e Repetier." +msgid "" +"The prime tower is currently only supported for the Marlin, RepRap/Sprinter, " +"RepRapFirmware and Repetier G-code flavors." +msgstr "" +"A torre principal atualmente só é suportada para os G-code tipo Marlin, " +"RepRap/Sprinter, RepRapFirmware e Repetier." msgid "The prime tower is not supported in \"By object\" print." msgstr "A torre principal não é suportada na impressão \"Por objeto\"." -msgid "The prime tower is not supported when adaptive layer height is on. It requires that all objects have the same layer height." -msgstr "A torre principal não é suportada quando a altura de camada adaptativa está ativada. Requer que todos os objetos tenham a mesma altura de camada." +msgid "" +"The prime tower is not supported when adaptive layer height is on. It " +"requires that all objects have the same layer height." +msgstr "" +"A torre principal não é suportada quando a altura de camada adaptativa está " +"ativada. Requer que todos os objetos tenham a mesma altura de camada." msgid "The prime tower requires \"support gap\" to be multiple of layer height" -msgstr "A torre principal requer que o \"espaço de suporte\" seja múltiplo da altura da camada" +msgstr "" +"A torre principal requer que o \"espaço de suporte\" seja múltiplo da altura " +"da camada" msgid "The prime tower requires that all objects have the same layer heights" -msgstr "A torre principal requer que todos os objetos tenham as mesmas alturas de camada" +msgstr "" +"A torre principal requer que todos os objetos tenham as mesmas alturas de " +"camada" -msgid "The prime tower requires that all objects are printed over the same number of raft layers" -msgstr "A torre principal requer que todos os objetos sejam impressos sobre o mesmo número de camadas de base" +msgid "" +"The prime tower requires that all objects are printed over the same number " +"of raft layers" +msgstr "" +"A torre principal requer que todos os objetos sejam impressos sobre o mesmo " +"número de camadas de base" -msgid "The prime tower requires that all objects are sliced with the same layer heights." -msgstr "A torre principal requer que todos os objetos sejam fatiados com as mesmas alturas de camada." +msgid "" +"The prime tower requires that all objects are sliced with the same layer " +"heights." +msgstr "" +"A torre principal requer que todos os objetos sejam fatiados com as mesmas " +"alturas de camada." -msgid "The prime tower is only supported if all objects have the same variable layer height" -msgstr "A torre principal só é suportada se todos os objetos tiverem a mesma altura de camada variável" +msgid "" +"The prime tower is only supported if all objects have the same variable " +"layer height" +msgstr "" +"A torre principal só é suportada se todos os objetos tiverem a mesma altura " +"de camada variável" msgid "Too small line width" msgstr "Largura de linha muito pequena" @@ -7989,66 +8996,119 @@ msgstr "Largura de linha muito pequena" msgid "Too large line width" msgstr "Largura de linha muito grande" -msgid "The prime tower requires that support has the same layer height with object." -msgstr "A torre principal requer que o suporte tenha a mesma altura de camada do objeto." +msgid "" +"The prime tower requires that support has the same layer height with object." +msgstr "" +"A torre principal requer que o suporte tenha a mesma altura de camada do " +"objeto." -msgid "Organic support tree tip diameter must not be smaller than support material extrusion width." -msgstr "O diâmetro da ponta da árvore de suporte orgânico não deve ser menor do que a largura de extrusão do material de suporte." +msgid "" +"Organic support tree tip diameter must not be smaller than support material " +"extrusion width." +msgstr "" +"O diâmetro da ponta da árvore de suporte orgânico não deve ser menor do que " +"a largura de extrusão do material de suporte." -msgid "Organic support branch diameter must not be smaller than 2x support material extrusion width." -msgstr "O diâmetro do ramo de suporte orgânico não deve ser menor do que 2x a largura de extrusão do material de suporte." +msgid "" +"Organic support branch diameter must not be smaller than 2x support material " +"extrusion width." +msgstr "" +"O diâmetro do ramo de suporte orgânico não deve ser menor do que 2x a " +"largura de extrusão do material de suporte." -msgid "Organic support branch diameter must not be smaller than support tree tip diameter." -msgstr "O diâmetro do ramo de suporte orgânico não deve ser menor do que o diâmetro da ponta da árvore de suporte." +msgid "" +"Organic support branch diameter must not be smaller than support tree tip " +"diameter." +msgstr "" +"O diâmetro do ramo de suporte orgânico não deve ser menor do que o diâmetro " +"da ponta da árvore de suporte." -msgid "Support enforcers are used but support is not enabled. Please enable support." -msgstr "Os reforços de suporte são usados, mas o suporte não está habilitado. Por favor, habilite o suporte." +msgid "" +"Support enforcers are used but support is not enabled. Please enable support." +msgstr "" +"Os reforços de suporte são usados, mas o suporte não está habilitado. Por " +"favor, habilite o suporte." msgid "Layer height cannot exceed nozzle diameter" msgstr "A altura da camada não pode exceder o diâmetro da bocal" -msgid "Relative extruder addressing requires resetting the extruder position at each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to layer_gcode." -msgstr "O endereçamento relativo do extrusor requer a reinicialização da posição do extrusor em cada camada para evitar perda de precisão de ponto flutuante. Adicione \"G92 E0\" ao código de camada." +msgid "" +"Relative extruder addressing requires resetting the extruder position at " +"each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " +"layer_gcode." +msgstr "" +"O endereçamento relativo do extrusor requer a reinicialização da posição do " +"extrusor em cada camada para evitar perda de precisão de ponto flutuante. " +"Adicione \"G92 E0\" ao código de camada." -msgid "\"G92 E0\" was found in before_layer_gcode, which is incompatible with absolute extruder addressing." -msgstr "\"G92 E0\" foi encontrado em before_layer_gcode, o que é incompatível com o endereçamento absoluto do extrusor." +msgid "" +"\"G92 E0\" was found in before_layer_gcode, which is incompatible with " +"absolute extruder addressing." +msgstr "" +"\"G92 E0\" foi encontrado em before_layer_gcode, o que é incompatível com o " +"endereçamento absoluto do extrusor." -msgid "\"G92 E0\" was found in layer_gcode, which is incompatible with absolute extruder addressing." -msgstr "\"G92 E0\" foi encontrado em layer_gcode, o que é incompatível com o endereçamento absoluto do extrusor." +msgid "" +"\"G92 E0\" was found in layer_gcode, which is incompatible with absolute " +"extruder addressing." +msgstr "" +"\"G92 E0\" foi encontrado em layer_gcode, o que é incompatível com o " +"endereçamento absoluto do extrusor." #, c-format, boost-format msgid "Plate %d: %s does not support filament %s" msgstr "Mesa %d: %s não suporta filamento %s" -msgid "Setting the jerk speed too low could lead to artifacts on curved surfaces" -msgstr "Definir a velocidade de jerk muito baixa pode levar a artefatos em superfícies curvas" +msgid "" +"Setting the jerk speed too low could lead to artifacts on curved surfaces" +msgstr "" +"Definir a velocidade de jerk muito baixa pode levar a artefatos em " +"superfícies curvas" msgid "" -"The jerk setting exceeds the printer's maximum jerk (machine_max_jerk_x/machine_max_jerk_y).\n" -"Orca will automatically cap the jerk speed to ensure it doesn't surpass the printer's capabilities.\n" -"You can adjust the maximum jerk setting in your printer's configuration to get higher speeds." +"The jerk setting exceeds the printer's maximum jerk (machine_max_jerk_x/" +"machine_max_jerk_y).\n" +"Orca will automatically cap the jerk speed to ensure it doesn't surpass the " +"printer's capabilities.\n" +"You can adjust the maximum jerk setting in your printer's configuration to " +"get higher speeds." msgstr "" -"A configuração de jerk excede o jerk máximo da impressora (machine_max_jerk_x/machine_max_jerk_y).\n" -"Orca automaticamente limitará a velocidade do jerk para garantir que não ultrapasse as capacidades da impressora.\n" -"Você pode ajustar a configuração de jerk máximo na configuração da sua impressora para obter velocidades mais altas." +"A configuração de jerk excede o jerk máximo da impressora " +"(machine_max_jerk_x/machine_max_jerk_y).\n" +"Orca automaticamente limitará a velocidade do jerk para garantir que não " +"ultrapasse as capacidades da impressora.\n" +"Você pode ajustar a configuração de jerk máximo na configuração da sua " +"impressora para obter velocidades mais altas." msgid "" -"The acceleration setting exceeds the printer's maximum acceleration (machine_max_acceleration_extruding).\n" -"Orca will automatically cap the acceleration speed to ensure it doesn't surpass the printer's capabilities.\n" -"You can adjust the machine_max_acceleration_extruding value in your printer's configuration to get higher speeds." +"The acceleration setting exceeds the printer's maximum acceleration " +"(machine_max_acceleration_extruding).\n" +"Orca will automatically cap the acceleration speed to ensure it doesn't " +"surpass the printer's capabilities.\n" +"You can adjust the machine_max_acceleration_extruding value in your " +"printer's configuration to get higher speeds." msgstr "" -"A configuração de aceleração excede a aceleração máxima da impressora (machine_max_acceleration_extruding).\n" -"Orca automaticamente limitará a velocidade de aceleração para garantir que não ultrapasse as capacidades da impressora.\n" -"Você pode ajustar o valor de machine_max_acceleration_extruding na configuração da sua impressora para obter velocidades mais altas." +"A configuração de aceleração excede a aceleração máxima da impressora " +"(machine_max_acceleration_extruding).\n" +"Orca automaticamente limitará a velocidade de aceleração para garantir que " +"não ultrapasse as capacidades da impressora.\n" +"Você pode ajustar o valor de machine_max_acceleration_extruding na " +"configuração da sua impressora para obter velocidades mais altas." msgid "" -"The travel acceleration setting exceeds the printer's maximum travel acceleration (machine_max_acceleration_travel).\n" -"Orca will automatically cap the travel acceleration speed to ensure it doesn't surpass the printer's capabilities.\n" -"You can adjust the machine_max_acceleration_travel value in your printer's configuration to get higher speeds." +"The travel acceleration setting exceeds the printer's maximum travel " +"acceleration (machine_max_acceleration_travel).\n" +"Orca will automatically cap the travel acceleration speed to ensure it " +"doesn't surpass the printer's capabilities.\n" +"You can adjust the machine_max_acceleration_travel value in your printer's " +"configuration to get higher speeds." msgstr "" -"A configuração de aceleração de deslocamento excede a aceleração máxima de deslocamento da impressora (machine_max_acceleration_travel).\n" -"O Orca irá automaticamente limitar a velocidade de aceleração de deslocamento para garantir que não ultrapasse as capacidades da impressora.\n" -"Você pode ajustar o valor de machine_max_acceleration_travel na configuração da sua impressora para obter velocidades mais altas." +"A configuração de aceleração de deslocamento excede a aceleração máxima de " +"deslocamento da impressora (machine_max_acceleration_travel).\n" +"O Orca irá automaticamente limitar a velocidade de aceleração de " +"deslocamento para garantir que não ultrapasse as capacidades da impressora.\n" +"Você pode ajustar o valor de machine_max_acceleration_travel na configuração " +"da sua impressora para obter velocidades mais altas." msgid "Generating skirt & brim" msgstr "Gerando saia e borda" @@ -8068,8 +9128,15 @@ msgstr "Área de impressão" msgid "Bed exclude area" msgstr "Área de exclusão da mesa" -msgid "Unprintable area in XY plane. For example, X1 Series printers use the front left corner to cut filament during filament change. The area is expressed as polygon by points in following format: \"XxY, XxY, ...\"" -msgstr "Área não imprimível no plano XY. Por exemplo, impressoras da série X1 usam o canto esquerdo frontal para cortar o filamento durante a troca de filamento. A área é expressa como um polígono por pontos no seguinte formato: \"XxY, XxY, ...\"" +msgid "" +"Unprintable area in XY plane. For example, X1 Series printers use the front " +"left corner to cut filament during filament change. The area is expressed as " +"polygon by points in following format: \"XxY, XxY, ...\"" +msgstr "" +"Área não imprimível no plano XY. Por exemplo, impressoras da série X1 usam o " +"canto esquerdo frontal para cortar o filamento durante a troca de filamento. " +"A área é expressa como um polígono por pontos no seguinte formato: \"XxY, " +"XxY, ...\"" msgid "Bed custom texture" msgstr "Textura personalizada da mesa" @@ -8080,20 +9147,35 @@ msgstr "Modelo personalizado da mesa" msgid "Elephant foot compensation" msgstr "Compensação de pé de elefante" -msgid "Shrink the initial layer on build plate to compensate for elephant foot effect" -msgstr "Reduza a primeira camada na mesa para compensar o efeito de pé de elefante" +msgid "" +"Shrink the initial layer on build plate to compensate for elephant foot " +"effect" +msgstr "" +"Reduza a primeira camada na mesa para compensar o efeito de pé de elefante" msgid "Elephant foot compensation layers" msgstr "Camadas de compensação de pé de elefante" -msgid "The number of layers on which the elephant foot compensation will be active. The first layer will be shrunk by the elephant foot compensation value, then the next layers will be linearly shrunk less, up to the layer indicated by this value." -msgstr "O número de camadas em que a compensação de pé de elefante estará ativa. A primeira camada será reduzida pelo valor de compensação de pé de elefante, e então as próximas camadas serão reduzidas linearmente, até a camada indicada por este valor." +msgid "" +"The number of layers on which the elephant foot compensation will be active. " +"The first layer will be shrunk by the elephant foot compensation value, then " +"the next layers will be linearly shrunk less, up to the layer indicated by " +"this value." +msgstr "" +"O número de camadas em que a compensação de pé de elefante estará ativa. A " +"primeira camada será reduzida pelo valor de compensação de pé de elefante, e " +"então as próximas camadas serão reduzidas linearmente, até a camada indicada " +"por este valor." msgid "layers" msgstr "camadas" -msgid "Slicing height for each layer. Smaller layer height means more accurate and more printing time" -msgstr "Altura de fatiamento para cada camada. Altura de camada menor significa mais precisão e mais tempo de impressão" +msgid "" +"Slicing height for each layer. Smaller layer height means more accurate and " +"more printing time" +msgstr "" +"Altura de fatiamento para cada camada. Altura de camada menor significa mais " +"precisão e mais tempo de impressão" msgid "Printable height" msgstr "Altura de impressão" @@ -8105,7 +9187,9 @@ msgid "Preferred orientation" msgstr "Orientação preferida" msgid "Automatically orient stls on the Z-axis upon initial import" -msgstr "Orientar automaticamente os arquivos STL no eixo Z durante a importação inicial" +msgstr "" +"Orientar automaticamente os arquivos STL no eixo Z durante a importação " +"inicial" msgid "Printer preset names" msgstr "Nomes de presets da impressora" @@ -8114,25 +9198,44 @@ msgid "Use 3rd-party print host" msgstr "Usar host de impressão de terceiros" msgid "Allow controlling BambuLab's printer through 3rd party print hosts" -msgstr "Permitir o controle da impressora BambuLab por meio de hosts de impressão de terceiros" +msgstr "" +"Permitir o controle da impressora BambuLab por meio de hosts de impressão de " +"terceiros" msgid "Hostname, IP or URL" msgstr "Nome do host, IP ou URL" -msgid "Orca Slicer can upload G-code files to a printer host. This field should contain the hostname, IP address or URL of the printer host instance. Print host behind HAProxy with basic auth enabled can be accessed by putting the user name and password into the URL in the following format: https://username:password@your-octopi-address/" -msgstr "O Orca Slicer pode enviar arquivos G-code para um host de impressora. Este campo deve conter o nome do host, o endereço IP ou a URL da instância do host de impressora. O host de impressão atrás do HAProxy com autenticação básica ativada pode ser acessado colocando o nome de usuário e senha na URL no seguinte formato: https://username:password@your-octopi-address/" +msgid "" +"Orca Slicer can upload G-code files to a printer host. This field should " +"contain the hostname, IP address or URL of the printer host instance. Print " +"host behind HAProxy with basic auth enabled can be accessed by putting the " +"user name and password into the URL in the following format: https://" +"username:password@your-octopi-address/" +msgstr "" +"O Orca Slicer pode enviar arquivos G-code para um host de impressora. Este " +"campo deve conter o nome do host, o endereço IP ou a URL da instância do " +"host de impressora. O host de impressão atrás do HAProxy com autenticação " +"básica ativada pode ser acessado colocando o nome de usuário e senha na URL " +"no seguinte formato: https://username:password@your-octopi-address/" msgid "Device UI" msgstr "Interface do dispositivo" -msgid "Specify the URL of your device user interface if it's not same as print_host" -msgstr "Especifique a URL da interface do usuário do seu dispositivo se não for a mesma do print_host" +msgid "" +"Specify the URL of your device user interface if it's not same as print_host" +msgstr "" +"Especifique a URL da interface do usuário do seu dispositivo se não for a " +"mesma do print_host" msgid "API Key / Password" msgstr "Chave da API / Senha" -msgid "Orca Slicer can upload G-code files to a printer host. This field should contain the API Key or the password required for authentication." -msgstr "O Orca Slicer pode enviar arquivos G-code para um host de impressora. Este campo deve conter a Chave da API ou a senha necessária para autenticação." +msgid "" +"Orca Slicer can upload G-code files to a printer host. This field should " +"contain the API Key or the password required for authentication." +msgstr "" +"O Orca Slicer pode enviar arquivos G-code para um host de impressora. Este " +"campo deve conter a Chave da API ou a senha necessária para autenticação." msgid "Name of the printer" msgstr "Nome da impressora" @@ -8140,8 +9243,14 @@ msgstr "Nome da impressora" msgid "HTTPS CA File" msgstr "Arquivo CA HTTPS" -msgid "Custom CA certificate file can be specified for HTTPS OctoPrint connections, in crt/pem format. If left blank, the default OS CA certificate repository is used." -msgstr "O arquivo de certificado CA personalizado pode ser especificado para conexões HTTPS OctoPrint, no formato crt/pem. Se deixado em branco, o repositório de certificados CA padrão do sistema operacional é usado." +msgid "" +"Custom CA certificate file can be specified for HTTPS OctoPrint connections, " +"in crt/pem format. If left blank, the default OS CA certificate repository " +"is used." +msgstr "" +"O arquivo de certificado CA personalizado pode ser especificado para " +"conexões HTTPS OctoPrint, no formato crt/pem. Se deixado em branco, o " +"repositório de certificados CA padrão do sistema operacional é usado." msgid "User" msgstr "Usuário" @@ -8152,8 +9261,14 @@ msgstr "Senha" msgid "Ignore HTTPS certificate revocation checks" msgstr "Ignorar verificações de revogação de certificado HTTPS" -msgid "Ignore HTTPS certificate revocation checks in case of missing or offline distribution points. One may want to enable this option for self signed certificates if connection fails." -msgstr "Ignorar verificações de revogação de certificado HTTPS em caso de pontos de distribuição ausentes ou offline. Pode-se querer habilitar esta opção para certificados autoassinados se a conexão falhar." +msgid "" +"Ignore HTTPS certificate revocation checks in case of missing or offline " +"distribution points. One may want to enable this option for self signed " +"certificates if connection fails." +msgstr "" +"Ignorar verificações de revogação de certificado HTTPS em caso de pontos de " +"distribuição ausentes ou offline. Pode-se querer habilitar esta opção para " +"certificados autoassinados se a conexão falhar." msgid "Names of presets related to the physical printer" msgstr "Nomes dos presets relacionados à impressora física" @@ -8171,13 +9286,23 @@ msgid "Avoid crossing wall" msgstr "Evitar perímetros" msgid "Detour and avoid to travel across wall which may cause blob on surface" -msgstr "Desvio e evite viajar através do perímetro que pode causar irregularidade na superfície" +msgstr "" +"Desvio e evite viajar através do perímetro que pode causar irregularidade na " +"superfície" msgid "Avoid crossing wall - Max detour length" msgstr "Evitar perímetros - Distância máximo do desvio" -msgid "Maximum detour distance for avoiding crossing wall. Don't detour if the detour distance is large than this value. Detour length could be specified either as an absolute value or as percentage (for example 50%) of a direct travel path. Zero to disable" -msgstr "Distância máxima de desvio para evitar atravessar o perímetro. Não desviar se a distância de desvio for maior que esse valor. A distancia do desvio pode ser especificada como um valor absoluto ou como porcentagem (por exemplo, 50%) de um caminho de deslocamento direto. Zero para desativar" +msgid "" +"Maximum detour distance for avoiding crossing wall. Don't detour if the " +"detour distance is large than this value. Detour length could be specified " +"either as an absolute value or as percentage (for example 50%) of a direct " +"travel path. Zero to disable" +msgstr "" +"Distância máxima de desvio para evitar atravessar o perímetro. Não desviar " +"se a distância de desvio for maior que esse valor. A distancia do desvio " +"pode ser especificada como um valor absoluto ou como porcentagem (por " +"exemplo, 50%) de um caminho de deslocamento direto. Zero para desativar" msgid "mm or %" msgstr "mm ou %" @@ -8185,20 +9310,36 @@ msgstr "mm ou %" msgid "Other layers" msgstr "Outras camadas" -msgid "Bed temperature for layers except the initial one. Value 0 means the filament does not support to print on the Cool Plate" -msgstr "Temperatura da mesa para camadas exceto a inicial. O valor 0 significa que o filamento não suporta a impressão na Cool Plate (Mesa Fria)" +msgid "" +"Bed temperature for layers except the initial one. Value 0 means the " +"filament does not support to print on the Cool Plate" +msgstr "" +"Temperatura da mesa para camadas exceto a inicial. O valor 0 significa que o " +"filamento não suporta a impressão na Cool Plate (Mesa Fria)" msgid "°C" msgstr "°C" -msgid "Bed temperature for layers except the initial one. Value 0 means the filament does not support to print on the Engineering Plate" -msgstr "Temperatura da mesa para camadas exceto a inicial. O valor 0 significa que o filamento não suporta a impressão no Engenharia Plate" +msgid "" +"Bed temperature for layers except the initial one. Value 0 means the " +"filament does not support to print on the Engineering Plate" +msgstr "" +"Temperatura da mesa para camadas exceto a inicial. O valor 0 significa que o " +"filamento não suporta a impressão no Engenharia Plate" -msgid "Bed temperature for layers except the initial one. Value 0 means the filament does not support to print on the High Temp Plate" -msgstr "Temperatura da mesa para camadas exceto a inicial. O valor 0 significa que o filamento não suporta a impressão no Plate de Alta Temperatura" +msgid "" +"Bed temperature for layers except the initial one. Value 0 means the " +"filament does not support to print on the High Temp Plate" +msgstr "" +"Temperatura da mesa para camadas exceto a inicial. O valor 0 significa que o " +"filamento não suporta a impressão no Plate de Alta Temperatura" -msgid "Bed temperature for layers except the initial one. Value 0 means the filament does not support to print on the Textured PEI Plate" -msgstr "Temperatura da mesa para camadas exceto a inicial. O valor 0 significa que o filamento não suporta a impressão no Plate de PEI Texturizado" +msgid "" +"Bed temperature for layers except the initial one. Value 0 means the " +"filament does not support to print on the Textured PEI Plate" +msgstr "" +"Temperatura da mesa para camadas exceto a inicial. O valor 0 significa que o " +"filamento não suporta a impressão no Plate de PEI Texturizado" msgid "Initial layer" msgstr "Primeira camada" @@ -8206,17 +9347,33 @@ msgstr "Primeira camada" msgid "Initial layer bed temperature" msgstr "Temperatura da mesa da primeira camada" -msgid "Bed temperature of the initial layer. Value 0 means the filament does not support to print on the Cool Plate" -msgstr "Temperatura da mesa na primeira camada. O valor 0 significa que o filamento não suporta a impressão na Cool Plate (Mesa Fria)" +msgid "" +"Bed temperature of the initial layer. Value 0 means the filament does not " +"support to print on the Cool Plate" +msgstr "" +"Temperatura da mesa na primeira camada. O valor 0 significa que o filamento " +"não suporta a impressão na Cool Plate (Mesa Fria)" -msgid "Bed temperature of the initial layer. Value 0 means the filament does not support to print on the Engineering Plate" -msgstr "Temperatura da mesa na primeira camada. O valor 0 significa que o filamento não suporta a impressão no Engenharia Plate" +msgid "" +"Bed temperature of the initial layer. Value 0 means the filament does not " +"support to print on the Engineering Plate" +msgstr "" +"Temperatura da mesa na primeira camada. O valor 0 significa que o filamento " +"não suporta a impressão no Engenharia Plate" -msgid "Bed temperature of the initial layer. Value 0 means the filament does not support to print on the High Temp Plate" -msgstr "Temperatura da mesa na primeira camada. O valor 0 significa que o filamento não suporta a impressão no Plate de Alta Temperatura" +msgid "" +"Bed temperature of the initial layer. Value 0 means the filament does not " +"support to print on the High Temp Plate" +msgstr "" +"Temperatura da mesa na primeira camada. O valor 0 significa que o filamento " +"não suporta a impressão no Plate de Alta Temperatura" -msgid "Bed temperature of the initial layer. Value 0 means the filament does not support to print on the Textured PEI Plate" -msgstr "Temperatura da mesa na primeira camada. O valor 0 significa que o filamento não suporta a impressão no Plate de PEI Texturizado" +msgid "" +"Bed temperature of the initial layer. Value 0 means the filament does not " +"support to print on the Textured PEI Plate" +msgstr "" +"Temperatura da mesa na primeira camada. O valor 0 significa que o filamento " +"não suporta a impressão no Plate de PEI Texturizado" msgid "Bed types supported by the printer" msgstr "Tipos de mesa suportadas pela impressora" @@ -8245,31 +9402,53 @@ msgstr "Este código G é inserido em cada mudança de camada antes de levantar msgid "Bottom shell layers" msgstr "Camadas de base" -msgid "This is the number of solid layers of bottom shell, including the bottom surface layer. When the thickness calculated by this value is thinner than bottom shell thickness, the bottom shell layers will be increased" -msgstr "Este é o número de camadas sólidas da base, incluindo a primeira camada. Quando a espessura calculada por este valor for mais fina do que a espessura da base, o número das camadas da base serão aumentadas" +msgid "" +"This is the number of solid layers of bottom shell, including the bottom " +"surface layer. When the thickness calculated by this value is thinner than " +"bottom shell thickness, the bottom shell layers will be increased" +msgstr "" +"Este é o número de camadas sólidas da base, incluindo a primeira camada. " +"Quando a espessura calculada por este valor for mais fina do que a espessura " +"da base, o número das camadas da base serão aumentadas" msgid "Bottom shell thickness" msgstr "Espessura da base" -msgid "The number of bottom solid layers is increased when slicing if the thickness calculated by bottom shell layers is thinner than this value. This can avoid having too thin shell when layer height is small. 0 means that this setting is disabled and thickness of bottom shell is absolutely determained by bottom shell layers" -msgstr "O número de camadas sólidas da base é aumentado ao fatiar se a espessura calculada pelas camadas da base for mais fina do que este valor. Isso pode evitar que a base seja muito fina quando a altura da camada é pequena. 0 significa que esta configuração está desativada e a espessura da base é absolutamente determinada pelas camadas da base" +msgid "" +"The number of bottom solid layers is increased when slicing if the thickness " +"calculated by bottom shell layers is thinner than this value. This can avoid " +"having too thin shell when layer height is small. 0 means that this setting " +"is disabled and thickness of bottom shell is absolutely determained by " +"bottom shell layers" +msgstr "" +"O número de camadas sólidas da base é aumentado ao fatiar se a espessura " +"calculada pelas camadas da base for mais fina do que este valor. Isso pode " +"evitar que a base seja muito fina quando a altura da camada é pequena. 0 " +"significa que esta configuração está desativada e a espessura da base é " +"absolutamente determinada pelas camadas da base" msgid "Apply gap fill" msgstr "Preenchimento de vão" msgid "" -"Enables gap fill for the selected surfaces. The minimum gap length that will be filled can be controlled from the filter out tiny gaps option below.\n" +"Enables gap fill for the selected surfaces. The minimum gap length that will " +"be filled can be controlled from the filter out tiny gaps option below.\n" "\n" "Options:\n" "1. Everywhere: Applies gap fill to top, bottom and internal solid surfaces\n" -"2. Top and Bottom surfaces: Applies gap fill to top and bottom surfaces only\n" +"2. Top and Bottom surfaces: Applies gap fill to top and bottom surfaces " +"only\n" "3. Nowhere: Disables gap fill\n" msgstr "" -"Ativa o preenchimento de vão para as superfícies selecionadas. O comprimento mínimo do vão que será preenchida pode ser controlado a partir da opção de filtrar pequenas s abaixo.\n" +"Ativa o preenchimento de vão para as superfícies selecionadas. O comprimento " +"mínimo do vão que será preenchida pode ser controlado a partir da opção de " +"filtrar pequenas s abaixo.\n" "\n" "Opções:\n" -"1. Em todos os lugares: Aplica preenchimento de s às superfícies sólidas superior, inferior e interna\n" -"2. Superfícies superior e inferior: Aplica preenchimento de s apenas às superfícies superior e inferior\n" +"1. Em todos os lugares: Aplica preenchimento de s às superfícies sólidas " +"superior, inferior e interna\n" +"2. Superfícies superior e inferior: Aplica preenchimento de s apenas às " +"superfícies superior e inferior\n" "3. Em nenhum lugar: Desativa o preenchimento de s\n" msgid "Everywhere" @@ -8284,96 +9463,170 @@ msgstr "Nunca" msgid "Force cooling for overhang and bridge" msgstr "Forçar resfriamento para overhangs e pontes" -msgid "Enable this option to optimize part cooling fan speed for overhang and bridge to get better cooling" -msgstr "Ative esta opção para otimizar a velocidade do ventilador de resfriamento de peças para overhangs e ponte para obter melhor resfriamento" +msgid "" +"Enable this option to optimize part cooling fan speed for overhang and " +"bridge to get better cooling" +msgstr "" +"Ative esta opção para otimizar a velocidade do ventilador de resfriamento de " +"peças para overhangs e ponte para obter melhor resfriamento" msgid "Fan speed for overhang" msgstr "Velocidade do ventilador para overhangs" -msgid "Force part cooling fan to be this speed when printing bridge or overhang wall which has large overhang degree. Forcing cooling for overhang and bridge can get better quality for these part" -msgstr "Forçar o ventilador de resfriamento da peça a ser nesta velocidade ao imprimir ponte ou overhang que tenha um grande grau de inclinação. Forçar o resfriamento para overhang e ponte pode obter melhor qualidade para estas partes" +msgid "" +"Force part cooling fan to be this speed when printing bridge or overhang " +"wall which has large overhang degree. Forcing cooling for overhang and " +"bridge can get better quality for these part" +msgstr "" +"Forçar o ventilador de resfriamento da peça a ser nesta velocidade ao " +"imprimir ponte ou overhang que tenha um grande grau de inclinação. Forçar o " +"resfriamento para overhang e ponte pode obter melhor qualidade para estas " +"partes" msgid "Cooling overhang threshold" msgstr "Limiar de resfriamento de Overhang" #, c-format -msgid "Force cooling fan to be specific speed when overhang degree of printed part exceeds this value. Expressed as percentage which indicides how much width of the line without support from lower layer. 0% means forcing cooling for all outer wall no matter how much overhang degree" -msgstr "Forçar o ventilador de resfriamento a ser uma velocidade específica quando o grau de inclinação da peça impressa excede este valor. Expresso como porcentagem, que indica quanto da largura da linha sem suporte da camada inferior.Zero significa forçar o resfriamento para toda o perímetro externo, não importa quanto seja o grau de inclinação" +msgid "" +"Force cooling fan to be specific speed when overhang degree of printed part " +"exceeds this value. Expressed as percentage which indicides how much width " +"of the line without support from lower layer. 0% means forcing cooling for " +"all outer wall no matter how much overhang degree" +msgstr "" +"Forçar o ventilador de resfriamento a ser uma velocidade específica quando o " +"grau de inclinação da peça impressa excede este valor. Expresso como " +"porcentagem, que indica quanto da largura da linha sem suporte da camada " +"inferior.Zero significa forçar o resfriamento para toda o perímetro externo, " +"não importa quanto seja o grau de inclinação" msgid "Bridge infill direction" msgstr "Direção de preenchimento de ponte" -msgid "Bridging angle override. If left to zero, the bridging angle will be calculated automatically. Otherwise the provided angle will be used for external bridges. Use 180°for zero angle." -msgstr "Substituição de ângulo de ponte. Se deixado em zero, o ângulo de ponte será calculado automaticamente. Caso contrário, o ângulo fornecido será usado para pontes externas. Use 180° para ângulo zero." +msgid "" +"Bridging angle override. If left to zero, the bridging angle will be " +"calculated automatically. Otherwise the provided angle will be used for " +"external bridges. Use 180°for zero angle." +msgstr "" +"Substituição de ângulo de ponte. Se deixado em zero, o ângulo de ponte será " +"calculado automaticamente. Caso contrário, o ângulo fornecido será usado " +"para pontes externas. Use 180° para ângulo zero." msgid "Bridge density" msgstr "Densidade de ponte" msgid "Density of external bridges. 100% means solid bridge. Default is 100%." -msgstr "Densidade de pontes externas. 100% significa ponte sólida. O padrão é 100%." +msgstr "" +"Densidade de pontes externas. 100% significa ponte sólida. O padrão é 100%." msgid "Bridge flow ratio" msgstr "Fluxo em ponte" -msgid "Decrease this value slightly(for example 0.9) to reduce the amount of material for bridge, to improve sag" -msgstr "Diminua ligeiramente este valor (por exemplo, 0.9) para reduzir a quantidade de material para ponte, para melhorar a flacidez" +msgid "" +"Decrease this value slightly(for example 0.9) to reduce the amount of " +"material for bridge, to improve sag" +msgstr "" +"Diminua ligeiramente este valor (por exemplo, 0.9) para reduzir a quantidade " +"de material para ponte, para melhorar a flacidez" msgid "Internal bridge flow ratio" msgstr "Fluxo em ponte interna" -msgid "This value governs the thickness of the internal bridge layer. This is the first layer over sparse infill. Decrease this value slightly (for example 0.9) to improve surface quality over sparse infill." -msgstr "Este valor governa a espessura da camada interna da ponte. Esta é a primeira camada sobre o preenchimento. Diminua ligeiramente este valor (por exemplo, 0.9) para melhorar a qualidade da superfície sobre o preenchimento esparsamente." +msgid "" +"This value governs the thickness of the internal bridge layer. This is the " +"first layer over sparse infill. Decrease this value slightly (for example " +"0.9) to improve surface quality over sparse infill." +msgstr "" +"Este valor governa a espessura da camada interna da ponte. Esta é a primeira " +"camada sobre o preenchimento. Diminua ligeiramente este valor (por exemplo, " +"0.9) para melhorar a qualidade da superfície sobre o preenchimento " +"esparsamente." msgid "Top surface flow ratio" msgstr "Fluxo em superfície superior" -msgid "This factor affects the amount of material for top solid infill. You can decrease it slightly to have smooth surface finish" -msgstr "Este fator afeta a quantidade de material para o preenchimento sólido superior. Você pode diminuí-lo ligeiramente para ter um acabamento de superfície suave" +msgid "" +"This factor affects the amount of material for top solid infill. You can " +"decrease it slightly to have smooth surface finish" +msgstr "" +"Este fator afeta a quantidade de material para o preenchimento sólido " +"superior. Você pode diminuí-lo ligeiramente para ter um acabamento de " +"superfície suave" msgid "Bottom surface flow ratio" msgstr "Fluxo em superfície inferior" msgid "This factor affects the amount of material for bottom solid infill" -msgstr "Este fator afeta a quantidade de material para o preenchimento sólido inferior" +msgstr "" +"Este fator afeta a quantidade de material para o preenchimento sólido " +"inferior" msgid "Precise wall" msgstr "Parede precisa" msgid "" -"Improve shell precision by adjusting outer wall spacing. This also improves layer consistency.\n" -"Note: This setting will only take effect if the wall sequence is configured to Inner-Outer" +"Improve shell precision by adjusting outer wall spacing. This also improves " +"layer consistency.\n" +"Note: This setting will only take effect if the wall sequence is configured " +"to Inner-Outer" msgstr "" -"Melhore a precisão da parede ajustando o espaçamento do perímetro externo. Isso também melhora a consistência da camada.\n" -"Nota: Esta configuração só terá efeito se a sequência do perímetro estiver configurada para Interior-Exterior" +"Melhore a precisão da parede ajustando o espaçamento do perímetro externo. " +"Isso também melhora a consistência da camada.\n" +"Nota: Esta configuração só terá efeito se a sequência do perímetro estiver " +"configurada para Interior-Exterior" msgid "Only one wall on top surfaces" msgstr "Perímetro único em superfícies superiores" -msgid "Use only one wall on flat top surface, to give more space to the top infill pattern" -msgstr "Use apenas um perímetro em superfície superior, para dar mais espaço ao padrão de preenchimento superior" +msgid "" +"Use only one wall on flat top surface, to give more space to the top infill " +"pattern" +msgstr "" +"Use apenas um perímetro em superfície superior, para dar mais espaço ao " +"padrão de preenchimento superior" msgid "One wall threshold" msgstr "Limite de perímetro único" #, no-c-format, no-boost-format msgid "" -"If a top surface has to be printed and it's partially covered by another layer, it won't be considered at a top layer where its width is below this value. This can be useful to not let the 'one perimeter on top' trigger on surface that should be covered only by perimeters. This value can be a mm or a % of the perimeter extrusion width.\n" -"Warning: If enabled, artifacts can be created if you have some thin features on the next layer, like letters. Set this setting to 0 to remove these artifacts." +"If a top surface has to be printed and it's partially covered by another " +"layer, it won't be considered at a top layer where its width is below this " +"value. This can be useful to not let the 'one perimeter on top' trigger on " +"surface that should be covered only by perimeters. This value can be a mm or " +"a % of the perimeter extrusion width.\n" +"Warning: If enabled, artifacts can be created if you have some thin features " +"on the next layer, like letters. Set this setting to 0 to remove these " +"artifacts." msgstr "" -"Se uma superfície superior tiver que ser impressa e estiver parcialmente coberta por outra camada, ela não será considerada em uma camada superior onde sua largura estiver abaixo deste valor. Isso pode ser útil para não permitir que o 'um perímetro no topo' seja ativado em uma superfície que deve ser coberta apenas por perímetros. Este valor pode ser em mm ou % da largura de extrusão do perímetro.\n" -"Aviso: Se habilitado, artefatos podem ser criados se você tiver algumas características finas na próxima camada, como letras. Defina esta configuração para 0 para remover esses artefatos." +"Se uma superfície superior tiver que ser impressa e estiver parcialmente " +"coberta por outra camada, ela não será considerada em uma camada superior " +"onde sua largura estiver abaixo deste valor. Isso pode ser útil para não " +"permitir que o 'um perímetro no topo' seja ativado em uma superfície que " +"deve ser coberta apenas por perímetros. Este valor pode ser em mm ou % da " +"largura de extrusão do perímetro.\n" +"Aviso: Se habilitado, artefatos podem ser criados se você tiver algumas " +"características finas na próxima camada, como letras. Defina esta " +"configuração para 0 para remover esses artefatos." msgid "Only one wall on first layer" msgstr "Perímetro único na primeira camada" -msgid "Use only one wall on first layer, to give more space to the bottom infill pattern" -msgstr "Use apenas um perímetro na primeira camada, para dar mais espaço ao padrão de preenchimento inferior" +msgid "" +"Use only one wall on first layer, to give more space to the bottom infill " +"pattern" +msgstr "" +"Use apenas um perímetro na primeira camada, para dar mais espaço ao padrão " +"de preenchimento inferior" msgid "Extra perimeters on overhangs" msgstr "Perímetros extras em overhangs" -msgid "Create additional perimeter paths over steep overhangs and areas where bridges cannot be anchored. " -msgstr "Crie caminhos de perímetro adicionais em overhangs íngremes e áreas onde pontes não podem ser ancoradas. " +msgid "" +"Create additional perimeter paths over steep overhangs and areas where " +"bridges cannot be anchored. " +msgstr "" +"Crie caminhos de perímetro adicionais em overhangs íngremes e áreas onde " +"pontes não podem ser ancoradas. " msgid "Reverse on odd" msgstr "Inverter em ímpares" @@ -8382,13 +9635,19 @@ msgid "Overhang reversal" msgstr "Reversão de suspensão" msgid "" -"Extrude perimeters that have a part over an overhang in the reverse direction on odd layers. This alternating pattern can drastically improve steep overhangs.\n" +"Extrude perimeters that have a part over an overhang in the reverse " +"direction on odd layers. This alternating pattern can drastically improve " +"steep overhangs.\n" "\n" -"This setting can also help reduce part warping due to the reduction of stresses in the part walls." +"This setting can also help reduce part warping due to the reduction of " +"stresses in the part walls." msgstr "" -"Extruir perímetros, que tenham uma parte sobre um overhang, na direção reversa em camadas ímpares. Este padrão alternado pode melhorar drasticamente perímetros íngremes.\n" +"Extruir perímetros, que tenham uma parte sobre um overhang, na direção " +"reversa em camadas ímpares. Este padrão alternado pode melhorar " +"drasticamente perímetros íngremes.\n" "\n" -"Este ajuste também pode ajudar a reduzir a deformação da peça devido à redução das tensões nas paredes da peça." +"Este ajuste também pode ajudar a reduzir a deformação da peça devido à " +"redução das tensões nas paredes da peça." msgid "Reverse only internal perimeters" msgstr "Inverter apenas os perímetros internos" @@ -8396,28 +9655,45 @@ msgstr "Inverter apenas os perímetros internos" msgid "" "Apply the reverse perimeters logic only on internal perimeters. \n" "\n" -"This setting greatly reduces part stresses as they are now distributed in alternating directions. This should reduce part warping while also maintaining external wall quality. This feature can be very useful for warp prone material, like ABS/ASA, and also for elastic filaments, like TPU and Silk PLA. It can also help reduce warping on floating regions over supports.\n" +"This setting greatly reduces part stresses as they are now distributed in " +"alternating directions. This should reduce part warping while also " +"maintaining external wall quality. This feature can be very useful for warp " +"prone material, like ABS/ASA, and also for elastic filaments, like TPU and " +"Silk PLA. It can also help reduce warping on floating regions over " +"supports.\n" "\n" -"For this setting to be the most effective, it is recomended to set the Reverse Threshold to 0 so that all internal walls print in alternating directions on odd layers irrespective of their overhang degree." +"For this setting to be the most effective, it is recomended to set the " +"Reverse Threshold to 0 so that all internal walls print in alternating " +"directions on odd layers irrespective of their overhang degree." msgstr "" "Aplicar a lógica de perímetros reversos apenas em perímetros internos.\n" "\n" -"Este ajuste reduz muito as tensões na peça, já que agora são distribuídas em direções alternadas. Isso deve reduzir a deformação da peça, mantendo a qualidade do perímetro externo. Este recurso pode ser muito útil para materiais propensos a deformações, como ABS/ASA, e também para filamentos elásticos, como TPU e Silk PLA. Também pode ajudar a reduzir a deformação em regiões flutuantes sobre suportes.\n" +"Este ajuste reduz muito as tensões na peça, já que agora são distribuídas em " +"direções alternadas. Isso deve reduzir a deformação da peça, mantendo a " +"qualidade do perímetro externo. Este recurso pode ser muito útil para " +"materiais propensos a deformações, como ABS/ASA, e também para filamentos " +"elásticos, como TPU e Silk PLA. Também pode ajudar a reduzir a deformação em " +"regiões flutuantes sobre suportes.\n" "\n" -"Para que este ajuste seja mais eficaz, recomenda-se definir o Limiar Reverso como 0 para que todos os perímetros internos sejam impressos em direções alternadas em camadas ímpares, independentemente de seu grau de ." +"Para que este ajuste seja mais eficaz, recomenda-se definir o Limiar Reverso " +"como 0 para que todos os perímetros internos sejam impressos em direções " +"alternadas em camadas ímpares, independentemente de seu grau de ." msgid "Bridge counterbore holes" msgstr "Pontes para furos rebaixados" msgid "" -"This option creates bridges for counterbore holes, allowing them to be printed without support. Available modes include:\n" +"This option creates bridges for counterbore holes, allowing them to be " +"printed without support. Available modes include:\n" "1. None: No bridge is created.\n" "2. Partially Bridged: Only a part of the unsupported area will be bridged.\n" "3. Sacrificial Layer: A full sacrificial bridge layer is created." msgstr "" -"Esta opção cria pontes para furos rebaixados, permitindo que sejam impressos sem suporte. Os modos disponíveis incluem:\n" +"Esta opção cria pontes para furos rebaixados, permitindo que sejam impressos " +"sem suporte. Os modos disponíveis incluem:\n" "1. Nenhum: Nenhuma ponte é criada.\n" -"2. Parcialmente Ponteada: Apenas uma parte da área não suportada será ponteada.\n" +"2. Parcialmente Ponteada: Apenas uma parte da área não suportada será " +"ponteada.\n" "3. Camada Sacrificial: Uma camada completa de ponte sacrificial é criada." msgid "Partially bridged" @@ -8434,10 +9710,12 @@ msgstr "Limiar de inversão de overhang" #, no-c-format, no-boost-format msgid "" -"Number of mm the overhang need to be for the reversal to be considered useful. Can be a % of the perimeter width.\n" +"Number of mm the overhang need to be for the reversal to be considered " +"useful. Can be a % of the perimeter width.\n" "Value 0 enables reversal on every odd layers regardless." msgstr "" -"Número de milímetros que o precisa ter para que a reversão seja considerada útil. Pode ser um % da largura do perímetro.\n" +"Número de milímetros que o precisa ter para que a reversão seja considerada " +"útil. Pode ser um % da largura do perímetro.\n" "O valor 0 permite a reversão em todas as camadas ímpares independentemente." msgid "Classic mode" @@ -8450,13 +9728,19 @@ msgid "Slow down for overhang" msgstr "Reduzir velocidade em overhangs" msgid "Enable this option to slow printing down for different overhang degree" -msgstr "Ative esta opção para diminuir a velocidade de impressão em diferentes graus de inclinação" +msgstr "" +"Ative esta opção para diminuir a velocidade de impressão em diferentes graus " +"de inclinação" msgid "Slow down for curled perimeters" msgstr "Reduzir vel. para perímetros encurvados" -msgid "Enable this option to slow printing down in areas where potential curled perimeters may exist" -msgstr "Ative esta opção para diminuir a velocidade de impressão em áreas onde podem existir potenciais perímetros curvados (warping)" +msgid "" +"Enable this option to slow printing down in areas where potential curled " +"perimeters may exist" +msgstr "" +"Ative esta opção para diminuir a velocidade de impressão em áreas onde podem " +"existir potenciais perímetros curvados (warping)" msgid "mm/s or %" msgstr "mm/s ou %" @@ -8473,8 +9757,12 @@ msgstr "mm/s" msgid "Internal" msgstr "Interno" -msgid "Speed of internal bridge. If the value is expressed as a percentage, it will be calculated based on the bridge_speed. Default value is 150%." -msgstr "Velocidade da ponte interna. Se o valor for expresso como porcentagem, será calculado com base na velocidade da ponte. O valor padrão é 150%." +msgid "" +"Speed of internal bridge. If the value is expressed as a percentage, it will " +"be calculated based on the bridge_speed. Default value is 150%." +msgstr "" +"Velocidade da ponte interna. Se o valor for expresso como porcentagem, será " +"calculado com base na velocidade da ponte. O valor padrão é 150%." msgid "Brim width" msgstr "Largura da borda" @@ -8485,14 +9773,23 @@ msgstr "Distância do modelo até a linha da borda mais externa" msgid "Brim type" msgstr "Tipo de borda" -msgid "This controls the generation of the brim at outer and/or inner side of models. Auto means the brim width is analysed and calculated automatically." -msgstr "Isso controla a geração da borda no lado externo e/ou interno dos modelos. Automático significa que a largura da borda é analisada e calculada automaticamente." +msgid "" +"This controls the generation of the brim at outer and/or inner side of " +"models. Auto means the brim width is analysed and calculated automatically." +msgstr "" +"Isso controla a geração da borda no lado externo e/ou interno dos modelos. " +"Automático significa que a largura da borda é analisada e calculada " +"automaticamente." msgid "Brim-object gap" msgstr "Espaço entre a borda e objeto" -msgid "A gap between innermost brim line and object can make brim be removed more easily" -msgstr "Um espaço entre a linha da borda mais interna e o objeto pode facilitar a remoção da borda" +msgid "" +"A gap between innermost brim line and object can make brim be removed more " +"easily" +msgstr "" +"Um espaço entre a linha da borda mais interna e o objeto pode facilitar a " +"remoção da borda" msgid "Brim ears" msgstr "Orelhas da borda" @@ -8516,10 +9813,12 @@ msgid "Brim ear detection radius" msgstr "Raio de detecção da orelha da borda" msgid "" -"The geometry will be decimated before dectecting sharp angles. This parameter indicates the minimum length of the deviation for the decimation.\n" +"The geometry will be decimated before dectecting sharp angles. This " +"parameter indicates the minimum length of the deviation for the decimation.\n" "0 to deactivate" msgstr "" -"A geometria será decimada antes de detectar ângulos agudos. Este parâmetro indica o comprimento mínimo da divergência para a decimação.\n" +"A geometria será decimada antes de detectar ângulos agudos. Este parâmetro " +"indica o comprimento mínimo da divergência para a decimação.\n" "0 para desativar" msgid "Compatible machine" @@ -8558,14 +9857,27 @@ msgstr "Como lista de objetos" msgid "Slow printing down for better layer cooling" msgstr "Diminuir a velocidade de impressão para melhor resfriamento da camada" -msgid "Enable this option to slow printing speed down to make the final layer time not shorter than the layer time threshold in \"Max fan speed threshold\", so that layer can be cooled for longer time. This can improve the cooling quality for needle and small details" -msgstr "Ative esta opção para diminuir a velocidade de impressão para que o tempo da camada final não seja menor do que o limite de tempo da camada em \"Limiar de velocidade máxima do ventilador\", para que a camada possa ser resfriada por mais tempo. Isso pode melhorar a qualidade de resfriamento para detalhes pequenos" +msgid "" +"Enable this option to slow printing speed down to make the final layer time " +"not shorter than the layer time threshold in \"Max fan speed threshold\", so " +"that layer can be cooled for longer time. This can improve the cooling " +"quality for needle and small details" +msgstr "" +"Ative esta opção para diminuir a velocidade de impressão para que o tempo da " +"camada final não seja menor do que o limite de tempo da camada em \"Limiar " +"de velocidade máxima do ventilador\", para que a camada possa ser resfriada " +"por mais tempo. Isso pode melhorar a qualidade de resfriamento para detalhes " +"pequenos" msgid "Normal printing" msgstr "Impressão normal" -msgid "The default acceleration of both normal printing and travel except initial layer" -msgstr "A aceleração padrão tanto para a impressão normal quanto para o movimento, exceto na primeira camada" +msgid "" +"The default acceleration of both normal printing and travel except initial " +"layer" +msgstr "" +"A aceleração padrão tanto para a impressão normal quanto para o movimento, " +"exceto na primeira camada" msgid "mm/s²" msgstr "mm/s²" @@ -8586,13 +9898,18 @@ msgid "Activate air filtration" msgstr "Ativar filtragem de ar" msgid "Activate for better air filtration. G-code command: M106 P3 S(0-255)" -msgstr "Ative para uma melhor filtragem de ar. Comando G-code: M106 P3 S(0-255)" +msgstr "" +"Ative para uma melhor filtragem de ar. Comando G-code: M106 P3 S(0-255)" msgid "Fan speed" msgstr "Velocidade do ventilador" -msgid "Speed of exhaust fan during printing.This speed will overwrite the speed in filament custom gcode" -msgstr "Velocidade do ventilador de exaustão durante a impressão. Esta velocidade substituirá a velocidade no gcode personalizado do filamento" +msgid "" +"Speed of exhaust fan during printing.This speed will overwrite the speed in " +"filament custom gcode" +msgstr "" +"Velocidade do ventilador de exaustão durante a impressão. Esta velocidade " +"substituirá a velocidade no gcode personalizado do filamento" msgid "Speed of exhaust fan after printing completes" msgstr "Velocidade do ventilador de exaustão após a conclusão da impressão" @@ -8600,58 +9917,107 @@ msgstr "Velocidade do ventilador de exaustão após a conclusão da impressão" msgid "No cooling for the first" msgstr "Sem resfriamento para o primeiro" -msgid "Close all cooling fan for the first certain layers. Cooling fan of the first layer used to be closed to get better build plate adhesion" -msgstr "Feche todos os ventiladores de resfriamento para as primeiras camadas. O ventilador de resfriamento da primeira camada costuma ser desligado para obter uma melhor adesão à mesa" +msgid "" +"Close all cooling fan for the first certain layers. Cooling fan of the first " +"layer used to be closed to get better build plate adhesion" +msgstr "" +"Feche todos os ventiladores de resfriamento para as primeiras camadas. O " +"ventilador de resfriamento da primeira camada costuma ser desligado para " +"obter uma melhor adesão à mesa" msgid "Don't support bridges" msgstr "Não suportar pontes" -msgid "Don't support the whole bridge area which make support very large. Bridge usually can be printing directly without support if not very long" -msgstr "Não suportar toda a área da ponte que faz com que o suporte seja muito grande. Ponte geralmente pode ser impressa diretamente sem suporte se não for muito longa" +msgid "" +"Don't support the whole bridge area which make support very large. Bridge " +"usually can be printing directly without support if not very long" +msgstr "" +"Não suportar toda a área da ponte que faz com que o suporte seja muito " +"grande. Ponte geralmente pode ser impressa diretamente sem suporte se não " +"for muito longa" msgid "Thick bridges" msgstr "Ponte grossa" -msgid "If enabled, bridges are more reliable, can bridge longer distances, but may look worse. If disabled, bridges look better but are reliable just for shorter bridged distances." -msgstr "Se ativado, as pontes são mais confiáveis, podem cobrir distâncias maiores, mas podem parecer piores. Se desativado, as pontes ficam melhores, mas são confiáveis apenas para distâncias de ponte mais curtas." +msgid "" +"If enabled, bridges are more reliable, can bridge longer distances, but may " +"look worse. If disabled, bridges look better but are reliable just for " +"shorter bridged distances." +msgstr "" +"Se ativado, as pontes são mais confiáveis, podem cobrir distâncias maiores, " +"mas podem parecer piores. Se desativado, as pontes ficam melhores, mas são " +"confiáveis apenas para distâncias de ponte mais curtas." msgid "Thick internal bridges" msgstr "Ponte interna grossa" -msgid "If enabled, thick internal bridges will be used. It's usually recommended to have this feature turned on. However, consider turning it off if you are using large nozzles." -msgstr "Se ativado, serão usadas pontes internas grossas. Geralmente é recomendado ter este recurso ativado. No entanto, considere desativá-lo se estiver usando bocais grandes." +msgid "" +"If enabled, thick internal bridges will be used. It's usually recommended to " +"have this feature turned on. However, consider turning it off if you are " +"using large nozzles." +msgstr "" +"Se ativado, serão usadas pontes internas grossas. Geralmente é recomendado " +"ter este recurso ativado. No entanto, considere desativá-lo se estiver " +"usando bocais grandes." msgid "Don't filter out small internal bridges (beta)" msgstr "Não filtrar pequenas pontes internas (beta)" msgid "" -"This option can help reducing pillowing on top surfaces in heavily slanted or curved models.\n" +"This option can help reducing pillowing on top surfaces in heavily slanted " +"or curved models.\n" "\n" -"By default, small internal bridges are filtered out and the internal solid infill is printed directly over the sparse infill. This works well in most cases, speeding up printing without too much compromise on top surface quality. \n" +"By default, small internal bridges are filtered out and the internal solid " +"infill is printed directly over the sparse infill. This works well in most " +"cases, speeding up printing without too much compromise on top surface " +"quality. \n" "\n" -"However, in heavily slanted or curved models especially where too low sparse infill density is used, this may result in curling of the unsupported solid infill, causing pillowing.\n" +"However, in heavily slanted or curved models especially where too low sparse " +"infill density is used, this may result in curling of the unsupported solid " +"infill, causing pillowing.\n" "\n" -"Enabling this option will print internal bridge layer over slightly unsupported internal solid infill. The options below control the amount of filtering, i.e. the amount of internal bridges created.\n" +"Enabling this option will print internal bridge layer over slightly " +"unsupported internal solid infill. The options below control the amount of " +"filtering, i.e. the amount of internal bridges created.\n" "\n" -"Disabled - Disables this option. This is the default behaviour and works well in most cases.\n" +"Disabled - Disables this option. This is the default behaviour and works " +"well in most cases.\n" "\n" -"Limited filtering - Creates internal bridges on heavily slanted surfaces, while avoiding creating uncessesary interal bridges. This works well for most difficult models.\n" +"Limited filtering - Creates internal bridges on heavily slanted surfaces, " +"while avoiding creating uncessesary interal bridges. This works well for " +"most difficult models.\n" "\n" -"No filtering - Creates internal bridges on every potential internal overhang. This option is useful for heavily slanted top surface models. However, in most cases it creates too many unecessary bridges." +"No filtering - Creates internal bridges on every potential internal " +"overhang. This option is useful for heavily slanted top surface models. " +"However, in most cases it creates too many unecessary bridges." msgstr "" -"Esta opção pode ajudar a reduzir o pillowing nas superfícies superiores em modelos fortemente inclinados ou curvos.\n" +"Esta opção pode ajudar a reduzir o pillowing nas superfícies superiores em " +"modelos fortemente inclinados ou curvos.\n" "\n" -"Por padrão, pequenas pontes internas são filtradas e o preenchimento sólido interno é impresso diretamente sobre o preenchimento não sólido. Isso funciona bem na maioria dos casos, acelerando a impressão sem comprometer muito a qualidade da superfície superior. \n" +"Por padrão, pequenas pontes internas são filtradas e o preenchimento sólido " +"interno é impresso diretamente sobre o preenchimento não sólido. Isso " +"funciona bem na maioria dos casos, acelerando a impressão sem comprometer " +"muito a qualidade da superfície superior. \n" "\n" -"No entanto, em modelos fortemente inclinados ou curvos, especialmente quando a densidade de preenchimento não sólido é muito baixa, isso pode resultar em enrolamento do preenchimento sólido não suportado, causando pillowing.\n" +"No entanto, em modelos fortemente inclinados ou curvos, especialmente quando " +"a densidade de preenchimento não sólido é muito baixa, isso pode resultar em " +"enrolamento do preenchimento sólido não suportado, causando pillowing.\n" "\n" -"Ativar esta opção imprimirá uma camada de ponte interna sobre o preenchimento sólido interno ligeiramente não suportado. As opções abaixo controlam a quantidade de filtragem, ou seja, a quantidade de pontes internas criadas.\n" +"Ativar esta opção imprimirá uma camada de ponte interna sobre o " +"preenchimento sólido interno ligeiramente não suportado. As opções abaixo " +"controlam a quantidade de filtragem, ou seja, a quantidade de pontes " +"internas criadas.\n" "\n" -"Desativado - Desativa esta opção. Este é o comportamento padrão e funciona bem na maioria dos casos.\n" +"Desativado - Desativa esta opção. Este é o comportamento padrão e funciona " +"bem na maioria dos casos.\n" "\n" -"Filtragem limitada - Cria pontes internas em superfícies fortemente inclinadas, evitando a criação de pontes internas desnecessárias. Isso funciona bem para a maioria dos modelos difíceis.\n" +"Filtragem limitada - Cria pontes internas em superfícies fortemente " +"inclinadas, evitando a criação de pontes internas desnecessárias. Isso " +"funciona bem para a maioria dos modelos difíceis.\n" "\n" -"Sem filtragem - Cria pontes internas em cada inclinação interna potencial. Esta opção é útil para modelos com superfície superior fortemente inclinada. No entanto, na maioria dos casos, cria pontes desnecessárias demais." +"Sem filtragem - Cria pontes internas em cada inclinação interna potencial. " +"Esta opção é útil para modelos com superfície superior fortemente inclinada. " +"No entanto, na maioria dos casos, cria pontes desnecessárias demais." msgid "Disabled" msgstr "Desativado" @@ -8665,8 +10031,14 @@ msgstr "Sem filtragem" msgid "Max bridge length" msgstr "Distância de ponte máxima" -msgid "Max length of bridges that don't need support. Set it to 0 if you want all bridges to be supported, and set it to a very large value if you don't want any bridges to be supported." -msgstr "Comprimento máximo de pontes que não precisam de suporte. Defina-o como 0 se desejar que todas as pontes tenham suporte, e defina-o como um valor muito grande se não desejar que nenhuma ponte tenha suporte." +msgid "" +"Max length of bridges that don't need support. Set it to 0 if you want all " +"bridges to be supported, and set it to a very large value if you don't want " +"any bridges to be supported." +msgstr "" +"Comprimento máximo de pontes que não precisam de suporte. Defina-o como 0 se " +"desejar que todas as pontes tenham suporte, e defina-o como um valor muito " +"grande se não desejar que nenhuma ponte tenha suporte." msgid "End G-code" msgstr "G-code de finalização" @@ -8677,8 +10049,12 @@ msgstr "G-code de finalização ao terminar a impressão completa" msgid "Between Object Gcode" msgstr "G-code entre objetos" -msgid "Insert Gcode between objects. This parameter will only come into effect when you print your models object by object" -msgstr "Insira o G-code entre objetos. Este parâmetro só terá efeito quando você imprimir seus modelos objeto por objeto" +msgid "" +"Insert Gcode between objects. This parameter will only come into effect when " +"you print your models object by object" +msgstr "" +"Insira o G-code entre objetos. Este parâmetro só terá efeito quando você " +"imprimir seus modelos objeto por objeto" msgid "End G-code when finish the printing of this filament" msgstr "G-code de finalização ao terminar a impressão deste filamento" @@ -8687,18 +10063,25 @@ msgid "Ensure vertical shell thickness" msgstr "Garantir a espessura vertical do perímetro" msgid "" -"Add solid infill near sloping surfaces to guarantee the vertical shell thickness (top+bottom solid layers)\n" -"None: No solid infill will be added anywhere. Caution: Use this option carefully if your model has sloped surfaces\n" +"Add solid infill near sloping surfaces to guarantee the vertical shell " +"thickness (top+bottom solid layers)\n" +"None: No solid infill will be added anywhere. Caution: Use this option " +"carefully if your model has sloped surfaces\n" "Critical Only: Avoid adding solid infill for walls\n" "Moderate: Add solid infill for heavily sloping surfaces only\n" "All: Add solid infill for all suitable sloping surfaces\n" "Default value is All." msgstr "" -"Adicione preenchimento sólido próximo a superfícies inclinadas para garantir a espessura vertical (camadas de topo+base)\n" -"Nenhum: Nenhum preenchimento sólido será adicionado em nenhum lugar. Cuidado: Use esta opção com cuidado se o seu modelo tiver superfícies inclinadas\n" +"Adicione preenchimento sólido próximo a superfícies inclinadas para garantir " +"a espessura vertical (camadas de topo+base)\n" +"Nenhum: Nenhum preenchimento sólido será adicionado em nenhum lugar. " +"Cuidado: Use esta opção com cuidado se o seu modelo tiver superfícies " +"inclinadas\n" "Apenas crítico: Evite adicionar preenchimento sólido para paredes\n" -"Moderado: Adicione preenchimento sólido apenas para superfícies fortemente inclinadas\n" -"Todos: Adicione preenchimento sólido para todas as superfícies inclinadas adequadas\n" +"Moderado: Adicione preenchimento sólido apenas para superfícies fortemente " +"inclinadas\n" +"Todos: Adicione preenchimento sólido para todas as superfícies inclinadas " +"adequadas\n" "O valor padrão é Todos." msgid "Critical Only" @@ -8741,31 +10124,57 @@ msgid "Bottom surface pattern" msgstr "Padrão de superfície inferior" msgid "Line pattern of bottom surface infill, not bridge infill" -msgstr "Padrão de linha do preenchimento da superfície inferior, não do preenchimento da ponte" +msgstr "" +"Padrão de linha do preenchimento da superfície inferior, não do " +"preenchimento da ponte" msgid "Internal solid infill pattern" msgstr "Padrão de preenchimento sólido interno" -msgid "Line pattern of internal solid infill. if the detect narrow internal solid infill be enabled, the concentric pattern will be used for the small area." -msgstr "Padrão de linha do preenchimento sólido interno. Se a detecção de preenchimento sólido interno estreito estiver ativada, o padrão concêntrico será usado para a área pequena." +msgid "" +"Line pattern of internal solid infill. if the detect narrow internal solid " +"infill be enabled, the concentric pattern will be used for the small area." +msgstr "" +"Padrão de linha do preenchimento sólido interno. Se a detecção de " +"preenchimento sólido interno estreito estiver ativada, o padrão concêntrico " +"será usado para a área pequena." -msgid "Line width of outer wall. If expressed as a %, it will be computed over the nozzle diameter." -msgstr "Largura da linha do perímetro externo. Se expresso como porcentagem, será calculado sobre o diâmetro do bico." +msgid "" +"Line width of outer wall. If expressed as a %, it will be computed over the " +"nozzle diameter." +msgstr "" +"Largura da linha do perímetro externo. Se expresso como porcentagem, será " +"calculado sobre o diâmetro do bico." -msgid "Speed of outer wall which is outermost and visible. It's used to be slower than inner wall speed to get better quality." -msgstr "Velocidade do perímetro externo que é o mais externo e visível. Geralmente é mais lenta que a velocidade do perímetro interno para obter melhor qualidade." +msgid "" +"Speed of outer wall which is outermost and visible. It's used to be slower " +"than inner wall speed to get better quality." +msgstr "" +"Velocidade do perímetro externo que é o mais externo e visível. Geralmente é " +"mais lenta que a velocidade do perímetro interno para obter melhor qualidade." msgid "Small perimeters" msgstr "Pequenos perímetros" -msgid "This separate setting will affect the speed of perimeters having radius <= small_perimeter_threshold (usually holes). If expressed as percentage (for example: 80%) it will be calculated on the outer wall speed setting above. Set to zero for auto." -msgstr "Essa configuração separada afetará a velocidade dos perímetros com raio <= small_perimeter_threshold (geralmente buracos). Se expresso como porcentagem (por exemplo: 80%), será calculado com base na configuração de velocidade do perímetro externo acima. Defina como zero para automático." +msgid "" +"This separate setting will affect the speed of perimeters having radius <= " +"small_perimeter_threshold (usually holes). If expressed as percentage (for " +"example: 80%) it will be calculated on the outer wall speed setting above. " +"Set to zero for auto." +msgstr "" +"Essa configuração separada afetará a velocidade dos perímetros com raio <= " +"small_perimeter_threshold (geralmente buracos). Se expresso como porcentagem " +"(por exemplo: 80%), será calculado com base na configuração de velocidade do " +"perímetro externo acima. Defina como zero para automático." msgid "Small perimeters threshold" msgstr "Limiar de pequenos perímetros" -msgid "This sets the threshold for small perimeter length. Default threshold is 0mm" -msgstr "Isso define o limite para o comprimento do perímetro pequeno. O limite padrão é 0mm" +msgid "" +"This sets the threshold for small perimeter length. Default threshold is 0mm" +msgstr "" +"Isso define o limite para o comprimento do perímetro pequeno. O limite " +"padrão é 0mm" msgid "Walls printing order" msgstr "Ordem de impressão dos perímetros" @@ -8773,21 +10182,49 @@ msgstr "Ordem de impressão dos perímetros" msgid "" "Print sequence of the internal (inner) and external (outer) walls. \n" "\n" -"Use Inner/Outer for best overhangs. This is because the overhanging walls can adhere to a neighouring perimeter while printing. However, this option results in slightly reduced surface quality as the external perimeter is deformed by being squashed to the internal perimeter.\n" +"Use Inner/Outer for best overhangs. This is because the overhanging walls " +"can adhere to a neighouring perimeter while printing. However, this option " +"results in slightly reduced surface quality as the external perimeter is " +"deformed by being squashed to the internal perimeter.\n" "\n" -"Use Inner/Outer/Inner for the best external surface finish and dimensional accuracy as the external wall is printed undisturbed from an internal perimeter. However, overhang performance will reduce as there is no internal perimeter to print the external wall against. This option requires a minimum of 3 walls to be effective as it prints the internal walls from the 3rd perimeter onwards first, then the external perimeter and, finally, the first internal perimeter. This option is recomended against the Outer/Inner option in most cases. \n" +"Use Inner/Outer/Inner for the best external surface finish and dimensional " +"accuracy as the external wall is printed undisturbed from an internal " +"perimeter. However, overhang performance will reduce as there is no internal " +"perimeter to print the external wall against. This option requires a minimum " +"of 3 walls to be effective as it prints the internal walls from the 3rd " +"perimeter onwards first, then the external perimeter and, finally, the first " +"internal perimeter. This option is recomended against the Outer/Inner option " +"in most cases. \n" "\n" -"Use Outer/Inner for the same external wall quality and dimensional accuracy benefits of Inner/Outer/Inner option. However, the z seams will appear less consistent as the first extrusion of a new layer starts on a visible surface.\n" +"Use Outer/Inner for the same external wall quality and dimensional accuracy " +"benefits of Inner/Outer/Inner option. However, the z seams will appear less " +"consistent as the first extrusion of a new layer starts on a visible " +"surface.\n" "\n" " " msgstr "" "Sequência de impressão dos perímetros internos e externos. \n" "\n" -"Use Interior/Exterior para melhores overhangs. Isso ocorre porque os perímetros salientes podem aderir a um perímetro vizinho durante a impressão. No entanto, esta opção resulta em uma qualidade superficial ligeiramente reduzida, pois o perímetro externo é deformado ao ser esmagado pelo perímetro interno.\n" +"Use Interior/Exterior para melhores overhangs. Isso ocorre porque os " +"perímetros salientes podem aderir a um perímetro vizinho durante a " +"impressão. No entanto, esta opção resulta em uma qualidade superficial " +"ligeiramente reduzida, pois o perímetro externo é deformado ao ser esmagado " +"pelo perímetro interno.\n" "\n" -"Use Interior/Exterior/Interior para o melhor acabamento superficial externo e precisão dimensional, pois o perímetro externo é impresso sem interrupções a partir de um perímetro interno. No entanto, o desempenho da inclinaçãoserá reduzido, pois não há perímetro interno para imprimir o perímetro externo. Esta opção requer um mínimo de 3 perímetros para ser eficaz, pois imprime os perímetros internos a partir do terceiro perímetro em diante primeiro, depois o perímetro externo e, por fim, o primeiro perímetro interno. Esta opção é recomendada em relação à opção Exterior/Interior na maioria dos casos. \n" +"Use Interior/Exterior/Interior para o melhor acabamento superficial externo " +"e precisão dimensional, pois o perímetro externo é impresso sem interrupções " +"a partir de um perímetro interno. No entanto, o desempenho da inclinaçãoserá " +"reduzido, pois não há perímetro interno para imprimir o perímetro externo. " +"Esta opção requer um mínimo de 3 perímetros para ser eficaz, pois imprime os " +"perímetros internos a partir do terceiro perímetro em diante primeiro, " +"depois o perímetro externo e, por fim, o primeiro perímetro interno. Esta " +"opção é recomendada em relação à opção Exterior/Interior na maioria dos " +"casos. \n" "\n" -"Use Exterior/Interior para obter os mesmos benefícios de qualidade de parede externa e precisão dimensional da opção Interior/Exterior/Interior. No entanto, as costuras z aparecerão menos consistentes, pois a primeira extrusão de uma nova camada começa em uma superfície visível.\n" +"Use Exterior/Interior para obter os mesmos benefícios de qualidade de parede " +"externa e precisão dimensional da opção Interior/Exterior/Interior. No " +"entanto, as costuras z aparecerão menos consistentes, pois a primeira " +"extrusão de uma nova camada começa em uma superfície visível.\n" "\n" " " @@ -8804,27 +10241,45 @@ msgid "Print infill first" msgstr "Preenchimento primeiro" msgid "" -"Order of wall/infill. When the tickbox is unchecked the walls are printed first, which works best in most cases.\n" +"Order of wall/infill. When the tickbox is unchecked the walls are printed " +"first, which works best in most cases.\n" "\n" -"Printing walls first may help with extreme overhangs as the walls have the neighbouring infill to adhere to. However, the infill will slighly push out the printed walls where it is attached to them, resulting in a worse external surface finish. It can also cause the infill to shine through the external surfaces of the part." +"Printing walls first may help with extreme overhangs as the walls have the " +"neighbouring infill to adhere to. However, the infill will slighly push out " +"the printed walls where it is attached to them, resulting in a worse " +"external surface finish. It can also cause the infill to shine through the " +"external surfaces of the part." msgstr "" -"Ordem de perímetro/preenchimento. Quando a caixa de seleção não está marcada, as paredes são impressas primeiro, o que funciona melhor na maioria dos casos.\n" +"Ordem de perímetro/preenchimento. Quando a caixa de seleção não está " +"marcada, as paredes são impressas primeiro, o que funciona melhor na maioria " +"dos casos.\n" "\n" -"Imprimir as paredes primeiro pode ajudar com overhangs extremos, pois as paredes têm o preenchimento vizinho para aderir. No entanto, o preenchimento empurrará levemente as paredes impressas onde está conectado a elas, resultando em um acabamento de superfície externa pior. Também pode fazer com que o preenchimento apareça através das superfícies externas da peça." +"Imprimir as paredes primeiro pode ajudar com overhangs extremos, pois as " +"paredes têm o preenchimento vizinho para aderir. No entanto, o preenchimento " +"empurrará levemente as paredes impressas onde está conectado a elas, " +"resultando em um acabamento de superfície externa pior. Também pode fazer " +"com que o preenchimento apareça através das superfícies externas da peça." msgid "Wall loop direction" msgstr "Direção da volta do perímetro" msgid "" -"The direction which the wall loops are extruded when looking down from the top.\n" +"The direction which the wall loops are extruded when looking down from the " +"top.\n" "\n" -"By default all walls are extruded in counter-clockwise, unless Reverse on odd is enabled. Set this to any option other than Auto will force the wall direction regardless of the Reverse on odd.\n" +"By default all walls are extruded in counter-clockwise, unless Reverse on " +"odd is enabled. Set this to any option other than Auto will force the wall " +"direction regardless of the Reverse on odd.\n" "\n" "This option will be disabled if sprial vase mode is enabled." msgstr "" -"A direção na qual os loops da perímetro são extrudados quando vistos de cima.\n" +"A direção na qual os loops da perímetro são extrudados quando vistos de " +"cima.\n" "\n" -"Por padrão, todas as paredes são extrudadas no sentido anti-horário, a menos que o Reverso em ímpar esteja ativado. Definir isso como qualquer opção que não seja Automático forçará a direção do perímetro, independentemente do Reverso em ímpar.\n" +"Por padrão, todas as paredes são extrudadas no sentido anti-horário, a menos " +"que o Reverso em ímpar esteja ativado. Definir isso como qualquer opção que " +"não seja Automático forçará a direção do perímetro, independentemente do " +"Reverso em ímpar.\n" "\n" "Esta opção será desativada se o modo de vaso espiral estiver ativado." @@ -8837,17 +10292,29 @@ msgstr "Sentido horário" msgid "Height to rod" msgstr "Altura até a haste" -msgid "Distance of the nozzle tip to the lower rod. Used for collision avoidance in by-object printing." -msgstr "Distância da ponta do bico ao tubo inferior. Usado para evitar colisões na impressão por objeto." +msgid "" +"Distance of the nozzle tip to the lower rod. Used for collision avoidance in " +"by-object printing." +msgstr "" +"Distância da ponta do bico ao tubo inferior. Usado para evitar colisões na " +"impressão por objeto." msgid "Height to lid" msgstr "Altura até a tampa" -msgid "Distance of the nozzle tip to the lid. Used for collision avoidance in by-object printing." -msgstr "Distância da ponta do bico à tampa. Usado para evitar colisões na impressão por objeto." +msgid "" +"Distance of the nozzle tip to the lid. Used for collision avoidance in by-" +"object printing." +msgstr "" +"Distância da ponta do bico à tampa. Usado para evitar colisões na impressão " +"por objeto." -msgid "Clearance radius around extruder. Used for collision avoidance in by-object printing." -msgstr "Raio de folga ao redor do extrusor. Usado para evitar colisões na impressão por objeto." +msgid "" +"Clearance radius around extruder. Used for collision avoidance in by-object " +"printing." +msgstr "" +"Raio de folga ao redor do extrusor. Usado para evitar colisões na impressão " +"por objeto." msgid "Nozzle height" msgstr "Altura do bico" @@ -8858,26 +10325,69 @@ msgstr "Altura da ponta do bico" msgid "Bed mesh min" msgstr "Mínimo do bed mesh" -msgid "This option sets the min point for the allowed bed mesh area. Due to the probe's XY offset, most printers are unable to probe the entire bed. To ensure the probe point does not go outside the bed area, the minimum and maximum points of the bed mesh should be set appropriately. OrcaSlicer ensures that adaptive_bed_mesh_min/adaptive_bed_mesh_max values do not exceed these min/max points. This information can usually be obtained from your printer manufacturer. The default setting is (-99999, -99999), which means there are no limits, thus allowing probing across the entire bed." -msgstr "Esta opção define o ponto mínimo para a área permitida do bed mesh. Devido ao deslocamento XY da sonda, a maioria das impressoras não consegue sondar toda a mesa. Para garantir que o ponto da sonda não saia da área da mesa, os pontos mínimo e máximo do bed mesh devem ser configurados adequadamente. O OrcaSlicer garante que os valores adaptive_bed_mesh_min/adaptive_bed_mesh_max não excedam esses pontos mínimo/máximo. Essas informações geralmente podem ser obtidas com o fabricante da sua impressora. A configuração padrão é (-99999, -99999), o que significa que não há limites, permitindo a sondagem em toda a mesa." +msgid "" +"This option sets the min point for the allowed bed mesh area. Due to the " +"probe's XY offset, most printers are unable to probe the entire bed. To " +"ensure the probe point does not go outside the bed area, the minimum and " +"maximum points of the bed mesh should be set appropriately. OrcaSlicer " +"ensures that adaptive_bed_mesh_min/adaptive_bed_mesh_max values do not " +"exceed these min/max points. This information can usually be obtained from " +"your printer manufacturer. The default setting is (-99999, -99999), which " +"means there are no limits, thus allowing probing across the entire bed." +msgstr "" +"Esta opção define o ponto mínimo para a área permitida do bed mesh. Devido " +"ao deslocamento XY da sonda, a maioria das impressoras não consegue sondar " +"toda a mesa. Para garantir que o ponto da sonda não saia da área da mesa, os " +"pontos mínimo e máximo do bed mesh devem ser configurados adequadamente. O " +"OrcaSlicer garante que os valores adaptive_bed_mesh_min/" +"adaptive_bed_mesh_max não excedam esses pontos mínimo/máximo. Essas " +"informações geralmente podem ser obtidas com o fabricante da sua impressora. " +"A configuração padrão é (-99999, -99999), o que significa que não há " +"limites, permitindo a sondagem em toda a mesa." msgid "Bed mesh max" msgstr "Máximo do bed mesh" -msgid "This option sets the max point for the allowed bed mesh area. Due to the probe's XY offset, most printers are unable to probe the entire bed. To ensure the probe point does not go outside the bed area, the minimum and maximum points of the bed mesh should be set appropriately. OrcaSlicer ensures that adaptive_bed_mesh_min/adaptive_bed_mesh_max values do not exceed these min/max points. This information can usually be obtained from your printer manufacturer. The default setting is (99999, 99999), which means there are no limits, thus allowing probing across the entire bed." -msgstr "Esta opção define o ponto máximo para a área permitida do bed mesh. Devido ao deslocamento XY da sonda, a maioria das impressoras não consegue sondar toda a mesa. Para garantir que o ponto da sonda não saia da área da mesa, os pontos mínimo e máximo do bed mesh devem ser configurados adequadamente. O OrcaSlicer garante que os valores adaptive_bed_mesh_min/adaptive_bed_mesh_max não excedam esses pontos mínimo/máximo. Essas informações geralmente podem ser obtidas com o fabricante da sua impressora. A configuração padrão é (99999, 99999), o que significa que não há limites, permitindo a sondagem em toda a mesa." +msgid "" +"This option sets the max point for the allowed bed mesh area. Due to the " +"probe's XY offset, most printers are unable to probe the entire bed. To " +"ensure the probe point does not go outside the bed area, the minimum and " +"maximum points of the bed mesh should be set appropriately. OrcaSlicer " +"ensures that adaptive_bed_mesh_min/adaptive_bed_mesh_max values do not " +"exceed these min/max points. This information can usually be obtained from " +"your printer manufacturer. The default setting is (99999, 99999), which " +"means there are no limits, thus allowing probing across the entire bed." +msgstr "" +"Esta opção define o ponto máximo para a área permitida do bed mesh. Devido " +"ao deslocamento XY da sonda, a maioria das impressoras não consegue sondar " +"toda a mesa. Para garantir que o ponto da sonda não saia da área da mesa, os " +"pontos mínimo e máximo do bed mesh devem ser configurados adequadamente. O " +"OrcaSlicer garante que os valores adaptive_bed_mesh_min/" +"adaptive_bed_mesh_max não excedam esses pontos mínimo/máximo. Essas " +"informações geralmente podem ser obtidas com o fabricante da sua impressora. " +"A configuração padrão é (99999, 99999), o que significa que não há limites, " +"permitindo a sondagem em toda a mesa." msgid "Probe point distance" msgstr "Distância entre pontos de sonda" -msgid "This option sets the preferred distance between probe points (grid size) for the X and Y directions, with the default being 50mm for both X and Y." -msgstr "Esta opção define a distância preferencial entre pontos de sonda (tamanho da grade) para as direções X e Y, sendo o padrão 50mm para ambas as direções X e Y." +msgid "" +"This option sets the preferred distance between probe points (grid size) for " +"the X and Y directions, with the default being 50mm for both X and Y." +msgstr "" +"Esta opção define a distância preferencial entre pontos de sonda (tamanho da " +"grade) para as direções X e Y, sendo o padrão 50mm para ambas as direções X " +"e Y." msgid "Mesh margin" msgstr "Margem da malha" -msgid "This option determines the additional distance by which the adaptive bed mesh area should be expanded in the XY directions." -msgstr "Esta opção determina a distância adicional pela qual a área do bed mesh adaptável deve ser expandida nas direções XY." +msgid "" +"This option determines the additional distance by which the adaptive bed " +"mesh area should be expanded in the XY directions." +msgstr "" +"Esta opção determina a distância adicional pela qual a área do bed mesh " +"adaptável deve ser expandida nas direções XY." msgid "Extruder Color" msgstr "Cor do extrusor" @@ -8891,32 +10401,63 @@ msgstr "Deslocamento do extrusor" msgid "Flow ratio" msgstr "Fluxo" -msgid "The material may have volumetric change after switching between molten state and crystalline state. This setting changes all extrusion flow of this filament in gcode proportionally. Recommended value range is between 0.95 and 1.05. Maybe you can tune this value to get nice flat surface when there has slight overflow or underflow" -msgstr "O material pode ter mudança volumétrica após a troca entre o estado fundido e o estado cristalino. Esta configuração altera todo o fluxo de extrusão deste filamento no gcode proporcionalmente. A faixa de valores recomendada está entre 0.95 e 1.05. Talvez você possa ajustar esse valor para obter uma superfície plana agradável quando houver um leve transbordamento ou subfluxo" +msgid "" +"The material may have volumetric change after switching between molten state " +"and crystalline state. This setting changes all extrusion flow of this " +"filament in gcode proportionally. Recommended value range is between 0.95 " +"and 1.05. Maybe you can tune this value to get nice flat surface when there " +"has slight overflow or underflow" +msgstr "" +"O material pode ter mudança volumétrica após a troca entre o estado fundido " +"e o estado cristalino. Esta configuração altera todo o fluxo de extrusão " +"deste filamento no gcode proporcionalmente. A faixa de valores recomendada " +"está entre 0.95 e 1.05. Talvez você possa ajustar esse valor para obter uma " +"superfície plana agradável quando houver um leve transbordamento ou subfluxo" msgid "Enable pressure advance" msgstr "Habilitar Pressure advance" -msgid "Enable pressure advance, auto calibration result will be overwriten once enabled." -msgstr "Habilitar Pressure advance, o resultado da calibração automática será sobrescrito uma vez habilitado." +msgid "" +"Enable pressure advance, auto calibration result will be overwriten once " +"enabled." +msgstr "" +"Habilitar Pressure advance, o resultado da calibração automática será " +"sobrescrito uma vez habilitado." msgid "Pressure advance(Klipper) AKA Linear advance factor(Marlin)" -msgstr "Pressure advance(Klipper) também conhecido como Linear advance factor(Marlin)" +msgstr "" +"Pressure advance(Klipper) também conhecido como Linear advance factor(Marlin)" -msgid "Default line width if other line widths are set to 0. If expressed as a %, it will be computed over the nozzle diameter." -msgstr "Largura de linha padrão se outras larguras de linha estiverem definidas como 0. Se expresso como %, será calculado sobre o diâmetro do bico." +msgid "" +"Default line width if other line widths are set to 0. If expressed as a %, " +"it will be computed over the nozzle diameter." +msgstr "" +"Largura de linha padrão se outras larguras de linha estiverem definidas como " +"0. Se expresso como %, será calculado sobre o diâmetro do bico." msgid "Keep fan always on" msgstr "Manter o ventilador sempre ligado" -msgid "If enable this setting, part cooling fan will never be stoped and will run at least at minimum speed to reduce the frequency of starting and stoping" -msgstr "Se habilitar esta configuração, o ventilador de resfriamento da peça nunca será desligado e funcionará pelo menos na velocidade mínima para reduzir a frequência de início e parada" +msgid "" +"If enable this setting, part cooling fan will never be stoped and will run " +"at least at minimum speed to reduce the frequency of starting and stoping" +msgstr "" +"Se habilitar esta configuração, o ventilador de resfriamento da peça nunca " +"será desligado e funcionará pelo menos na velocidade mínima para reduzir a " +"frequência de início e parada" msgid "Layer time" msgstr "Tempo da camada" -msgid "Part cooling fan will be enabled for layers of which estimated time is shorter than this value. Fan speed is interpolated between the minimum and maximum fan speeds according to layer printing time" -msgstr "O ventilador de resfriamento da peça será ativado para camadas cujo tempo estimado seja menor que esse valor. A velocidade do ventilador é interpolada entre as velocidades mínima e máxima do ventilador de acordo com o tempo de impressão da camada" +msgid "" +"Part cooling fan will be enabled for layers of which estimated time is " +"shorter than this value. Fan speed is interpolated between the minimum and " +"maximum fan speeds according to layer printing time" +msgstr "" +"O ventilador de resfriamento da peça será ativado para camadas cujo tempo " +"estimado seja menor que esse valor. A velocidade do ventilador é interpolada " +"entre as velocidades mínima e máxima do ventilador de acordo com o tempo de " +"impressão da camada" msgid "Default color" msgstr "Cor padrão" @@ -8933,11 +10474,22 @@ msgstr "Você pode colocar suas observações sobre o filamento aqui." msgid "Required nozzle HRC" msgstr "HRC do bico requerido" -msgid "Minimum HRC of nozzle required to print the filament. Zero means no checking of nozzle's HRC." -msgstr "HRC mínimo do bico necessário para imprimir o filamento. Zero significa que não há verificação do HRC do bico." +msgid "" +"Minimum HRC of nozzle required to print the filament. Zero means no checking " +"of nozzle's HRC." +msgstr "" +"HRC mínimo do bico necessário para imprimir o filamento. Zero significa que " +"não há verificação do HRC do bico." -msgid "This setting stands for how much volume of filament can be melted and extruded per second. Printing speed is limited by max volumetric speed, in case of too high and unreasonable speed setting. Can't be zero" -msgstr "Essa configuração representa quanto volume de filamento pode ser derretido e extrudado por segundo. A velocidade de impressão é limitada pela fluxo volumétrico máximo, no caso de configurações de velocidade muito altas e irrazoáveis. Não pode ser zero" +msgid "" +"This setting stands for how much volume of filament can be melted and " +"extruded per second. Printing speed is limited by max volumetric speed, in " +"case of too high and unreasonable speed setting. Can't be zero" +msgstr "" +"Essa configuração representa quanto volume de filamento pode ser derretido e " +"extrudado por segundo. A velocidade de impressão é limitada pela fluxo " +"volumétrico máximo, no caso de configurações de velocidade muito altas e " +"irrazoáveis. Não pode ser zero" msgid "mm³/s" msgstr "mm³/s" @@ -8946,27 +10498,42 @@ msgid "Filament load time" msgstr "Tempo de carga do filamento" msgid "Time to load new filament when switch filament. For statistics only" -msgstr "Tempo para carregar novo filamento ao trocar de filamento. Apenas para estatísticas" +msgstr "" +"Tempo para carregar novo filamento ao trocar de filamento. Apenas para " +"estatísticas" msgid "Filament unload time" msgstr "Tempo de descarga do filamento" msgid "Time to unload old filament when switch filament. For statistics only" -msgstr "Tempo para descarregar o filamento antigo ao trocar de filamento. Apenas para estatísticas" +msgstr "" +"Tempo para descarregar o filamento antigo ao trocar de filamento. Apenas " +"para estatísticas" -msgid "Filament diameter is used to calculate extrusion in gcode, so it's important and should be accurate" -msgstr "O diâmetro do filamento é usado para calcular a extrusão no gcode, portanto, é importante e deve ser preciso" +msgid "" +"Filament diameter is used to calculate extrusion in gcode, so it's important " +"and should be accurate" +msgstr "" +"O diâmetro do filamento é usado para calcular a extrusão no gcode, portanto, " +"é importante e deve ser preciso" msgid "Shrinkage" msgstr "Retração" #, no-c-format, no-boost-format msgid "" -"Enter the shrinkage percentage that the filament will get after cooling (94% if you measure 94mm instead of 100mm). The part will be scaled in xy to compensate. Only the filament used for the perimeter is taken into account.\n" -"Be sure to allow enough space between objects, as this compensation is done after the checks." +"Enter the shrinkage percentage that the filament will get after cooling (94% " +"if you measure 94mm instead of 100mm). The part will be scaled in xy to " +"compensate. Only the filament used for the perimeter is taken into account.\n" +"Be sure to allow enough space between objects, as this compensation is done " +"after the checks." msgstr "" -"Informe a porcentagem de retração que o filamento terá após o resfriamento (94% se você medir 94mm em vez de 100mm). A peça será escalada em xy para compensar. Apenas o filamento usado para o perímetro é levado em consideração.\n" -"Certifique-se de permitir espaço suficiente entre objetos, pois essa compensação é feita após as verificações." +"Informe a porcentagem de retração que o filamento terá após o resfriamento " +"(94% se você medir 94mm em vez de 100mm). A peça será escalada em xy para " +"compensar. Apenas o filamento usado para o perímetro é levado em " +"consideração.\n" +"Certifique-se de permitir espaço suficiente entre objetos, pois essa " +"compensação é feita após as verificações." msgid "Loading speed" msgstr "Velocidade de carregamento" @@ -8983,62 +10550,121 @@ msgstr "Velocidade usada no início da fase de carregamento." msgid "Unloading speed" msgstr "Velocidade de descarregamento" -msgid "Speed used for unloading the filament on the wipe tower (does not affect initial part of unloading just after ramming)." -msgstr "Velocidade usada para descarregar o filamento na torre de limpeza (não afeta a parte inicial do descarregamento logo após o esmagamento)." +msgid "" +"Speed used for unloading the filament on the wipe tower (does not affect " +"initial part of unloading just after ramming)." +msgstr "" +"Velocidade usada para descarregar o filamento na torre de limpeza (não afeta " +"a parte inicial do descarregamento logo após o esmagamento)." msgid "Unloading speed at the start" msgstr "Velocidade de descarregamento no início" -msgid "Speed used for unloading the tip of the filament immediately after ramming." -msgstr "Velocidade usada para descarregar a ponta do filamento imediatamente após o esmagamento." +msgid "" +"Speed used for unloading the tip of the filament immediately after ramming." +msgstr "" +"Velocidade usada para descarregar a ponta do filamento imediatamente após o " +"esmagamento." msgid "Delay after unloading" msgstr "Atraso após o descarregamento" -msgid "Time to wait after the filament is unloaded. May help to get reliable toolchanges with flexible materials that may need more time to shrink to original dimensions." -msgstr "Tempo de espera após o filamento ser descarregado. Pode ajudar a obter trocas de ferramentas confiáveis com materiais flexíveis que podem precisar de mais tempo para encolher para as dimensões originais." +msgid "" +"Time to wait after the filament is unloaded. May help to get reliable " +"toolchanges with flexible materials that may need more time to shrink to " +"original dimensions." +msgstr "" +"Tempo de espera após o filamento ser descarregado. Pode ajudar a obter " +"trocas de ferramentas confiáveis com materiais flexíveis que podem precisar " +"de mais tempo para encolher para as dimensões originais." msgid "Number of cooling moves" msgstr "Número de movimentos de resfriamento" -msgid "Filament is cooled by being moved back and forth in the cooling tubes. Specify desired number of these moves." -msgstr "O filamento é resfriado movendo-se para frente e para trás nos tubos de resfriamento. Especifique o número desejado desses movimentos." +msgid "" +"Filament is cooled by being moved back and forth in the cooling tubes. " +"Specify desired number of these moves." +msgstr "" +"O filamento é resfriado movendo-se para frente e para trás nos tubos de " +"resfriamento. Especifique o número desejado desses movimentos." msgid "Speed of the first cooling move" msgstr "Velocidade do primeiro movimento de resfriamento" msgid "Cooling moves are gradually accelerating beginning at this speed." -msgstr "Os movimentos de resfriamento estão gradualmente acelerando a partir desta velocidade." +msgstr "" +"Os movimentos de resfriamento estão gradualmente acelerando a partir desta " +"velocidade." msgid "Minimal purge on wipe tower" msgstr "Purga mínima na torre de limpeza" -msgid "After a tool change, the exact position of the newly loaded filament inside the nozzle may not be known, and the filament pressure is likely not yet stable. Before purging the print head into an infill or a sacrificial object, Orca Slicer will always prime this amount of material into the wipe tower to produce successive infill or sacrificial object extrusions reliably." -msgstr "Após uma troca de ferramenta, a posição exata do filamento recém-carregado dentro do bico pode não ser conhecida e a pressão do filamento provavelmente ainda não está estável. Antes de purgar a cabeça de impressão em um preenchimento ou objeto sacrificial, o Orca Slicer sempre irá primear essa quantidade de material na torre de limpeza para produzir extrusões de preenchimento ou objeto sacrificial sucessivas de forma confiável." +msgid "" +"After a tool change, the exact position of the newly loaded filament inside " +"the nozzle may not be known, and the filament pressure is likely not yet " +"stable. Before purging the print head into an infill or a sacrificial " +"object, Orca Slicer will always prime this amount of material into the wipe " +"tower to produce successive infill or sacrificial object extrusions reliably." +msgstr "" +"Após uma troca de ferramenta, a posição exata do filamento recém-carregado " +"dentro do bico pode não ser conhecida e a pressão do filamento provavelmente " +"ainda não está estável. Antes de purgar a cabeça de impressão em um " +"preenchimento ou objeto sacrificial, o Orca Slicer sempre irá primear essa " +"quantidade de material na torre de limpeza para produzir extrusões de " +"preenchimento ou objeto sacrificial sucessivas de forma confiável." msgid "Speed of the last cooling move" msgstr "Velocidade do último movimento de resfriamento" msgid "Cooling moves are gradually accelerating towards this speed." -msgstr "Os movimentos de resfriamento estão gradualmente acelerando em direção a esta velocidade." +msgstr "" +"Os movimentos de resfriamento estão gradualmente acelerando em direção a " +"esta velocidade." -msgid "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new filament during a tool change (when executing the T code). This time is added to the total print time by the G-code time estimator." -msgstr "Tempo para o firmware da impressora (ou a Unidade de Material Multi 2.0) carregar um novo filamento durante uma troca de ferramenta (ao executar o código T). Este tempo é adicionado ao tempo total de impressão pelo estimador de tempo do G-code." +msgid "" +"Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " +"filament during a tool change (when executing the T code). This time is " +"added to the total print time by the G-code time estimator." +msgstr "" +"Tempo para o firmware da impressora (ou a Unidade de Material Multi 2.0) " +"carregar um novo filamento durante uma troca de ferramenta (ao executar o " +"código T). Este tempo é adicionado ao tempo total de impressão pelo " +"estimador de tempo do G-code." msgid "Ramming parameters" msgstr "Parâmetros de esmagamento" -msgid "This string is edited by RammingDialog and contains ramming specific parameters." -msgstr "Esta frase é editada pelo RammingDialog e contém parâmetros específicos de esmagamento." +msgid "" +"This string is edited by RammingDialog and contains ramming specific " +"parameters." +msgstr "" +"Esta frase é editada pelo RammingDialog e contém parâmetros específicos de " +"esmagamento." -msgid "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a filament during a tool change (when executing the T code). This time is added to the total print time by the G-code time estimator." -msgstr "Tempo para o firmware da impressora (ou a Unidade de Material Multi 2.0) descarregar um filamento durante uma troca de ferramenta (ao executar o código T). Este tempo é adicionado ao tempo total de impressão pelo estimador de tempo do G-code." +msgid "" +"Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " +"filament during a tool change (when executing the T code). This time is " +"added to the total print time by the G-code time estimator." +msgstr "" +"Tempo para o firmware da impressora (ou a Unidade de Material Multi 2.0) " +"descarregar um filamento durante uma troca de ferramenta (ao executar o " +"código T). Este tempo é adicionado ao tempo total de impressão pelo " +"estimador de tempo do G-code." msgid "Enable ramming for multitool setups" msgstr "Habilitar esmagamento para configurações de várias ferramentas" -msgid "Perform ramming when using multitool printer (i.e. when the 'Single Extruder Multimaterial' in Printer Settings is unchecked). When checked, a small amount of filament is rapidly extruded on the wipe tower just before the toolchange. This option is only used when the wipe tower is enabled." -msgstr "Realizar esmagamento ao usar impressora multitool (ou seja, quando a opção 'Único Extrusor Multimaterial' em Configurações de Impressora está desmarcada). Quando ativado, uma pequena quantidade de filamento é rapidamente extrudada na torre de limpeza logo antes da troca de ferramenta. Esta opção é usada apenas quando a torre de limpeza está habilitada." +msgid "" +"Perform ramming when using multitool printer (i.e. when the 'Single Extruder " +"Multimaterial' in Printer Settings is unchecked). When checked, a small " +"amount of filament is rapidly extruded on the wipe tower just before the " +"toolchange. This option is only used when the wipe tower is enabled." +msgstr "" +"Realizar esmagamento ao usar impressora multitool (ou seja, quando a opção " +"'Único Extrusor Multimaterial' em Configurações de Impressora está " +"desmarcada). Quando ativado, uma pequena quantidade de filamento é " +"rapidamente extrudada na torre de limpeza logo antes da troca de ferramenta. " +"Esta opção é usada apenas quando a torre de limpeza está habilitada." msgid "Multitool ramming volume" msgstr "Volume de esmagamento multitool" @@ -9067,20 +10693,32 @@ msgstr "O tipo de material do filamento" msgid "Soluble material" msgstr "Material solúvel" -msgid "Soluble material is commonly used to print support and support interface" -msgstr "O material solúvel é comumente usado para imprimir suporte e interface de suporte" +msgid "" +"Soluble material is commonly used to print support and support interface" +msgstr "" +"O material solúvel é comumente usado para imprimir suporte e interface de " +"suporte" msgid "Support material" msgstr "Material de suporte" -msgid "Support material is commonly used to print support and support interface" -msgstr "O material de suporte é comumente usado para imprimir suporte e interface de suporte" +msgid "" +"Support material is commonly used to print support and support interface" +msgstr "" +"O material de suporte é comumente usado para imprimir suporte e interface de " +"suporte" msgid "Softening temperature" msgstr "Temperatura de amolecimento" -msgid "The material softens at this temperature, so when the bed temperature is equal to or greater than it, it's highly recommended to open the front door and/or remove the upper glass to avoid cloggings." -msgstr "O material amolece a esta temperatura, portanto, quando a temperatura da mesa for igual ou maior que ela, é altamente recomendável abrir a porta da frente e/ou remover o vidro superior para evitar entupimentos." +msgid "" +"The material softens at this temperature, so when the bed temperature is " +"equal to or greater than it, it's highly recommended to open the front door " +"and/or remove the upper glass to avoid cloggings." +msgstr "" +"O material amolece a esta temperatura, portanto, quando a temperatura da " +"mesa for igual ou maior que ela, é altamente recomendável abrir a porta da " +"frente e/ou remover o vidro superior para evitar entupimentos." msgid "Price" msgstr "Preço" @@ -9103,15 +10741,24 @@ msgstr "(Indefinido)" msgid "Infill direction" msgstr "Direção de preenchimento" -msgid "Angle for sparse infill pattern, which controls the start or main direction of line" -msgstr "Ângulo para o padrão de preenchimento não sólido, que controla o início ou a direção principal da linha" +msgid "" +"Angle for sparse infill pattern, which controls the start or main direction " +"of line" +msgstr "" +"Ângulo para o padrão de preenchimento não sólido, que controla o início ou a " +"direção principal da linha" msgid "Sparse infill density" msgstr "Densidade do preenchimento" #, no-c-format, no-boost-format -msgid "Density of internal sparse infill, 100% turns all sparse infill into solid infill and internal solid infill pattern will be used" -msgstr "Densidade do preenchimento não sólido interno, 100% transforma todo o preenchimento não sólido em preenchimento sólido e será usado o padrão de preenchimento sólido interno" +msgid "" +"Density of internal sparse infill, 100% turns all sparse infill into solid " +"infill and internal solid infill pattern will be used" +msgstr "" +"Densidade do preenchimento não sólido interno, 100% transforma todo o " +"preenchimento não sólido em preenchimento sólido e será usado o padrão de " +"preenchimento sólido interno" msgid "Sparse infill pattern" msgstr "Padrão de preenchimento" @@ -9149,15 +10796,35 @@ msgstr "Cúbico de Suporte" msgid "Lightning" msgstr "Relâmpago" +msgid "Cross Hatch" +msgstr "" + msgid "Sparse infill anchor length" msgstr "Comp. da âncora de preenchimento" msgid "" -"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max. \n" -"Set this parameter to zero to disable anchoring perimeters connected to a single infill line." +"Connect an infill line to an internal perimeter with a short segment of an " +"additional perimeter. If expressed as percentage (example: 15%) it is " +"calculated over infill extrusion width. Orca Slicer tries to connect two " +"close infill lines to a short perimeter segment. If no such perimeter " +"segment shorter than infill_anchor_max is found, the infill line is " +"connected to a perimeter segment at just one side and the length of the " +"perimeter segment taken is limited to this parameter, but no longer than " +"anchor_length_max. \n" +"Set this parameter to zero to disable anchoring perimeters connected to a " +"single infill line." msgstr "" -"Conecte uma linha de preenchimento a um perímetro interno com um segmento curto de um perímetro adicional. Se expresso como porcentagem (exemplo: 15%), é calculado sobre a largura de extrusão do preenchimento. O Orca Slicer tenta conectar duas linhas de preenchimento próximas a um segmento curto de perímetro. Se nenhum segmento de perímetro mais curto que infill_anchor_max for encontrado, a linha de preenchimento é conectada a um segmento de perímetro em apenas um lado e o comprimento do segmento de perímetro tomado é limitado a este parâmetro, mas não mais do que anchor_length_max. \n" -"Defina este parâmetro como zero para desabilitar os perímetros de ancoragem conectados a uma única linha de preenchimento." +"Conecte uma linha de preenchimento a um perímetro interno com um segmento " +"curto de um perímetro adicional. Se expresso como porcentagem (exemplo: " +"15%), é calculado sobre a largura de extrusão do preenchimento. O Orca " +"Slicer tenta conectar duas linhas de preenchimento próximas a um segmento " +"curto de perímetro. Se nenhum segmento de perímetro mais curto que " +"infill_anchor_max for encontrado, a linha de preenchimento é conectada a um " +"segmento de perímetro em apenas um lado e o comprimento do segmento de " +"perímetro tomado é limitado a este parâmetro, mas não mais do que " +"anchor_length_max. \n" +"Defina este parâmetro como zero para desabilitar os perímetros de ancoragem " +"conectados a uma única linha de preenchimento." msgid "0 (no open anchors)" msgstr "0 (sem ancoras abertas)" @@ -9169,11 +10836,27 @@ msgid "Maximum length of the infill anchor" msgstr "Comp. máx. da âncora de preench." msgid "" -"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter. \n" -"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0." +"Connect an infill line to an internal perimeter with a short segment of an " +"additional perimeter. If expressed as percentage (example: 15%) it is " +"calculated over infill extrusion width. Orca Slicer tries to connect two " +"close infill lines to a short perimeter segment. If no such perimeter " +"segment shorter than this parameter is found, the infill line is connected " +"to a perimeter segment at just one side and the length of the perimeter " +"segment taken is limited to infill_anchor, but no longer than this " +"parameter. \n" +"If set to 0, the old algorithm for infill connection will be used, it should " +"create the same result as with 1000 & 0." msgstr "" -"Conecte uma linha de preenchimento a um perímetro interno com um segmento curto de um perímetro adicional. Se expresso como porcentagem (exemplo: 15%), é calculado sobre a largura de extrusão do preenchimento. O Orca Slicer tenta conectar duas linhas de preenchimento próximas a um segmento curto de perímetro. Se nenhum segmento de perímetro mais curto que este parâmetro for encontrado, a linha de preenchimento é conectada a um segmento de perímetro em apenas um lado e o comprimento do segmento de perímetro tomado é limitado a infill_anchor, mas não mais do que este parâmetro. \n" -"Se definido como 0, o antigo algoritmo de conexão de preenchimento será usado, ele deve criar o mesmo resultado que com 1000 e 0." +"Conecte uma linha de preenchimento a um perímetro interno com um segmento " +"curto de um perímetro adicional. Se expresso como porcentagem (exemplo: " +"15%), é calculado sobre a largura de extrusão do preenchimento. O Orca " +"Slicer tenta conectar duas linhas de preenchimento próximas a um segmento " +"curto de perímetro. Se nenhum segmento de perímetro mais curto que este " +"parâmetro for encontrado, a linha de preenchimento é conectada a um segmento " +"de perímetro em apenas um lado e o comprimento do segmento de perímetro " +"tomado é limitado a infill_anchor, mas não mais do que este parâmetro. \n" +"Se definido como 0, o antigo algoritmo de conexão de preenchimento será " +"usado, ele deve criar o mesmo resultado que com 1000 e 0." msgid "0 (Simple connect)" msgstr "0 (Conexão simples)" @@ -9187,26 +10870,51 @@ msgstr "Aceleração das paredes internas" msgid "Acceleration of travel moves" msgstr "Aceleração dos movimentos de deslocamento" -msgid "Acceleration of top surface infill. Using a lower value may improve top surface quality" -msgstr "Aceleração do preenchimento da superfície superior. Usar um valor menor pode melhorar a qualidade da superfície superior" +msgid "" +"Acceleration of top surface infill. Using a lower value may improve top " +"surface quality" +msgstr "" +"Aceleração do preenchimento da superfície superior. Usar um valor menor pode " +"melhorar a qualidade da superfície superior" msgid "Acceleration of outer wall. Using a lower value can improve quality" -msgstr "Aceleração do perímetro externo. Usar um valor menor pode melhorar a qualidade" +msgstr "" +"Aceleração do perímetro externo. Usar um valor menor pode melhorar a " +"qualidade" -msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration." -msgstr "Aceleração das pontes. Se o valor for expresso como uma porcentagem (por exemplo, 50%), será calculado com base na aceleração do perímetro externo." +msgid "" +"Acceleration of bridges. If the value is expressed as a percentage (e.g. " +"50%), it will be calculated based on the outer wall acceleration." +msgstr "" +"Aceleração das pontes. Se o valor for expresso como uma porcentagem (por " +"exemplo, 50%), será calculado com base na aceleração do perímetro externo." msgid "mm/s² or %" msgstr "mm/s² ou %" -msgid "Acceleration of sparse infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration." -msgstr "Aceleração do preenchimento não sólido. Se o valor for expresso como uma porcentagem (por exemplo, 100%), será calculado com base na aceleração padrão." +msgid "" +"Acceleration of sparse infill. If the value is expressed as a percentage (e." +"g. 100%), it will be calculated based on the default acceleration." +msgstr "" +"Aceleração do preenchimento não sólido. Se o valor for expresso como uma " +"porcentagem (por exemplo, 100%), será calculado com base na aceleração " +"padrão." -msgid "Acceleration of internal solid infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration." -msgstr "Aceleração do preenchimento sólido interno. Se o valor for expresso como uma porcentagem (por exemplo, 100%), será calculado com base na aceleração padrão." +msgid "" +"Acceleration of internal solid infill. If the value is expressed as a " +"percentage (e.g. 100%), it will be calculated based on the default " +"acceleration." +msgstr "" +"Aceleração do preenchimento sólido interno. Se o valor for expresso como uma " +"porcentagem (por exemplo, 100%), será calculado com base na aceleração " +"padrão." -msgid "Acceleration of initial layer. Using a lower value can improve build plate adhesive" -msgstr "Aceleração da primeira camada. Usar um valor menor pode melhorar a adesão à mesa" +msgid "" +"Acceleration of initial layer. Using a lower value can improve build plate " +"adhesive" +msgstr "" +"Aceleração da primeira camada. Usar um valor menor pode melhorar a adesão à " +"mesa" msgid "Enable accel_to_decel" msgstr "Habilitar accel_to_decel" @@ -9218,8 +10926,10 @@ msgid "accel_to_decel" msgstr "accel_to_decel" #, c-format, boost-format -msgid "Klipper's max_accel_to_decel will be adjusted to this %% of acceleration" -msgstr "O max_accel_to_decel do Klipper será ajustado para esse %% de aceleração" +msgid "" +"Klipper's max_accel_to_decel will be adjusted to this %% of acceleration" +msgstr "" +"O max_accel_to_decel do Klipper será ajustado para esse %% de aceleração" msgid "Jerk of outer walls" msgstr "Jerk nas paredes externas" @@ -9239,14 +10949,22 @@ msgstr "Jerk na primeira camada" msgid "Jerk for travel" msgstr "Jerk no deslocamento" -msgid "Line width of initial layer. If expressed as a %, it will be computed over the nozzle diameter." -msgstr "Largura da linha da primeira camada. Se expresso como uma %, será calculado sobre o diâmetro do bico." +msgid "" +"Line width of initial layer. If expressed as a %, it will be computed over " +"the nozzle diameter." +msgstr "" +"Largura da linha da primeira camada. Se expresso como uma %, será calculado " +"sobre o diâmetro do bico." msgid "Initial layer height" msgstr "Altura da primeira camada" -msgid "Height of initial layer. Making initial layer height to be thick slightly can improve build plate adhension" -msgstr "Altura da primeira camada. Tornar a altura da primeira camada ligeiramente espessa pode melhorar a adesão à mesa" +msgid "" +"Height of initial layer. Making initial layer height to be thick slightly " +"can improve build plate adhension" +msgstr "" +"Altura da primeira camada. Tornar a altura da primeira camada ligeiramente " +"espessa pode melhorar a adesão à mesa" msgid "Speed of initial layer except the solid infill part" msgstr "Velocidade da primeira camada, exceto a parte de preenchimento sólido" @@ -9266,35 +10984,60 @@ msgstr "Velocidade de deslocamento da primeira camada" msgid "Number of slow layers" msgstr "Número de camadas lentas" -msgid "The first few layers are printed slower than normal. The speed is gradually increased in a linear fashion over the specified number of layers." -msgstr "As primeiras camadas são impressas mais lentamente do que o normal. A velocidade é aumentada gradualmente de forma linear sobre o número especificado de camadas." +msgid "" +"The first few layers are printed slower than normal. The speed is gradually " +"increased in a linear fashion over the specified number of layers." +msgstr "" +"As primeiras camadas são impressas mais lentamente do que o normal. A " +"velocidade é aumentada gradualmente de forma linear sobre o número " +"especificado de camadas." msgid "Initial layer nozzle temperature" msgstr "Temperatura do bico da primeira camada" msgid "Nozzle temperature to print initial layer when using this filament" -msgstr "Temperatura do bico para imprimir a primeira camada ao usar este filamento" +msgstr "" +"Temperatura do bico para imprimir a primeira camada ao usar este filamento" msgid "Full fan speed at layer" msgstr "Velocidade total do ventilador na camada" -msgid "Fan speed will be ramped up linearly from zero at layer \"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower than \"close_fan_the_first_x_layers\", in which case the fan will be running at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." -msgstr "A velocidade do ventilador aumentará linearmente de zero na camada \"close_fan_the_first_x_layers\" para o máximo na camada \"full_fan_speed_layer\". \"full_fan_speed_layer\" será ignorado se for menor que \"close_fan_the_first_x_layers\", caso em que o ventilador funcionará na velocidade máxima permitida na camada \"close_fan_the_first_x_layers\" + 1." +msgid "" +"Fan speed will be ramped up linearly from zero at layer " +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +msgstr "" +"A velocidade do ventilador aumentará linearmente de zero na camada " +"\"close_fan_the_first_x_layers\" para o máximo na camada " +"\"full_fan_speed_layer\". \"full_fan_speed_layer\" será ignorado se for " +"menor que \"close_fan_the_first_x_layers\", caso em que o ventilador " +"funcionará na velocidade máxima permitida na camada " +"\"close_fan_the_first_x_layers\" + 1." msgid "Support interface fan speed" msgstr "Velocidade do ventilador de interface de suporte" msgid "" -"This fan speed is enforced during all support interfaces, to be able to weaken their bonding with a high fan speed.\n" +"This fan speed is enforced during all support interfaces, to be able to " +"weaken their bonding with a high fan speed.\n" "Set to -1 to disable this override.\n" "Can only be overriden by disable_fan_first_layers." msgstr "" -"Esta velocidade do ventilador é aplicada durante todas as interfaces de suporte, para enfraquecer sua ligação com uma alta velocidade do ventilador.\n" +"Esta velocidade do ventilador é aplicada durante todas as interfaces de " +"suporte, para enfraquecer sua ligação com uma alta velocidade do " +"ventilador.\n" "Defina como -1 para desativar esta substituição.\n" "Só pode ser substituído por disable_fan_first_layers." -msgid "Randomly jitter while printing the wall, so that the surface has a rough look. This setting controls the fuzzy position" -msgstr "Movimento aleatório durante a impressão do perímetro, de modo que a superfície tenha uma aparência áspera. Essa configuração controla a textura fuzzy" +msgid "" +"Randomly jitter while printing the wall, so that the surface has a rough " +"look. This setting controls the fuzzy position" +msgstr "" +"Movimento aleatório durante a impressão do perímetro, de modo que a " +"superfície tenha uma aparência áspera. Essa configuração controla a textura " +"fuzzy" msgid "Contour" msgstr "Contorno" @@ -9308,14 +11051,22 @@ msgstr "Todas as paredes" msgid "Fuzzy skin thickness" msgstr "Espessura da textura fuzzy" -msgid "The width within which to jitter. It's adversed to be below outer wall line width" -msgstr "A largura dentro da qual tremer. É desaconselhável que seja menor do que a largura da linha do perímetro externo" +msgid "" +"The width within which to jitter. It's adversed to be below outer wall line " +"width" +msgstr "" +"A largura dentro da qual tremer. É desaconselhável que seja menor do que a " +"largura da linha do perímetro externo" msgid "Fuzzy skin point distance" msgstr "Distância do ponto da textura fuzzy" -msgid "The average diatance between the random points introducded on each line segment" -msgstr "A distância média entre os pontos aleatórios introduzidos em cada segmento de linha" +msgid "" +"The average diatance between the random points introducded on each line " +"segment" +msgstr "" +"A distância média entre os pontos aleatórios introduzidos em cada segmento " +"de linha" msgid "Apply fuzzy skin to first layer" msgstr "Aplicar texture fuzzy à primeira camada" @@ -9332,38 +11083,62 @@ msgstr "Camadas e Perímetros" msgid "Filter out gaps smaller than the threshold specified" msgstr "Filtrar vazios menores que o limite especificado" -msgid "Speed of gap infill. Gap usually has irregular line width and should be printed more slowly" -msgstr "Velocidade de preenchimento de vão. Vazios geralmente têm largura de linha irregular e devem ser impressas mais lentamente" +msgid "" +"Speed of gap infill. Gap usually has irregular line width and should be " +"printed more slowly" +msgstr "" +"Velocidade de preenchimento de vão. Vazios geralmente têm largura de linha " +"irregular e devem ser impressas mais lentamente" msgid "Precise Z height" msgstr "Altura Z precisa" -msgid "Enable this to get precise z height of object after slicing. It will get the precise object height by fine-tuning the layer heights of the last few layers. Note that this is an experimental parameter." -msgstr "Ative isto para obter altura Z precisa do objeto após fatiar. Ele obterá a altura do objeto exata ajustando as alturas da camada das últimas camadas. Observe que este é um parâmetro experimental." +msgid "" +"Enable this to get precise z height of object after slicing. It will get the " +"precise object height by fine-tuning the layer heights of the last few " +"layers. Note that this is an experimental parameter." +msgstr "" +"Ative isto para obter altura Z precisa do objeto após fatiar. Ele obterá a " +"altura do objeto exata ajustando as alturas da camada das últimas camadas. " +"Observe que este é um parâmetro experimental." msgid "Arc fitting" msgstr "Ajuste de arco (Arc fitting)" -msgid "Enable this to get a G-code file which has G2 and G3 moves. And the fitting tolerance is same with resolution" -msgstr "Habilitar isso para obter um arquivo G-code que tenha movimentos G2 e G3. E a tolerância de ajuste é a mesma que a resolução" +msgid "" +"Enable this to get a G-code file which has G2 and G3 moves. And the fitting " +"tolerance is same with resolution" +msgstr "" +"Habilitar isso para obter um arquivo G-code que tenha movimentos G2 e G3. E " +"a tolerância de ajuste é a mesma que a resolução" msgid "Add line number" msgstr "Adicionar número da linha" msgid "Enable this to add line number(Nx) at the beginning of each G-Code line" -msgstr "Habilitar isso para adicionar o número da linha (Nx) no início de cada linha do G-Code" +msgstr "" +"Habilitar isso para adicionar o número da linha (Nx) no início de cada linha " +"do G-Code" msgid "Scan first layer" msgstr "Escanear primeira camada" -msgid "Enable this to enable the camera on printer to check the quality of first layer" -msgstr "Habilitar isso para ativar a câmera na impressora para verificar a qualidade da primeira camada" +msgid "" +"Enable this to enable the camera on printer to check the quality of first " +"layer" +msgstr "" +"Habilitar isso para ativar a câmera na impressora para verificar a qualidade " +"da primeira camada" msgid "Nozzle type" msgstr "Tipo de bico" -msgid "The metallic material of nozzle. This determines the abrasive resistance of nozzle, and what kind of filament can be printed" -msgstr "O material metálico do bico. Isso determina a resistência ao desgaste do bico e que tipo de filamento pode ser impresso" +msgid "" +"The metallic material of nozzle. This determines the abrasive resistance of " +"nozzle, and what kind of filament can be printed" +msgstr "" +"O material metálico do bico. Isso determina a resistência ao desgaste do " +"bico e que tipo de filamento pode ser impresso" msgid "Undefine" msgstr "Não definido" @@ -9380,8 +11155,12 @@ msgstr "Latão" msgid "Nozzle HRC" msgstr "Bico HRC" -msgid "The nozzle's hardness. Zero means no checking for nozzle's hardness during slicing." -msgstr "A dureza do bico. Zero significa que não há verificação da dureza do bico durante a fatiamento." +msgid "" +"The nozzle's hardness. Zero means no checking for nozzle's hardness during " +"slicing." +msgstr "" +"A dureza do bico. Zero significa que não há verificação da dureza do bico " +"durante a fatiamento." msgid "HRC" msgstr "RH" @@ -9408,20 +11187,36 @@ msgid "Best object position" msgstr "Melhor posição do objeto" msgid "Best auto arranging position in range [0,1] w.r.t. bed shape." -msgstr "Melhor posição de arranjo automático na faixa [0,1] em relação ao formato da mesa." - -msgid "Enable this option if machine has auxiliary part cooling fan. G-code command: M106 P2 S(0-255)." -msgstr "Habilitar esta opção se a máquina tiver ventilador auxiliar de resfriamento da peça. Comando G-code: M106 P2 S(0-255)." +msgstr "" +"Melhor posição de arranjo automático na faixa [0,1] em relação ao formato da " +"mesa." msgid "" -"Start the fan this number of seconds earlier than its target start time (you can use fractional seconds). It assumes infinite acceleration for this time estimation, and will only take into account G1 and G0 moves (arc fitting is unsupported).\n" -"It won't move fan comands from custom gcodes (they act as a sort of 'barrier').\n" -"It won't move fan comands into the start gcode if the 'only custom start gcode' is activated.\n" +"Enable this option if machine has auxiliary part cooling fan. G-code " +"command: M106 P2 S(0-255)." +msgstr "" +"Habilitar esta opção se a máquina tiver ventilador auxiliar de resfriamento " +"da peça. Comando G-code: M106 P2 S(0-255)." + +msgid "" +"Start the fan this number of seconds earlier than its target start time (you " +"can use fractional seconds). It assumes infinite acceleration for this time " +"estimation, and will only take into account G1 and G0 moves (arc fitting is " +"unsupported).\n" +"It won't move fan comands from custom gcodes (they act as a sort of " +"'barrier').\n" +"It won't move fan comands into the start gcode if the 'only custom start " +"gcode' is activated.\n" "Use 0 to deactivate." msgstr "" -"Comece o ventilador este número de segundos antes do tempo de início do alvo (você pode usar segundos fracionários). Ele assume aceleração infinita para esta estimativa de tempo e só levará em conta os movimentos G1 e G0 (o ajuste de arco não é suportado).\n" -"Não moverá comandos do ventilador de gcodes personalizados (eles funcionam como uma espécie de 'barreira').\n" -"Não moverá comandos do ventilador para o início do gcode se o 'apenas gcode de início personalizado' estiver ativado.\n" +"Comece o ventilador este número de segundos antes do tempo de início do alvo " +"(você pode usar segundos fracionários). Ele assume aceleração infinita para " +"esta estimativa de tempo e só levará em conta os movimentos G1 e G0 (o " +"ajuste de arco não é suportado).\n" +"Não moverá comandos do ventilador de gcodes personalizados (eles funcionam " +"como uma espécie de 'barreira').\n" +"Não moverá comandos do ventilador para o início do gcode se o 'apenas gcode " +"de início personalizado' estiver ativado.\n" "Use 0 para desativar." msgid "Only overhangs" @@ -9434,12 +11229,18 @@ msgid "Fan kick-start time" msgstr "Tempo de inicialização do ventilador" msgid "" -"Emit a max fan speed command for this amount of seconds before reducing to target speed to kick-start the cooling fan.\n" -"This is useful for fans where a low PWM/power may be insufficient to get the fan started spinning from a stop, or to get the fan up to speed faster.\n" +"Emit a max fan speed command for this amount of seconds before reducing to " +"target speed to kick-start the cooling fan.\n" +"This is useful for fans where a low PWM/power may be insufficient to get the " +"fan started spinning from a stop, or to get the fan up to speed faster.\n" "Set to 0 to deactivate." msgstr "" -"Emita um comando de velocidade máxima do ventilador por esta quantidade de segundos antes de reduzir para a velocidade alvo para iniciar o ventilador de resfriamento.\n" -"Isto é útil para ventiladores onde um baixo PWM/potência pode ser insuficiente para fazer o ventilador começar a girar a partir de uma parada, ou para fazer o ventilador alcançar a velocidade mais rapidamente.\n" +"Emita um comando de velocidade máxima do ventilador por esta quantidade de " +"segundos antes de reduzir para a velocidade alvo para iniciar o ventilador " +"de resfriamento.\n" +"Isto é útil para ventiladores onde um baixo PWM/potência pode ser " +"insuficiente para fazer o ventilador começar a girar a partir de uma parada, " +"ou para fazer o ventilador alcançar a velocidade mais rapidamente.\n" "Defina como 0 para desativar." msgid "Time cost" @@ -9458,7 +11259,8 @@ msgid "" "This option is enabled if machine support controlling chamber temperature\n" "G-code command: M141 S(0-255)" msgstr "" -"Esta opção está habilitada se a máquina suportar o controle da temperatura da câmara.\n" +"Esta opção está habilitada se a máquina suportar o controle da temperatura " +"da câmara.\n" "Comando G-code: M141 S(0-255)" msgid "Support air filtration" @@ -9468,7 +11270,8 @@ msgid "" "Enable this if printer support air filtration\n" "G-code command: M106 P3 S(0-255)" msgstr "" -"Esta opção está habilitada se a máquina suportar o controle da temperatura da câmara.\n" +"Esta opção está habilitada se a máquina suportar o controle da temperatura " +"da câmara.\n" "Comando G-code: M141 S(0-255)" msgid "G-code flavor" @@ -9489,8 +11292,17 @@ msgstr "Ative esta opção se quiser usar vários tipos de mesa" msgid "Label objects" msgstr "Etiquetar objetos" -msgid "Enable this to add comments into the G-Code labeling print moves with what object they belong to, which is useful for the Octoprint CancelObject plugin. This settings is NOT compatible with Single Extruder Multi Material setup and Wipe into Object / Wipe into Infill." -msgstr "Ative isso para adicionar comentários no G-Code etiquetando movimentos de impressão com a qual objeto eles pertencem, o que é útil para o plugin CancelObject do Octoprint. Esta configuração NÃO é compatível com a configuração de Material Múltiplo de Extrusora Única e Limpeza em Objeto / Limpeza em Preenchimento." +msgid "" +"Enable this to add comments into the G-Code labeling print moves with what " +"object they belong to, which is useful for the Octoprint CancelObject " +"plugin. This settings is NOT compatible with Single Extruder Multi Material " +"setup and Wipe into Object / Wipe into Infill." +msgstr "" +"Ative isso para adicionar comentários no G-Code etiquetando movimentos de " +"impressão com a qual objeto eles pertencem, o que é útil para o plugin " +"CancelObject do Octoprint. Esta configuração NÃO é compatível com a " +"configuração de Material Múltiplo de Extrusora Única e Limpeza em Objeto / " +"Limpeza em Preenchimento." msgid "Exclude objects" msgstr "Excluir objetos" @@ -9501,26 +11313,46 @@ msgstr "Ative esta opção para adicionar o comando EXCLUDE OBJECT no g-code" msgid "Verbose G-code" msgstr "G-code detalhado" -msgid "Enable this to get a commented G-code file, with each line explained by a descriptive text. If you print from SD card, the additional weight of the file could make your firmware slow down." -msgstr "Ative isso para obter um arquivo G-code comentado, com cada linha explicada por um texto descritivo. Se você imprimir do cartão SD, o peso adicional do arquivo pode fazer com que o firmware fique mais lento." +msgid "" +"Enable this to get a commented G-code file, with each line explained by a " +"descriptive text. If you print from SD card, the additional weight of the " +"file could make your firmware slow down." +msgstr "" +"Ative isso para obter um arquivo G-code comentado, com cada linha explicada " +"por um texto descritivo. Se você imprimir do cartão SD, o peso adicional do " +"arquivo pode fazer com que o firmware fique mais lento." msgid "Infill combination" msgstr "Combinar preenchimento" -msgid "Automatically Combine sparse infill of several layers to print together to reduce time. Wall is still printed with original layer height." -msgstr "Combina automaticamente o preenchimento não sólido de várias camadas para imprimir juntas e reduzir o tempo. O perímetro ainda é impresso com a altura original da camada." +msgid "" +"Automatically Combine sparse infill of several layers to print together to " +"reduce time. Wall is still printed with original layer height." +msgstr "" +"Combina automaticamente o preenchimento não sólido de várias camadas para " +"imprimir juntas e reduzir o tempo. O perímetro ainda é impresso com a altura " +"original da camada." msgid "Filament to print internal sparse infill." msgstr "Filamento para imprimir preenchimento interno não sólido." -msgid "Line width of internal sparse infill. If expressed as a %, it will be computed over the nozzle diameter." -msgstr "Largura da linha do preenchimento interno não sólido. Se expresso como %, será calculado sobre o diâmetro do bico." +msgid "" +"Line width of internal sparse infill. If expressed as a %, it will be " +"computed over the nozzle diameter." +msgstr "" +"Largura da linha do preenchimento interno não sólido. Se expresso como %, " +"será calculado sobre o diâmetro do bico." msgid "Infill/Wall overlap" msgstr "Sobreposição de preenchimento/perímetro" -msgid "Infill area is enlarged slightly to overlap with wall for better bonding. The percentage value is relative to line width of sparse infill" -msgstr "A área de preenchimento é ligeiramente ampliada para se sobrepor ao perímetro para melhor aderência. O valor percentual é relativo à largura da linha do preenchimento não sólido" +msgid "" +"Infill area is enlarged slightly to overlap with wall for better bonding. " +"The percentage value is relative to line width of sparse infill" +msgstr "" +"A área de preenchimento é ligeiramente ampliada para se sobrepor ao " +"perímetro para melhor aderência. O valor percentual é relativo à largura da " +"linha do preenchimento não sólido" msgid "Speed of internal sparse infill" msgstr "Velocidade do preenchimento" @@ -9528,26 +11360,40 @@ msgstr "Velocidade do preenchimento" msgid "Interface shells" msgstr "Paredes de interface" -msgid "Force the generation of solid shells between adjacent materials/volumes. Useful for multi-extruder prints with translucent materials or manual soluble support material" -msgstr "Força a geração de perímetros sólidos entre materiais/volumes adjacentes. Útil para impressões com múltiplos extrusores com materiais translúcidos ou suporte solúvel manual" +msgid "" +"Force the generation of solid shells between adjacent materials/volumes. " +"Useful for multi-extruder prints with translucent materials or manual " +"soluble support material" +msgstr "" +"Força a geração de perímetros sólidos entre materiais/volumes adjacentes. " +"Útil para impressões com múltiplos extrusores com materiais translúcidos ou " +"suporte solúvel manual" msgid "Maximum width of a segmented region" msgstr "Largura máxima de uma região segmentada" msgid "Maximum width of a segmented region. Zero disables this feature." -msgstr "Largura máxima de uma região segmentada. Zero desativa essa funcionalidade." +msgstr "" +"Largura máxima de uma região segmentada. Zero desativa essa funcionalidade." msgid "Interlocking depth of a segmented region" msgstr "Profundidade de entrelaçamento de uma região segmentada" msgid "Interlocking depth of a segmented region. Zero disables this feature." -msgstr "Profundidade de entrelaçamento de uma região segmentada. Zero desativa essa funcionalidade." +msgstr "" +"Profundidade de entrelaçamento de uma região segmentada. Zero desativa essa " +"funcionalidade." msgid "Ironing Type" msgstr "Tipo do passar ferro" -msgid "Ironing is using small flow to print on same height of surface again to make flat surface more smooth. This setting controls which layer being ironed" -msgstr "Passar a ferro utiliza um pequeno fluxo para imprimir na mesma altura da superfície novamente para deixá-la mais lisa. Esta configuração controla qual camada está sendo passada a ferro" +msgid "" +"Ironing is using small flow to print on same height of surface again to make " +"flat surface more smooth. This setting controls which layer being ironed" +msgstr "" +"Passar a ferro utiliza um pequeno fluxo para imprimir na mesma altura da " +"superfície novamente para deixá-la mais lisa. Esta configuração controla " +"qual camada está sendo passada a ferro" msgid "No ironing" msgstr "Desativado" @@ -9570,8 +11416,13 @@ msgstr "O padrão que será usado ao passar a ferro" msgid "Ironing flow" msgstr "Fluxo do passar ferro" -msgid "The amount of material to extrude during ironing. Relative to flow of normal layer height. Too high value results in overextrusion on the surface" -msgstr "A quantidade de material a extrudar durante o passar a ferro. Relativo ao fluxo da altura normal da camada. Um valor muito alto resulta em superextrusão na superfície" +msgid "" +"The amount of material to extrude during ironing. Relative to flow of normal " +"layer height. Too high value results in overextrusion on the surface" +msgstr "" +"A quantidade de material a extrudar durante o passar a ferro. Relativo ao " +"fluxo da altura normal da camada. Um valor muito alto resulta em " +"superextrusão na superfície" msgid "Ironing line spacing" msgstr "Espaçamento de linha do passar ferro" @@ -9588,17 +11439,26 @@ msgstr "Velocidade de impressão das linhas do passar ferro" msgid "Ironing angle" msgstr "Ângulo do passar ferro" -msgid "The angle ironing is done at. A negative number disables this function and uses the default method." -msgstr "O ângulo em que o passar a ferro é feito. Um número negativo desativa essa função e usa o método padrão." +msgid "" +"The angle ironing is done at. A negative number disables this function and " +"uses the default method." +msgstr "" +"O ângulo em que o passar a ferro é feito. Um número negativo desativa essa " +"função e usa o método padrão." msgid "This gcode part is inserted at every layer change after lift z" -msgstr "Esta parte do gcode é inserida em cada mudança de camada após levantar z" +msgstr "" +"Esta parte do gcode é inserida em cada mudança de camada após levantar z" msgid "Supports silent mode" msgstr "Suporta modo silencioso" -msgid "Whether the machine supports silent mode in which machine use lower acceleration to print" -msgstr "Se a máquina suporta o modo silencioso, no qual a máquina usa uma aceleração mais baixa para imprimir" +msgid "" +"Whether the machine supports silent mode in which machine use lower " +"acceleration to print" +msgstr "" +"Se a máquina suporta o modo silencioso, no qual a máquina usa uma aceleração " +"mais baixa para imprimir" msgid "Emit limits to G-code" msgstr "Emitir limites para o G-code" @@ -9613,8 +11473,12 @@ msgstr "" "Se ativado, os limites da máquina serão emitidos para o arquivo de G-code.\n" "Esta opção será ignorada se o tipo do G-code estiver definido para Klipper." -msgid "This G-code will be used as a code for the pause print. User can insert pause G-code in gcode viewer" -msgstr "Este G-code será usado como um código para pausar a impressão. O usuário pode inserir o G-code de pausa no visualizador de G-code" +msgid "" +"This G-code will be used as a code for the pause print. User can insert " +"pause G-code in gcode viewer" +msgstr "" +"Este G-code será usado como um código para pausar a impressão. O usuário " +"pode inserir o G-code de pausa no visualizador de G-code" msgid "This G-code will be used as a custom code" msgstr "Este G-code será usado como um código personalizado" @@ -9628,8 +11492,16 @@ msgstr "Habilitar compensação de fluxo para áreas de preenchimento pequenas" msgid "Flow Compensation Model" msgstr "Modelo de Compensação de Fluxo" -msgid "Flow Compensation Model, used to adjust the flow for small infill areas. The model is expressed as a comma separated pair of values for extrusion length and flow correction factors, one per line, in the following format: \"1.234,5.678\"" -msgstr "Modelo de Compensação de Fluxo, usado para ajustar o fluxo para áreas de preenchimento pequenas. O modelo é expresso como um par de valores separados por vírgula para o comprimento de extrusão e os fatores de correção de fluxo, um por linha, no seguinte formato: \"1.234,5.678\"" +msgid "" +"Flow Compensation Model, used to adjust the flow for small infill areas. The " +"model is expressed as a comma separated pair of values for extrusion length " +"and flow correction factors, one per line, in the following format: " +"\"1.234,5.678\"" +msgstr "" +"Modelo de Compensação de Fluxo, usado para ajustar o fluxo para áreas de " +"preenchimento pequenas. O modelo é expresso como um par de valores separados " +"por vírgula para o comprimento de extrusão e os fatores de correção de " +"fluxo, um por linha, no seguinte formato: \"1.234,5.678\"" msgid "Maximum speed X" msgstr "Velocidade máxima X" @@ -9731,44 +11603,82 @@ msgid "Maximum acceleration for travel" msgstr "Aceleração máxima para deslocamento" msgid "Maximum acceleration for travel (M204 T), it only applies to Marlin 2" -msgstr "Aceleração máxima para deslocamento (M204 T), aplica-se apenas ao Marlin 2" +msgstr "" +"Aceleração máxima para deslocamento (M204 T), aplica-se apenas ao Marlin 2" -msgid "Part cooling fan speed may be increased when auto cooling is enabled. This is the maximum speed limitation of part cooling fan" -msgstr "A velocidade do ventilador de resfriamento da peça pode ser aumentada quando o resfriamento automático está habilitado. Este é o limite máximo de velocidade do ventilador de resfriamento da peça" +msgid "" +"Part cooling fan speed may be increased when auto cooling is enabled. This " +"is the maximum speed limitation of part cooling fan" +msgstr "" +"A velocidade do ventilador de resfriamento da peça pode ser aumentada quando " +"o resfriamento automático está habilitado. Este é o limite máximo de " +"velocidade do ventilador de resfriamento da peça" msgid "Max" msgstr "Máx" -msgid "The largest printable layer height for extruder. Used tp limits the maximum layer hight when enable adaptive layer height" -msgstr "A maior altura de camada imprimível para o extrusor. Usado para limitar a altura máxima da camada quando a altura da camada adaptativa está ativada" +msgid "" +"The largest printable layer height for extruder. Used tp limits the maximum " +"layer hight when enable adaptive layer height" +msgstr "" +"A maior altura de camada imprimível para o extrusor. Usado para limitar a " +"altura máxima da camada quando a altura da camada adaptativa está ativada" msgid "Extrusion rate smoothing" msgstr "Suavização da extrusão" msgid "" -"This parameter smooths out sudden extrusion rate changes that happen when the printer transitions from printing a high flow (high speed/larger width) extrusion to a lower flow (lower speed/smaller width) extrusion and vice versa.\n" +"This parameter smooths out sudden extrusion rate changes that happen when " +"the printer transitions from printing a high flow (high speed/larger width) " +"extrusion to a lower flow (lower speed/smaller width) extrusion and vice " +"versa.\n" "\n" -"It defines the maximum rate by which the extruded volumetric flow in mm3/sec can change over time. Higher values mean higher extrusion rate changes are allowed, resulting in faster speed transitions.\n" +"It defines the maximum rate by which the extruded volumetric flow in mm3/sec " +"can change over time. Higher values mean higher extrusion rate changes are " +"allowed, resulting in faster speed transitions.\n" "\n" "A value of 0 disables the feature. \n" "\n" -"For a high speed, high flow direct drive printer (like the Bambu lab or Voron) this value is usually not needed. However it can provide some marginal benefit in certain cases where feature speeds vary greatly. For example, when there are aggressive slowdowns due to overhangs. In these cases a high value of around 300-350mm3/s2 is recommended as this allows for just enough smoothing to assist pressure advance achieve a smoother flow transition.\n" +"For a high speed, high flow direct drive printer (like the Bambu lab or " +"Voron) this value is usually not needed. However it can provide some " +"marginal benefit in certain cases where feature speeds vary greatly. For " +"example, when there are aggressive slowdowns due to overhangs. In these " +"cases a high value of around 300-350mm3/s2 is recommended as this allows for " +"just enough smoothing to assist pressure advance achieve a smoother flow " +"transition.\n" "\n" -"For slower printers without pressure advance, the value should be set much lower. A value of 10-15mm3/s2 is a good starting point for direct drive extruders and 5-10mm3/s2 for Bowden style. \n" +"For slower printers without pressure advance, the value should be set much " +"lower. A value of 10-15mm3/s2 is a good starting point for direct drive " +"extruders and 5-10mm3/s2 for Bowden style. \n" "\n" "This feature is known as Pressure Equalizer in Prusa slicer.\n" "\n" "Note: this parameter disables arc fitting." msgstr "" -"Este parâmetro suaviza as mudanças súbitas na taxa de extrusão que ocorrem quando a impressora faz a transição de uma extrusão de alto fluxo (alta velocidade/maior largura) para uma extrusão de baixo fluxo (baixa velocidade/menor largura) e vice-versa.\n" +"Este parâmetro suaviza as mudanças súbitas na taxa de extrusão que ocorrem " +"quando a impressora faz a transição de uma extrusão de alto fluxo (alta " +"velocidade/maior largura) para uma extrusão de baixo fluxo (baixa velocidade/" +"menor largura) e vice-versa.\n" "\n" -"Define a taxa máxima pela qual o fluxo volumétrico extrudado em mm3/seg pode mudar ao longo do tempo. Valores mais altos significam que mudanças de taxa de extrusão mais altas são permitidas, resultando em transições de velocidade mais rápidas.\n" +"Define a taxa máxima pela qual o fluxo volumétrico extrudado em mm3/seg pode " +"mudar ao longo do tempo. Valores mais altos significam que mudanças de taxa " +"de extrusão mais altas são permitidas, resultando em transições de " +"velocidade mais rápidas.\n" "\n" "Um valor de 0 desativa o recurso.\n" "\n" -"Para uma impressora de acionamento direto de alta velocidade e alto fluxo (como a Bambu lab ou Voron), esse valor geralmente não é necessário. No entanto, pode fornecer alguns benefícios marginais em certos casos em que as velocidades das características variam muito. Por exemplo, quando há desacelerações agressivas devido a overhangs. Nesses casos, um valor alto de cerca de 300-350mm3/s2 é recomendado, pois isso permite apenas suavização suficiente para ajudar o Pressure advance a alcançar uma transição de fluxo mais suave.\n" +"Para uma impressora de acionamento direto de alta velocidade e alto fluxo " +"(como a Bambu lab ou Voron), esse valor geralmente não é necessário. No " +"entanto, pode fornecer alguns benefícios marginais em certos casos em que as " +"velocidades das características variam muito. Por exemplo, quando há " +"desacelerações agressivas devido a overhangs. Nesses casos, um valor alto de " +"cerca de 300-350mm3/s2 é recomendado, pois isso permite apenas suavização " +"suficiente para ajudar o Pressure advance a alcançar uma transição de fluxo " +"mais suave.\n" "\n" -"Para impressoras mais lentas sem Pressure advance, o valor deve ser definido muito mais baixo. Um valor de 10-15mm3/s2 é um bom ponto de partida para extrusoras de acionamento direto e 5-10mm3/s2 para estilo Bowden.\n" +"Para impressoras mais lentas sem Pressure advance, o valor deve ser definido " +"muito mais baixo. Um valor de 10-15mm3/s2 é um bom ponto de partida para " +"extrusoras de acionamento direto e 5-10mm3/s2 para estilo Bowden.\n" "\n" "Este recurso é conhecido como Equalizador de Pressão no slicer Prusa.\n" "\n" @@ -9781,15 +11691,22 @@ msgid "Smoothing segment length" msgstr "Distancia do segmento de suavização" msgid "" -"A lower value results in smoother extrusion rate transitions. However, this results in a significantly larger gcode file and more instructions for the printer to process. \n" +"A lower value results in smoother extrusion rate transitions. However, this " +"results in a significantly larger gcode file and more instructions for the " +"printer to process. \n" "\n" -"Default value of 3 works well for most cases. If your printer is stuttering, increase this value to reduce the number of adjustments made\n" +"Default value of 3 works well for most cases. If your printer is stuttering, " +"increase this value to reduce the number of adjustments made\n" "\n" "Allowed values: 1-5" msgstr "" -"Um valor menor resulta em transições de extrusão mais suaves. No entanto, isso resulta em um arquivo Gcode significativamente maior e mais instruções para a impressora processar.\n" +"Um valor menor resulta em transições de extrusão mais suaves. No entanto, " +"isso resulta em um arquivo Gcode significativamente maior e mais instruções " +"para a impressora processar.\n" "\n" -"O valor padrão de 3 funciona bem para a maioria dos casos. Se sua impressora estiver engasgando, aumente este valor para reduzir o número de ajustes feitos.\n" +"O valor padrão de 3 funciona bem para a maioria dos casos. Se sua impressora " +"estiver engasgando, aumente este valor para reduzir o número de ajustes " +"feitos.\n" "\n" "Valores permitidos: 1-5" @@ -9797,24 +11714,40 @@ msgid "Minimum speed for part cooling fan" msgstr "Velocidade mínima para o ventilador de resfriamento da peça" msgid "" -"Speed of auxiliary part cooling fan. Auxiliary fan will run at this speed during printing except the first several layers which is defined by no cooling layers.\n" -"Please enable auxiliary_fan in printer settings to use this feature. G-code command: M106 P2 S(0-255)" +"Speed of auxiliary part cooling fan. Auxiliary fan will run at this speed " +"during printing except the first several layers which is defined by no " +"cooling layers.\n" +"Please enable auxiliary_fan in printer settings to use this feature. G-code " +"command: M106 P2 S(0-255)" msgstr "" -"Velocidade do ventilador auxiliar de resfriamento de peças. O ventilador auxiliar funcionará nesta velocidade durante a impressão, exceto nas primeiras camadas, que são definidas por camadas sem resfriamento.\n" +"Velocidade do ventilador auxiliar de resfriamento de peças. O ventilador " +"auxiliar funcionará nesta velocidade durante a impressão, exceto nas " +"primeiras camadas, que são definidas por camadas sem resfriamento.\n" "\n" -"Por favor, habilite o ventilador auxiliar nas configurações da impressora para usar esta função. Comando G-code: M106 P2 S(0-255)" +"Por favor, habilite o ventilador auxiliar nas configurações da impressora " +"para usar esta função. Comando G-code: M106 P2 S(0-255)" msgid "Min" msgstr "Mín" -msgid "The lowest printable layer height for extruder. Used tp limits the minimum layer hight when enable adaptive layer height" -msgstr "A menor altura de camada imprimível para o extrusor. Usado para limitar a altura mínima da camada ao habilitar a altura de camada adaptativa" +msgid "" +"The lowest printable layer height for extruder. Used tp limits the minimum " +"layer hight when enable adaptive layer height" +msgstr "" +"A menor altura de camada imprimível para o extrusor. Usado para limitar a " +"altura mínima da camada ao habilitar a altura de camada adaptativa" msgid "Min print speed" msgstr "Velocidade de impressão mínima" -msgid "The minimum printing speed that the printer will slow down to to attempt to maintain the minimum layer time above, when slow down for better layer cooling is enabled." -msgstr "A velocidade de impressão mínima para a qual a impressora diminuirá a velocidade para tentar manter o tempo mínimo de camada acima, quando a desaceleração para um melhor resfriamento da camada estiver habilitada." +msgid "" +"The minimum printing speed that the printer will slow down to to attempt to " +"maintain the minimum layer time above, when slow down for better layer " +"cooling is enabled." +msgstr "" +"A velocidade de impressão mínima para a qual a impressora diminuirá a " +"velocidade para tentar manter o tempo mínimo de camada acima, quando a " +"desaceleração para um melhor resfriamento da camada estiver habilitada." msgid "Nozzle diameter" msgstr "Diâmetro do bico" @@ -9825,14 +11758,22 @@ msgstr "Diâmetro do bico" msgid "Configuration notes" msgstr "Notas de configuração" -msgid "You can put here your personal notes. This text will be added to the G-code header comments." -msgstr "Você pode colocar aqui suas notas pessoais. Este texto será adicionado aos comentários do cabeçalho do G-code." +msgid "" +"You can put here your personal notes. This text will be added to the G-code " +"header comments." +msgstr "" +"Você pode colocar aqui suas notas pessoais. Este texto será adicionado aos " +"comentários do cabeçalho do G-code." msgid "Host Type" msgstr "Tipo de Host" -msgid "Orca Slicer can upload G-code files to a printer host. This field must contain the kind of the host." -msgstr "O Orca Slicer pode carregar arquivos de código G para um hospedeiro de impressora. Este campo deve conter o tipo de hospedeiro." +msgid "" +"Orca Slicer can upload G-code files to a printer host. This field must " +"contain the kind of the host." +msgstr "" +"O Orca Slicer pode carregar arquivos de código G para um hospedeiro de " +"impressora. Este campo deve conter o tipo de hospedeiro." msgid "Nozzle volume" msgstr "Volume do bico" @@ -9844,43 +11785,74 @@ msgid "Cooling tube position" msgstr "Posição do tubo de resfriamento" msgid "Distance of the center-point of the cooling tube from the extruder tip." -msgstr "Distância do ponto central do tubo de resfriamento da ponta do extrusor." +msgstr "" +"Distância do ponto central do tubo de resfriamento da ponta do extrusor." msgid "Cooling tube length" msgstr "Comprimento do tubo de resfriamento" msgid "Length of the cooling tube to limit space for cooling moves inside it." -msgstr "Comprimento do tubo de resfriamento para limitar o espaço para movimentos de resfriamento dentro dele." +msgstr "" +"Comprimento do tubo de resfriamento para limitar o espaço para movimentos de " +"resfriamento dentro dele." msgid "High extruder current on filament swap" msgstr "Corrente do extrusor alta na troca de filamento" -msgid "It may be beneficial to increase the extruder motor current during the filament exchange sequence to allow for rapid ramming feed rates and to overcome resistance when loading a filament with an ugly shaped tip." -msgstr "Pode ser benéfico aumentar a corrente do motor do extrusor durante a sequência de troca de filamento para permitir taxas de avanço rápidas e para superar a resistência ao carregar um filamento com uma ponta com forma desagradável." +msgid "" +"It may be beneficial to increase the extruder motor current during the " +"filament exchange sequence to allow for rapid ramming feed rates and to " +"overcome resistance when loading a filament with an ugly shaped tip." +msgstr "" +"Pode ser benéfico aumentar a corrente do motor do extrusor durante a " +"sequência de troca de filamento para permitir taxas de avanço rápidas e para " +"superar a resistência ao carregar um filamento com uma ponta com forma " +"desagradável." msgid "Filament parking position" msgstr "Posição de estacionamento do filamento" -msgid "Distance of the extruder tip from the position where the filament is parked when unloaded. This should match the value in printer firmware." -msgstr "Distância da ponta do extrusor da posição onde o filamento é estacionado quando descarregado. Isso deve corresponder ao valor no firmware da impressora." +msgid "" +"Distance of the extruder tip from the position where the filament is parked " +"when unloaded. This should match the value in printer firmware." +msgstr "" +"Distância da ponta do extrusor da posição onde o filamento é estacionado " +"quando descarregado. Isso deve corresponder ao valor no firmware da " +"impressora." msgid "Extra loading distance" msgstr "Distância de carregamento extra" -msgid "When set to zero, the distance the filament is moved from parking position during load is exactly the same as it was moved back during unload. When positive, it is loaded further, if negative, the loading move is shorter than unloading." -msgstr "Quando definido como zero, a distância que o filamento é movido da posição de estacionamento durante o carregamento é exatamente a mesma que foi movida durante o descarregamento. Quando positivo, é carregado mais longe, se negativo, o movimento de carregamento é mais curto do que o descarregamento." +msgid "" +"When set to zero, the distance the filament is moved from parking position " +"during load is exactly the same as it was moved back during unload. When " +"positive, it is loaded further, if negative, the loading move is shorter " +"than unloading." +msgstr "" +"Quando definido como zero, a distância que o filamento é movido da posição " +"de estacionamento durante o carregamento é exatamente a mesma que foi movida " +"durante o descarregamento. Quando positivo, é carregado mais longe, se " +"negativo, o movimento de carregamento é mais curto do que o descarregamento." msgid "Start end points" msgstr "Pontos de início e fim" msgid "The start and end points which is from cutter area to garbage can." -msgstr "Os pontos de início e fim que vão da área do cortador até a lata de lixo." +msgstr "" +"Os pontos de início e fim que vão da área do cortador até a lata de lixo." msgid "Reduce infill retraction" msgstr "Reduzir retração durante o preenchimento" -msgid "Don't retract when the travel is in infill area absolutely. That means the oozing can't been seen. This can reduce times of retraction for complex model and save printing time, but make slicing and G-code generating slower" -msgstr "Não retrair quando o movimento está na área de preenchimento completamente. Isso significa que o vazamento não pode ser visto. Isso pode reduzir o número de retratações para modelos complexos e economizar tempo de impressão, mas torna a geração de fatiamento e G-code mais lenta" +msgid "" +"Don't retract when the travel is in infill area absolutely. That means the " +"oozing can't been seen. This can reduce times of retraction for complex " +"model and save printing time, but make slicing and G-code generating slower" +msgstr "" +"Não retrair quando o movimento está na área de preenchimento completamente. " +"Isso significa que o vazamento não pode ser visto. Isso pode reduzir o " +"número de retratações para modelos complexos e economizar tempo de " +"impressão, mas torna a geração de fatiamento e G-code mais lenta" msgid "Filename format" msgstr "Formato do nome do arquivo" @@ -9897,14 +11869,24 @@ msgstr "Modifica a geometria para imprimir overhangs sem suporte." msgid "Make overhangs printable - Maximum angle" msgstr "Overhangs imprimíveis - ângulo máx" -msgid "Maximum angle of overhangs to allow after making more steep overhangs printable.90° will not change the model at all and allow any overhang, while 0 will replace all overhangs with conical material." -msgstr "Ângulo máximo do overhang permitido antes de fazer ângulos mais íngremes imprimíveis. 90° não vai fazer nenhuma mudança no modelo e vai permitir qualquer overhang. 0 vai substituir todos overhangs por uma forma cônica." +msgid "" +"Maximum angle of overhangs to allow after making more steep overhangs " +"printable.90° will not change the model at all and allow any overhang, while " +"0 will replace all overhangs with conical material." +msgstr "" +"Ângulo máximo do overhang permitido antes de fazer ângulos mais íngremes " +"imprimíveis. 90° não vai fazer nenhuma mudança no modelo e vai permitir " +"qualquer overhang. 0 vai substituir todos overhangs por uma forma cônica." msgid "Make overhangs printable - Hole area" msgstr "Overhangs imprimíveis - área do furo" -msgid "Maximum area of a hole in the base of the model before it's filled by conical material.A value of 0 will fill all the holes in the model base." -msgstr "Área maxima de um furo na base do modelo antes que ele seja preenchido por uma forma cônica. Um valor 0 irá preencher todos os furos do modelo." +msgid "" +"Maximum area of a hole in the base of the model before it's filled by " +"conical material.A value of 0 will fill all the holes in the model base." +msgstr "" +"Área maxima de um furo na base do modelo antes que ele seja preenchido por " +"uma forma cônica. Um valor 0 irá preencher todos os furos do modelo." msgid "mm²" msgstr "mm2" @@ -9913,11 +11895,20 @@ msgid "Detect overhang wall" msgstr "Detectar overhangs" #, c-format, boost-format -msgid "Detect the overhang percentage relative to line width and use different speed to print. For 100%% overhang, bridge speed is used." -msgstr "Detecta a porcentagem relativa de overhang em relação a largura do perímetro e usa uma velocidade diferente de impressão. Para overhangs 100%%, a velocidade de ponte é usada." +msgid "" +"Detect the overhang percentage relative to line width and use different " +"speed to print. For 100%% overhang, bridge speed is used." +msgstr "" +"Detecta a porcentagem relativa de overhang em relação a largura do perímetro " +"e usa uma velocidade diferente de impressão. Para overhangs 100%%, a " +"velocidade de ponte é usada." -msgid "Line width of inner wall. If expressed as a %, it will be computed over the nozzle diameter." -msgstr "Largura do perímetro interno. Se expressado como %, será computado de acordo com o diâmetro do bico." +msgid "" +"Line width of inner wall. If expressed as a %, it will be computed over the " +"nozzle diameter." +msgstr "" +"Largura do perímetro interno. Se expressado como %, será computado de acordo " +"com o diâmetro do bico." msgid "Speed of inner wall" msgstr "Velocidade do perímetro interno" @@ -9929,20 +11920,37 @@ msgid "Alternate extra wall" msgstr "Parede extra alternada" msgid "" -"This setting adds an extra wall to every other layer. This way the infill gets wedged vertically between the walls, resulting in stronger prints. \n" +"This setting adds an extra wall to every other layer. This way the infill " +"gets wedged vertically between the walls, resulting in stronger prints. \n" "\n" -"When this option is enabled, the ensure vertical shell thickness option needs to be disabled. \n" +"When this option is enabled, the ensure vertical shell thickness option " +"needs to be disabled. \n" "\n" -"Using lightning infill together with this option is not recommended as there is limited infill to anchor the extra perimeters to." +"Using lightning infill together with this option is not recommended as there " +"is limited infill to anchor the extra perimeters to." msgstr "" -"Esta configuração adiciona um perímetro extra a cada duas camadas. Dessa forma, o preenchimento fica encaixado verticalmente entre as paredes, resultando em impressões mais resistentes. \n" +"Esta configuração adiciona um perímetro extra a cada duas camadas. Dessa " +"forma, o preenchimento fica encaixado verticalmente entre as paredes, " +"resultando em impressões mais resistentes. \n" "\n" -"Quando esta opção está ativada, a opção de garantir a espessura vertical do perímetro precisa ser desativada. \n" +"Quando esta opção está ativada, a opção de garantir a espessura vertical do " +"perímetro precisa ser desativada. \n" "\n" -"Não é recomendado usar o preenchimento rápido juntamente com esta opção, pois há preenchimento limitado para ancorar os perímetros extras." +"Não é recomendado usar o preenchimento rápido juntamente com esta opção, " +"pois há preenchimento limitado para ancorar os perímetros extras." -msgid "If you want to process the output G-code through custom scripts, just list their absolute paths here. Separate multiple scripts with a semicolon. Scripts will be passed the absolute path to the G-code file as the first argument, and they can access the Orca Slicer config settings by reading environment variables." -msgstr "Se você deseja processar o G-code de saída por meio de scripts personalizados, basta listar seus caminhos absolutos aqui. Separe vários scripts com um ponto e vírgula. Os scripts receberão o caminho absoluto para o arquivo G-code como primeiro argumento, e eles podem acessar as configurações do Orca Slicer lendo variáveis de ambiente." +msgid "" +"If you want to process the output G-code through custom scripts, just list " +"their absolute paths here. Separate multiple scripts with a semicolon. " +"Scripts will be passed the absolute path to the G-code file as the first " +"argument, and they can access the Orca Slicer config settings by reading " +"environment variables." +msgstr "" +"Se você deseja processar o G-code de saída por meio de scripts " +"personalizados, basta listar seus caminhos absolutos aqui. Separe vários " +"scripts com um ponto e vírgula. Os scripts receberão o caminho absoluto para " +"o arquivo G-code como primeiro argumento, e eles podem acessar as " +"configurações do Orca Slicer lendo variáveis de ambiente." msgid "Printer notes" msgstr "Notas da impressora" @@ -9972,28 +11980,47 @@ msgid "Initial layer expansion" msgstr "Expansão da primeira camada" msgid "Expand the first raft or support layer to improve bed plate adhesion" -msgstr "Expanda a primeira camada da base ou suporte para melhorar a adesão à mesa de impressão" +msgstr "" +"Expanda a primeira camada da base ou suporte para melhorar a adesão à mesa " +"de impressão" msgid "Raft layers" msgstr "Camadas da base" -msgid "Object will be raised by this number of support layers. Use this function to avoid wrapping when print ABS" -msgstr "O objeto será elevado por este número de camadas de suporte. Use esta função para evitar o enrugamento ao imprimir ABS" +msgid "" +"Object will be raised by this number of support layers. Use this function to " +"avoid wrapping when print ABS" +msgstr "" +"O objeto será elevado por este número de camadas de suporte. Use esta função " +"para evitar o enrugamento ao imprimir ABS" -msgid "G-code path is genereated after simplifing the contour of model to avoid too much points and gcode lines in gcode file. Smaller value means higher resolution and more time to slice" -msgstr "O caminho do G-code é gerado após simplificar o contorno do modelo para evitar muitos pontos e linhas de código G no arquivo de código G. Um valor menor significa maior resolução e mais tempo para fatiar" +msgid "" +"G-code path is genereated after simplifing the contour of model to avoid too " +"much points and gcode lines in gcode file. Smaller value means higher " +"resolution and more time to slice" +msgstr "" +"O caminho do G-code é gerado após simplificar o contorno do modelo para " +"evitar muitos pontos e linhas de código G no arquivo de código G. Um valor " +"menor significa maior resolução e mais tempo para fatiar" msgid "Travel distance threshold" msgstr "Limiar de distância de deslocamento" -msgid "Only trigger retraction when the travel distance is longer than this threshold" -msgstr "Disparar a retração somente quando a distância da deslocamento for maior que este limite" +msgid "" +"Only trigger retraction when the travel distance is longer than this " +"threshold" +msgstr "" +"Disparar a retração somente quando a distância da deslocamento for maior que " +"este limite" msgid "Retract amount before wipe" msgstr "Quantidade de retração antes da limpeza" -msgid "The length of fast retraction before wipe, relative to retraction length" -msgstr "O comprimento da retração rápida antes da limpeza, em relação ao comprimento da retração" +msgid "" +"The length of fast retraction before wipe, relative to retraction length" +msgstr "" +"O comprimento da retração rápida antes da limpeza, em relação ao comprimento " +"da retração" msgid "Retract when change layer" msgstr "Retrair ao mudar de camada" @@ -10004,38 +12031,68 @@ msgstr "Forçar uma retração ao mudar de camada" msgid "Retraction Length" msgstr "Distância de retração" -msgid "Some amount of material in extruder is pulled back to avoid ooze during long travel. Set zero to disable retraction" -msgstr "Alguma quantidade de material no extrusor é puxada para trás para evitar oozing durante viagens longas. Defina zero para desativar a retração" +msgid "" +"Some amount of material in extruder is pulled back to avoid ooze during long " +"travel. Set zero to disable retraction" +msgstr "" +"Alguma quantidade de material no extrusor é puxada para trás para evitar " +"oozing durante viagens longas. Defina zero para desativar a retração" msgid "Long retraction when cut(experimental)" msgstr "Retração longa quando cortado(experimental)" -msgid "Experimental feature.Retracting and cutting off the filament at a longer distance during changes to minimize purge.While this reduces flush significantly, it may also raise the risk of nozzle clogs or other printing problems." -msgstr "Recurso experimental. Retrair e cortar o filamento a uma distância mais longa durante mudanças para minimizar a purgação. Isto reduz significativamente o destaque, pode também aumentar o risco de bolhas no bico ou de outros problemas de impressão." +msgid "" +"Experimental feature.Retracting and cutting off the filament at a longer " +"distance during changes to minimize purge.While this reduces flush " +"significantly, it may also raise the risk of nozzle clogs or other printing " +"problems." +msgstr "" +"Recurso experimental. Retrair e cortar o filamento a uma distância mais " +"longa durante mudanças para minimizar a purgação. Isto reduz " +"significativamente o destaque, pode também aumentar o risco de bolhas no " +"bico ou de outros problemas de impressão." msgid "Retraction distance when cut" msgstr "Distância de retração ao cortar" -msgid "Experimental feature.Retraction length before cutting off during filament change" -msgstr "Funcionalidade experimental. Comprimento de retração antes de cortar durante a mudança de filamento" +msgid "" +"Experimental feature.Retraction length before cutting off during filament " +"change" +msgstr "" +"Funcionalidade experimental. Comprimento de retração antes de cortar durante " +"a mudança de filamento" msgid "Z hop when retract" msgstr "Z hop ao retrair" -msgid "Whenever the retraction is done, the nozzle is lifted a little to create clearance between nozzle and the print. It prevents nozzle from hitting the print when travel move. Using spiral line to lift z can prevent stringing" -msgstr "Sempre que a retração é feita, o bico é levantado um pouco para criar folga entre o bico e a impressão. Isso evita que o bico atinja a impressão ao se mover. Usar linha espiral para levantar z pode evitar stringing" +msgid "" +"Whenever the retraction is done, the nozzle is lifted a little to create " +"clearance between nozzle and the print. It prevents nozzle from hitting the " +"print when travel move. Using spiral line to lift z can prevent stringing" +msgstr "" +"Sempre que a retração é feita, o bico é levantado um pouco para criar folga " +"entre o bico e a impressão. Isso evita que o bico atinja a impressão ao se " +"mover. Usar linha espiral para levantar z pode evitar stringing" msgid "Z hop lower boundary" msgstr "Limite inferior do Z hop" -msgid "Z hop will only come into effect when Z is above this value and is below the parameter: \"Z hop upper boundary\"" -msgstr "O Z hop só entrará em vigor quando Z estiver acima deste valor e abaixo do parâmetro: \"Limite superior do Z hop\"" +msgid "" +"Z hop will only come into effect when Z is above this value and is below the " +"parameter: \"Z hop upper boundary\"" +msgstr "" +"O Z hop só entrará em vigor quando Z estiver acima deste valor e abaixo do " +"parâmetro: \"Limite superior do Z hop\"" msgid "Z hop upper boundary" msgstr "Limite superior do Z hop" -msgid "If this value is positive, Z hop will only come into effect when Z is above the parameter: \"Z hop lower boundary\" and is below this value" -msgstr "Se este valor for positivo, o Z hop só entrará em vigor quando Z estiver acima do parâmetro: \"Limite inferior do Z hop\" e abaixo deste valor" +msgid "" +"If this value is positive, Z hop will only come into effect when Z is above " +"the parameter: \"Z hop lower boundary\" and is below this value" +msgstr "" +"Se este valor for positivo, o Z hop só entrará em vigor quando Z estiver " +"acima do parâmetro: \"Limite inferior do Z hop\" e abaixo deste valor" msgid "Z hop type" msgstr "Tipo de Z hop" @@ -10049,20 +12106,32 @@ msgstr "Espiral" msgid "Only lift Z above" msgstr "Elevar Z apenas acima de" -msgid "If you set this to a positive value, Z lift will only take place above the specified absolute Z." -msgstr "Se você definir isso como um valor positivo, a elevação de Z só ocorrerá acima do Z absoluto especificado." +msgid "" +"If you set this to a positive value, Z lift will only take place above the " +"specified absolute Z." +msgstr "" +"Se você definir isso como um valor positivo, a elevação de Z só ocorrerá " +"acima do Z absoluto especificado." msgid "Only lift Z below" msgstr "Elevar Z apenas abaixo de" -msgid "If you set this to a positive value, Z lift will only take place below the specified absolute Z." -msgstr "Se você definir isso como um valor positivo, a elevação de Z só ocorrerá abaixo do Z absoluto especificado." +msgid "" +"If you set this to a positive value, Z lift will only take place below the " +"specified absolute Z." +msgstr "" +"Se você definir isso como um valor positivo, a elevação de Z só ocorrerá " +"abaixo do Z absoluto especificado." msgid "On surfaces" msgstr "Nas superfícies" -msgid "Enforce Z Hop behavior. This setting is impacted by the above settings (Only lift Z above/below)." -msgstr "Forçar Z Hop. Essa configuração é impactada pelas configurações acima (Somente elevar Z acima/abaixo)" +msgid "" +"Enforce Z Hop behavior. This setting is impacted by the above settings (Only " +"lift Z above/below)." +msgstr "" +"Forçar Z Hop. Essa configuração é impactada pelas configurações acima " +"(Somente elevar Z acima/abaixo)" msgid "All Surfaces" msgstr "Todas as superfícies" @@ -10079,11 +12148,20 @@ msgstr "Parte superior e inferior" msgid "Extra length on restart" msgstr "Comprimento extra na reinicialização" -msgid "When the retraction is compensated after the travel move, the extruder will push this additional amount of filament. This setting is rarely needed." -msgstr "Quando a retração é compensada após o movimento de deslocamento, o extrusor empurrará essa quantidade adicional de filamento. Esta configuração é raramente necessária." +msgid "" +"When the retraction is compensated after the travel move, the extruder will " +"push this additional amount of filament. This setting is rarely needed." +msgstr "" +"Quando a retração é compensada após o movimento de deslocamento, o extrusor " +"empurrará essa quantidade adicional de filamento. Esta configuração é " +"raramente necessária." -msgid "When the retraction is compensated after changing tool, the extruder will push this additional amount of filament." -msgstr "Quando a retração é compensada após a troca de ferramenta, o extrusor empurrará essa quantidade adicional de filamento." +msgid "" +"When the retraction is compensated after changing tool, the extruder will " +"push this additional amount of filament." +msgstr "" +"Quando a retração é compensada após a troca de ferramenta, o extrusor " +"empurrará essa quantidade adicional de filamento." msgid "Retraction Speed" msgstr "Velocidade de retração" @@ -10094,14 +12172,23 @@ msgstr "Velocidade das retratações" msgid "Deretraction Speed" msgstr "Velocidade de desretração" -msgid "Speed for reloading filament into extruder. Zero means same speed with retraction" -msgstr "Velocidade para recarregar o filamento no extrusor. Zero significa mesma velocidade de retração" +msgid "" +"Speed for reloading filament into extruder. Zero means same speed with " +"retraction" +msgstr "" +"Velocidade para recarregar o filamento no extrusor. Zero significa mesma " +"velocidade de retração" msgid "Use firmware retraction" msgstr "Usar retração de firmware" -msgid "This experimental setting uses G10 and G11 commands to have the firmware handle the retraction. This is only supported in recent Marlin." -msgstr "Esta configuração experimental usa os comandos G10 e G11 para fazer com que o firmware gerencie a retração. Isso é suportado apenas no Marlin mais recente." +msgid "" +"This experimental setting uses G10 and G11 commands to have the firmware " +"handle the retraction. This is only supported in recent Marlin." +msgstr "" +"Esta configuração experimental usa os comandos G10 e G11 para fazer com que " +"o firmware gerencie a retração. Isso é suportado apenas no Marlin mais " +"recente." msgid "Show auto-calibration marks" msgstr "Mostrar marcas de autocalibração automática" @@ -10109,8 +12196,11 @@ msgstr "Mostrar marcas de autocalibração automática" msgid "Disable set remaining print time" msgstr "Desabilitar definir tempo de impressão restante" -msgid "Disable generating of the M73: Set remaining print time in the final gcode" -msgstr "Desativar a geração do M73: Definir tempo restante de impressão no código final" +msgid "" +"Disable generating of the M73: Set remaining print time in the final gcode" +msgstr "" +"Desativar a geração do M73: Definir tempo restante de impressão no código " +"final" msgid "Seam position" msgstr "Posição da costura" @@ -10133,53 +12223,100 @@ msgstr "Aleatório" msgid "Staggered inner seams" msgstr "Costuras internas escalonadas" -msgid "This option causes the inner seams to be shifted backwards based on their depth, forming a zigzag pattern." -msgstr "Esta opção faz com que as costuras internas sejam deslocadas para trás com base em sua profundidade, formando um padrão de zigue-zague." +msgid "" +"This option causes the inner seams to be shifted backwards based on their " +"depth, forming a zigzag pattern." +msgstr "" +"Esta opção faz com que as costuras internas sejam deslocadas para trás com " +"base em sua profundidade, formando um padrão de zigue-zague." msgid "Seam gap" msgstr "Espaço entre costuras" msgid "" -"In order to reduce the visibility of the seam in a closed loop extrusion, the loop is interrupted and shortened by a specified amount.\n" -"This amount can be specified in millimeters or as a percentage of the current extruder diameter. The default value for this parameter is 10%." +"In order to reduce the visibility of the seam in a closed loop extrusion, " +"the loop is interrupted and shortened by a specified amount.\n" +"This amount can be specified in millimeters or as a percentage of the " +"current extruder diameter. The default value for this parameter is 10%." msgstr "" -"Para reduzir a visibilidade da costura em uma extrusão de loop fechado, o loop é interrompido e encurtado por uma quantidade especificada.\n" -"Esta quantidade pode ser especificada em milímetros ou como uma porcentagem do diâmetro atual do extrusor. O valor padrão para este parâmetro é 10%." +"Para reduzir a visibilidade da costura em uma extrusão de loop fechado, o " +"loop é interrompido e encurtado por uma quantidade especificada.\n" +"Esta quantidade pode ser especificada em milímetros ou como uma porcentagem " +"do diâmetro atual do extrusor. O valor padrão para este parâmetro é 10%." msgid "Scarf joint seam (beta)" msgstr "Junta Scarf (beta)" msgid "Use scarf joint to minimize seam visibility and increase seam strength." -msgstr "Use a junta Scarf para minimizar a visibilidade da costura e aumentar a resistência da costura." +msgstr "" +"Use a junta Scarf para minimizar a visibilidade da costura e aumentar a " +"resistência da costura." msgid "Conditional scarf joint" msgstr "Junta Scarf condicional" -msgid "Apply scarf joints only to smooth perimeters where traditional seams do not conceal the seams at sharp corners effectively." -msgstr "Aplique juntas Scarf apenas em perímetros suaves onde costuras tradicionais não escondem as costuras em cantos agudos de forma eficaz." +msgid "" +"Apply scarf joints only to smooth perimeters where traditional seams do not " +"conceal the seams at sharp corners effectively." +msgstr "" +"Aplique juntas Scarf apenas em perímetros suaves onde costuras tradicionais " +"não escondem as costuras em cantos agudos de forma eficaz." msgid "Conditional angle threshold" msgstr "Ângulo condicional" msgid "" -"This option sets the threshold angle for applying a conditional scarf joint seam.\n" -"If the maximum angle within the perimeter loop exceeds this value (indicating the absence of sharp corners), a scarf joint seam will be used. The default value is 155°." +"This option sets the threshold angle for applying a conditional scarf joint " +"seam.\n" +"If the maximum angle within the perimeter loop exceeds this value " +"(indicating the absence of sharp corners), a scarf joint seam will be used. " +"The default value is 155°." msgstr "" -"Esta opção define o ângulo limite para aplicar uma costura de junta de cachecol condicional.\n" -"Se o ângulo máximo dentro do loop do perímetro exceder esse valor (indicando a ausência de cantos afiados), será usada uma costura de junta Scarf. O valor padrão é 155°." +"Esta opção define o ângulo limite para aplicar uma costura de junta de " +"cachecol condicional.\n" +"Se o ângulo máximo dentro do loop do perímetro exceder esse valor (indicando " +"a ausência de cantos afiados), será usada uma costura de junta Scarf. O " +"valor padrão é 155°." msgid "Conditional overhang threshold" msgstr "Overhang condicional" #, no-c-format, no-boost-format -msgid "This option determines the overhang threshold for the application of scarf joint seams. If the unsupported portion of the perimeter is less than this threshold, scarf joint seams will be applied. The default threshold is set at 40% of the external wall's width. Due to performance considerations, the degree of overhang is estimated." -msgstr "Esta opção determina o limiar de inclinação para a aplicação de juntas Scarf. Se a parte sem suporte do perímetro for inferior a esse limite, as juntas Scarf serão aplicadas. O limite padrão é definido em 40% da largura do perímetro externo. Devido a considerações de desempenho, o grau de inclinação é estimado." +msgid "" +"This option determines the overhang threshold for the application of scarf " +"joint seams. If the unsupported portion of the perimeter is less than this " +"threshold, scarf joint seams will be applied. The default threshold is set " +"at 40% of the external wall's width. Due to performance considerations, the " +"degree of overhang is estimated." +msgstr "" +"Esta opção determina o limiar de inclinação para a aplicação de juntas " +"Scarf. Se a parte sem suporte do perímetro for inferior a esse limite, as " +"juntas Scarf serão aplicadas. O limite padrão é definido em 40% da largura " +"do perímetro externo. Devido a considerações de desempenho, o grau de " +"inclinação é estimado." msgid "Scarf joint speed" msgstr "Velocidade da junta Scarf" -msgid "This option sets the printing speed for scarf joints. It is recommended to print scarf joints at a slow speed (less than 100 mm/s). It's also advisable to enable 'Extrusion rate smoothing' if the set speed varies significantly from the speed of the outer or inner walls. If the speed specified here is higher than the speed of the outer or inner walls, the printer will default to the slower of the two speeds. When specified as a percentage (e.g., 80%), the speed is calculated based on the respective outer or inner wall speed. The default value is set to 100%." -msgstr "Esta opção define a velocidade de impressão para as juntas Scarf. É recomendável imprimir as juntas Scarf em uma velocidade baixa (menor que 100 mm/s). Também é aconselhável habilitar 'Suavização da taxa de extrusão' se a velocidade definida variar significativamente da velocidade das paredes externas ou internas. Se a velocidade especificada aqui for maior que a velocidade das paredes externas ou internas, a impressora utilizará a mais lenta das duas velocidades. Quando especificado como uma porcentagem (por exemplo, 80%), a velocidade é calculada com base na velocidade do perímetro externo ou interna respectiva. O valor padrão é definido como 100%." +msgid "" +"This option sets the printing speed for scarf joints. It is recommended to " +"print scarf joints at a slow speed (less than 100 mm/s). It's also " +"advisable to enable 'Extrusion rate smoothing' if the set speed varies " +"significantly from the speed of the outer or inner walls. If the speed " +"specified here is higher than the speed of the outer or inner walls, the " +"printer will default to the slower of the two speeds. When specified as a " +"percentage (e.g., 80%), the speed is calculated based on the respective " +"outer or inner wall speed. The default value is set to 100%." +msgstr "" +"Esta opção define a velocidade de impressão para as juntas Scarf. É " +"recomendável imprimir as juntas Scarf em uma velocidade baixa (menor que 100 " +"mm/s). Também é aconselhável habilitar 'Suavização da taxa de extrusão' se a " +"velocidade definida variar significativamente da velocidade das paredes " +"externas ou internas. Se a velocidade especificada aqui for maior que a " +"velocidade das paredes externas ou internas, a impressora utilizará a mais " +"lenta das duas velocidades. Quando especificado como uma porcentagem (por " +"exemplo, 80%), a velocidade é calculada com base na velocidade do perímetro " +"externo ou interna respectiva. O valor padrão é definido como 100%." msgid "Scarf joint flow ratio" msgstr "Fluxo da junta Scarf" @@ -10192,10 +12329,12 @@ msgstr "Altura inicial da junta Scarf" msgid "" "Start height of the scarf.\n" -"This amount can be specified in millimeters or as a percentage of the current layer height. The default value for this parameter is 0." +"This amount can be specified in millimeters or as a percentage of the " +"current layer height. The default value for this parameter is 0." msgstr "" "Altura inicial da junta Scarf.\n" -"Esta quantidade pode ser especificada em milímetros ou como uma porcentagem da altura atual da camada. O valor padrão para este parâmetro é 0." +"Esta quantidade pode ser especificada em milímetros ou como uma porcentagem " +"da altura atual da camada. O valor padrão para este parâmetro é 0." msgid "Scarf around entire wall" msgstr "Junta Scarf em todo o perímetro" @@ -10206,8 +12345,12 @@ msgstr "A junta Scarf se estende por todo o comprimento do perímetro." msgid "Scarf length" msgstr "Comprimento da junta Scarf" -msgid "Length of the scarf. Setting this parameter to zero effectively disables the scarf." -msgstr "Comprimento da junta Scarf. Definir este parâmetro como zero efetivamente desabilita a junta Scarf." +msgid "" +"Length of the scarf. Setting this parameter to zero effectively disables the " +"scarf." +msgstr "" +"Comprimento da junta Scarf. Definir este parâmetro como zero efetivamente " +"desabilita a junta Scarf." msgid "Scarf steps" msgstr "Passos da junta Scarf" @@ -10224,32 +12367,64 @@ msgstr "Usar junta Scarf em paredes internas também." msgid "Role base wipe speed" msgstr "Velocidade de limpeza baseada no tipo de extrusão" -msgid "The wipe speed is determined by the speed of the current extrusion role.e.g. if a wipe action is executed immediately following an outer wall extrusion, the speed of the outer wall extrusion will be utilized for the wipe action." -msgstr "A velocidade de limpeza é determinada pela velocidade do tipo de extrusão atual. Por exemplo, se uma ação de limpeza for executada imediatamente após uma extrusão de perímetro externo, a velocidade da extrusão do perímetro externo será utilizada para a ação de limpeza." +msgid "" +"The wipe speed is determined by the speed of the current extrusion role.e.g. " +"if a wipe action is executed immediately following an outer wall extrusion, " +"the speed of the outer wall extrusion will be utilized for the wipe action." +msgstr "" +"A velocidade de limpeza é determinada pela velocidade do tipo de extrusão " +"atual. Por exemplo, se uma ação de limpeza for executada imediatamente após " +"uma extrusão de perímetro externo, a velocidade da extrusão do perímetro " +"externo será utilizada para a ação de limpeza." msgid "Wipe on loops" msgstr "Limpeza em loops" -msgid "To minimize the visibility of the seam in a closed loop extrusion, a small inward movement is executed before the extruder leaves the loop." -msgstr "Para minimizar a visibilidade da costura em uma extrusão de loop fechado, é executado um pequeno movimento para dentro antes que o extrusor saia do loop." +msgid "" +"To minimize the visibility of the seam in a closed loop extrusion, a small " +"inward movement is executed before the extruder leaves the loop." +msgstr "" +"Para minimizar a visibilidade da costura em uma extrusão de loop fechado, é " +"executado um pequeno movimento para dentro antes que o extrusor saia do loop." msgid "Wipe before external loop" msgstr "Limpeza antes do loop externo" msgid "" -"To minimise visibility of potential overextrusion at the start of an external perimeter when printing with Outer/Inner or Inner/Outer/Inner wall print order, the deretraction is performed slightly on the inside from the start of the external perimeter. That way any potential over extrusion is hidden from the outside surface. \n" +"To minimise visibility of potential overextrusion at the start of an " +"external perimeter when printing with Outer/Inner or Inner/Outer/Inner wall " +"print order, the deretraction is performed slightly on the inside from the " +"start of the external perimeter. That way any potential over extrusion is " +"hidden from the outside surface. \n" "\n" -"This is useful when printing with Outer/Inner or Inner/Outer/Inner wall print order as in these modes it is more likely an external perimeter is printed immediately after a deretraction move." +"This is useful when printing with Outer/Inner or Inner/Outer/Inner wall " +"print order as in these modes it is more likely an external perimeter is " +"printed immediately after a deretraction move." msgstr "" -"Para minimizar a visibilidade de sobreextrusão potencial no início de um perímetro externo ao imprimir com a ordem de impressão de perímetro Externo/Interno ou Interno/Externo/Interno, a desretração é executada ligeiramente no interior a partir do início do perímetro externo. Dessa forma, qualquer sobreextrusão potencial é ocultada da superfície externa. \n" +"Para minimizar a visibilidade de sobreextrusão potencial no início de um " +"perímetro externo ao imprimir com a ordem de impressão de perímetro Externo/" +"Interno ou Interno/Externo/Interno, a desretração é executada ligeiramente " +"no interior a partir do início do perímetro externo. Dessa forma, qualquer " +"sobreextrusão potencial é ocultada da superfície externa. \n" "\n" -"Isso é útil ao imprimir com a ordem de impressão de perímetro Externa/Interna ou Interna/Externa/Interna, pois nesses modos é mais provável que um perímetro externo seja impresso imediatamente após um movimento de desretração." +"Isso é útil ao imprimir com a ordem de impressão de perímetro Externa/" +"Interna ou Interna/Externa/Interna, pois nesses modos é mais provável que um " +"perímetro externo seja impresso imediatamente após um movimento de " +"desretração." msgid "Wipe speed" msgstr "Velocidade de limpeza" -msgid "The wipe speed is determined by the speed setting specified in this configuration.If the value is expressed as a percentage (e.g. 80%), it will be calculated based on the travel speed setting above.The default value for this parameter is 80%" -msgstr "A velocidade de limpeza é determinada pela velocidade especificada nesta configuração. Se o valor for expresso como uma porcentagem (por exemplo, 80%), será calculado com base na configuração de velocidade de deslocamento acima. O valor padrão para este parâmetro é 80%" +msgid "" +"The wipe speed is determined by the speed setting specified in this " +"configuration.If the value is expressed as a percentage (e.g. 80%), it will " +"be calculated based on the travel speed setting above.The default value for " +"this parameter is 80%" +msgstr "" +"A velocidade de limpeza é determinada pela velocidade especificada nesta " +"configuração. Se o valor for expresso como uma porcentagem (por exemplo, " +"80%), será calculado com base na configuração de velocidade de deslocamento " +"acima. O valor padrão para este parâmetro é 80%" msgid "Skirt distance" msgstr "Distância da saia" @@ -10273,40 +12448,87 @@ msgid "Skirt speed" msgstr "Velocidade da saia" msgid "Speed of skirt, in mm/s. Zero means use default layer extrusion speed." -msgstr "Velocidade da saia, em mm/s. Zero significa usar a velocidade padrão de extrusão da camada." +msgstr "" +"Velocidade da saia, em mm/s. Zero significa usar a velocidade padrão de " +"extrusão da camada." -msgid "The printing speed in exported gcode will be slowed down, when the estimated layer time is shorter than this value, to get better cooling for these layers" -msgstr "A velocidade de impressão no gcode exportado será reduzida quando o tempo estimado da camada for menor que esse valor, para obter uma melhor resfriamento para essas camadas" +msgid "" +"The printing speed in exported gcode will be slowed down, when the estimated " +"layer time is shorter than this value, to get better cooling for these layers" +msgstr "" +"A velocidade de impressão no gcode exportado será reduzida quando o tempo " +"estimado da camada for menor que esse valor, para obter uma melhor " +"resfriamento para essas camadas" msgid "Minimum sparse infill threshold" msgstr "Limiar mínimo de preenchimento" -msgid "Sparse infill area which is smaller than threshold value is replaced by internal solid infill" -msgstr "A área de preenchimento não sólido que é menor que o valor de limiar é substituída por preenchimento sólido interno" +msgid "" +"Sparse infill area which is smaller than threshold value is replaced by " +"internal solid infill" +msgstr "" +"A área de preenchimento não sólido que é menor que o valor de limiar é " +"substituída por preenchimento sólido interno" -msgid "Line width of internal solid infill. If expressed as a %, it will be computed over the nozzle diameter." -msgstr "Largura da linha de preenchimento sólido interno. Se expresso como uma %, será calculado sobre o diâmetro do bico." +msgid "" +"Line width of internal solid infill. If expressed as a %, it will be " +"computed over the nozzle diameter." +msgstr "" +"Largura da linha de preenchimento sólido interno. Se expresso como uma %, " +"será calculado sobre o diâmetro do bico." msgid "Speed of internal solid infill, not the top and bottom surface" -msgstr "Velocidade de preenchimento sólido interno, não a superfície superior e inferior" +msgstr "" +"Velocidade de preenchimento sólido interno, não a superfície superior e " +"inferior" -msgid "Spiralize smooths out the z moves of the outer contour. And turns a solid model into a single walled print with solid bottom layers. The final generated model has no seam" -msgstr "A espiralização suaviza os movimentos z do contorno externo. E transforma um modelo sólido em uma impressão de perímetro único com camadas inferiores sólidas. O modelo final gerado não tem costura" +msgid "" +"Spiralize smooths out the z moves of the outer contour. And turns a solid " +"model into a single walled print with solid bottom layers. The final " +"generated model has no seam" +msgstr "" +"A espiralização suaviza os movimentos z do contorno externo. E transforma um " +"modelo sólido em uma impressão de perímetro único com camadas inferiores " +"sólidas. O modelo final gerado não tem costura" msgid "Smooth Spiral" msgstr "Espiral Suave" -msgid "Smooth Spiral smoothes out X and Y moves as wellresulting in no visible seam at all, even in the XY directions on walls that are not vertical" -msgstr "A Espiral Suave suaviza os movimentos X e Y, resultando em nenhuma costura visível, mesmo nas direções XY em paredes que não são verticais" +msgid "" +"Smooth Spiral smoothes out X and Y moves as wellresulting in no visible seam " +"at all, even in the XY directions on walls that are not vertical" +msgstr "" +"A Espiral Suave suaviza os movimentos X e Y, resultando em nenhuma costura " +"visível, mesmo nas direções XY em paredes que não são verticais" msgid "Max XY Smoothing" msgstr "Suavização Máxima XY" -msgid "Maximum distance to move points in XY to try to achieve a smooth spiralIf expressed as a %, it will be computed over nozzle diameter" -msgstr "Distância máxima para mover pontos em XY para tentar obter uma espiral suave. Se expresso como uma %, será calculado sobre o diâmetro do bico" +msgid "" +"Maximum distance to move points in XY to try to achieve a smooth spiralIf " +"expressed as a %, it will be computed over nozzle diameter" +msgstr "" +"Distância máxima para mover pontos em XY para tentar obter uma espiral " +"suave. Se expresso como uma %, será calculado sobre o diâmetro do bico" -msgid "If smooth or traditional mode is selected, a timelapse video will be generated for each print. After each layer is printed, a snapshot is taken with the chamber camera. All of these snapshots are composed into a timelapse video when printing completes. If smooth mode is selected, the toolhead will move to the excess chute after each layer is printed and then take a snapshot. Since the melt filament may leak from the nozzle during the process of taking a snapshot, prime tower is required for smooth mode to wipe nozzle." -msgstr "Se o modo suave ou tradicional for selecionado, um vídeo em time-lapse será gerado para cada impressão. Após cada camada ser impressa, uma captura de tela é feita com a câmera da câmara. Todas essas capturas de tela são compostas em um vídeo em time-lapse quando a impressão é concluída. Se o modo suave for selecionado, a extrusora se moverá para fora após cada camada ser impressa e então tirará uma captura de tela. Como o filamento derretido pode vazar do bico durante o processo de tirar uma captura de tela, é necessário uma torre de priming para o modo suave para limpar o bico." +msgid "" +"If smooth or traditional mode is selected, a timelapse video will be " +"generated for each print. After each layer is printed, a snapshot is taken " +"with the chamber camera. All of these snapshots are composed into a " +"timelapse video when printing completes. If smooth mode is selected, the " +"toolhead will move to the excess chute after each layer is printed and then " +"take a snapshot. Since the melt filament may leak from the nozzle during the " +"process of taking a snapshot, prime tower is required for smooth mode to " +"wipe nozzle." +msgstr "" +"Se o modo suave ou tradicional for selecionado, um vídeo em time-lapse será " +"gerado para cada impressão. Após cada camada ser impressa, uma captura de " +"tela é feita com a câmera da câmara. Todas essas capturas de tela são " +"compostas em um vídeo em time-lapse quando a impressão é concluída. Se o " +"modo suave for selecionado, a extrusora se moverá para fora após cada camada " +"ser impressa e então tirará uma captura de tela. Como o filamento derretido " +"pode vazar do bico durante o processo de tirar uma captura de tela, é " +"necessário uma torre de priming para o modo suave para limpar o bico." msgid "Traditional" msgstr "Tradicional" @@ -10332,8 +12554,18 @@ msgstr "Use um único bico para imprimir múltiplos filamentos" msgid "Manual Filament Change" msgstr "Troca Manual de Filamento" -msgid "Enable this option to omit the custom Change filament G-code only at the beginning of the print. The tool change command (e.g., T0) will be skipped throughout the entire print. This is useful for manual multi-material printing, where we use M600/PAUSE to trigger the manual filament change action." -msgstr "Ative esta opção para omitir o código G de troca de filamento personalizado apenas no início da impressão. O comando de troca de ferramenta (por exemplo, T0) será ignorado durante toda a impressão. Isso é útil para impressão manual de vários materiais, onde usamos M600/PAUSE para acionar a ação de troca manual de filamento." +msgid "" +"Enable this option to omit the custom Change filament G-code only at the " +"beginning of the print. The tool change command (e.g., T0) will be skipped " +"throughout the entire print. This is useful for manual multi-material " +"printing, where we use M600/PAUSE to trigger the manual filament change " +"action." +msgstr "" +"Ative esta opção para omitir o código G de troca de filamento personalizado " +"apenas no início da impressão. O comando de troca de ferramenta (por " +"exemplo, T0) será ignorado durante toda a impressão. Isso é útil para " +"impressão manual de vários materiais, onde usamos M600/PAUSE para acionar a " +"ação de troca manual de filamento." msgid "Purge in prime tower" msgstr "Purgar na torre de priming" @@ -10347,26 +12579,49 @@ msgstr "Ativar inserção de filamento" msgid "No sparse layers (beta)" msgstr "Sem camadas esparsas (beta)" -msgid "If enabled, the wipe tower will not be printed on layers with no toolchanges. On layers with a toolchange, extruder will travel downward to print the wipe tower. User is responsible for ensuring there is no collision with the print." -msgstr "Se ativado, a torre de limpeza não será impressa em camadas sem trocas de ferramentas. Em camadas com uma troca de ferramentas, o extrusor viajará para baixo para imprimir a torre de limpeza. O usuário é responsável por garantir que não haja colisão com a impressão." +msgid "" +"If enabled, the wipe tower will not be printed on layers with no " +"toolchanges. On layers with a toolchange, extruder will travel downward to " +"print the wipe tower. User is responsible for ensuring there is no collision " +"with the print." +msgstr "" +"Se ativado, a torre de limpeza não será impressa em camadas sem trocas de " +"ferramentas. Em camadas com uma troca de ferramentas, o extrusor viajará " +"para baixo para imprimir a torre de limpeza. O usuário é responsável por " +"garantir que não haja colisão com a impressão." msgid "Prime all printing extruders" msgstr "Primer todos os extrusores de impressão" -msgid "If enabled, all printing extruders will be primed at the front edge of the print bed at the start of the print." -msgstr "Se ativado, todos os extrusores de impressão serão iniciados na borda frontal da mesa de impressão no início da impressão." +msgid "" +"If enabled, all printing extruders will be primed at the front edge of the " +"print bed at the start of the print." +msgstr "" +"Se ativado, todos os extrusores de impressão serão iniciados na borda " +"frontal da mesa de impressão no início da impressão." msgid "Slice gap closing radius" msgstr "Tolerância do fatiamento" -msgid "Cracks smaller than 2x gap closing radius are being filled during the triangle mesh slicing. The gap closing operation may reduce the final print resolution, therefore it is advisable to keep the value reasonably low." -msgstr "Espaços menores que 2x a tolerância de fatiamentoo serão preenchidas durante o fatiamento da malha. Aumentar a tolerância de fatiamento pode reduzir a resolução final da impressão, portanto, é aconselhável manter o valor razoavelmente baixo." +msgid "" +"Cracks smaller than 2x gap closing radius are being filled during the " +"triangle mesh slicing. The gap closing operation may reduce the final print " +"resolution, therefore it is advisable to keep the value reasonably low." +msgstr "" +"Espaços menores que 2x a tolerância de fatiamentoo serão preenchidas durante " +"o fatiamento da malha. Aumentar a tolerância de fatiamento pode reduzir a " +"resolução final da impressão, portanto, é aconselhável manter o valor " +"razoavelmente baixo." msgid "Slicing Mode" msgstr "Modo de Fatiamento" -msgid "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to close all holes in the model." -msgstr "Use \"Par-impar\" para modelos de avião 3DLabPrint. Use \"Fechar buracos\" para fechar todos os buracos no modelo." +msgid "" +"Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to " +"close all holes in the model." +msgstr "" +"Use \"Par-impar\" para modelos de avião 3DLabPrint. Use \"Fechar buracos\" " +"para fechar todos os buracos no modelo." msgid "Regular" msgstr "Padrão" @@ -10380,8 +12635,16 @@ msgstr "Fechar buracos" msgid "Z offset" msgstr "Deslocamento Z" -msgid "This value will be added (or subtracted) from all the Z coordinates in the output G-code. It is used to compensate for bad Z endstop position: for example, if your endstop zero actually leaves the nozzle 0.3mm far from the print bed, set this to -0.3 (or fix your endstop)." -msgstr "Este valor será adicionado (ou subtraído) de todas as coordenadas Z no G-code de saída. É usado para compensar a má posição do fim de curso Z: por exemplo, se o zero do seu fim de curso na verdade deixa o bico 0,3 mm longe da mesa de impressão, ajuste isso para -0,3 (ou corrija o seu fim de curso)." +msgid "" +"This value will be added (or subtracted) from all the Z coordinates in the " +"output G-code. It is used to compensate for bad Z endstop position: for " +"example, if your endstop zero actually leaves the nozzle 0.3mm far from the " +"print bed, set this to -0.3 (or fix your endstop)." +msgstr "" +"Este valor será adicionado (ou subtraído) de todas as coordenadas Z no G-" +"code de saída. É usado para compensar a má posição do fim de curso Z: por " +"exemplo, se o zero do seu fim de curso na verdade deixa o bico 0,3 mm longe " +"da mesa de impressão, ajuste isso para -0,3 (ou corrija o seu fim de curso)." msgid "Enable support" msgstr "Ativar suporte" @@ -10389,8 +12652,14 @@ msgstr "Ativar suporte" msgid "Enable support generation." msgstr "Ativar a geração de suporte." -msgid "normal(auto) and tree(auto) is used to generate support automatically. If normal(manual) or tree(manual) is selected, only support enforcers are generated" -msgstr "normal(auto) e tree(auto) são usados para gerar suporte automaticamente. Se normal(manual) ou tree(manual) for selecionado, apenas os suportes são gerados" +msgid "" +"normal(auto) and tree(auto) is used to generate support automatically. If " +"normal(manual) or tree(manual) is selected, only support enforcers are " +"generated" +msgstr "" +"normal(auto) e tree(auto) são usados para gerar suporte automaticamente. Se " +"normal(manual) ou tree(manual) for selecionado, apenas os suportes são " +"gerados" msgid "normal(auto)" msgstr "normal(automático)" @@ -10414,7 +12683,8 @@ msgid "Pattern angle" msgstr "Ângulo de padrão" msgid "Use this setting to rotate the support pattern on the horizontal plane." -msgstr "Use esta configuração para girar o padrão de suporte no plano horizontal." +msgstr "" +"Use esta configuração para girar o padrão de suporte no plano horizontal." msgid "On build plate only" msgstr "Somente na mesa" @@ -10425,8 +12695,12 @@ msgstr "Não criar suporte na superfície do modelo, apenas na mesa" msgid "Support critical regions only" msgstr "Suportar apenas regiões críticas" -msgid "Only create support for critical regions including sharp tail, cantilever, etc." -msgstr "Crie suporte apenas para regiões críticas, incluindo cauda afiada, balanço, etc." +msgid "" +"Only create support for critical regions including sharp tail, cantilever, " +"etc." +msgstr "" +"Crie suporte apenas para regiões críticas, incluindo cauda afiada, balanço, " +"etc." msgid "Remove small overhangs" msgstr "Remover pequenos overhangs" @@ -10449,29 +12723,47 @@ msgstr "A diferença z entre a interface inferior de suporte e o objeto" msgid "Support/raft base" msgstr "Suporte/base" -msgid "Filament to print support base and raft. \"Default\" means no specific filament for support and current filament is used" -msgstr "Filamento para imprimir a base e suporte. \"Padrão\" significa nenhum filamento específico para suporte e o filamento atual será usado" +msgid "" +"Filament to print support base and raft. \"Default\" means no specific " +"filament for support and current filament is used" +msgstr "" +"Filamento para imprimir a base e suporte. \"Padrão\" significa nenhum " +"filamento específico para suporte e o filamento atual será usado" msgid "Avoid interface filament for base" msgstr "Evitar o filamento da interface para a base" -msgid "Avoid using support interface filament to print support base if possible." -msgstr "Evite usar o filamento da interface de suporte para imprimir a base, se possível." +msgid "" +"Avoid using support interface filament to print support base if possible." +msgstr "" +"Evite usar o filamento da interface de suporte para imprimir a base, se " +"possível." -msgid "Line width of support. If expressed as a %, it will be computed over the nozzle diameter." -msgstr "Largura da linha de suporte. Se expresso como %, será calculado sobre o diâmetro do bico." +msgid "" +"Line width of support. If expressed as a %, it will be computed over the " +"nozzle diameter." +msgstr "" +"Largura da linha de suporte. Se expresso como %, será calculado sobre o " +"diâmetro do bico." msgid "Interface use loop pattern" msgstr "Interface usa padrão de loop" -msgid "Cover the top contact layer of the supports with loops. Disabled by default." -msgstr "Cubra a camada de contato superior dos suportes com loops. Desativado por padrão." +msgid "" +"Cover the top contact layer of the supports with loops. Disabled by default." +msgstr "" +"Cubra a camada de contato superior dos suportes com loops. Desativado por " +"padrão." msgid "Support/raft interface" msgstr "Interface de suporte/plataforma" -msgid "Filament to print support interface. \"Default\" means no specific filament for support interface and current filament is used" -msgstr "Filamento para imprimir a interface de suporte. \"Padrão\" significa nenhum filamento específico para a interface de suporte e o filamento atual é usado" +msgid "" +"Filament to print support interface. \"Default\" means no specific filament " +"for support interface and current filament is used" +msgstr "" +"Filamento para imprimir a interface de suporte. \"Padrão\" significa nenhum " +"filamento específico para a interface de suporte e o filamento atual é usado" msgid "Top interface layers" msgstr "Camadas de interface superior" @@ -10498,7 +12790,8 @@ msgid "Bottom interface spacing" msgstr "Espaçamento da interface inferior" msgid "Spacing of bottom interface lines. Zero means solid interface" -msgstr "Espaçamento das linhas de interface inferior. Zero significa interface sólida" +msgstr "" +"Espaçamento das linhas de interface inferior. Zero significa interface sólida" msgid "Speed of support interface" msgstr "Velocidade da interface de suporte" @@ -10518,8 +12811,14 @@ msgstr "Oco" msgid "Interface pattern" msgstr "Padrão de interface" -msgid "Line pattern of support interface. Default pattern for non-soluble support interface is Rectilinear, while default pattern for soluble support interface is Concentric" -msgstr "Padrão de linha de interface de suporte. O padrão padrão para interface de suporte não solúvel é reticulado, enquanto o padrão padrão para interface de suporte solúvel é concêntrico" +msgid "" +"Line pattern of support interface. Default pattern for non-soluble support " +"interface is Rectilinear, while default pattern for soluble support " +"interface is Concentric" +msgstr "" +"Padrão de linha de interface de suporte. O padrão padrão para interface de " +"suporte não solúvel é reticulado, enquanto o padrão padrão para interface de " +"suporte solúvel é concêntrico" msgid "Rectilinear Interlaced" msgstr "Reticulado Interligado" @@ -10540,11 +12839,22 @@ msgid "Speed of support" msgstr "Velocidade do suporte" msgid "" -"Style and shape of the support. For normal support, projecting the supports into a regular grid will create more stable supports (default), while snug support towers will save material and reduce object scarring.\n" -"For tree support, slim and organic style will merge branches more aggressively and save a lot of material (default organic), while hybrid style will create similar structure to normal support under large flat overhangs." +"Style and shape of the support. For normal support, projecting the supports " +"into a regular grid will create more stable supports (default), while snug " +"support towers will save material and reduce object scarring.\n" +"For tree support, slim and organic style will merge branches more " +"aggressively and save a lot of material (default organic), while hybrid " +"style will create similar structure to normal support under large flat " +"overhangs." msgstr "" -"Estilo e forma do suporte. Para suporte normal, projetar os suportes em uma grade regular criará suportes mais estáveis (padrão), enquanto torres de suporte ajustadas economizarão material e reduzirão a cicatrização do objeto.\n" -"Para suporte de árvore, estilo fino e orgânico mesclarão os galhos de forma mais agressiva e economizarão muito material (orgânico padrão), enquanto o estilo híbrido criará uma estrutura semelhante ao suporte normal em grandes overhangs planas." +"Estilo e forma do suporte. Para suporte normal, projetar os suportes em uma " +"grade regular criará suportes mais estáveis (padrão), enquanto torres de " +"suporte ajustadas economizarão material e reduzirão a cicatrização do " +"objeto.\n" +"Para suporte de árvore, estilo fino e orgânico mesclarão os galhos de forma " +"mais agressiva e economizarão muito material (orgânico padrão), enquanto o " +"estilo híbrido criará uma estrutura semelhante ao suporte normal em grandes " +"overhangs planas." msgid "Snug" msgstr "Ajustado" @@ -10564,52 +12874,98 @@ msgstr "Orgânico" msgid "Independent support layer height" msgstr "Altura independente da camada de suporte" -msgid "Support layer uses layer height independent with object layer. This is to support customizing z-gap and save print time.This option will be invalid when the prime tower is enabled." -msgstr "A camada de suporte usa uma altura de camada independente da camada do objeto. Isso é para suportar a personalização do z-gap e economizar tempo de impressão. Esta opção será inválida quando a torre de priming estiver ativada." +msgid "" +"Support layer uses layer height independent with object layer. This is to " +"support customizing z-gap and save print time.This option will be invalid " +"when the prime tower is enabled." +msgstr "" +"A camada de suporte usa uma altura de camada independente da camada do " +"objeto. Isso é para suportar a personalização do z-gap e economizar tempo de " +"impressão. Esta opção será inválida quando a torre de priming estiver " +"ativada." msgid "Threshold angle" msgstr "Ângulo de limite" -msgid "Support will be generated for overhangs whose slope angle is below the threshold." -msgstr "O suporte será gerado para overhangs cujo ângulo de inclinação estiver abaixo do limite." +msgid "" +"Support will be generated for overhangs whose slope angle is below the " +"threshold." +msgstr "" +"O suporte será gerado para overhangs cujo ângulo de inclinação estiver " +"abaixo do limite." msgid "Tree support branch angle" msgstr "Ângulo da ramificação" -msgid "This setting determines the maximum overhang angle that t he branches of tree support allowed to make.If the angle is increased, the branches can be printed more horizontally, allowing them to reach farther." -msgstr "Esta configuração determina o ângulo máximo de inclinação que as ramificações de suporte de árvore podem fazer. Se o ângulo for aumentado, as ramificações podem ser impressas de forma mais horizontal, permitindo que alcancem mais longe." +msgid "" +"This setting determines the maximum overhang angle that t he branches of " +"tree support allowed to make.If the angle is increased, the branches can be " +"printed more horizontally, allowing them to reach farther." +msgstr "" +"Esta configuração determina o ângulo máximo de inclinação que as " +"ramificações de suporte de árvore podem fazer. Se o ângulo for aumentado, as " +"ramificações podem ser impressas de forma mais horizontal, permitindo que " +"alcancem mais longe." msgid "Preferred Branch Angle" msgstr "Ângulo preferido da ramificação" #. TRN PrintSettings: "Organic supports" > "Preferred Branch Angle" -msgid "The preferred angle of the branches, when they do not have to avoid the model. Use a lower angle to make them more vertical and more stable. Use a higher angle for branches to merge faster." -msgstr "O ângulo preferido das ramificações, quando eles não precisam evitar o modelo. Use um ângulo mais baixo para torná-los mais verticais e mais estáveis. Use um ângulo mais alto para que as ramificações se fundam mais rápido." +msgid "" +"The preferred angle of the branches, when they do not have to avoid the " +"model. Use a lower angle to make them more vertical and more stable. Use a " +"higher angle for branches to merge faster." +msgstr "" +"O ângulo preferido das ramificações, quando eles não precisam evitar o " +"modelo. Use um ângulo mais baixo para torná-los mais verticais e mais " +"estáveis. Use um ângulo mais alto para que as ramificações se fundam mais " +"rápido." msgid "Tree support branch distance" msgstr "Distância entre ramificações" -msgid "This setting determines the distance between neighboring tree support nodes." -msgstr "Essa configuração determina a distância entre os nós de suporte de árvore vizinhos." +msgid "" +"This setting determines the distance between neighboring tree support nodes." +msgstr "" +"Essa configuração determina a distância entre os nós de suporte de árvore " +"vizinhos." msgid "Branch Density" msgstr "Densidade da ramificação" #. TRN PrintSettings: "Organic supports" > "Branch Density" -msgid "Adjusts the density of the support structure used to generate the tips of the branches. A higher value results in better overhangs but the supports are harder to remove, thus it is recommended to enable top support interfaces instead of a high branch density value if dense interfaces are needed." -msgstr "Ajusta a densidade da estrutura de suporte usada para gerar as pontas das ramificações. Um valor mais alto resulta em overhangs melhores, mas os suportes são mais difíceis de remover, portanto, é recomendável ativar as interfaces superiores de suporte em vez de um valor de densidade de ramo alto se forem necessárias interfaces densas." +msgid "" +"Adjusts the density of the support structure used to generate the tips of " +"the branches. A higher value results in better overhangs but the supports " +"are harder to remove, thus it is recommended to enable top support " +"interfaces instead of a high branch density value if dense interfaces are " +"needed." +msgstr "" +"Ajusta a densidade da estrutura de suporte usada para gerar as pontas das " +"ramificações. Um valor mais alto resulta em overhangs melhores, mas os " +"suportes são mais difíceis de remover, portanto, é recomendável ativar as " +"interfaces superiores de suporte em vez de um valor de densidade de ramo " +"alto se forem necessárias interfaces densas." msgid "Adaptive layer height" msgstr "Altura de camada adaptativa" -msgid "Enabling this option means the height of tree support layer except the first will be automatically calculated " -msgstr "Ao ativar essa opção, a altura da camada de suporte de árvore, exceto a primeira, será calculada automaticamente " +msgid "" +"Enabling this option means the height of tree support layer except the " +"first will be automatically calculated " +msgstr "" +"Ao ativar essa opção, a altura da camada de suporte de árvore, exceto a " +"primeira, será calculada automaticamente " msgid "Auto brim width" msgstr "Largura de borda automática" -msgid "Enabling this option means the width of the brim for tree support will be automatically calculated" -msgstr "Ao ativar essa opção, a largura da borda para suporte de árvore será calculada automaticamente" +msgid "" +"Enabling this option means the width of the brim for tree support will be " +"automatically calculated" +msgstr "" +"Ao ativar essa opção, a largura da borda para suporte de árvore será " +"calculada automaticamente" msgid "Tree support brim width" msgstr "Largura da borda de suporte de árvore" @@ -10635,15 +12991,29 @@ msgid "Branch Diameter Angle" msgstr "Ângulo do diâmetro da ramificação" #. TRN PrintSettings: "Organic supports" > "Branch Diameter Angle" -msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the organic support." -msgstr "O ângulo das ramificações à medida que elas gradualmente se tornam mais espessos em direção à base. Um ângulo de 0 fará com que as ramificações tenham espessura uniforme ao longo de seu comprimento. Um pequeno ângulo pode aumentar a estabilidade do suporte orgânico." +msgid "" +"The angle of the branches' diameter as they gradually become thicker towards " +"the bottom. An angle of 0 will cause the branches to have uniform thickness " +"over their length. A bit of an angle can increase stability of the organic " +"support." +msgstr "" +"O ângulo das ramificações à medida que elas gradualmente se tornam mais " +"espessos em direção à base. Um ângulo de 0 fará com que as ramificações " +"tenham espessura uniforme ao longo de seu comprimento. Um pequeno ângulo " +"pode aumentar a estabilidade do suporte orgânico." msgid "Branch Diameter with double walls" msgstr "Diâmetro da ramificação com perí. duplo" #. TRN PrintSettings: "Organic supports" > "Branch Diameter" -msgid "Branches with area larger than the area of a circle of this diameter will be printed with double walls for stability. Set this value to zero for no double walls." -msgstr "Ramificações com área maior do que a área de um círculo com este diâmetro serão impressas com paredes duplas para estabilidade. Defina este valor como zero para não ter paredes duplas." +msgid "" +"Branches with area larger than the area of a circle of this diameter will be " +"printed with double walls for stability. Set this value to zero for no " +"double walls." +msgstr "" +"Ramificações com área maior do que a área de um círculo com este diâmetro " +"serão impressas com paredes duplas para estabilidade. Defina este valor como " +"zero para não ter paredes duplas." msgid "Support wall loops" msgstr "Perímetros de suporte" @@ -10654,24 +13024,44 @@ msgstr "Esta configuração especifica a contagem de paredes ao redor do suporte msgid "Tree support with infill" msgstr "Suporte de árvore com preenchimento" -msgid "This setting specifies whether to add infill inside large hollows of tree support" -msgstr "Essa configuração especifica se deve adicionar preenchimento dentro de grandes cavidades do suporte de árvore" +msgid "" +"This setting specifies whether to add infill inside large hollows of tree " +"support" +msgstr "" +"Essa configuração especifica se deve adicionar preenchimento dentro de " +"grandes cavidades do suporte de árvore" msgid "Activate temperature control" msgstr "Ativar controle de temperatura" msgid "" -"Enable this option for chamber temperature control. An M191 command will be added before \"machine_start_gcode\"\n" +"Enable this option for chamber temperature control. An M191 command will be " +"added before \"machine_start_gcode\"\n" "G-code commands: M141/M191 S(0-255)" msgstr "" -"Ative esta opção para controle de temperatura da câmara. Um comando M191 será adicionado antes de \"machine_start_gcode\"\n" +"Ative esta opção para controle de temperatura da câmara. Um comando M191 " +"será adicionado antes de \"machine_start_gcode\"\n" "Comandos G-code: M141/M191 S(0-255)" msgid "Chamber temperature" msgstr "Temperatura da câmara" -msgid "Higher chamber temperature can help suppress or reduce warping and potentially lead to higher interlayer bonding strength for high temperature materials like ABS, ASA, PC, PA and so on.At the same time, the air filtration of ABS and ASA will get worse.While for PLA, PETG, TPU, PVA and other low temperature materials,the actual chamber temperature should not be high to avoid cloggings, so 0 which stands for turning off is highly recommended" -msgstr "Uma temperatura mais alta na câmara pode ajudar a suprimir ou reduzir o empenamento e potencialmente levar a uma maior resistência de ligação entre camadas para materiais de alta temperatura como ABS, ASA, PC, PA e assim por diante. Ao mesmo tempo, a filtragem de ar de ABS e ASA ficará pior. Para PLA, PETG, TPU, PVA e outros materiais de baixa temperatura, a temperatura real da câmara não deve ser alta para evitar obstruções, portanto, é altamente recomendável usar 0, que significa desligado" +msgid "" +"Higher chamber temperature can help suppress or reduce warping and " +"potentially lead to higher interlayer bonding strength for high temperature " +"materials like ABS, ASA, PC, PA and so on.At the same time, the air " +"filtration of ABS and ASA will get worse.While for PLA, PETG, TPU, PVA and " +"other low temperature materials,the actual chamber temperature should not be " +"high to avoid cloggings, so 0 which stands for turning off is highly " +"recommended" +msgstr "" +"Uma temperatura mais alta na câmara pode ajudar a suprimir ou reduzir o " +"empenamento e potencialmente levar a uma maior resistência de ligação entre " +"camadas para materiais de alta temperatura como ABS, ASA, PC, PA e assim por " +"diante. Ao mesmo tempo, a filtragem de ar de ABS e ASA ficará pior. Para " +"PLA, PETG, TPU, PVA e outros materiais de baixa temperatura, a temperatura " +"real da câmara não deve ser alta para evitar obstruções, portanto, é " +"altamente recomendável usar 0, que significa desligado" msgid "Nozzle temperature for layers after the initial one" msgstr "Temperatura do bico para camadas após a inicial" @@ -10679,17 +13069,30 @@ msgstr "Temperatura do bico para camadas após a inicial" msgid "Detect thin wall" msgstr "Detectar perímetro fino" -msgid "Detect thin wall which can't contain two line width. And use single line to print. Maybe printed not very well, because it's not closed loop" -msgstr "Detecta paredes finas que não podem conter duas larguras de linha. E usa uma linha única para imprimir. Talvez seja impresso não muito bem, porque não é um loop fechado" +msgid "" +"Detect thin wall which can't contain two line width. And use single line to " +"print. Maybe printed not very well, because it's not closed loop" +msgstr "" +"Detecta paredes finas que não podem conter duas larguras de linha. E usa uma " +"linha única para imprimir. Talvez seja impresso não muito bem, porque não é " +"um loop fechado" -msgid "This gcode is inserted when change filament, including T command to trigger tool change" -msgstr "Este gcode é inserido ao trocar o filamento, incluindo o comando T para acionar a troca de ferramenta" +msgid "" +"This gcode is inserted when change filament, including T command to trigger " +"tool change" +msgstr "" +"Este gcode é inserido ao trocar o filamento, incluindo o comando T para " +"acionar a troca de ferramenta" msgid "This gcode is inserted when the extrusion role is changed" msgstr "Esse gcode é inserido quando o tipo de extrusão muda" -msgid "Line width for top surfaces. If expressed as a %, it will be computed over the nozzle diameter." -msgstr "Largura da linha para superfícies superiores. Se expressa em %, será calculada sobre o diâmetro do bico." +msgid "" +"Line width for top surfaces. If expressed as a %, it will be computed over " +"the nozzle diameter." +msgstr "" +"Largura da linha para superfícies superiores. Se expressa em %, será " +"calculada sobre o diâmetro do bico." msgid "Speed of top surface infill which is solid" msgstr "Velocidade de preenchimento da superfície superior, que é sólida" @@ -10697,8 +13100,15 @@ msgstr "Velocidade de preenchimento da superfície superior, que é sólida" msgid "Top shell layers" msgstr "Camadas de topo" -msgid "This is the number of solid layers of top shell, including the top surface layer. When the thickness calculated by this value is thinner than top shell thickness, the top shell layers will be increased" -msgstr "Este é o número de camadas sólidas do perímetro superior, incluindo a camada da superfície superior. Quando a espessura calculada por este valor for menor do que a espessura do perímetro superior, as camadas do perímetro superior serão aumentadas" +msgid "" +"This is the number of solid layers of top shell, including the top surface " +"layer. When the thickness calculated by this value is thinner than top shell " +"thickness, the top shell layers will be increased" +msgstr "" +"Este é o número de camadas sólidas do perímetro superior, incluindo a camada " +"da superfície superior. Quando a espessura calculada por este valor for " +"menor do que a espessura do perímetro superior, as camadas do perímetro " +"superior serão aumentadas" msgid "Top solid layers" msgstr "Camadas sólidas superiores" @@ -10706,8 +13116,18 @@ msgstr "Camadas sólidas superiores" msgid "Top shell thickness" msgstr "Espessura da parede de topo" -msgid "The number of top solid layers is increased when slicing if the thickness calculated by top shell layers is thinner than this value. This can avoid having too thin shell when layer height is small. 0 means that this setting is disabled and thickness of top shell is absolutely determained by top shell layers" -msgstr "O número de camadas sólidas superiores é aumentado ao fatiar se a espessura calculada pelas camadas da parede superior for menor do que este valor. Isso pode evitar que a parede seja muito fina quando a altura da camada é pequena. 0 significa que esta configuração está desativada e a espessura da parede superior é determinada exclusivamente pelas camadas da parede superior" +msgid "" +"The number of top solid layers is increased when slicing if the thickness " +"calculated by top shell layers is thinner than this value. This can avoid " +"having too thin shell when layer height is small. 0 means that this setting " +"is disabled and thickness of top shell is absolutely determained by top " +"shell layers" +msgstr "" +"O número de camadas sólidas superiores é aumentado ao fatiar se a espessura " +"calculada pelas camadas da parede superior for menor do que este valor. Isso " +"pode evitar que a parede seja muito fina quando a altura da camada é " +"pequena. 0 significa que esta configuração está desativada e a espessura da " +"parede superior é determinada exclusivamente pelas camadas da parede superior" msgid "Speed of travel which is faster and without extrusion" msgstr "Velocidade de deslocamento mais rápida e sem extrusão" @@ -10715,27 +13135,47 @@ msgstr "Velocidade de deslocamento mais rápida e sem extrusão" msgid "Wipe while retracting" msgstr "Limpeza ao retrair" -msgid "Move nozzle along the last extrusion path when retracting to clean leaked material on nozzle. This can minimize blob when print new part after travel" -msgstr "Movimentar o bico ao longo do último caminho de extrusão ao retrair para limpar o material vazado no bico. Isso pode minimizar a formação de blob quando imprimir uma nova peça após o deslocamento" +msgid "" +"Move nozzle along the last extrusion path when retracting to clean leaked " +"material on nozzle. This can minimize blob when print new part after travel" +msgstr "" +"Movimentar o bico ao longo do último caminho de extrusão ao retrair para " +"limpar o material vazado no bico. Isso pode minimizar a formação de blob " +"quando imprimir uma nova peça após o deslocamento" msgid "Wipe Distance" msgstr "Distância de limpeza" msgid "" -"Discribe how long the nozzle will move along the last path when retracting. \n" +"Discribe how long the nozzle will move along the last path when " +"retracting. \n" "\n" -"Depending on how long the wipe operation lasts, how fast and long the extruder/filament retraction settings are, a retraction move may be needed to retract the remaining filament. \n" +"Depending on how long the wipe operation lasts, how fast and long the " +"extruder/filament retraction settings are, a retraction move may be needed " +"to retract the remaining filament. \n" "\n" -"Setting a value in the retract amount before wipe setting below will perform any excess retraction before the wipe, else it will be performed after." +"Setting a value in the retract amount before wipe setting below will perform " +"any excess retraction before the wipe, else it will be performed after." msgstr "" -"Descreva por quanto tempo o bico se moverá ao longo do último caminho ao retrair. \n" +"Descreva por quanto tempo o bico se moverá ao longo do último caminho ao " +"retrair. \n" "\n" -"Dependendo de quanto tempo dura a operação de limpeza, quão rápidas e longas são as configurações de retração do extrusor/filamento, pode ser necessário um movimento de retração para recolher o filamento restante. \n" +"Dependendo de quanto tempo dura a operação de limpeza, quão rápidas e longas " +"são as configurações de retração do extrusor/filamento, pode ser necessário " +"um movimento de retração para recolher o filamento restante. \n" "\n" -"Definir um valor na configuração de quantidade de retração antes da limpeza abaixo executará qualquer retração em excesso antes da limpeza, caso contrário, será realizada após." +"Definir um valor na configuração de quantidade de retração antes da limpeza " +"abaixo executará qualquer retração em excesso antes da limpeza, caso " +"contrário, será realizada após." -msgid "The wiping tower can be used to clean up the residue on the nozzle and stabilize the chamber pressure inside the nozzle, in order to avoid appearance defects when printing objects." -msgstr "A torre de limpeza pode ser usada para limpar o resíduo no bico e estabilizar a pressão na câmara dentro do bico, a fim de evitar defeitos de aparência ao imprimir objetos." +msgid "" +"The wiping tower can be used to clean up the residue on the nozzle and " +"stabilize the chamber pressure inside the nozzle, in order to avoid " +"appearance defects when printing objects." +msgstr "" +"A torre de limpeza pode ser usada para limpar o resíduo no bico e " +"estabilizar a pressão na câmara dentro do bico, a fim de evitar defeitos de " +"aparência ao imprimir objetos." msgid "Purging volumes" msgstr "Volumes de purga" @@ -10743,8 +13183,12 @@ msgstr "Volumes de purga" msgid "Flush multiplier" msgstr "Multiplicador de descarga" -msgid "The actual flushing volumes is equal to the flush multiplier multiplied by the flushing volumes in the table." -msgstr "Os volumes de descarga reais são iguais ao multiplicador de descarga multiplicado pelos volumes de descarga na tabela." +msgid "" +"The actual flushing volumes is equal to the flush multiplier multiplied by " +"the flushing volumes in the table." +msgstr "" +"Os volumes de descarga reais são iguais ao multiplicador de descarga " +"multiplicado pelos volumes de descarga na tabela." msgid "Prime volume" msgstr "Volume de priming" @@ -10764,8 +13208,12 @@ msgstr "Ângulo de rotação da torre de limpeza em relação ao eixo x." msgid "Stabilization cone apex angle" msgstr "Ângulo do ápice do cone de estabilização" -msgid "Angle at the apex of the cone that is used to stabilize the wipe tower. Larger angle means wider base." -msgstr "Ângulo no ápice do cone que é usado para estabilizar a torre de limpeza. Um ângulo maior significa uma base mais larga." +msgid "" +"Angle at the apex of the cone that is used to stabilize the wipe tower. " +"Larger angle means wider base." +msgstr "" +"Ângulo no ápice do cone que é usado para estabilizar a torre de limpeza. Um " +"ângulo maior significa uma base mais larga." msgid "Wipe tower purge lines spacing" msgstr "Espaçamento das linhas de purga da torre de limpeza" @@ -10776,23 +13224,55 @@ msgstr "Espaçamento das linhas de purga na torre de limpeza." msgid "Wipe tower extruder" msgstr "Extrusor da torre de limpeza" -msgid "The extruder to use when printing perimeter of the wipe tower. Set to 0 to use the one that is available (non-soluble would be preferred)." -msgstr "O extrusor a ser usado ao imprimir o perímetro da torre de limpeza. Defina como 0 para usar o disponível (não solúvel é preferido)." +msgid "" +"The extruder to use when printing perimeter of the wipe tower. Set to 0 to " +"use the one that is available (non-soluble would be preferred)." +msgstr "" +"O extrusor a ser usado ao imprimir o perímetro da torre de limpeza. Defina " +"como 0 para usar o disponível (não solúvel é preferido)." msgid "Purging volumes - load/unload volumes" msgstr "Volumes de purga - volumes de carga/descarga" -msgid "This vector saves required volumes to change from/to each tool used on the wipe tower. These values are used to simplify creation of the full purging volumes below." -msgstr "Este vetor salva os volumes necessários para mudar de/para cada ferramenta usada na torre de limpeza. Esses valores são usados para simplificar a criação dos volumes de purga completos abaixo." +msgid "" +"This vector saves required volumes to change from/to each tool used on the " +"wipe tower. These values are used to simplify creation of the full purging " +"volumes below." +msgstr "" +"Este vetor salva os volumes necessários para mudar de/para cada ferramenta " +"usada na torre de limpeza. Esses valores são usados para simplificar a " +"criação dos volumes de purga completos abaixo." -msgid "Purging after filament change will be done inside objects' infills. This may lower the amount of waste and decrease the print time. If the walls are printed with transparent filament, the mixed color infill will be seen outside. It will not take effect, unless the prime tower is enabled." -msgstr "A purga após a troca de filamento será feita dentro do preenchimento dos objetos. Isso pode reduzir a quantidade de resíduos e diminuir o tempo de impressão. Se as paredes forem impressas com filamento transparente, o preenchimento de cor mista será visto por fora. Isso não terá efeito, a menos que a torre de inicialização esteja ativada." +msgid "" +"Purging after filament change will be done inside objects' infills. This may " +"lower the amount of waste and decrease the print time. If the walls are " +"printed with transparent filament, the mixed color infill will be seen " +"outside. It will not take effect, unless the prime tower is enabled." +msgstr "" +"A purga após a troca de filamento será feita dentro do preenchimento dos " +"objetos. Isso pode reduzir a quantidade de resíduos e diminuir o tempo de " +"impressão. Se as paredes forem impressas com filamento transparente, o " +"preenchimento de cor mista será visto por fora. Isso não terá efeito, a " +"menos que a torre de inicialização esteja ativada." -msgid "Purging after filament change will be done inside objects' support. This may lower the amount of waste and decrease the print time. It will not take effect, unless the prime tower is enabled." -msgstr "A purga após a troca de filamento será feita dentro do suporte dos objetos. Isso pode reduzir a quantidade de resíduos e diminuir o tempo de impressão. Isso não terá efeito, a menos que a torre de inicialização esteja ativada." +msgid "" +"Purging after filament change will be done inside objects' support. This may " +"lower the amount of waste and decrease the print time. It will not take " +"effect, unless the prime tower is enabled." +msgstr "" +"A purga após a troca de filamento será feita dentro do suporte dos objetos. " +"Isso pode reduzir a quantidade de resíduos e diminuir o tempo de impressão. " +"Isso não terá efeito, a menos que a torre de inicialização esteja ativada." -msgid "This object will be used to purge the nozzle after a filament change to save filament and decrease the print time. Colours of the objects will be mixed as a result. It will not take effect, unless the prime tower is enabled." -msgstr "Este objeto será usado para purgar o bico após a troca de filamento para economizar filamento e diminuir o tempo de impressão. As cores dos objetos serão misturadas como resultado. Isso não terá efeito, a menos que a torre de inicialização esteja ativada." +msgid "" +"This object will be used to purge the nozzle after a filament change to save " +"filament and decrease the print time. Colours of the objects will be mixed " +"as a result. It will not take effect, unless the prime tower is enabled." +msgstr "" +"Este objeto será usado para purgar o bico após a troca de filamento para " +"economizar filamento e diminuir o tempo de impressão. As cores dos objetos " +"serão misturadas como resultado. Isso não terá efeito, a menos que a torre " +"de inicialização esteja ativada." msgid "Maximal bridging distance" msgstr "Distância máxima de ponte" @@ -10803,23 +13283,42 @@ msgstr "Distância máxima entre suportes em seções de preenchimento não sól msgid "X-Y hole compensation" msgstr "Compensação XY de furos" -msgid "Holes of object will be grown or shrunk in XY plane by the configured value. Positive value makes holes bigger. Negative value makes holes smaller. This function is used to adjust size slightly when the object has assembling issue" -msgstr "Os furos do objeto serão aumentados ou reduzidos no plano XY pelo valor configurado. Valor positivo aumenta os furos. Valor negativo reduz os furos. Essa função é usada para ajustar ligeiramente o tamanho quando o objeto tem problema de montagem" +msgid "" +"Holes of object will be grown or shrunk in XY plane by the configured value. " +"Positive value makes holes bigger. Negative value makes holes smaller. This " +"function is used to adjust size slightly when the object has assembling issue" +msgstr "" +"Os furos do objeto serão aumentados ou reduzidos no plano XY pelo valor " +"configurado. Valor positivo aumenta os furos. Valor negativo reduz os furos. " +"Essa função é usada para ajustar ligeiramente o tamanho quando o objeto tem " +"problema de montagem" msgid "X-Y contour compensation" msgstr "Compensação XY de contornos" -msgid "Contour of object will be grown or shrunk in XY plane by the configured value. Positive value makes contour bigger. Negative value makes contour smaller. This function is used to adjust size slightly when the object has assembling issue" -msgstr "O contorno do objeto será expandido ou reduzido no plano XY pelo valor configurado. Valor positivo aumenta o contorno. Valor negativo diminui o contorno. Essa função é usada para ajustar ligeiramente o tamanho quando o objeto tem problemas de montagem" +msgid "" +"Contour of object will be grown or shrunk in XY plane by the configured " +"value. Positive value makes contour bigger. Negative value makes contour " +"smaller. This function is used to adjust size slightly when the object has " +"assembling issue" +msgstr "" +"O contorno do objeto será expandido ou reduzido no plano XY pelo valor " +"configurado. Valor positivo aumenta o contorno. Valor negativo diminui o " +"contorno. Essa função é usada para ajustar ligeiramente o tamanho quando o " +"objeto tem problemas de montagem" msgid "Convert holes to polyholes" msgstr "Converter furos em polifuros" msgid "" -"Search for almost-circular holes that span more than one layer and convert the geometry to polyholes. Use the nozzle size and the (biggest) diameter to compute the polyhole.\n" +"Search for almost-circular holes that span more than one layer and convert " +"the geometry to polyholes. Use the nozzle size and the (biggest) diameter to " +"compute the polyhole.\n" "See http://hydraraptor.blogspot.com/2011/02/polyholes.html" msgstr "" -"Procura por furos quase circulares que abrangem mais de uma camada e converta a geometria em polifuros. Usa o tamanho do bico e o diâmetro (maior) para calcular o polifuro.\n" +"Procura por furos quase circulares que abrangem mais de uma camada e " +"converta a geometria em polifuros. Usa o tamanho do bico e o diâmetro " +"(maior) para calcular o polifuro.\n" "Consulte http://hydraraptor.blogspot.com/2011/02/polyholes.html" msgid "Polyhole detection margin" @@ -10828,11 +13327,15 @@ msgstr "Margem de detecção de polifuros" #, no-c-format, no-boost-format msgid "" "Maximum defection of a point to the estimated radius of the circle.\n" -"As cylinders are often exported as triangles of varying size, points may not be on the circle circumference. This setting allows you some leway to broaden the detection.\n" +"As cylinders are often exported as triangles of varying size, points may not " +"be on the circle circumference. This setting allows you some leway to " +"broaden the detection.\n" "In mm or in % of the radius." msgstr "" "Máxima deflexão de um ponto para o raio estimado do círculo.\n" -"Como os cilindros frequentemente são exportados como triângulos de tamanho variável, os pontos podem não estar na circunferência do círculo. Esta configuração permite-lhe alguma margem para alargar a detecção.\n" +"Como os cilindros frequentemente são exportados como triângulos de tamanho " +"variável, os pontos podem não estar na circunferência do círculo. Esta " +"configuração permite-lhe alguma margem para alargar a detecção.\n" "Em milímetros ou em % do raio." msgid "Polyhole twist" @@ -10844,23 +13347,45 @@ msgstr "Girar o polifuro a cada camada." msgid "G-code thumbnails" msgstr "Miniaturas de G-code" -msgid "Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the following format: \"XxY, XxY, ...\"" -msgstr "Tamanhos das imagens a serem armazenados em arquivos .gcode e .sl1 / .sl1s, no seguinte formato: \"XxY, XxY, ...\"" +msgid "" +"Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the " +"following format: \"XxY, XxY, ...\"" +msgstr "" +"Tamanhos das imagens a serem armazenados em arquivos .gcode e .sl1 / .sl1s, " +"no seguinte formato: \"XxY, XxY, ...\"" msgid "Format of G-code thumbnails" msgstr "Formato das miniaturas de G-code" -msgid "Format of G-code thumbnails: PNG for best quality, JPG for smallest size, QOI for low memory firmware" -msgstr "Formato das miniaturas de G-code: PNG para melhor qualidade, JPG para menor tamanho, QOI para firmware de baixa memória" +msgid "" +"Format of G-code thumbnails: PNG for best quality, JPG for smallest size, " +"QOI for low memory firmware" +msgstr "" +"Formato das miniaturas de G-code: PNG para melhor qualidade, JPG para menor " +"tamanho, QOI para firmware de baixa memória" msgid "Use relative E distances" msgstr "Usar distâncias E relativas" -msgid "Relative extrusion is recommended when using \"label_objects\" option.Some extruders work better with this option unckecked (absolute extrusion mode). Wipe tower is only compatible with relative mode. It is recommended on most printers. Default is checked" -msgstr "A extrusão relativa é recomendada ao usar a opção \"label_objects\". Algumas extrusoras funcionam melhor com esta opção desmarcada (modo de extrusão absoluta). A torre de limpeza é compatível apenas com o modo relativo. É recomendado na maioria das impressoras. O padrão é ativado" +msgid "" +"Relative extrusion is recommended when using \"label_objects\" option.Some " +"extruders work better with this option unckecked (absolute extrusion mode). " +"Wipe tower is only compatible with relative mode. It is recommended on most " +"printers. Default is checked" +msgstr "" +"A extrusão relativa é recomendada ao usar a opção \"label_objects\". Algumas " +"extrusoras funcionam melhor com esta opção desmarcada (modo de extrusão " +"absoluta). A torre de limpeza é compatível apenas com o modo relativo. É " +"recomendado na maioria das impressoras. O padrão é ativado" -msgid "Classic wall generator produces walls with constant extrusion width and for very thin areas is used gap-fill. Arachne engine produces walls with variable extrusion width" -msgstr "O gerador de perímetro clássico produz paredes com largura de extrusão constante e para áreas muito finas é usado preenchimento de vão. O motor Arachne produz perímetros com largura de extrusão variável" +msgid "" +"Classic wall generator produces walls with constant extrusion width and for " +"very thin areas is used gap-fill. Arachne engine produces walls with " +"variable extrusion width" +msgstr "" +"O gerador de perímetro clássico produz paredes com largura de extrusão " +"constante e para áreas muito finas é usado preenchimento de vão. O motor " +"Arachne produz perímetros com largura de extrusão variável" msgid "Classic" msgstr "Clássico" @@ -10871,62 +13396,140 @@ msgstr "Arachne" msgid "Wall transition length" msgstr "Comprimento da transição de perímetro" -msgid "When transitioning between different numbers of walls as the part becomes thinner, a certain amount of space is allotted to split or join the wall segments. It's expressed as a percentage over nozzle diameter" -msgstr "Ao fazer a transição entre diferentes números de paredes à medida que a peça fica mais fina, uma certa quantidade de espaço é designada para dividir ou unir os segmentos do perímetro. É expresso como uma porcentagem sobre o diâmetro do bico" +msgid "" +"When transitioning between different numbers of walls as the part becomes " +"thinner, a certain amount of space is allotted to split or join the wall " +"segments. It's expressed as a percentage over nozzle diameter" +msgstr "" +"Ao fazer a transição entre diferentes números de paredes à medida que a peça " +"fica mais fina, uma certa quantidade de espaço é designada para dividir ou " +"unir os segmentos do perímetro. É expresso como uma porcentagem sobre o " +"diâmetro do bico" msgid "Wall transitioning filter margin" msgstr "Margem de filtro de transição de perímetro" -msgid "Prevent transitioning back and forth between one extra wall and one less. This margin extends the range of extrusion widths which follow to [Minimum wall width - margin, 2 * Minimum wall width + margin]. Increasing this margin reduces the number of transitions, which reduces the number of extrusion starts/stops and travel time. However, large extrusion width variation can lead to under- or overextrusion problems. It's expressed as a percentage over nozzle diameter" -msgstr "Evita a transição de ida e volta entre um perímetro extra e um a menos. Esta margem amplia o intervalo de larguras de extrusão que seguem para [Largura mínima da perímetro - margem, 2 * Largura mínima da perímetro + margem]. Aumentar esta margem reduz o número de transições, o que reduz o número de inícios / paradas de extrusão e o tempo de deslocamento. No entanto, uma grande variação na largura de extrusão pode levar a problemas de subextrusão ou superextrusão. É expresso como uma porcentagem sobre o diâmetro do bico" +msgid "" +"Prevent transitioning back and forth between one extra wall and one less. " +"This margin extends the range of extrusion widths which follow to [Minimum " +"wall width - margin, 2 * Minimum wall width + margin]. Increasing this " +"margin reduces the number of transitions, which reduces the number of " +"extrusion starts/stops and travel time. However, large extrusion width " +"variation can lead to under- or overextrusion problems. It's expressed as a " +"percentage over nozzle diameter" +msgstr "" +"Evita a transição de ida e volta entre um perímetro extra e um a menos. Esta " +"margem amplia o intervalo de larguras de extrusão que seguem para [Largura " +"mínima da perímetro - margem, 2 * Largura mínima da perímetro + margem]. " +"Aumentar esta margem reduz o número de transições, o que reduz o número de " +"inícios / paradas de extrusão e o tempo de deslocamento. No entanto, uma " +"grande variação na largura de extrusão pode levar a problemas de subextrusão " +"ou superextrusão. É expresso como uma porcentagem sobre o diâmetro do bico" msgid "Wall transitioning threshold angle" msgstr "Ângulo de limite de transição de perímetro" -msgid "When to create transitions between even and odd numbers of walls. A wedge shape with an angle greater than this setting will not have transitions and no walls will be printed in the center to fill the remaining space. Reducing this setting reduces the number and length of these center walls, but may leave gaps or overextrude" -msgstr "Quando criar transições entre números pares e ímpares de paredes. Uma forma de cunha com um ângulo maior do que esta configuração não terá transições e nenhumo perímetro será impresso no centro para preencher o espaço restante. Reduzir esta configuração reduz o número e o comprimento dessas paredes centrais, mas pode deixar vazios ou extrusão excessiva" +msgid "" +"When to create transitions between even and odd numbers of walls. A wedge " +"shape with an angle greater than this setting will not have transitions and " +"no walls will be printed in the center to fill the remaining space. Reducing " +"this setting reduces the number and length of these center walls, but may " +"leave gaps or overextrude" +msgstr "" +"Quando criar transições entre números pares e ímpares de paredes. Uma forma " +"de cunha com um ângulo maior do que esta configuração não terá transições e " +"nenhumo perímetro será impresso no centro para preencher o espaço restante. " +"Reduzir esta configuração reduz o número e o comprimento dessas paredes " +"centrais, mas pode deixar vazios ou extrusão excessiva" msgid "Wall distribution count" msgstr "Contagem de distribuição de perímetro" -msgid "The number of walls, counted from the center, over which the variation needs to be spread. Lower values mean that the outer walls don't change in width" -msgstr "O número de paredes, contadas a partir do centro, sobre as quais a variação precisa ser espalhada. Valores menores significam que as paredes externas não mudam de largura" +msgid "" +"The number of walls, counted from the center, over which the variation needs " +"to be spread. Lower values mean that the outer walls don't change in width" +msgstr "" +"O número de paredes, contadas a partir do centro, sobre as quais a variação " +"precisa ser espalhada. Valores menores significam que as paredes externas " +"não mudam de largura" msgid "Minimum feature size" msgstr "Tamanho mínimo do elemento" -msgid "Minimum thickness of thin features. Model features that are thinner than this value will not be printed, while features thicker than the Minimum feature size will be widened to the Minimum wall width. It's expressed as a percentage over nozzle diameter" -msgstr "Espessura mínima de elementos finos. Elementos do modelo que são mais finos do que este valor não serão impressos, enquanto elementos mais espessos que o tamanho mínimo do elemento serão alargados até a largura mínima do perímetro. É expresso como uma porcentagem sobre o diâmetro do bico" +msgid "" +"Minimum thickness of thin features. Model features that are thinner than " +"this value will not be printed, while features thicker than the Minimum " +"feature size will be widened to the Minimum wall width. It's expressed as a " +"percentage over nozzle diameter" +msgstr "" +"Espessura mínima de elementos finos. Elementos do modelo que são mais finos " +"do que este valor não serão impressos, enquanto elementos mais espessos que " +"o tamanho mínimo do elemento serão alargados até a largura mínima do " +"perímetro. É expresso como uma porcentagem sobre o diâmetro do bico" msgid "Minimum wall length" msgstr "Comprimento mínimo do perímetro" msgid "" -"Adjust this value to prevent short, unclosed walls from being printed, which could increase print time. Higher values remove more and longer walls.\n" +"Adjust this value to prevent short, unclosed walls from being printed, which " +"could increase print time. Higher values remove more and longer walls.\n" "\n" -"NOTE: Bottom and top surfaces will not be affected by this value to prevent visual gaps on the ouside of the model. Adjust 'One wall threshold' in the Advanced settings below to adjust the sensitivity of what is considered a top-surface. 'One wall threshold' is only visibile if this setting is set above the default value of 0.5, or if single-wall top surfaces is enabled." +"NOTE: Bottom and top surfaces will not be affected by this value to prevent " +"visual gaps on the ouside of the model. Adjust 'One wall threshold' in the " +"Advanced settings below to adjust the sensitivity of what is considered a " +"top-surface. 'One wall threshold' is only visibile if this setting is set " +"above the default value of 0.5, or if single-wall top surfaces is enabled." msgstr "" -"Ajuste este valor para evitar que perímetros curtos e não fechados sejam impressos, o que poderia aumentar o tempo de impressão. Valores mais altos removem perímetros mais longos.\n" +"Ajuste este valor para evitar que perímetros curtos e não fechados sejam " +"impressos, o que poderia aumentar o tempo de impressão. Valores mais altos " +"removem perímetros mais longos.\n" "\n" -"NOTA: As superfícies inferior e superior não serão afetadas por este valor para evitar lacunas visuais no exterior do modelo. Ajuste o 'Limiar de um perímetro' nas configurações avançadas abaixo para ajustar a sensibilidade do que é considerado uma superfície superior. 'Limiar de um perímetro' só é visível se esta configuração estiver acima do valor padrão de 0,5, ou se superfícies superiores de uma única parede estiverem habilitadas." +"NOTA: As superfícies inferior e superior não serão afetadas por este valor " +"para evitar lacunas visuais no exterior do modelo. Ajuste o 'Limiar de um " +"perímetro' nas configurações avançadas abaixo para ajustar a sensibilidade " +"do que é considerado uma superfície superior. 'Limiar de um perímetro' só é " +"visível se esta configuração estiver acima do valor padrão de 0,5, ou se " +"superfícies superiores de uma única parede estiverem habilitadas." msgid "First layer minimum wall width" msgstr "Largura mínima do perímetro da primeira camada" -msgid "The minimum wall width that should be used for the first layer is recommended to be set to the same size as the nozzle. This adjustment is expected to enhance adhesion." -msgstr "A largura mínima do perímetro que deve ser usada para a primeira camada é recomendada para ser definida com o mesmo tamanho do bico. Este ajuste é esperado para melhorar a aderência." +msgid "" +"The minimum wall width that should be used for the first layer is " +"recommended to be set to the same size as the nozzle. This adjustment is " +"expected to enhance adhesion." +msgstr "" +"A largura mínima do perímetro que deve ser usada para a primeira camada é " +"recomendada para ser definida com o mesmo tamanho do bico. Este ajuste é " +"esperado para melhorar a aderência." msgid "Minimum wall width" msgstr "Largura mínima do perímetro" -msgid "Width of the wall that will replace thin features (according to the Minimum feature size) of the model. If the Minimum wall width is thinner than the thickness of the feature, the wall will become as thick as the feature itself. It's expressed as a percentage over nozzle diameter" -msgstr "Largura do perímetro que substituirá elementos finos (de acordo com o tamanho mínimo do elemento) do modelo. Se a Largura mínima do perímetro for mais fina do que a espessura do elemento, o perímetro será tão espesso quanto o próprio elemento. É expresso como uma porcentagem sobre o diâmetro do bico" +msgid "" +"Width of the wall that will replace thin features (according to the Minimum " +"feature size) of the model. If the Minimum wall width is thinner than the " +"thickness of the feature, the wall will become as thick as the feature " +"itself. It's expressed as a percentage over nozzle diameter" +msgstr "" +"Largura do perímetro que substituirá elementos finos (de acordo com o " +"tamanho mínimo do elemento) do modelo. Se a Largura mínima do perímetro for " +"mais fina do que a espessura do elemento, o perímetro será tão espesso " +"quanto o próprio elemento. É expresso como uma porcentagem sobre o diâmetro " +"do bico" msgid "Detect narrow internal solid infill" msgstr "Detectar preenchimento sólido interno estreito" -msgid "This option will auto detect narrow internal solid infill area. If enabled, concentric pattern will be used for the area to speed printing up. Otherwise, rectilinear pattern is used defaultly." -msgstr "Esta opção irá detectar automaticamente áreas de preenchimento sólido interno estreito. Se ativada, o padrão concêntrico será usado para a área para acelerar a impressão. Caso contrário, o padrão reticulado é usado por padrão." +msgid "" +"This option will auto detect narrow internal solid infill area. If enabled, " +"concentric pattern will be used for the area to speed printing up. " +"Otherwise, rectilinear pattern is used defaultly." +msgstr "" +"Esta opção irá detectar automaticamente áreas de preenchimento sólido " +"interno estreito. Se ativada, o padrão concêntrico será usado para a área " +"para acelerar a impressão. Caso contrário, o padrão reticulado é usado por " +"padrão." msgid "invalid value " msgstr "valor inválido " @@ -10950,13 +13553,18 @@ msgid "No check" msgstr "Sem verificação" msgid "Do not run any validity checks, such as gcode path conflicts check." -msgstr "Não execute nenhuma verificação de validade, como a verificação de conflitos de caminho do gcode." +msgstr "" +"Não execute nenhuma verificação de validade, como a verificação de conflitos " +"de caminho do gcode." msgid "Ensure on bed" msgstr "Garantir na mesa" -msgid "Lift the object above the bed when it is partially below. Disabled by default" -msgstr "Eleve o objeto acima da mesa quando estiver parcialmente abaixo. Desativado por padrão" +msgid "" +"Lift the object above the bed when it is partially below. Disabled by default" +msgstr "" +"Eleve o objeto acima da mesa quando estiver parcialmente abaixo. Desativado " +"por padrão" msgid "Orient Options" msgstr "Opções de Orientação" @@ -10976,8 +13584,14 @@ msgstr "Ângulo de rotação ao redor do eixo Y em graus." msgid "Data directory" msgstr "Diretório de dados" -msgid "Load and store settings at the given directory. This is useful for maintaining different profiles or including configurations from a network storage." -msgstr "Carregar e armazenar configurações no diretório fornecido. Isso é útil para manter diferentes perfis ou incluir configurações de um armazenamento em rede." +msgid "" +"Load and store settings at the given directory. This is useful for " +"maintaining different profiles or including configurations from a network " +"storage." +msgstr "" +"Carregar e armazenar configurações no diretório fornecido. Isso é útil para " +"manter diferentes perfis ou incluir configurações de um armazenamento em " +"rede." msgid "Load custom gcode" msgstr "Carregar gcode personalizado" @@ -10991,11 +13605,23 @@ msgstr "Z-hop atual" msgid "Contains z-hop present at the beginning of the custom G-code block." msgstr "Contém o z-hop presente no início do bloco de G-code personalizado." -msgid "Position of the extruder at the beginning of the custom G-code block. If the custom G-code travels somewhere else, it should write to this variable so PrusaSlicer knows where it travels from when it gets control back." -msgstr "Posição do extrusor no início do bloco de G-code personalizado. Se o G-code personalizado se deslocar para outro lugar, ele deve escrever nesta variável para que o PrusaSlicer saiba de onde se desloca quando recupera o controle." +msgid "" +"Position of the extruder at the beginning of the custom G-code block. If the " +"custom G-code travels somewhere else, it should write to this variable so " +"PrusaSlicer knows where it travels from when it gets control back." +msgstr "" +"Posição do extrusor no início do bloco de G-code personalizado. Se o G-code " +"personalizado se deslocar para outro lugar, ele deve escrever nesta variável " +"para que o PrusaSlicer saiba de onde se desloca quando recupera o controle." -msgid "Retraction state at the beginning of the custom G-code block. If the custom G-code moves the extruder axis, it should write to this variable so PrusaSlicer deretracts correctly when it gets control back." -msgstr "Estado de retração no início do bloco de G-code personalizado. Se o G-code personalizado mover o eixo do extrusor, ele deve escrever nesta variável para que o PrusaSlicer desretraia corretamente quando recupera o controle." +msgid "" +"Retraction state at the beginning of the custom G-code block. If the custom " +"G-code moves the extruder axis, it should write to this variable so " +"PrusaSlicer deretracts correctly when it gets control back." +msgstr "" +"Estado de retração no início do bloco de G-code personalizado. Se o G-code " +"personalizado mover o eixo do extrusor, ele deve escrever nesta variável " +"para que o PrusaSlicer desretraia corretamente quando recupera o controle." msgid "Extra deretraction" msgstr "Desretração extra" @@ -11012,8 +13638,12 @@ msgstr "Índice base zero da extrusora atualmente utilizada." msgid "Current object index" msgstr "Índice do objeto atual" -msgid "Specific for sequential printing. Zero-based index of currently printed object." -msgstr "Específico para impressão sequencial. Índice base zero do objeto atualmente impresso." +msgid "" +"Specific for sequential printing. Zero-based index of currently printed " +"object." +msgstr "" +"Específico para impressão sequencial. Índice base zero do objeto atualmente " +"impresso." msgid "Has wipe tower" msgstr "Tem torre de limpeza" @@ -11024,26 +13654,36 @@ msgstr "Se a torre de limpeza está sendo gerada ou não na impressão." msgid "Initial extruder" msgstr "Extrusora inicial" -msgid "Zero-based index of the first extruder used in the print. Same as initial_tool." -msgstr "Índice base zero da primeira extrusora utilizada na impressão. Mesmo que ferramenta_inicial." +msgid "" +"Zero-based index of the first extruder used in the print. Same as " +"initial_tool." +msgstr "" +"Índice base zero da primeira extrusora utilizada na impressão. Mesmo que " +"ferramenta_inicial." msgid "Initial tool" msgstr "Ferramenta inicial" -msgid "Zero-based index of the first extruder used in the print. Same as initial_extruder." -msgstr "Índice base zero da primeira extrusora utilizada na impressão. Mesmo que extrusora_inicial." +msgid "" +"Zero-based index of the first extruder used in the print. Same as " +"initial_extruder." +msgstr "" +"Índice base zero da primeira extrusora utilizada na impressão. Mesmo que " +"extrusora_inicial." msgid "Is extruder used?" msgstr "Extrusora utilizada?" msgid "Vector of bools stating whether a given extruder is used in the print." -msgstr "Vetor de booleanos indicando se uma dada extrusora é utilizada na impressão." +msgstr "" +"Vetor de booleanos indicando se uma dada extrusora é utilizada na impressão." msgid "Volume per extruder" msgstr "Volume por extrusora" msgid "Total filament volume extruded per extruder during the entire print." -msgstr "Volume total de filamento extrudado por extrusora durante toda a impressão." +msgstr "" +"Volume total de filamento extrudado por extrusora durante toda a impressão." msgid "Total toolchanges" msgstr "Total de trocas de ferramenta" @@ -11060,14 +13700,22 @@ msgstr "Volume total de filamento usado durante toda a impressão." msgid "Weight per extruder" msgstr "Peso por extrusora" -msgid "Weight per extruder extruded during the entire print. Calculated from filament_density value in Filament Settings." -msgstr "Peso por extrusora extrudido durante toda a impressão. Calculado a partir do valor de densidade do filamento nas configurações de filamento." +msgid "" +"Weight per extruder extruded during the entire print. Calculated from " +"filament_density value in Filament Settings." +msgstr "" +"Peso por extrusora extrudido durante toda a impressão. Calculado a partir do " +"valor de densidade do filamento nas configurações de filamento." msgid "Total weight" msgstr "Peso total" -msgid "Total weight of the print. Calculated from filament_density value in Filament Settings." -msgstr "Peso total da impressão. Calculado a partir do valor de densidade do filamento nas configurações de filamento." +msgid "" +"Total weight of the print. Calculated from filament_density value in " +"Filament Settings." +msgstr "" +"Peso total da impressão. Calculado a partir do valor de densidade do " +"filamento nas configurações de filamento." msgid "Total layer count" msgstr "Total de camadas" @@ -11085,16 +13733,22 @@ msgid "Number of instances" msgstr "Número de instâncias" msgid "Total number of object instances in the print, summed over all objects." -msgstr "Número total de instâncias de objeto na impressão, somadas sobre todos os objetos." +msgstr "" +"Número total de instâncias de objeto na impressão, somadas sobre todos os " +"objetos." msgid "Scale per object" msgstr "Escala por objeto" msgid "" -"Contains a string with the information about what scaling was applied to the individual objects. Indexing of the objects is zero-based (first object has index 0).\n" +"Contains a string with the information about what scaling was applied to the " +"individual objects. Indexing of the objects is zero-based (first object has " +"index 0).\n" "Example: 'x:100% y:50% z:100'." msgstr "" -"Contém uma frase com informações sobre qual escala foi aplicada aos objetos individuais. A indexação dos objetos é baseada em zero (o primeiro objeto tem índice 0).\n" +"Contém uma frase com informações sobre qual escala foi aplicada aos objetos " +"individuais. A indexação dos objetos é baseada em zero (o primeiro objeto " +"tem índice 0).\n" "Exemplo: 'x:100% y:50% z:100'." msgid "Input filename without extension" @@ -11103,17 +13757,27 @@ msgstr "Nome do arquivo de entrada sem extensão" msgid "Source filename of the first object, without extension." msgstr "Nome do arquivo de origem do primeiro objeto, sem extensão." -msgid "The vector has two elements: x and y coordinate of the point. Values in mm." -msgstr "O vetor possui dois elementos: coordenada x e y do ponto. Valores em mm." +msgid "" +"The vector has two elements: x and y coordinate of the point. Values in mm." +msgstr "" +"O vetor possui dois elementos: coordenada x e y do ponto. Valores em mm." -msgid "The vector has two elements: x and y dimension of the bounding box. Values in mm." -msgstr "O vetor tem dois elementos: dimensão x e y da caixa delimitadora. Valores em mm." +msgid "" +"The vector has two elements: x and y dimension of the bounding box. Values " +"in mm." +msgstr "" +"O vetor tem dois elementos: dimensão x e y da caixa delimitadora. Valores em " +"mm." msgid "First layer convex hull" msgstr "Parede convexa da primeira camada" -msgid "Vector of points of the first layer convex hull. Each element has the following format:'[x, y]' (x and y are floating-point numbers in mm)." -msgstr "Vetor de pontos do perímetro convexo da primeira camada. Cada elemento tem o seguinte formato: '[x, y]' (x e y são números em ponto flutuante em mm)." +msgid "" +"Vector of points of the first layer convex hull. Each element has the " +"following format:'[x, y]' (x and y are floating-point numbers in mm)." +msgstr "" +"Vetor de pontos do perímetro convexo da primeira camada. Cada elemento tem o " +"seguinte formato: '[x, y]' (x e y são números em ponto flutuante em mm)." msgid "Bottom-left corner of first layer bounding box" msgstr "Canto inferior esquerdo da caixa delimitadora da primeira camada" @@ -11157,8 +13821,12 @@ msgstr "Nome do perfil de impressão usado para fatiar." msgid "Filament preset name" msgstr "Nome do perfil de filamento" -msgid "Names of the filament presets used for slicing. The variable is a vector containing one name for each extruder." -msgstr "Nomes dos perfis de filamento usados para fatiar. A variável é um vetor contendo um nome para cada extrusora." +msgid "" +"Names of the filament presets used for slicing. The variable is a vector " +"containing one name for each extruder." +msgstr "" +"Nomes dos perfis de filamento usados para fatiar. A variável é um vetor " +"contendo um nome para cada extrusora." msgid "Printer preset name" msgstr "Nome do perfil de impressora" @@ -11176,13 +13844,19 @@ msgid "Layer number" msgstr "Número da camada" msgid "Index of the current layer. One-based (i.e. first layer is number 1)." -msgstr "Índice da camada atual. Baseado em um (ou seja, a primeira camada é o número 1)." +msgstr "" +"Índice da camada atual. Baseado em um (ou seja, a primeira camada é o número " +"1)." msgid "Layer z" msgstr "Camada z" -msgid "Height of the current layer above the print bed, measured to the top of the layer." -msgstr "Altura da camada atual acima da mesa de impressão, medida até o topo da camada." +msgid "" +"Height of the current layer above the print bed, measured to the top of the " +"layer." +msgstr "" +"Altura da camada atual acima da mesa de impressão, medida até o topo da " +"camada." msgid "Maximal layer z" msgstr "Altura máxima da camada z" @@ -11227,8 +13901,12 @@ msgid "large overhangs" msgstr "overhangs grandes" #, c-format, boost-format -msgid "It seems object %s has %s. Please re-orient the object or enable support generation." -msgstr "Parece que o objeto %s tem %s. Por favor, reoriente o objeto ou habilite a geração de suporte." +msgid "" +"It seems object %s has %s. Please re-orient the object or enable support " +"generation." +msgstr "" +"Parece que o objeto %s tem %s. Por favor, reoriente o objeto ou habilite a " +"geração de suporte." msgid "Optimizing toolpath" msgstr "Otimizando caminho da ferramenta" @@ -11236,14 +13914,20 @@ msgstr "Otimizando caminho da ferramenta" msgid "Slicing mesh" msgstr "Fatiando malha" -msgid "No layers were detected. You might want to repair your STL file(s) or check their size or thickness and retry.\n" -msgstr "Nenhuma camada foi detectada. Você pode querer reparar seu(s) arquivo(s) STL ou verificar seu tamanho ou espessura e tentar novamente.\n" +msgid "" +"No layers were detected. You might want to repair your STL file(s) or check " +"their size or thickness and retry.\n" +msgstr "" +"Nenhuma camada foi detectada. Você pode querer reparar seu(s) arquivo(s) STL " +"ou verificar seu tamanho ou espessura e tentar novamente.\n" msgid "" -"An object's XY size compensation will not be used because it is also color-painted.\n" +"An object's XY size compensation will not be used because it is also color-" +"painted.\n" "XY Size compensation can not be combined with color-painting." msgstr "" -"A compensação de tamanho XY de um objeto não será usada porque ele também está pintado com cor.\n" +"A compensação de tamanho XY de um objeto não será usada porque ele também " +"está pintado com cor.\n" "A compensação de tamanho XY não pode ser combinada com pintura colorida." #, c-format, boost-format @@ -11277,8 +13961,11 @@ msgstr "Suporte: corrigir buracos na camada %d" msgid "Support: propagate branches at layer %d" msgstr "Suporte: propagar ramificações na camada %d" -msgid "Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension." -msgstr "Formato de arquivo desconhecido. O arquivo de entrada deve ter extensão .stl, .obj, .amf(.xml)." +msgid "" +"Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension." +msgstr "" +"Formato de arquivo desconhecido. O arquivo de entrada deve ter extensão ." +"stl, .obj, .amf(.xml)." msgid "Loading of a model file failed." msgstr "Falha ao carregar um arquivo de modelo." @@ -11287,7 +13974,9 @@ msgid "The supplied file couldn't be read because it's empty" msgstr "O arquivo fornecido não pôde ser lido porque está vazio" msgid "Unknown file format. Input file must have .3mf or .zip.amf extension." -msgstr "Formato de arquivo desconhecido. O arquivo de entrada deve ter extensão .3mf ou .zip.amf." +msgstr "" +"Formato de arquivo desconhecido. O arquivo de entrada deve ter extensão .3mf " +"ou .zip.amf." msgid "Canceled" msgstr "Cancelado" @@ -11295,6 +13984,9 @@ msgstr "Cancelado" msgid "load_obj: failed to parse" msgstr "load_obj: falha ao analisar" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "O arquivo contém polígonos com mais de 4 vértices." @@ -11343,8 +14035,11 @@ msgstr "Terminar" msgid "How to use calibration result?" msgstr "Como usar o resultado da calibração?" -msgid "You could change the Flow Dynamics Calibration Factor in material editing" -msgstr "Você pode alterar o Fator de Calibração de Dinâmica de Fluxo na edição de materiais" +msgid "" +"You could change the Flow Dynamics Calibration Factor in material editing" +msgstr "" +"Você pode alterar o Fator de Calibração de Dinâmica de Fluxo na edição de " +"materiais" msgid "" "The current firmware version of the printer does not support calibration.\n" @@ -11401,8 +14096,11 @@ msgstr "O nome é o mesmo que outro nome de preset existente" msgid "create new preset failed." msgstr "falha ao criar novo preset." -msgid "Are you sure to cancel the current calibration and return to the home page?" -msgstr "Tem certeza de que deseja cancelar a calibração atual e retornar à página inicial?" +msgid "" +"Are you sure to cancel the current calibration and return to the home page?" +msgstr "" +"Tem certeza de que deseja cancelar a calibração atual e retornar à página " +"inicial?" msgid "No Printer Connected!" msgstr "Nenhuma impressora conectada!" @@ -11416,6 +14114,14 @@ msgstr "Por favor, selecione o filamento para calibrar." msgid "The input value size must be 3." msgstr "O tamanho do valor de entrada deve ser 3." +msgid "" +"This machine type can only hold 16 history results per nozzle. You can " +"delete the existing historical results and then start calibration. Or you " +"can continue the calibration, but you cannot create new calibration " +"historical results. \n" +"Do you still want to continue the calibration?" +msgstr "" + msgid "Connecting to printer..." msgstr "Conectando à impressora..." @@ -11425,6 +14131,22 @@ msgstr "O resultado do teste falhado foi descartado." msgid "Flow Dynamics Calibration result has been saved to the printer" msgstr "O resultado da Calibração de Dinâmica de Fluxo foi salvo na impressora" +#, c-format, boost-format +msgid "" +"There is already a historical calibration result with the same name: %s. " +"Only one of the results with the same name is saved. Are you sure you want " +"to override the historical result?" +msgstr "" +"Já existe um resultado de calibração histórico com o mesmo nome: %s. Apenas " +"um dos resultados com o mesmo nome é salvo. Tem certeza que deseja " +"sobrescrever o resultado histórico?" + +#, c-format, boost-format +msgid "" +"This machine type can only hold %d history results per nozzle. This result " +"will not be saved." +msgstr "" + msgid "Internal Error" msgstr "Erro Interno" @@ -11435,21 +14157,30 @@ msgid "Flow rate calibration result has been saved to preset" msgstr "O resultado da calibração de fluxo foi salvo no preset" msgid "Max volumetric speed calibration result has been saved to preset" -msgstr "O resultado da calibração de fluxo volumétrico máximo foi salvo no preset" +msgstr "" +"O resultado da calibração de fluxo volumétrico máximo foi salvo no preset" msgid "When do you need Flow Dynamics Calibration" msgstr "Quando você precisa da Calibração de Dinâmica de Fluxo" msgid "" -"We now have added the auto-calibration for different filaments, which is fully automated and the result will be saved into the printer for future use. You only need to do the calibration in the following limited cases:\n" -"1. If you introduce a new filament of different brands/models or the filament is damp;\n" +"We now have added the auto-calibration for different filaments, which is " +"fully automated and the result will be saved into the printer for future " +"use. You only need to do the calibration in the following limited cases:\n" +"1. If you introduce a new filament of different brands/models or the " +"filament is damp;\n" "2. if the nozzle is worn out or replaced with a new one;\n" -"3. If the max volumetric speed or print temperature is changed in the filament setting." +"3. If the max volumetric speed or print temperature is changed in the " +"filament setting." msgstr "" -"Adicionamos agora a auto-calibração para diferentes filamentos, que é totalmente automatizada e o resultado será salvo na impressora para uso futuro. Você só precisa fazer a calibração nos seguintes casos limitados:\n" -"1. Se você introduzir um novo filamento de marcas/modelos diferentes ou se o filamento estiver úmido;\n" +"Adicionamos agora a auto-calibração para diferentes filamentos, que é " +"totalmente automatizada e o resultado será salvo na impressora para uso " +"futuro. Você só precisa fazer a calibração nos seguintes casos limitados:\n" +"1. Se você introduzir um novo filamento de marcas/modelos diferentes ou se o " +"filamento estiver úmido;\n" "2. se o bico estiver desgastado ou substituído por um novo;\n" -"3. Se o fluxo volumétrico máximo ou a temperatura de impressão forem alteradas na configuração do filamento." +"3. Se o fluxo volumétrico máximo ou a temperatura de impressão forem " +"alteradas na configuração do filamento." msgid "About this calibration" msgstr "Sobre esta calibração" @@ -11457,54 +14188,127 @@ msgstr "Sobre esta calibração" msgid "" "Please find the details of Flow Dynamics Calibration from our wiki.\n" "\n" -"Usually the calibration is unnecessary. When you start a single color/material print, with the \"flow dynamics calibration\" option checked in the print start menu, the printer will follow the old way, calibrate the filament before the print; When you start a multi color/material print, the printer will use the default compensation parameter for the filament during every filament switch which will have a good result in most cases.\n" +"Usually the calibration is unnecessary. When you start a single color/" +"material print, with the \"flow dynamics calibration\" option checked in the " +"print start menu, the printer will follow the old way, calibrate the " +"filament before the print; When you start a multi color/material print, the " +"printer will use the default compensation parameter for the filament during " +"every filament switch which will have a good result in most cases.\n" "\n" -"Please note there are a few cases that will make the calibration result not reliable: using a texture plate to do the calibration; the build plate does not have good adhesion (please wash the build plate or apply gluestick!) ...You can find more from our wiki.\n" +"Please note there are a few cases that will make the calibration result not " +"reliable: using a texture plate to do the calibration; the build plate does " +"not have good adhesion (please wash the build plate or apply gluestick!) ..." +"You can find more from our wiki.\n" "\n" -"The calibration results have about 10 percent jitter in our test, which may cause the result not exactly the same in each calibration. We are still investigating the root cause to do improvements with new updates." +"The calibration results have about 10 percent jitter in our test, which may " +"cause the result not exactly the same in each calibration. We are still " +"investigating the root cause to do improvements with new updates." msgstr "" "Encontre os detalhes da Calibração de Dinâmica de Fluxo na nossa wiki.\n" "\n" -"Normalmente, a calibração não é necessária. Quando você inicia uma impressão de cor/material única, com a opção \"calibração de dinâmica de fluxo\" ativada no menu de início da impressão, a impressora seguirá o método antigo, calibrando o filamento antes da impressão; Quando você inicia uma impressão de cor/material múltipla, a impressora usará o parâmetro de compensação padrão para o filamento durante cada troca de filamento, o que resultará em um bom resultado na maioria dos casos.\n" +"Normalmente, a calibração não é necessária. Quando você inicia uma impressão " +"de cor/material única, com a opção \"calibração de dinâmica de fluxo\" " +"ativada no menu de início da impressão, a impressora seguirá o método " +"antigo, calibrando o filamento antes da impressão; Quando você inicia uma " +"impressão de cor/material múltipla, a impressora usará o parâmetro de " +"compensação padrão para o filamento durante cada troca de filamento, o que " +"resultará em um bom resultado na maioria dos casos.\n" "\n" -"Por favor, note que existem alguns casos que podem tornar o resultado da calibração não confiável: usar uma mesa texturizada para fazer a calibração; a mesa não tem boa adesão (por favor, lave a mesa ou aplique cola!) ... Você pode encontrar mais informações em nossa wiki.\n" +"Por favor, note que existem alguns casos que podem tornar o resultado da " +"calibração não confiável: usar uma mesa texturizada para fazer a calibração; " +"a mesa não tem boa adesão (por favor, lave a mesa ou aplique cola!) ... Você " +"pode encontrar mais informações em nossa wiki.\n" "\n" -"Os resultados da calibração têm cerca de 10 por cento de oscilação em nossos testes, o que pode fazer com que o resultado não seja exatamente o mesmo em cada calibração. Ainda estamos investigando a causa raiz para fazer melhorias com novas atualizações." +"Os resultados da calibração têm cerca de 10 por cento de oscilação em nossos " +"testes, o que pode fazer com que o resultado não seja exatamente o mesmo em " +"cada calibração. Ainda estamos investigando a causa raiz para fazer " +"melhorias com novas atualizações." msgid "When to use Flow Rate Calibration" msgstr "Quando usar a Calibração de Fluxo" msgid "" -"After using Flow Dynamics Calibration, there might still be some extrusion issues, such as:\n" -"1. Over-Extrusion: Excess material on your printed object, forming blobs or zits, or the layers seem thicker than expected and not uniform.\n" -"2. Under-Extrusion: Very thin layers, weak infill strength, or gaps in the top layer of the model, even when printing slowly.\n" +"After using Flow Dynamics Calibration, there might still be some extrusion " +"issues, such as:\n" +"1. Over-Extrusion: Excess material on your printed object, forming blobs or " +"zits, or the layers seem thicker than expected and not uniform.\n" +"2. Under-Extrusion: Very thin layers, weak infill strength, or gaps in the " +"top layer of the model, even when printing slowly.\n" "3. Poor Surface Quality: The surface of your prints seems rough or uneven.\n" -"4. Weak Structural Integrity: Prints break easily or don't seem as sturdy as they should be." +"4. Weak Structural Integrity: Prints break easily or don't seem as sturdy as " +"they should be." msgstr "" -"Depois de usar a Calibração de Dinâmica de Fluxo, ainda pode haver alguns problemas de extrusão, como:\n" -"1. Superextrusão: excesso de material no objeto impresso, formando grumos ou espinhas, ou as camadas parecem mais espessas do que o esperado e não uniformes.\n" -"2. Subextrusão: camadas muito finas, resistência fraca do preenchimento ou vazios na camada superior do modelo, mesmo ao imprimir lentamente.\n" -"3. Baixa Qualidade de Superfície: a superfície de suas impressões parece áspera ou irregular.\n" -"4. Integridade Estrutural Fraca: as impressões quebram facilmente ou não parecem tão robustas quanto deveriam." - -msgid "In addition, Flow Rate Calibration is crucial for foaming materials like LW-PLA used in RC planes. These materials expand greatly when heated, and calibration provides a useful reference flow rate." -msgstr "Além disso, a Calibração de Fluxo é crucial para materiais espumantes como LW-PLA usados em aviões RC. Esses materiais se expandem muito quando aquecidos, e a calibração fornece uma taxa de fluxo de referência útil." - -msgid "Flow Rate Calibration measures the ratio of expected to actual extrusion volumes. The default setting works well in Bambu Lab printers and official filaments as they were pre-calibrated and fine-tuned. For a regular filament, you usually won't need to perform a Flow Rate Calibration unless you still see the listed defects after you have done other calibrations. For more details, please check out the wiki article." -msgstr "A Calibração de Fluxo mede a relação entre os volumes de extrusão esperados e reais. A configuração padrão funciona bem em impressoras Bambu Lab e filamentos oficiais, pois foram pré-calibrados e ajustados. Para um filamento regular, geralmente você não precisará realizar uma Calibração da Taxa de Fluxo a menos que ainda veja os defeitos listados após ter feito outras calibrações. Para mais detalhes, consulte o artigo na wiki." +"Depois de usar a Calibração de Dinâmica de Fluxo, ainda pode haver alguns " +"problemas de extrusão, como:\n" +"1. Superextrusão: excesso de material no objeto impresso, formando grumos ou " +"espinhas, ou as camadas parecem mais espessas do que o esperado e não " +"uniformes.\n" +"2. Subextrusão: camadas muito finas, resistência fraca do preenchimento ou " +"vazios na camada superior do modelo, mesmo ao imprimir lentamente.\n" +"3. Baixa Qualidade de Superfície: a superfície de suas impressões parece " +"áspera ou irregular.\n" +"4. Integridade Estrutural Fraca: as impressões quebram facilmente ou não " +"parecem tão robustas quanto deveriam." msgid "" -"Auto Flow Rate Calibration utilizes Bambu Lab's Micro-Lidar technology, directly measuring the calibration patterns. However, please be advised that the efficacy and accuracy of this method may be compromised with specific types of materials. Particularly, filaments that are transparent or semi-transparent, sparkling-particled, or have a high-reflective finish may not be suitable for this calibration and can produce less-than-desirable results.\n" -"\n" -"The calibration results may vary between each calibration or filament. We are still improving the accuracy and compatibility of this calibration through firmware updates over time.\n" -"\n" -"Caution: Flow Rate Calibration is an advanced process, to be attempted only by those who fully understand its purpose and implications. Incorrect usage can lead to sub-par prints or printer damage. Please make sure to carefully read and understand the process before doing it." +"In addition, Flow Rate Calibration is crucial for foaming materials like LW-" +"PLA used in RC planes. These materials expand greatly when heated, and " +"calibration provides a useful reference flow rate." msgstr "" -"A Calibração Automática de Fluxo utiliza a tecnologia Micro-Lidar da Bambu Lab, medindo diretamente os padrões de calibração. No entanto, esteja ciente de que a eficácia e precisão deste método podem ser comprometidas com tipos específicos de materiais. Especialmente, filamentos que são transparentes ou semi-transparentes, com partículas brilhantes ou com acabamento altamente reflexivo podem não ser adequados para esta calibração e podem produzir resultados abaixo do desejado.\n" +"Além disso, a Calibração de Fluxo é crucial para materiais espumantes como " +"LW-PLA usados em aviões RC. Esses materiais se expandem muito quando " +"aquecidos, e a calibração fornece uma taxa de fluxo de referência útil." + +msgid "" +"Flow Rate Calibration measures the ratio of expected to actual extrusion " +"volumes. The default setting works well in Bambu Lab printers and official " +"filaments as they were pre-calibrated and fine-tuned. For a regular " +"filament, you usually won't need to perform a Flow Rate Calibration unless " +"you still see the listed defects after you have done other calibrations. For " +"more details, please check out the wiki article." +msgstr "" +"A Calibração de Fluxo mede a relação entre os volumes de extrusão esperados " +"e reais. A configuração padrão funciona bem em impressoras Bambu Lab e " +"filamentos oficiais, pois foram pré-calibrados e ajustados. Para um " +"filamento regular, geralmente você não precisará realizar uma Calibração da " +"Taxa de Fluxo a menos que ainda veja os defeitos listados após ter feito " +"outras calibrações. Para mais detalhes, consulte o artigo na wiki." + +msgid "" +"Auto Flow Rate Calibration utilizes Bambu Lab's Micro-Lidar technology, " +"directly measuring the calibration patterns. However, please be advised that " +"the efficacy and accuracy of this method may be compromised with specific " +"types of materials. Particularly, filaments that are transparent or semi-" +"transparent, sparkling-particled, or have a high-reflective finish may not " +"be suitable for this calibration and can produce less-than-desirable " +"results.\n" "\n" -"Os resultados da calibração podem variar entre cada calibração ou filamento. Ainda estamos melhorando a precisão e compatibilidade desta calibração por meio de atualizações de firmware ao longo do tempo.\n" +"The calibration results may vary between each calibration or filament. We " +"are still improving the accuracy and compatibility of this calibration " +"through firmware updates over time.\n" "\n" -"Atenção: A Calibração da Taxa de Fluxo é um processo avançado, para ser tentado apenas por aqueles que entendem completamente seu propósito e implicações. O uso incorreto pode resultar em impressões de baixa qualidade ou danos à impressora. Certifique-se de ler e entender cuidadosamente o processo antes de fazê-lo." +"Caution: Flow Rate Calibration is an advanced process, to be attempted only " +"by those who fully understand its purpose and implications. Incorrect usage " +"can lead to sub-par prints or printer damage. Please make sure to carefully " +"read and understand the process before doing it." +msgstr "" +"A Calibração Automática de Fluxo utiliza a tecnologia Micro-Lidar da Bambu " +"Lab, medindo diretamente os padrões de calibração. No entanto, esteja ciente " +"de que a eficácia e precisão deste método podem ser comprometidas com tipos " +"específicos de materiais. Especialmente, filamentos que são transparentes ou " +"semi-transparentes, com partículas brilhantes ou com acabamento altamente " +"reflexivo podem não ser adequados para esta calibração e podem produzir " +"resultados abaixo do desejado.\n" +"\n" +"Os resultados da calibração podem variar entre cada calibração ou filamento. " +"Ainda estamos melhorando a precisão e compatibilidade desta calibração por " +"meio de atualizações de firmware ao longo do tempo.\n" +"\n" +"Atenção: A Calibração da Taxa de Fluxo é um processo avançado, para ser " +"tentado apenas por aqueles que entendem completamente seu propósito e " +"implicações. O uso incorreto pode resultar em impressões de baixa qualidade " +"ou danos à impressora. Certifique-se de ler e entender cuidadosamente o " +"processo antes de fazê-lo." msgid "When you need Max Volumetric Speed Calibration" msgstr "Quando você precisa da Calibração de Velocidade Volumétrica Máxima" @@ -11513,7 +14317,9 @@ msgid "Over-extrusion or under extrusion" msgstr "Sobre-extrusão ou sub-extrusão" msgid "Max Volumetric Speed calibration is recommended when you print with:" -msgstr "A calibração de Velocidade Volumétrica Máxima é recomendada quando você imprime com:" +msgstr "" +"A calibração de Velocidade Volumétrica Máxima é recomendada quando você " +"imprime com:" msgid "material with significant thermal shrinkage/expansion, such as..." msgstr "material com significativa contração/expansão térmica, como..." @@ -11524,11 +14330,19 @@ msgstr "materiais com diâmetro de filamento impreciso" msgid "We found the best Flow Dynamics Calibration Factor" msgstr "Encontramos o melhor Fator de Calibração de Dinâmica de Fluxo" -msgid "Part of the calibration failed! You may clean the plate and retry. The failed test result would be dropped." -msgstr "Parte da calibração falhou! Você pode limpar a mesa e tentar novamente. O resultado do teste falho será descartado." +msgid "" +"Part of the calibration failed! You may clean the plate and retry. The " +"failed test result would be dropped." +msgstr "" +"Parte da calibração falhou! Você pode limpar a mesa e tentar novamente. O " +"resultado do teste falho será descartado." -msgid "*We recommend you to add brand, materia, type, and even humidity level in the Name" -msgstr "*Recomendamos que você adicione marca, material, tipo e até mesmo nível de umidade no nome" +msgid "" +"*We recommend you to add brand, materia, type, and even humidity level in " +"the Name" +msgstr "" +"*Recomendamos que você adicione marca, material, tipo e até mesmo nível de " +"umidade no nome" msgid "Failed" msgstr "Falhou" @@ -11539,12 +14353,22 @@ msgstr "Por favor, insira o nome que você deseja salvar na impressora." msgid "The name cannot exceed 40 characters." msgstr "O nome não pode ter mais de 40 caracteres." -msgid "Only one of the results with the same name will be saved. Are you sure you want to overrides the other results?" -msgstr "Apenas um dos resultados com o mesmo nome será salvo. Você tem certeza de que deseja substituir os outros resultados?" +msgid "" +"Only one of the results with the same name will be saved. Are you sure you " +"want to overrides the other results?" +msgstr "" +"Apenas um dos resultados com o mesmo nome será salvo. Você tem certeza de " +"que deseja substituir os outros resultados?" #, c-format, boost-format -msgid "There is already a historical calibration result with the same name: %s. Only one of the results with the same name is saved. Are you sure you want to overrides the historical result?" -msgstr "Já existe um resultado de calibração histórico com o mesmo nome: %s. Apenas um dos resultados com o mesmo nome é salvo. Você tem certeza de que deseja substituir o resultado histórico?" +msgid "" +"There is already a historical calibration result with the same name: %s. " +"Only one of the results with the same name is saved. Are you sure you want " +"to overrides the historical result?" +msgstr "" +"Já existe um resultado de calibração histórico com o mesmo nome: %s. Apenas " +"um dos resultados com o mesmo nome é salvo. Você tem certeza de que deseja " +"substituir o resultado histórico?" msgid "Please find the best line on your plate" msgstr "Por favor, encontre a melhor linha em sua mesa" @@ -11602,7 +14426,8 @@ msgid "Please choose a block with smoothest top surface." msgstr "Por favor, escolha um bloco com a superfície superior mais lisa." msgid "Please input a valid value (0 <= Max Volumetric Speed <= 60)" -msgstr "Por favor, insira um valor válido (0 <= Velocidade Volumétrica Máxima <= 60)" +msgstr "" +"Por favor, insira um valor válido (0 <= Velocidade Volumétrica Máxima <= 60)" msgid "Calibration Type" msgstr "Tipo de Calibração" @@ -11616,15 +14441,16 @@ msgstr "Calibração Fina baseada no fluxo" msgid "Title" msgstr "Título" -msgid "A test model will be printed. Please clear the build plate and place it back to the hot bed before calibration." -msgstr "Um modelo de teste será impresso. Por favor, limpe a mesa e a coloque de volta na mesa aquecida antes da calibração." +msgid "" +"A test model will be printed. Please clear the build plate and place it back " +"to the hot bed before calibration." +msgstr "" +"Um modelo de teste será impresso. Por favor, limpe a mesa e a coloque de " +"volta na mesa aquecida antes da calibração." msgid "Printing Parameters" msgstr "Parâmetros de Impressão" -msgid "- ℃" -msgstr "- °C" - msgid "Plate Type" msgstr "Tipo de mesa" @@ -11644,7 +14470,8 @@ msgid "" msgstr "" "Dicas para material de calibração:\n" "- Materiais que podem compartilhar a mesma temperatura de mesa aquecida\n" -"- Diferentes marcas e famílias de filamentos (Marca = Bambu, Família = Básico, Fosco)" +"- Diferentes marcas e famílias de filamentos (Marca = Bambu, Família = " +"Básico, Fosco)" msgid "Pattern" msgstr "Padrão" @@ -11671,12 +14498,6 @@ msgstr "Para o Valor k" msgid "Step value" msgstr "Valor do Passo" -msgid "0.5" -msgstr "0.5" - -msgid "0.005" -msgstr "0.005" - msgid "The nozzle diameter has been synchronized from the printer Settings" msgstr "O diâmetro do bico foi sincronizado das configurações da impressora" @@ -11704,11 +14525,15 @@ msgstr "Atualizando os registros históricos de Calibração de Dinâmica de Flu msgid "Action" msgstr "Ação" +#, c-format, boost-format +msgid "This machine type can only hold %d history results per nozzle." +msgstr "" + msgid "Edit Flow Dynamics Calibration" msgstr "Editar Calibração de Dinâmica de Fluxo" -msgid "New Flow Dynamics Calibration" -msgstr "Nova Calibração de Dinâmica de Fluxo" +msgid "New Flow Dynamic Calibration" +msgstr "" msgid "Ok" msgstr "Ok" @@ -11716,10 +14541,6 @@ msgstr "Ok" msgid "The filament must be selected." msgstr "O filamento deve ser selecionado." -#, c-format, boost-format -msgid "There is already a historical calibration result with the same name: %s. Only one of the results with the same name is saved. Are you sure you want to override the historical result?" -msgstr "Já existe um resultado de calibração histórico com o mesmo nome: %s. Apenas um dos resultados com o mesmo nome é salvo. Tem certeza que deseja sobrescrever o resultado histórico?" - msgid "Network lookup" msgstr "Procura de Rede" @@ -11899,7 +14720,8 @@ msgid "Upload to Printer Host with the following filename:" msgstr "Enviar para o Host da Impressora com o seguinte nome de arquivo:" msgid "Use forward slashes ( / ) as a directory separator if needed." -msgstr "Use barras inclinadas ( / ) como separador de diretórios, se necessário." +msgstr "" +"Use barras inclinadas ( / ) como separador de diretórios, se necessário." msgid "Upload to storage" msgstr "Enviar para armazenamento" @@ -12075,36 +14897,53 @@ msgid "Vendor is not selected, please reselect vendor." msgstr "Fornecedor não está selecionado, por favor, reselecione o fornecedor." msgid "Custom vendor is not input, please input custom vendor." -msgstr "O fornecedor personalizado não foi inserido, por favor insira o fornecedor personalizado." +msgstr "" +"O fornecedor personalizado não foi inserido, por favor insira o fornecedor " +"personalizado." -msgid "\"Bambu\" or \"Generic\" can not be used as a Vendor for custom filaments." -msgstr "\"Bambu\" ou \"Genérico\" não podem ser usados como fornecedor para filamentos personalizados." +msgid "" +"\"Bambu\" or \"Generic\" can not be used as a Vendor for custom filaments." +msgstr "" +"\"Bambu\" ou \"Genérico\" não podem ser usados como fornecedor para " +"filamentos personalizados." msgid "Filament type is not selected, please reselect type." -msgstr "O tipo de filamento não está selecionado, por favor, reselecione o tipo." +msgstr "" +"O tipo de filamento não está selecionado, por favor, reselecione o tipo." msgid "Filament serial is not inputed, please input serial." msgstr "O serial do filamento não foi inserido, por favor, insira o serial." -msgid "There may be escape characters in the vendor or serial input of filament. Please delete and re-enter." -msgstr "Pode haver caracteres de escape na entrada de fornecedor ou serial do filamento. Por favor, exclua e insira novamente." +msgid "" +"There may be escape characters in the vendor or serial input of filament. " +"Please delete and re-enter." +msgstr "" +"Pode haver caracteres de escape na entrada de fornecedor ou serial do " +"filamento. Por favor, exclua e insira novamente." msgid "All inputs in the custom vendor or serial are spaces. Please re-enter." -msgstr "Todas as entradas no fornecedor personalizado ou serial são espaços. Por favor, insira novamente." +msgstr "" +"Todas as entradas no fornecedor personalizado ou serial são espaços. Por " +"favor, insira novamente." msgid "The vendor can not be a number. Please re-enter." msgstr "O fornecedor não pode ser um número. Por favor, insira novamente." -msgid "You have not selected a printer or preset yet. Please select at least one." -msgstr "Você ainda não selecionou uma impressora ou preset. Por favor, selecione pelo menos um." +msgid "" +"You have not selected a printer or preset yet. Please select at least one." +msgstr "" +"Você ainda não selecionou uma impressora ou preset. Por favor, selecione " +"pelo menos um." #, c-format, boost-format msgid "" "The Filament name %s you created already exists. \n" -"If you continue creating, the preset created will be displayed with its full name. Do you want to continue?" +"If you continue creating, the preset created will be displayed with its full " +"name. Do you want to continue?" msgstr "" "O nome do Filamento %s que você criou já existe. \n" -"Se você continuar a criar, a predefinição criada será exibida com o seu nome completo. Você quer continuar?" +"Se você continuar a criar, a predefinição criada será exibida com o seu nome " +"completo. Você quer continuar?" msgid "Some existing presets have failed to be created, as follows:\n" msgstr "Alguns presets existentes falharam ao serem criados, como segue:\n" @@ -12117,11 +14956,14 @@ msgstr "" "Você deseja reescrevê-lo?" msgid "" -"We would rename the presets as \"Vendor Type Serial @printer you selected\". \n" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" "To add preset for more printers, Please go to printer selection" msgstr "" -"Renomearíamos os presets como \"Fornecedor Tipo Serial @ impressora que você selecionou\". \n" -"Para adicionar preset para mais impressoras, Por favor, vá para a seleção de impressoras" +"Renomearíamos os presets como \"Fornecedor Tipo Serial @ impressora que você " +"selecionou\". \n" +"Para adicionar preset para mais impressoras, Por favor, vá para a seleção de " +"impressoras" msgid "Create Printer/Nozzle" msgstr "Criar Impressora/Bico" @@ -12194,7 +15036,8 @@ msgid "Exception in obtaining file size, please import again." msgstr "Exceção ao obter o tamanho do arquivo, por favor, importe novamente." msgid "Preset path is not find, please reselect vendor." -msgstr "O caminho do preset não é encontrado, por favor, reselecione o fornecedor." +msgstr "" +"O caminho do preset não é encontrado, por favor, reselecione o fornecedor." msgid "The printer model was not found, please reselect." msgstr "O modelo da impressora não foi encontrado, por favor, reselecione." @@ -12220,24 +15063,38 @@ msgstr "Processar Modelo de Preset" msgid "Back Page 1" msgstr "Voltar à Página 1" -msgid "You have not yet chosen which printer preset to create based on. Please choose the vendor and model of the printer" -msgstr "Você ainda não escolheu em qual preset de impressora basear-se. Por favor, escolha o fornecedor e modelo da impressora" +msgid "" +"You have not yet chosen which printer preset to create based on. Please " +"choose the vendor and model of the printer" +msgstr "" +"Você ainda não escolheu em qual preset de impressora basear-se. Por favor, " +"escolha o fornecedor e modelo da impressora" -msgid "You have entered an illegal input in the printable area section on the first page. Please check before creating it." -msgstr "Você inseriu uma entrada ilegal na seção de área imprimível na primeira página. Por favor, verifique antes de criar." +msgid "" +"You have entered an illegal input in the printable area section on the first " +"page. Please check before creating it." +msgstr "" +"Você inseriu uma entrada ilegal na seção de área imprimível na primeira " +"página. Por favor, verifique antes de criar." msgid "The custom printer or model is not inputed, place input." msgstr "A impressora ou modelo personalizado não foi colocado." msgid "" -"The printer preset you created already has a preset with the same name. Do you want to overwrite it?\n" -"\tYes: Overwrite the printer preset with the same name, and filament and process presets with the same preset name will be recreated \n" -"and filament and process presets without the same preset name will be reserve.\n" +"The printer preset you created already has a preset with the same name. Do " +"you want to overwrite it?\n" +"\tYes: Overwrite the printer preset with the same name, and filament and " +"process presets with the same preset name will be recreated \n" +"and filament and process presets without the same preset name will be " +"reserve.\n" "\tCancel: Do not create a preset, return to the creation interface." msgstr "" -"O modelo de impressora que você criou já possui um modelo com o mesmo nome. Deseja substituí-lo?\n" -" \tSim: Substituir o modelo de impressora com o mesmo nome, e os modelos de filamento e processo com o mesmo nome do modelo serão recriados, \n" -" e os modelos de filamento e processo sem o mesmo nome do modelo serão preservados.\n" +"O modelo de impressora que você criou já possui um modelo com o mesmo nome. " +"Deseja substituí-lo?\n" +" \tSim: Substituir o modelo de impressora com o mesmo nome, e os modelos de " +"filamento e processo com o mesmo nome do modelo serão recriados, \n" +" e os modelos de filamento e processo sem o mesmo nome do modelo serão " +"preservados.\n" " \tCancelar: Não criar um modelo, retornar para a interface de criação." msgid "You need to select at least one filament preset." @@ -12258,20 +15115,34 @@ msgstr "Fornecedor não encontrado, por favor selecione novamente." msgid "Current vendor has no models, please reselect." msgstr "O fornecedor atual não possui modelos, por favor, selecione novamente." -msgid "You have not selected the vendor and model or inputed the custom vendor and model." -msgstr "Você não selecionou um fornecedor e modelo nem colocou fornecer e modelo personalizado." +msgid "" +"You have not selected the vendor and model or inputed the custom vendor and " +"model." +msgstr "" +"Você não selecionou um fornecedor e modelo nem colocou fornecer e modelo " +"personalizado." -msgid "There may be escape characters in the custom printer vendor or model. Please delete and re-enter." -msgstr "Pode haver caracteres de escape no fornecedor ou modelo personalizado da impressora. Por favor, exclua e insira novamente." +msgid "" +"There may be escape characters in the custom printer vendor or model. Please " +"delete and re-enter." +msgstr "" +"Pode haver caracteres de escape no fornecedor ou modelo personalizado da " +"impressora. Por favor, exclua e insira novamente." -msgid "All inputs in the custom printer vendor or model are spaces. Please re-enter." -msgstr "Todas as entradas no fornecedor ou modelo personalizado da impressora são espaços. Por favor, insira novamente." +msgid "" +"All inputs in the custom printer vendor or model are spaces. Please re-enter." +msgstr "" +"Todas as entradas no fornecedor ou modelo personalizado da impressora são " +"espaços. Por favor, insira novamente." msgid "Please check bed printable shape and origin input." msgstr "Por favor, verifique a forma imprimível da mesa e a entrada de origem." -msgid "You have not yet selected the printer to replace the nozzle, please choose." -msgstr "Você ainda não selecionou a impressora para substituir o bico, por favor, escolha." +msgid "" +"You have not yet selected the printer to replace the nozzle, please choose." +msgstr "" +"Você ainda não selecionou a impressora para substituir o bico, por favor, " +"escolha." msgid "Create Printer Successful" msgstr "Impressora criada com sucesso" @@ -12283,28 +15154,39 @@ msgid "Printer Created" msgstr "Impressora criada" msgid "Please go to printer settings to edit your presets" -msgstr "Por favor vá parar configurações de impressora para editar os seus presets" +msgstr "" +"Por favor vá parar configurações de impressora para editar os seus presets" msgid "Filament Created" msgstr "Filamento criado" msgid "" "Please go to filament setting to edit your presets if you need.\n" -"Please note that nozzle temperature, hot bed temperature, and maximum volumetric speed has a significant impact on printing quality. Please set them carefully." +"Please note that nozzle temperature, hot bed temperature, and maximum " +"volumetric speed has a significant impact on printing quality. Please set " +"them carefully." msgstr "" -"Por favor, vá para as configurações do filamento para editar seus presets, se necessário. \n" -"Por favor, note que a temperatura do bico, temperatura da mesa aquecida e velocidade volumétrica máxima têm um impacto significativo na qualidade de impressão. Por favor, ajuste-os com cuidado." +"Por favor, vá para as configurações do filamento para editar seus presets, " +"se necessário. \n" +"Por favor, note que a temperatura do bico, temperatura da mesa aquecida e " +"velocidade volumétrica máxima têm um impacto significativo na qualidade de " +"impressão. Por favor, ajuste-os com cuidado." msgid "" "\n" "\n" -"Studio has detected that your user presets synchronization function is not enabled, which may result in unsuccessful Filament settings on the Device page. \n" +"Studio has detected that your user presets synchronization function is not " +"enabled, which may result in unsuccessful Filament settings on the Device " +"page. \n" "Click \"Sync user presets\" to enable the synchronization function." msgstr "" "\n" "\n" -"Studio detectou que sua função de sincronização predefinida não está ativa, o que pode resultar em configurações de arquivo malsucedidas na página do dispositivo. \n" -"Clique em \"Sincronizar pressets do usuário\" para habilitar a função de sincronização." +"Studio detectou que sua função de sincronização predefinida não está ativa, " +"o que pode resultar em configurações de arquivo malsucedidas na página do " +"dispositivo. \n" +"Clique em \"Sincronizar pressets do usuário\" para habilitar a função de " +"sincronização." msgid "Printer Setting" msgstr "Configuração da Impressora" @@ -12347,17 +15229,21 @@ msgstr "Exportação bem-sucedida" #, c-format, boost-format msgid "" -"The '%s' folder already exists in the current directory. Do you want to clear it and rebuild it.\n" -"If not, a time suffix will be added, and you can modify the name after creation." +"The '%s' folder already exists in the current directory. Do you want to " +"clear it and rebuild it.\n" +"If not, a time suffix will be added, and you can modify the name after " +"creation." msgstr "" "A pasta '%s' já existe no diretório atual. Deseja limpá-la e reconstruí-la?\n" -"Se não, um sufixo de tempo será adicionado, e você poderá modificar o nome após a criação." +"Se não, um sufixo de tempo será adicionado, e você poderá modificar o nome " +"após a criação." msgid "" "Printer and all the filament&&process presets that belongs to the printer. \n" "Can be shared with others." msgstr "" -"Presets da impressora e todos os filamentos e processos que pertencem à impressora. \n" +"Presets da impressora e todos os filamentos e processos que pertencem à " +"impressora. \n" "Pode ser compartilhado com outros." msgid "" @@ -12367,28 +15253,44 @@ msgstr "" "Conjunto de presets de filamento do usuário. \n" "Pode ser compartilhado com outros." -msgid "Only display printer names with changes to printer, filament, and process presets." -msgstr "Só exibir nomes de impressoras com alterações nos presets de impressora, filamento e processo." +msgid "" +"Only display printer names with changes to printer, filament, and process " +"presets." +msgstr "" +"Só exibir nomes de impressoras com alterações nos presets de impressora, " +"filamento e processo." msgid "Only display the filament names with changes to filament presets." -msgstr "Apenas exibir os nomes dos filamentos com alterações nos presets de filamento." +msgstr "" +"Apenas exibir os nomes dos filamentos com alterações nos presets de " +"filamento." -msgid "Only printer names with user printer presets will be displayed, and each preset you choose will be exported as a zip." -msgstr "Apenas os nomes das impressoras com presets de impressora do usuário serão exibidos, e cada preset escolhido será exportado como um arquivo zip." +msgid "" +"Only printer names with user printer presets will be displayed, and each " +"preset you choose will be exported as a zip." +msgstr "" +"Apenas os nomes das impressoras com presets de impressora do usuário serão " +"exibidos, e cada preset escolhido será exportado como um arquivo zip." msgid "" "Only the filament names with user filament presets will be displayed, \n" -"and all user filament presets in each filament name you select will be exported as a zip." +"and all user filament presets in each filament name you select will be " +"exported as a zip." msgstr "" -"Apenas os nomes dos filamentos com presets de filamento do usuário serão exibidos, \n" -"e todas as presets de filamento do usuário em cada nome de filamento selecionado serão exportadas como um arquivo zip." +"Apenas os nomes dos filamentos com presets de filamento do usuário serão " +"exibidos, \n" +"e todas as presets de filamento do usuário em cada nome de filamento " +"selecionado serão exportadas como um arquivo zip." msgid "" "Only printer names with changed process presets will be displayed, \n" -"and all user process presets in each printer name you select will be exported as a zip." +"and all user process presets in each printer name you select will be " +"exported as a zip." msgstr "" -"Apenas os nomes das impressoras com presets de processo alterados serão exibidos, \n" -"e todos os presets de processo do usuário em cada nome de impressora selecionado serão exportados como um arquivo zip." +"Apenas os nomes das impressoras com presets de processo alterados serão " +"exibidos, \n" +"e todos os presets de processo do usuário em cada nome de impressora " +"selecionado serão exportados como um arquivo zip." msgid "Please select at least one printer or filament." msgstr "Por favor, selecione pelo menos uma impressora ou filamento." @@ -12397,7 +15299,9 @@ msgid "Please select a type you want to export" msgstr "Por favor, selecione um tipo que deseja exportar" msgid "Failed to create temporary folder, please try Export Configs again." -msgstr "Falha ao criar uma pasta temporária, por favor, tente exportar as configurações novamente." +msgstr "" +"Falha ao criar uma pasta temporária, por favor, tente exportar as " +"configurações novamente." msgid "Edit Filament" msgstr "Editar Filamento" @@ -12405,8 +15309,12 @@ msgstr "Editar Filamento" msgid "Filament presets under this filament" msgstr "Presets de filamento sob este filamento" -msgid "Note: If the only preset under this filament is deleted, the filament will be deleted after exiting the dialog." -msgstr "Nota: Se o único preset sob este filamento for excluído, o filamento será excluído após sair da janela." +msgid "" +"Note: If the only preset under this filament is deleted, the filament will " +"be deleted after exiting the dialog." +msgstr "" +"Nota: Se o único preset sob este filamento for excluído, o filamento será " +"excluído após sair da janela." msgid "Presets inherited by other presets can not be deleted" msgstr "Presets herdados por outros presets não podem ser excluídos" @@ -12433,10 +15341,13 @@ msgstr "Excluir Filamento" msgid "" "All the filament presets belong to this filament would be deleted. \n" -"If you are using this filament on your printer, please reset the filament information for that slot." +"If you are using this filament on your printer, please reset the filament " +"information for that slot." msgstr "" -"Todos os presets de filamento pertencentes a este filamento seriam excluídas. \n" -"Se você estiver usando este filamento em sua impressora, redefina as informações do filamento para esse slot." +"Todos os presets de filamento pertencentes a este filamento seriam " +"excluídas. \n" +"Se você estiver usando este filamento em sua impressora, redefina as " +"informações do filamento para esse slot." msgid "Delete filament" msgstr "Excluir filamento" @@ -12451,7 +15362,9 @@ msgid "Copy preset from filament" msgstr "Copiar preset do filamento" msgid "The filament choice not find filament preset, please reselect it" -msgstr "O filamento selecionado não encontra preset de filamento, por favor, selecione novamente" +msgstr "" +"O filamento selecionado não encontra preset de filamento, por favor, " +"selecione novamente" msgid "[Delete Required]" msgstr "[Excluir Necessário]" @@ -12468,8 +15381,12 @@ msgstr "Recolher" msgid "Daily Tips" msgstr "Dicas Diárias" -msgid "Your nozzle diameter in preset is not consistent with memorized nozzle diameter. Did you change your nozzle lately?" -msgstr "O diâmetro do bico no seu perfil não está consistente com o diâmetro do bico memorizado. Você mudou seu bico recentemente?" +msgid "" +"Your nozzle diameter in preset is not consistent with memorized nozzle " +"diameter. Did you change your nozzle lately?" +msgstr "" +"O diâmetro do bico no seu perfil não está consistente com o diâmetro do bico " +"memorizado. Você mudou seu bico recentemente?" #, c-format, boost-format msgid "*Printing %s material with %s may cause nozzle damage" @@ -12481,8 +15398,12 @@ msgstr "É necessário selecionar uma impressora" msgid "The start, end or step is not valid value." msgstr "O início, fim ou passo não é um valor válido." -msgid "Unable to calibrate: maybe because the set calibration value range is too large, or the step is too small" -msgstr "Incapaz de calibrar: talvez porque a faixa de valor de calibração definida seja muito grande ou o passo seja muito pequeno" +msgid "" +"Unable to calibrate: maybe because the set calibration value range is too " +"large, or the step is too small" +msgstr "" +"Incapaz de calibrar: talvez porque a faixa de valor de calibração definida " +"seja muito grande ou o passo seja muito pequeno" msgid "Physical Printer" msgstr "Impressora Física" @@ -12502,27 +15423,41 @@ msgstr "Tem certeza de que deseja sair?" msgid "Refresh Printers" msgstr "Atualizar Impressoras" -msgid "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate." -msgstr "O arquivo CA HTTPS é opcional. É necessário apenas se você usar HTTPS com um certificado autoassinado." +msgid "" +"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" +"signed certificate." +msgstr "" +"O arquivo CA HTTPS é opcional. É necessário apenas se você usar HTTPS com um " +"certificado autoassinado." msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" -msgstr "Arquivos de certificado (*.crt, *.pem)|*.crt;*.pem|Todos os arquivos|*.*" +msgstr "" +"Arquivos de certificado (*.crt, *.pem)|*.crt;*.pem|Todos os arquivos|*.*" msgid "Open CA certificate file" msgstr "Abrir arquivo de certificado CA" #, c-format, boost-format -msgid "On this system, %s uses HTTPS certificates from the system Certificate Store or Keychain." -msgstr "Neste sistema, %s usa certificados HTTPS da loja de certificados do sistema ou do Keychain." +msgid "" +"On this system, %s uses HTTPS certificates from the system Certificate Store " +"or Keychain." +msgstr "" +"Neste sistema, %s usa certificados HTTPS da loja de certificados do sistema " +"ou do Keychain." -msgid "To use a custom CA file, please import your CA file into Certificate Store / Keychain." -msgstr "Para usar um arquivo CA personalizado, importe seu arquivo CA para a loja de certificados / Keychain." +msgid "" +"To use a custom CA file, please import your CA file into Certificate Store / " +"Keychain." +msgstr "" +"Para usar um arquivo CA personalizado, importe seu arquivo CA para a loja de " +"certificados / Keychain." msgid "Login/Test" msgstr "Login/Teste" msgid "Connection to printers connected via the print host failed." -msgstr "A conexão às impressoras conectadas através do host de impressão falhou." +msgstr "" +"A conexão às impressoras conectadas através do host de impressão falhou." #, c-format, boost-format msgid "Mismatched type of print host: %s" @@ -12556,13 +15491,18 @@ msgid "Upload not enabled on FlashAir card." msgstr "Upload não ativado no cartão FlashAir." msgid "Connection to FlashAir works correctly and upload is enabled." -msgstr "A conexão com o FlashAir funciona corretamente e o upload está ativado." +msgstr "" +"A conexão com o FlashAir funciona corretamente e o upload está ativado." msgid "Could not connect to FlashAir" msgstr "Não foi possível conectar-se ao FlashAir" -msgid "Note: FlashAir with firmware 2.00.02 or newer and activated upload function is required." -msgstr "Nota: FlashAir com firmware 2.00.02 ou mais recente e função de upload ativada são necessárias." +msgid "" +"Note: FlashAir with firmware 2.00.02 or newer and activated upload function " +"is required." +msgstr "" +"Nota: FlashAir com firmware 2.00.02 ou mais recente e função de upload " +"ativada são necessárias." msgid "Connection to MKS works correctly." msgstr "A conexão com o MKS funciona corretamente." @@ -12652,6 +15592,175 @@ msgstr "" "Corpo da Mensagem: \"%1%\"\n" "Error: \"%2%\"" +msgid "" +"It has a small layer height, and results in almost negligible layer lines " +"and high printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has lower speeds " +"and acceleration, and the sparse infill pattern is Gyroid. So, it results in " +"much higher printing quality, but a much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a slightly " +"bigger layer height, and results in almost negligible layer lines, and " +"slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a bigger layer " +"height, and results in slightly visible layer lines, but shorter printing " +"time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"height, and results in almost invisible layer lines and higher printing " +"quality, but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost invisible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of 0.2 mm nozzle, it has a smaller layer " +"height, and results in minimal layer lines and higher printing quality, but " +"shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in minimal layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"It has a general layer height, and results in general layer lines and " +"printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in less apparent layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost negligible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and longer printing " +"time." +msgstr "" + +msgid "" +"It has a big layer height, and results in apparent layer lines and ordinary " +"printing quality and printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in much more apparent layer lines and much lower " +"printing quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and slight higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"It has a very big layer height, and results in very apparent layer lines, " +"low printing quality and general printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a bigger layer " +"height, and results in very apparent layer lines and much lower printing " +"quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a much bigger " +"layer height, and results in extremely apparent layer lines and much lower " +"printing quality, but much shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a slightly " +"smaller layer height, and results in slightly less but still apparent layer " +"lines and slightly higher printing quality, but longer printing time in some " +"printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a smaller layer " +"height, and results in less but still apparent layer lines and slightly " +"higher printing quality, but longer printing time in some printing cases." +msgstr "" + msgid "Connected to Obico successfully!" msgstr "Conectado ao Obico com sucesso!" @@ -12665,10 +15774,16 @@ msgid "Could not connect to SimplyPrint" msgstr "Não é possível conectar a SimplyPrint" msgid "SimplyPrint account not linked. Go to Connect options to set it up." -msgstr "Conta SimplyPrint não vinculada. Vá para as opções de conexão para configurá-la." +msgstr "" +"Conta SimplyPrint não vinculada. Vá para as opções de conexão para configurá-" +"la." -msgid "File size exceeds the 100MB upload limit. Please upload your file through the panel." -msgstr "O tamanho do arquivo excede o limite de envio de 100MB. Por favor, envie seu arquivo através do painel." +msgid "" +"File size exceeds the 100MB upload limit. Please upload your file through " +"the panel." +msgstr "" +"O tamanho do arquivo excede o limite de envio de 100MB. Por favor, envie seu " +"arquivo através do painel." msgid "Unknown error" msgstr "Erro desconhecido" @@ -12683,10 +15798,12 @@ msgid "The provided state is not correct." msgstr "O estado fornecido não está correto." msgid "Please give the required permissions when authorizing this application." -msgstr "Por favor, forneça as permissões necessárias ao autorizar este aplicativo." +msgstr "" +"Por favor, forneça as permissões necessárias ao autorizar este aplicativo." msgid "Something unexpected happened when trying to log in, please try again." -msgstr "Algo inesperado aconteceu ao tentar conectar, por favor tente novamente." +msgstr "" +"Algo inesperado aconteceu ao tentar conectar, por favor tente novamente." msgid "User cancelled." msgstr "O usuário cancelou." @@ -12694,18 +15811,24 @@ msgstr "O usuário cancelou." #: resources/data/hints.ini: [hint:Precise wall] msgid "" "Precise wall\n" -"Did you know that turning on precise wall can improve precision and layer consistency?" +"Did you know that turning on precise wall can improve precision and layer " +"consistency?" msgstr "" "Parede precisa\n" -"Você sabia que ativar o Perímetro Preciso pode melhorar a precisão e a consistência da camada?" +"Você sabia que ativar o Perímetro Preciso pode melhorar a precisão e a " +"consistência da camada?" #: resources/data/hints.ini: [hint:Sandwich mode] msgid "" "Sandwich mode\n" -"Did you know that you can use sandwich mode (inner-outer-inner) to improve precision and layer consistency if your model doesn't have very steep overhangs?" +"Did you know that you can use sandwich mode (inner-outer-inner) to improve " +"precision and layer consistency if your model doesn't have very steep " +"overhangs?" msgstr "" "Modo sanduíche\n" -"Você sabia que pode usar o modo sanduíche (interno-externo-interno) para melhorar a precisão e a consistência da camada se o seu modelo não tiver overhangs muito íngremes?" +"Você sabia que pode usar o modo sanduíche (interno-externo-interno) para " +"melhorar a precisão e a consistência da camada se o seu modelo não tiver " +"overhangs muito íngremes?" #: resources/data/hints.ini: [hint:Chamber temperature] msgid "" @@ -12718,10 +15841,12 @@ msgstr "" #: resources/data/hints.ini: [hint:Calibration] msgid "" "Calibration\n" -"Did you know that calibrating your printer can do wonders? Check out our beloved calibration solution in OrcaSlicer." +"Did you know that calibrating your printer can do wonders? Check out our " +"beloved calibration solution in OrcaSlicer." msgstr "" "Calibração\n" -"Você sabia que calibrar sua impressora pode fazer maravilhas? Confira nossa amada solução de calibração no OrcaSlicer." +"Você sabia que calibrar sua impressora pode fazer maravilhas? Confira nossa " +"amada solução de calibração no OrcaSlicer." #: resources/data/hints.ini: [hint:Auxiliary fan] msgid "" @@ -12729,7 +15854,8 @@ msgid "" "Did you know that OrcaSlicer supports Auxiliary part cooling fan?" msgstr "" "Ventilador auxiliar\n" -"Você sabia que o OrcaSlicer suporta ventilador auxiliar de resfriamento de peças?" +"Você sabia que o OrcaSlicer suporta ventilador auxiliar de resfriamento de " +"peças?" #: resources/data/hints.ini: [hint:Air filtration] msgid "" @@ -12750,42 +15876,52 @@ msgstr "" #: resources/data/hints.ini: [hint:Switch workspaces] msgid "" "Switch workspaces\n" -"You can switch between Prepare and Preview workspaces by pressing the Tab key." +"You can switch between Prepare and Preview workspaces by " +"pressing the Tab key." msgstr "" "Alternar espaços de trabalho\n" -"Você pode alternar entre os espaços de trabalho Preparar e Visualizar pressionando a tecla Tab." +"Você pode alternar entre os espaços de trabalho Preparar e " +"Visualizar pressionando a tecla Tab." #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" -"Did you know that Orca Slicer offers a wide range of keyboard shortcuts and 3D scene operations." +"Did you know that Orca Slicer offers a wide range of keyboard shortcuts and " +"3D scene operations." msgstr "" "Como usar atalhos de teclado\n" -"Você sabia que o Orca Slicer oferece uma ampla gama de atalhos de teclado e operações de cena 3D?" +"Você sabia que o Orca Slicer oferece uma ampla gama de atalhos de teclado e " +"operações de cena 3D?" #: resources/data/hints.ini: [hint:Reverse on odd] msgid "" "Reverse on odd\n" -"Did you know that Reverse on odd feature can significantly improve the surface quality of your overhangs?" +"Did you know that Reverse on odd feature can significantly improve " +"the surface quality of your overhangs?" msgstr "" "Inverter em ímpar\n" -"Você sabia que a função Inverter em ímpar pode melhorar significativamente a qualidade da superfície dos overhangs?" +"Você sabia que a função Inverter em ímpar pode melhorar " +"significativamente a qualidade da superfície dos overhangs?" #: resources/data/hints.ini: [hint:Cut Tool] msgid "" "Cut Tool\n" -"Did you know that you can cut a model at any angle and position with the cutting tool?" +"Did you know that you can cut a model at any angle and position with the " +"cutting tool?" msgstr "" "Ferramenta de corte\n" -"Você sabia que pode cortar um modelo em qualquer ângulo e posição com a ferramenta de corte?" +"Você sabia que pode cortar um modelo em qualquer ângulo e posição com a " +"ferramenta de corte?" #: resources/data/hints.ini: [hint:Fix Model] msgid "" "Fix Model\n" -"Did you know that you can fix a corrupted 3D model to avoid a lot of slicing problems on the Windows system?" +"Did you know that you can fix a corrupted 3D model to avoid a lot of slicing " +"problems on the Windows system?" msgstr "" "Corrigir Modelo\n" -"Você sabia que pode corrigir um modelo 3D corrompido para evitar muitos problemas de fatiamento no sistema Windows?" +"Você sabia que pode corrigir um modelo 3D corrompido para evitar muitos " +"problemas de fatiamento no sistema Windows?" #: resources/data/hints.ini: [hint:Timelapse] msgid "" @@ -12806,148 +15942,204 @@ msgstr "" #: resources/data/hints.ini: [hint:Auto-Orient] msgid "" "Auto-Orient\n" -"Did you know that you can rotate objects to an optimal orientation for printing by a simple click?" +"Did you know that you can rotate objects to an optimal orientation for " +"printing by a simple click?" msgstr "" "Auto-orientar\n" -"Você sabia que pode girar objetos para uma orientação ideal para impressão com um simples clique?" +"Você sabia que pode girar objetos para uma orientação ideal para impressão " +"com um simples clique?" #: resources/data/hints.ini: [hint:Lay on Face] msgid "" "Lay on Face\n" -"Did you know that you can quickly orient a model so that one of its faces sits on the print bed? Select the \"Place on face\" function or press the F key." +"Did you know that you can quickly orient a model so that one of its faces " +"sits on the print bed? Select the \"Place on face\" function or press the " +"F key." msgstr "" "Ajustar face à superfície\n" -"Você sabia que pode rapidamente orientar um modelo para que uma de suas faces fique sobre a base de impressão? Selecione a função \"Colocar na face\" ou pressione a tecla F." +"Você sabia que pode rapidamente orientar um modelo para que uma de suas " +"faces fique sobre a base de impressão? Selecione a função \"Colocar na face" +"\" ou pressione a tecla F." #: resources/data/hints.ini: [hint:Object List] msgid "" "Object List\n" -"Did you know that you can view all objects/parts in a list and change settings for each object/part?" +"Did you know that you can view all objects/parts in a list and change " +"settings for each object/part?" msgstr "" "Lista de Objetos\n" -"Você sabia que pode visualizar todos os objetos/peças em uma lista e alterar as configurações para cada objeto/peça?" +"Você sabia que pode visualizar todos os objetos/peças em uma lista e alterar " +"as configurações para cada objeto/peça?" #: resources/data/hints.ini: [hint:Search Functionality] msgid "" "Search Functionality\n" -"Did you know that you use the Search tool to quickly find a specific Orca Slicer setting?" +"Did you know that you use the Search tool to quickly find a specific Orca " +"Slicer setting?" msgstr "" "Funcionalidade de Busca\n" -"Você sabia que pode usar a ferramenta de busca para encontrar rapidamente uma configuração específica do Orca Slicer?" +"Você sabia que pode usar a ferramenta de busca para encontrar rapidamente " +"uma configuração específica do Orca Slicer?" #: resources/data/hints.ini: [hint:Simplify Model] msgid "" "Simplify Model\n" -"Did you know that you can reduce the number of triangles in a mesh using the Simplify mesh feature? Right-click the model and select Simplify model." +"Did you know that you can reduce the number of triangles in a mesh using the " +"Simplify mesh feature? Right-click the model and select Simplify model." msgstr "" "Simplificar Modelo\n" -"Você sabia que pode reduzir o número de triângulos em uma malha usando a função Simplificar malha? Clique com o botão direito no modelo e selecione Simplificar modelo." +"Você sabia que pode reduzir o número de triângulos em uma malha usando a " +"função Simplificar malha? Clique com o botão direito no modelo e selecione " +"Simplificar modelo." #: resources/data/hints.ini: [hint:Slicing Parameter Table] msgid "" "Slicing Parameter Table\n" -"Did you know that you can view all objects/parts on a table and change settings for each object/part?" +"Did you know that you can view all objects/parts on a table and change " +"settings for each object/part?" msgstr "" "Tabela de Parâmetros de Fatiamento\n" -"Você sabia que pode visualizar todos os objetos/peças em uma tabela e alterar as configurações para cada objeto/peça?" +"Você sabia que pode visualizar todos os objetos/peças em uma tabela e " +"alterar as configurações para cada objeto/peça?" #: resources/data/hints.ini: [hint:Split to Objects/Parts] msgid "" "Split to Objects/Parts\n" -"Did you know that you can split a big object into small ones for easy colorizing or printing?" +"Did you know that you can split a big object into small ones for easy " +"colorizing or printing?" msgstr "" "Dividir em Objetos/Peças\n" -"Você sabia que pode dividir um objeto grande em peças menores para facilitar a colorização ou a impressão?" +"Você sabia que pode dividir um objeto grande em peças menores para facilitar " +"a colorização ou a impressão?" #: resources/data/hints.ini: [hint:Subtract a Part] msgid "" "Subtract a Part\n" -"Did you know that you can subtract one mesh from another using the Negative part modifier? That way you can, for example, create easily resizable holes directly in Orca Slicer." +"Did you know that you can subtract one mesh from another using the Negative " +"part modifier? That way you can, for example, create easily resizable holes " +"directly in Orca Slicer." msgstr "" "Subtrair uma Peça\n" -"Você sabia que pode subtrair uma malha da outra usando o modificador de peça negativa? Dessa forma, você pode, por exemplo, criar facilmente furos redimensionáveis diretamente no Orca Slicer." +"Você sabia que pode subtrair uma malha da outra usando o modificador de peça " +"negativa? Dessa forma, você pode, por exemplo, criar facilmente furos " +"redimensionáveis diretamente no Orca Slicer." #: resources/data/hints.ini: [hint:STEP] msgid "" "STEP\n" -"Did you know that you can improve your print quality by slicing a STEP file instead of an STL?\n" -"Orca Slicer supports slicing STEP files, providing smoother results than a lower resolution STL. Give it a try!" +"Did you know that you can improve your print quality by slicing a STEP file " +"instead of an STL?\n" +"Orca Slicer supports slicing STEP files, providing smoother results than a " +"lower resolution STL. Give it a try!" msgstr "" "STEP\n" -"Você sabia que pode melhorar a qualidade da impressão fatiando um arquivo STEP ao invés de um STL?\n" -"Orca Slicer é compatível com arquivos STEP, gerando resultados mais suaves do que um STL em baixa resolução. Tente!" +"Você sabia que pode melhorar a qualidade da impressão fatiando um arquivo " +"STEP ao invés de um STL?\n" +"Orca Slicer é compatível com arquivos STEP, gerando resultados mais suaves " +"do que um STL em baixa resolução. Tente!" #: resources/data/hints.ini: [hint:Z seam location] msgid "" "Z seam location\n" -"Did you know that you can customize the location of the Z seam, and even paint it on your print, to have it in a less visible location? This improves the overall look of your model. Check it out!" +"Did you know that you can customize the location of the Z seam, and even " +"paint it on your print, to have it in a less visible location? This improves " +"the overall look of your model. Check it out!" msgstr "" "Local da costura\n" -"Você sabia que pode customizar a posição da costura, e até mesmo pintá-la na sua peça, para tê-la em um lugar menos visível? Isso vai aumentar a qualidade geral do seu modelo. Tente!" +"Você sabia que pode customizar a posição da costura, e até mesmo pintá-la na " +"sua peça, para tê-la em um lugar menos visível? Isso vai aumentar a " +"qualidade geral do seu modelo. Tente!" #: resources/data/hints.ini: [hint:Fine-tuning for flow rate] msgid "" "Fine-tuning for flow rate\n" -"Did you know that flow rate can be fine-tuned for even better-looking prints? Depending on the material, you can improve the overall finish of the printed model by doing some fine-tuning." +"Did you know that flow rate can be fine-tuned for even better-looking " +"prints? Depending on the material, you can improve the overall finish of the " +"printed model by doing some fine-tuning." msgstr "" "Ajuste fino do fluxo\n" -"Você sabia que o fluxo pode ser ajustado para impressões ainda melhores? Dependendo do material, você pode melhorar o acabamento final da sua peça fazendo alguns ajustes." +"Você sabia que o fluxo pode ser ajustado para impressões ainda melhores? " +"Dependendo do material, você pode melhorar o acabamento final da sua peça " +"fazendo alguns ajustes." #: resources/data/hints.ini: [hint:Split your prints into plates] msgid "" "Split your prints into plates\n" -"Did you know that you can split a model that has a lot of parts into individual plates ready to print? This will simplify the process of keeping track of all the parts." +"Did you know that you can split a model that has a lot of parts into " +"individual plates ready to print? This will simplify the process of keeping " +"track of all the parts." msgstr "" "Divida suas impressões em mesas\n" -"Você sabia que pode dividir um modelo que tem diversas peças individuais em mesas distintas prontas para imprimir? Isso vai simplificar o processo e o avanço das impressões." +"Você sabia que pode dividir um modelo que tem diversas peças individuais em " +"mesas distintas prontas para imprimir? Isso vai simplificar o processo e o " +"avanço das impressões." -#: resources/data/hints.ini: [hint:Speed up your print with Adaptive Layer Height] +#: resources/data/hints.ini: [hint:Speed up your print with Adaptive Layer +#: Height] msgid "" "Speed up your print with Adaptive Layer Height\n" -"Did you know that you can print a model even faster, by using the Adaptive Layer Height option? Check it out!" +"Did you know that you can print a model even faster, by using the Adaptive " +"Layer Height option? Check it out!" msgstr "" "Agilize sua impressão com a Altura de Camada Adaptativa\n" -"Você sabia que pode imprimir um modelo ainda mais rápido, usando a opção de Altura de Camada Adaptativa? Tente!" +"Você sabia que pode imprimir um modelo ainda mais rápido, usando a opção de " +"Altura de Camada Adaptativa? Tente!" #: resources/data/hints.ini: [hint:Support painting] msgid "" "Support painting\n" -"Did you know that you can paint the location of your supports? This feature makes it easy to place the support material only on the sections of the model that actually need it." +"Did you know that you can paint the location of your supports? This feature " +"makes it easy to place the support material only on the sections of the " +"model that actually need it." msgstr "" "Pintura de suporte\n" -"Você sabia que pode pintar a localização dos seus suportes? Essa funcionalidade facilita colocar o material de suporte apenas nas seções do modelo que realmente precisam." +"Você sabia que pode pintar a localização dos seus suportes? Essa " +"funcionalidade facilita colocar o material de suporte apenas nas seções do " +"modelo que realmente precisam." #: resources/data/hints.ini: [hint:Different types of supports] msgid "" "Different types of supports\n" -"Did you know that you can choose from multiple types of supports? Tree supports work great for organic models, while saving filament and improving print speed. Check them out!" +"Did you know that you can choose from multiple types of supports? Tree " +"supports work great for organic models, while saving filament and improving " +"print speed. Check them out!" msgstr "" "Diferentes tipos de suportes\n" -"Você sabia que pode escolher entre vários tipos de suportes? Os suportes de árvore funcionam muito bem para modelos orgânicos, enquanto economizam filamento e melhoram a velocidade de impressão. Confira-os!" +"Você sabia que pode escolher entre vários tipos de suportes? Os suportes de " +"árvore funcionam muito bem para modelos orgânicos, enquanto economizam " +"filamento e melhoram a velocidade de impressão. Confira-os!" #: resources/data/hints.ini: [hint:Printing Silk Filament] msgid "" "Printing Silk Filament\n" -"Did you know that Silk filament needs special consideration to print it successfully? Higher temperature and lower speed are always recommended for the best results." +"Did you know that Silk filament needs special consideration to print it " +"successfully? Higher temperature and lower speed are always recommended for " +"the best results." msgstr "" "Impressão de Filamento de Seda\n" -"Você sabia que o filamento de seda precisa de considerações especiais para ser impresso com sucesso? Uma temperatura mais alta e uma velocidade mais baixa são sempre recomendadas para obter os melhores resultados." +"Você sabia que o filamento de seda precisa de considerações especiais para " +"ser impresso com sucesso? Uma temperatura mais alta e uma velocidade mais " +"baixa são sempre recomendadas para obter os melhores resultados." #: resources/data/hints.ini: [hint:Brim for better adhesion] msgid "" "Brim for better adhesion\n" -"Did you know that when printing models have a small contact interface with the printing surface, it's recommended to use a brim?" +"Did you know that when printing models have a small contact interface with " +"the printing surface, it's recommended to use a brim?" msgstr "" "Borda para melhor adesão\n" -"Você sabia que, ao imprimir modelos com uma pequena interface de contato com a superfície de impressão, é recomendável usar uma borda?" +"Você sabia que, ao imprimir modelos com uma pequena interface de contato com " +"a superfície de impressão, é recomendável usar uma borda?" #: resources/data/hints.ini: [hint:Set parameters for multiple objects] msgid "" "Set parameters for multiple objects\n" -"Did you know that you can set slicing parameters for all selected objects at one time?" +"Did you know that you can set slicing parameters for all selected objects at " +"one time?" msgstr "" "Definir parâmetros para vários objetos\n" -"Você sabia que pode definir parâmetros de fatiamento para todos os objetos selecionados de uma só vez?" +"Você sabia que pode definir parâmetros de fatiamento para todos os objetos " +"selecionados de uma só vez?" #: resources/data/hints.ini: [hint:Stack objects] msgid "" @@ -12960,31 +16152,109 @@ msgstr "" #: resources/data/hints.ini: [hint:Flush into support/objects/infill] msgid "" "Flush into support/objects/infill\n" -"Did you know that you can save the wasted filament by flushing them into support/objects/infill during filament change?" +"Did you know that you can save the wasted filament by flushing them into " +"support/objects/infill during filament change?" msgstr "" "Purga no suporte/objetos/preenchimento\n" -"Você sabia que pode economizar o filamento desperdiçado ao purgar nos suportes/objetos/preenchimento durante a troca de filamento?" +"Você sabia que pode economizar o filamento desperdiçado ao purgar nos " +"suportes/objetos/preenchimento durante a troca de filamento?" #: resources/data/hints.ini: [hint:Improve strength] msgid "" "Improve strength\n" -"Did you know that you can use more wall loops and higher sparse infill density to improve the strength of the model?" +"Did you know that you can use more wall loops and higher sparse infill " +"density to improve the strength of the model?" msgstr "" "Melhorar a resistência\n" -"Você sabia que pode usar mais loops de perímetro e densidade de preenchimento não sólido mais alta para melhorar a resistência do modelo?" +"Você sabia que pode usar mais loops de perímetro e densidade de " +"preenchimento não sólido mais alta para melhorar a resistência do modelo?" -#: resources/data/hints.ini: [hint:When need to print with the printer door opened] +#: resources/data/hints.ini: [hint:When need to print with the printer door +#: opened] msgid "" "When need to print with the printer door opened\n" -"Did you know that opening the printer door can reduce the probability of extruder/hotend clogging when printing lower temperature filament with a higher enclosure temperature. More info about this in the Wiki." +"Did you know that opening the printer door can reduce the probability of " +"extruder/hotend clogging when printing lower temperature filament with a " +"higher enclosure temperature. More info about this in the Wiki." msgstr "" "Quando é necessário imprimir com a porta da impressora aberta\n" -"Você sabia que abrir a porta da impressora pode reduzir a probabilidade de entupimento do extrusor/bico aquecido ao imprimir filamento de temperatura mais baixa com uma temperatura de invólucro mais alta. Mais informações sobre isso na Wiki." +"Você sabia que abrir a porta da impressora pode reduzir a probabilidade de " +"entupimento do extrusor/bico aquecido ao imprimir filamento de temperatura " +"mais baixa com uma temperatura de invólucro mais alta. Mais informações " +"sobre isso na Wiki." #: resources/data/hints.ini: [hint:Avoid warping] msgid "" "Avoid warping\n" -"Did you know that when printing materials that are prone to warping such as ABS, appropriately increasing the heatbed temperature can reduce the probability of warping." +"Did you know that when printing materials that are prone to warping such as " +"ABS, appropriately increasing the heatbed temperature can reduce the " +"probability of warping." msgstr "" "Evitar empenamento\n" -"Você sabia que ao imprimir materiais propensos ao empenamento, como ABS, aumentar adequadamente a temperatura da mesa aquecida pode reduzir a probabilidade de empenamento?" +"Você sabia que ao imprimir materiais propensos ao empenamento, como ABS, " +"aumentar adequadamente a temperatura da mesa aquecida pode reduzir a " +"probabilidade de empenamento?" + +#~ msgid "Unload Filament" +#~ msgstr "Descarregar Filamento" + +#~ msgid "MC" +#~ msgstr "MC" + +#~ msgid "MainBoard" +#~ msgstr "Placa principal" + +#~ msgid "TH" +#~ msgstr "TH" + +#~ msgid "XCam" +#~ msgstr "XCam" + +#~ msgid "" +#~ "Over 4 studio/handy are using remote access, you can close some and try " +#~ "again." +#~ msgstr "" +#~ "Mais de 4 estúdio/prático estão usando o acesso remoto, você pode fechar " +#~ "alguns e tentar novamente." + +#~ msgid "HMS" +#~ msgstr "HMS" + +#~ msgid "" +#~ "The 3mf file version is in Beta and it is newer than the current Bambu " +#~ "Studio version." +#~ msgstr "" +#~ "A versão do arquivo 3mf está em Beta e é mais recente que a versão atual " +#~ "do Bambu Studio." + +#~ msgid "If you would like to try Bambu Studio Beta, you may click to" +#~ msgstr "Se você gostaria de testar o Bambu Studio Beta, clique para" + +#~ msgid "The 3mf file version is newer than the current Bambu Studio version." +#~ msgstr "" +#~ "A versão do arquivo 3mf é mais recente que a versão atual do Bambu Studio." + +#~ msgid "" +#~ "Update your Bambu Studio could enable all functionality in the 3mf file." +#~ msgstr "" +#~ "Atualizar seu Bambu Studio pode habilitar todas as funcionalidades do " +#~ "arquivo 3mf." + +#~ msgid "" +#~ "Importing to Orca Slicer failed. Please download the file and manually " +#~ "import it." +#~ msgstr "" +#~ "A importação para o Orca Slicer falhou. Por favor, baixe o arquivo e " +#~ "importe manualmente." + +#~ msgid "- ℃" +#~ msgstr "- °C" + +#~ msgid "0.5" +#~ msgstr "0.5" + +#~ msgid "0.005" +#~ msgstr "0.005" + +#~ msgid "New Flow Dynamics Calibration" +#~ msgstr "Nova Calibração de Dinâmica de Fluxo" diff --git a/localization/i18n/ru/OrcaSlicer_ru.po b/localization/i18n/ru/OrcaSlicer_ru.po index 2972ffa94e..fc84a34c0e 100644 --- a/localization/i18n/ru/OrcaSlicer_ru.po +++ b/localization/i18n/ru/OrcaSlicer_ru.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: OrcaSlicer V2.0.0 Official Release\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-16 16:45+0200\n" +"POT-Creation-Date: 2024-04-28 18:11+0800\n" "PO-Revision-Date: 2024-04-12 13:49+0700\n" "Last-Translator: \n" "Language-Team: andylg@yandex.ru\n" @@ -15,8 +15,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" "X-Generator: Poedit 3.4.2\n" msgid "Supports Painting" @@ -2426,11 +2426,11 @@ msgstr "Дозаправка" msgid "AMS not connected" msgstr "АСПП не подключена" -msgid "Load Filament" -msgstr "Загрузить" +msgid "Load" +msgstr "" -msgid "Unload Filament" -msgstr "Выгрузить" +msgid "Unload" +msgstr "Выгруз." msgid "Ext Spool" msgstr "Внеш. катушка" @@ -2447,7 +2447,7 @@ msgstr "Повтор" msgid "Calibrating AMS..." msgstr "Калибровка АСПП..." -msgid "A problem occured during calibration. Click to view the solution." +msgid "A problem occurred during calibration. Click to view the solution." msgstr "" "Во время калибровки возникла проблема. Нажмите, чтобы просмотреть решение." @@ -2489,10 +2489,8 @@ msgstr "Загрузка нового прутка" msgid "" "Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically " -"load or unload filiament." +"load or unload filaments." msgstr "" -"Выберите слот АСПП, затем нажмите кнопку «Загрузить» или «Выгрузить» для " -"автоматической загрузки или выгрузки прутка." msgid "Edit" msgstr "Правка" @@ -3124,6 +3122,14 @@ msgstr "" "АСПП автоматически переключится на другую катушку с тем же типом материала, " "когда текущий закончится." +msgid "Air Printing Detection" +msgstr "" + +msgid "" +"Detects clogging and filament grinding, halting printing immediately to " +"conserve time and filament." +msgstr "" + msgid "File" msgstr "Файл" @@ -3599,18 +3605,6 @@ msgstr "Пауза при ошибке на первом слое" msgid "Nozzle clog pause" msgstr "Пауза при засорении сопла" -msgid "MC" -msgstr "Плата управления" - -msgid "MainBoard" -msgstr "Материнская плата" - -msgid "TH" -msgstr "TH" - -msgid "XCam" -msgstr "XCam" - msgid "Unknown" msgstr "Неизвестно" @@ -4148,7 +4142,7 @@ msgstr "Объём:" msgid "Size:" msgstr "Размер:" -#, boost-format +#, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -4291,6 +4285,9 @@ msgstr "Предпросмотр нарезки" msgid "Device" msgstr "Принтер" +msgid "Multi-device" +msgstr "" + msgid "Project" msgstr "Проект" @@ -4330,6 +4327,9 @@ msgstr "Распечатать все столы" msgid "Send all" msgstr "Отправить G-код всех столов на SD-карту" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "Горячие клавиши" @@ -5127,9 +5127,6 @@ msgstr "Выдув" msgid "Bed" msgstr "Стол" -msgid "Unload" -msgstr "Выгруз." - msgid "Debug Info" msgstr "Отладочная информация" @@ -5318,9 +5315,6 @@ msgstr "Статус" msgid "Update" msgstr "Обновление" -msgid "HMS" -msgstr "Здоровье принтера" - msgid "Don't show again" msgstr "Больше не показывать" @@ -5568,6 +5562,12 @@ msgstr "Разрешить звуковые уведомления" msgid "Filament Tangle Detect" msgstr "Обнаружение запутывания прутка" +msgid "Nozzle Clumping Detection" +msgstr "" + +msgid "Check if the nozzle is clumping by filament or other foreign objects." +msgstr "" + msgid "Nozzle Type" msgstr "" @@ -6030,19 +6030,23 @@ msgstr "Импортирование модели" msgid "prepare 3mf file..." msgstr "подготовка 3mf файла..." +msgid "Download failed, unknown file format." +msgstr "" + msgid "downloading project ..." msgstr "скачивание проекта..." +msgid "Download failed, File size exception." +msgstr "" + #, c-format, boost-format msgid "Project downloaded %d%%" msgstr "Проект загружен %d%%" msgid "" -"Importing to Orca Slicer failed. Please download the file and manually " +"Importing to Bambu Studio failed. Please download the file and manually " "import it." msgstr "" -"Не удалось импортировать в Orca Slicer. Загрузите файл и импортируйте его " -"вручную." msgid "Import SLA archive" msgstr "Импорт SLA архива" @@ -6317,6 +6321,21 @@ msgstr "" "Единицы \n" "измерения" +msgid "Allow only one OrcaSlicer instance" +msgstr "" + +msgid "" +"On OSX there is always only one instance of app running by default. However " +"it is allowed to run multiple instances of same app from the command line. " +"In such case this settings will allow only one instance." +msgstr "" + +msgid "" +"If this is enabled, when starting OrcaSlicer and another instance of the " +"same OrcaSlicer is already running, that instance will be reactivated " +"instead." +msgstr "" + msgid "Home" msgstr "Домашняя страница" @@ -6401,6 +6420,14 @@ msgid "" "each printer automatically." msgstr "" +msgid "Multi-device Management(Take effect after restarting Studio)." +msgstr "" + +msgid "" +"With this option enabled, you can send a task to multiple devices at the " +"same time and manage multiple devices." +msgstr "" + msgid "Network" msgstr "Сеть" @@ -7057,6 +7084,9 @@ msgstr "Автокалибровка потока с помощью микрол msgid "Modifying the device name" msgstr "Изменение имени принтера" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "Отправить на SD-карту принтера" @@ -7108,6 +7138,26 @@ msgstr "Таймаут получения отчета о входе" msgid "Unknown Failure" msgstr "Неизвестная ошибка" +msgid "" +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." +msgstr "" + +msgid "Can't find Pin Code?" +msgstr "" + +msgid "Pin Code" +msgstr "" + +msgid "Binding..." +msgstr "" + +msgid "Please confirm on the printer screen" +msgstr "" + +msgid "Log in failed. Please check the Pin Code." +msgstr "" + msgid "Log in printer" msgstr "Войти в принтер" @@ -7131,8 +7181,8 @@ msgid "" "Bambu Lab Privacy Policy, please do not use Bambu Lab equipment and services." msgstr "" "Перед использованием устройства Bambu Lab ознакомьтесь с правилами и " -"условиями. Нажимая на кнопку \"Согласие на использование устройства Bambu " -"Lab\", вы соглашаетесь соблюдать Политику конфиденциальности и Условия " +"условиями. Нажимая на кнопку \"Согласие на использование устройства Bambu Lab" +"\", вы соглашаетесь соблюдать Политику конфиденциальности и Условия " "использования (далее - \"Условия\"). Если вы не соблюдаете или не согласны с " "Политикой конфиденциальности Bambu Lab, пожалуйста, не пользуйтесь " "оборудованием и услугами Bambu Lab." @@ -7327,8 +7377,8 @@ msgstr "" msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "При записи таймлапса без видимости головы рекомендуется добавить «Черновая " "башня таймлапса». \n" @@ -8375,6 +8425,39 @@ msgstr "Готово" msgid "resume" msgstr "" +msgid "Resume Printing" +msgstr "" + +msgid "Resume Printing(defects acceptable)" +msgstr "" + +msgid "Resume Printing(problem solved)" +msgstr "" + +msgid "Stop Printing" +msgstr "" + +msgid "Check Assistant" +msgstr "" + +msgid "Filament Extruded, Continue" +msgstr "" + +msgid "Not Extruded Yet, Retry" +msgstr "" + +msgid "Finished, Continue" +msgstr "" + +msgid "Load Filament" +msgstr "Загрузить" + +msgid "Filament Loaded, Resume" +msgstr "" + +msgid "View Liveview" +msgstr "" + msgid "Confirm and Update Nozzle" msgstr "Подтвердить и обновить сопло" @@ -10698,6 +10781,9 @@ msgstr "Динам. куб. поддержка" msgid "Lightning" msgstr "Молния" +msgid "Cross Hatch" +msgstr "" + msgid "Sparse infill anchor length" msgstr "Длина привязок разреженного заполнения" @@ -10752,8 +10838,8 @@ msgstr "" "две ближайшие линии заполнения с коротким отрезком периметра. Если не " "найдено такого отрезка периметра короче этого параметра, линия заполнения " "соединяется с отрезком периметра только с одной стороны, а длина отрезка " -"периметра ограничена значением «Длина привязок разреженного заполнения» " -"(infill_anchor), но не больше этого параметра.\n" +"периметра ограничена значением «Длина привязок разреженного " +"заполнения» (infill_anchor), но не больше этого параметра.\n" "Если установить 0, то будет использоваться старый алгоритм для соединения " "заполнения, который даёт такой же результат, как и при значениях 1000 и 0." @@ -10908,17 +10994,17 @@ msgstr "Полная скорость вентилятора на слое" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" "Скорость вентилятора будет нарастать линейно от нуля на слое " -"\"close_fan_the_first_x_layers\" до максимума на слое " -"\"full_fan_speed_layer\". Значение \"full_fan_speed_layer\" будет " -"игнорироваться, если оно меньше значения \"close_fan_the_first_x_layers\", в " -"этом случае вентилятор будет работать на максимально допустимой скорости на " -"слое \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" до максимума на слое \"full_fan_speed_layer" +"\". Значение \"full_fan_speed_layer\" будет игнорироваться, если оно меньше " +"значения \"close_fan_the_first_x_layers\", в этом случае вентилятор будет " +"работать на максимально допустимой скорости на слое " +"\"close_fan_the_first_x_layers\" + 1." msgid "Support interface fan speed" msgstr "Скорость вентилятора на связующем слое" @@ -13921,6 +14007,9 @@ msgstr "Отменено" msgid "load_obj: failed to parse" msgstr "load_obj: ошибка обработки" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "Файл содержит многоугольники с более чем 4 вершинами." @@ -14047,6 +14136,14 @@ msgstr "Пожалуйста, выберите пруток для калибр msgid "The input value size must be 3." msgstr "Размер входного значения должен быть равен 3." +msgid "" +"This machine type can only hold 16 history results per nozzle. You can " +"delete the existing historical results and then start calibration. Or you " +"can continue the calibration, but you cannot create new calibration " +"historical results. \n" +"Do you still want to continue the calibration?" +msgstr "" + msgid "Connecting to printer..." msgstr "Подключение к принтеру..." @@ -14056,6 +14153,19 @@ msgstr "Результат неудачного теста был удалён." msgid "Flow Dynamics Calibration result has been saved to the printer" msgstr "Результат калибровки динамики потока был сохранён на принтере" +#, c-format, boost-format +msgid "" +"There is already a historical calibration result with the same name: %s. " +"Only one of the results with the same name is saved. Are you sure you want " +"to override the historical result?" +msgstr "" + +#, c-format, boost-format +msgid "" +"This machine type can only hold %d history results per nozzle. This result " +"will not be saved." +msgstr "" + msgid "Internal Error" msgstr "Внутренняя ошибка" @@ -14363,9 +14473,6 @@ msgstr "" msgid "Printing Parameters" msgstr "Параметры печати" -msgid "- ℃" -msgstr "- ℃" - msgid "Plate Type" msgstr "Типа печатной пластины" @@ -14413,12 +14520,6 @@ msgstr "Конечный коэф. K" msgid "Step value" msgstr "Шаг" -msgid "0.5" -msgstr "0.5" - -msgid "0.005" -msgstr "0.005" - msgid "The nozzle diameter has been synchronized from the printer Settings" msgstr "Диаметр сопла был синхронизирован с настройками принтера" @@ -14446,10 +14547,14 @@ msgstr "Обновление записей истории калибровки msgid "Action" msgstr "Действие" +#, c-format, boost-format +msgid "This machine type can only hold %d history results per nozzle." +msgstr "" + msgid "Edit Flow Dynamics Calibration" msgstr "Редактировать калибровку динамики потока" -msgid "New Flow Dynamics Calibration" +msgid "New Flow Dynamic Calibration" msgstr "" msgid "Ok" @@ -14458,13 +14563,6 @@ msgstr "" msgid "The filament must be selected." msgstr "" -#, c-format, boost-format -msgid "" -"There is already a historical calibration result with the same name: %s. " -"Only one of the results with the same name is saved. Are you sure you want " -"to override the historical result?" -msgstr "" - msgid "Network lookup" msgstr "Поиск по сети" @@ -14874,8 +14972,8 @@ msgstr "" "Хотите перезаписать его?" msgid "" -"We would rename the presets as \"Vendor Type Serial @printer you " -"selected\". \n" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" "To add preset for more printers, Please go to printer selection" msgstr "" "Мы переименуем профиль в \"Производитель Тип Серия @выбранный принтер\".\n" @@ -15485,6 +15583,175 @@ msgstr "" "Текст сообщения: \"%1%\"\n" "Ошибка: \"%2%\"" +msgid "" +"It has a small layer height, and results in almost negligible layer lines " +"and high printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has lower speeds " +"and acceleration, and the sparse infill pattern is Gyroid. So, it results in " +"much higher printing quality, but a much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a slightly " +"bigger layer height, and results in almost negligible layer lines, and " +"slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a bigger layer " +"height, and results in slightly visible layer lines, but shorter printing " +"time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"height, and results in almost invisible layer lines and higher printing " +"quality, but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost invisible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of 0.2 mm nozzle, it has a smaller layer " +"height, and results in minimal layer lines and higher printing quality, but " +"shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in minimal layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"It has a general layer height, and results in general layer lines and " +"printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in less apparent layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost negligible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and longer printing " +"time." +msgstr "" + +msgid "" +"It has a big layer height, and results in apparent layer lines and ordinary " +"printing quality and printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in much more apparent layer lines and much lower " +"printing quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and slight higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"It has a very big layer height, and results in very apparent layer lines, " +"low printing quality and general printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a bigger layer " +"height, and results in very apparent layer lines and much lower printing " +"quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a much bigger " +"layer height, and results in extremely apparent layer lines and much lower " +"printing quality, but much shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a slightly " +"smaller layer height, and results in slightly less but still apparent layer " +"lines and slightly higher printing quality, but longer printing time in some " +"printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a smaller layer " +"height, and results in less but still apparent layer lines and slightly " +"higher printing quality, but longer printing time in some printing cases." +msgstr "" + msgid "Connected to Obico successfully!" msgstr "Соединение с Obico успешно установлено." @@ -15921,6 +16188,47 @@ msgstr "" "ABS, повышение температуры подогреваемого стола может снизить эту " "вероятность?" +#~ msgid "Unload Filament" +#~ msgstr "Выгрузить" + +#~ msgid "" +#~ "Choose an AMS slot then press \"Load\" or \"Unload\" button to " +#~ "automatically load or unload filiament." +#~ msgstr "" +#~ "Выберите слот АСПП, затем нажмите кнопку «Загрузить» или «Выгрузить» для " +#~ "автоматической загрузки или выгрузки прутка." + +#~ msgid "MC" +#~ msgstr "Плата управления" + +#~ msgid "MainBoard" +#~ msgstr "Материнская плата" + +#~ msgid "TH" +#~ msgstr "TH" + +#~ msgid "XCam" +#~ msgstr "XCam" + +#~ msgid "HMS" +#~ msgstr "Здоровье принтера" + +#~ msgid "" +#~ "Importing to Orca Slicer failed. Please download the file and manually " +#~ "import it." +#~ msgstr "" +#~ "Не удалось импортировать в Orca Slicer. Загрузите файл и импортируйте его " +#~ "вручную." + +#~ msgid "- ℃" +#~ msgstr "- ℃" + +#~ msgid "0.5" +#~ msgstr "0.5" + +#~ msgid "0.005" +#~ msgstr "0.005" + #~ msgid "active" #~ msgstr "активный" diff --git a/localization/i18n/sv/OrcaSlicer_sv.po b/localization/i18n/sv/OrcaSlicer_sv.po index c1589dbf8f..4598ec5a19 100644 --- a/localization/i18n/sv/OrcaSlicer_sv.po +++ b/localization/i18n/sv/OrcaSlicer_sv.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-16 16:45+0200\n" +"POT-Creation-Date: 2024-04-28 18:11+0800\n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -2354,10 +2354,10 @@ msgstr "" msgid "AMS not connected" msgstr "AMS ej ansluten" -msgid "Load Filament" -msgstr "Ladda Filament" +msgid "Load" +msgstr "" -msgid "Unload Filament" +msgid "Unload" msgstr "Mata ut" msgid "Ext Spool" @@ -2375,7 +2375,7 @@ msgstr "Försök igen" msgid "Calibrating AMS..." msgstr "Kalibrerar AMS..." -msgid "A problem occured during calibration. Click to view the solution." +msgid "A problem occurred during calibration. Click to view the solution." msgstr "Ett problem uppstod vid kalibrering. Tryck för att se åtgärd." msgid "Calibrate again" @@ -2416,10 +2416,8 @@ msgstr "Ta ett nytt filament" msgid "" "Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically " -"load or unload filiament." +"load or unload filaments." msgstr "" -"Välj ett AMS fack tryck sedan \"Ladda eller \"Mata ur\" knappen för att " -"automatiskt mata eller mata ut filament." msgid "Edit" msgstr "Redigera" @@ -3027,6 +3025,14 @@ msgstr "" "AMS fortsätter automatiskt till en annan spole med samma filament egenskaper " "när det aktuella filamentet tar slut." +msgid "Air Printing Detection" +msgstr "" + +msgid "" +"Detects clogging and filament grinding, halting printing immediately to " +"conserve time and filament." +msgstr "" + msgid "File" msgstr "Fil" @@ -3474,18 +3480,6 @@ msgstr "" msgid "Nozzle clog pause" msgstr "" -msgid "MC" -msgstr "MC" - -msgid "MainBoard" -msgstr "Moderkort" - -msgid "TH" -msgstr "TH" - -msgid "XCam" -msgstr "X Kamera" - msgid "Unknown" msgstr "Okänd" @@ -4008,7 +4002,7 @@ msgstr "Volym:" msgid "Size:" msgstr "Storlek:" -#, boost-format +#, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -4147,6 +4141,9 @@ msgstr "Förhandsvisning" msgid "Device" msgstr "Enhet" +msgid "Multi-device" +msgstr "" + msgid "Project" msgstr "Projekt" @@ -4186,6 +4183,9 @@ msgstr "Skriv ut allt" msgid "Send all" msgstr "Skicka alla" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "Kortkommando" @@ -4961,9 +4961,6 @@ msgstr "Kammare" msgid "Bed" msgstr "Byggplattan" -msgid "Unload" -msgstr "Mata ut" - msgid "Debug Info" msgstr "Felsöknings Information" @@ -5133,9 +5130,6 @@ msgstr "Status" msgid "Update" msgstr "Uppdatera" -msgid "HMS" -msgstr "HMS" - msgid "Don't show again" msgstr "Visa inte igen" @@ -5380,6 +5374,12 @@ msgstr "" msgid "Filament Tangle Detect" msgstr "" +msgid "Nozzle Clumping Detection" +msgstr "" + +msgid "Check if the nozzle is clumping by filament or other foreign objects." +msgstr "" + msgid "Nozzle Type" msgstr "" @@ -5822,15 +5822,21 @@ msgstr "Importerar Modell" msgid "prepare 3mf file..." msgstr "förbereder 3mf-filen..." +msgid "Download failed, unknown file format." +msgstr "" + msgid "downloading project ..." msgstr "laddar ner projekt ..." +msgid "Download failed, File size exception." +msgstr "" + #, c-format, boost-format msgid "Project downloaded %d%%" msgstr "Projektet har laddats ned %d%%" msgid "" -"Importing to Orca Slicer failed. Please download the file and manually " +"Importing to Bambu Studio failed. Please download the file and manually " "import it." msgstr "" @@ -6095,6 +6101,21 @@ msgstr "Brittisk standard" msgid "Units" msgstr "Enheter" +msgid "Allow only one OrcaSlicer instance" +msgstr "" + +msgid "" +"On OSX there is always only one instance of app running by default. However " +"it is allowed to run multiple instances of same app from the command line. " +"In such case this settings will allow only one instance." +msgstr "" + +msgid "" +"If this is enabled, when starting OrcaSlicer and another instance of the " +"same OrcaSlicer is already running, that instance will be reactivated " +"instead." +msgstr "" + msgid "Home" msgstr "" @@ -6171,6 +6192,14 @@ msgid "" "each printer automatically." msgstr "" +msgid "Multi-device Management(Take effect after restarting Studio)." +msgstr "" + +msgid "" +"With this option enabled, you can send a task to multiple devices at the " +"same time and manage multiple devices." +msgstr "" + msgid "Network" msgstr "" @@ -6806,6 +6835,9 @@ msgstr "" msgid "Modifying the device name" msgstr "Ändra enhetens namn" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "Skicka till skrivarens MicroSD-kort" @@ -6857,6 +6889,26 @@ msgstr "Timeout för mottagande av inloggnings rapport" msgid "Unknown Failure" msgstr "Okänt fel" +msgid "" +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." +msgstr "" + +msgid "Can't find Pin Code?" +msgstr "" + +msgid "Pin Code" +msgstr "" + +msgid "Binding..." +msgstr "" + +msgid "Please confirm on the printer screen" +msgstr "" + +msgid "Log in failed. Please check the Pin Code." +msgstr "" + msgid "Log in printer" msgstr "Logga in skrivare" @@ -7064,8 +7116,8 @@ msgstr "" msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "När du spelar in timelapse utan verktygshuvud rekommenderas att du lägger " "till ett \"Timelapse Wipe Tower\".\n" @@ -8069,6 +8121,39 @@ msgstr "Klar" msgid "resume" msgstr "" +msgid "Resume Printing" +msgstr "" + +msgid "Resume Printing(defects acceptable)" +msgstr "" + +msgid "Resume Printing(problem solved)" +msgstr "" + +msgid "Stop Printing" +msgstr "" + +msgid "Check Assistant" +msgstr "" + +msgid "Filament Extruded, Continue" +msgstr "" + +msgid "Not Extruded Yet, Retry" +msgstr "" + +msgid "Finished, Continue" +msgstr "" + +msgid "Load Filament" +msgstr "Ladda Filament" + +msgid "Filament Loaded, Resume" +msgstr "" + +msgid "View Liveview" +msgstr "" + msgid "Confirm and Update Nozzle" msgstr "" @@ -9298,9 +9383,9 @@ msgid "" "quality for needle and small details" msgstr "" "Aktivera detta val för att sänka utskifts hastigheten för att göra den sista " -"lager tiden inte kortare än lager tidströskeln \"Max fläkthastighets " -"tröskel\", detta så att lager kan kylas under en längre tid. Detta kan " -"förbättra kylnings kvaliteten för små detaljer" +"lager tiden inte kortare än lager tidströskeln \"Max fläkthastighets tröskel" +"\", detta så att lager kan kylas under en längre tid. Detta kan förbättra " +"kylnings kvaliteten för små detaljer" msgid "Normal printing" msgstr "Normal utskrift" @@ -10050,6 +10135,9 @@ msgstr "Kubik Support" msgid "Lightning" msgstr "Blixt" +msgid "Cross Hatch" +msgstr "" + msgid "Sparse infill anchor length" msgstr "" @@ -10218,10 +10306,10 @@ msgstr "Full fläkthastighet vid lager" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" msgid "Support interface fan speed" @@ -12804,6 +12892,9 @@ msgstr "Avbruten" msgid "load_obj: failed to parse" msgstr "load_obj: misslyckades med att analysera" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "Filen innehåller polygoner med fler än 4 hörn." @@ -12920,6 +13011,14 @@ msgstr "" msgid "The input value size must be 3." msgstr "" +msgid "" +"This machine type can only hold 16 history results per nozzle. You can " +"delete the existing historical results and then start calibration. Or you " +"can continue the calibration, but you cannot create new calibration " +"historical results. \n" +"Do you still want to continue the calibration?" +msgstr "" + msgid "Connecting to printer..." msgstr "" @@ -12929,6 +13028,19 @@ msgstr "" msgid "Flow Dynamics Calibration result has been saved to the printer" msgstr "" +#, c-format, boost-format +msgid "" +"There is already a historical calibration result with the same name: %s. " +"Only one of the results with the same name is saved. Are you sure you want " +"to override the historical result?" +msgstr "" + +#, c-format, boost-format +msgid "" +"This machine type can only hold %d history results per nozzle. This result " +"will not be saved." +msgstr "" + msgid "Internal Error" msgstr "" @@ -13154,9 +13266,6 @@ msgstr "" msgid "Printing Parameters" msgstr "" -msgid "- ℃" -msgstr "" - msgid "Plate Type" msgstr "Typ av byggplatta" @@ -13200,12 +13309,6 @@ msgstr "" msgid "Step value" msgstr "" -msgid "0.5" -msgstr "" - -msgid "0.005" -msgstr "" - msgid "The nozzle diameter has been synchronized from the printer Settings" msgstr "" @@ -13233,10 +13336,14 @@ msgstr "" msgid "Action" msgstr "" +#, c-format, boost-format +msgid "This machine type can only hold %d history results per nozzle." +msgstr "" + msgid "Edit Flow Dynamics Calibration" msgstr "" -msgid "New Flow Dynamics Calibration" +msgid "New Flow Dynamic Calibration" msgstr "" msgid "Ok" @@ -13245,13 +13352,6 @@ msgstr "" msgid "The filament must be selected." msgstr "" -#, c-format, boost-format -msgid "" -"There is already a historical calibration result with the same name: %s. " -"Only one of the results with the same name is saved. Are you sure you want " -"to override the historical result?" -msgstr "" - msgid "Network lookup" msgstr "" @@ -13632,8 +13732,8 @@ msgid "" msgstr "" msgid "" -"We would rename the presets as \"Vendor Type Serial @printer you " -"selected\". \n" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" "To add preset for more printers, Please go to printer selection" msgstr "" @@ -14176,6 +14276,175 @@ msgid "" "Error: \"%2%\"" msgstr "" +msgid "" +"It has a small layer height, and results in almost negligible layer lines " +"and high printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has lower speeds " +"and acceleration, and the sparse infill pattern is Gyroid. So, it results in " +"much higher printing quality, but a much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a slightly " +"bigger layer height, and results in almost negligible layer lines, and " +"slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a bigger layer " +"height, and results in slightly visible layer lines, but shorter printing " +"time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"height, and results in almost invisible layer lines and higher printing " +"quality, but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost invisible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of 0.2 mm nozzle, it has a smaller layer " +"height, and results in minimal layer lines and higher printing quality, but " +"shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in minimal layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"It has a general layer height, and results in general layer lines and " +"printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in less apparent layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost negligible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and longer printing " +"time." +msgstr "" + +msgid "" +"It has a big layer height, and results in apparent layer lines and ordinary " +"printing quality and printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in much more apparent layer lines and much lower " +"printing quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and slight higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"It has a very big layer height, and results in very apparent layer lines, " +"low printing quality and general printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a bigger layer " +"height, and results in very apparent layer lines and much lower printing " +"quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a much bigger " +"layer height, and results in extremely apparent layer lines and much lower " +"printing quality, but much shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a slightly " +"smaller layer height, and results in slightly less but still apparent layer " +"lines and slightly higher printing quality, but longer printing time in some " +"printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a smaller layer " +"height, and results in less but still apparent layer lines and slightly " +"higher printing quality, but longer printing time in some printing cases." +msgstr "" + msgid "Connected to Obico successfully!" msgstr "" @@ -14548,6 +14817,31 @@ msgid "" "probability of warping." msgstr "" +#~ msgid "Unload Filament" +#~ msgstr "Mata ut" + +#~ msgid "" +#~ "Choose an AMS slot then press \"Load\" or \"Unload\" button to " +#~ "automatically load or unload filiament." +#~ msgstr "" +#~ "Välj ett AMS fack tryck sedan \"Ladda eller \"Mata ur\" knappen för att " +#~ "automatiskt mata eller mata ut filament." + +#~ msgid "MC" +#~ msgstr "MC" + +#~ msgid "MainBoard" +#~ msgstr "Moderkort" + +#~ msgid "TH" +#~ msgstr "TH" + +#~ msgid "XCam" +#~ msgstr "X Kamera" + +#~ msgid "HMS" +#~ msgstr "HMS" + #~ msgid "active" #~ msgstr "aktiv" diff --git a/localization/i18n/tr/OrcaSlicer_tr.po b/localization/i18n/tr/OrcaSlicer_tr.po index cb9db69041..d1c387a3af 100644 --- a/localization/i18n/tr/OrcaSlicer_tr.po +++ b/localization/i18n/tr/OrcaSlicer_tr.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-16 16:45+0200\n" +"POT-Creation-Date: 2024-04-28 18:11+0800\n" "PO-Revision-Date: 2024-04-16 03:39+0300\n" "Last-Translator: Olcay ÖREN\n" "Language-Team: \n" @@ -2396,11 +2396,11 @@ msgstr "Otomatik Doldurma" msgid "AMS not connected" msgstr "AMS bağlı değil" -msgid "Load Filament" -msgstr "Filament Yükle" +msgid "Load" +msgstr "" -msgid "Unload Filament" -msgstr "Filamenti Çıkarın" +msgid "Unload" +msgstr "Boşalt" msgid "Ext Spool" msgstr "Harici Makara" @@ -2417,7 +2417,7 @@ msgstr "Yeniden dene" msgid "Calibrating AMS..." msgstr "AMS kalibre ediliyor..." -msgid "A problem occured during calibration. Click to view the solution." +msgid "A problem occurred during calibration. Click to view the solution." msgstr "" "Kalibrasyon sırasında bir sorun oluştu. Çözümü görüntülemek için tıklayın." @@ -2459,10 +2459,8 @@ msgstr "Yeni filament al" msgid "" "Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically " -"load or unload filiament." +"load or unload filaments." msgstr "" -"Filamenti otomatik olarak yüklemek veya çıkarmak için bir AMS yuvası seçin " -"ve ardından \"Yükle\" veya \"Boşalt\" düğmesine basın." msgid "Edit" msgstr "Düzenle" @@ -3087,6 +3085,14 @@ msgstr "" "AMS, mevcut filament bittiğinde otomatik olarak aynı özelliklere sahip başka " "bir makaraya devam edecektir" +msgid "Air Printing Detection" +msgstr "" + +msgid "" +"Detects clogging and filament grinding, halting printing immediately to " +"conserve time and filament." +msgstr "" + msgid "File" msgstr "Dosya" @@ -3550,18 +3556,6 @@ msgstr "İlk katman hatası duraklatılıyor" msgid "Nozzle clog pause" msgstr "Nozul tıkanıklığı duraklatılıyor" -msgid "MC" -msgstr "MC" - -msgid "MainBoard" -msgstr "Anakart" - -msgid "TH" -msgstr "TH" - -msgid "XCam" -msgstr "XCam" - msgid "Unknown" msgstr "Bilinmeyen" @@ -4097,7 +4091,7 @@ msgstr "Hacim:" msgid "Size:" msgstr "Boyut:" -#, boost-format +#, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -4238,6 +4232,9 @@ msgstr "Ön İzleme" msgid "Device" msgstr "Yazıcı" +msgid "Multi-device" +msgstr "" + msgid "Project" msgstr "Proje" @@ -4278,6 +4275,9 @@ msgstr "Tümünü yazdır" msgid "Send all" msgstr "Hepsini gönder" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "Klavye kısayolları" @@ -5085,9 +5085,6 @@ msgstr "Cham" msgid "Bed" msgstr "Yatak" -msgid "Unload" -msgstr "Boşalt" - msgid "Debug Info" msgstr "Hata Ayıklama Bilgisi" @@ -5274,9 +5271,6 @@ msgstr "Durum" msgid "Update" msgstr "Güncelle" -msgid "HMS" -msgstr "HMS" - msgid "Don't show again" msgstr "Bir daha gösterme" @@ -5522,6 +5516,12 @@ msgstr "Uyarı Sesine İzin Ver" msgid "Filament Tangle Detect" msgstr "Filament Dolaşma Tespiti" +msgid "Nozzle Clumping Detection" +msgstr "" + +msgid "Check if the nozzle is clumping by filament or other foreign objects." +msgstr "" + msgid "Nozzle Type" msgstr "Nozul Tipi" @@ -5978,19 +5978,23 @@ msgstr "Model İçe aktarılıyor" msgid "prepare 3mf file..." msgstr "3mf dosyasını hazırla..." +msgid "Download failed, unknown file format." +msgstr "" + msgid "downloading project ..." msgstr "proje indiriliyor..." +msgid "Download failed, File size exception." +msgstr "" + #, c-format, boost-format msgid "Project downloaded %d%%" msgstr "Proje %d%% indirildi" msgid "" -"Importing to Orca Slicer failed. Please download the file and manually " +"Importing to Bambu Studio failed. Please download the file and manually " "import it." msgstr "" -"Orca Slicer'ya aktarma başarısız oldu. Lütfen dosyayı indirin ve manuel " -"olarak İçe aktarın." msgid "Import SLA archive" msgstr "SLA arşivini içe aktar" @@ -6263,6 +6267,21 @@ msgstr "Imperial" msgid "Units" msgstr "Birimler" +msgid "Allow only one OrcaSlicer instance" +msgstr "" + +msgid "" +"On OSX there is always only one instance of app running by default. However " +"it is allowed to run multiple instances of same app from the command line. " +"In such case this settings will allow only one instance." +msgstr "" + +msgid "" +"If this is enabled, when starting OrcaSlicer and another instance of the " +"same OrcaSlicer is already running, that instance will be reactivated " +"instead." +msgstr "" + msgid "Home" msgstr "Ana Sayfa" @@ -6348,6 +6367,14 @@ msgstr "" "Etkinleştirilirse, Orca her yazıcı için filament/işlem yapılandırmasını " "hatırlayacak ve otomatik olarak değiştirecektir." +msgid "Multi-device Management(Take effect after restarting Studio)." +msgstr "" + +msgid "" +"With this option enabled, you can send a task to multiple devices at the " +"same time and manage multiple devices." +msgstr "" + msgid "Network" msgstr "Ağ" @@ -6998,6 +7025,9 @@ msgstr "Mikro Lidar kullanarak otomatik akış kalibrasyonu" msgid "Modifying the device name" msgstr "Cihaz adını değiştir" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "Yazıcı SD kartına gönder" @@ -7049,6 +7079,26 @@ msgstr "Giriş raporu alma zaman aşımı" msgid "Unknown Failure" msgstr "Bilinmeyen Arıza" +msgid "" +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." +msgstr "" + +msgid "Can't find Pin Code?" +msgstr "" + +msgid "Pin Code" +msgstr "" + +msgid "Binding..." +msgstr "" + +msgid "Please confirm on the printer screen" +msgstr "" + +msgid "Log in failed. Please check the Pin Code." +msgstr "" + msgid "Log in printer" msgstr "Yazıcıda oturum aç" @@ -7273,8 +7323,8 @@ msgstr "" msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "Araç başlığı olmadan timelapse kaydederken, bir \"Timelapse Wipe Tower\" " "eklenmesi önerilir.\n" @@ -8312,6 +8362,39 @@ msgstr "Tamamlandı" msgid "resume" msgstr "" +msgid "Resume Printing" +msgstr "" + +msgid "Resume Printing(defects acceptable)" +msgstr "" + +msgid "Resume Printing(problem solved)" +msgstr "" + +msgid "Stop Printing" +msgstr "" + +msgid "Check Assistant" +msgstr "" + +msgid "Filament Extruded, Continue" +msgstr "" + +msgid "Not Extruded Yet, Retry" +msgstr "" + +msgid "Finished, Continue" +msgstr "" + +msgid "Load Filament" +msgstr "Filament Yükle" + +msgid "Filament Loaded, Resume" +msgstr "" + +msgid "View Liveview" +msgstr "" + msgid "Confirm and Update Nozzle" msgstr "Nozulu Onaylayın ve Güncelleyin" @@ -8726,8 +8809,8 @@ msgid "" "Please select \"By object\" print sequence to print multiple objects in " "spiral vase mode." msgstr "" -"Birden fazla nesneyi spiral vazo modunda yazdırmak için lütfen \"Nesneye " -"göre\" yazdırma sırasını seçin." +"Birden fazla nesneyi spiral vazo modunda yazdırmak için lütfen \"Nesneye göre" +"\" yazdırma sırasını seçin." msgid "" "The spiral vase mode does not work when an object contains more than one " @@ -10586,6 +10669,9 @@ msgstr "Destek kübik" msgid "Lightning" msgstr "Yıldırım" +msgid "Cross Hatch" +msgstr "" + msgid "Sparse infill anchor length" msgstr "Dolgu uzunluğu" @@ -10783,17 +10869,16 @@ msgstr "Maksimum fan hızı" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" "Fan hızı, \"close_fan_the_first_x_layers\" katmanında sıfırdan " "\"ful_fan_speed_layer\" katmanında maksimuma doğrusal olarak artırılacaktır. " "\"full_fan_speed_layer\", \"close_fan_the_first_x_layers\" değerinden " -"düşükse göz ardı edilecektir; bu durumda fan, " -"\"close_fan_the_first_x_layers\" + 1 katmanında izin verilen maksimum hızda " -"çalışacaktır." +"düşükse göz ardı edilecektir; bu durumda fan, \"close_fan_the_first_x_layers" +"\" + 1 katmanında izin verilen maksimum hızda çalışacaktır." msgid "Support interface fan speed" msgstr "Destekler için fan hızı" @@ -13734,6 +13819,9 @@ msgstr "İptal edildi" msgid "load_obj: failed to parse" msgstr "load_obj: ayrıştırılamadı" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "Dosya 4'ten fazla köşesi olan çokgenler içeriyor." @@ -13860,6 +13948,14 @@ msgstr "Lütfen kalibre edilecek filamenti seçin." msgid "The input value size must be 3." msgstr "Giriş değeri boyutu 3 olmalıdır." +msgid "" +"This machine type can only hold 16 history results per nozzle. You can " +"delete the existing historical results and then start calibration. Or you " +"can continue the calibration, but you cannot create new calibration " +"historical results. \n" +"Do you still want to continue the calibration?" +msgstr "" + msgid "Connecting to printer..." msgstr "Yazıcıya bağlanılıyor..." @@ -13869,6 +13965,22 @@ msgstr "Başarısız olan test sonucu düşürüldü." msgid "Flow Dynamics Calibration result has been saved to the printer" msgstr "Akış Dinamiği Kalibrasyonu sonucu yazıcıya kaydedildi" +#, c-format, boost-format +msgid "" +"There is already a historical calibration result with the same name: %s. " +"Only one of the results with the same name is saved. Are you sure you want " +"to override the historical result?" +msgstr "" +"Aynı ada sahip geçmiş bir kalibrasyon sonucu zaten var: %s. Aynı ada sahip " +"sonuçlardan yalnızca biri kaydedilir. Geçmiş sonucu geçersiz kılmak " +"istediğinizden emin misiniz?" + +#, c-format, boost-format +msgid "" +"This machine type can only hold %d history results per nozzle. This result " +"will not be saved." +msgstr "" + msgid "Internal Error" msgstr "İç hata" @@ -14168,9 +14280,6 @@ msgstr "" msgid "Printing Parameters" msgstr "Yazdırma Parametreleri" -msgid "- ℃" -msgstr "- °C" - msgid "Plate Type" msgstr "Plaka Tipi" @@ -14217,12 +14326,6 @@ msgstr "K değerine" msgid "Step value" msgstr "Adım değeri" -msgid "0.5" -msgstr "0.5" - -msgid "0.005" -msgstr "0.005" - msgid "The nozzle diameter has been synchronized from the printer Settings" msgstr "Nozul çapı yazıcı ayarlarından senkronize edildi" @@ -14250,11 +14353,15 @@ msgstr "Geçmiş Akış Dinamiği Kalibrasyon kayıtlarını yenileme" msgid "Action" msgstr "İşlem" +#, c-format, boost-format +msgid "This machine type can only hold %d history results per nozzle." +msgstr "" + msgid "Edit Flow Dynamics Calibration" msgstr "Akış Dinamiği Kalibrasyonunu Düzenle" -msgid "New Flow Dynamics Calibration" -msgstr "Yeni Akış Dinamiği Kalibrasyonu" +msgid "New Flow Dynamic Calibration" +msgstr "" msgid "Ok" msgstr "Tamam" @@ -14262,16 +14369,6 @@ msgstr "Tamam" msgid "The filament must be selected." msgstr "Filament seçilmelidir." -#, c-format, boost-format -msgid "" -"There is already a historical calibration result with the same name: %s. " -"Only one of the results with the same name is saved. Are you sure you want " -"to override the historical result?" -msgstr "" -"Aynı ada sahip geçmiş bir kalibrasyon sonucu zaten var: %s. Aynı ada sahip " -"sonuçlardan yalnızca biri kaydedilir. Geçmiş sonucu geçersiz kılmak " -"istediğinizden emin misiniz?" - msgid "Network lookup" msgstr "Ağ araması" @@ -14680,8 +14777,8 @@ msgstr "" "Yeniden yazmak ister misin?" msgid "" -"We would rename the presets as \"Vendor Type Serial @printer you " -"selected\". \n" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" "To add preset for more printers, Please go to printer selection" msgstr "" "Ön ayarları şu şekilde yeniden adlandırırdık: \"Satıcı Türü Seçtiğiniz Seri " @@ -15305,6 +15402,175 @@ msgstr "" "Mesaj gövdesi: \"%1%\"\n" "Hata: \"%2%\"" +msgid "" +"It has a small layer height, and results in almost negligible layer lines " +"and high printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has lower speeds " +"and acceleration, and the sparse infill pattern is Gyroid. So, it results in " +"much higher printing quality, but a much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a slightly " +"bigger layer height, and results in almost negligible layer lines, and " +"slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a bigger layer " +"height, and results in slightly visible layer lines, but shorter printing " +"time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"height, and results in almost invisible layer lines and higher printing " +"quality, but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost invisible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of 0.2 mm nozzle, it has a smaller layer " +"height, and results in minimal layer lines and higher printing quality, but " +"shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in minimal layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"It has a general layer height, and results in general layer lines and " +"printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in less apparent layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost negligible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and longer printing " +"time." +msgstr "" + +msgid "" +"It has a big layer height, and results in apparent layer lines and ordinary " +"printing quality and printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in much more apparent layer lines and much lower " +"printing quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and slight higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"It has a very big layer height, and results in very apparent layer lines, " +"low printing quality and general printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a bigger layer " +"height, and results in very apparent layer lines and much lower printing " +"quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a much bigger " +"layer height, and results in extremely apparent layer lines and much lower " +"printing quality, but much shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a slightly " +"smaller layer height, and results in slightly less but still apparent layer " +"lines and slightly higher printing quality, but longer printing time in some " +"printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a smaller layer " +"height, and results in less but still apparent layer lines and slightly " +"higher printing quality, but longer printing time in some printing cases." +msgstr "" + msgid "Connected to Obico successfully!" msgstr "Obico'ya başarıyla bağlanıldı!" @@ -15738,6 +16004,50 @@ msgstr "" "sıcaklığının uygun şekilde arttırılmasının bükülme olasılığını " "azaltabileceğini biliyor muydunuz?" +#~ msgid "Unload Filament" +#~ msgstr "Filamenti Çıkarın" + +#~ msgid "" +#~ "Choose an AMS slot then press \"Load\" or \"Unload\" button to " +#~ "automatically load or unload filiament." +#~ msgstr "" +#~ "Filamenti otomatik olarak yüklemek veya çıkarmak için bir AMS yuvası " +#~ "seçin ve ardından \"Yükle\" veya \"Boşalt\" düğmesine basın." + +#~ msgid "MC" +#~ msgstr "MC" + +#~ msgid "MainBoard" +#~ msgstr "Anakart" + +#~ msgid "TH" +#~ msgstr "TH" + +#~ msgid "XCam" +#~ msgstr "XCam" + +#~ msgid "HMS" +#~ msgstr "HMS" + +#~ msgid "" +#~ "Importing to Orca Slicer failed. Please download the file and manually " +#~ "import it." +#~ msgstr "" +#~ "Orca Slicer'ya aktarma başarısız oldu. Lütfen dosyayı indirin ve manuel " +#~ "olarak İçe aktarın." + +#~ msgid "- ℃" +#~ msgstr "- °C" + +#~ msgid "0.5" +#~ msgstr "0.5" + +#~ msgid "0.005" +#~ msgstr "0.005" + +#~ msgid "New Flow Dynamics Calibration" +#~ msgstr "Yeni Akış Dinamiği Kalibrasyonu" + #~ msgid "" #~ "Over 4 studio/handy are using remote access, you can close some and try " #~ "again." @@ -16056,12 +16366,12 @@ msgstr "" #~ msgstr "Seyrek katman yok (DENEYSEL)" #~ msgid "" -#~ "We would rename the presets as \"Vendor Type Serial @printer you " -#~ "selected\". \n" +#~ "We would rename the presets as \"Vendor Type Serial @printer you selected" +#~ "\". \n" #~ "To add preset for more prinetrs, Please go to printer selection" #~ msgstr "" -#~ "We would rename the presets as \"Vendor Type Serial @printer you " -#~ "selected\". \n" +#~ "We would rename the presets as \"Vendor Type Serial @printer you selected" +#~ "\". \n" #~ "To add preset for more prinetrs, Please go to printer selection" #~ msgid "The Config can not be loaded." diff --git a/localization/i18n/uk/OrcaSlicer_uk.po b/localization/i18n/uk/OrcaSlicer_uk.po index 8cab46bcee..1effee350d 100644 --- a/localization/i18n/uk/OrcaSlicer_uk.po +++ b/localization/i18n/uk/OrcaSlicer_uk.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-16 16:45+0200\n" +"POT-Creation-Date: 2024-04-28 18:11+0800\n" "PO-Revision-Date: 2023-08-10 20:25-0400\n" "Last-Translator: \n" "Language-Team: \n" @@ -15,8 +15,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" "X-Generator: Poedit 3.3.2\n" msgid "Supports Painting" @@ -2371,11 +2371,11 @@ msgstr "" msgid "AMS not connected" msgstr "АМС не підключено" -msgid "Load Filament" -msgstr "Завантажте філамент" +msgid "Load" +msgstr "" -msgid "Unload Filament" -msgstr "Вивантажте філамент" +msgid "Unload" +msgstr "Вивантаження" msgid "Ext Spool" msgstr "Зовнішня котушка" @@ -2392,7 +2392,7 @@ msgstr "Повторити спробу" msgid "Calibrating AMS..." msgstr "Калібрування АМС..." -msgid "A problem occured during calibration. Click to view the solution." +msgid "A problem occurred during calibration. Click to view the solution." msgstr "" "Під час калібрування виникла проблема. Натисніть, щоб переглянути рішення." @@ -2434,11 +2434,8 @@ msgstr "" msgid "" "Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically " -"load or unload filiament." +"load or unload filaments." msgstr "" -"Виберіть слот AMS, потім натисніть кнопку \\Load\\ або \\Unload\\, щоб " -"автоматично\n" -"завантажити або вивантажити філамент." msgid "Edit" msgstr "Редагувати" @@ -3047,6 +3044,14 @@ msgstr "" "AMS перейде на іншу котушку з тими самими властивостями автоматично, коли " "поточний філамент закінчується" +msgid "Air Printing Detection" +msgstr "" + +msgid "" +"Detects clogging and filament grinding, halting printing immediately to " +"conserve time and filament." +msgstr "" + msgid "File" msgstr "Файл" @@ -3501,18 +3506,6 @@ msgstr "" msgid "Nozzle clog pause" msgstr "" -msgid "MC" -msgstr "MC" - -msgid "MainBoard" -msgstr "Основна плата" - -msgid "TH" -msgstr "TH" - -msgid "XCam" -msgstr "XCam" - msgid "Unknown" msgstr "Невідомий" @@ -4035,7 +4028,7 @@ msgstr "Об'єм:" msgid "Size:" msgstr "Розмір:" -#, boost-format +#, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -4176,6 +4169,9 @@ msgstr "Попередній перегляд" msgid "Device" msgstr "Пристрій" +msgid "Multi-device" +msgstr "" + msgid "Project" msgstr "Проєкт" @@ -4215,6 +4211,9 @@ msgstr "Роздрукувати все" msgid "Send all" msgstr "Надіслати все" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "Гарячі клавіші" @@ -5005,9 +5004,6 @@ msgstr "Камера" msgid "Bed" msgstr "Стіл" -msgid "Unload" -msgstr "Вивантаження" - msgid "Debug Info" msgstr "Налагоджувальна інформація" @@ -5177,9 +5173,6 @@ msgstr "Статус" msgid "Update" msgstr "Оновлення" -msgid "HMS" -msgstr "HMS" - msgid "Don't show again" msgstr "Більше не показувати" @@ -5427,6 +5420,12 @@ msgstr "" msgid "Filament Tangle Detect" msgstr "" +msgid "Nozzle Clumping Detection" +msgstr "" + +msgid "Check if the nozzle is clumping by filament or other foreign objects." +msgstr "" + msgid "Nozzle Type" msgstr "" @@ -5871,15 +5870,21 @@ msgstr "Імпорт моделі" msgid "prepare 3mf file..." msgstr "підготувати файл 3mf..." +msgid "Download failed, unknown file format." +msgstr "" + msgid "downloading project ..." msgstr "завантажую проект..." +msgid "Download failed, File size exception." +msgstr "" + #, c-format, boost-format msgid "Project downloaded %d%%" msgstr "Проект завантажено %d%%" msgid "" -"Importing to Orca Slicer failed. Please download the file and manually " +"Importing to Bambu Studio failed. Please download the file and manually " "import it." msgstr "" @@ -6149,6 +6154,21 @@ msgstr "Імперський" msgid "Units" msgstr "Одиниці" +msgid "Allow only one OrcaSlicer instance" +msgstr "" + +msgid "" +"On OSX there is always only one instance of app running by default. However " +"it is allowed to run multiple instances of same app from the command line. " +"In such case this settings will allow only one instance." +msgstr "" + +msgid "" +"If this is enabled, when starting OrcaSlicer and another instance of the " +"same OrcaSlicer is already running, that instance will be reactivated " +"instead." +msgstr "" + msgid "Home" msgstr "" @@ -6224,6 +6244,14 @@ msgid "" "each printer automatically." msgstr "" +msgid "Multi-device Management(Take effect after restarting Studio)." +msgstr "" + +msgid "" +"With this option enabled, you can send a task to multiple devices at the " +"same time and manage multiple devices." +msgstr "" + msgid "Network" msgstr "" @@ -6861,6 +6889,9 @@ msgstr "" msgid "Modifying the device name" msgstr "Зміна імені пристрою" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "Надіслати на SD-карту принтера" @@ -6912,6 +6943,26 @@ msgstr "" msgid "Unknown Failure" msgstr "Невідомий збій" +msgid "" +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." +msgstr "" + +msgid "Can't find Pin Code?" +msgstr "" + +msgid "Pin Code" +msgstr "" + +msgid "Binding..." +msgstr "" + +msgid "Please confirm on the printer screen" +msgstr "" + +msgid "Log in failed. Please check the Pin Code." +msgstr "" + msgid "Log in printer" msgstr "Вхід до принтера" @@ -7101,8 +7152,8 @@ msgstr "" msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "При записі таймлапсу без інструментальної головки рекомендується додати " "“Timelapse Wipe Tower” \n" @@ -8107,6 +8158,39 @@ msgstr "Виконано" msgid "resume" msgstr "" +msgid "Resume Printing" +msgstr "" + +msgid "Resume Printing(defects acceptable)" +msgstr "" + +msgid "Resume Printing(problem solved)" +msgstr "" + +msgid "Stop Printing" +msgstr "" + +msgid "Check Assistant" +msgstr "" + +msgid "Filament Extruded, Continue" +msgstr "" + +msgid "Not Extruded Yet, Retry" +msgstr "" + +msgid "Finished, Continue" +msgstr "" + +msgid "Load Filament" +msgstr "Завантажте філамент" + +msgid "Filament Loaded, Resume" +msgstr "" + +msgid "View Liveview" +msgstr "" + msgid "Confirm and Update Nozzle" msgstr "" @@ -10130,6 +10214,9 @@ msgstr "Підтримуючий кубічний" msgid "Lightning" msgstr "Блискавка" +msgid "Cross Hatch" +msgstr "" + msgid "Sparse infill anchor length" msgstr "Довжина прив'язки заповнення" @@ -10331,10 +10418,10 @@ msgstr "Повна швидкість вентилятора на шарі" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" "Швидкість вентилятора лінійно збільшується від нуля на " "рівні«close_fan_the_first_x_layers» до максимуму на рівні " @@ -12966,6 +13053,9 @@ msgstr "" msgid "load_obj: failed to parse" msgstr "" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "" @@ -13082,6 +13172,14 @@ msgstr "" msgid "The input value size must be 3." msgstr "" +msgid "" +"This machine type can only hold 16 history results per nozzle. You can " +"delete the existing historical results and then start calibration. Or you " +"can continue the calibration, but you cannot create new calibration " +"historical results. \n" +"Do you still want to continue the calibration?" +msgstr "" + msgid "Connecting to printer..." msgstr "" @@ -13091,6 +13189,19 @@ msgstr "" msgid "Flow Dynamics Calibration result has been saved to the printer" msgstr "" +#, c-format, boost-format +msgid "" +"There is already a historical calibration result with the same name: %s. " +"Only one of the results with the same name is saved. Are you sure you want " +"to override the historical result?" +msgstr "" + +#, c-format, boost-format +msgid "" +"This machine type can only hold %d history results per nozzle. This result " +"will not be saved." +msgstr "" + msgid "Internal Error" msgstr "" @@ -13316,9 +13427,6 @@ msgstr "" msgid "Printing Parameters" msgstr "" -msgid "- ℃" -msgstr "" - msgid "Plate Type" msgstr "" @@ -13362,12 +13470,6 @@ msgstr "" msgid "Step value" msgstr "" -msgid "0.5" -msgstr "" - -msgid "0.005" -msgstr "" - msgid "The nozzle diameter has been synchronized from the printer Settings" msgstr "" @@ -13395,10 +13497,14 @@ msgstr "" msgid "Action" msgstr "" +#, c-format, boost-format +msgid "This machine type can only hold %d history results per nozzle." +msgstr "" + msgid "Edit Flow Dynamics Calibration" msgstr "" -msgid "New Flow Dynamics Calibration" +msgid "New Flow Dynamic Calibration" msgstr "" msgid "Ok" @@ -13407,13 +13513,6 @@ msgstr "" msgid "The filament must be selected." msgstr "" -#, c-format, boost-format -msgid "" -"There is already a historical calibration result with the same name: %s. " -"Only one of the results with the same name is saved. Are you sure you want " -"to override the historical result?" -msgstr "" - msgid "Network lookup" msgstr "" @@ -13798,8 +13897,8 @@ msgid "" msgstr "" msgid "" -"We would rename the presets as \"Vendor Type Serial @printer you " -"selected\". \n" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" "To add preset for more printers, Please go to printer selection" msgstr "" @@ -14349,6 +14448,175 @@ msgid "" "Error: \"%2%\"" msgstr "" +msgid "" +"It has a small layer height, and results in almost negligible layer lines " +"and high printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has lower speeds " +"and acceleration, and the sparse infill pattern is Gyroid. So, it results in " +"much higher printing quality, but a much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a slightly " +"bigger layer height, and results in almost negligible layer lines, and " +"slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a bigger layer " +"height, and results in slightly visible layer lines, but shorter printing " +"time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"height, and results in almost invisible layer lines and higher printing " +"quality, but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost invisible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of 0.2 mm nozzle, it has a smaller layer " +"height, and results in minimal layer lines and higher printing quality, but " +"shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in minimal layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"It has a general layer height, and results in general layer lines and " +"printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in less apparent layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost negligible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and longer printing " +"time." +msgstr "" + +msgid "" +"It has a big layer height, and results in apparent layer lines and ordinary " +"printing quality and printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in much more apparent layer lines and much lower " +"printing quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and slight higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"It has a very big layer height, and results in very apparent layer lines, " +"low printing quality and general printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a bigger layer " +"height, and results in very apparent layer lines and much lower printing " +"quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a much bigger " +"layer height, and results in extremely apparent layer lines and much lower " +"printing quality, but much shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a slightly " +"smaller layer height, and results in slightly less but still apparent layer " +"lines and slightly higher printing quality, but longer printing time in some " +"printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a smaller layer " +"height, and results in less but still apparent layer lines and slightly " +"higher printing quality, but longer printing time in some printing cases." +msgstr "" + msgid "Connected to Obico successfully!" msgstr "" @@ -14721,6 +14989,32 @@ msgid "" "probability of warping." msgstr "" +#~ msgid "Unload Filament" +#~ msgstr "Вивантажте філамент" + +#~ msgid "" +#~ "Choose an AMS slot then press \"Load\" or \"Unload\" button to " +#~ "automatically load or unload filiament." +#~ msgstr "" +#~ "Виберіть слот AMS, потім натисніть кнопку \\Load\\ або \\Unload\\, щоб " +#~ "автоматично\n" +#~ "завантажити або вивантажити філамент." + +#~ msgid "MC" +#~ msgstr "MC" + +#~ msgid "MainBoard" +#~ msgstr "Основна плата" + +#~ msgid "TH" +#~ msgstr "TH" + +#~ msgid "XCam" +#~ msgstr "XCam" + +#~ msgid "HMS" +#~ msgstr "HMS" + #~ msgid "active" #~ msgstr "активно" diff --git a/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po b/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po index 5d329f9e7f..30f61de27e 100644 --- a/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po +++ b/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Slic3rPE\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-16 16:45+0200\n" +"POT-Creation-Date: 2024-04-28 18:11+0800\n" "PO-Revision-Date: 2023-04-01 13:21+0800\n" "Last-Translator: SoftFever \n" "Language-Team: \n" @@ -2327,10 +2327,10 @@ msgstr "自动补给" msgid "AMS not connected" msgstr "AMS 未连接" -msgid "Load Filament" -msgstr "进料" +msgid "Load" +msgstr "" -msgid "Unload Filament" +msgid "Unload" msgstr "退料" msgid "Ext Spool" @@ -2348,7 +2348,7 @@ msgstr "重试" msgid "Calibrating AMS..." msgstr "正在校准AMS..." -msgid "A problem occured during calibration. Click to view the solution." +msgid "A problem occurred during calibration. Click to view the solution." msgstr "校准过程遇到问题。点击查看解决方案。" msgid "Calibrate again" @@ -2389,8 +2389,8 @@ msgstr "咬入耗材丝" msgid "" "Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically " -"load or unload filiament." -msgstr "选择1个AMS槽位,然后点击进料/退料按钮以自动进料/退料。" +"load or unload filaments." +msgstr "" msgid "Edit" msgstr "编辑" @@ -2960,6 +2960,14 @@ msgid "" "automatically when current filament runs out" msgstr "AMS料材丝耗尽后将自动切换到属性完全相同的耗材丝" +msgid "Air Printing Detection" +msgstr "" + +msgid "" +"Detects clogging and filament grinding, halting printing immediately to " +"conserve time and filament." +msgstr "" + msgid "File" msgstr "文件" @@ -3390,18 +3398,6 @@ msgstr "首层扫描异常暂停" msgid "Nozzle clog pause" msgstr "堵头暂停" -msgid "MC" -msgstr "" - -msgid "MainBoard" -msgstr "主板" - -msgid "TH" -msgstr "" - -msgid "XCam" -msgstr "" - msgid "Unknown" msgstr "未定义" @@ -3930,7 +3926,7 @@ msgstr "体积:" msgid "Size:" msgstr "尺寸:" -#, boost-format +#, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -4069,6 +4065,9 @@ msgstr "预览" msgid "Device" msgstr "设备" +msgid "Multi-device" +msgstr "" + msgid "Project" msgstr "项目" @@ -4108,6 +4107,9 @@ msgstr "打印所有盘" msgid "Send all" msgstr "发送所有盘" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "快捷键" @@ -4881,9 +4883,6 @@ msgstr "机箱" msgid "Bed" msgstr "热床" -msgid "Unload" -msgstr "退料" - msgid "Debug Info" msgstr "调试信息" @@ -5059,9 +5058,6 @@ msgstr "设备状态" msgid "Update" msgstr "固件更新" -msgid "HMS" -msgstr "" - msgid "Don't show again" msgstr "不再显示" @@ -5298,6 +5294,12 @@ msgstr "允许提示音" msgid "Filament Tangle Detect" msgstr "缠料检测" +msgid "Nozzle Clumping Detection" +msgstr "" + +msgid "Check if the nozzle is clumping by filament or other foreign objects." +msgstr "" + msgid "Nozzle Type" msgstr "" @@ -5721,15 +5723,21 @@ msgstr "正在导入模型" msgid "prepare 3mf file..." msgstr "正在准备3mf文件..." +msgid "Download failed, unknown file format." +msgstr "" + msgid "downloading project ..." msgstr "项目下载中..." +msgid "Download failed, File size exception." +msgstr "" + #, c-format, boost-format msgid "Project downloaded %d%%" msgstr "项目已下载%d%%" msgid "" -"Importing to Orca Slicer failed. Please download the file and manually " +"Importing to Bambu Studio failed. Please download the file and manually " "import it." msgstr "" @@ -5992,6 +6000,21 @@ msgstr "英制" msgid "Units" msgstr "单位" +msgid "Allow only one OrcaSlicer instance" +msgstr "" + +msgid "" +"On OSX there is always only one instance of app running by default. However " +"it is allowed to run multiple instances of same app from the command line. " +"In such case this settings will allow only one instance." +msgstr "" + +msgid "" +"If this is enabled, when starting OrcaSlicer and another instance of the " +"same OrcaSlicer is already running, that instance will be reactivated " +"instead." +msgstr "" + msgid "Home" msgstr "" @@ -6066,6 +6089,14 @@ msgid "" "each printer automatically." msgstr "" +msgid "Multi-device Management(Take effect after restarting Studio)." +msgstr "" + +msgid "" +"With this option enabled, you can send a task to multiple devices at the " +"same time and manage multiple devices." +msgstr "" + msgid "Network" msgstr "网络" @@ -6679,6 +6710,9 @@ msgstr "使用微型激光雷达进行自动流量校准" msgid "Modifying the device name" msgstr "修改打印机名称" +msgid "Bind with Pin Code" +msgstr "" + msgid "Send to Printer SD card" msgstr "发送到打印机的SD卡" @@ -6730,6 +6764,26 @@ msgstr "接收登录报告超时" msgid "Unknown Failure" msgstr "发生错误" +msgid "" +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." +msgstr "" + +msgid "Can't find Pin Code?" +msgstr "" + +msgid "Pin Code" +msgstr "" + +msgid "Binding..." +msgstr "" + +msgid "Please confirm on the printer screen" +msgstr "" + +msgid "Log in failed. Please check the Pin Code." +msgstr "" + msgid "Log in printer" msgstr "登录打印机" @@ -6920,8 +6974,8 @@ msgstr "" msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "在录制无工具头延时摄影视频时,建议添加“延时摄影擦料塔”\n" "右键单击打印板的空白位置,选择“添加标准模型”->“延时摄影擦料塔”。" @@ -7904,6 +7958,39 @@ msgstr "完成" msgid "resume" msgstr "" +msgid "Resume Printing" +msgstr "" + +msgid "Resume Printing(defects acceptable)" +msgstr "" + +msgid "Resume Printing(problem solved)" +msgstr "" + +msgid "Stop Printing" +msgstr "" + +msgid "Check Assistant" +msgstr "" + +msgid "Filament Extruded, Continue" +msgstr "" + +msgid "Not Extruded Yet, Retry" +msgstr "" + +msgid "Finished, Continue" +msgstr "" + +msgid "Load Filament" +msgstr "进料" + +msgid "Filament Loaded, Resume" +msgstr "" + +msgid "View Liveview" +msgstr "" + msgid "Confirm and Update Nozzle" msgstr "确认并更新喷嘴" @@ -9916,6 +10003,9 @@ msgstr "支撑立方体" msgid "Lightning" msgstr "闪电" +msgid "Cross Hatch" +msgstr "" + msgid "Sparse infill anchor length" msgstr "稀疏填充锚线长度" @@ -10091,10 +10181,10 @@ msgstr "满速风扇在" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" "风扇速度将从“禁用第一层”的零线性上升到“全风扇速度层”的最大。如果低于“禁用风扇" "第一层”,则“全风扇速度第一层”将被忽略,在这种情况下,风扇将在“禁用风扇第一" @@ -12673,6 +12763,9 @@ msgstr "已取消" msgid "load_obj: failed to parse" msgstr "加载对象:无法分析" +msgid "load mtl in obj: failed to parse" +msgstr "" + msgid "The file contains polygons with more than 4 vertices." msgstr "该文件包含顶点超过4个的多边形。" @@ -12796,6 +12889,14 @@ msgstr "请选择要校准的耗材丝。" msgid "The input value size must be 3." msgstr "输入值大小必须为3。" +msgid "" +"This machine type can only hold 16 history results per nozzle. You can " +"delete the existing historical results and then start calibration. Or you " +"can continue the calibration, but you cannot create new calibration " +"historical results. \n" +"Do you still want to continue the calibration?" +msgstr "" + msgid "Connecting to printer..." msgstr "正在连接打印机..." @@ -12805,6 +12906,19 @@ msgstr "测试失败的结果已被删除。" msgid "Flow Dynamics Calibration result has been saved to the printer" msgstr "动态流量校准的结果已保存至打印机。" +#, c-format, boost-format +msgid "" +"There is already a historical calibration result with the same name: %s. " +"Only one of the results with the same name is saved. Are you sure you want " +"to override the historical result?" +msgstr "" + +#, c-format, boost-format +msgid "" +"This machine type can only hold %d history results per nozzle. This result " +"will not be saved." +msgstr "" + msgid "Internal Error" msgstr "内部错误" @@ -13072,9 +13186,6 @@ msgstr "将打印一份测试模型。在校准之前,请清理打印平台并 msgid "Printing Parameters" msgstr "打印参数" -msgid "- ℃" -msgstr "" - msgid "Plate Type" msgstr "热床类型" @@ -13121,12 +13232,6 @@ msgstr "结束k值" msgid "Step value" msgstr "" -msgid "0.5" -msgstr "" - -msgid "0.005" -msgstr "" - msgid "The nozzle diameter has been synchronized from the printer Settings" msgstr "喷嘴直径已从打印机设置同步" @@ -13154,10 +13259,14 @@ msgstr "刷新历史流量动态校准记录" msgid "Action" msgstr "操作" +#, c-format, boost-format +msgid "This machine type can only hold %d history results per nozzle." +msgstr "" + msgid "Edit Flow Dynamics Calibration" msgstr "编辑动态流量校准" -msgid "New Flow Dynamics Calibration" +msgid "New Flow Dynamic Calibration" msgstr "" msgid "Ok" @@ -13166,13 +13275,6 @@ msgstr "" msgid "The filament must be selected." msgstr "" -#, c-format, boost-format -msgid "" -"There is already a historical calibration result with the same name: %s. " -"Only one of the results with the same name is saved. Are you sure you want " -"to override the historical result?" -msgstr "" - msgid "Network lookup" msgstr "搜索网络" @@ -13571,8 +13673,8 @@ msgstr "" "你想重写预设吗" msgid "" -"We would rename the presets as \"Vendor Type Serial @printer you " -"selected\". \n" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" "To add preset for more printers, Please go to printer selection" msgstr "" @@ -14137,6 +14239,175 @@ msgid "" "Error: \"%2%\"" msgstr "主机打印机的枚举失败。消息体:\"%1%\"错误:\"%2%\"" +msgid "" +"It has a small layer height, and results in almost negligible layer lines " +"and high printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has lower speeds " +"and acceleration, and the sparse infill pattern is Gyroid. So, it results in " +"much higher printing quality, but a much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a slightly " +"bigger layer height, and results in almost negligible layer lines, and " +"slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a bigger layer " +"height, and results in slightly visible layer lines, but shorter printing " +"time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"height, and results in almost invisible layer lines and higher printing " +"quality, but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost invisible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of 0.2 mm nozzle, it has a smaller layer " +"height, and results in minimal layer lines and higher printing quality, but " +"shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in minimal layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"It has a general layer height, and results in general layer lines and " +"printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in less apparent layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost negligible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and longer printing " +"time." +msgstr "" + +msgid "" +"It has a big layer height, and results in apparent layer lines and ordinary " +"printing quality and printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in much more apparent layer lines and much lower " +"printing quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and slight higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"It has a very big layer height, and results in very apparent layer lines, " +"low printing quality and general printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a bigger layer " +"height, and results in very apparent layer lines and much lower printing " +"quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a much bigger " +"layer height, and results in extremely apparent layer lines and much lower " +"printing quality, but much shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a slightly " +"smaller layer height, and results in slightly less but still apparent layer " +"lines and slightly higher printing quality, but longer printing time in some " +"printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a smaller layer " +"height, and results in less but still apparent layer lines and slightly " +"higher printing quality, but longer printing time in some printing cases." +msgstr "" + msgid "Connected to Obico successfully!" msgstr "" @@ -14531,6 +14802,17 @@ msgstr "" "避免翘曲\n" "您知道吗?打印ABS这类易翘曲材料时,适当提高热床温度可以降低翘曲的概率。" +#~ msgid "Unload Filament" +#~ msgstr "退料" + +#~ msgid "" +#~ "Choose an AMS slot then press \"Load\" or \"Unload\" button to " +#~ "automatically load or unload filiament." +#~ msgstr "选择1个AMS槽位,然后点击进料/退料按钮以自动进料/退料。" + +#~ msgid "MainBoard" +#~ msgstr "主板" + #~ msgid "active" #~ msgstr "活动的" @@ -14755,8 +15037,8 @@ msgstr "" #~ msgstr "无稀疏层(实验)" #~ msgid "" -#~ "We would rename the presets as \"Vendor Type Serial @printer you " -#~ "selected\". \n" +#~ "We would rename the presets as \"Vendor Type Serial @printer you selected" +#~ "\". \n" #~ "To add preset for more prinetrs, Please go to printer selection" #~ msgstr "" #~ "我们会将预设重命名为“供应商 类型 系列 @您选择的打印机”。\n" diff --git a/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po b/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po index 03f29b69af..d8c100ce4a 100644 --- a/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po +++ b/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-04-16 16:45+0200\n" +"POT-Creation-Date: 2024-04-28 18:11+0800\n" "PO-Revision-Date: 2023-11-06 14:37+0800\n" "Last-Translator: ablegods \n" "Language-Team: \n" @@ -2414,10 +2414,10 @@ msgstr "自動補充" msgid "AMS not connected" msgstr "AMS 尚未連接" -msgid "Load Filament" -msgstr "進料" +msgid "Load" +msgstr "" -msgid "Unload Filament" +msgid "Unload" msgstr "退料" msgid "Ext Spool" @@ -2435,7 +2435,7 @@ msgstr "重試" msgid "Calibrating AMS..." msgstr "正在校準 AMS..." -msgid "A problem occured during calibration. Click to view the solution." +msgid "A problem occurred during calibration. Click to view the solution." msgstr "校準過程遇到問題。點擊查看解決方案。" msgid "Calibrate again" @@ -2476,8 +2476,8 @@ msgstr "咬入線材" msgid "" "Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically " -"load or unload filiament." -msgstr "選擇 1 個 AMS 槽位,然後點擊進料/退料按鈕以自動進料/退料。" +"load or unload filaments." +msgstr "" msgid "Edit" msgstr "編輯" @@ -3079,6 +3079,14 @@ msgid "" "automatically when current filament runs out" msgstr "AMS 線材耗盡後將自動切換到屬性完全相同的線材" +msgid "Air Printing Detection" +msgstr "" + +msgid "" +"Detects clogging and filament grinding, halting printing immediately to " +"conserve time and filament." +msgstr "" + msgid "File" msgstr "檔案" @@ -3527,18 +3535,6 @@ msgstr "" msgid "Nozzle clog pause" msgstr "" -msgid "MC" -msgstr "" - -msgid "MainBoard" -msgstr "主板" - -msgid "TH" -msgstr "" - -msgid "XCam" -msgstr "" - msgid "Unknown" msgstr "未定義" @@ -4093,7 +4089,7 @@ msgstr "體積:" msgid "Size:" msgstr "尺寸:" -#, fuzzy, boost-format +#, fuzzy, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -4236,6 +4232,9 @@ msgstr "預覽" msgid "Device" msgstr "設備" +msgid "Multi-device" +msgstr "" + msgid "Project" msgstr "專案項目" @@ -4282,6 +4281,9 @@ msgstr "列印所有列印板" msgid "Send all" msgstr "傳送所有列印板" +msgid "Send to Multi-device" +msgstr "" + msgid "Keyboard Shortcuts" msgstr "快捷鍵" @@ -5077,9 +5079,6 @@ msgstr "機箱" msgid "Bed" msgstr "熱床" -msgid "Unload" -msgstr "退料" - msgid "Debug Info" msgstr "除錯資訊" @@ -5263,9 +5262,6 @@ msgstr "設備狀態" msgid "Update" msgstr "韌體更新" -msgid "HMS" -msgstr "" - msgid "Don't show again" msgstr "不再顯示" @@ -5508,6 +5504,12 @@ msgstr "允許提示音效" msgid "Filament Tangle Detect" msgstr "" +msgid "Nozzle Clumping Detection" +msgstr "" + +msgid "Check if the nozzle is clumping by filament or other foreign objects." +msgstr "" + msgid "Nozzle Type" msgstr "" @@ -5956,17 +5958,23 @@ msgstr "正在匯入模型" msgid "prepare 3mf file..." msgstr "正在準備 3mf 檔案..." +msgid "Download failed, unknown file format." +msgstr "" + msgid "downloading project ..." msgstr "專案項目下載中..." +msgid "Download failed, File size exception." +msgstr "" + #, fuzzy, c-format, boost-format msgid "Project downloaded %d%%" msgstr "專案項目已下載 %d%%" msgid "" -"Importing to Orca Slicer failed. Please download the file and manually " +"Importing to Bambu Studio failed. Please download the file and manually " "import it." -msgstr "匯入 Orca Slicer 失敗。 請下載該檔案並手動匯入。" +msgstr "" msgid "Import SLA archive" msgstr "" @@ -6238,6 +6246,21 @@ msgstr "英製" msgid "Units" msgstr "單位" +msgid "Allow only one OrcaSlicer instance" +msgstr "" + +msgid "" +"On OSX there is always only one instance of app running by default. However " +"it is allowed to run multiple instances of same app from the command line. " +"In such case this settings will allow only one instance." +msgstr "" + +msgid "" +"If this is enabled, when starting OrcaSlicer and another instance of the " +"same OrcaSlicer is already running, that instance will be reactivated " +"instead." +msgstr "" + msgid "Home" msgstr "首頁" @@ -6313,6 +6336,14 @@ msgid "" "each printer automatically." msgstr "" +msgid "Multi-device Management(Take effect after restarting Studio)." +msgstr "" + +msgid "" +"With this option enabled, you can send a task to multiple devices at the " +"same time and manage multiple devices." +msgstr "" + msgid "Network" msgstr "" @@ -6974,6 +7005,9 @@ msgstr "使用微型雷射雷達進行自動流量校準" msgid "Modifying the device name" msgstr "修改列印設備名稱" +msgid "Bind with Pin Code" +msgstr "" + #, fuzzy msgid "Send to Printer SD card" msgstr "傳送到列印設備的 SD 記憶卡" @@ -7031,6 +7065,26 @@ msgstr "接收登入回覆逾時" msgid "Unknown Failure" msgstr "未知錯誤" +msgid "" +"Please Find the Pin Code in Account page on printer screen,\n" +" and type in the Pin Code below." +msgstr "" + +msgid "Can't find Pin Code?" +msgstr "" + +msgid "Pin Code" +msgstr "" + +msgid "Binding..." +msgstr "" + +msgid "Please confirm on the printer screen" +msgstr "" + +msgid "Log in failed. Please check the Pin Code." +msgstr "" + #, fuzzy msgid "Log in printer" msgstr "登入列印設備" @@ -7236,8 +7290,8 @@ msgstr "" msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "在錄製無工具頭縮時錄影影片時,建議增加“縮時錄影擦拭塔”\n" "右鍵單擊列印板的空白位置,選擇“新增標準模型”->“縮時錄影擦拭塔”。" @@ -8287,6 +8341,39 @@ msgstr "完成" msgid "resume" msgstr "" +msgid "Resume Printing" +msgstr "" + +msgid "Resume Printing(defects acceptable)" +msgstr "" + +msgid "Resume Printing(problem solved)" +msgstr "" + +msgid "Stop Printing" +msgstr "" + +msgid "Check Assistant" +msgstr "" + +msgid "Filament Extruded, Continue" +msgstr "" + +msgid "Not Extruded Yet, Retry" +msgstr "" + +msgid "Finished, Continue" +msgstr "" + +msgid "Load Filament" +msgstr "進料" + +msgid "Filament Loaded, Resume" +msgstr "" + +msgid "View Liveview" +msgstr "" + msgid "Confirm and Update Nozzle" msgstr "" @@ -10314,6 +10401,9 @@ msgstr "支撐立方體" msgid "Lightning" msgstr "閃電" +msgid "Cross Hatch" +msgstr "" + msgid "Sparse infill anchor length" msgstr "稀疏填充錨線長度" @@ -10496,10 +10586,10 @@ msgstr "滿速風扇在" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" "風扇速度將從“禁用第一層”的零線性上升到“全風扇速度層”的最大。如果低於“禁用風扇" "第一層”,則“全風扇速度第一層”將被忽略,在這種情況下,風扇將在“禁用風扇第一" @@ -13127,6 +13217,9 @@ msgstr "已取消" msgid "load_obj: failed to parse" msgstr "載入物件:無法分析" +msgid "load mtl in obj: failed to parse" +msgstr "" + #, fuzzy msgid "The file contains polygons with more than 4 vertices." msgstr "該檔案包含頂點超過 4 個的多邊形。" @@ -13262,6 +13355,14 @@ msgstr "請選擇要校準的線材。" msgid "The input value size must be 3." msgstr "輸入值大小必須為 3。" +msgid "" +"This machine type can only hold 16 history results per nozzle. You can " +"delete the existing historical results and then start calibration. Or you " +"can continue the calibration, but you cannot create new calibration " +"historical results. \n" +"Do you still want to continue the calibration?" +msgstr "" + #, fuzzy msgid "Connecting to printer..." msgstr "正在連接列印設備..." @@ -13273,6 +13374,19 @@ msgstr "測試失敗的結果已被刪除。" msgid "Flow Dynamics Calibration result has been saved to the printer" msgstr "動態流量校準的結果已儲存至列印設備。" +#, c-format, boost-format +msgid "" +"There is already a historical calibration result with the same name: %s. " +"Only one of the results with the same name is saved. Are you sure you want " +"to override the historical result?" +msgstr "" + +#, c-format, boost-format +msgid "" +"This machine type can only hold %d history results per nozzle. This result " +"will not be saved." +msgstr "" + msgid "Internal Error" msgstr "內部錯誤" @@ -13554,9 +13668,6 @@ msgstr "將列印一份測試模型。在校準之前,請清理列印板並將 msgid "Printing Parameters" msgstr "列印參數" -msgid "- ℃" -msgstr "" - msgid "Plate Type" msgstr "熱床類型" @@ -13604,12 +13715,6 @@ msgstr "" msgid "Step value" msgstr "" -msgid "0.5" -msgstr "" - -msgid "0.005" -msgstr "" - #, fuzzy msgid "The nozzle diameter has been synchronized from the printer Settings" msgstr "噴嘴直徑已從列印設備設定中同步" @@ -13638,10 +13743,14 @@ msgstr "重整歷史流量動態校準記錄" msgid "Action" msgstr "操作" +#, c-format, boost-format +msgid "This machine type can only hold %d history results per nozzle." +msgstr "" + msgid "Edit Flow Dynamics Calibration" msgstr "編輯動態流量校準" -msgid "New Flow Dynamics Calibration" +msgid "New Flow Dynamic Calibration" msgstr "" msgid "Ok" @@ -13650,13 +13759,6 @@ msgstr "" msgid "The filament must be selected." msgstr "" -#, c-format, boost-format -msgid "" -"There is already a historical calibration result with the same name: %s. " -"Only one of the results with the same name is saved. Are you sure you want " -"to override the historical result?" -msgstr "" - msgid "Network lookup" msgstr "搜尋網路" @@ -14060,8 +14162,8 @@ msgid "" msgstr "" msgid "" -"We would rename the presets as \"Vendor Type Serial @printer you " -"selected\". \n" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" "To add preset for more printers, Please go to printer selection" msgstr "" @@ -14609,6 +14711,175 @@ msgid "" "Error: \"%2%\"" msgstr "" +msgid "" +"It has a small layer height, and results in almost negligible layer lines " +"and high printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has lower speeds " +"and acceleration, and the sparse infill pattern is Gyroid. So, it results in " +"much higher printing quality, but a much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a slightly " +"bigger layer height, and results in almost negligible layer lines, and " +"slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a bigger layer " +"height, and results in slightly visible layer lines, but shorter printing " +"time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"height, and results in almost invisible layer lines and higher printing " +"quality, but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost invisible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of 0.2 mm nozzle, it has a smaller layer " +"height, and results in minimal layer lines and higher printing quality, but " +"shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer " +"lines, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in minimal layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"It has a general layer height, and results in general layer lines and " +"printing quality. It is suitable for most general printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but slightly shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in less apparent layer lines and much higher printing " +"quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, lower speeds and acceleration, and the sparse infill pattern is " +"Gyroid. So, it results in almost negligible layer lines and much higher " +"printing quality, but much longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer " +"height, and results in almost negligible layer lines and longer printing " +"time." +msgstr "" + +msgid "" +"It has a big layer height, and results in apparent layer lines and ordinary " +"printing quality and printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has more wall loops " +"and a higher sparse infill density. So, it results in higher strength of the " +"prints, but more filament consumption and longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in more apparent layer lines and lower printing quality, " +"but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer " +"height, and results in much more apparent layer lines and much lower " +"printing quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and slight higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer " +"height, and results in less apparent layer lines and higher printing " +"quality, but longer printing time." +msgstr "" + +msgid "" +"It has a very big layer height, and results in very apparent layer lines, " +"low printing quality and general printing time." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a bigger layer " +"height, and results in very apparent layer lines and much lower printing " +"quality, but shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a much bigger " +"layer height, and results in extremely apparent layer lines and much lower " +"printing quality, but much shorter printing time in some printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a slightly " +"smaller layer height, and results in slightly less but still apparent layer " +"lines and slightly higher printing quality, but longer printing time in some " +"printing cases." +msgstr "" + +msgid "" +"Compared with the default profile of a 0.8 mm nozzle, it has a smaller layer " +"height, and results in less but still apparent layer lines and slightly " +"higher printing quality, but longer printing time in some printing cases." +msgstr "" + msgid "Connected to Obico successfully!" msgstr "" @@ -14980,6 +15251,22 @@ msgid "" "probability of warping." msgstr "" +#~ msgid "Unload Filament" +#~ msgstr "退料" + +#~ msgid "" +#~ "Choose an AMS slot then press \"Load\" or \"Unload\" button to " +#~ "automatically load or unload filiament." +#~ msgstr "選擇 1 個 AMS 槽位,然後點擊進料/退料按鈕以自動進料/退料。" + +#~ msgid "MainBoard" +#~ msgstr "主板" + +#~ msgid "" +#~ "Importing to Orca Slicer failed. Please download the file and manually " +#~ "import it." +#~ msgstr "匯入 Orca Slicer 失敗。 請下載該檔案並手動匯入。" + #~ msgid "active" #~ msgstr "活動的" diff --git a/resources/images/bind_device_ping_code.svg b/resources/images/bind_device_ping_code.svg new file mode 100644 index 0000000000..5c1ff4742d --- /dev/null +++ b/resources/images/bind_device_ping_code.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/images/param_crosshatch.svg b/resources/images/param_crosshatch.svg new file mode 100644 index 0000000000..03a1f04a71 --- /dev/null +++ b/resources/images/param_crosshatch.svg @@ -0,0 +1,570 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/images/tab_calibration_active.svg b/resources/images/tab_calibration_active.svg new file mode 100644 index 0000000000..71bfdfc451 --- /dev/null +++ b/resources/images/tab_calibration_active.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/tab_multi_active.svg b/resources/images/tab_multi_active.svg new file mode 100644 index 0000000000..dc776469e5 --- /dev/null +++ b/resources/images/tab_multi_active.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/toolbar_double_directional_arrow.svg b/resources/images/toolbar_double_directional_arrow.svg new file mode 100644 index 0000000000..4cc9b2ecb3 --- /dev/null +++ b/resources/images/toolbar_double_directional_arrow.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/resources/info/filament_info.json b/resources/info/filament_info.json index 673e1a89a7..8472e66462 100644 --- a/resources/info/filament_info.json +++ b/resources/info/filament_info.json @@ -1,27 +1,38 @@ { - "version": "1.0.0.1", + "version": "1.0.0.2", "high_temp_filament": [ "ABS", "ASA", "PC", "PA", "PA-CF", + "PA-GF", "PA6-CF", "PET-CF", "PPS", "PPS-CF", "PPA-CF", - "PPA-GF" + "PPA-GF", + "ABS-GF", + "ASA-Aero" ], "low_temp_filament": [ "PLA", "TPU", "PLA-CF", "PLA-AERO", - "PVA" + "PVA", + "BVOH" ], "high_low_compatible_filament":[ "HIPS", - "PETG" + "PETG", + "PE", + "PP", + "EVA", + "PE-CF", + "PP-CF", + "PP-GF", + "PHA" ] } \ No newline at end of file diff --git a/resources/profiles/BBL.json b/resources/profiles/BBL.json index 2afe0897df..034f24f992 100644 --- a/resources/profiles/BBL.json +++ b/resources/profiles/BBL.json @@ -1,7 +1,7 @@ { "name": "Bambulab", "url": "http://www.bambulab.com/Parameters/vendor/BBL.json", - "version": "01.09.00.04", + "version": "01.09.00.07", "force_update": "0", "description": "the initial version of BBL configurations", "machine_model_list": [ diff --git a/resources/profiles/BBL/filament/P1P/Bambu PLA Basic @BBL P1P 0.2 nozzle.json b/resources/profiles/BBL/filament/P1P/Bambu PLA Basic @BBL P1P 0.2 nozzle.json index 815cca5839..bca893a5dc 100644 --- a/resources/profiles/BBL/filament/P1P/Bambu PLA Basic @BBL P1P 0.2 nozzle.json +++ b/resources/profiles/BBL/filament/P1P/Bambu PLA Basic @BBL P1P 0.2 nozzle.json @@ -11,6 +11,12 @@ "fan_min_speed": [ "50" ], + "filament_long_retractions_when_cut": [ + "1" + ], + "filament_retraction_distances_when_cut": [ + "18" + ], "filament_max_volumetric_speed": [ "2" ], diff --git a/resources/profiles/BBL/filament/P1P/Bambu PLA Basic @BBL P1P.json b/resources/profiles/BBL/filament/P1P/Bambu PLA Basic @BBL P1P.json index d64ab7e7d1..a54e7bea5d 100644 --- a/resources/profiles/BBL/filament/P1P/Bambu PLA Basic @BBL P1P.json +++ b/resources/profiles/BBL/filament/P1P/Bambu PLA Basic @BBL P1P.json @@ -8,6 +8,12 @@ "fan_cooling_layer_time": [ "80" ], + "filament_long_retractions_when_cut": [ + "1" + ], + "filament_retraction_distances_when_cut": [ + "18" + ], "fan_min_speed": [ "50" ], diff --git a/resources/profiles/BBL/filament/fdm_filament_abs.json b/resources/profiles/BBL/filament/fdm_filament_abs.json index 461dd5e610..74eb871518 100644 --- a/resources/profiles/BBL/filament/fdm_filament_abs.json +++ b/resources/profiles/BBL/filament/fdm_filament_abs.json @@ -5,7 +5,7 @@ "from": "system", "instantiation": "false", "activate_air_filtration": [ - "1" + "0" ], "cool_plate_temp": [ "0" diff --git a/resources/profiles/BBL/filament/fdm_filament_asa.json b/resources/profiles/BBL/filament/fdm_filament_asa.json index ac7a9294c1..a0da767a75 100644 --- a/resources/profiles/BBL/filament/fdm_filament_asa.json +++ b/resources/profiles/BBL/filament/fdm_filament_asa.json @@ -5,7 +5,7 @@ "from": "system", "instantiation": "false", "activate_air_filtration": [ - "1" + "0" ], "cool_plate_temp": [ "0" diff --git a/resources/profiles/BBL/machine/Bambu Lab A1 0.4 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab A1 0.4 nozzle.json index 078e12ae45..27e716bc73 100644 --- a/resources/profiles/BBL/machine/Bambu Lab A1 0.4 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab A1 0.4 nozzle.json @@ -61,9 +61,9 @@ "255" ], "scan_first_layer": "0", - "machine_start_gcode": ";===== machine: A1 =========================\n;===== date: 20240311 =====================\nG392 S0\n;M400\n;M73 P1.717\n\n;===== start to heat heatbead&hotend==========\nM1002 gcode_claim_action : 2\nM1002 set_filament_type:{filament_type[initial_no_support_extruder]}\nM104 S140\nM140 S[bed_temperature_initial_layer_single]\n\n;=====start printer sound ===================\nM17\nM400 S1\nM1006 S1\nM1006 A0 B10 L100 C37 D10 M60 E37 F10 N60\nM1006 A0 B10 L100 C41 D10 M60 E41 F10 N60\nM1006 A0 B10 L100 C44 D10 M60 E44 F10 N60\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N60\nM1006 A43 B10 L100 C46 D10 M70 E39 F10 N80\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N80\nM1006 A0 B10 L100 C43 D10 M60 E39 F10 N80\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N80\nM1006 A0 B10 L100 C41 D10 M80 E41 F10 N80\nM1006 A0 B10 L100 C44 D10 M80 E44 F10 N80\nM1006 A0 B10 L100 C49 D10 M80 E49 F10 N80\nM1006 A0 B10 L100 C0 D10 M80 E0 F10 N80\nM1006 A44 B10 L100 C48 D10 M60 E39 F10 N80\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N80\nM1006 A0 B10 L100 C44 D10 M80 E39 F10 N80\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N80\nM1006 A43 B10 L100 C46 D10 M60 E39 F10 N80\nM1006 W\nM18 \n;=====start printer sound ===================\n\n;=====avoid end stop =================\nG91\nG380 S2 Z40 F1200\nG380 S3 Z-15 F1200\nG90\n\n;===== reset machine status =================\n;M290 X39 Y39 Z8\nM204 S6000\n\nM630 S0 P0\nG91\nM17 Z0.3 ; lower the z-motor current\n\nG90\nM17 X0.65 Y1.2 Z0.6 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\n;M211 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\n\n;====== cog noise reduction=================\nM982.2 S1 ; turn on cog noise reduction\n\nM1002 gcode_claim_action : 13\n\nG28 X\nG91\nG1 Z5 F1200\nG90\nG0 X128 F30000\nG0 Y254 F3000\nG91\nG1 Z-5 F1200\n\nM109 S25 H140\n\nM17 E0.3\nM83\nG1 E10 F1200\nG1 E-0.5 F30\nM17 D\n\nG28 Z P0 T140; home z with low precision,permit 300deg temperature\nM104 S{nozzle_temperature_initial_layer[initial_extruder]}\n\nM1002 judge_flag build_plate_detect_flag\nM622 S1\n G39.4\n G90\n G1 Z5 F1200\nM623\n\n;M400\n;M73 P1.717\n\n;===== prepare print temperature and material ==========\nM1002 gcode_claim_action : 24\n\nM400\n;G392 S1\nM211 X0 Y0 Z0 ;turn off soft endstop\nM975 S1 ; turn on\n\nG90\nG1 X-28.5 F30000\nG1 X-48.2 F3000\n\nM620 M ;enable remap\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M1002 gcode_claim_action : 4\n M400\n M1002 set_filament_type:UNKNOWN\n M109 S[nozzle_temperature_initial_layer]\n M104 S250\n M400\n T[initial_no_support_extruder]\n G1 X-48.2 F3000\n M400\n\n M620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n M109 S250 ;set nozzle to common flush temp\n M106 P1 S0\n G92 E0\n G1 E50 F200\n M400\n M1002 set_filament_type:{filament_type[initial_no_support_extruder]}\nM621 S[initial_no_support_extruder]A\n\nM109 S{nozzle_temperature_range_high[initial_no_support_extruder]} H300\nG92 E0\nG1 E50 F200 ; lower extrusion speed to avoid clog\nM400\nM106 P1 S178\nG92 E0\nG1 E5 F200\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG92 E0\nG1 E-0.5 F300\n\nG1 X-28.5 F30000\nG1 X-48.2 F3000\nG1 X-28.5 F30000 ;wipe and shake\nG1 X-48.2 F3000\nG1 X-28.5 F30000 ;wipe and shake\nG1 X-48.2 F3000\n\n;G392 S0\n\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n;M400\n;M73 P1.717\n\n;===== auto extrude cali start =========================\nM975 S1\n;G392 S1\n\nG90\nM83\nT1000\nG1 X-48.2 Y0 Z10 F10000\nM400\nM1002 set_filament_type:UNKNOWN\n\nM412 S1 ; ===turn on filament runout detection===\nM400 P10\nM620.3 W1; === turn on filament tangle detection===\nM400 S2\n\nM1002 set_filament_type:{filament_type[initial_no_support_extruder]}\n\n;M1002 set_flag extrude_cali_flag=1\nM1002 judge_flag extrude_cali_flag\n\nM622 J1\n M1002 gcode_claim_action : 8\n\n M109 S{nozzle_temperature[initial_extruder]}\n G1 E10 F{outer_wall_volumetric_speed/2.4*60}\n M983 F{outer_wall_volumetric_speed/2.4} A0.3 H[nozzle_diameter]; cali dynamic extrusion compensation\n\n M106 P1 S255\n M400 S5\n G1 X-28.5 F18000\n G1 X-48.2 F3000\n G1 X-28.5 F18000 ;wipe and shake\n G1 X-48.2 F3000\n G1 X-28.5 F12000 ;wipe and shake\n G1 X-48.2 F3000\n M400\n M106 P1 S0\n\n M1002 judge_last_extrude_cali_success\n M622 J0\n M983 F{outer_wall_volumetric_speed/2.4} A0.3 H[nozzle_diameter]; cali dynamic extrusion compensation\n M106 P1 S255\n M400 S5\n G1 X-28.5 F18000\n G1 X-48.2 F3000\n G1 X-28.5 F18000 ;wipe and shake\n G1 X-48.2 F3000\n G1 X-28.5 F12000 ;wipe and shake\n M400\n M106 P1 S0\n M623\n \n G1 X-48.2 F3000\n M400\n M984 A0.1 E1 S1 F{outer_wall_volumetric_speed/2.4}\n M106 P1 S178\n M400 S7\n G1 X-28.5 F18000\n G1 X-48.2 F3000\n G1 X-28.5 F18000 ;wipe and shake\n G1 X-48.2 F3000\n G1 X-28.5 F12000 ;wipe and shake\n G1 X-48.2 F3000\n M400\n M106 P1 S0\nM623 ; end of \"draw extrinsic para cali paint\"\n\n;G392 S0\n;===== auto extrude cali end ========================\n\n;M400\n;M73 P1.717\n\nM104 S170 ; prepare to wipe nozzle\nM106 S255 ; turn on fan\n\n;===== mech mode fast check start =====================\nM1002 gcode_claim_action : 3\n\nG1 X128 Y128 F20000\nG1 Z5 F1200\nM400 P200\nM970.3 Q1 A5 K0 O3\nM974 Q1 S2 P0\n\nM970.2 Q1 K1 W58 Z0.11\nM974 S2\n\nG1 X128 Y128 F20000\nG1 Z5 F1200\nM400 P200\nM970.3 Q0 A10 K0 O1\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X0 Y5\nG28 X ; re-home XY\n\nG1 Z4 F1200\n\n;===== mech mode fast check end =======================\n\n;M400\n;M73 P1.717\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\n\nM975 S1\nM106 S255 ; turn on fan (G28 has turn off fan)\nM211 S; push soft endstop status\nM211 X0 Y0 Z0 ;turn off Z axis endstop\n\n;===== remove waste by touching start =====\n\nM104 S170 ; set temp down to heatbed acceptable\n\nM83\nG1 E-1 F500\nG90\nM83\n\nM109 S170\nG0 X108 Y-0.5 F30000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X110 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X112 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X114 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X116 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X118 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X120 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X122 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X124 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X126 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X128 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X130 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X132 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X134 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X136 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X138 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X140 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X142 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X144 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X146 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X148 F10000\nG380 S3 Z-5 F1200\n\nG1 Z5 F30000\n;===== remove waste by touching end =====\n\nG1 Z10 F1200\nG0 X118 Y261 F30000\nG1 Z5 F1200\nM109 S{nozzle_temperature_initial_layer[initial_extruder]-50}\n\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nM104 S140 ; prepare to abl\nG0 Z5 F20000\n\nG0 X128 Y261 F20000 ; move to exposed steel surface\nG0 Z-1.01 F1200 ; stop the nozzle\n\nG91\nG2 I1 J0 X2 Y0 F2000.1\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\n\nG90\nG1 Z10 F1200\n\n;===== brush material wipe nozzle =====\n\nG90\nG1 Y250 F30000\nG1 X55\nG1 Z1.300 F1200\nG1 Y262.5 F6000\nG91\nG1 X-35 F30000\nG1 Y-0.5\nG1 X45\nG1 Y-0.5\nG1 X-45\nG1 Y-0.5\nG1 X45\nG1 Y-0.5\nG1 X-45\nG1 Y-0.5\nG1 X45\nG1 Z5.000 F1200\n\nG90\nG1 X30 Y250.000 F30000\nG1 Z1.300 F1200\nG1 Y262.5 F6000\nG91\nG1 X35 F30000\nG1 Y-0.5\nG1 X-45\nG1 Y-0.5\nG1 X45\nG1 Y-0.5\nG1 X-45\nG1 Y-0.5\nG1 X45\nG1 Y-0.5\nG1 X-45\nG1 Z10.000 F1200\n\n;===== brush material wipe nozzle end =====\n\nG90\n;G0 X128 Y261 F20000 ; move to exposed steel surface\nG1 Y250 F30000\nG1 X138\nG1 Y261\nG0 Z-1.01 F1200 ; stop the nozzle\n\nG91\nG2 I1 J0 X2 Y0 F2000.1\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\n\nM109 S140\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM211 R; pop softend status\n\n;===== wipe nozzle end ================================\n\n;M400\n;M73 P1.717\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\n\nG90\nG1 Z5 F1200\nG1 X0 Y0 F30000\nG29.2 S1 ; turn on ABL\n\nM190 S[bed_temperature_initial_layer_single]; ensure bed temp\nM109 S140\nM106 S0 ; turn off fan , too noisy\n\nM622 J1\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n\n;===== home after wipe mouth end =======================\n\n;M400\n;M73 P1.717\n\nM104 S{nozzle_temperature_initial_layer[initial_extruder]} ; prepare to print\n\n;===== nozzle load line ===============================\n;G90\n;M83\n;G1 Z5 F1200\n;G1 X88 Y-0.5 F20000\n;G1 Z0.3 F1200\n\n;M109 S{nozzle_temperature_initial_layer[initial_extruder]}\n\n;G1 E2 F300\n;G1 X168 E4.989 F6000\n;G1 Z1 F1200\n;===== nozzle load line end ===========================\n\n;===== extrude cali test ===============================\n\nM400\n M900 S\n\n M900 C\n G90\n M83\n G1 X78.000 Y-0.500 F30000\n G1 Z0.300 F1200\n\n M109 S{nozzle_temperature_initial_layer[initial_extruder]}\n G1 E3 F300\n\n G1 X83.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X88.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X93.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X98.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X103.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X108.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X113.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X118.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X123.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X128.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X133.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X138.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X143.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X148.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X153.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X158.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X163.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X168.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X173.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X178.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X179 Z0\n G1 X183\n G1 Z1\n M400\n\n M900 R\n G90\n M83\n G1 X78.000 Y1.000 F30000\n G1 Z0.300 F1200\n G1 E0.5 F300\n G1 X83.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X88.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X93.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X98.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X103.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X108.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X113.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X118.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X123.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X128.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X133.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X138.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X143.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X148.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X153.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X158.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X163.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X168.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X173.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X178.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X179 Z0\n G1 X183\n G1 Z1\n M400\n\nG1 Z0.2\n\n;M400\n;M73 P1.717\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.02} ; for Textured PEI Plate\n{endif}\n\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\n\nM211 X0 Y0 Z0 ;turn off soft endstop\n;G392 S1 ; turn on clog detection\nM1007 S1 ; turn on mass estimation\nG29.4\n", + "machine_start_gcode": ";===== machine: A1 =========================\n;===== date: 20240104 =====================\nG392 S0\nM9833.2\n;M400\n;M73 P1.717\n\n;===== start to heat heatbead&hotend==========\nM1002 gcode_claim_action : 2\nM1002 set_filament_type:{filament_type[initial_no_support_extruder]}\nM104 S140\nM140 S[bed_temperature_initial_layer_single]\n\n;=====start printer sound ===================\nM17\nM400 S1\nM1006 S1\nM1006 A0 B10 L100 C37 D10 M60 E37 F10 N60\nM1006 A0 B10 L100 C41 D10 M60 E41 F10 N60\nM1006 A0 B10 L100 C44 D10 M60 E44 F10 N60\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N60\nM1006 A43 B10 L100 C46 D10 M70 E39 F10 N80\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N80\nM1006 A0 B10 L100 C43 D10 M60 E39 F10 N80\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N80\nM1006 A0 B10 L100 C41 D10 M80 E41 F10 N80\nM1006 A0 B10 L100 C44 D10 M80 E44 F10 N80\nM1006 A0 B10 L100 C49 D10 M80 E49 F10 N80\nM1006 A0 B10 L100 C0 D10 M80 E0 F10 N80\nM1006 A44 B10 L100 C48 D10 M60 E39 F10 N80\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N80\nM1006 A0 B10 L100 C44 D10 M80 E39 F10 N80\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N80\nM1006 A43 B10 L100 C46 D10 M60 E39 F10 N80\nM1006 W\nM18 \n;=====start printer sound ===================\n\n;=====avoid end stop =================\nG91\nG380 S2 Z40 F1200\nG380 S3 Z-15 F1200\nG90\n\n;===== reset machine status =================\n;M290 X39 Y39 Z8\nM204 S6000\n\nM630 S0 P0\nG91\nM17 Z0.3 ; lower the z-motor current\n\nG90\nM17 X0.65 Y1.2 Z0.6 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\n;M211 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\n\n;====== cog noise reduction=================\nM982.2 S1 ; turn on cog noise reduction\n\nM1002 gcode_claim_action : 13\n\nG28 X\nG91\nG1 Z5 F1200\nG90\nG0 X128 F30000\nG0 Y254 F3000\nG91\nG1 Z-5 F1200\n\nM109 S10 H140\n\nM17 E0.3\nM83\nG1 E10 F1200\nG1 E-0.5 F30\nM17 D\n\nG28 Z P0 T140; home z with low precision,permit 300deg temperature\nM104 S{nozzle_temperature_initial_layer[initial_extruder]}\n\nM1002 judge_flag build_plate_detect_flag\nM622 S1\n G39.4\n G90\n G1 Z5 F1200\nM623\n\n;M400\n;M73 P1.717\n\n;===== prepare print temperature and material ==========\nM1002 gcode_claim_action : 24\n\nM400\n;G392 S1\nM211 X0 Y0 Z0 ;turn off soft endstop\nM975 S1 ; turn on\n\nG90\nG1 X-28.5 F30000\nG1 X-48.2 F3000\n\nM620 M ;enable remap\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M1002 gcode_claim_action : 4\n M400\n M1002 set_filament_type:UNKNOWN\n M109 S[nozzle_temperature_initial_layer]\n M104 S250\n M400\n T[initial_no_support_extruder]\n G1 X-48.2 F3000\n M400\n\n M620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n M109 S250 ;set nozzle to common flush temp\n M106 P1 S0\n G92 E0\n G1 E50 F200\n M400\n M1002 set_filament_type:{filament_type[initial_no_support_extruder]}\nM621 S[initial_no_support_extruder]A\n\nM109 S{nozzle_temperature_range_high[initial_no_support_extruder]} H300\nG92 E0\nG1 E50 F200 ; lower extrusion speed to avoid clog\nM400\nM106 P1 S178\nG92 E0\nG1 E5 F200\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG92 E0\nG1 E-0.5 F300\n\nG1 X-28.5 F30000\nG1 X-48.2 F3000\nG1 X-28.5 F30000 ;wipe and shake\nG1 X-48.2 F3000\nG1 X-28.5 F30000 ;wipe and shake\nG1 X-48.2 F3000\n\n;G392 S0\n\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n;M400\n;M73 P1.717\n\n;===== auto extrude cali start =========================\nM975 S1\n;G392 S1\n\nG90\nM83\nT1000\nG1 X-48.2 Y0 Z10 F10000\nM400\nM1002 set_filament_type:UNKNOWN\n\nM412 S1 ; ===turn on filament runout detection===\nM400 P10\nM620.3 W1; === turn on filament tangle detection===\nM400 S2\n\nM1002 set_filament_type:{filament_type[initial_no_support_extruder]}\n\n;M1002 set_flag extrude_cali_flag=1\nM1002 judge_flag extrude_cali_flag\n\nM622 J1\n M1002 gcode_claim_action : 8\n\n M109 S{nozzle_temperature[initial_extruder]}\n G1 E10 F{outer_wall_volumetric_speed/2.4*60}\n M983 F{outer_wall_volumetric_speed/2.4} A0.3 H[nozzle_diameter]; cali dynamic extrusion compensation\n\n M106 P1 S255\n M400 S5\n G1 X-28.5 F18000\n G1 X-48.2 F3000\n G1 X-28.5 F18000 ;wipe and shake\n G1 X-48.2 F3000\n G1 X-28.5 F12000 ;wipe and shake\n G1 X-48.2 F3000\n M400\n M106 P1 S0\n\n M1002 judge_last_extrude_cali_success\n M622 J0\n M983 F{outer_wall_volumetric_speed/2.4} A0.3 H[nozzle_diameter]; cali dynamic extrusion compensation\n M106 P1 S255\n M400 S5\n G1 X-28.5 F18000\n G1 X-48.2 F3000\n G1 X-28.5 F18000 ;wipe and shake\n G1 X-48.2 F3000\n G1 X-28.5 F12000 ;wipe and shake\n M400\n M106 P1 S0\n M623\n \n G1 X-48.2 F3000\n M400\n M984 A0.1 E1 S1 F{outer_wall_volumetric_speed/2.4}\n M106 P1 S178\n M400 S7\n G1 X-28.5 F18000\n G1 X-48.2 F3000\n G1 X-28.5 F18000 ;wipe and shake\n G1 X-48.2 F3000\n G1 X-28.5 F12000 ;wipe and shake\n G1 X-48.2 F3000\n M400\n M106 P1 S0\nM623 ; end of \"draw extrinsic para cali paint\"\n\n;G392 S0\n;===== auto extrude cali end ========================\n\n;M400\n;M73 P1.717\n\nM104 S170 ; prepare to wipe nozzle\nM106 S255 ; turn on fan\n\n;===== mech mode fast check start =====================\nM1002 gcode_claim_action : 3\n\nG1 X128 Y128 F20000\nG1 Z5 F1200\nM400 P200\nM970.3 Q1 A5 K0 O3\nM974 Q1 S2 P0\n\nM970.2 Q1 K1 W58 Z0.11\nM974 S2\n\nG1 X128 Y128 F20000\nG1 Z5 F1200\nM400 P200\nM970.3 Q0 A10 K0 O1\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X0 Y5\nG28 X ; re-home XY\n\nG1 Z4 F1200\n\n;===== mech mode fast check end =======================\n\n;M400\n;M73 P1.717\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\n\nM975 S1\nM106 S255 ; turn on fan (G28 has turn off fan)\nM211 S; push soft endstop status\nM211 X0 Y0 Z0 ;turn off Z axis endstop\n\n;===== remove waste by touching start =====\n\nM104 S170 ; set temp down to heatbed acceptable\n\nM83\nG1 E-1 F500\nG90\nM83\n\nM109 S170\nG0 X108 Y-0.5 F30000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X110 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X112 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X114 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X116 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X118 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X120 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X122 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X124 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X126 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X128 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X130 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X132 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X134 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X136 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X138 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X140 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X142 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X144 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X146 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X148 F10000\nG380 S3 Z-5 F1200\n\nG1 Z5 F30000\n;===== remove waste by touching end =====\n\nG1 Z10 F1200\nG0 X118 Y261 F30000\nG1 Z5 F1200\nM109 S{nozzle_temperature_initial_layer[initial_extruder]-50}\n\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nM104 S140 ; prepare to abl\nG0 Z5 F20000\n\nG0 X128 Y261 F20000 ; move to exposed steel surface\nG0 Z-1.01 F1200 ; stop the nozzle\n\nG91\nG2 I1 J0 X2 Y0 F2000.1\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\n\nG90\nG1 Z10 F1200\n\n;===== brush material wipe nozzle =====\n\nG90\nG1 Y250 F30000\nG1 X55\nG1 Z1.300 F1200\nG1 Y262.5 F6000\nG91\nG1 X-35 F30000\nG1 Y-0.5\nG1 X45\nG1 Y-0.5\nG1 X-45\nG1 Y-0.5\nG1 X45\nG1 Y-0.5\nG1 X-45\nG1 Y-0.5\nG1 X45\nG1 Z5.000 F1200\n\nG90\nG1 X30 Y250.000 F30000\nG1 Z1.300 F1200\nG1 Y262.5 F6000\nG91\nG1 X35 F30000\nG1 Y-0.5\nG1 X-45\nG1 Y-0.5\nG1 X45\nG1 Y-0.5\nG1 X-45\nG1 Y-0.5\nG1 X45\nG1 Y-0.5\nG1 X-45\nG1 Z10.000 F1200\n\n;===== brush material wipe nozzle end =====\n\nG90\n;G0 X128 Y261 F20000 ; move to exposed steel surface\nG1 Y250 F30000\nG1 X138\nG1 Y261\nG0 Z-1.01 F1200 ; stop the nozzle\n\nG91\nG2 I1 J0 X2 Y0 F2000.1\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\n\nM109 S140\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM211 R; pop softend status\n\n;===== wipe nozzle end ================================\n\n;M400\n;M73 P1.717\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\n\nG90\nG1 Z5 F1200\nG1 X0 Y0 F30000\nG29.2 S1 ; turn on ABL\n\nM190 S[bed_temperature_initial_layer_single]; ensure bed temp\nM109 S140\nM106 S0 ; turn off fan , too noisy\n\nM622 J1\n M1002 gcode_claim_action : 1\n G29 A1 X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n\n;===== home after wipe mouth end =======================\n\n;M400\n;M73 P1.717\n\nG1 X108.000 Y-0.500 F30000\nG1 Z0.300 F1200\nM400\nG2814 Z0.32\n\nM104 S{nozzle_temperature_initial_layer[initial_extruder]} ; prepare to print\n\n;===== nozzle load line ===============================\n;G90\n;M83\n;G1 Z5 F1200\n;G1 X88 Y-0.5 F20000\n;G1 Z0.3 F1200\n\n;M109 S{nozzle_temperature_initial_layer[initial_extruder]}\n\n;G1 E2 F300\n;G1 X168 E4.989 F6000\n;G1 Z1 F1200\n;===== nozzle load line end ===========================\n\n;===== extrude cali test ===============================\n\nM400\n M900 S\n\n M900 C\n G90\n M83\n M109 S{nozzle_temperature_initial_layer[initial_extruder]}\n G0 X128 E10 F{outer_wall_volumetric_speed/(24/20) * 60}\n G0 X133 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\n G0 X138 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X143 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\n G0 X148 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X153 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\n G91\n G1 X1 Z-0.300\n G1 X4\n G1 Z1 F1200\n G90\n M400\n\n M900 R\n G90\n G1 X108.000 Y4.500 F30000\n G91\n G1 Z-0.700 F1200\n G90\n M83\n G0 X128 E10 F{outer_wall_volumetric_speed/(24/20) * 60}\n G0 X133 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\n G0 X138 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X143 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\n G0 X148 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X153 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\n G91\n G1 X1 Z-0.300\n G1 X4\n G1 Z1 F1200\n G90\n M400\n\nG1 Z0.2\n\n;M400\n;M73 P1.717\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.02} ; for Textured PEI Plate\n{endif}\n\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\n\nM211 X0 Y0 Z0 ;turn off soft endstop\n;G392 S1 ; turn on clog detection\nM1007 S1 ; turn on mass estimation\nG29.4\n", "machine_end_gcode": ";===== date: 20231229 =====================\nG392 S0 ;turn off nozzle clog detect\n\nM400 ; wait for buffer to clear\nG92 E0 ; zero the extruder\nG1 E-0.8 F1800 ; retract\nG1 Z{max_layer_z + 0.5} F900 ; lower z a little\nG1 X0 Y{first_layer_center_no_wipe_tower[1]} F18000 ; move to safe pos\nG1 X-13.0 F3000 ; move to safe pos\n{if !spiral_mode && print_sequence != \"by object\"}\nM1002 judge_flag timelapse_record_flag\nM622 J1\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM991 S0 P-1 ;end timelapse at safe pos\nM623\n{endif}\n\nM140 S0 ; turn off bed\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off remote part cooling fan\nM106 P3 S0 ; turn off chamber cooling fan\n\n;G1 X27 F15000 ; wipe\n\n; pull back filament to AMS\nM620 S255\nG1 X267 F15000\nT255\nG1 X-28.5 F18000\nG1 X-48.2 F3000\nG1 X-28.5 F18000\nG1 X-48.2 F3000\nM621 S255\n\nM104 S0 ; turn off hotend\n\nM400 ; wait all motion done\nM17 S\nM17 Z0.4 ; lower z motor current to reduce impact if there is something in the bottom\n{if (max_layer_z + 100.0) < 256}\n G1 Z{max_layer_z + 100.0} F600\n G1 Z{max_layer_z +98.0}\n{else}\n G1 Z256 F600\n G1 Z256\n{endif}\nM400 P100\nM17 R ; restore z current\n\nG90\nG1 X-48 Y180 F3600\n\nM220 S100 ; Reset feedrate magnitude\nM201.2 K1.0 ; Reset acc magnitude\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 0\n\n;=====printer finish sound=========\nM17\nM400 S1\nM1006 S1\nM1006 A0 B20 L100 C37 D20 M40 E42 F20 N60\nM1006 A0 B10 L100 C44 D10 M60 E44 F10 N60\nM1006 A0 B10 L100 C46 D10 M80 E46 F10 N80\nM1006 A44 B20 L100 C39 D20 M60 E48 F20 N60\nM1006 A0 B10 L100 C44 D10 M60 E44 F10 N60\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N60\nM1006 A0 B10 L100 C39 D10 M60 E39 F10 N60\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N60\nM1006 A0 B10 L100 C44 D10 M60 E44 F10 N60\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N60\nM1006 A0 B10 L100 C39 D10 M60 E39 F10 N60\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N60\nM1006 A0 B10 L100 C48 D10 M60 E44 F10 N80\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N80\nM1006 A44 B20 L100 C49 D20 M80 E41 F20 N80\nM1006 A0 B20 L100 C0 D20 M60 E0 F20 N80\nM1006 A0 B20 L100 C37 D20 M30 E37 F20 N60\nM1006 W\n;=====printer finish sound=========\n\n;M17 X0.8 Y0.8 Z0.5 ; lower motor current to 45% power\nM400\nM18 X Y Z\n\n", "layer_change_gcode": "; layer num/total_layer_count: {layer_num+1}/[total_layer_count]\n; update layer progress\nM73 L{layer_num+1}\nM991 S0 P{layer_num} ;notify layer change", "time_lapse_gcode": ";===================== date: 20231215 =====================\n{if !spiral_mode && print_sequence != \"by object\"}\n; don't support timelapse gcode in spiral_mode and by object sequence for I3 structure printer\nM622.1 S1 ; for prev firware, default turned on\nM1002 judge_flag timelapse_record_flag\nM622 J1\nG92 E0\nG17\nG2 Z{layer_z + 0.4} I0.86 J0.86 P1 F20000 ; spiral lift a little\nG1 Z{max_layer_z + 0.4}\nG1 X0 Y{first_layer_center_no_wipe_tower[1]} F18000 ; move to safe pos\nG1 X-48.2 F3000 ; move to safe pos\nM400 P300\nM971 S11 C11 O0\nG92 E0\nG1 X0 F18000\nM623\n\nM622.1 S1\nM1002 judge_flag g39_detection_flag\nM622 J1 \n ; enable nozzle clog detect at 3rd layer\n {if layer_num == 2}\n M400\n G90\n M83\n M204 S5000\n G0 Z2 F4000\n G0 X261 Y250 F20000\n M400 P200\n G39 S1\n G0 Z2 F4000\n {endif}\n\n {if !in_head_wrap_detect_zone}\n M622.1 S0\n M1002 judge_flag g39_mass_exceed_flag\n M622 J1\n {if layer_num > 2}\n G392 S0\n M400\n G90\n M83\n M204 S5000\n G0 Z{max_layer_z + 0.4} F4000\n G39.3 S1\n G0 Z{max_layer_z + 0.4} F4000\n G392 S0\n {endif}\n M623\n {endif}\nM623\n{endif}\n", - "change_filament_gcode": ";===== machine: A1 =========================\n;===== date: 20231225 =======================\nM1007 S0 ; turn off mass estimation\nG392 S0\nM620 S[next_extruder]A\nM204 S9000\n{if toolchange_count > 1}\nG17\nG2 Z{max_layer_z + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\n{endif}\nG1 Z{max_layer_z + 3.0} F1200\n\nM400\nM106 P1 S0\nM106 P2 S0\n{if old_filament_temp > 142 && next_extruder < 255}\nM104 S[old_filament_temp]\n{endif}\n\nG1 X267 F18000\nM620.1 E F[old_filament_e_feedrate] T{nozzle_temperature_range_high[previous_extruder]}\nM620.10 A0 F[old_filament_e_feedrate]\nT[next_extruder]\nM620.1 E F[new_filament_e_feedrate] T{nozzle_temperature_range_high[next_extruder]}\nM620.10 A1 F[new_filament_e_feedrate] L[flush_length] H[nozzle_diameter] T[nozzle_temperature_range_high]\n\nG1 Y128 F9000\n\n{if next_extruder < 255}\nM400\n\nG92 E0\nM628 S0\n\n{if flush_length_1 > 1}\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S[nozzle_temperature_range_high]\nM106 P1 S60\n{if flush_length_1 > 23.7}\nG1 E23.7 F{old_filament_e_feedrate} ; do not need pulsatile flushing for start part\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\n{else}\nG1 E{flush_length_1} F{old_filament_e_feedrate}\n{endif}\n; FLUSH_END\nG1 E-[old_retract_length_toolchange] F1800\nG1 E[old_retract_length_toolchange] F300\nM400\nM1002 set_filament_type:{filament_type[next_extruder]}\n{endif}\n\n{if flush_length_1 > 45 && flush_length_2 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_2 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_2 > 45 && flush_length_3 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_3 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_3 > 45 && flush_length_4 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_4 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\n; FLUSH_END\n{endif}\n\nM629\n\nM400\nM106 P1 S60\nM109 S[new_filament_temp]\nG1 E6 F{new_filament_e_feedrate} ;Compensate for filament spillage during waiting temperature\nM400\nG92 E0\nG1 E-[new_retract_length_toolchange] F1800\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nM400\nG1 Z{max_layer_z + 3.0} F3000\nM106 P1 S0\n{if layer_z <= (initial_layer_print_height + 0.001)}\nM204 S[initial_layer_acceleration]\n{else}\nM204 S[default_acceleration]\n{endif}\n{else}\nG1 X[x_after_toolchange] Y[y_after_toolchange] Z[z_after_toolchange] F12000\n{endif}\nM621 S[next_extruder]A\nG392 S0\n\nM1007 S1\n" + "change_filament_gcode": ";===== machine: A1 =========================\n;===== date: 20231225 =======================\nM1007 S0 ; turn off mass estimation\nG392 S0\nM620 S[next_extruder]A\nM204 S9000\n{if toolchange_count > 1}\nG17\nG2 Z{max_layer_z + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\n{endif}\nG1 Z{max_layer_z + 3.0} F1200\n\nM400\nM106 P1 S0\nM106 P2 S0\n{if old_filament_temp > 142 && next_extruder < 255}\nM104 S[old_filament_temp]\n{endif}\n\nG1 X267 F18000\nM620.1 E F[old_filament_e_feedrate] T{nozzle_temperature_range_high[previous_extruder]}\nM620.10 A0 F[old_filament_e_feedrate]\nT[next_extruder]\nM620.1 E F[new_filament_e_feedrate] T{nozzle_temperature_range_high[next_extruder]}\nM620.10 A1 F[new_filament_e_feedrate] L[flush_length] H[nozzle_diameter] T[nozzle_temperature_range_high]\n\nG1 Y128 F9000\n\n{if next_extruder < 255}\nM400\n\nG92 E0\nM628 S0\n\n{if flush_length_1 > 1}\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S[nozzle_temperature_range_high]\nM106 P1 S60\n{if flush_length_1 > 23.7}\nG1 E23.7 F{old_filament_e_feedrate} ; do not need pulsatile flushing for start part\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\n{else}\nG1 E{flush_length_1} F{old_filament_e_feedrate}\n{endif}\n; FLUSH_END\nG1 E-[old_retract_length_toolchange] F1800\nG1 E[old_retract_length_toolchange] F300\nM400\nM1002 set_filament_type:{filament_type[next_extruder]}\n{endif}\n\n{if flush_length_1 > 45 && flush_length_2 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_2 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_2 > 45 && flush_length_3 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_3 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_3 > 45 && flush_length_4 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_4 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\n; FLUSH_END\n{endif}\n\nM629\n\nM400\nM106 P1 S60\nM109 S[new_filament_temp]\nG1 E6 F{new_filament_e_feedrate} ;Compensate for filament spillage during waiting temperature\nM400\nG92 E0\nG1 E-[new_retract_length_toolchange] F1800\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nG1 Z{max_layer_z + 3.0} F3000\nM106 P1 S0\n{if layer_z <= (initial_layer_print_height + 0.001)}\nM204 S[initial_layer_acceleration]\n{else}\nM204 S[default_acceleration]\n{endif}\n{else}\nG1 X[x_after_toolchange] Y[y_after_toolchange] Z[z_after_toolchange] F12000\n{endif}\n\nM9833 F{outer_wall_volumetric_speed/2.4} A0.3 ; cali dynamic extrusion compensation\nM1002 judge_flag filament_need_cali_flag\nM622 J1\n M106 P1 S178\n M400 S4\n G1 X-38.2 F18000\n G1 X-48.2 F3000\n G1 X-38.2 F18000 ;wipe and shake\n G1 X-48.2 F3000\n G1 X-38.2 F12000 ;wipe and shake\n G1 X-48.2 F3000\n M400\n M106 P1 S0 \nM623\n\nM621 S[next_extruder]A\nG392 S0\n\nM1007 S1\n" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab A1 mini 0.4 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab A1 mini 0.4 nozzle.json index 8478b5c818..8c69b32836 100644 --- a/resources/profiles/BBL/machine/Bambu Lab A1 mini 0.4 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab A1 mini 0.4 nozzle.json @@ -67,9 +67,9 @@ "Bambu Lab X1E 0.4 nozzle", "Bambu Lab A1 0.4 nozzle" ], - "machine_start_gcode": ";===== machine: A1 mini =========================\n;===== date: 20240204 =====================\n\n;===== start to heat heatbead&hotend==========\nM1002 gcode_claim_action : 2\nM1002 set_filament_type:{filament_type[initial_no_support_extruder]}\nM104 S170\nM140 S[bed_temperature_initial_layer_single]\nG392 S0 ;turn off clog detect\n;=====start printer sound ===================\nM17\nM400 S1\nM1006 S1\nM1006 A0 B0 L100 C37 D10 M100 E37 F10 N100\nM1006 A0 B0 L100 C41 D10 M100 E41 F10 N100\nM1006 A0 B0 L100 C44 D10 M100 E44 F10 N100\nM1006 A0 B10 L100 C0 D10 M100 E0 F10 N100\nM1006 A43 B10 L100 C39 D10 M100 E46 F10 N100\nM1006 A0 B0 L100 C0 D10 M100 E0 F10 N100\nM1006 A0 B0 L100 C39 D10 M100 E43 F10 N100\nM1006 A0 B0 L100 C0 D10 M100 E0 F10 N100\nM1006 A0 B0 L100 C41 D10 M100 E41 F10 N100\nM1006 A0 B0 L100 C44 D10 M100 E44 F10 N100\nM1006 A0 B0 L100 C49 D10 M100 E49 F10 N100\nM1006 A0 B0 L100 C0 D10 M100 E0 F10 N100\nM1006 A44 B10 L100 C39 D10 M100 E48 F10 N100\nM1006 A0 B0 L100 C0 D10 M100 E0 F10 N100\nM1006 A0 B0 L100 C39 D10 M100 E44 F10 N100\nM1006 A0 B0 L100 C0 D10 M100 E0 F10 N100\nM1006 A43 B10 L100 C39 D10 M100 E46 F10 N100\nM1006 W\nM18\n;=====avoid end stop =================\nG91\nG380 S2 Z30 F1200\nG380 S3 Z-20 F1200\nG1 Z5 F1200\nG90\n\n;===== reset machine status =================\nM204 S6000\n\nM630 S0 P0\nG91\nM17 Z0.3 ; lower the z-motor current\n\nG90\nM17 X0.7 Y0.9 Z0.5 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM83\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\n;====== cog noise reduction=================\nM982.2 S1 ; turn on cog noise reduction\n\n;===== prepare print temperature and material ==========\nM400\nM18\nM109 S100 H170\nM104 S170\nM400\nM17\nM400\nG28 X\n\nM211 X0 Y0 Z0 ;turn off soft endstop ; turn off soft endstop to prevent protential logic problem\n\nM975 S1 ; turn on\n\nG1 X0.0 F30000\nG1 X-13.5 F3000\n\nM620 M ;enable remap\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n G392 S0 ;turn on clog detect\n M1002 gcode_claim_action : 4\n M400\n M1002 set_filament_type:UNKNOWN\n M109 S[nozzle_temperature_initial_layer]\n M104 S250\n M400\n T[initial_no_support_extruder]\n G1 X-13.5 F3000\n M400\n M620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n M109 S250 ;set nozzle to common flush temp\n M106 P1 S0\n G92 E0\n G1 E50 F200\n M400\n M1002 set_filament_type:{filament_type[initial_no_support_extruder]}\n M104 S{nozzle_temperature_range_high[initial_no_support_extruder]}\n G92 E0\n G1 E50 F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60}\n M400\n M106 P1 S178\n G92 E0\n G1 E5 F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60}\n M109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\n M104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-40}\n G92 E0\n G1 E-0.5 F300\n\n G1 X0 F30000\n G1 X-13.5 F3000\n G1 X0 F30000 ;wipe and shake\n G1 X-13.5 F3000\n G1 X0 F12000 ;wipe and shake\n G1 X0 F30000\n G1 X-13.5 F3000\n M109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-40}\n G392 S0 ;turn off clog detect\nM621 S[initial_no_support_extruder]A\n\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== mech mode fast check============================\nM1002 gcode_claim_action : 3\nG0 X25 Y175 F20000 ; find a soft place to home\n;M104 S0\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nM104 S170\n\n; build plate detect\nM1002 judge_flag build_plate_detect_flag\nM622 S1\n G39.4\n M400\nM623\n\nG1 Z5 F3000\nG1 X90 Y-1 F30000\nM400 P200\nM970.3 Q1 A7 K0 O2\nM974 Q1 S2 P0\n\nG1 X90 Y0 Z5 F30000\nM400 P200\nM970 Q0 A10 B50 C90 H15 K0 M20 O3\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X-1 Y10\nG28 X ; re-home XY\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\n\nM104 S170 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\nM211 S; push soft endstop status\nM211 X0 Y0 Z0 ;turn off Z axis endstop\n\nM83\nG1 E-1 F500\nG90\nM83\n\nM109 S170\nM104 S140\nG0 X90 Y-4 F30000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X91 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X92 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X93 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X94 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X95 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X96 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X97 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X98 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X99 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X99 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X99 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X99 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X99 F10000\nG380 S3 Z-5 F1200\n\nG1 Z5 F30000\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\nG1 X25 Y175 F30000.1 ;Brush material\nG1 Z0.2 F30000.1\nG1 Y185\nG91\nG1 X-30 F30000\nG1 Y-2\nG1 X27\nG1 Y1.5\nG1 X-28\nG1 Y-2\nG1 X30\nG1 Y1.5\nG1 X-30\nG90\nM83\n\nG1 Z5 F3000\nG0 X50 Y175 F20000 ; find a soft place to home\nG28 Z P0 T300; home z with low precision, permit 300deg temperature\nG29.2 S0 ; turn off ABL\n\nG0 X85 Y185 F10000 ;move to exposed steel surface and stop the nozzle\nG0 Z-1.01 F10000\nG91\n\nG2 I1 J0 X2 Y0 F2000.1\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\n\nG90\nG1 Z5 F30000\nG1 X25 Y175 F30000.1 ;Brush material\nG1 Z0.2 F30000.1\nG1 Y185\nG91\nG1 X-30 F30000\nG1 Y-2\nG1 X27\nG1 Y1.5\nG1 X-28\nG1 Y-2\nG1 X30\nG1 Y1.5\nG1 X-30\nG90\nM83\n\nG1 Z5\nG0 X55 Y175 F20000 ; find a soft place to home\nG28 Z P0 T300; home z with low precision, permit 300deg temperature\nG29.2 S0 ; turn off ABL\n\nG1 Z10\nG1 X85 Y185\nG1 Z-1.01\nG1 X95\nG1 X90\n\nM211 R; pop softend status\n\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n\n;===== wait heatbed ====================\nM1002 gcode_claim_action : 2\nM104 S0\nM190 S[bed_temperature_initial_layer_single];set bed temp\nM109 S140\n\nG1 Z5 F3000\nG29.2 S1\nG1 X10 Y10 F20000\n\n;===== bed leveling ==================================\n;M1002 set_flag g29_before_print_flag=1\nM1002 judge_flag g29_before_print_flag\nM622 J1\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28 T145\n\nM623\n\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n;===== nozzle load line ===============================\nM975 S1\nG90\nM83\nT1000\n\nG1 X-13.5 Y0 Z10 F10000\nG1 E1.2 F500\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S{nozzle_temperature[initial_extruder]}\nM400\n\nM412 S1 ; ===turn on filament runout detection===\nM400 P10\n\nG392 S0 ;turn on clog detect\n\nM620.3 W1; === turn on filament tangle detection===\nM400 S2\n\nM1002 set_filament_type:{filament_type[initial_no_support_extruder]}\n;M1002 set_flag extrude_cali_flag=1\nM1002 judge_flag extrude_cali_flag\nM622 J1\n M1002 gcode_claim_action : 8\n \n M400\n M900 K0.0 L1000.0 M1.0\n G90\n M83\n G0 X68 Y-4 F30000\n G0 Z0.2 F18000 ;Move to start position\n M400\n G0 X88 E10 F{outer_wall_volumetric_speed/(24/20) * 60}\n G0 X93 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\n G0 X98 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X103 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\n G0 X108 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X113 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\n G0 Y0 Z0 F20000\n M400\n \n G1 X-13.5 Y0 Z10 F10000\n M400\n \n G1 E10 F{outer_wall_volumetric_speed/2.4*60}\n M983 F{outer_wall_volumetric_speed/2.4} A0.3 H[nozzle_diameter]; cali dynamic extrusion compensation\n M106 P1 S178\n M400 S7\n G1 X0 F18000\n G1 X-13.5 F3000\n G1 X0 F18000 ;wipe and shake\n G1 X-13.5 F3000\n G1 X0 F12000 ;wipe and shake\n G1 X-13.5 F3000\n M400\n M106 P1 S0\n\n M1002 judge_last_extrude_cali_success\n M622 J0\n M983 F{outer_wall_volumetric_speed/2.4} A0.3 H[nozzle_diameter]; cali dynamic extrusion compensation\n M106 P1 S178\n M400 S7\n G1 X0 F18000\n G1 X-13.5 F3000\n G1 X0 F18000 ;wipe and shake\n G1 X-13.5 F3000\n G1 X0 F12000 ;wipe and shake\n M400\n M106 P1 S0\n M623\n \n G1 X-13.5 F3000\n M400\n M984 A0.1 E1 S1 F{outer_wall_volumetric_speed/2.4}\n M106 P1 S178\n M400 S7\n G1 X0 F18000\n G1 X-13.5 F3000\n G1 X0 F18000 ;wipe and shake\n G1 X-13.5 F3000\n G1 X0 F12000 ;wipe and shake\n G1 X-13.5 F3000\n M400\n M106 P1 S0\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\n;===== extrude cali test ===============================\nM104 S{nozzle_temperature_initial_layer[initial_extruder]}\nG90\nM83\nG0 X68 Y-2.5 F30000\nG0 Z0.2 F18000 ;Move to start position\nG0 X88 E10 F{outer_wall_volumetric_speed/(24/20) * 60}\nG0 X93 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\nG0 X98 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 X103 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\nG0 X108 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 X113 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\nG0 X115 Z0 F20000\nG0 Z5\nM400\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\n\nM400 ; wait all motion done before implement the emprical L parameters\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.02} ; for Textured PEI Plate\n{endif}\n\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\n\nM211 X0 Y0 Z0 ;turn off soft endstop\nM1007 S1\n\n\n\n", + "machine_start_gcode": ";===== machine: A1 mini =========================\n;===== date: 20240204 =====================\n\n;===== start to heat heatbead&hotend==========\nM1002 gcode_claim_action : 2\nM1002 set_filament_type:{filament_type[initial_no_support_extruder]}\nM104 S170\nM140 S[bed_temperature_initial_layer_single]\nG392 S0 ;turn off clog detect\nM9833.2\n;=====start printer sound ===================\nM17\nM400 S1\nM1006 S1\nM1006 A0 B0 L100 C37 D10 M100 E37 F10 N100\nM1006 A0 B0 L100 C41 D10 M100 E41 F10 N100\nM1006 A0 B0 L100 C44 D10 M100 E44 F10 N100\nM1006 A0 B10 L100 C0 D10 M100 E0 F10 N100\nM1006 A43 B10 L100 C39 D10 M100 E46 F10 N100\nM1006 A0 B0 L100 C0 D10 M100 E0 F10 N100\nM1006 A0 B0 L100 C39 D10 M100 E43 F10 N100\nM1006 A0 B0 L100 C0 D10 M100 E0 F10 N100\nM1006 A0 B0 L100 C41 D10 M100 E41 F10 N100\nM1006 A0 B0 L100 C44 D10 M100 E44 F10 N100\nM1006 A0 B0 L100 C49 D10 M100 E49 F10 N100\nM1006 A0 B0 L100 C0 D10 M100 E0 F10 N100\nM1006 A44 B10 L100 C39 D10 M100 E48 F10 N100\nM1006 A0 B0 L100 C0 D10 M100 E0 F10 N100\nM1006 A0 B0 L100 C39 D10 M100 E44 F10 N100\nM1006 A0 B0 L100 C0 D10 M100 E0 F10 N100\nM1006 A43 B10 L100 C39 D10 M100 E46 F10 N100\nM1006 W\nM18\n;=====avoid end stop =================\nG91\nG380 S2 Z30 F1200\nG380 S3 Z-20 F1200\nG1 Z5 F1200\nG90\n\n;===== reset machine status =================\nM204 S6000\n\nM630 S0 P0\nG91\nM17 Z0.3 ; lower the z-motor current\n\nG90\nM17 X0.7 Y0.9 Z0.5 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM83\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\n;====== cog noise reduction=================\nM982.2 S1 ; turn on cog noise reduction\n\n;===== prepare print temperature and material ==========\nM400\nM18\nM109 S100 H170\nM104 S170\nM400\nM17\nM400\nG28 X\n\nM211 X0 Y0 Z0 ;turn off soft endstop ; turn off soft endstop to prevent protential logic problem\n\nM975 S1 ; turn on\n\nG1 X0.0 F30000\nG1 X-13.5 F3000\n\nM620 M ;enable remap\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n G392 S0 ;turn on clog detect\n M1002 gcode_claim_action : 4\n M400\n M1002 set_filament_type:UNKNOWN\n M109 S[nozzle_temperature_initial_layer]\n M104 S250\n M400\n T[initial_no_support_extruder]\n G1 X-13.5 F3000\n M400\n M620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n M109 S250 ;set nozzle to common flush temp\n M106 P1 S0\n G92 E0\n G1 E50 F200\n M400\n M1002 set_filament_type:{filament_type[initial_no_support_extruder]}\n M104 S{nozzle_temperature_range_high[initial_no_support_extruder]}\n G92 E0\n G1 E50 F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60}\n M400\n M106 P1 S178\n G92 E0\n G1 E5 F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60}\n M109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\n M104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-40}\n G92 E0\n G1 E-0.5 F300\n\n G1 X0 F30000\n G1 X-13.5 F3000\n G1 X0 F30000 ;wipe and shake\n G1 X-13.5 F3000\n G1 X0 F12000 ;wipe and shake\n G1 X0 F30000\n G1 X-13.5 F3000\n M109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-40}\n G392 S0 ;turn off clog detect\nM621 S[initial_no_support_extruder]A\n\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== mech mode fast check============================\nM1002 gcode_claim_action : 3\nG0 X25 Y175 F20000 ; find a soft place to home\n;M104 S0\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nM104 S170\n\n; build plate detect\nM1002 judge_flag build_plate_detect_flag\nM622 S1\n G39.4\n M400\nM623\n\nG1 Z5 F3000\nG1 X90 Y-1 F30000\nM400 P200\nM970.3 Q1 A7 K0 O2\nM974 Q1 S2 P0\n\nG1 X90 Y0 Z5 F30000\nM400 P200\nM970 Q0 A10 B50 C90 H15 K0 M20 O3\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X-1 Y10\nG28 X ; re-home XY\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\n\nM104 S170 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\nM211 S; push soft endstop status\nM211 X0 Y0 Z0 ;turn off Z axis endstop\n\nM83\nG1 E-1 F500\nG90\nM83\n\nM109 S170\nM104 S140\nG0 X90 Y-4 F30000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X91 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X92 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X93 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X94 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X95 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X96 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X97 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X98 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X99 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X99 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X99 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X99 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X99 F10000\nG380 S3 Z-5 F1200\n\nG1 Z5 F30000\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\nG1 X25 Y175 F30000.1 ;Brush material\nG1 Z0.2 F30000.1\nG1 Y185\nG91\nG1 X-30 F30000\nG1 Y-2\nG1 X27\nG1 Y1.5\nG1 X-28\nG1 Y-2\nG1 X30\nG1 Y1.5\nG1 X-30\nG90\nM83\n\nG1 Z5 F3000\nG0 X50 Y175 F20000 ; find a soft place to home\nG28 Z P0 T300; home z with low precision, permit 300deg temperature\nG29.2 S0 ; turn off ABL\n\nG0 X85 Y185 F10000 ;move to exposed steel surface and stop the nozzle\nG0 Z-1.01 F10000\nG91\n\nG2 I1 J0 X2 Y0 F2000.1\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\n\nG90\nG1 Z5 F30000\nG1 X25 Y175 F30000.1 ;Brush material\nG1 Z0.2 F30000.1\nG1 Y185\nG91\nG1 X-30 F30000\nG1 Y-2\nG1 X27\nG1 Y1.5\nG1 X-28\nG1 Y-2\nG1 X30\nG1 Y1.5\nG1 X-30\nG90\nM83\n\nG1 Z5\nG0 X55 Y175 F20000 ; find a soft place to home\nG28 Z P0 T300; home z with low precision, permit 300deg temperature\nG29.2 S0 ; turn off ABL\n\nG1 Z10\nG1 X85 Y185\nG1 Z-1.01\nG1 X95\nG1 X90\n\nM211 R; pop softend status\n\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n\n;===== wait heatbed ====================\nM1002 gcode_claim_action : 2\nM104 S0\nM190 S[bed_temperature_initial_layer_single];set bed temp\nM109 S140\n\nG1 Z5 F3000\nG29.2 S1\nG1 X10 Y10 F20000\n\n;===== bed leveling ==================================\n;M1002 set_flag g29_before_print_flag=1\nM1002 judge_flag g29_before_print_flag\nM622 J1\n M1002 gcode_claim_action : 1\n G29 A1 X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28 T145\n\nM623\n\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n;===== nozzle load line ===============================\nM975 S1\nG90\nM83\nT1000\n\nG1 X-13.5 Y0 Z10 F10000\nG1 E1.2 F500\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S{nozzle_temperature[initial_extruder]}\nM400\n\nM412 S1 ; ===turn on filament runout detection===\nM400 P10\n\nG392 S0 ;turn on clog detect\n\nM620.3 W1; === turn on filament tangle detection===\nM400 S2\n\nM1002 set_filament_type:{filament_type[initial_no_support_extruder]}\n;M1002 set_flag extrude_cali_flag=1\nM1002 judge_flag extrude_cali_flag\nM622 J1\n M1002 gcode_claim_action : 8\n \n M400\n M900 K0.0 L1000.0 M1.0\n G90\n M83\n G0 X68 Y-4 F30000\n G0 Z0.3 F18000 ;Move to start position\n M400\n G0 X88 E10 F{outer_wall_volumetric_speed/(24/20) * 60}\n G0 X93 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\n G0 X98 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X103 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\n G0 X108 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X113 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\n G0 Y0 Z0 F20000\n M400\n \n G1 X-13.5 Y0 Z10 F10000\n M400\n \n G1 E10 F{outer_wall_volumetric_speed/2.4*60}\n M983 F{outer_wall_volumetric_speed/2.4} A0.3 H[nozzle_diameter]; cali dynamic extrusion compensation\n M106 P1 S178\n M400 S7\n G1 X0 F18000\n G1 X-13.5 F3000\n G1 X0 F18000 ;wipe and shake\n G1 X-13.5 F3000\n G1 X0 F12000 ;wipe and shake\n G1 X-13.5 F3000\n M400\n M106 P1 S0\n\n M1002 judge_last_extrude_cali_success\n M622 J0\n M983 F{outer_wall_volumetric_speed/2.4} A0.3 H[nozzle_diameter]; cali dynamic extrusion compensation\n M106 P1 S178\n M400 S7\n G1 X0 F18000\n G1 X-13.5 F3000\n G1 X0 F18000 ;wipe and shake\n G1 X-13.5 F3000\n G1 X0 F12000 ;wipe and shake\n M400\n M106 P1 S0\n M623\n \n G1 X-13.5 F3000\n M400\n M984 A0.1 E1 S1 F{outer_wall_volumetric_speed/2.4}\n M106 P1 S178\n M400 S7\n G1 X0 F18000\n G1 X-13.5 F3000\n G1 X0 F18000 ;wipe and shake\n G1 X-13.5 F3000\n G1 X0 F12000 ;wipe and shake\n G1 X-13.5 F3000\n M400\n M106 P1 S0\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\n;===== extrude cali test ===============================\nM104 S{nozzle_temperature_initial_layer[initial_extruder]}\nG90\nM83\nG0 X68 Y-2.5 F30000\nG0 Z0.3 F18000 ;Move to start position\nG0 X88 E10 F{outer_wall_volumetric_speed/(24/20) * 60}\nG0 X93 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\nG0 X98 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 X103 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\nG0 X108 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 X113 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\nG0 X115 Z0 F20000\nG0 Z5\nM400\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\n\nM400 ; wait all motion done before implement the emprical L parameters\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.02} ; for Textured PEI Plate\n{endif}\n\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\n\nM211 X0 Y0 Z0 ;turn off soft endstop\nM1007 S1\n\n\n\n", "machine_end_gcode": ";===== date: 20231229 =====================\n;turn off nozzle clog detect\nG392 S0\n\nM400 ; wait for buffer to clear\nG92 E0 ; zero the extruder\nG1 E-0.8 F1800 ; retract\nG1 Z{max_layer_z + 0.5} F900 ; lower z a little\nG1 X0 Y{first_layer_center_no_wipe_tower[1]} F18000 ; move to safe pos\nG1 X-13.0 F3000 ; move to safe pos\n{if !spiral_mode && print_sequence != \"by object\"}\nM1002 judge_flag timelapse_record_flag\nM622 J1\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM991 S0 P-1 ;end timelapse at safe pos\nM623\n{endif}\n\nM140 S0 ; turn off bed\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off remote part cooling fan\nM106 P3 S0 ; turn off chamber cooling fan\n\n;G1 X27 F15000 ; wipe\n\n; pull back filament to AMS\nM620 S255\nG1 X181 F12000\nT255\nG1 X0 F18000\nG1 X-13.0 F3000\nG1 X0 F18000 ; wipe\nM621 S255\n\nM104 S0 ; turn off hotend\n\nM400 ; wait all motion done\nM17 S\nM17 Z0.4 ; lower z motor current to reduce impact if there is something in the bottom\n{if (max_layer_z + 100.0) < 180}\n G1 Z{max_layer_z + 100.0} F600\n G1 Z{max_layer_z +98.0}\n{else}\n G1 Z180 F600\n G1 Z180\n{endif}\nM400 P100\nM17 R ; restore z current\n\nG90\nG1 X-13 Y180 F3600\n\nG91\nG1 Z-1 F600\nG90\nM83\n\nM220 S100 ; Reset feedrate magnitude\nM201.2 K1.0 ; Reset acc magnitude\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 0\n\n;=====printer finish sound=========\nM17\nM400 S1\nM1006 S1\nM1006 A0 B20 L100 C37 D20 M100 E42 F20 N100\nM1006 A0 B10 L100 C44 D10 M100 E44 F10 N100\nM1006 A0 B10 L100 C46 D10 M100 E46 F10 N100\nM1006 A44 B20 L100 C39 D20 M100 E48 F20 N100\nM1006 A0 B10 L100 C44 D10 M100 E44 F10 N100\nM1006 A0 B10 L100 C0 D10 M100 E0 F10 N100\nM1006 A0 B10 L100 C39 D10 M100 E39 F10 N100\nM1006 A0 B10 L100 C0 D10 M100 E0 F10 N100\nM1006 A0 B10 L100 C44 D10 M100 E44 F10 N100\nM1006 A0 B10 L100 C0 D10 M100 E0 F10 N100\nM1006 A0 B10 L100 C39 D10 M100 E39 F10 N100\nM1006 A0 B10 L100 C0 D10 M100 E0 F10 N100\nM1006 A44 B10 L100 C0 D10 M100 E48 F10 N100\nM1006 A0 B10 L100 C0 D10 M100 E0 F10 N100\nM1006 A44 B20 L100 C41 D20 M100 E49 F20 N100\nM1006 A0 B20 L100 C0 D20 M100 E0 F20 N100\nM1006 A0 B20 L100 C37 D20 M100 E37 F20 N100\nM1006 W\n;=====printer finish sound=========\nM400 S1\nM18 X Y Z\n", "layer_change_gcode": "; layer num/total_layer_count: {layer_num+1}/[total_layer_count]\n; update layer progress\nM73 L{layer_num+1}\nM991 S0 P{layer_num} ;notify layer change\n", "time_lapse_gcode": ";===================== date: 202312028 =====================\n{if !spiral_mode && print_sequence != \"by object\"}\n; don't support timelapse gcode in spiral_mode and by object sequence for I3 structure printer\nM622.1 S1 ; for prev firware, default turned on\nM1002 judge_flag timelapse_record_flag\nM622 J1\nG92 E0\nG17\nG2 Z{layer_z + 0.4} I0.86 J0.86 P1 F20000 ; spiral lift a little\nG1 Z{max_layer_z + 0.4}\nG1 X0 Y{first_layer_center_no_wipe_tower[1]} F18000 ; move to safe pos\nG1 X-13.0 F3000 ; move to safe pos\nM400 P300\nM971 S11 C11 O0\nG92 E0\nG1 X0 F18000\nM623\n\nM622.1 S1\nM1002 judge_flag g39_detection_flag\nM622 J1\n ; enable nozzle clog detect at 3rd layer\n {if layer_num == 2}\n M400\n G90\n M83\n M204 S5000\n G0 Z2 F4000\n G0 X-6 Y170 F20000\n G39 S1 X-6 Y170\n G0 Z2 F4000\n G0 X90 Y90 F30000\n {endif}\n\n\n {if !in_head_wrap_detect_zone}\n M622.1 S0\n M1002 judge_flag g39_mass_exceed_flag\n M622 J1\n {if layer_num > 2}\n G392 S0\n M400\n G90\n M83\n M204 S5000\n G0 Z{max_layer_z + 0.4} F4000\n G39.3 S1\n G0 Z{max_layer_z + 0.4} F4000\n G392 S0\n {endif}\n M623\n {endif}\nM623\n{endif}\n", - "change_filament_gcode": ";===== machine: A1 mini =========================\n;===== date: 20231225 =======================\nG392 S0\nM1007 S0\nM620 S[next_extruder]A\nM204 S9000\n{if toolchange_count > 1}\nG17\nG2 Z{max_layer_z + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\n{endif}\nG1 Z{max_layer_z + 3.0} F1200\n\nM400\nM106 P1 S0\nM106 P2 S0\n{if old_filament_temp > 142 && next_extruder < 255}\nM104 S[old_filament_temp]\n{endif}\n\nG1 X180 F18000\nM620.1 E F[old_filament_e_feedrate] T{nozzle_temperature_range_high[previous_extruder]}\nM620.10 A0 F[old_filament_e_feedrate]\nT[next_extruder]\nM620.1 E F[new_filament_e_feedrate] T{nozzle_temperature_range_high[next_extruder]}\nM620.10 A1 F[new_filament_e_feedrate] L[flush_length] H[nozzle_diameter] T[nozzle_temperature_range_high]\n\nG1 Y90 F9000\n\n{if next_extruder < 255}\nM400\n\nG92 E0\nM628 S0\n\n{if flush_length_1 > 1}\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S[nozzle_temperature_range_high]\nM106 P1 S60\n{if flush_length_1 > 23.7}\nG1 E23.7 F{old_filament_e_feedrate} ; do not need pulsatile flushing for start part\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\n{else}\nG1 E{flush_length_1} F{old_filament_e_feedrate}\n{endif}\n; FLUSH_END\nG1 E-[old_retract_length_toolchange] F1800\nG1 E[old_retract_length_toolchange] F300\nM400\nM1002 set_filament_type:{filament_type[next_extruder]}\n{endif}\n\n{if flush_length_1 > 45 && flush_length_2 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_2 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_2 > 45 && flush_length_3 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_3 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_3 > 45 && flush_length_4 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_4 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\n; FLUSH_END\n{endif}\n\nM629\n\nM400\nM106 P1 S60\nM109 S[new_filament_temp]\nG1 E5 F{new_filament_e_feedrate} ;Compensate for filament spillage during waiting temperature\nM400\nG92 E0\nG1 E-[new_retract_length_toolchange] F1800\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nM400\nG1 Z{max_layer_z + 3.0} F3000\nM106 P1 S0\n{if layer_z <= (initial_layer_print_height + 0.001)}\nM204 S[initial_layer_acceleration]\n{else}\nM204 S[default_acceleration]\n{endif}\n{else}\nG1 X[x_after_toolchange] Y[y_after_toolchange] Z[z_after_toolchange] F12000\n{endif}\nM621 S[next_extruder]A\nG392 S0\nM1007 S1\n" + "change_filament_gcode": ";===== machine: A1 mini =========================\n;===== date: 20231225 =======================\nG392 S0\nM1007 S0\nM620 S[next_extruder]A\nM204 S9000\n{if toolchange_count > 1}\nG17\nG2 Z{max_layer_z + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\n{endif}\nG1 Z{max_layer_z + 3.0} F1200\n\nM400\nM106 P1 S0\nM106 P2 S0\n{if old_filament_temp > 142 && next_extruder < 255}\nM104 S[old_filament_temp]\n{endif}\n\nG1 X180 F18000\nM620.1 E F[old_filament_e_feedrate] T{nozzle_temperature_range_high[previous_extruder]}\nM620.10 A0 F[old_filament_e_feedrate]\nT[next_extruder]\nM620.1 E F[new_filament_e_feedrate] T{nozzle_temperature_range_high[next_extruder]}\nM620.10 A1 F[new_filament_e_feedrate] L[flush_length] H[nozzle_diameter] T[nozzle_temperature_range_high]\n\nG1 Y90 F9000\n\n{if next_extruder < 255}\nM400\n\nG92 E0\nM628 S0\n\n{if flush_length_1 > 1}\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S[nozzle_temperature_range_high]\nM106 P1 S60\n{if flush_length_1 > 23.7}\nG1 E23.7 F{old_filament_e_feedrate} ; do not need pulsatile flushing for start part\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\n{else}\nG1 E{flush_length_1} F{old_filament_e_feedrate}\n{endif}\n; FLUSH_END\nG1 E-[old_retract_length_toolchange] F1800\nG1 E[old_retract_length_toolchange] F300\nM400\nM1002 set_filament_type:{filament_type[next_extruder]}\n{endif}\n\n{if flush_length_1 > 45 && flush_length_2 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_2 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_2 > 45 && flush_length_3 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_3 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_3 > 45 && flush_length_4 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_4 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\n; FLUSH_END\n{endif}\n\nM629\n\nM400\nM106 P1 S60\nM109 S[new_filament_temp]\nG1 E5 F{new_filament_e_feedrate} ;Compensate for filament spillage during waiting temperature\nM400\nG92 E0\nG1 E-[new_retract_length_toolchange] F1800\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nM400\nG1 Z{max_layer_z + 3.0} F3000\nM106 P1 S0\n{if layer_z <= (initial_layer_print_height + 0.001)}\nM204 S[initial_layer_acceleration]\n{else}\nM204 S[default_acceleration]\n{endif}\n{else}\nG1 X[x_after_toolchange] Y[y_after_toolchange] Z[z_after_toolchange] F12000\n{endif}\nM621 S[next_extruder]A\n\nM9833 F{outer_wall_volumetric_speed/2.4} A0.3 ; cali dynamic extrusion compensation\nM1002 judge_flag filament_need_cali_flag\nM622 J1\n M106 P1 S178\n M400 S7\n G1 X0 F18000\n G1 X-13.5 F3000\n G1 X0 F18000 ;wipe and shake\n G1 X-13.5 F3000\n G1 X0 F12000 ;wipe and shake\n G1 X-13.5 F3000\n M400\n M106 P1 S0 \nM623\n\nG392 S0\nM1007 S1\n\n" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab P1P 0.4 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab P1P 0.4 nozzle.json index b39a7e0250..c9046ad060 100644 --- a/resources/profiles/BBL/machine/Bambu Lab P1P 0.4 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab P1P 0.4 nozzle.json @@ -21,7 +21,7 @@ "Bambu PLA Basic @BBL X1" ], "default_print_profile": "0.20mm Standard @BBL P1P", - "enable_long_retraction_when_cut" : "1", + "enable_long_retraction_when_cut": "2", "extruder_offset": [ "0x2" ], @@ -40,5 +40,5 @@ "machine_start_gcode": ";===== machine: P1P ========================\n;===== date: 20230707 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_extruder]==\"PLA\"}\n {if (bed_temperature[initial_extruder] >45)||(bed_temperature_initial_layer[initial_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_extruder] >50)||(bed_temperature_initial_layer[initial_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X230 Y15\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_extruder]==\"PLA\"}\n {if (bed_temperature[initial_extruder] >45)||(bed_temperature_initial_layer[initial_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_extruder] >50)||(bed_temperature_initial_layer[initial_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n\nM104 S{nozzle_temperature_initial_layer[initial_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== fmech mode fast check============================\n\n\n;===== nozzle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature_initial_layer[initial_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y11 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E0.700\nG0 X18 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression", "machine_end_gcode": ";===== date: 20230428 =====================\nM400 ; wait for buffer to clear\nG92 E0 ; zero the extruder\nG1 E-0.8 F1800 ; retract\nG1 Z{max_layer_z + 0.5} F900 ; lower z a little\nG1 X65 Y245 F12000 ; move to safe pos \nG1 Y265 F3000\n\nG1 X65 Y245 F12000\nG1 Y265 F3000\nM140 S0 ; turn off bed\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off remote part cooling fan\nM106 P3 S0 ; turn off chamber cooling fan\n\nG1 X100 F12000 ; wipe\n; pull back filament to AMS\nM620 S255\nG1 X20 Y50 F12000\nG1 Y-3\nT255\nG1 X65 F12000\nG1 Y265\nG1 X100 F12000 ; wipe\nM621 S255\nM104 S0 ; turn off hotend\n\nM622.1 S1 ; for prev firware, default turned on\nM1002 judge_flag timelapse_record_flag\nM622 J1\n M400 ; wait all motion done\n M991 S0 P-1 ;end smooth timelapse at safe pos\n M400 S3 ;wait for last picture to be taken\nM623; end of \"timelapse_record_flag\"\n\nM400 ; wait all motion done\nM17 S\nM17 Z0.4 ; lower z motor current to reduce impact if there is something in the bottom\n{if (max_layer_z + 100.0) < 250}\n G1 Z{max_layer_z + 100.0} F600\n G1 Z{max_layer_z +98.0}\n{else}\n G1 Z250 F600\n G1 Z248\n{endif}\nM400 P100\nM17 R ; restore z current\n\nM220 S100 ; Reset feedrate magnitude\nM201.2 K1.0 ; Reset acc magnitude\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 0\n\nM17 X0.8 Y0.8 Z0.5 ; lower motor current to 45% power\n", "layer_change_gcode": "; layer num/total_layer_count: {layer_num+1}/[total_layer_count]\nM622.1 S1 ; for prev firware, default turned on\nM1002 judge_flag timelapse_record_flag\nM622 J1\n{if timelapse_type == 0} ; timelapse without wipe tower\nM971 S11 C10 O0\n{elsif timelapse_type == 1} ; timelapse with wipe tower\nG92 E0\nG1 E-[retraction_length] F1800\nG17\nG2 Z{layer_z + 0.4} I0.86 J0.86 P1 F20000 ; spiral lift a little\nG1 X65 Y245 F20000 ; move to safe pos\nG17\nG2 Z{layer_z} I0.86 J0.86 P1 F20000\nG1 Y265 F3000\nM400 P300\nM971 S11 C11 O0\nG92 E0\nG1 E[retraction_length] F300\nG1 X100 F5000\nG1 Y255 F20000\n{endif}\nM623\n; update layer progress\nM73 L{layer_num+1}\nM991 S0 P{layer_num} ;notify layer change", - "change_filament_gcode": "M620 S[next_extruder]A\nM204 S9000\n{if toolchange_count > 1 && (z_hop_types[current_extruder] == 0 || z_hop_types[current_extruder] == 3)}\nG17\nG2 Z{z_after_toolchange + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\n{endif}\nG1 Z{max_layer_z + 3.0} F1200\n\nG1 X70 F21000\nG1 Y245\nG1 Y265 F3000\nM400\nM106 P1 S0\nM106 P2 S0\n{if old_filament_temp > 142 && next_extruder < 255}\nM104 S[old_filament_temp]\n{endif}\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 X120 F15000\n{if long_retraction_when_cut && retraction_distance_when_cut > 2}\nG1 E-[retraction_distance_when_cut] F200\nM400\n{endif}\nG1 X20 Y50 F21000\nG1 Y-3\n{if toolchange_count == 2}\n; get travel path for change filament\nM620.1 X[travel_point_1_x] Y[travel_point_1_y] F21000 P0\nM620.1 X[travel_point_2_x] Y[travel_point_2_y] F21000 P1\nM620.1 X[travel_point_3_x] Y[travel_point_3_y] F21000 P2\n{endif}\nM620.1 E F[old_filament_e_feedrate] T{nozzle_temperature_range_high[previous_extruder]}\nT[next_extruder]\nM620.1 E F[new_filament_e_feedrate] T{nozzle_temperature_range_high[next_extruder]}\n\n{if next_extruder < 255}\nM400\n{if long_retraction_when_cut && retraction_distance_when_cut > 2}\nG1 E{retraction_distance_when_cut - 2} F200\nG1 E2 F20\nM400\n{endif}\nG92 E0\n{if flush_length_1 > 1}\nM83\n; FLUSH_START\n; always use highest temperature to flush\nM400\n{if filament_type[next_extruder] == \"PETG\"}\nM109 S260\n{elsif filament_type[next_extruder] == \"PVA\"}\nM109 S210\n{else}\nM109 S[nozzle_temperature_range_high]\n{endif}\n{if flush_length_1 > 23.7}\nG1 E23.7 F{old_filament_e_feedrate} ; do not need pulsatile flushing for start part\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\n{else}\nG1 E{flush_length_1} F{old_filament_e_feedrate}\n{endif}\n; FLUSH_END\nG1 E-[old_retract_length_toolchange] F1800\nG1 E[old_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_2 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_3 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_4 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\n; FLUSH_END\n{endif}\n; FLUSH_START\nM400\nM109 S[new_filament_temp]\nG1 E2 F{new_filament_e_feedrate} ;Compensate for filament spillage during waiting temperature\n; FLUSH_END\nM400\nG92 E0\nG1 E-[new_retract_length_toolchange] F1800\nM106 P1 S255\nM400 S3\n\nG1 X70 F5000\nG1 X90 F3000\nG1 Y255 F4000\nG1 X105 F5000\nG1 Y265 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X70 F10000\nG1 X100 F5000\n\nG1 X70 F10000\nG1 X80 F15000\nG1 X60\nG1 X80\nG1 X60\nG1 X80 ; shake to put down garbage\nG1 X100 F5000\nG1 X165 F15000; wipe and shake\nG1 Y256 ; move Y to aside, prevent collision\nM400\nG1 Z{max_layer_z + 3.0} F3000\n{if layer_z <= (initial_layer_print_height + 0.001)}\nM204 S[initial_layer_acceleration]\n{else}\nM204 S[default_acceleration]\n{endif}\n{else}\nG1 X[x_after_toolchange] Y[y_after_toolchange] Z[z_after_toolchange] F12000\n{endif}\nM621 S[next_extruder]A\n" + "change_filament_gcode": "M620 S[next_extruder]A\nM204 S9000\n{if toolchange_count > 1 && (z_hop_types[current_extruder] == 0 || z_hop_types[current_extruder] == 3)}\nG17\nG2 Z{z_after_toolchange + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\n{endif}\nG1 Z{max_layer_z + 3.0} F1200\n\nG1 X70 F21000\nG1 Y245\nG1 Y265 F3000\nM400\nM106 P1 S0\nM106 P2 S0\n{if old_filament_temp > 142 && next_extruder < 255}\nM104 S[old_filament_temp]\n{endif}\n{if long_retractions_when_cut[previous_extruder]}\nM620.11 S1 I[previous_extruder] E-{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\n{else}\nM620.11 S0\n{endif}\nM400\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 X120 F15000\nG1 X20 Y50 F21000\nG1 Y-3\n{if toolchange_count == 2}\n; get travel path for change filament\nM620.1 X[travel_point_1_x] Y[travel_point_1_y] F21000 P0\nM620.1 X[travel_point_2_x] Y[travel_point_2_y] F21000 P1\nM620.1 X[travel_point_3_x] Y[travel_point_3_y] F21000 P2\n{endif}\nM620.1 E F[old_filament_e_feedrate] T{nozzle_temperature_range_high[previous_extruder]}\nT[next_extruder]\nM620.1 E F[new_filament_e_feedrate] T{nozzle_temperature_range_high[next_extruder]}\n\n{if next_extruder < 255}\n{if long_retractions_when_cut[previous_extruder]}\nM620.11 S1 I[previous_extruder] E{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\nM628 S1\nG92 E0\nG1 E{retraction_distances_when_cut[previous_extruder]} F[old_filament_e_feedrate]\nM400\nM629 S1\n{else}\nM620.11 S0\n{endif}\nG92 E0\n{if flush_length_1 > 1}\nM83\n; FLUSH_START\n; always use highest temperature to flush\nM400\n{if filament_type[next_extruder] == \"PETG\"}\nM109 S260\n{elsif filament_type[next_extruder] == \"PVA\"}\nM109 S210\n{else}\nM109 S[nozzle_temperature_range_high]\n{endif}\n{if flush_length_1 > 23.7}\nG1 E23.7 F{old_filament_e_feedrate} ; do not need pulsatile flushing for start part\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\n{else}\nG1 E{flush_length_1} F{old_filament_e_feedrate}\n{endif}\n; FLUSH_END\nG1 E-[old_retract_length_toolchange] F1800\nG1 E[old_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_2 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_3 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_4 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\n; FLUSH_END\n{endif}\n; FLUSH_START\nM400\nM109 S[new_filament_temp]\nG1 E2 F{new_filament_e_feedrate} ;Compensate for filament spillage during waiting temperature\n; FLUSH_END\nM400\nG92 E0\nG1 E-[new_retract_length_toolchange] F1800\nM106 P1 S255\nM400 S3\n\nG1 X70 F5000\nG1 X90 F3000\nG1 Y255 F4000\nG1 X105 F5000\nG1 Y265 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X70 F10000\nG1 X100 F5000\n\nG1 X70 F10000\nG1 X80 F15000\nG1 X60\nG1 X80\nG1 X60\nG1 X80 ; shake to put down garbage\nG1 X100 F5000\nG1 X165 F15000; wipe and shake\nG1 Y256 ; move Y to aside, prevent collision\nM400\nG1 Z{max_layer_z + 3.0} F3000\n{if layer_z <= (initial_layer_print_height + 0.001)}\nM204 S[initial_layer_acceleration]\n{else}\nM204 S[default_acceleration]\n{endif}\n{else}\nG1 X[x_after_toolchange] Y[y_after_toolchange] Z[z_after_toolchange] F12000\n{endif}\nM621 S[next_extruder]A\n" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab P1S 0.4 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab P1S 0.4 nozzle.json index a5a55c74ed..3dc5e2b6d9 100644 --- a/resources/profiles/BBL/machine/Bambu Lab P1S 0.4 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab P1S 0.4 nozzle.json @@ -20,7 +20,7 @@ "Bambu PLA Basic @BBL X1C" ], "default_print_profile": "0.20mm Standard @BBL X1C", - "enable_long_retraction_when_cut" : "1", + "enable_long_retraction_when_cut": "2", "extruder_offset": [ "0x2" ], @@ -39,5 +39,5 @@ "machine_start_gcode": ";===== machine: P1S ========================\n;===== date: 20231107 =====================\n;===== turn on the HB fan & MC board fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\nM710 A1 S255 ;turn on MC fan by default(P1S)\n;===== reset machine status =================\nM290 X40 Y40 Z2.6666666\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_extruder]==\"PLA\"}\n {if (bed_temperature[initial_extruder] >45)||(bed_temperature_initial_layer[initial_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_extruder] >50)||(bed_temperature_initial_layer[initial_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X230 Y15\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_extruder]==\"PLA\"}\n {if (bed_temperature[initial_extruder] >45)||(bed_temperature_initial_layer[initial_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_extruder] >50)||(bed_temperature_initial_layer[initial_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n\nM104 S{nozzle_temperature_initial_layer[initial_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== fmech mode fast check============================\n\n\n;===== nozzle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature_initial_layer[initial_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y11 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E0.700\nG0 X18 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\n", "machine_end_gcode": ";===== date: 20230428 =====================\nM400 ; wait for buffer to clear\nG92 E0 ; zero the extruder\nG1 E-0.8 F1800 ; retract\nG1 Z{max_layer_z + 0.5} F900 ; lower z a little\nG1 X65 Y245 F12000 ; move to safe pos \nG1 Y265 F3000\n\nG1 X65 Y245 F12000\nG1 Y265 F3000\nM140 S0 ; turn off bed\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off remote part cooling fan\nM106 P3 S0 ; turn off chamber cooling fan\n\nG1 X100 F12000 ; wipe\n; pull back filament to AMS\nM620 S255\nG1 X20 Y50 F12000\nG1 Y-3\nT255\nG1 X65 F12000\nG1 Y265\nG1 X100 F12000 ; wipe\nM621 S255\nM104 S0 ; turn off hotend\n\nM622.1 S1 ; for prev firware, default turned on\nM1002 judge_flag timelapse_record_flag\nM622 J1\n M400 ; wait all motion done\n M991 S0 P-1 ;end smooth timelapse at safe pos\n M400 S3 ;wait for last picture to be taken\nM623; end of \"timelapse_record_flag\"\n\nM400 ; wait all motion done\nM17 S\nM17 Z0.4 ; lower z motor current to reduce impact if there is something in the bottom\n{if (max_layer_z + 100.0) < 250}\n G1 Z{max_layer_z + 100.0} F600\n G1 Z{max_layer_z +98.0}\n{else}\n G1 Z250 F600\n G1 Z248\n{endif}\nM400 P100\nM17 R ; restore z current\n\nM220 S100 ; Reset feedrate magnitude\nM201.2 K1.0 ; Reset acc magnitude\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 0\n\nM17 X0.8 Y0.8 Z0.5 ; lower motor current to 45% power\n", "layer_change_gcode": "; layer num/total_layer_count: {layer_num+1}/[total_layer_count]\nM622.1 S1 ; for prev firware, default turned on\nM1002 judge_flag timelapse_record_flag\nM622 J1\n{if timelapse_type == 0} ; timelapse without wipe tower\nM971 S11 C10 O0\n{elsif timelapse_type == 1} ; timelapse with wipe tower\nG92 E0\nG1 E-[retraction_length] F1800\nG17\nG2 Z{layer_z + 0.4} I0.86 J0.86 P1 F20000 ; spiral lift a little\nG1 X65 Y245 F20000 ; move to safe pos\nG17\nG2 Z{layer_z} I0.86 J0.86 P1 F20000\nG1 Y265 F3000\nM400 P300\nM971 S11 C11 O0\nG92 E0\nG1 E[retraction_length] F300\nG1 X100 F5000\nG1 Y255 F20000\n{endif}\nM623\n; update layer progress\nM73 L{layer_num+1}\nM991 S0 P{layer_num} ;notify layer change", - "change_filament_gcode": "M620 S[next_extruder]A\nM204 S9000\n{if toolchange_count > 1 && (z_hop_types[current_extruder] == 0 || z_hop_types[current_extruder] == 3)}\nG17\nG2 Z{z_after_toolchange + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\n{endif}\nG1 Z{max_layer_z + 3.0} F1200\n\nG1 X70 F21000\nG1 Y245\nG1 Y265 F3000\nM400\nM106 P1 S0\nM106 P2 S0\n{if old_filament_temp > 142 && next_extruder < 255}\nM104 S[old_filament_temp]\n{endif}\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 X120 F15000\n{if long_retraction_when_cut && retraction_distance_when_cut > 2}\nG1 E-[retraction_distance_when_cut] F200\nM400\n{endif}\nG1 X20 Y50 F21000\nG1 Y-3\n{if toolchange_count == 2}\n; get travel path for change filament\nM620.1 X[travel_point_1_x] Y[travel_point_1_y] F21000 P0\nM620.1 X[travel_point_2_x] Y[travel_point_2_y] F21000 P1\nM620.1 X[travel_point_3_x] Y[travel_point_3_y] F21000 P2\n{endif}\nM620.1 E F[old_filament_e_feedrate] T{nozzle_temperature_range_high[previous_extruder]}\nT[next_extruder]\nM620.1 E F[new_filament_e_feedrate] T{nozzle_temperature_range_high[next_extruder]}\n\n{if next_extruder < 255}\nM400\n{if long_retraction_when_cut && retraction_distance_when_cut > 2}\nG1 E{retraction_distance_when_cut - 2} F200\nG1 E2 F20\nM400\n{endif}\nG92 E0\n{if flush_length_1 > 1}\nM83\n; FLUSH_START\n; always use highest temperature to flush\nM400\n{if filament_type[next_extruder] == \"PETG\"}\nM109 S260\n{elsif filament_type[next_extruder] == \"PVA\"}\nM109 S210\n{else}\nM109 S[nozzle_temperature_range_high]\n{endif}\n{if flush_length_1 > 23.7}\nG1 E23.7 F{old_filament_e_feedrate} ; do not need pulsatile flushing for start part\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\n{else}\nG1 E{flush_length_1} F{old_filament_e_feedrate}\n{endif}\n; FLUSH_END\nG1 E-[old_retract_length_toolchange] F1800\nG1 E[old_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_2 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_3 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_4 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\n; FLUSH_END\n{endif}\n; FLUSH_START\nM400\nM109 S[new_filament_temp]\nG1 E2 F{new_filament_e_feedrate} ;Compensate for filament spillage during waiting temperature\n; FLUSH_END\nM400\nG92 E0\nG1 E-[new_retract_length_toolchange] F1800\nM106 P1 S255\nM400 S3\n\nG1 X70 F5000\nG1 X90 F3000\nG1 Y255 F4000\nG1 X105 F5000\nG1 Y265 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X70 F10000\nG1 X100 F5000\n\nG1 X70 F10000\nG1 X80 F15000\nG1 X60\nG1 X80\nG1 X60\nG1 X80 ; shake to put down garbage\nG1 X100 F5000\nG1 X165 F15000; wipe and shake\nG1 Y256 ; move Y to aside, prevent collision\nM400\nG1 Z{max_layer_z + 3.0} F3000\n{if layer_z <= (initial_layer_print_height + 0.001)}\nM204 S[initial_layer_acceleration]\n{else}\nM204 S[default_acceleration]\n{endif}\n{else}\nG1 X[x_after_toolchange] Y[y_after_toolchange] Z[z_after_toolchange] F12000\n{endif}\nM621 S[next_extruder]A\n" + "change_filament_gcode": "M620 S[next_extruder]A\nM204 S9000\n{if toolchange_count > 1 && (z_hop_types[current_extruder] == 0 || z_hop_types[current_extruder] == 3)}\nG17\nG2 Z{z_after_toolchange + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\n{endif}\nG1 Z{max_layer_z + 3.0} F1200\n\nG1 X70 F21000\nG1 Y245\nG1 Y265 F3000\nM400\nM106 P1 S0\nM106 P2 S0\n{if old_filament_temp > 142 && next_extruder < 255}\nM104 S[old_filament_temp]\n{endif}\n{if long_retractions_when_cut[previous_extruder]}\nM620.11 S1 I[previous_extruder] E-{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\n{else}\nM620.11 S0\n{endif}\nM400\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 X120 F15000\nG1 X20 Y50 F21000\nG1 Y-3\n{if toolchange_count == 2}\n; get travel path for change filament\nM620.1 X[travel_point_1_x] Y[travel_point_1_y] F21000 P0\nM620.1 X[travel_point_2_x] Y[travel_point_2_y] F21000 P1\nM620.1 X[travel_point_3_x] Y[travel_point_3_y] F21000 P2\n{endif}\nM620.1 E F[old_filament_e_feedrate] T{nozzle_temperature_range_high[previous_extruder]}\nT[next_extruder]\nM620.1 E F[new_filament_e_feedrate] T{nozzle_temperature_range_high[next_extruder]}\n\n{if next_extruder < 255}\n{if long_retractions_when_cut[previous_extruder]}\nM620.11 S1 I[previous_extruder] E{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\nM628 S1\nG92 E0\nG1 E{retraction_distances_when_cut[previous_extruder]} F[old_filament_e_feedrate]\nM400\nM629 S1\n{else}\nM620.11 S0\n{endif}\nG92 E0\n{if flush_length_1 > 1}\nM83\n; FLUSH_START\n; always use highest temperature to flush\nM400\n{if filament_type[next_extruder] == \"PETG\"}\nM109 S260\n{elsif filament_type[next_extruder] == \"PVA\"}\nM109 S210\n{else}\nM109 S[nozzle_temperature_range_high]\n{endif}\n{if flush_length_1 > 23.7}\nG1 E23.7 F{old_filament_e_feedrate} ; do not need pulsatile flushing for start part\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\n{else}\nG1 E{flush_length_1} F{old_filament_e_feedrate}\n{endif}\n; FLUSH_END\nG1 E-[old_retract_length_toolchange] F1800\nG1 E[old_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_2 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_3 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_4 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\n; FLUSH_END\n{endif}\n; FLUSH_START\nM400\nM109 S[new_filament_temp]\nG1 E2 F{new_filament_e_feedrate} ;Compensate for filament spillage during waiting temperature\n; FLUSH_END\nM400\nG92 E0\nG1 E-[new_retract_length_toolchange] F1800\nM106 P1 S255\nM400 S3\n\nG1 X70 F5000\nG1 X90 F3000\nG1 Y255 F4000\nG1 X105 F5000\nG1 Y265 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X70 F10000\nG1 X100 F5000\n\nG1 X70 F10000\nG1 X80 F15000\nG1 X60\nG1 X80\nG1 X60\nG1 X80 ; shake to put down garbage\nG1 X100 F5000\nG1 X165 F15000; wipe and shake\nG1 Y256 ; move Y to aside, prevent collision\nM400\nG1 Z{max_layer_z + 3.0} F3000\n{if layer_z <= (initial_layer_print_height + 0.001)}\nM204 S[initial_layer_acceleration]\n{else}\nM204 S[default_acceleration]\n{endif}\n{else}\nG1 X[x_after_toolchange] Y[y_after_toolchange] Z[z_after_toolchange] F12000\n{endif}\nM621 S[next_extruder]A\n" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.2 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.2 nozzle.json index 115fab918a..795cbb741f 100644 --- a/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.2 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.2 nozzle.json @@ -31,5 +31,5 @@ "Bambu Lab X1E 0.2 nozzle", "Bambu Lab A1 0.2 nozzle" ], - "machine_start_gcode": ";===== machine: X1 =========================\n;===== date: 20230824 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nM290 X40 Y40 Z2.6666666\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y11 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E0.700\nG0 X231 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n T1000\n\n G0 F1200.0 X231 Y15 Z0.2 E0.741\n G0 F1200.0 X226 Y15 Z0.2 E0.275\n G0 F1200.0 X226 Y8 Z0.2 E0.384\n G0 F1200.0 X216 Y8 Z0.2 E0.549\n G0 F1200.0 X216 Y1.5 Z0.2 E0.357\n\n G0 X48.0 E12.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E0.92 F1200.0\n G0 X35.0 Y6.0 E1.03 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n\t{if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E9.35441 F4800\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.160\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.080\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E14.3 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.080 K0.160\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.08 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.08}\n M623\n\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" + "machine_start_gcode": ";===== machine: X1 =========================\n;===== date: 20230824 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nM290 X40 Y40 Z2.6666666\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y11 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E0.700\nG0 X231 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n T1000\n\n G0 F1200.0 X231 Y15 Z0.2 E0.741\n G0 F1200.0 X226 Y15 Z0.2 E0.275\n G0 F1200.0 X226 Y8 Z0.2 E0.384\n G0 F1200.0 X216 Y8 Z0.2 E0.549\n G0 F1200.0 X216 Y1.5 Z0.2 E0.357\n\n G0 X48.0 E12.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E0.92 F1200.0\n G0 X35.0 Y6.0 E1.03 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n\t{if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E9.35441 F4800\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.160\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.080\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E14.3 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.080 K0.160\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.08 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.08}\n M623\n\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.4 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.4 nozzle.json index d64d979208..b56c45b13e 100644 --- a/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.4 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.4 nozzle.json @@ -35,7 +35,7 @@ "Bambu Lab X1E 0.4 nozzle", "Bambu Lab A1 0.4 nozzle" ], - "machine_start_gcode": ";===== machine: X1 =========================\n;===== date: 20230824 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nM290 X40 Y40 Z2.6666666\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y11 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E0.700\nG0 X231 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n T1000\n\n G0 F1200.0 X231 Y15 Z0.2 E0.741\n G0 F1200.0 X226 Y15 Z0.2 E0.275\n G0 F1200.0 X226 Y8 Z0.2 E0.384\n G0 F1200.0 X216 Y8 Z0.2 E0.549\n G0 F1200.0 X216 Y1.5 Z0.2 E0.357\n\n G0 X48.0 E12.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E0.92 F1200.0\n G0 X35.0 Y6.0 E1.03 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E9.35441 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.040\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.020\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E14.3 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.020 K0.040\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.02 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.02}\n M623\n\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4", + "machine_start_gcode": ";===== machine: X1 =========================\n;===== date: 20230824 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nM290 X40 Y40 Z2.6666666\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y11 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E0.700\nG0 X231 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n T1000\n\n G0 F1200.0 X231 Y15 Z0.2 E0.741\n G0 F1200.0 X226 Y15 Z0.2 E0.275\n G0 F1200.0 X226 Y8 Z0.2 E0.384\n G0 F1200.0 X216 Y8 Z0.2 E0.549\n G0 F1200.0 X216 Y1.5 Z0.2 E0.357\n\n G0 X48.0 E12.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E0.92 F1200.0\n G0 X35.0 Y6.0 E1.03 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E9.35441 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.040\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.020\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E14.3 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.020 K0.040\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.02 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.02}\n M623\n\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4", "machine_end_gcode": ";===== date: 20240402 =====================\nM400 ; wait for buffer to clear\nG92 E0 ; zero the extruder\nG1 E-0.8 F1800 ; retract\nG1 Z{max_layer_z + 0.5} F900 ; lower z a little\nG1 X65 Y245 F12000 ; move to safe pos \nG1 Y265 F3000\n\nG1 X65 Y245 F12000\nG1 Y265 F3000\nM140 S0 ; turn off bed\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off remote part cooling fan\nM106 P3 S0 ; turn off chamber cooling fan\n\nG1 X100 F12000 ; wipe\n; pull back filament to AMS\nM620 S255\nG1 X20 Y50 F12000\nG1 Y-3\nT255\nG1 X65 F12000\nG1 Y265\nG1 X100 F12000 ; wipe\nM621 S255\nM104 S0 ; turn off hotend\n\nM622.1 S1 ; for prev firware, default turned on\nM1002 judge_flag timelapse_record_flag\nM622 J1\n M400 ; wait all motion done\n M991 S0 P-1 ;end smooth timelapse at safe pos\n M400 S3 ;wait for last picture to be taken\nM623; end of \"timelapse_record_flag\"\n\nM400 ; wait all motion done\nM17 S\nM17 Z0.4 ; lower z motor current to reduce impact if there is something in the bottom\n{if (max_layer_z + 100.0) < 250}\n G1 Z{max_layer_z + 100.0} F600\n G1 Z{max_layer_z +98.0}\n{else}\n G1 Z250 F600\n G1 Z248\n{endif}\nM400 P100\nM17 R ; restore z current\n\nM220 S100 ; Reset feedrate magnitude\nM201.2 K1.0 ; Reset acc magnitude\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 0\n\nM17 X0.8 Y0.8 Z0.5 ; lower motor current to 45% power\nM960 S5 P0 ; turn off logo lamp\n\n", "change_filament_gcode": "M620 S[next_extruder]A\nM204 S9000\n{if toolchange_count > 1 && (z_hop_types[current_extruder] == 0 || z_hop_types[current_extruder] == 3)}\nG17\nG2 Z{z_after_toolchange + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\n{endif}\nG1 Z{max_layer_z + 3.0} F1200\n\nG1 X70 F21000\nG1 Y245\nG1 Y265 F3000\nM400\nM106 P1 S0\nM106 P2 S0\n{if old_filament_temp > 142 && next_extruder < 255}\nM104 S[old_filament_temp]\n{endif}\n{if long_retractions_when_cut[previous_extruder]}\nM620.11 S1 I[previous_extruder] E-{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\n{else}\nM620.11 S0\n{endif}\nM400\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 X120 F15000\nG1 X20 Y50 F21000\nG1 Y-3\n{if toolchange_count == 2}\n; get travel path for change filament\nM620.1 X[travel_point_1_x] Y[travel_point_1_y] F21000 P0\nM620.1 X[travel_point_2_x] Y[travel_point_2_y] F21000 P1\nM620.1 X[travel_point_3_x] Y[travel_point_3_y] F21000 P2\n{endif}\nM620.1 E F[old_filament_e_feedrate] T{nozzle_temperature_range_high[previous_extruder]}\nT[next_extruder]\nM620.1 E F[new_filament_e_feedrate] T{nozzle_temperature_range_high[next_extruder]}\n\n{if next_extruder < 255}\n{if long_retractions_when_cut[previous_extruder]}\nM620.11 S1 I[previous_extruder] E{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\nM628 S1\nG92 E0\nG1 E{retraction_distances_when_cut[previous_extruder]} F[old_filament_e_feedrate]\nM400\nM629 S1\n{else}\nM620.11 S0\n{endif}\nG92 E0\n{if flush_length_1 > 1}\nM83\n; FLUSH_START\n; always use highest temperature to flush\nM400\n{if filament_type[next_extruder] == \"PETG\"}\nM109 S260\n{elsif filament_type[next_extruder] == \"PVA\"}\nM109 S210\n{else}\nM109 S[nozzle_temperature_range_high]\n{endif}\n{if flush_length_1 > 23.7}\nG1 E23.7 F{old_filament_e_feedrate} ; do not need pulsatile flushing for start part\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\n{else}\nG1 E{flush_length_1} F{old_filament_e_feedrate}\n{endif}\n; FLUSH_END\nG1 E-[old_retract_length_toolchange] F1800\nG1 E[old_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_2 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_3 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_4 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\n; FLUSH_END\n{endif}\n; FLUSH_START\nM400\nM109 S[new_filament_temp]\nG1 E2 F{new_filament_e_feedrate} ;Compensate for filament spillage during waiting temperature\n; FLUSH_END\nM400\nG92 E0\nG1 E-[new_retract_length_toolchange] F1800\nM106 P1 S255\nM400 S3\n\nG1 X70 F5000\nG1 X90 F3000\nG1 Y255 F4000\nG1 X105 F5000\nG1 Y265 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X70 F10000\nG1 X100 F5000\n\nG1 X70 F10000\nG1 X80 F15000\nG1 X60\nG1 X80\nG1 X60\nG1 X80 ; shake to put down garbage\nG1 X100 F5000\nG1 X165 F15000; wipe and shake\nG1 Y256 ; move Y to aside, prevent collision\nM400\nG1 Z{max_layer_z + 3.0} F3000\n{if layer_z <= (initial_layer_print_height + 0.001)}\nM204 S[initial_layer_acceleration]\n{else}\nM204 S[default_acceleration]\n{endif}\n{else}\nG1 X[x_after_toolchange] Y[y_after_toolchange] Z[z_after_toolchange] F12000\n{endif}\nM621 S[next_extruder]A\n" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.6 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.6 nozzle.json index 0ed084037f..b93fbd1013 100644 --- a/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.6 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.6 nozzle.json @@ -33,5 +33,5 @@ "Bambu Lab X1E 0.6 nozzle", "Bambu Lab A1 0.6 nozzle" ], - "machine_start_gcode": ";===== machine: X1 =========================\n;===== date: 20230824 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nM290 X40 Y40 Z2.6666666\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E25 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y15 E1.166 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E1.166\nG0 X231 E1.166 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n G0 F1200.0 X231 Y15 Z0.2 E1.333\n G0 F1200.0 X226 Y15 Z0.2 E0.495\n G0 F1200.0 X226 Y8 Z0.2 E0.691\n G0 F1200.0 X216 Y8 Z0.2 E0.988\n G0 F1200.0 X216 Y1.5 Z0.2 E0.642\n\n G0 X48.0 E20.56 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E1.56 F1200.0\n G0 X35.0 Y6.0 E1.75 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E16.9 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.030\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.015\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E23.9 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.015 K0.030\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.015 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.015}\n M623\n\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" + "machine_start_gcode": ";===== machine: X1 =========================\n;===== date: 20230824 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nM290 X40 Y40 Z2.6666666\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E25 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y15 E1.166 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E1.166\nG0 X231 E1.166 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n G0 F1200.0 X231 Y15 Z0.2 E1.333\n G0 F1200.0 X226 Y15 Z0.2 E0.495\n G0 F1200.0 X226 Y8 Z0.2 E0.691\n G0 F1200.0 X216 Y8 Z0.2 E0.988\n G0 F1200.0 X216 Y1.5 Z0.2 E0.642\n\n G0 X48.0 E20.56 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E1.56 F1200.0\n G0 X35.0 Y6.0 E1.75 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E16.9 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.030\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.015\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E23.9 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.015 K0.030\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.015 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.015}\n M623\n\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.8 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.8 nozzle.json index 46ab176b0d..468a7fcbb2 100644 --- a/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.8 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.8 nozzle.json @@ -33,5 +33,5 @@ "Bambu Lab X1E 0.8 nozzle", "Bambu Lab A1 0.8 nozzle" ], - "machine_start_gcode": ";===== machine: X1 =========================\n;===== date: 20230824 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nM290 X40 Y40 Z2.6666666\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y0.5 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X129 E15 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\nG0 X240 E15\nG0 Y11 E1.364 F{outer_wall_volumetric_speed/(0.3*1.0)/ 4 * 60}\nG0 X239.5\nG0 E0.3\nG0 Y1.5 E1.300\nG0 X231 E1.160 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n G0 F1200.0 X231 Y15 Z0.2 E1.482\n G0 F1200.0 X226 Y15 Z0.2 E0.550\n G0 F1200.0 X226 Y8 Z0.2 E0.768\n G0 F1200.0 X216 Y8 Z0.2 E1.098\n G0 F1200.0 X216 Y1.5 Z0.2 E0.714\n\n G0 X48.0 E25.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E1.70 F1200.0\n G0 X35.0 Y6.0 E1.90 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X110.000 E9.35441 F4800\n G0 X185.000 E9.35441 F4800\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.020\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.010\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X129 E14 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G0 X18 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.010 K0.020\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.01 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14) *0.01}\n M623\n\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X185.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X190.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X195.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X200.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X205.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X210.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X215.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X220.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X225.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n M973 S4\n\nM623\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" + "machine_start_gcode": ";===== machine: X1 =========================\n;===== date: 20230824 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nM290 X40 Y40 Z2.6666666\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y0.5 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X129 E15 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\nG0 X240 E15\nG0 Y11 E1.364 F{outer_wall_volumetric_speed/(0.3*1.0)/ 4 * 60}\nG0 X239.5\nG0 E0.3\nG0 Y1.5 E1.300\nG0 X231 E1.160 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n G0 F1200.0 X231 Y15 Z0.2 E1.482\n G0 F1200.0 X226 Y15 Z0.2 E0.550\n G0 F1200.0 X226 Y8 Z0.2 E0.768\n G0 F1200.0 X216 Y8 Z0.2 E1.098\n G0 F1200.0 X216 Y1.5 Z0.2 E0.714\n\n G0 X48.0 E25.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E1.70 F1200.0\n G0 X35.0 Y6.0 E1.90 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X110.000 E9.35441 F4800\n G0 X185.000 E9.35441 F4800\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.020\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.010\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X129 E14 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G0 X18 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.010 K0.020\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.01 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14) *0.01}\n M623\n\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X185.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X190.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X195.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X200.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X205.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X210.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X215.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X220.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X225.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n M973 S4\n\nM623\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab X1E 0.2 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab X1E 0.2 nozzle.json index 1799d2773a..fcb0cb21cf 100644 --- a/resources/profiles/BBL/machine/Bambu Lab X1E 0.2 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab X1E 0.2 nozzle.json @@ -31,5 +31,5 @@ "Bambu Lab X1 Carbon 0.2 nozzle", "Bambu Lab A1 0.2 nozzle" ], - "machine_start_gcode": ";===== machine: X1E =========================\n;===== date: 20230815 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;==== if Chamber Cooling is necessary ==== \n\n{if (filament_type[initial_no_support_extruder]==\"PLA\") || (filament_type[initial_no_support_extruder]==\"PETG\") || (filament_type[initial_no_support_extruder]==\"TPU\") || (filament_type[initial_no_support_extruder]==\"PVA\") || (filament_type[initial_no_support_extruder]==\"PLA-CF\") || (filament_type[initial_no_support_extruder]==\"PETG-CF\")}\nM1002 gcode_claim_action : 29\nG28\nG90\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nG1 Z75\nM140 S0 ; stop heatbed from heating\nM106 P2 S255 ; open auxiliary fan for cooling\nM106 P3 S255 ; open chamber fan for cooling\nM191 S0 ; wait for chamber temp\nM106 P3 S0 ; reset chamber fan cmd\nM106 P2 S0; reset auxiliary fan cmd\n{endif}\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S290 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n\n;===== set chamber temperature ==========\n{if (overall_chamber_temperature >= 40)}\nM106 P2 S255 ; open big fan to help heating\nM141 S[overall_chamber_temperature] ; Let Chamber begin to heat\n{endif}\n\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y11 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E0.700\nG0 X231 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n T1000\n\n G0 F1200.0 X231 Y15 Z0.2 E0.741\n G0 F1200.0 X226 Y15 Z0.2 E0.275\n G0 F1200.0 X226 Y8 Z0.2 E0.384\n G0 F1200.0 X216 Y8 Z0.2 E0.549\n G0 F1200.0 X216 Y1.5 Z0.2 E0.357\n\n G0 X48.0 E12.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E0.92 F1200.0\n G0 X35.0 Y6.0 E1.03 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n\t{if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E9.35441 F4800\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.160\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.080\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E14.3 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.080 K0.160\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.08 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.08}\n M623\n\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;===== wait chamber temperature reaching the reference value =======\n{if (overall_chamber_temperature >= 40)}\nM191 S[overall_chamber_temperature] ; wait for chamber temp\nM106 P2 S0 ; reset chamber fan cmd\n{endif}\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" + "machine_start_gcode": ";===== machine: X1E =========================\n;===== date: 20230815 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;==== if Chamber Cooling is necessary ==== \n\n{if (filament_type[initial_no_support_extruder]==\"PLA\") || (filament_type[initial_no_support_extruder]==\"PETG\") || (filament_type[initial_no_support_extruder]==\"TPU\") || (filament_type[initial_no_support_extruder]==\"PVA\") || (filament_type[initial_no_support_extruder]==\"PLA-CF\") || (filament_type[initial_no_support_extruder]==\"PETG-CF\")}\nM1002 gcode_claim_action : 29\nG28\nG90\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nG1 Z75\nM140 S0 ; stop heatbed from heating\nM106 P2 S255 ; open auxiliary fan for cooling\nM106 P3 S255 ; open chamber fan for cooling\nM191 S0 ; wait for chamber temp\nM106 P3 S0 ; reset chamber fan cmd\nM106 P2 S0; reset auxiliary fan cmd\n{endif}\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S290 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n\n;===== set chamber temperature ==========\n{if (overall_chamber_temperature >= 40)}\nM106 P2 S255 ; open big fan to help heating\nM141 S[overall_chamber_temperature] ; Let Chamber begin to heat\n{endif}\n\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y11 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E0.700\nG0 X231 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n T1000\n\n G0 F1200.0 X231 Y15 Z0.2 E0.741\n G0 F1200.0 X226 Y15 Z0.2 E0.275\n G0 F1200.0 X226 Y8 Z0.2 E0.384\n G0 F1200.0 X216 Y8 Z0.2 E0.549\n G0 F1200.0 X216 Y1.5 Z0.2 E0.357\n\n G0 X48.0 E12.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E0.92 F1200.0\n G0 X35.0 Y6.0 E1.03 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n\t{if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E9.35441 F4800\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.160\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.080\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E14.3 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.080 K0.160\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.08 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.08}\n M623\n\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;===== wait chamber temperature reaching the reference value =======\n{if (overall_chamber_temperature >= 40)}\nM191 S[overall_chamber_temperature] ; wait for chamber temp\nM106 P2 S0 ; reset chamber fan cmd\n{endif}\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab X1E 0.4 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab X1E 0.4 nozzle.json index 99f878f4fc..83fd375a6e 100644 --- a/resources/profiles/BBL/machine/Bambu Lab X1E 0.4 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab X1E 0.4 nozzle.json @@ -37,7 +37,7 @@ "Bambu Lab X1 Carbon 0.4 nozzle", "Bambu Lab A1 0.4 nozzle" ], - "machine_start_gcode": ";===== machine: X1E =========================\n;===== date: 20230815 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;==== if Chamber Cooling is necessary ==== \n\n{if (filament_type[initial_no_support_extruder]==\"PLA\") || (filament_type[initial_no_support_extruder]==\"PETG\") || (filament_type[initial_no_support_extruder]==\"TPU\") || (filament_type[initial_no_support_extruder]==\"PVA\") || (filament_type[initial_no_support_extruder]==\"PLA-CF\") || (filament_type[initial_no_support_extruder]==\"PETG-CF\")}\nM1002 gcode_claim_action : 29\nG28\nG90\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nG1 Z75\nM140 S0 ; stop heatbed from heating\nM106 P2 S255 ; open auxiliary fan for cooling\nM106 P3 S255 ; open chamber fan for cooling\nM191 S0 ; wait for chamber temp\nM106 P3 S0 ; reset chamber fan cmd\nM106 P2 S0; reset auxiliary fan cmd\n{endif}\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S290 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n\n;===== set chamber temperature ==========\n{if (overall_chamber_temperature >= 40)}\nM106 P2 S255 ; open big fan to help heating\nM141 S[overall_chamber_temperature] ; Let Chamber begin to heat\n{endif}\n\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y11 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E0.700\nG0 X231 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n T1000\n\n G0 F1200.0 X231 Y15 Z0.2 E0.741\n G0 F1200.0 X226 Y15 Z0.2 E0.275\n G0 F1200.0 X226 Y8 Z0.2 E0.384\n G0 F1200.0 X216 Y8 Z0.2 E0.549\n G0 F1200.0 X216 Y1.5 Z0.2 E0.357\n\n G0 X48.0 E12.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E0.92 F1200.0\n G0 X35.0 Y6.0 E1.03 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E9.35441 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.040\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.020\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E14.3 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.020 K0.040\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.02 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.02}\n M623\n\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;===== wait chamber temperature reaching the reference value =======\n{if (overall_chamber_temperature >= 40)}\nM191 S[overall_chamber_temperature] ; wait for chamber temp\nM106 P2 S0 ; reset chamber fan cmd\n{endif}\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4\n\n", + "machine_start_gcode": ";===== machine: X1E =========================\n;===== date: 20230815 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;==== if Chamber Cooling is necessary ==== \n\n{if (filament_type[initial_no_support_extruder]==\"PLA\") || (filament_type[initial_no_support_extruder]==\"PETG\") || (filament_type[initial_no_support_extruder]==\"TPU\") || (filament_type[initial_no_support_extruder]==\"PVA\") || (filament_type[initial_no_support_extruder]==\"PLA-CF\") || (filament_type[initial_no_support_extruder]==\"PETG-CF\")}\nM1002 gcode_claim_action : 29\nG28\nG90\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nG1 Z75\nM140 S0 ; stop heatbed from heating\nM106 P2 S255 ; open auxiliary fan for cooling\nM106 P3 S255 ; open chamber fan for cooling\nM191 S0 ; wait for chamber temp\nM106 P3 S0 ; reset chamber fan cmd\nM106 P2 S0; reset auxiliary fan cmd\n{endif}\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S290 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n\n;===== set chamber temperature ==========\n{if (overall_chamber_temperature >= 40)}\nM106 P2 S255 ; open big fan to help heating\nM141 S[overall_chamber_temperature] ; Let Chamber begin to heat\n{endif}\n\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y11 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E0.700\nG0 X231 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n T1000\n\n G0 F1200.0 X231 Y15 Z0.2 E0.741\n G0 F1200.0 X226 Y15 Z0.2 E0.275\n G0 F1200.0 X226 Y8 Z0.2 E0.384\n G0 F1200.0 X216 Y8 Z0.2 E0.549\n G0 F1200.0 X216 Y1.5 Z0.2 E0.357\n\n G0 X48.0 E12.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E0.92 F1200.0\n G0 X35.0 Y6.0 E1.03 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E9.35441 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.040\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.020\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E14.3 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.020 K0.040\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.02 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.02}\n M623\n\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;===== wait chamber temperature reaching the reference value =======\n{if (overall_chamber_temperature >= 40)}\nM191 S[overall_chamber_temperature] ; wait for chamber temp\nM106 P2 S0 ; reset chamber fan cmd\n{endif}\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4\n\n", "machine_end_gcode": ";===== date: 20240402 =====================\nM400 ; wait for buffer to clear\nG92 E0 ; zero the extruder\nG1 E-0.8 F1800 ; retract\nG1 Z{max_layer_z + 0.5} F900 ; lower z a little\nG1 X65 Y245 F12000 ; move to safe pos \nG1 Y265 F3000\n\nG1 X65 Y245 F12000\nG1 Y265 F3000\nM141 S0 ; turn off chamber \nM140 S0 ; turn off bed\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off remote part cooling fan\nM106 P3 S0 ; turn off chamber cooling fan\n\nG1 X100 F12000 ; wipe\n; pull back filament to AMS\nM620 S255\nG1 X20 Y50 F12000\nG1 Y-3\nT255\nG1 X65 F12000\nG1 Y265\nG1 X100 F12000 ; wipe\nM621 S255\nM104 S0 ; turn off hotend\n\nM622.1 S1 ; for prev firware, default turned on\nM1002 judge_flag timelapse_record_flag\nM622 J1\n M400 ; wait all motion done\n M991 S0 P-1 ;end smooth timelapse at safe pos\n M400 S3 ;wait for last picture to be taken\nM623; end of \"timelapse_record_flag\"\n\nM400 ; wait all motion done\nM17 S\nM17 Z0.4 ; lower z motor current to reduce impact if there is something in the bottom\n{if (max_layer_z + 100.0) < 250}\n G1 Z{max_layer_z + 100.0} F600\n G1 Z{max_layer_z +98.0}\n{else}\n G1 Z250 F600\n G1 Z248\n{endif}\nM400 P100\nM17 R ; restore z current\n\nM220 S100 ; Reset feedrate magnitude\nM201.2 K1.0 ; Reset acc magnitude\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 0\n\nM17 X0.8 Y0.8 Z0.5 ; lower motor current to 45% power\nM960 S5 P0 ; turn off logo lamp\n\n", "change_filament_gcode": "M620 S[next_extruder]A\nM204 S9000\n{if toolchange_count > 1 && (z_hop_types[current_extruder] == 0 || z_hop_types[current_extruder] == 3)}\nG17\nG2 Z{z_after_toolchange + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\n{endif}\nG1 Z{max_layer_z + 3.0} F1200\n\nG1 X70 F21000\nG1 Y245\nG1 Y265 F3000\nM400\nM106 P1 S0\nM106 P2 S0\n{if old_filament_temp > 142 && next_extruder < 255}\nM104 S[old_filament_temp]\n{endif}\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 X120 F15000\n{if long_retraction_when_cut && retraction_distance_when_cut > 2}\nG1 E-[retraction_distance_when_cut] F200\nM400\n{endif}\nG1 X20 Y50 F21000\nG1 Y-3\n{if toolchange_count == 2}\n; get travel path for change filament\nM620.1 X[travel_point_1_x] Y[travel_point_1_y] F21000 P0\nM620.1 X[travel_point_2_x] Y[travel_point_2_y] F21000 P1\nM620.1 X[travel_point_3_x] Y[travel_point_3_y] F21000 P2\n{endif}\nM620.1 E F[old_filament_e_feedrate] T{nozzle_temperature_range_high[previous_extruder]}\nT[next_extruder]\nM620.1 E F[new_filament_e_feedrate] T{nozzle_temperature_range_high[next_extruder]}\n\n{if next_extruder < 255}\nM400\n{if long_retraction_when_cut && retraction_distance_when_cut > 2}\nG1 E{retraction_distance_when_cut - 2} F200\nG1 E2 F20\nM400\n{endif}\nG92 E0\n{if flush_length_1 > 1}\nM83\n; FLUSH_START\n; always use highest temperature to flush\nM400\n{if filament_type[next_extruder] == \"PETG\"}\nM109 S260\n{elsif filament_type[next_extruder] == \"PVA\"}\nM109 S210\n{else}\nM109 S[nozzle_temperature_range_high]\n{endif}\n{if flush_length_1 > 23.7}\nG1 E23.7 F{old_filament_e_feedrate} ; do not need pulsatile flushing for start part\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\n{else}\nG1 E{flush_length_1} F{old_filament_e_feedrate}\n{endif}\n; FLUSH_END\nG1 E-[old_retract_length_toolchange] F1800\nG1 E[old_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_2 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_3 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_4 > 1}\n\nG91\nG1 X3 F12000; move aside to extrude\nG90\nM83\n\n; FLUSH_START\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\n; FLUSH_END\n{endif}\n; FLUSH_START\nM400\nM109 S[new_filament_temp]\nG1 E2 F{new_filament_e_feedrate} ;Compensate for filament spillage during waiting temperature\n; FLUSH_END\nM400\nG92 E0\nG1 E-[new_retract_length_toolchange] F1800\nM106 P1 S255\nM400 S3\n\nG1 X70 F5000\nG1 X90 F3000\nG1 Y255 F4000\nG1 X105 F5000\nG1 Y265 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X70 F10000\nG1 X100 F5000\n\nG1 X70 F10000\nG1 X80 F15000\nG1 X60\nG1 X80\nG1 X60\nG1 X80 ; shake to put down garbage\nG1 X100 F5000\nG1 X165 F15000; wipe and shake\nG1 Y256 ; move Y to aside, prevent collision\nM400\nG1 Z{max_layer_z + 3.0} F3000\n{if layer_z <= (initial_layer_print_height + 0.001)}\nM204 S[initial_layer_acceleration]\n{else}\nM204 S[default_acceleration]\n{endif}\n{else}\nG1 X[x_after_toolchange] Y[y_after_toolchange] Z[z_after_toolchange] F12000\n{endif}\nM621 S[next_extruder]A\n" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab X1E 0.6 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab X1E 0.6 nozzle.json index 6e116866e5..920dad2ed4 100644 --- a/resources/profiles/BBL/machine/Bambu Lab X1E 0.6 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab X1E 0.6 nozzle.json @@ -33,5 +33,5 @@ "Bambu Lab X1 Carbon 0.6 nozzle", "Bambu Lab A1 0.6 nozzle" ], - "machine_start_gcode": ";===== machine: X1E =========================\n;===== date: 20230815 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;==== if Chamber Cooling is necessary ==== \n\n{if (filament_type[initial_no_support_extruder]==\"PLA\") || (filament_type[initial_no_support_extruder]==\"PETG\") || (filament_type[initial_no_support_extruder]==\"TPU\") || (filament_type[initial_no_support_extruder]==\"PVA\") || (filament_type[initial_no_support_extruder]==\"PLA-CF\") || (filament_type[initial_no_support_extruder]==\"PETG-CF\")}\nM1002 gcode_claim_action : 29\nG28\nG90\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nG1 Z75\nM140 S0 ; stop heatbed from heating\nM106 P2 S255 ; open auxiliary fan for cooling\nM106 P3 S255 ; open chamber fan for cooling\nM191 S0 ; wait for chamber temp\nM106 P3 S0 ; reset chamber fan cmd\nM106 P2 S0; reset auxiliary fan cmd\n{endif}\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S290 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n\n;===== set chamber temperature ==========\n{if (overall_chamber_temperature >= 40)}\nM106 P2 S255 ; open big fan to help heating\nM141 S[overall_chamber_temperature] ; Let Chamber begin to heat\n{endif}\n\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E25 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y15 E1.166 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E1.166\nG0 X231 E1.166 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n G0 F1200.0 X231 Y15 Z0.2 E1.333\n G0 F1200.0 X226 Y15 Z0.2 E0.495\n G0 F1200.0 X226 Y8 Z0.2 E0.691\n G0 F1200.0 X216 Y8 Z0.2 E0.988\n G0 F1200.0 X216 Y1.5 Z0.2 E0.642\n\n G0 X48.0 E20.56 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E1.56 F1200.0\n G0 X35.0 Y6.0 E1.75 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E16.9 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.030\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.015\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E23.9 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.015 K0.030\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.015 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.015}\n M623\n\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;===== wait chamber temperature reaching the reference value =======\n{if (overall_chamber_temperature >= 40)}\nM191 S[overall_chamber_temperature] ; wait for chamber temp\nM106 P2 S0 ; reset chamber fan cmd\n{endif}\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" + "machine_start_gcode": ";===== machine: X1E =========================\n;===== date: 20230815 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;==== if Chamber Cooling is necessary ==== \n\n{if (filament_type[initial_no_support_extruder]==\"PLA\") || (filament_type[initial_no_support_extruder]==\"PETG\") || (filament_type[initial_no_support_extruder]==\"TPU\") || (filament_type[initial_no_support_extruder]==\"PVA\") || (filament_type[initial_no_support_extruder]==\"PLA-CF\") || (filament_type[initial_no_support_extruder]==\"PETG-CF\")}\nM1002 gcode_claim_action : 29\nG28\nG90\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nG1 Z75\nM140 S0 ; stop heatbed from heating\nM106 P2 S255 ; open auxiliary fan for cooling\nM106 P3 S255 ; open chamber fan for cooling\nM191 S0 ; wait for chamber temp\nM106 P3 S0 ; reset chamber fan cmd\nM106 P2 S0; reset auxiliary fan cmd\n{endif}\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S290 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n\n;===== set chamber temperature ==========\n{if (overall_chamber_temperature >= 40)}\nM106 P2 S255 ; open big fan to help heating\nM141 S[overall_chamber_temperature] ; Let Chamber begin to heat\n{endif}\n\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E25 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y15 E1.166 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E1.166\nG0 X231 E1.166 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n G0 F1200.0 X231 Y15 Z0.2 E1.333\n G0 F1200.0 X226 Y15 Z0.2 E0.495\n G0 F1200.0 X226 Y8 Z0.2 E0.691\n G0 F1200.0 X216 Y8 Z0.2 E0.988\n G0 F1200.0 X216 Y1.5 Z0.2 E0.642\n\n G0 X48.0 E20.56 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E1.56 F1200.0\n G0 X35.0 Y6.0 E1.75 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E16.9 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.030\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.015\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E23.9 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.015 K0.030\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.015 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.015}\n M623\n\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;===== wait chamber temperature reaching the reference value =======\n{if (overall_chamber_temperature >= 40)}\nM191 S[overall_chamber_temperature] ; wait for chamber temp\nM106 P2 S0 ; reset chamber fan cmd\n{endif}\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab X1E 0.8 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab X1E 0.8 nozzle.json index eea8eab1a0..a3e4c8089d 100644 --- a/resources/profiles/BBL/machine/Bambu Lab X1E 0.8 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab X1E 0.8 nozzle.json @@ -33,5 +33,5 @@ "Bambu Lab X1 Carbon 0.8 nozzle", "Bambu Lab A1 0.8 nozzle" ], - "machine_start_gcode": ";===== machine: X1E =========================\n;===== date: 20230815 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nM290 X40 Y40 Z2.6666666\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;==== if Chamber Cooling is necessary ==== \n\n{if (filament_type[initial_no_support_extruder]==\"PLA\") || (filament_type[initial_no_support_extruder]==\"PETG\") || (filament_type[initial_no_support_extruder]==\"TPU\") || (filament_type[initial_no_support_extruder]==\"PVA\") || (filament_type[initial_no_support_extruder]==\"PLA-CF\") || (filament_type[initial_no_support_extruder]==\"PETG-CF\")}\nM1002 gcode_claim_action : 29\nG28\nG90\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nG1 Z75\nM140 S0 ; stop heatbed from heating\nM106 P2 S255 ; open auxiliary fan for cooling\nM106 P3 S255 ; open chamber fan for cooling\nM191 S0 ; wait for chamber temp\nM106 P3 S0 ; reset chamber fan cmd\nM106 P2 S0; reset auxiliary fan cmd\n{endif}\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S290 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n\n;===== set chamber temperature ==========\n{if (overall_chamber_temperature >= 40)}\nM106 P2 S255 ; open big fan to help heating\nM141 S[overall_chamber_temperature] ; Let Chamber begin to heat\n{endif}\n\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM142 P1 R35 S40\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y0.5 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X129 E15 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\nG0 X240 E15\nG0 Y11 E1.364 F{outer_wall_volumetric_speed/(0.3*1.0)/ 4 * 60}\nG0 X239.5\nG0 E0.3\nG0 Y1.5 E1.300\nG0 X231 E1.160 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n G0 F1200.0 X231 Y15 Z0.2 E1.482\n G0 F1200.0 X226 Y15 Z0.2 E0.550\n G0 F1200.0 X226 Y8 Z0.2 E0.768\n G0 F1200.0 X216 Y8 Z0.2 E1.098\n G0 F1200.0 X216 Y1.5 Z0.2 E0.714\n\n G0 X48.0 E25.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E1.70 F1200.0\n G0 X35.0 Y6.0 E1.90 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X110.000 E9.35441 F4800\n G0 X185.000 E9.35441 F4800\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.020\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.010\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X129 E14 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G0 X18 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.010 K0.020\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.01 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14) *0.01}\n M623\n\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X185.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X190.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X195.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X200.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X205.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X210.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X215.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X220.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X225.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n M973 S4\n\nM623\n\n;===== wait chamber temperature reaching the reference value =======\n{if (overall_chamber_temperature >= 40)}\nM191 S[overall_chamber_temperature] ; wait for chamber temp\nM106 P2 S0 ; reset chamber fan cmd\n{endif}\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" + "machine_start_gcode": ";===== machine: X1E =========================\n;===== date: 20230815 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nM290 X40 Y40 Z2.6666666\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;==== if Chamber Cooling is necessary ==== \n\n{if (filament_type[initial_no_support_extruder]==\"PLA\") || (filament_type[initial_no_support_extruder]==\"PETG\") || (filament_type[initial_no_support_extruder]==\"TPU\") || (filament_type[initial_no_support_extruder]==\"PVA\") || (filament_type[initial_no_support_extruder]==\"PLA-CF\") || (filament_type[initial_no_support_extruder]==\"PETG-CF\")}\nM1002 gcode_claim_action : 29\nG28\nG90\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nG1 Z75\nM140 S0 ; stop heatbed from heating\nM106 P2 S255 ; open auxiliary fan for cooling\nM106 P3 S255 ; open chamber fan for cooling\nM191 S0 ; wait for chamber temp\nM106 P3 S0 ; reset chamber fan cmd\nM106 P2 S0; reset auxiliary fan cmd\n{endif}\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S290 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n\n;===== set chamber temperature ==========\n{if (overall_chamber_temperature >= 40)}\nM106 P2 S255 ; open big fan to help heating\nM141 S[overall_chamber_temperature] ; Let Chamber begin to heat\n{endif}\n\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n M142 P1 R35 S40\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y0.5 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X129 E15 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\nG0 X240 E15\nG0 Y11 E1.364 F{outer_wall_volumetric_speed/(0.3*1.0)/ 4 * 60}\nG0 X239.5\nG0 E0.3\nG0 Y1.5 E1.300\nG0 X231 E1.160 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n G0 F1200.0 X231 Y15 Z0.2 E1.482\n G0 F1200.0 X226 Y15 Z0.2 E0.550\n G0 F1200.0 X226 Y8 Z0.2 E0.768\n G0 F1200.0 X216 Y8 Z0.2 E1.098\n G0 F1200.0 X216 Y1.5 Z0.2 E0.714\n\n G0 X48.0 E25.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E1.70 F1200.0\n G0 X35.0 Y6.0 E1.90 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X110.000 E9.35441 F4800\n G0 X185.000 E9.35441 F4800\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.020\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.010\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X129 E14 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G0 X18 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.010 K0.020\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.01 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14) *0.01}\n M623\n\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X185.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X190.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X195.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X200.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X205.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X210.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X215.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X220.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X225.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n M973 S4\n\nM623\n\n;===== wait chamber temperature reaching the reference value =======\n{if (overall_chamber_temperature >= 40)}\nM191 S[overall_chamber_temperature] ; wait for chamber temp\nM106 P2 S0 ; reset chamber fan cmd\n{endif}\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/fdm_machine_common.json b/resources/profiles/BBL/machine/fdm_machine_common.json index e736dc6662..59c372c15f 100644 --- a/resources/profiles/BBL/machine/fdm_machine_common.json +++ b/resources/profiles/BBL/machine/fdm_machine_common.json @@ -12,6 +12,7 @@ "deretraction_speed": [ "40" ], + "enable_long_retraction_when_cut" : "0", "extruder_colour": [ "#FCE94F" ], @@ -20,6 +21,9 @@ ], "gcode_flavor": "marlin", "silent_mode": "0", + "long_retractions_when_cut": [ + "0" + ], "machine_max_acceleration_e": [ "5000" ], @@ -88,6 +92,9 @@ "retract_when_changing_layer": [ "1" ], + "retraction_distances_when_cut": [ + "18" + ], "retraction_length": [ "5" ], diff --git a/src/OrcaSlicer.cpp b/src/OrcaSlicer.cpp index b5530bc628..3981a6669c 100644 --- a/src/OrcaSlicer.cpp +++ b/src/OrcaSlicer.cpp @@ -791,7 +791,8 @@ static int construct_assemble_list(std::vector &assemble_ else if (boost::algorithm::iends_with(assemble_object.path, ".obj")) { std::string message; - bool result = load_obj(path_str, &mesh, message); + ObjInfo obj_info; + bool result = load_obj(path_str, &mesh, obj_info, message); if (!result) { BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << boost::format(": failed to read a valid mesh from obj file %1%, plate index %2%, object index %3%, error %4%") % assemble_object.path % (index + 1) % (obj_index + 1) % message; return CLI_DATA_FILE_ERROR; @@ -1456,6 +1457,12 @@ int CLI::run(int argc, char **argv) m_models.push_back(std::move(model)); } + if (!is_bbl_3mf && plate_to_slice > 0) + { + BOOST_LOG_TRIVIAL(warning) << boost::format("%1%: not support to slice plate %2%, reset to 0")%__LINE__ %plate_to_slice; + plate_to_slice = 0; + } + //load custom gcode file std::map custom_gcodes_map; if (!custom_gcode_file.empty()) { @@ -2624,7 +2631,7 @@ int CLI::run(int argc, char **argv) //set multiplier to 1? m_print_config.option("flush_multiplier", true)->set(new ConfigOptionFloat(1.f)); - const std::vector& min_flush_volumes = Slic3r::GUI::get_min_flush_volumes(); + const std::vector& min_flush_volumes = Slic3r::GUI::get_min_flush_volumes(m_print_config); if (filament_is_support->size() != project_filament_count) { @@ -3525,7 +3532,8 @@ int CLI::run(int argc, char **argv) ap.apply(); } - partplate_list.rebuild_plates_after_arrangement(false, true, i); + //lock here + cur_plate->lock(true); } else { size_t plate_obj_count = assemble_plate.loaded_obj_list.size(); @@ -3548,6 +3556,8 @@ int CLI::run(int argc, char **argv) Slic3r::GUI::PartPlate* cur_plate = (Slic3r::GUI::PartPlate*)partplate_list.get_plate(i); cur_plate->lock(false); } + + partplate_list.reload_all_objects(false, -1); } else if (need_arrange) { @@ -4175,7 +4185,8 @@ int CLI::run(int argc, char **argv) bool no_check = false; std::string export_3mf_file, load_slice_data_dir, export_slice_data_dir; std::vector calibration_thumbnails; - int max_slicing_time_per_plate = 0, max_triangle_count_per_plate = 0; + std::vector plate_object_count(partplate_list.get_plate_count(), 0); + int max_slicing_time_per_plate = 0, max_triangle_count_per_plate = 0, sliced_plate = -1; std::vector plate_has_skips(partplate_list.get_plate_count(), false); std::vector> plate_skipped_objects(partplate_list.get_plate_count()); @@ -4269,6 +4280,7 @@ int CLI::run(int argc, char **argv) } else if (opt_key == "slice") { //BBS: slice 0 means all plates, i means plate i; plate_to_slice = m_config.option("slice")->value; + sliced_plate = plate_to_slice; bool pre_check = (plate_to_slice == 0)?true:false; bool finished = false; @@ -4427,6 +4439,7 @@ int CLI::run(int argc, char **argv) } plate_triangle_counts[index] = triangle_count; + plate_object_count[index] = printable_instances; BOOST_LOG_TRIVIAL(info) << "plate "<< index+1<< ": load cached data success, go on."; } // BBS: TODO @@ -4734,6 +4747,28 @@ int CLI::run(int argc, char **argv) PlateDataPtrs plate_data_list; partplate_list.store_to_3mf_structure(plate_data_list); + if (sliced_plate == -1) { + for (int i = 0; i < plate_data_list.size(); i++) { + Slic3r::GUI::PartPlate *part_plate = partplate_list.get_plate(i); + plate_object_count[i] = part_plate->printable_instance_size(); + } + } + else if (sliced_plate == 0){ + //slicing all + for (int i = 0; i < plate_data_list.size(); i++) { + if (skip_useless_pick && (plate_object_count[i] == 1)) { + BOOST_LOG_TRIVIAL(info) << boost::format("only has 1 object, set plate %1%'s is_label_object_enabled from %2% to false")%(i+1) % (plate_data_list[i]->is_label_object_enabled); + plate_data_list[i]->is_label_object_enabled = false; + } + } + } + else { + if (skip_useless_pick && (plate_object_count[sliced_plate - 1] == 1)) { + BOOST_LOG_TRIVIAL(info) << boost::format("only has 1 object, set plate %1%'s is_label_object_enabled from %2% to false")%sliced_plate % (plate_data_list[sliced_plate - 1]->is_label_object_enabled); + plate_data_list[sliced_plate - 1]->is_label_object_enabled = false; + } + } + if (!outfile_dir.empty()) { export_3mf_file = outfile_dir + "/"+export_3mf_file; } @@ -4752,7 +4787,7 @@ int CLI::run(int argc, char **argv) // get type and color for platedata auto* filament_types = dynamic_cast(m_print_config.option("filament_type")); const ConfigOptionStrings* filament_color = dynamic_cast(m_print_config.option("filament_colour")); - //auto* filament_id = dynamic_cast(m_print_config.option("filament_ids")); + auto* filament_id = dynamic_cast(m_print_config.option("filament_ids")); const ConfigOptionFloats* nozzle_diameter_option = dynamic_cast(m_print_config.option("nozzle_diameter")); std::string nozzle_diameter_str; if (nozzle_diameter_option) @@ -4769,10 +4804,10 @@ int CLI::run(int argc, char **argv) plate_data->nozzle_diameters = nozzle_diameter_str; for (auto it = plate_data->slice_filaments_info.begin(); it != plate_data->slice_filaments_info.end(); it++) { - //it->filament_id = filament_id?filament_id->get_at(it->id):"unknown"; std::string display_filament_type; it->type = m_print_config.get_filament_type(display_filament_type, it->id); it->color = filament_color ? filament_color->get_at(it->id) : "#FFFFFF"; + it->filament_id = filament_id?filament_id->get_at(it->id):""; } if (!plate_data->plate_thumbnail.is_valid()) { @@ -4940,6 +4975,7 @@ int CLI::run(int argc, char **argv) } } + ThumbnailsParams thumbnail_params; GLShaderProgram* shader = opengl_mgr.get_shader("thumbnail"); if (!shader) { BOOST_LOG_TRIVIAL(error) << boost::format("can not get shader for rendering thumbnail"); @@ -5057,39 +5093,49 @@ int CLI::run(int argc, char **argv) unsigned int thumbnail_width = 512, thumbnail_height = 512; const ThumbnailsParams thumbnail_params = { {}, false, true, false, true, i }; - BOOST_LOG_TRIVIAL(info) << boost::format("plate %1%'s top/pick thumbnail missed, need to regenerate")%(i+1); - - switch (Slic3r::GUI::OpenGLManager::get_framebuffers_type()) + BOOST_LOG_TRIVIAL(info) << boost::format("plate %1%'s top/pick thumbnail missed, need to regenerate, objects count %2%, skip_useless_pick %3%")%(i+1) %plate_object_count[i] %skip_useless_pick; + if (skip_useless_pick && ((plate_object_count[i] <= 1) || (plate_object_count[i] > 64))) { - case Slic3r::GUI::OpenGLManager::EFramebufferType::Arb: - { - BOOST_LOG_TRIVIAL(info) << boost::format("framebuffer_type: ARB"); - Slic3r::GUI::GLCanvas3D::render_thumbnail_framebuffer(*top_thumbnail, - thumbnail_width, thumbnail_height, thumbnail_params, - partplate_list, model.objects, glvolume_collection, colors_out, shader, Slic3r::GUI::Camera::EType::Ortho, true, false); - Slic3r::GUI::GLCanvas3D::render_thumbnail_framebuffer(*picking_thumbnail, - thumbnail_width, thumbnail_height, thumbnail_params, - partplate_list, model.objects, glvolume_collection, colors_out, shader, Slic3r::GUI::Camera::EType::Ortho, true, true); - break; - } - case Slic3r::GUI::OpenGLManager::EFramebufferType::Ext: - { - BOOST_LOG_TRIVIAL(info) << boost::format("framebuffer_type: EXT"); - Slic3r::GUI::GLCanvas3D::render_thumbnail_framebuffer_ext(*top_thumbnail, - thumbnail_width, thumbnail_height, thumbnail_params, - partplate_list, model.objects, glvolume_collection, colors_out, shader, Slic3r::GUI::Camera::EType::Ortho, true, false); - Slic3r::GUI::GLCanvas3D::render_thumbnail_framebuffer_ext(*picking_thumbnail, - thumbnail_width, thumbnail_height, thumbnail_params, - partplate_list, model.objects, glvolume_collection, colors_out, shader, Slic3r::GUI::Camera::EType::Ortho, true, true); - break; - } - default: - BOOST_LOG_TRIVIAL(info) << boost::format("framebuffer_type: unknown"); - break; + //don't render pick and top + part_plate->top_thumbnail_data.reset(); + part_plate->pick_thumbnail_data.reset(); + plate_data->top_file.clear(); + plate_data->pick_file.clear(); + BOOST_LOG_TRIVIAL(info) << boost::format("skip rendering for top&&pick"); + } + else { + switch (Slic3r::GUI::OpenGLManager::get_framebuffers_type()) + { + case Slic3r::GUI::OpenGLManager::EFramebufferType::Arb: + { + BOOST_LOG_TRIVIAL(info) << boost::format("framebuffer_type: ARB"); + Slic3r::GUI::GLCanvas3D::render_thumbnail_framebuffer(*top_thumbnail, + thumbnail_width, thumbnail_height, thumbnail_params, + partplate_list, model.objects, glvolume_collection, colors_out, shader, Slic3r::GUI::Camera::EType::Ortho, true, false); + Slic3r::GUI::GLCanvas3D::render_thumbnail_framebuffer(*picking_thumbnail, + thumbnail_width, thumbnail_height, thumbnail_params, + partplate_list, model.objects, glvolume_collection, colors_out, shader, Slic3r::GUI::Camera::EType::Ortho, true, true); + break; + } + case Slic3r::GUI::OpenGLManager::EFramebufferType::Ext: + { + BOOST_LOG_TRIVIAL(info) << boost::format("framebuffer_type: EXT"); + Slic3r::GUI::GLCanvas3D::render_thumbnail_framebuffer_ext(*top_thumbnail, + thumbnail_width, thumbnail_height, thumbnail_params, + partplate_list, model.objects, glvolume_collection, colors_out, shader, Slic3r::GUI::Camera::EType::Ortho, true, false); + Slic3r::GUI::GLCanvas3D::render_thumbnail_framebuffer_ext(*picking_thumbnail, + thumbnail_width, thumbnail_height, thumbnail_params, + partplate_list, model.objects, glvolume_collection, colors_out, shader, Slic3r::GUI::Camera::EType::Ortho, true, true); + break; + } + default: + BOOST_LOG_TRIVIAL(info) << boost::format("framebuffer_type: unknown"); + break; + } + plate_data->top_file = "valid_top"; + plate_data->pick_file = "valid_pick"; + BOOST_LOG_TRIVIAL(info) << boost::format("plate %1%'s top_thumbnail,finished rendering")%(i+1); } - plate_data->top_file = "valid_top"; - plate_data->pick_file = "valid_pick"; - BOOST_LOG_TRIVIAL(info) << boost::format("plate %1%'s top_thumbnail,finished rendering")%(i+1); } } diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index 9e9b56e9d8..49a7228f1f 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -186,6 +186,8 @@ void AppConfig::set_defaults() if (get("show_hints").empty()) set_bool("show_hints", true); //#endif + if (get("enable_multi_machine").empty()) + set_bool("enable_multi_machine", false); if (get("show_gcode_window").empty()) set_bool("show_gcode_window", true); @@ -359,6 +361,14 @@ void AppConfig::set_defaults() set("curr_bed_type", "1"); } + if (get("sending_interval").empty()) { + set("sending_interval", "5"); + } + + if (get("max_send").empty()) { + set("max_send", "3"); + } + // #if BBL_RELEASE_TO_PUBLIC if (get("iot_environment").empty()) { set("iot_environment", "3"); @@ -1246,6 +1256,38 @@ bool AppConfig::is_engineering_region(){ return false; } +void AppConfig::save_custom_color_to_config(const std::vector &colors) +{ + auto set_colors = [](std::map &data, const std::vector &colors) { + for (size_t i = 0; i < colors.size(); i++) { + data[std::to_string(10 + i)] = colors[i]; // for map sort:10 begin + } + }; + if (colors.size() > 0) { + if (!has_section("custom_color_list")) { + std::map data; + set_colors(data, colors); + set_section("custom_color_list", data); + } else { + auto data = get_section("custom_color_list"); + auto data_modify = const_cast *>(&data); + set_colors(*data_modify, colors); + set_section("custom_color_list", *data_modify); + } + } +} + +std::vector AppConfig::get_custom_color_from_config() +{ + std::vector colors; + if (has_section("custom_color_list")) { + auto data = get_section("custom_color_list"); + for (auto iter : data) { + colors.push_back(iter.second); + } + } + return colors; +} void AppConfig::reset_selections() { diff --git a/src/libslic3r/AppConfig.hpp b/src/libslic3r/AppConfig.hpp index 49f33bcddd..2d2134f10b 100644 --- a/src/libslic3r/AppConfig.hpp +++ b/src/libslic3r/AppConfig.hpp @@ -233,7 +233,9 @@ public: std::string get_country_code(); bool is_engineering_region(); - // reset the current print / filament / printer selections, so that + void save_custom_color_to_config(const std::vector &colors); + std::vector get_custom_color_from_config(); + // reset the current print / filament / printer selections, so that // the PresetBundle::load_selections(const AppConfig &config) call will select // the first non-default preset when called. void reset_selections(); diff --git a/src/libslic3r/Arrange.cpp b/src/libslic3r/Arrange.cpp index 7952b3aa87..6875ed216b 100644 --- a/src/libslic3r/Arrange.cpp +++ b/src/libslic3r/Arrange.cpp @@ -987,7 +987,7 @@ void _arrange( // polygon nesting, a convex hull needs to be calculated. if (params.allow_rotations) { for (auto &itm : shapes) { - itm.rotation(min_area_boundingbox_rotation(itm.rawShape())); + itm.rotation(min_area_boundingbox_rotation(itm.transformedShape())); // If the item is too big, try to find a rotation that makes it fit if constexpr (std::is_same_v) { diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index dfd82cbde7..926619dbf3 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -100,6 +100,8 @@ set(lisbslic3r_sources Fill/FillConcentric.hpp Fill/FillConcentricInternal.cpp Fill/FillConcentricInternal.hpp + Fill/FillCrossHatch.cpp + Fill/FillCrossHatch.hpp Fill/FillHoneycomb.cpp Fill/FillHoneycomb.hpp Fill/FillGyroid.cpp @@ -232,6 +234,7 @@ set(lisbslic3r_sources Arrange.cpp NormalUtils.cpp NormalUtils.hpp + ObjColorUtils.hpp Orient.hpp Orient.cpp MultiPoint.cpp @@ -473,6 +476,7 @@ set(CGAL_DO_NOT_WARN_ABOUT_CMAKE_BUILD_TYPE ON CACHE BOOL "" FORCE) cmake_policy(PUSH) cmake_policy(SET CMP0011 NEW) find_package(CGAL REQUIRED) +find_package(OpenCV REQUIRED core) cmake_policy(POP) add_library(libslic3r_cgal STATIC @@ -573,6 +577,7 @@ target_link_libraries(libslic3r mcut JPEG::JPEG qoi + opencv_world ) if(NOT WIN32) diff --git a/src/libslic3r/Color.cpp b/src/libslic3r/Color.cpp index c282e307ed..2f593538ac 100644 --- a/src/libslic3r/Color.cpp +++ b/src/libslic3r/Color.cpp @@ -6,7 +6,15 @@ static const float INV_255 = 1.0f / 255.0f; namespace Slic3r { - +bool color_is_equal(const RGBA a, const RGBA& b) +{ + for (size_t i = 0; i < 4; i++) { + if (abs(a[i] - b[i]) > 0.01) { + return false; + } + } + return true; +} // Conversion from RGB to HSV color space // The input RGB values are in the range [0, 1] // The output HSV values are in the ranges h = [0, 360], and s, v = [0, 1] diff --git a/src/libslic3r/Color.hpp b/src/libslic3r/Color.hpp index c13f0bd2c4..4c96458b40 100644 --- a/src/libslic3r/Color.hpp +++ b/src/libslic3r/Color.hpp @@ -7,7 +7,10 @@ #include namespace Slic3r { - +using RGB = std::array; +using RGBA = std::array; +const RGBA UNDEFINE_COLOR = {0,0,0,0}; +bool color_is_equal(const RGBA a, const RGBA &b); class ColorRGB { std::array m_data{1.0f, 1.0f, 1.0f}; @@ -82,7 +85,9 @@ public: ColorRGBA& operator = (const ColorRGBA& other) { m_data = other.m_data; return *this; } - bool operator == (const ColorRGBA& other) const { return m_data == other.m_data; } + bool operator==(const ColorRGBA &other) const{ + return color_is_equal(m_data, other.m_data); + } bool operator != (const ColorRGBA& other) const { return !operator==(other); } bool operator < (const ColorRGBA& other) const; bool operator > (const ColorRGBA& other) const; diff --git a/src/libslic3r/Config.cpp b/src/libslic3r/Config.cpp index e37faf8854..7b95f4cf08 100644 --- a/src/libslic3r/Config.cpp +++ b/src/libslic3r/Config.cpp @@ -831,6 +831,9 @@ int ConfigBase::load_from_json(const std::string &file, ConfigSubstitutionContex else if (boost::iequals(it.key(), BBL_JSON_KEY_FROM)) { key_values.emplace(BBL_JSON_KEY_FROM, it.value()); } + else if (boost::iequals(it.key(), BBL_JSON_KEY_DESCRIPTION)) { + key_values.emplace(BBL_JSON_KEY_DESCRIPTION, it.value()); + } else if (boost::iequals(it.key(), BBL_JSON_KEY_INSTANTIATION)) { key_values.emplace(BBL_JSON_KEY_INSTANTIATION, it.value()); } diff --git a/src/libslic3r/Fill/FillBase.cpp b/src/libslic3r/Fill/FillBase.cpp index 772395f9bc..3d368e01c7 100644 --- a/src/libslic3r/Fill/FillBase.cpp +++ b/src/libslic3r/Fill/FillBase.cpp @@ -32,6 +32,7 @@ #include "FillLightning.hpp" // BBS: new infill pattern header #include "FillConcentricInternal.hpp" +#include "FillCrossHatch.hpp" // #define INFILL_DEBUG_OUTPUT @@ -51,6 +52,7 @@ Fill* Fill::new_from_type(const InfillPattern type) case ipGyroid: return new FillGyroid(); case ipRectilinear: return new FillRectilinear(); case ipAlignedRectilinear: return new FillAlignedRectilinear(); + case ipCrossHatch: return new FillCrossHatch(); case ipMonotonic: return new FillMonotonic(); case ipLine: return new FillLine(); case ipGrid: return new FillGrid(); diff --git a/src/libslic3r/Fill/FillCrossHatch.cpp b/src/libslic3r/Fill/FillCrossHatch.cpp new file mode 100644 index 0000000000..ebac74bf41 --- /dev/null +++ b/src/libslic3r/Fill/FillCrossHatch.cpp @@ -0,0 +1,227 @@ +#include "../ClipperUtils.hpp" +#include "../ShortestPath.hpp" +#include "../Surface.hpp" + +#include "FillCrossHatch.hpp" + +namespace Slic3r { + +// CrossHatch Infill: Enhances 3D Printing Speed & Reduces Noise +// CrossHatch, as its name hints, alternates line direction by 90 degrees every few layers to improve adhesion. +// It introduces transform layers between direction shifts for better line cohesion, which fixes the weakness of line infill. +// The transform technique is inspired by David Eccles, improved 3D honeycomb but we made a more flexible implementation. +// This method notably increases printing speed, meeting the demands of modern high-speed 3D printers, and reduces noise for most layers. +// By Bambu Lab + +// graph credits: David Eccles (gringer). +// But we made a different definition for points. +/* o---o + * / \ + * / \ + * \ / + * \ / + * o---o + * p1 p2 p3 p4 + */ + +static Pointfs generate_one_cycle(double progress, coordf_t period) +{ + Pointfs out; + double offset = progress * 1. / 8. * period; + out.reserve(4); + out.push_back(Vec2d(0.25 * period - offset, offset)); + out.push_back(Vec2d(0.25 * period + offset, offset)); + out.push_back(Vec2d(0.75 * period - offset, -offset)); + out.push_back(Vec2d(0.75 * period + offset, -offset)); + return out; +} + +static Polylines generate_transform_pattern(double inprogress, int direction, coordf_t ingrid_size, coordf_t inwidth, coordf_t inheight) +{ + coordf_t width = inwidth; + coordf_t height = inheight; + coordf_t grid_size = ingrid_size * 2; // we due with odd and even saparately. + double progress = inprogress; + Polylines out_polylines; + + // generate template patterns; + Pointfs one_cycle_points = generate_one_cycle(progress, grid_size); + + Polyline one_cycle; + one_cycle.points.reserve(one_cycle_points.size()); + for (size_t i = 0; i < one_cycle_points.size(); i++) one_cycle.points.push_back(Point(one_cycle_points[i])); + + // swap if vertical + if (direction < 0) { + width = height; + height = inwidth; + } + + // replicate polylines; + Polylines odd_polylines; + Polyline odd_poly; + int num_of_cycle = width / grid_size + 2; + odd_poly.points.reserve(num_of_cycle * one_cycle.size()); + + // replicate to odd line + Point translate = Point(0, 0); + for (size_t i = 0; i < num_of_cycle; i++) { + Polyline odd_points; + odd_points = Polyline(one_cycle); + odd_points.translate(Point(i * grid_size, 0.0)); + odd_poly.points.insert(odd_poly.points.end(), odd_points.begin(), odd_points.end()); + } + + // fill the height + int num_of_lines = height / grid_size + 2; + odd_polylines.reserve(num_of_lines * odd_poly.size()); + for (size_t i = 0; i < num_of_lines; i++) { + Polyline poly = odd_poly; + poly.translate(Point(0.0, grid_size * i)); + odd_polylines.push_back(poly); + } + // save to output + out_polylines.insert(out_polylines.end(), odd_polylines.begin(), odd_polylines.end()); + + // replicate to even lines + Polylines even_polylines; + even_polylines.reserve(odd_polylines.size()); + for (size_t i = 0; i < odd_polylines.size(); i++) { + Polyline even = odd_poly; + even.translate(Point(-0.5 * grid_size, (i + 0.5) * grid_size)); + even_polylines.push_back(even); + } + + // save for output + out_polylines.insert(out_polylines.end(), even_polylines.begin(), even_polylines.end()); + + // change to vertical if need + if (direction < 0) { + // swap xy, see if we need better performance method + for (Polyline &poly : out_polylines) { + for (Point &p : poly) { std::swap(p.x(), p.y()); } + } + } + + return out_polylines; +} + +static Polylines generate_repeat_pattern(int direction, coordf_t grid_size, coordf_t inwidth, coordf_t inheight) +{ + coordf_t width = inwidth; + coordf_t height = inheight; + Polylines out_polylines; + + // swap if vertical + if (direction < 0) { + width = height; + height = inwidth; + } + + int num_of_lines = height / grid_size + 1; + out_polylines.reserve(num_of_lines); + + for (int i = 0; i < num_of_lines; i++) { + Polyline poly; + poly.points.reserve(2); + poly.append(Point(coordf_t(0), coordf_t(grid_size * i))); + poly.append(Point(width, coordf_t(grid_size * i))); + out_polylines.push_back(poly); + } + + // change to vertical if needed + if (direction < 0) { + // swap xy + for (Polyline &poly : out_polylines) { + for (Point &p : poly) { std::swap(p.x(), p.y()); } + } + } + + return out_polylines; +} + +// it makes the real patterns that overlap the bounding box +// repeat_ratio define the ratio between the height of repeat pattern and grid +static Polylines generate_infill_layers(coordf_t z_height, double repeat_ratio, coordf_t grid_size, coordf_t width, coordf_t height) +{ + Polylines result; + coordf_t trans_layer_size = grid_size * 0.4; // upper. + coordf_t repeat_layer_size = grid_size * repeat_ratio; // lower. + z_height += repeat_layer_size / 2; // offset to improve first few layer strength + coordf_t period = trans_layer_size + repeat_layer_size; + coordf_t remains = z_height - std::floor(z_height / period) * period; + coordf_t trans_z = remains - repeat_layer_size; // put repeat layer first. + coordf_t repeat_z = remains; + + int phase = fmod(z_height, period * 2) - (period - 1); // add epsilon + int direction = phase <= 0 ? -1 : 1; + + // this is a repeat layer + if (trans_z < 0) { + result = generate_repeat_pattern(direction, grid_size, width, height); + } + // this is a transform layer + else { + double progress = fmod(trans_z, trans_layer_size) / trans_layer_size; + + // split the progress to forward and backward, with a opposite direction. + if (progress < 0.5) + result = generate_transform_pattern((progress + 0.1) * 2, direction, grid_size, width, height); // increase overlapping. + else + result = generate_transform_pattern((1.1 - progress) * 2, -1 * direction, grid_size, width, height); + } + + return result; +} + +void FillCrossHatch ::_fill_surface_single( + const FillParams ¶ms, unsigned int thickness_layers, const std::pair &direction, ExPolygon expolygon, Polylines &polylines_out) +{ + // rotate angle + auto infill_angle = float(this->angle); + if (std::abs(infill_angle) >= EPSILON) expolygon.rotate(-infill_angle); + + // get the rotated bounding box + BoundingBox bb = expolygon.contour.bounding_box(); + + // linespace modifier + coord_t line_spacing = coord_t(scale_(this->spacing) / params.density); + + // reduce density + if (params.density < 0.999) line_spacing *= 1.08; + + bb.merge(align_to_grid(bb.min, Point(line_spacing * 4, line_spacing * 4))); + + // generate pattern + Polylines polylines = generate_infill_layers(scale_(this->z), 1, line_spacing, bb.size()(0), bb.size()(1)); + + // shift the pattern to the actual space + for (Polyline &pl : polylines) { pl.translate(bb.min); } + + polylines = intersection_pl(polylines, to_polygons(expolygon)); + + // --- remove small remains from gyroid infill + if (!polylines.empty()) { + // Remove very small bits, but be careful to not remove infill lines connecting thin walls! + // The infill perimeter lines should be separated by around a single infill line width. + const double minlength = scale_(0.8 * this->spacing); + polylines.erase(std::remove_if(polylines.begin(), polylines.end(), [minlength](const Polyline &pl) + { return pl.length() < minlength; }), polylines.end()); + } + + if (!polylines.empty()) { + int infill_start_idx = polylines_out.size(); // only rotate what belongs to us. + // connect lines + if (params.dont_connect() || polylines.size() <= 1) + append(polylines_out, chain_polylines(std::move(polylines))); + else + this->connect_infill(std::move(polylines), expolygon, polylines_out, this->spacing, params); + + // rotate back + if (std::abs(infill_angle) >= EPSILON) { + for (auto it = polylines_out.begin() + infill_start_idx; it != polylines_out.end(); ++it) it->rotate(infill_angle); + } + } +} + +} // namespace Slic3r \ No newline at end of file diff --git a/src/libslic3r/Fill/FillCrossHatch.hpp b/src/libslic3r/Fill/FillCrossHatch.hpp new file mode 100644 index 0000000000..859d5bd8b5 --- /dev/null +++ b/src/libslic3r/Fill/FillCrossHatch.hpp @@ -0,0 +1,29 @@ +#ifndef slic3r_FillCrossHatch_hpp_ +#define slic3r_FillCrossHatch_hpp_ + +#include + +#include "../libslic3r.h" + +#include "FillBase.hpp" + +namespace Slic3r { + +class FillCrossHatch : public Fill +{ +public: + Fill *clone() const override { return new FillCrossHatch(*this); }; + ~FillCrossHatch() override {} + +protected: + void _fill_surface_single( + const FillParams ¶ms, + unsigned int thickness_layers, + const std::pair &direction, + ExPolygon expolygon, + Polylines &polylines_out) override; +}; + +} // namespace Slic3r + +#endif // slic3r_FillCrossHatch_hpp_ diff --git a/src/libslic3r/Format/OBJ.cpp b/src/libslic3r/Format/OBJ.cpp index 4e621e5f78..0433e917c6 100644 --- a/src/libslic3r/Format/OBJ.cpp +++ b/src/libslic3r/Format/OBJ.cpp @@ -21,19 +21,39 @@ namespace Slic3r { -bool load_obj(const char *path, TriangleMesh *meshptr, std::string &message) +bool load_obj(const char *path, TriangleMesh *meshptr, ObjInfo& obj_info, std::string &message) { if (meshptr == nullptr) return false; - // Parse the OBJ file. ObjParser::ObjData data; + ObjParser::MtlData mtl_data; if (! ObjParser::objparse(path, data)) { BOOST_LOG_TRIVIAL(error) << "load_obj: failed to parse " << path; message = _L("load_obj: failed to parse"); return false; } - + bool exist_mtl = false; + if (data.mtllibs.size() > 0) { // read mtl + for (auto mtl_name : data.mtllibs) { + boost::filesystem::path full_path(path); + std::string dir = full_path.parent_path().string(); + auto mtl_file = dir + "/" + mtl_name; + boost::filesystem::path mtl_path(mtl_file); + auto _mtl_path = mtl_path.string().c_str(); + if (boost::filesystem::exists(mtl_path)) { + if (!ObjParser::mtlparse(_mtl_path, mtl_data)) { + BOOST_LOG_TRIVIAL(error) << "load_obj:load_mtl: failed to parse " << _mtl_path; + message = _L("load mtl in obj: failed to parse"); + return false; + } + } + else { + BOOST_LOG_TRIVIAL(error) << "load_obj: failed to load mtl_path:" << _mtl_path; + } + } + exist_mtl = true; + } // Count the faces and verify, that all faces are triangular. size_t num_faces = 0; size_t num_quads = 0; @@ -59,17 +79,27 @@ bool load_obj(const char *path, TriangleMesh *meshptr, std::string &message) i = j; } } - // Convert ObjData into indexed triangle set. indexed_triangle_set its; - size_t num_vertices = data.coordinates.size() / 4; + size_t num_vertices = data.coordinates.size() / OBJ_VERTEX_LENGTH; its.vertices.reserve(num_vertices); its.indices.reserve(num_faces + num_quads); - for (size_t i = 0; i < num_vertices; ++ i) { - size_t j = i << 2; - its.vertices.emplace_back(data.coordinates[j], data.coordinates[j + 1], data.coordinates[j + 2]); + if (exist_mtl) { + obj_info.is_single_mtl = data.usemtls.size() == 1 && mtl_data.new_mtl_unmap.size() == 1; + obj_info.face_colors.reserve(num_faces + num_quads); } - int indices[4]; + bool has_color = data.has_vertex_color; + for (size_t i = 0; i < num_vertices; ++ i) { + size_t j = i * OBJ_VERTEX_LENGTH; + its.vertices.emplace_back(data.coordinates[j], data.coordinates[j + 1], data.coordinates[j + 2]); + if (data.has_vertex_color) { + RGBA color{std::clamp(data.coordinates[j + 3], 0.f, 1.f), std::clamp(data.coordinates[j + 4], 0.f, 1.f), std::clamp(data.coordinates[j + 5], 0.f, 1.f), + std::clamp(data.coordinates[j + 6], 0.f, 1.f)}; + obj_info.vertex_colors.emplace_back(color); + } + } + int indices[ONE_FACE_SIZE]; + int uvs[ONE_FACE_SIZE]; for (size_t i = 0; i < data.vertices.size();) if (data.vertices[i].coordIdx == -1) ++ i; @@ -79,20 +109,79 @@ bool load_obj(const char *path, TriangleMesh *meshptr, std::string &message) if (const ObjParser::ObjVertex &vertex = data.vertices[i ++]; vertex.coordIdx == -1) { break; } else { - assert(cnt < 4); + assert(cnt < OBJ_VERTEX_LENGTH); if (vertex.coordIdx < 0 || vertex.coordIdx >= int(its.vertices.size())) { BOOST_LOG_TRIVIAL(error) << "load_obj: failed to parse " << path << ". The file contains invalid vertex index."; message = _L("The file contains invalid vertex index."); return false; } - indices[cnt ++] = vertex.coordIdx; + indices[cnt] = vertex.coordIdx; + uvs[cnt] = vertex.textureCoordIdx; + cnt++; } if (cnt) { assert(cnt == 3 || cnt == 4); // Insert one or two faces (triangulate a quad). its.indices.emplace_back(indices[0], indices[1], indices[2]); - if (cnt == 4) + int face_index =its.indices.size() - 1; + RGBA face_color; + auto set_face_color = [&uvs, &data, &mtl_data, &obj_info, &face_color](int face_index, const std::string mtl_name) { + if (mtl_data.new_mtl_unmap.find(mtl_name) != mtl_data.new_mtl_unmap.end()) { + bool is_merge_ka_kd = true; + for (size_t n = 0; n < 3; n++) { + if (float(mtl_data.new_mtl_unmap[mtl_name]->Ka[n] + mtl_data.new_mtl_unmap[mtl_name]->Kd[n]) > 1.0) { + is_merge_ka_kd=false; + break; + } + } + for (size_t n = 0; n < 3; n++) { + if (is_merge_ka_kd) { + face_color[n] = std::clamp(float(mtl_data.new_mtl_unmap[mtl_name]->Ka[n] + mtl_data.new_mtl_unmap[mtl_name]->Kd[n]), 0.f, 1.f); + } + else { + face_color[n] = std::clamp(float(mtl_data.new_mtl_unmap[mtl_name]->Kd[n]), 0.f, 1.f); + } + } + face_color[3] = mtl_data.new_mtl_unmap[mtl_name]->Tr; // alpha + if (mtl_data.new_mtl_unmap[mtl_name]->map_Kd.size() > 0) { + auto png_name = mtl_data.new_mtl_unmap[mtl_name]->map_Kd; + obj_info.has_uv_png = true; + if (obj_info.pngs.find(png_name) == obj_info.pngs.end()) { obj_info.pngs[png_name] = false; } + obj_info.uv_map_pngs[face_index] = png_name; + } + if (data.textureCoordinates.size() > 0) { + Vec2f uv0(data.textureCoordinates[uvs[0] * 2], data.textureCoordinates[uvs[0] * 2 + 1]); + Vec2f uv1(data.textureCoordinates[uvs[1] * 2], data.textureCoordinates[uvs[1] * 2 + 1]); + Vec2f uv2(data.textureCoordinates[uvs[2] * 2], data.textureCoordinates[uvs[2] * 2 + 1]); + std::array uv_array{uv0, uv1, uv2}; + obj_info.uvs.emplace_back(uv_array); + } + obj_info.face_colors.emplace_back(face_color); + } + }; + auto set_face_color_by_mtl = [&data, &set_face_color](int face_index) { + if (data.usemtls.size() == 1) { + set_face_color(face_index, data.usemtls[0].name); + } else { + for (size_t k = 0; k < data.usemtls.size(); k++) { + auto mtl = data.usemtls[k]; + if (face_index >= mtl.face_start && face_index <= mtl.face_end) { + set_face_color(face_index, data.usemtls[k].name); + break; + } + } + } + }; + if (exist_mtl) { + set_face_color_by_mtl(face_index); + } + if (cnt == 4) { its.indices.emplace_back(indices[0], indices[2], indices[3]); + int face_index = its.indices.size() - 1; + if (exist_mtl) { + set_face_color_by_mtl(face_index); + } + } } } @@ -107,12 +196,12 @@ bool load_obj(const char *path, TriangleMesh *meshptr, std::string &message) return true; } -bool load_obj(const char *path, Model *model, std::string &message, const char *object_name_in) +bool load_obj(const char *path, Model *model, ObjInfo& obj_info, std::string &message, const char *object_name_in) { TriangleMesh mesh; - - bool ret = load_obj(path, &mesh, message); - + + bool ret = load_obj(path, &mesh, obj_info, message); + if (ret) { std::string object_name; if (object_name_in == nullptr) { @@ -120,10 +209,9 @@ bool load_obj(const char *path, Model *model, std::string &message, const char * object_name.assign((last_slash == nullptr) ? path : last_slash + 1); } else object_name.assign(object_name_in); - model->add_object(object_name.c_str(), path, std::move(mesh)); } - + return ret; } diff --git a/src/libslic3r/Format/OBJ.hpp b/src/libslic3r/Format/OBJ.hpp index e9a3817e43..9b618bd27f 100644 --- a/src/libslic3r/Format/OBJ.hpp +++ b/src/libslic3r/Format/OBJ.hpp @@ -1,15 +1,27 @@ #ifndef slic3r_Format_OBJ_hpp_ #define slic3r_Format_OBJ_hpp_ - +#include "libslic3r/Color.hpp" +#include namespace Slic3r { class TriangleMesh; class Model; class ModelObject; - +typedef std::function &input_colors, bool is_single_color, std::vector &filament_ids, unsigned char &first_extruder_id)> ObjImportColorFn; // Load an OBJ file into a provided model. -extern bool load_obj(const char *path, TriangleMesh *mesh, std::string &message); -extern bool load_obj(const char *path, Model *model, std::string &message, const char *object_name = nullptr); +struct ObjInfo { + std::vector vertex_colors; + std::vector face_colors; + bool is_single_mtl{false}; + std::vector> uvs; + std::string obj_dircetory; + std::map pngs; + std::unordered_map uv_map_pngs; + bool has_uv_png{false}; + +}; +extern bool load_obj(const char *path, TriangleMesh *mesh, ObjInfo &vertex_colors, std::string &message); +extern bool load_obj(const char *path, Model *model, ObjInfo &vertex_colors, std::string &message, const char *object_name = nullptr); extern bool store_obj(const char *path, TriangleMesh *mesh); extern bool store_obj(const char *path, ModelObject *model); diff --git a/src/libslic3r/Format/bbs_3mf.cpp b/src/libslic3r/Format/bbs_3mf.cpp index 8275cf7c5f..e723c9e8af 100644 --- a/src/libslic3r/Format/bbs_3mf.cpp +++ b/src/libslic3r/Format/bbs_3mf.cpp @@ -213,6 +213,7 @@ static constexpr const char* FILAMENT_TYPE_TAG = "type"; static constexpr const char *FILAMENT_COLOR_TAG = "color"; static constexpr const char *FILAMENT_USED_M_TAG = "used_m"; static constexpr const char *FILAMENT_USED_G_TAG = "used_g"; +static constexpr const char *FILAMENT_TRAY_INFO_ID_TAG = "tray_info_idx"; static constexpr const char* CONFIG_TAG = "config"; @@ -586,21 +587,14 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) return ret; }; - for (auto it = ps.volumes_per_extruder.begin(); it != ps.volumes_per_extruder.end(); it++) { + for (auto it = ps.total_volumes_per_extruder.begin(); it != ps.total_volumes_per_extruder.end(); it++) { double volume = it->second; auto [used_filament_m, used_filament_g] = get_used_filament_from_volume(volume, it->first); FilamentInfo info; info.id = it->first; - if (ps.flush_per_filament.find(it->first) != ps.flush_per_filament.end()) { - volume = ps.flush_per_filament.at(it->first); - auto [flushed_filament_m, flushed_filament_g] = get_used_filament_from_volume(volume, it->first); - info.used_m = used_filament_m + flushed_filament_m; - info.used_g = used_filament_g + flushed_filament_g; - } else { - info.used_m = used_filament_m; - info.used_g = used_filament_g; - } + info.used_g = used_filament_g; + info.used_m = used_filament_m; slice_filaments_info.push_back(info); } @@ -4231,13 +4225,14 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) std::string color = bbs_get_attribute_value_string(attributes, num_attributes, FILAMENT_COLOR_TAG); std::string used_m = bbs_get_attribute_value_string(attributes, num_attributes, FILAMENT_USED_M_TAG); std::string used_g = bbs_get_attribute_value_string(attributes, num_attributes, FILAMENT_USED_G_TAG); - + std::string filament_id = bbs_get_attribute_value_string(attributes, num_attributes, FILAMENT_TRAY_INFO_ID_TAG); FilamentInfo filament_info; filament_info.id = atoi(id.c_str()) - 1; filament_info.type = type; filament_info.color = color; filament_info.used_m = atof(used_m.c_str()); filament_info.used_g = atof(used_g.c_str()); + filament_info.filament_id = filament_id; m_curr_plater->slice_filaments_info.push_back(filament_info); } return true; @@ -7659,6 +7654,7 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) for (auto it = plate_data->slice_filaments_info.begin(); it != plate_data->slice_filaments_info.end(); it++) { stream << " <" << FILAMENT_TAG << " " << FILAMENT_ID_TAG << "=\"" << std::to_string(it->id + 1) << "\" " + << FILAMENT_TRAY_INFO_ID_TAG <<"=\""<< it->filament_id <<"\" " << FILAMENT_TYPE_TAG << "=\"" << it->type << "\" " << FILAMENT_COLOR_TAG << "=\"" << it->color << "\" " << FILAMENT_USED_M_TAG << "=\"" << it->used_m << "\" " diff --git a/src/libslic3r/Format/objparser.cpp b/src/libslic3r/Format/objparser.cpp index 16a3f84ddb..c56d6930ce 100644 --- a/src/libslic3r/Format/objparser.cpp +++ b/src/libslic3r/Format/objparser.cpp @@ -9,16 +9,12 @@ #include "libslic3r/LocalesUtils.hpp" namespace ObjParser { - +#define EATWS() while (*line == ' ' || *line == '\t') ++line static bool obj_parseline(const char *line, ObjData &data) { -#define EATWS() while (*line == ' ' || *line == '\t') ++ line - if (*line == 0) return true; - assert(Slic3r::is_decimal_separator_point()); - // Ignore whitespaces at the beginning of the line. //FIXME is this a good idea? EATWS(); @@ -55,19 +51,19 @@ static bool obj_parseline(const char *line, ObjData &data) line = endptr; EATWS(); } - double w = 0; + /*double w = 0; if (*line != 0) { w = strtod(line, &endptr); if (endptr == 0 || (*endptr != ' ' && *endptr != '\t' && *endptr != 0)) return false; line = endptr; EATWS(); - } + }*/ if (*line != 0) return false; data.textureCoordinates.push_back((float)u); data.textureCoordinates.push_back((float)v); - data.textureCoordinates.push_back((float)w); + //data.textureCoordinates.push_back((float)w); break; } case 'n': @@ -156,23 +152,46 @@ static bool obj_parseline(const char *line, ObjData &data) return false; line = endptr; EATWS(); - double w = 1.0; - if (*line != 0) { - w = strtod(line, &endptr); - if (endptr == 0 || (*endptr != ' ' && *endptr != '\t' && *endptr != 0)) - return false; - line = endptr; - EATWS(); + double color_x = 0.0, color_y = 0.0, color_z = 0.0, color_w = 0.0;//undefine color + if (*line != 0) { + if (!data.has_vertex_color) { + data.has_vertex_color = true; + } + color_x = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t' && *endptr != 0)) + return false; + line = endptr; + EATWS(); + color_y = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t' && *endptr != 0)) + return false; + line = endptr; + EATWS(); + color_z = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t' && *endptr != 0)) + return false; + line = endptr; + EATWS(); + color_w = 1.0;//default define alpha = 1.0 + if (*line != 0) { + color_w = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t' && *endptr != 0)) return false; + line = endptr; + EATWS(); + } } // the following check is commented out because there may be obj files containing extra data, as those generated by Meshlab, // see https://dev.prusa3d.com/browse/SPE-1019 for an example, - // and this would lead to a crash because no vertex would be stored + // and this would lead to a crash because no vertex would be stored // if (*line != 0) // return false; data.coordinates.push_back((float)x); data.coordinates.push_back((float)y); data.coordinates.push_back((float)z); - data.coordinates.push_back((float)w); + data.coordinates.push_back((float) color_x); + data.coordinates.push_back((float) color_y); + data.coordinates.push_back((float) color_z); + data.coordinates.push_back((float) color_w); break; } } @@ -232,6 +251,24 @@ static bool obj_parseline(const char *line, ObjData &data) data.vertices.push_back(vertex); EATWS(); } + if (data.usemtls.size() > 0) { + data.usemtls.back().vertexIdxEnd = (int) data.vertices.size(); + } + if (data.usemtls.size() > 0) { + int face_index_count = 0; + for (int i = data.vertices.size() - 1; i >= 0; i--) { + if (data.vertices[i].coordIdx == -1) { + break; + } + face_index_count++; + } + if (face_index_count == 3) {//tri + data.usemtls.back().face_end++; + } else if (face_index_count == 4) {//quad + data.usemtls.back().face_end++; + data.usemtls.back().face_end++; + } + } vertex.coordIdx = -1; vertex.normalIdx = -1; vertex.textureCoordIdx = -1; @@ -263,10 +300,23 @@ static bool obj_parseline(const char *line, ObjData &data) // usemtl [material name] // printf("usemtl %s\r\n", line); EATWS(); + if (data.usemtls.size()>0) { + data.usemtls.back().vertexIdxEnd = (int) data.vertices.size(); + } ObjUseMtl usemtl; usemtl.vertexIdxFirst = (int)data.vertices.size(); usemtl.name = line; data.usemtls.push_back(usemtl); + if (data.usemtls.size() == 1) { + data.usemtls.back().face_start = 0; + } + else {//>=2 + auto count = data.usemtls.size(); + auto& last_usemtl = data.usemtls[count-1]; + auto& last_last_usemtl = data.usemtls[count - 2]; + last_usemtl.face_start = last_last_usemtl.face_end + 1; + } + data.usemtls.back().face_end = data.usemtls.back().face_start - 1; break; } case 'o': @@ -323,6 +373,197 @@ static bool obj_parseline(const char *line, ObjData &data) return true; } +static std::string cur_mtl_name = ""; +static bool mtl_parseline(const char *line, MtlData &data) +{ + if (*line == 0) return true; + assert(Slic3r::is_decimal_separator_point()); + // Ignore whitespaces at the beginning of the line. + // FIXME is this a good idea? + EATWS(); + + char c1 = *line++; + switch (c1) { + case '#': {// Comment, ignore the rest of the line. + break; + } + case 'n': { + if (*(line++) != 'e' || *(line++) != 'w' || *(line++) != 'm' || *(line++) != 't' || *(line++) != 'l') + return false; + EATWS(); + ObjNewMtl new_mtl; + cur_mtl_name = line; + data.new_mtl_unmap[cur_mtl_name] = std::make_shared(); + break; + } + case 'm': { + if (*(line++) != 'a' || *(line++) != 'p' || *(line++) != '_' || *(line++) != 'K' || *(line++) != 'd') return false; + EATWS(); + if (data.new_mtl_unmap.find(cur_mtl_name) != data.new_mtl_unmap.end()) { + data.new_mtl_unmap[cur_mtl_name]->map_Kd = line; + } + break; + } + case 'N': { + char cur_char = *(line++); + if (cur_char == 's') { + EATWS(); + char * endptr = 0; + double ns = strtod(line, &endptr); + if (data.new_mtl_unmap.find(cur_mtl_name) != data.new_mtl_unmap.end()) { + data.new_mtl_unmap[cur_mtl_name]->Ns = (float) ns; + } + } else if (cur_char == 'i') { + EATWS(); + char * endptr = 0; + double ni = strtod(line, &endptr); + if (data.new_mtl_unmap.find(cur_mtl_name) != data.new_mtl_unmap.end()) { + data.new_mtl_unmap[cur_mtl_name]->Ni = (float) ni; + } + } + break; + } + case 'K': { + char cur_char = *(line++); + if (cur_char == 'a') { + EATWS(); + char * endptr = 0; + double x = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t')) return false; + line = endptr; + EATWS(); + double y = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t')) return false; + line = endptr; + EATWS(); + double z = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t' && *endptr != 0)) return false; + line = endptr; + EATWS(); + if (data.new_mtl_unmap.find(cur_mtl_name) != data.new_mtl_unmap.end()) { + data.new_mtl_unmap[cur_mtl_name]->Ka[0] = x; + data.new_mtl_unmap[cur_mtl_name]->Ka[1] = y; + data.new_mtl_unmap[cur_mtl_name]->Ka[2] = z; + } + } else if (cur_char == 'd') { + EATWS(); + char * endptr = 0; + double x = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t')) return false; + line = endptr; + EATWS(); + double y = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t')) return false; + line = endptr; + EATWS(); + double z = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t' && *endptr != 0)) return false; + line = endptr; + EATWS(); + if (data.new_mtl_unmap.find(cur_mtl_name) != data.new_mtl_unmap.end()) { + data.new_mtl_unmap[cur_mtl_name]->Kd[0] = x; + data.new_mtl_unmap[cur_mtl_name]->Kd[1] = y; + data.new_mtl_unmap[cur_mtl_name]->Kd[2] = z; + } + } else if (cur_char == 's') { + EATWS(); + char * endptr = 0; + double x = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t')) return false; + line = endptr; + EATWS(); + double y = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t')) return false; + line = endptr; + EATWS(); + double z = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t' && *endptr != 0)) return false; + line = endptr; + EATWS(); + if (data.new_mtl_unmap.find(cur_mtl_name) != data.new_mtl_unmap.end()) { + data.new_mtl_unmap[cur_mtl_name]->Ks[0] = x; + data.new_mtl_unmap[cur_mtl_name]->Ks[1] = y; + data.new_mtl_unmap[cur_mtl_name]->Ks[2] = z; + } + } else if (cur_char == 'e') { + EATWS(); + char * endptr = 0; + double x = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t')) return false; + line = endptr; + EATWS(); + double y = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t')) return false; + line = endptr; + EATWS(); + double z = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t' && *endptr != 0)) return false; + line = endptr; + EATWS(); + if (data.new_mtl_unmap.find(cur_mtl_name) != data.new_mtl_unmap.end()) { + data.new_mtl_unmap[cur_mtl_name]->Ke[0] = x; + data.new_mtl_unmap[cur_mtl_name]->Ke[1] = y; + data.new_mtl_unmap[cur_mtl_name]->Ke[2] = z; + } + } + break; + } + case 'i': { + if (*(line++) != 'l' || *(line++) != 'l' || *(line++) != 'u' || *(line++) != 'm') + return false; + EATWS(); + char * endptr = 0; + double illum = strtod(line, &endptr); + if (data.new_mtl_unmap.find(cur_mtl_name) != data.new_mtl_unmap.end()) { + data.new_mtl_unmap[cur_mtl_name]->illum = (float) illum; + } + break; + } + case 'd': { + EATWS(); + char * endptr = 0; + double d = strtod(line, &endptr); + if (data.new_mtl_unmap.find(cur_mtl_name) != data.new_mtl_unmap.end()) { + data.new_mtl_unmap[cur_mtl_name]->d = (float) d; + } + break; + } + case 'T': { + char cur_char = *(line++); + if (cur_char == 'r') { + EATWS(); + char * endptr = 0; + double tr = strtod(line, &endptr); + if (data.new_mtl_unmap.find(cur_mtl_name) != data.new_mtl_unmap.end()) { + data.new_mtl_unmap[cur_mtl_name]->Tr = (float) tr; + } + break; + } else if (cur_char == 'f') { + EATWS(); + char * endptr = 0; + double x = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t')) return false; + line = endptr; + EATWS(); + double y = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t')) return false; + line = endptr; + EATWS(); + double z = strtod(line, &endptr); + if (endptr == 0 || (*endptr != ' ' && *endptr != '\t' && *endptr != 0)) return false; + line = endptr; + EATWS(); + if (data.new_mtl_unmap.find(cur_mtl_name) != data.new_mtl_unmap.end()) { + data.new_mtl_unmap[cur_mtl_name]->Tf[0] = x; + data.new_mtl_unmap[cur_mtl_name]->Tf[1] = y; + data.new_mtl_unmap[cur_mtl_name]->Tf[2] = z; + } + break; + } + } + } + return true; +} bool objparse(const char *path, ObjData &data) { @@ -369,10 +610,52 @@ bool objparse(const char *path, ObjData &data) return true; } +bool mtlparse(const char *path, MtlData &data) +{ + Slic3r::CNumericLocalesSetter locales_setter; + + FILE *pFile = boost::nowide::fopen(path, "rt"); + if (pFile == 0) return false; + cur_mtl_name = ""; + try { + char buf[65536 * 2]; + size_t len = 0; + size_t lenPrev = 0; + while ((len = ::fread(buf + lenPrev, 1, 65536, pFile)) != 0) { + len += lenPrev; + size_t lastLine = 0; + for (size_t i = 0; i < len; ++i) + if (buf[i] == '\r' || buf[i] == '\n') { + buf[i] = 0; + char *c = buf + lastLine; + while (*c == ' ' || *c == '\t') ++c; + // FIXME check the return value and exit on error? + // Will it break parsing of some obj files? + mtl_parseline(c, data); + lastLine = i + 1; + } + lenPrev = len - lastLine; + if (lenPrev > 65536) { + BOOST_LOG_TRIVIAL(error) << "MtlParser: Excessive line length"; + ::fclose(pFile); + return false; + } + memmove(buf, buf + lastLine, lenPrev); + } + } catch (std::bad_alloc &) { + BOOST_LOG_TRIVIAL(error) << "MtlParser: Out of memory"; + } + ::fclose(pFile); + + // printf("vertices: %d\r\n", data.vertices.size() / 4); + // printf("coords: %d\r\n", data.coordinates.size()); + return true; +} + bool objparse(std::istream &stream, ObjData &data) { Slic3r::CNumericLocalesSetter locales_setter; - + try { char buf[65536 * 2]; size_t len = 0; diff --git a/src/libslic3r/Format/objparser.hpp b/src/libslic3r/Format/objparser.hpp index 5f3f010e4a..48493de3de 100644 --- a/src/libslic3r/Format/objparser.hpp +++ b/src/libslic3r/Format/objparser.hpp @@ -3,6 +3,8 @@ #include #include +#include +#include #include namespace ObjParser { @@ -16,22 +18,39 @@ struct ObjVertex inline bool operator==(const ObjVertex &v1, const ObjVertex &v2) { - return - v1.coordIdx == v2.coordIdx && - v1.textureCoordIdx == v2.textureCoordIdx && + return v1.coordIdx == v2.coordIdx && + v1.textureCoordIdx == v2.textureCoordIdx && v1.normalIdx == v2.normalIdx; } struct ObjUseMtl { int vertexIdxFirst; + int vertexIdxEnd{-1}; + int face_start; + int face_end{-1}; std::string name; }; +struct ObjNewMtl +{ + std::string name; + float Ns; + float Ni; + float d; + float illum; + float Tr{1.0f}; // Transmission + std::array Tf; + std::array Ka; + std::array Kd; + std::array Ks; + std::array Ke; + std::string map_Kd;//defalut png +}; + inline bool operator==(const ObjUseMtl &v1, const ObjUseMtl &v2) { - return - v1.vertexIdxFirst == v2.vertexIdxFirst && + return v1.vertexIdxFirst == v2.vertexIdxFirst && v1.name.compare(v2.name) == 0; } @@ -56,8 +75,7 @@ struct ObjGroup inline bool operator==(const ObjGroup &v1, const ObjGroup &v2) { - return - v1.vertexIdxFirst == v2.vertexIdxFirst && + return v1.vertexIdxFirst == v2.vertexIdxFirst && v1.name.compare(v2.name) == 0; } @@ -69,17 +87,19 @@ struct ObjSmoothingGroup inline bool operator==(const ObjSmoothingGroup &v1, const ObjSmoothingGroup &v2) { - return - v1.vertexIdxFirst == v2.vertexIdxFirst && + return v1.vertexIdxFirst == v2.vertexIdxFirst && v1.smoothingGroupID == v2.smoothingGroupID; } - +#define OBJ_VERTEX_COLOR_ALPHA 6 +#define OBJ_VERTEX_LENGTH 7 // x, y, z, color_x,color_y,color_z,color_w +#define ONE_FACE_SIZE 4//ONE_FACE format: f 8/4/6 7/3/6 6/2/6 -1/-1/-1 struct ObjData { // Version of the data structure for load / store in the private binary format. int version; - // x, y, z, w + // x, y, z, color_x,color_y,color_z,color_w std::vector coordinates; + bool has_vertex_color{false}; // u, v, w std::vector textureCoordinates; // x, y, z @@ -97,7 +117,14 @@ struct ObjData { std::vector vertices; }; +struct MtlData +{ + // Version of the data structure for load / store in the private binary format. + int version; + std::unordered_map> new_mtl_unmap; +}; extern bool objparse(const char *path, ObjData &data); +extern bool mtlparse(const char *path, MtlData &data); extern bool objparse(std::istream &stream, ObjData &data); extern bool objbinsave(const char *path, const ObjData &data); diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 467ec4bbeb..fc368eeca5 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1382,52 +1382,8 @@ namespace DoExport { double total_used_filament = 0.0; double total_weight = 0.0; double total_cost = 0.0; - for (auto volume : result.print_statistics.volumes_per_extruder) { - total_extruded_volume += volume.second; - size_t extruder_id = volume.first; - auto extruder = std::find_if(extruders.begin(), extruders.end(), [extruder_id](const Extruder& extr) { return extr.id() == extruder_id; }); - if (extruder == extruders.end()) - continue; - - double s = PI * sqr(0.5* extruder->filament_diameter()); - double weight = volume.second * extruder->filament_density() * 0.001; - total_used_filament += volume.second/s; - total_weight += weight; - total_cost += weight * extruder->filament_cost() * 0.001; - } - //BBS: add flush volume - for (auto volume : result.print_statistics.flush_per_filament) { - total_extruded_volume += volume.second; - - size_t extruder_id = volume.first; - auto extruder = std::find_if(extruders.begin(), extruders.end(), [extruder_id](const Extruder& extr) { return extr.id() == extruder_id; }); - if (extruder == extruders.end()) - continue; - - double s = PI * sqr(0.5* extruder->filament_diameter()); - double weight = volume.second * extruder->filament_density() * 0.001; - total_used_filament += volume.second/s; - total_weight += weight; - total_cost += weight * extruder->filament_cost() * 0.001; - } - - for (auto volume : result.print_statistics.wipe_tower_volumes_per_extruder) { - total_extruded_volume += volume.second; - - size_t extruder_id = volume.first; - auto extruder = std::find_if(extruders.begin(), extruders.end(), [extruder_id](const Extruder& extr) {return extr.id() == extruder_id; }); - if (extruder == extruders.end()) - continue; - - double s = PI * sqr(0.5* extruder->filament_diameter()); - double weight = volume.second * extruder->filament_density() * 0.001; - total_used_filament += volume.second/s; - total_weight += weight; - total_cost += weight * extruder->filament_cost() * 0.001; - } - - for (auto volume : result.print_statistics.support_volumes_per_extruder) { + for (auto volume : result.print_statistics.total_volumes_per_extruder) { total_extruded_volume += volume.second; size_t extruder_id = volume.first; @@ -1447,7 +1403,7 @@ namespace DoExport { print_statistics.total_weight = total_weight; print_statistics.total_cost = total_cost; - print_statistics.filament_stats = result.print_statistics.volumes_per_extruder; + print_statistics.filament_stats = result.print_statistics.model_volumes_per_extruder; } // if any reserved keyword is found, returns a std::vector containing the first MAX_COUNT keywords found diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index 9258c6bf5d..ebe3947008 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -753,7 +753,7 @@ void GCodeProcessor::UsedFilaments::reset() volumes_per_color_change = std::vector(); model_extrude_cache = 0.0f; - volumes_per_extruder.clear(); + model_volumes_per_extruder.clear(); flush_per_filament.clear(); @@ -761,16 +761,20 @@ void GCodeProcessor::UsedFilaments::reset() filaments_per_role.clear(); wipe_tower_cache = 0.0f; - wipe_tower_volume_per_extruder.clear(); + wipe_tower_volumes_per_extruder.clear(); support_volume_cache = 0.0f; - support_volume_per_extruder.clear(); + support_volumes_per_extruder.clear(); + + total_volume_cache = 0.0f; + total_volumes_per_extruder.clear(); } void GCodeProcessor::UsedFilaments::increase_support_caches(double extruded_volume) { support_volume_cache += extruded_volume; role_cache += extruded_volume; + total_volume_cache += extruded_volume; } void GCodeProcessor::UsedFilaments::increase_model_caches(double extruded_volume) @@ -778,12 +782,14 @@ void GCodeProcessor::UsedFilaments::increase_model_caches(double extruded_volume color_change_cache += extruded_volume; model_extrude_cache += extruded_volume; role_cache += extruded_volume; + total_volume_cache += extruded_volume; } void GCodeProcessor::UsedFilaments::increase_wipe_tower_caches(double extruded_volume) { wipe_tower_cache += extruded_volume; role_cache += extruded_volume; + total_volume_cache += extruded_volume; } void GCodeProcessor::UsedFilaments::process_color_change_cache() @@ -794,14 +800,27 @@ void GCodeProcessor::UsedFilaments::process_color_change_cache() } } + +void GCodeProcessor::UsedFilaments::process_total_volume_cache(GCodeProcessor* processor) +{ + size_t active_extruder_id = processor->m_extruder_id; + if (total_volume_cache!= 0.0f) { + if (total_volumes_per_extruder.find(active_extruder_id) != total_volumes_per_extruder.end()) + total_volumes_per_extruder[active_extruder_id] += total_volume_cache; + else + total_volumes_per_extruder[active_extruder_id] = total_volume_cache; + total_volume_cache = 0.0f; + } +} + void GCodeProcessor::UsedFilaments::process_model_cache(GCodeProcessor* processor) { size_t active_extruder_id = processor->m_extruder_id; if (model_extrude_cache != 0.0f) { - if (volumes_per_extruder.find(active_extruder_id) != volumes_per_extruder.end()) - volumes_per_extruder[active_extruder_id] += model_extrude_cache; + if (model_volumes_per_extruder.find(active_extruder_id) != model_volumes_per_extruder.end()) + model_volumes_per_extruder[active_extruder_id] += model_extrude_cache; else - volumes_per_extruder[active_extruder_id] = model_extrude_cache; + model_volumes_per_extruder[active_extruder_id] = model_extrude_cache; model_extrude_cache = 0.0f; } } @@ -810,10 +829,10 @@ void GCodeProcessor::UsedFilaments::process_wipe_tower_cache(GCodeProcessor* pro { size_t active_extruder_id = processor->m_extruder_id; if (wipe_tower_cache != 0.0f) { - if (wipe_tower_volume_per_extruder.find(active_extruder_id) != wipe_tower_volume_per_extruder.end()) - wipe_tower_volume_per_extruder[active_extruder_id] += wipe_tower_cache; + if (wipe_tower_volumes_per_extruder.find(active_extruder_id) != wipe_tower_volumes_per_extruder.end()) + wipe_tower_volumes_per_extruder[active_extruder_id] += wipe_tower_cache; else - wipe_tower_volume_per_extruder[active_extruder_id] = wipe_tower_cache; + wipe_tower_volumes_per_extruder[active_extruder_id] = wipe_tower_cache; wipe_tower_cache = 0.0f; } } @@ -822,20 +841,27 @@ void GCodeProcessor::UsedFilaments::process_support_cache(GCodeProcessor* proces { size_t active_extruder_id = processor->m_extruder_id; if (support_volume_cache != 0.0f){ - if (support_volume_per_extruder.find(active_extruder_id) != support_volume_per_extruder.end()) - support_volume_per_extruder[active_extruder_id] += support_volume_cache; + if (support_volumes_per_extruder.find(active_extruder_id) != support_volumes_per_extruder.end()) + support_volumes_per_extruder[active_extruder_id] += support_volume_cache; else - support_volume_per_extruder[active_extruder_id] = support_volume_cache; + support_volumes_per_extruder[active_extruder_id] = support_volume_cache; support_volume_cache = 0.0f; } } void GCodeProcessor::UsedFilaments::update_flush_per_filament(size_t extrude_id, float flush_volume) { - if (flush_per_filament.find(extrude_id) != flush_per_filament.end()) - flush_per_filament[extrude_id] += flush_volume; - else - flush_per_filament[extrude_id] = flush_volume; + if (flush_volume != 0.f) { + if (flush_per_filament.find(extrude_id) != flush_per_filament.end()) + flush_per_filament[extrude_id] += flush_volume; + else + flush_per_filament[extrude_id] = flush_volume; + + if (total_volumes_per_extruder.find(extrude_id) != total_volumes_per_extruder.end()) + total_volumes_per_extruder[extrude_id] += flush_volume; + else + total_volumes_per_extruder[extrude_id] = flush_volume; + } } void GCodeProcessor::UsedFilaments::process_role_cache(GCodeProcessor* processor) @@ -865,6 +891,7 @@ void GCodeProcessor::UsedFilaments::process_caches(GCodeProcessor* processor) process_role_cache(processor); process_wipe_tower_cache(processor); process_support_cache(processor); + process_total_volume_cache(processor); } #if ENABLE_GCODE_VIEWER_STATISTICS @@ -4542,6 +4569,7 @@ void GCodeProcessor::process_filaments(CustomGCode::Type code) if (code == CustomGCode::ToolChange) { m_used_filaments.process_model_cache(this); m_used_filaments.process_support_cache(this); + m_used_filaments.process_total_volume_cache(this); //BBS: reset remaining filament m_remaining_volume = m_nozzle_volume; } @@ -4573,11 +4601,12 @@ void GCodeProcessor::update_estimated_times_stats() m_result.print_statistics.modes[static_cast(PrintEstimatedStatistics::ETimeMode::Stealth)].reset(); m_result.print_statistics.volumes_per_color_change = m_used_filaments.volumes_per_color_change; - m_result.print_statistics.volumes_per_extruder = m_used_filaments.volumes_per_extruder; - m_result.print_statistics.wipe_tower_volumes_per_extruder = m_used_filaments.wipe_tower_volume_per_extruder; - m_result.print_statistics.support_volumes_per_extruder = m_used_filaments.support_volume_per_extruder; + m_result.print_statistics.model_volumes_per_extruder = m_used_filaments.model_volumes_per_extruder; + m_result.print_statistics.wipe_tower_volumes_per_extruder = m_used_filaments.wipe_tower_volumes_per_extruder; + m_result.print_statistics.support_volumes_per_extruder = m_used_filaments.support_volumes_per_extruder; m_result.print_statistics.flush_per_filament = m_used_filaments.flush_per_filament; m_result.print_statistics.used_filaments_per_role = m_used_filaments.filaments_per_role; + m_result.print_statistics.total_volumes_per_extruder = m_used_filaments.total_volumes_per_extruder; } //BBS: ugly code... @@ -4587,8 +4616,8 @@ void GCodeProcessor::update_slice_warnings() auto get_used_extruders = [this]() { std::vector used_extruders; - used_extruders.reserve(m_used_filaments.volumes_per_extruder.size()); - for (auto item : m_used_filaments.volumes_per_extruder) { + used_extruders.reserve(m_used_filaments.total_volumes_per_extruder.size()); + for (auto item : m_used_filaments.total_volumes_per_extruder) { used_extruders.push_back(item.first); } return used_extruders; diff --git a/src/libslic3r/GCode/GCodeProcessor.hpp b/src/libslic3r/GCode/GCodeProcessor.hpp index ed38b2af37..0a56ce2b0e 100644 --- a/src/libslic3r/GCode/GCodeProcessor.hpp +++ b/src/libslic3r/GCode/GCodeProcessor.hpp @@ -73,9 +73,10 @@ namespace Slic3r { }; std::vector volumes_per_color_change; - std::map volumes_per_extruder; + std::map model_volumes_per_extruder; std::map wipe_tower_volumes_per_extruder; std::map support_volumes_per_extruder; + std::map total_volumes_per_extruder; //BBS: the flush amount of every filament std::map flush_per_filament; std::map> used_filaments_per_role; @@ -92,7 +93,9 @@ namespace Slic3r { volumes_per_color_change.clear(); volumes_per_color_change.shrink_to_fit(); wipe_tower_volumes_per_extruder.clear(); - volumes_per_extruder.clear(); + model_volumes_per_extruder.clear(); + support_volumes_per_extruder.clear(); + total_volumes_per_extruder.clear(); flush_per_filament.clear(); used_filaments_per_role.clear(); total_filamentchanges = 0; @@ -500,17 +503,20 @@ namespace Slic3r { std::vector volumes_per_color_change; double model_extrude_cache; - std::map volumes_per_extruder; + std::map model_volumes_per_extruder; double wipe_tower_cache; - std::mapwipe_tower_volume_per_extruder; + std::mapwipe_tower_volumes_per_extruder; double support_volume_cache; - std::mapsupport_volume_per_extruder; + std::mapsupport_volumes_per_extruder; //BBS: the flush amount of every filament std::map flush_per_filament; + double total_volume_cache; + std::maptotal_volumes_per_extruder; + double role_cache; std::map> filaments_per_role; @@ -524,6 +530,7 @@ namespace Slic3r { void process_model_cache(GCodeProcessor* processor); void process_wipe_tower_cache(GCodeProcessor* processor); void process_support_cache(GCodeProcessor* processor); + void process_total_volume_cache(GCodeProcessor* processor); void update_flush_per_filament(size_t extrude_id, float flush_length); void process_role_cache(GCodeProcessor* processor); diff --git a/src/libslic3r/Geometry/Voronoi.cpp b/src/libslic3r/Geometry/Voronoi.cpp index e1df7322a4..0842ddc37b 100644 --- a/src/libslic3r/Geometry/Voronoi.cpp +++ b/src/libslic3r/Geometry/Voronoi.cpp @@ -160,10 +160,12 @@ VoronoiDiagram::detect_known_issues(const VoronoiDiagram &voronoi_diagram, Segme return IssueType::FINITE_EDGE_WITH_NON_FINITE_VERTEX; } else if (const IssueType cell_issue_type = detect_known_voronoi_cell_issues(voronoi_diagram, segment_begin, segment_end); cell_issue_type != IssueType::NO_ISSUE_DETECTED) { return cell_issue_type; - } else if (!VoronoiUtilsCgal::is_voronoi_diagram_planar_angle(voronoi_diagram, segment_begin, segment_end)) { - // Detection of non-planar Voronoi diagram detects at least GH issues #8474, #8514 and #8446. - return IssueType::NON_PLANAR_VORONOI_DIAGRAM; } + // BBS: test no problem in BBS + //} else if (!VoronoiUtilsCgal::is_voronoi_diagram_planar_angle(voronoi_diagram, segment_begin, segment_end)) { + // // Detection of non-planar Voronoi diagram detects at least GH issues #8474, #8514 and #8446. + // return IssueType::NON_PLANAR_VORONOI_DIAGRAM; + //} return IssueType::NO_ISSUE_DETECTED; } diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index 66aef84a3d..96677495c6 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -24,9 +24,6 @@ #include "TriangleSelector.hpp" #include "Format/AMF.hpp" -#include "Format/OBJ.hpp" -#include "Format/STL.hpp" -#include "Format/STEP.hpp" #include "Format/svg.hpp" // BBS #include "FaceDetector.hpp" @@ -60,6 +57,9 @@ #define _L(s) Slic3r::I18N::translate(s) namespace Slic3r { +const std::vector CONST_FILAMENTS = { + "", "4", "8", "0C", "1C", "2C", "3C", "4C", "5C", "6C", "7C", "8C", "9C", "AC", "BC", "CC", "DC", +}; // 5 10 15 16 // BBS initialization of static variables std::map Model::extruderParamsMap = { {0,{"",0,0}}}; GlobalSpeedMap Model::printSpeedMap{}; @@ -190,7 +190,12 @@ Model::~Model() // Loading model from a file, it may be a simple geometry file as STL or OBJ, however it may be a project file as well. Model Model::read_from_file(const std::string& input_file, DynamicPrintConfig* config, ConfigSubstitutionContext* config_substitutions, LoadStrategy options, PlateDataPtrs* plate_data, std::vector* project_presets, bool *is_xxx, Semver* file_version, Import3mfProgressFn proFn, - ImportstlProgressFn stlFn, ImportStepProgressFn stepFn, StepIsUtf8Fn stepIsUtf8Fn, BBLProject* project, int plate_id) + ImportstlProgressFn stlFn, + ImportStepProgressFn stepFn, + StepIsUtf8Fn stepIsUtf8Fn, + BBLProject * project, + int plate_id, + ObjImportColorFn objFn) { Model model; @@ -221,8 +226,46 @@ Model Model::read_from_file(const std::string& input_file, DynamicPrintConfig* c result = load_stl(input_file.c_str(), &model, nullptr, stlFn); else if (boost::algorithm::iends_with(input_file, ".oltp")) result = load_stl(input_file.c_str(), &model, nullptr, stlFn,256); - else if (boost::algorithm::iends_with(input_file, ".obj")) - result = load_obj(input_file.c_str(), &model, message); + else if (boost::algorithm::iends_with(input_file, ".obj")) { + ObjInfo obj_info; + result = load_obj(input_file.c_str(), &model, obj_info, message); + if (result){ + unsigned char first_extruder_id; + if (obj_info.vertex_colors.size() > 0) { + std::vector vertex_filament_ids; + if (objFn) { // 1.result is ok and pop up a dialog + objFn(obj_info.vertex_colors, false, vertex_filament_ids, first_extruder_id); + if (vertex_filament_ids.size() > 0) { + result = obj_import_vertex_color_deal(vertex_filament_ids, first_extruder_id, & model); + } + } else { // test //todo delete + vertex_filament_ids.push_back(2); + vertex_filament_ids.push_back(3); + vertex_filament_ids.push_back(4); + vertex_filament_ids.push_back(1); // 4 + vertex_filament_ids.push_back(1); + vertex_filament_ids.push_back(1); + vertex_filament_ids.push_back(1); + vertex_filament_ids.push_back(1); // 8 + result = obj_import_vertex_color_deal(vertex_filament_ids, first_extruder_id, &model); + } + } else if (obj_info.face_colors.size() > 0 && obj_info.has_uv_png == false) { // mtl file + std::vector face_filament_ids; + if (objFn) { // 1.result is ok and pop up a dialog + objFn(obj_info.face_colors, obj_info.is_single_mtl, face_filament_ids, first_extruder_id); + if (face_filament_ids.size() > 0) { + result = obj_import_face_color_deal(face_filament_ids, first_extruder_id, &model); + } + } + } /*else if (obj_info.has_uv_png && obj_info.uvs.size() > 0) { + boost::filesystem::path full_path(input_file); + std::string obj_directory = full_path.parent_path().string(); + obj_info.obj_dircetory = obj_directory; + result = false; + message = _L("Importing obj with png function is developing."); + }*/ + } + } else if (boost::algorithm::iends_with(input_file, ".svg")) result = load_svg(input_file.c_str(), &model, message); //BBS: remove the old .amf.xml files @@ -2866,6 +2909,163 @@ void Model::setExtruderParams(const DynamicPrintConfig& config, int extruders_co } } +static void get_real_filament_id(const unsigned char &id, std::string &result) { + if (id < CONST_FILAMENTS.size()) { + result = CONST_FILAMENTS[id]; + } else { + result = "";//error + } +}; + +bool Model::obj_import_vertex_color_deal(const std::vector &vertex_filament_ids, const unsigned char &first_extruder_id, Model *model) +{ + if (vertex_filament_ids.size() == 0) { + return false; + } + // 2.generate mmu_segmentation_facets + if (model->objects.size() == 1 ) { + auto obj = model->objects[0]; + obj->config.set("extruder", first_extruder_id); + if (obj->volumes.size() == 1) { + enum VertexColorCase { + _3_SAME_COLOR, + _3_DIFF_COLOR, + _2_SAME_1_DIFF_COLOR, + }; + auto calc_vertex_color_case = [](const unsigned char &c0, const unsigned char &c1, const unsigned char &c2, VertexColorCase &vertex_color_case, + unsigned char &iso_index) { + if (c0 == c1 && c1 == c2) { + vertex_color_case = VertexColorCase::_3_SAME_COLOR; + } else if (c0 != c1 && c1 != c2 && c0 != c2) { + vertex_color_case = VertexColorCase::_3_DIFF_COLOR; + } else if (c0 == c1) { + vertex_color_case = _2_SAME_1_DIFF_COLOR; + iso_index = 2; + } else if (c1 == c2) { + vertex_color_case = _2_SAME_1_DIFF_COLOR; + iso_index = 0; + } else if (c0 == c2) { + vertex_color_case = _2_SAME_1_DIFF_COLOR; + iso_index = 1; + } else { + std::cout << "error"; + } + }; + auto calc_tri_area = [](const Vec3f &v0, const Vec3f &v1, const Vec3f &v2) { + return std::abs((v0 - v1).cross(v0 - v2).norm()) / 2; + }; + auto volume = obj->volumes[0]; + volume->config.set("extruder", first_extruder_id); + auto face_count = volume->mesh().its.indices.size(); + volume->mmu_segmentation_facets.reserve(face_count); + if (volume->mesh().its.vertices.size() != vertex_filament_ids.size()) { + return false; + } + for (size_t i = 0; i < volume->mesh().its.indices.size(); i++) { + auto face = volume->mesh().its.indices[i]; + auto filament_id0 = vertex_filament_ids[face[0]]; + auto filament_id1 = vertex_filament_ids[face[1]]; + auto filament_id2 = vertex_filament_ids[face[2]]; + if (filament_id0 <= 1 && filament_id1 <= 1 && filament_id2 <= 2) { + continue; + } + if (i == 0) { + std::cout << ""; + } + VertexColorCase vertex_color_case; + unsigned char iso_index; + calc_vertex_color_case(filament_id0, filament_id1, filament_id2, vertex_color_case, iso_index); + switch (vertex_color_case) { + case _3_SAME_COLOR: { + std::string result; + get_real_filament_id(filament_id0, result); + volume->mmu_segmentation_facets.set_triangle_from_string(i, result); + break; + } + case _3_DIFF_COLOR: { + std::string result0, result1, result2; + get_real_filament_id(filament_id0, result0); + get_real_filament_id(filament_id1, result1); + get_real_filament_id(filament_id2, result2); + + auto v0 = volume->mesh().its.vertices[face[0]]; + auto v1 = volume->mesh().its.vertices[face[1]]; + auto v2 = volume->mesh().its.vertices[face[2]]; + auto dir_0_1 = (v1 - v0).normalized(); + auto dir_0_2 = (v2 - v0).normalized(); + float sita0 = acos(dir_0_1.dot(dir_0_2)); + auto dir_1_0 = -dir_0_1; + auto dir_1_2 = (v2 - v1).normalized(); + float sita1 = acos(dir_1_0.dot(dir_1_2)); + float sita2 = PI - sita0 - sita1; + std::array sitas = {sita0, sita1, sita2}; + float max_sita = sitas[0]; + int max_sita_vertex_index = 0; + for (size_t j = 1; j < sitas.size(); j++) { + if (sitas[j] > max_sita) { + max_sita_vertex_index = j; + max_sita = sitas[j]; + } + } + if (max_sita_vertex_index == 0) { + volume->mmu_segmentation_facets.set_triangle_from_string(i, result0 + result1 + result2 + (result1 + result2 + "5" )+ "3"); //"1C0C2C0C1C13" + } else if (max_sita_vertex_index == 1) { + volume->mmu_segmentation_facets.set_triangle_from_string(i, result0 + result1 + result2 + (result0 + result2 + "9") + "3"); + } else{// if (max_sita_vertex_index == 2) + volume->mmu_segmentation_facets.set_triangle_from_string(i, result0 + result1 + result2 + (result1 + result0 + "1") + "3"); + } + break; + } + case _2_SAME_1_DIFF_COLOR: { + std::string result0, result1, result2; + get_real_filament_id(filament_id0, result0); + get_real_filament_id(filament_id1, result1); + get_real_filament_id(filament_id2, result2); + if (iso_index == 0) { + volume->mmu_segmentation_facets.set_triangle_from_string(i, result0 + result1 + result1 + "2"); + } else if (iso_index == 1) { + volume->mmu_segmentation_facets.set_triangle_from_string(i, result1 + result0 + result0 + "6"); + } else if (iso_index == 2) { + volume->mmu_segmentation_facets.set_triangle_from_string(i, result2 + result0 + result0 + "A"); + } + break; + } + default: break; + } + } + return true; + } + } + return false; +} + +bool Model::obj_import_face_color_deal(const std::vector &face_filament_ids, const unsigned char &first_extruder_id, Model *model) +{ + if (face_filament_ids.size() == 0) { return false; } + // 2.generate mmu_segmentation_facets + if (model->objects.size() == 1) { + auto obj = model->objects[0]; + obj->config.set("extruder", first_extruder_id); + if (obj->volumes.size() == 1) { + auto volume = obj->volumes[0]; + volume->config.set("extruder", first_extruder_id); + auto face_count = volume->mesh().its.indices.size(); + volume->mmu_segmentation_facets.reserve(face_count); + if (volume->mesh().its.indices.size() != face_filament_ids.size()) { return false; } + for (size_t i = 0; i < volume->mesh().its.indices.size(); i++) { + auto face = volume->mesh().its.indices[i]; + auto filament_id = face_filament_ids[i]; + if (filament_id <= 1) { continue; } + std::string result; + get_real_filament_id(filament_id, result); + volume->mmu_segmentation_facets.set_triangle_from_string(i, result); + } + return true; + } + } + return false; +} + // update the maxSpeed of an object if it is different from the global configuration double Model::findMaxSpeed(const ModelObject* object) { auto objectKeys = object->config.keys(); diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index 03b25b810e..41ddd83aa9 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -35,6 +35,7 @@ #include "Format/STEP.hpp" //BBS: add stl #include "Format/STL.hpp" +#include "Format/OBJ.hpp" #include #include @@ -1564,8 +1565,16 @@ public: DynamicPrintConfig* config = nullptr, ConfigSubstitutionContext* config_substitutions = nullptr, LoadStrategy options = LoadStrategy::AddDefaultInstances, PlateDataPtrs* plate_data = nullptr, std::vector* project_presets = nullptr, bool* is_xxx = nullptr, Semver* file_version = nullptr, Import3mfProgressFn proFn = nullptr, - ImportstlProgressFn stlFn = nullptr, ImportStepProgressFn stepFn = nullptr, StepIsUtf8Fn stepIsUtf8Fn = nullptr, BBLProject* project = nullptr, int plate_id = 0); + ImportstlProgressFn stlFn = nullptr, + ImportStepProgressFn stepFn = nullptr, + StepIsUtf8Fn stepIsUtf8Fn = nullptr, + BBLProject * project = nullptr, + int plate_id = 0, + ObjImportColorFn objFn = nullptr + ); // BBS + static bool obj_import_vertex_color_deal(const std::vector &vertex_filament_ids, const unsigned char &first_extruder_id, Model *model); + static bool obj_import_face_color_deal(const std::vector &face_filament_ids, const unsigned char &first_extruder_id, Model *model); static double findMaxSpeed(const ModelObject* object); static double getThermalLength(const ModelVolume* modelVolumePtr); static double getThermalLength(const std::vector modelVolumePtrs); diff --git a/src/libslic3r/ObjColorUtils.hpp b/src/libslic3r/ObjColorUtils.hpp new file mode 100644 index 0000000000..4fe924fab2 --- /dev/null +++ b/src/libslic3r/ObjColorUtils.hpp @@ -0,0 +1,191 @@ +#pragma once +#include +#include + +#include "opencv2/opencv.hpp" + +class QuantKMeans +{ +public: + int m_alpha_thres; + cv::Mat m_flatten_labels; + cv::Mat m_centers8UC3; + QuantKMeans(int alpha_thres = 10) : m_alpha_thres(alpha_thres) {} + void apply(cv::Mat &ori_image, cv::Mat &new_image, int num_cluster, int color_space) + { + cv::Mat image; + convert_color_space(ori_image, image, color_space); + cv::Mat flatten_image = flatten(image); + + apply(flatten_image, num_cluster, color_space); + replace_centers(ori_image, new_image); + } + void apply_aplha(cv::Mat &ori_image, cv::Mat &new_image, int num_cluster, int color_space) + { + // cout << " *** DoAlpha *** " << endl; + cv::Mat flatten_image8UC3 = flatten_alpha(ori_image); + cv::Mat image8UC3; + convert_color_space(flatten_image8UC3, image8UC3, color_space); + cv::Mat image32FC3(image8UC3.rows, 1, CV_32FC3); + for (int i = 0; i < image8UC3.rows; i++) image32FC3.at(i, 0) = image8UC3.at(i, 0); + + apply(image32FC3, num_cluster, color_space); + repalce_centers_aplha(ori_image, new_image); + } + void apply(cv::Mat &flatten_image, int num_cluster, int color_space) + { + cv::Mat centers32FC3; + num_cluster = fmin(flatten_image.rows, num_cluster); + kmeans(flatten_image, num_cluster, this->m_flatten_labels, cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 300, 0.5), 3, cv::KMEANS_PP_CENTERS, + centers32FC3); + this->m_centers8UC3 = cv::Mat(num_cluster, 1, CV_8UC3); + for (int i = 0; i < num_cluster; i++) this->m_centers8UC3.at(i) = centers32FC3.at(i); + + convert_color_space(this->m_centers8UC3, this->m_centers8UC3, color_space, true); + } + + void apply(const std::vector> &ori_colors, + std::vector> & cluster_results, + std::vector & labels, + int num_cluster = -1, + int color_space = 2) + { + // 0~255 + cv::Mat flatten_image8UC3 = flatten_vector(ori_colors); + + cv::Mat image8UC3; + convert_color_space(flatten_image8UC3, image8UC3, color_space); + + cv::Mat image32FC3(image8UC3.rows, 1, CV_32FC3); + for (int i = 0; i < image8UC3.rows; i++) + image32FC3.at(i, 0) = image8UC3.at(i, 0); + + int best_cluster = 1; + double cur_score, best_score = 100; + int max_cluster = ori_colors.size(); + num_cluster = fmin(num_cluster, max_cluster); + if (num_cluster < 1) { + cur_score = kmeans(image32FC3, 1, this->m_flatten_labels, cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 300, 0.5), 3, cv::KMEANS_PP_CENTERS); + best_score = cur_score; + for (int cur_cluster = 2; cur_cluster < 16; cur_cluster++) { + if (cur_cluster > max_cluster) + break; + cur_score = kmeans(image32FC3, cur_cluster, this->m_flatten_labels, cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 300, 0.5), 3, + cv::KMEANS_PP_CENTERS); + best_cluster = cur_score < best_score ? cur_cluster : best_cluster; + best_score = cur_score < best_score ? cur_score : best_score; + } + } else + best_cluster = num_cluster; + + cv::Mat centers32FC3; + kmeans(image32FC3, best_cluster, this->m_flatten_labels, cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 300, 0.5), 3, cv::KMEANS_PP_CENTERS, + centers32FC3); + this->m_centers8UC3 = cv::Mat(best_cluster, 1, CV_8UC3); + for (int i = 0; i < best_cluster; i++) + this->m_centers8UC3.at(i) = centers32FC3.at(i); + + convert_color_space(this->m_centers8UC3, this->m_centers8UC3, color_space, true); + + cluster_results.clear(); + labels.clear(); + for (int i = 0; i < ori_colors.size(); i++) + labels.emplace_back(this->m_flatten_labels.at(i, 0)); + for (int i = 0; i < best_cluster; i++) { + cv::Vec3f center = this->m_centers8UC3.at(i, 0); + cluster_results.emplace_back(std::array{center[0] / 255.f, center[1] / 255.f, center[2] / 255.f, 1.f}); + } + } + + void replace_centers(cv::Mat &ori_image, cv::Mat &new_image) + { + for (int i = 0; i < ori_image.rows; i++) { + for (int j = 0; j < ori_image.cols; j++) { + int idx = this->m_flatten_labels.at(i * ori_image.cols + j, 0); + cv::Vec3b pixel = this->m_centers8UC3.at(idx); + new_image.at(i, j) = pixel; + } + } + } + void repalce_centers_aplha(cv::Mat &ori_image, cv::Mat &new_image) + { + int cnt = 0; + int idx; + cv::Vec3b center; + for (int i = 0; i < ori_image.rows; i++) { + for (int j = 0; j < ori_image.cols; j++) { + cv::Vec4b pixel = ori_image.at(i, j); + if ((int) pixel[3] < this->m_alpha_thres) + new_image.at(i, j) = pixel; + else { + idx = this->m_flatten_labels.at(cnt++, 0); + center = this->m_centers8UC3.at(idx); + new_image.at(i, j) = cv::Vec4b(center[0], center[1], center[2], pixel[3]); + } + } + } + } + + void convert_color_space(cv::Mat &ori_image, cv::Mat &image, int color_space, bool reverse = false) + { + switch (color_space) { + case 0: image = ori_image; break; + case 1: + if (reverse) + cvtColor(ori_image, image, cv::COLOR_HSV2BGR); + else + cvtColor(ori_image, image, cv::COLOR_BGR2HSV); + break; + case 2: + if (reverse) + cvtColor(ori_image, image, cv::COLOR_Lab2BGR); + else + cvtColor(ori_image, image, cv::COLOR_BGR2Lab); + break; + default: break; + } + } + + cv::Mat flatten(cv::Mat &image) + { + int num_pixels = image.rows * image.cols; + cv::Mat img(num_pixels, 1, CV_32FC3); + for (int i = 0; i < image.rows; i++) { + for (int j = 0; j < image.cols; j++) { + cv::Vec3f pixel = image.at(i, j); + img.at(i * image.cols + j, 0) = pixel; + } + } + return img; + } + cv::Mat flatten_alpha(cv::Mat &image) + { + int num_pixels = image.rows * image.cols; + for (int i = 0; i < image.rows; i++) + for (int j = 0; j < image.cols; j++) { + cv::Vec4b pixel = image.at(i, j); + if ((int) pixel[3] < this->m_alpha_thres) num_pixels--; + } + + cv::Mat img(num_pixels, 1, CV_8UC3); + int cnt = 0; + for (int i = 0; i < image.rows; i++) { + for (int j = 0; j < image.cols; j++) { + cv::Vec4b pixel = image.at(i, j); + if ((int) pixel[3] >= this->m_alpha_thres) img.at(cnt++, 0) = cv::Vec3b(pixel[0], pixel[1], pixel[2]); + } + } + return img; + } + cv::Mat flatten_vector(const std::vector> &ori_colors) + { + int num_pixels = ori_colors.size(); + + cv::Mat image8UC3(num_pixels, 1, CV_8UC3); + for (int i = 0; i < num_pixels; i++) { + std::array pixel = ori_colors[i]; + image8UC3.at(i, 0) = cv::Vec3b((int) (pixel[0] * 255.f), (int) (pixel[1] * 255.f), (int) (pixel[2] * 255.f)); + } + return image8UC3; + } +}; diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 20cf79206d..f7a9d28924 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -1138,6 +1138,8 @@ void PresetCollection::load_presets( preset.filament_id = key_values[BBL_JSON_KEY_FILAMENT_ID]; if (key_values.find(BBL_JSON_KEY_IS_CUSTOM) != key_values.end()) preset.custom_defined = key_values[BBL_JSON_KEY_IS_CUSTOM]; + if (key_values.find(BBL_JSON_KEY_DESCRIPTION) != key_values.end()) + preset.description = key_values[BBL_JSON_KEY_DESCRIPTION]; if (key_values.find("instantiation") != key_values.end()) preset.is_visible = key_values["instantiation"] != "false"; diff --git a/src/libslic3r/Preset.hpp b/src/libslic3r/Preset.hpp index 4922f12eb1..659fc0bf9e 100644 --- a/src/libslic3r/Preset.hpp +++ b/src/libslic3r/Preset.hpp @@ -241,6 +241,7 @@ public: std::string base_id; // base id of preset std::string sync_info; // enum: "delete", "create", "update", "" std::string custom_defined; // enum: "1", "0", "" + std::string description; // long long updated_time{0}; //last updated time std::map key_values; diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index e1503604bb..fa887acb47 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -1964,7 +1964,8 @@ std::set PresetBundle::get_printer_names_by_printer_type_and_nozzle if (printer_it->name.find(nozzle_diameter_str) != std::string::npos) printer_names.insert(printer_it->name); } - assert(printer_names.size() == 1); + + //assert(printer_names.size() == 1); for (auto& printer_name : printer_names) { BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " " << __LINE__ << " printer name: " << printer_name; @@ -3463,7 +3464,7 @@ std::pair PresetBundle::load_vendor_configs_ // Load the print, filament or printer preset. std::string preset_name; DynamicPrintConfig config; - std::string alias_name, inherits, instantiation, setting_id, filament_id; + std::string alias_name, inherits, description, instantiation, setting_id, filament_id; std::vector renamed_from; const DynamicPrintConfig* default_config = nullptr; std::string reason; @@ -3480,7 +3481,8 @@ std::pair PresetBundle::load_vendor_configs_ return reason; } preset_name = key_values[BBL_JSON_KEY_NAME]; - instantiation = key_values[BBL_JSON_KEY_INSTANTIATION]; + description = key_values[BBL_JSON_KEY_DESCRIPTION]; + instantiation = key_values[BBL_JSON_KEY_INSTANTIATION]; auto setting_it = key_values.find(BBL_JSON_KEY_SETTING_ID); if (setting_it != key_values.end()) setting_id = setting_it->second; @@ -3603,6 +3605,7 @@ std::pair PresetBundle::load_vendor_configs_ loaded.is_system = true; loaded.vendor = current_vendor_profile; loaded.version = current_vendor_profile->config_version; + loaded.description = description; loaded.setting_id = setting_id; loaded.filament_id = filament_id; BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " " << __LINE__ << loaded.name << " load filament_id: " << filament_id; diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 1d2a203c2e..651c0ff8d3 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -160,7 +160,8 @@ static t_config_enum_values s_keys_map_InfillPattern { { "archimedeanchords", ipArchimedeanChords }, { "octagramspiral", ipOctagramSpiral }, { "supportcubic", ipSupportCubic }, - { "lightning", ipLightning } + { "lightning", ipLightning }, + { "crosshatch", ipCrossHatch} }; CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(InfillPattern) @@ -2049,6 +2050,7 @@ def = this->add("filament_loading_speed", coFloats); def->enum_values.push_back("octagramspiral"); def->enum_values.push_back("supportcubic"); def->enum_values.push_back("lightning"); + def->enum_values.push_back("crosshatch"); def->enum_labels.push_back(L("Concentric")); def->enum_labels.push_back(L("Rectilinear")); def->enum_labels.push_back(L("Grid")); @@ -2066,6 +2068,7 @@ def = this->add("filament_loading_speed", coFloats); def->enum_labels.push_back(L("Octagram Spiral")); def->enum_labels.push_back(L("Support Cubic")); def->enum_labels.push_back(L("Lightning")); + def->enum_labels.push_back(L("Cross Hatch")); def->set_default_value(new ConfigOptionEnum(ipCubic)); auto def_infill_anchor_min = def = this->add("infill_anchor", coFloatOrPercent); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index be3edef9a3..de094343b2 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -69,7 +69,7 @@ enum AuthorizationType { enum InfillPattern : int { ipConcentric, ipRectilinear, ipGrid, ipLine, ipCubic, ipTriangles, ipStars, ipGyroid, ipHoneycomb, ipAdaptiveCubic, ipMonotonic, ipMonotonicLine, ipAlignedRectilinear, ip3DHoneycomb, ipHilbertCurve, ipArchimedeanChords, ipOctagramSpiral, ipSupportCubic, ipSupportBase, ipConcentricInternal, - ipLightning, + ipLightning, ipCrossHatch, ipCount, }; diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index c78e7de4b5..232a0a80d6 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -2333,9 +2333,17 @@ void PrintObject::bridge_over_infill() }; // LAMBDA do determine optimal bridging angle - auto determine_bridging_angle = [](const Polygons &bridged_area, const Lines &anchors, InfillPattern dominant_pattern) { + auto determine_bridging_angle = [](const Polygons &bridged_area, const Lines &anchors, InfillPattern dominant_pattern, double infill_direction) { AABBTreeLines::LinesDistancer lines_tree(anchors); + // Check it the infill that require a fixed infill angle. + switch (dominant_pattern) { + case ip3DHoneycomb: + case ipCrossHatch: + return (infill_direction + 45.0) * 2.0 * M_PI / 360.; + default: break; + } + std::map counted_directions; for (const Polygon &p : bridged_area) { double acc_distance = 0; @@ -2715,11 +2723,12 @@ void PrintObject::bridge_over_infill() double bridging_angle = 0; if (!anchors.empty()) { bridging_angle = determine_bridging_angle(area_to_be_bridge, to_lines(anchors), - candidate.region->region().config().sparse_infill_pattern.value); + candidate.region->region().config().sparse_infill_pattern.value, + candidate.region->region().config().infill_direction.value); } else { // use expansion boundaries as anchors. // Also, use Infill pattern that is neutral for angle determination, since there are no infill lines. - bridging_angle = determine_bridging_angle(area_to_be_bridge, to_lines(boundary_plines), InfillPattern::ipLine); + bridging_angle = determine_bridging_angle(area_to_be_bridge, to_lines(boundary_plines), InfillPattern::ipLine, 0); } boundary_plines.insert(boundary_plines.end(), anchors.begin(), anchors.end()); diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index fa808b4ac5..6ff0adf18b 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -208,6 +208,8 @@ set(SLIC3R_GUI_SOURCES GUI/Plater.hpp GUI/PartPlate.cpp GUI/PartPlate.hpp + GUI/UserNotification.cpp + GUI/UserNotification.hpp GUI/PresetComboBoxes.hpp GUI/PresetComboBoxes.cpp GUI/BitmapComboBox.hpp @@ -304,6 +306,8 @@ set(SLIC3R_GUI_SOURCES GUI/CameraUtils.hpp GUI/wxExtensions.cpp GUI/wxExtensions.hpp + GUI/ObjColorDialog.cpp + GUI/ObjColorDialog.hpp GUI/WipeTowerDialog.cpp GUI/RammingChart.cpp GUI/RammingChart.hpp @@ -321,6 +325,8 @@ set(SLIC3R_GUI_SOURCES GUI/ImGuiWrapper.cpp GUI/DeviceManager.hpp GUI/DeviceManager.cpp + GUI/UserManager.hpp + GUI/UserManager.cpp GUI/HttpServer.hpp GUI/HttpServer.cpp Config/Snapshot.cpp @@ -467,6 +473,24 @@ set(SLIC3R_GUI_SOURCES Utils/json_diff.cpp GUI/KBShortcutsDialog.hpp GUI/KBShortcutsDialog.cpp + GUI/MultiMachine.hpp + GUI/MultiMachine.cpp + GUI/MultiMachinePage.hpp + GUI/MultiMachinePage.cpp + GUI/MultiMachineManagerPage.cpp + GUI/MultiMachineManagerPage.hpp + GUI/MultiPrintJob.cpp + GUI/MultiPrintJob.hpp + GUI/MultiSendMachineModel.hpp + GUI/MultiSendMachineModel.cpp + GUI/MultiTaskManagerPage.hpp + GUI/MultiTaskManagerPage.cpp + GUI/MultiTaskModel.hpp + GUI/MultiTaskModel.cpp + GUI/SendMultiMachinePage.hpp + GUI/SendMultiMachinePage.cpp + GUI/TaskManager.cpp + GUI/TaskManager.hpp Utils/Http.cpp Utils/Http.hpp Utils/FixModelByWin10.cpp @@ -526,6 +550,7 @@ set(SLIC3R_GUI_SOURCES GUI/calib_dlg.cpp Utils/CalibUtils.cpp Utils/CalibUtils.hpp + Utils/ProfileDescription.hpp GUI/PrinterCloudAuthDialog.cpp GUI/PrinterCloudAuthDialog.hpp Utils/Obico.cpp diff --git a/src/slic3r/GUI/AMSMaterialsSetting.cpp b/src/slic3r/GUI/AMSMaterialsSetting.cpp index e91b01730d..b09ec7d6cc 100644 --- a/src/slic3r/GUI/AMSMaterialsSetting.cpp +++ b/src/slic3r/GUI/AMSMaterialsSetting.cpp @@ -8,12 +8,19 @@ #include #include #include "CalibUtils.hpp" - +#include "../Utils/ColorSpaceConvert.hpp" namespace Slic3r { namespace GUI { wxDEFINE_EVENT(EVT_SELECTED_COLOR, wxCommandEvent); -AMSMaterialsSetting::AMSMaterialsSetting(wxWindow *parent, wxWindowID id) +static std::string float_to_string_with_precision(float value, int precision = 3) +{ + std::stringstream stream; + stream << std::fixed << std::setprecision(precision) << value; + return stream.str(); +} + +AMSMaterialsSetting::AMSMaterialsSetting(wxWindow *parent, wxWindowID id) : DPIDialog(parent, id, _L("AMS Materials Setting"), wxDefaultPosition, wxDefaultSize, wxBORDER_NONE) , m_color_picker_popup(ColorPickerPopup(this)) { @@ -281,6 +288,14 @@ void AMSMaterialsSetting::create_panel_kn(wxWindow* parent) m_ratio_text->SetForegroundColour(wxColour(50, 58, 61)); m_ratio_text->SetFont(Label::Head_14); + m_ratio_text->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_HAND); }); + m_ratio_text->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_ARROW); }); + + m_ratio_text->Bind(wxEVT_LEFT_DOWN, [this](auto& e) { + wxLaunchDefaultBrowser(wxT("https://wiki.bambulab.com/en/software/bambu-studio/calibration_pa")); + }); + + wxBoxSizer *m_sizer_cali_resutl = new wxBoxSizer(wxHORIZONTAL); // pa profile m_title_pa_profile = new wxStaticText(parent, wxID_ANY, _L("PA Profile"), wxDefaultPosition, wxSize(AMS_MATERIALS_SETTING_LABEL_WIDTH, -1), 0); @@ -750,6 +765,16 @@ bool AMSMaterialsSetting::Show(bool show) m_input_nozzle_min->GetTextCtrl()->SetSize(wxSize(-1, FromDIP(20))); //m_clr_picker->set_color(m_clr_picker->GetParent()->GetBackgroundColour()); + /*if (obj && (obj->is_function_supported(PrinterFunction::FUNC_EXTRUSION_CALI) || obj->is_high_printer_type())) { + m_ratio_text->Show(); + m_k_param->Show(); + m_input_k_val->Show(); + } + else { + m_ratio_text->Hide(); + m_k_param->Hide(); + m_input_k_val->Hide(); + }*/ m_ratio_text->Show(); m_k_param->Show(); m_input_k_val->Show(); @@ -922,8 +947,8 @@ void AMSMaterialsSetting::on_select_cali_result(wxCommandEvent &evt) { m_pa_cali_select_id = evt.GetSelection(); if (m_pa_cali_select_id >= 0) { - m_input_k_val->GetTextCtrl()->SetValue(std::to_string(m_pa_profile_items[m_pa_cali_select_id].k_value)); - m_input_n_val->GetTextCtrl()->SetValue(std::to_string(m_pa_profile_items[m_pa_cali_select_id].n_coef)); + m_input_k_val->GetTextCtrl()->SetValue(float_to_string_with_precision(m_pa_profile_items[m_pa_cali_select_id].k_value)); + m_input_n_val->GetTextCtrl()->SetValue(float_to_string_with_precision(m_pa_profile_items[m_pa_cali_select_id].n_coef)); } else{ m_input_k_val->GetTextCtrl()->SetValue(std::to_string(0.00)); @@ -1012,6 +1037,8 @@ void AMSMaterialsSetting::on_select_filament(wxCommandEvent &evt) m_button_confirm->SetBorderColor(wxColour(0x90, 0x90, 0x90)); m_comboBox_cali_result->Clear(); m_comboBox_cali_result->SetValue(wxEmptyString); + m_input_k_val->GetTextCtrl()->SetValue(wxEmptyString); + m_input_n_val->GetTextCtrl()->SetValue(wxEmptyString); return; } else { @@ -1076,8 +1103,8 @@ void AMSMaterialsSetting::on_select_filament(wxCommandEvent &evt) } if (cali_select_idx >= 0) { - m_input_k_val->GetTextCtrl()->SetValue(std::to_string(m_pa_profile_items[cali_select_idx].k_value)); - m_input_n_val->GetTextCtrl()->SetValue(std::to_string(m_pa_profile_items[cali_select_idx].n_coef)); + m_input_k_val->GetTextCtrl()->SetValue(float_to_string_with_precision(m_pa_profile_items[cali_select_idx].k_value)); + m_input_n_val->GetTextCtrl()->SetValue(float_to_string_with_precision(m_pa_profile_items[cali_select_idx].n_coef)); } } else { @@ -1121,7 +1148,6 @@ ColorPicker::ColorPicker(wxWindow* parent, wxWindowID id, const wxPoint& pos /*= m_bitmap_border = create_scaled_bitmap("color_picker_border", nullptr, 25); m_bitmap_border_dark = create_scaled_bitmap("color_picker_border_dark", nullptr, 25); - m_bitmap_transparent_def = create_scaled_bitmap("transparent_color_picker", nullptr, 25); m_bitmap_transparent = create_scaled_bitmap("transparent_color_picker", nullptr, 25); } @@ -1185,12 +1211,12 @@ void ColorPicker::doRender(wxDC& dc) if (m_selected) radius -= FromDIP(1); if (alpha == 0) { - dc.DrawBitmap(m_bitmap_transparent_def, 0, 0); + dc.DrawBitmap(m_bitmap_transparent, 0, 0); } else if (alpha != 254 && alpha != 255) { if (transparent_changed) { std::string rgb = (m_colour.GetAsString(wxC2S_HTML_SYNTAX)).ToStdString(); - if (rgb.size() == 9) { + if (rgb.size() == 8) { //delete alpha value rgb = rgb.substr(0, rgb.size() - 2); } @@ -1201,8 +1227,8 @@ void ColorPicker::doRender(wxDC& dc) replace.push_back(fill_replace); m_bitmap_transparent = ScalableBitmap(this, "transparent_color_picker", 25, false, false, true, replace).bmp(); transparent_changed = false; + dc.DrawBitmap(m_bitmap_transparent, 0, 0); } - dc.DrawBitmap(m_bitmap_transparent, 0, 0); } else { dc.SetPen(wxPen(m_colour)); @@ -1439,11 +1465,22 @@ ColorPickerPopup::ColorPickerPopup(wxWindow* parent) void ColorPickerPopup::on_custom_clr_picker(wxMouseEvent& event) { + std::vector colors = wxGetApp().app_config->get_custom_color_from_config(); + for (int i = 0; i < colors.size(); i++) { + m_clrData->SetCustomColour(i, string_to_wxColor(colors[i])); + } auto clr_dialog = new wxColourDialog(nullptr, m_clrData); wxColour picker_color; if (clr_dialog->ShowModal() == wxID_OK) { m_clrData = &(clr_dialog->GetColourData()); + if (colors.size() != CUSTOM_COLOR_COUNT) { + colors.resize(CUSTOM_COLOR_COUNT); + } + for (int i = 0; i < CUSTOM_COLOR_COUNT; i++) { + colors[i] = color_to_string(m_clrData->GetCustomColour(i)); + } + wxGetApp().app_config->save_custom_color_to_config(colors); picker_color = wxColour( m_clrData->GetColour().Red(), diff --git a/src/slic3r/GUI/AMSMaterialsSetting.hpp b/src/slic3r/GUI/AMSMaterialsSetting.hpp index 6a10255d28..c058ac769f 100644 --- a/src/slic3r/GUI/AMSMaterialsSetting.hpp +++ b/src/slic3r/GUI/AMSMaterialsSetting.hpp @@ -5,8 +5,8 @@ #include "wxExtensions.hpp" #include "GUI_Utils.hpp" #include "DeviceManager.hpp" -#include "wx/colourdata.h" #include "wx/clrpicker.h" +#include "wx/colourdata.h" #include "Widgets/RadioBox.hpp" #include "Widgets/Button.hpp" #include "Widgets/RoundedRectangle.hpp" @@ -36,7 +36,6 @@ public: wxBitmap m_bitmap_border; wxBitmap m_bitmap_border_dark; wxBitmap m_bitmap_transparent; - wxBitmap m_bitmap_transparent_def; //default transparent material wxColour m_colour; std::vector m_cols; diff --git a/src/slic3r/GUI/AMSSetting.cpp b/src/slic3r/GUI/AMSSetting.cpp index b2ef34e620..2b273ae00a 100644 --- a/src/slic3r/GUI/AMSSetting.cpp +++ b/src/slic3r/GUI/AMSSetting.cpp @@ -193,6 +193,40 @@ void AMSSetting::create() m_sizer_switch_filament_tip->Add(m_sizer_switch_filament_inline, 1, wxALIGN_CENTER, 0); + + // checkbox area 5 + wxBoxSizer* m_sizer_air_print = new wxBoxSizer(wxHORIZONTAL); + m_checkbox_air_print = new ::CheckBox(m_panel_body); + m_checkbox_air_print->Bind(wxEVT_TOGGLEBUTTON, &AMSSetting::on_air_print_detect, this); + m_sizer_air_print->Add(m_checkbox_air_print, 0, wxTOP, 1); + m_sizer_air_print->Add(0, 0, 0, wxLEFT, 12); + m_title_air_print = new wxStaticText(m_panel_body, wxID_ANY, _L("Air Printing Detection"), wxDefaultPosition, wxDefaultSize, 0); + m_title_air_print->SetFont(::Label::Head_13); + m_title_air_print->SetForegroundColour(AMS_SETTING_GREY800); + m_title_air_print->Wrap(AMS_SETTING_BODY_WIDTH); + m_sizer_air_print->Add(m_title_air_print, 1, wxEXPAND, 0); + + wxBoxSizer* m_sizer_air_print_tip = new wxBoxSizer(wxHORIZONTAL); + m_sizer_air_print_tip->Add(0, 0, 0, wxLEFT, 10); + + // tip line + auto m_sizer_air_print_inline = new wxBoxSizer(wxVERTICAL); + + m_tip_air_print_line = new Label(m_panel_body, + _L("Detects clogging and filament grinding, halting printing immediately to conserve time and filament.") + ); + m_tip_air_print_line->SetFont(::Label::Body_13); + m_tip_air_print_line->SetForegroundColour(AMS_SETTING_GREY700); + m_tip_air_print_line->SetSize(wxSize(AMS_SETTING_BODY_WIDTH, -1)); + m_tip_air_print_line->Wrap(AMS_SETTING_BODY_WIDTH); + m_sizer_air_print_inline->Add(m_tip_air_print_line, 0, wxEXPAND, 0); + m_sizer_air_print_tip->Add(m_sizer_air_print_inline, 1, wxALIGN_CENTER, 0); + + m_checkbox_air_print->Hide(); + m_title_air_print->Hide(); + m_tip_air_print_line->Hide(); + + // panel img wxPanel* m_panel_img = new wxPanel(m_panel_body, wxID_ANY, wxDefaultPosition, wxDefaultSize); m_panel_img->SetBackgroundColour(AMS_SETTING_GREY200); @@ -221,6 +255,11 @@ void AMSSetting::create() m_sizerl_body->Add(m_sizer_switch_filament_tip, 0, wxLEFT, 18); m_sizerl_body->Add(0, 0, 0, wxTOP, 6); m_sizerl_body->Add(0, 0, 0, wxTOP, FromDIP(5)); + m_sizerl_body->Add(m_sizer_air_print, 0, wxEXPAND | wxTOP, FromDIP(8)); + m_sizerl_body->Add(0, 0, 0, wxTOP, 8); + m_sizerl_body->Add(m_sizer_air_print_tip, 0, wxLEFT, 18); + m_sizerl_body->Add(0, 0, 0, wxTOP, 6); + m_sizerl_body->Add(0, 0, 0, wxTOP, FromDIP(5)); m_sizerl_body->Add(m_panel_img, 1, wxEXPAND | wxALL, FromDIP(5)); m_panel_body->SetSizer(m_sizerl_body); @@ -285,6 +324,9 @@ void AMSSetting::update_insert_material_read_mode(bool selected, std::string ver void AMSSetting::update_ams_img(std::string ams_icon_str) { + if (wxGetApp().dark_mode()&& ams_icon_str=="extra_icon") { + ams_icon_str += "_dark"; + } m_am_img->SetBitmap(create_scaled_bitmap(ams_icon_str, nullptr, 126)); } @@ -336,6 +378,22 @@ void AMSSetting::update_switch_filament(bool selected) m_checkbox_switch_filament->SetValue(selected); } +void AMSSetting::update_air_printing_detection(bool selected) +{ + if (false/*obj->is_support_air_print_detection*/) { + m_checkbox_air_print->Show(); + m_title_air_print->Show(); + m_tip_air_print_line->Show(); + } + else { + m_checkbox_air_print->Hide(); + m_title_air_print->Hide(); + m_tip_air_print_line->Hide(); + } + Layout(); + m_checkbox_air_print->SetValue(selected); +} + void AMSSetting::on_select_ok(wxMouseEvent &event) { @@ -415,6 +473,13 @@ void AMSSetting::on_switch_filament(wxCommandEvent& event) event.Skip(); } +void AMSSetting::on_air_print_detect(wxCommandEvent& event) +{ + bool air_print_detect = m_checkbox_air_print->GetValue(); + obj->command_ams_air_print_detect(air_print_detect); + event.Skip(); +} + wxString AMSSetting::append_title(wxString text) { wxString lab; diff --git a/src/slic3r/GUI/AMSSetting.hpp b/src/slic3r/GUI/AMSSetting.hpp index f87479f034..464afffe7b 100644 --- a/src/slic3r/GUI/AMSSetting.hpp +++ b/src/slic3r/GUI/AMSSetting.hpp @@ -33,11 +33,13 @@ public: void update_starting_read_mode(bool selected); void update_remain_mode(bool selected); void update_switch_filament(bool selected); + void update_air_printing_detection(bool selected); void on_select_ok(wxMouseEvent& event); void on_insert_material_read(wxCommandEvent &event); void on_starting_read(wxCommandEvent &event); void on_remain(wxCommandEvent& event); void on_switch_filament(wxCommandEvent& event); + void on_air_print_detect(wxCommandEvent& event); wxString append_title(wxString text); wxStaticText *append_text(wxString text); MachineObject *obj{nullptr}; @@ -70,6 +72,10 @@ protected: wxStaticText* m_title_switch_filament; Label* m_tip_switch_filament_line1; + CheckBox* m_checkbox_air_print; + wxStaticText* m_title_air_print; + Label* m_tip_air_print_line; + wxStaticText *m_tip_ams_img; Button * m_button_auto_demarcate; diff --git a/src/slic3r/GUI/AmsMappingPopup.cpp b/src/slic3r/GUI/AmsMappingPopup.cpp index f1308efec5..492926b952 100644 --- a/src/slic3r/GUI/AmsMappingPopup.cpp +++ b/src/slic3r/GUI/AmsMappingPopup.cpp @@ -412,6 +412,48 @@ void AmsMapingPopup::on_left_down(wxMouseEvent &evt) } } +void AmsMapingPopup::update_ams_data_multi_machines() +{ + m_has_unmatch_filament = false; + for (auto& ams_container : m_amsmapping_container_list) { + ams_container->Hide(); + } + + for (wxWindow* mitem : m_mapping_item_list) { + mitem->Destroy(); + mitem = nullptr; + } + m_mapping_item_list.clear(); + + if (m_amsmapping_container_sizer_list.size() > 0) { + for (wxBoxSizer* siz : m_amsmapping_container_sizer_list) { + siz->Clear(true); + } + } + + int m_amsmapping_container_list_index = 0; + std::vector tray_datas; + + for (int i = 0; i < 4; ++i) { + TrayData td; + td.id = i; + td.type = EMPTY; + td.colour = wxColour(166, 169, 170); + td.name = ""; + td.filament_type = ""; + td.ctype = 0; + tray_datas.push_back(td); + } + + m_amsmapping_container_list[m_amsmapping_container_list_index]->Show(); + add_ams_mapping(tray_datas, m_amsmapping_container_list[m_amsmapping_container_list_index], m_amsmapping_container_sizer_list[m_amsmapping_container_list_index]); + + m_warning_text->Show(m_has_unmatch_filament); + + Layout(); + Fit(); +} + void AmsMapingPopup::update_ams_data(std::map amsList) { m_has_unmatch_filament = false; diff --git a/src/slic3r/GUI/AmsMappingPopup.hpp b/src/slic3r/GUI/AmsMappingPopup.hpp index e8e78b2578..75f274ba0b 100644 --- a/src/slic3r/GUI/AmsMappingPopup.hpp +++ b/src/slic3r/GUI/AmsMappingPopup.hpp @@ -157,6 +157,7 @@ public: void update_materials_list(std::vector list); void set_tag_texture(std::string texture); void update_ams_data(std::map amsList); + void update_ams_data_multi_machines(); void add_ams_mapping(std::vector tray_data, wxWindow* container, wxBoxSizer* sizer); void set_current_filament_id(int id){m_current_filament_id = id;}; int get_current_filament_id(){return m_current_filament_id;}; diff --git a/src/slic3r/GUI/BindDialog.cpp b/src/slic3r/GUI/BindDialog.cpp index df52d84b14..134d91e7c5 100644 --- a/src/slic3r/GUI/BindDialog.cpp +++ b/src/slic3r/GUI/BindDialog.cpp @@ -54,6 +54,300 @@ wxString get_fail_reason(int code) return _L("Unknown Failure"); } +PingCodeBindDialog::PingCodeBindDialog(Plater* plater /*= nullptr*/) + : DPIDialog(static_cast(wxGetApp().mainframe), wxID_ANY, _L("Bind with Pin Code"), wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX) +{ +#ifdef __WINDOWS__ + SetDoubleBuffered(true); +#endif //__WINDOWS__ + wxBoxSizer* sizer_main = new wxBoxSizer(wxVERTICAL); + + + std::string icon_path = (boost::format("%1%/images/OrcaSlicerTitle.ico") % resources_dir()).str(); + SetIcon(wxIcon(encode_path(icon_path.c_str()), wxBITMAP_TYPE_ICO)); + + SetBackgroundColour(*wxWHITE); + wxBoxSizer* m_sizer_main = new wxBoxSizer(wxVERTICAL); + auto m_line_top = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 1), wxTAB_TRAVERSAL); + m_line_top->SetBackgroundColour(wxColour(166, 169, 170)); + + + m_simplebook = new wxSimplebook(this); + m_simplebook->SetSize(wxSize(FromDIP(460), FromDIP(240))); + m_simplebook->SetMinSize(wxSize(FromDIP(460), FromDIP(240))); + m_simplebook->SetMaxSize(wxSize(FromDIP(460), FromDIP(240))); + + + request_bind_panel = new wxPanel(m_simplebook); + binding_panel = new wxPanel(m_simplebook); + + request_bind_panel->SetSize(wxSize(FromDIP(460), FromDIP(240))); + request_bind_panel->SetMinSize(wxSize(FromDIP(460), FromDIP(240))); + request_bind_panel->SetMaxSize(wxSize(FromDIP(460), FromDIP(240))); + + binding_panel->SetSize(wxSize(FromDIP(460), FromDIP(240))); + binding_panel->SetMinSize(wxSize(FromDIP(460), FromDIP(240))); + binding_panel->SetMaxSize(wxSize(FromDIP(460), FromDIP(240))); + + + request_bind_panel->SetBackgroundColour(*wxWHITE); + binding_panel->SetBackgroundColour(*wxWHITE); + + m_status_text = new Label(request_bind_panel, _L("Please Find the Pin Code in Account page on printer screen,\n and type in the Pin Code below.")); + m_status_text->SetBackgroundColour(*wxWHITE); + m_status_text->SetFont(Label::Body_14); + m_status_text->SetMaxSize(wxSize(FromDIP(440), -1)); + m_status_text->Wrap(FromDIP(440)); + m_status_text->SetForegroundColour(wxColour(38, 46, 48)); + + m_link_show_ping_code_wiki = new wxStaticText(request_bind_panel, wxID_ANY, _L("Can't find Pin Code?")); + m_link_show_ping_code_wiki->SetFont(Label::Body_14); + m_link_show_ping_code_wiki->SetBackgroundColour(*wxWHITE); + m_link_show_ping_code_wiki->SetForegroundColour(wxColour(31, 142, 234)); + + m_link_show_ping_code_wiki->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_HAND); }); + m_link_show_ping_code_wiki->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_ARROW); }); + + m_link_show_ping_code_wiki->Bind(wxEVT_LEFT_DOWN, [this](auto& e) { + m_ping_code_wiki = "https://wiki.bambulab.com/en/bambu-studio/manual/pin-code"; + wxLaunchDefaultBrowser(m_ping_code_wiki); + }); + + m_text_input_title = new wxStaticText(request_bind_panel, wxID_ANY, _L("Pin Code")); + m_text_input_title->SetFont(Label::Body_14); + m_text_input_title->SetBackgroundColour(*wxWHITE); + + wxBoxSizer* ping_code_input = new wxBoxSizer(wxHORIZONTAL); + + + for (int i = 0; i < PING_CODE_LENGTH; i++) { + m_text_input_single_code[i] = new TextInput(request_bind_panel, wxEmptyString, "", "", wxDefaultPosition, wxSize(FromDIP(38), FromDIP(38)), wxTE_PROCESS_ENTER | wxTE_CENTER); + wxTextAttr textAttr; + textAttr.SetAlignment(wxTEXT_ALIGNMENT_CENTER); + textAttr.SetTextColour(wxColour(34, 139, 34)); + m_text_input_single_code[i]->GetTextCtrl()->SetDefaultStyle(textAttr); + m_text_input_single_code[i]->SetFont(Label::Body_16); + m_text_input_single_code[i]->GetTextCtrl()->SetMaxLength(1); + m_text_input_single_code[i]->GetTextCtrl()->Bind(wxEVT_TEXT, &PingCodeBindDialog::on_text_changed, this); + m_text_input_single_code[i]->GetTextCtrl()->Bind(wxEVT_KEY_DOWN, &PingCodeBindDialog::on_key_backspace, this); + m_text_input_single_code[i]->GetTextCtrl()->Bind(wxEVT_CHAR, &PingCodeBindDialog::on_key_input, this); + ping_code_input->Add(m_text_input_single_code[i], 0, wxALL, FromDIP(5)); + } + + wxBoxSizer* m_sizer_button = new wxBoxSizer(wxHORIZONTAL); + m_sizer_button->Add(0, 0, 1, wxEXPAND, 5); + m_button_bind = new Button(request_bind_panel, _L("Confirm")); + + StateColor btn_bg_green(std::pair(wxColour(206, 206, 206), StateColor::Disabled), + std::pair(wxColour(0, 137, 123), StateColor::Pressed), + std::pair(wxColour(38, 166, 154), StateColor::Hovered), + std::pair(wxColour(0, 150, 136), StateColor::Normal)); + m_button_bind->SetBackgroundColor(btn_bg_green); + m_button_bind->SetBorderColor(*wxWHITE); + m_button_bind->SetTextColor(wxColour("#FFFFFE")); + m_button_bind->SetSize(BIND_DIALOG_BUTTON_SIZE); + m_button_bind->SetMinSize(BIND_DIALOG_BUTTON_SIZE); + m_button_bind->SetCornerRadius(FromDIP(12)); + m_button_bind->Enable(false); + + StateColor btn_bg_white(std::pair(wxColour(206, 206, 206), StateColor::Hovered), + std::pair(*wxWHITE, StateColor::Normal)); + + m_button_cancel = new Button(request_bind_panel, _L("Cancel")); + m_button_cancel->SetBackgroundColor(btn_bg_white); + m_button_cancel->SetBorderColor(BIND_DIALOG_GREY900); + m_button_cancel->SetSize(BIND_DIALOG_BUTTON_SIZE); + m_button_cancel->SetMinSize(BIND_DIALOG_BUTTON_SIZE); + m_button_cancel->SetTextColor(BIND_DIALOG_GREY900); + m_button_cancel->SetCornerRadius(FromDIP(12)); + + m_sizer_button->Add(m_button_bind, 0, wxALIGN_CENTER, 0); + m_sizer_button->Add(0, 0, 0, wxLEFT, FromDIP(13)); + m_sizer_button->Add(m_button_cancel, 0, wxALIGN_CENTER, 0); + + + + m_simplebook->AddPage(request_bind_panel, wxEmptyString, true); + m_simplebook->AddPage(binding_panel, wxEmptyString, false); + + + auto sizer_request = new wxBoxSizer(wxVERTICAL); + sizer_request->Add(0, 0, 0, wxTOP, FromDIP(10)); + sizer_request->Add(m_status_text, 0, wxLEFT, FromDIP(13)); + sizer_request->Add(0, 0, 0, wxTOP, FromDIP(10)); + sizer_request->Add(m_link_show_ping_code_wiki, 0, wxLEFT, FromDIP(13)); + sizer_request->Add(0, 0, 0, wxTOP, FromDIP(15)); + sizer_request->Add(m_text_input_title, 0, wxLEFT, FromDIP(13)); + sizer_request->Add(0, 0, 0, wxTOP, FromDIP(5)); + sizer_request->Add(ping_code_input, 0, wxLEFT, FromDIP(10)); + sizer_request->Add(0, 0, 0, wxTOP, FromDIP(10)); + sizer_request->Add(m_sizer_button, 0, wxALIGN_RIGHT | wxRIGHT | wxBOTTOM, FromDIP(15)); + request_bind_panel->SetSizer(sizer_request); + request_bind_panel->Layout(); + request_bind_panel->Fit(); + + + + auto m_loading_txt = new Label(binding_panel, _L("Binding...")); + m_loading_txt->SetBackgroundColour(*wxWHITE); + m_loading_txt->SetFont(Label::Head_16); + auto m_loading_tip_txt = new Label(binding_panel, _L("Please confirm on the printer screen")); + m_loading_tip_txt->SetBackgroundColour(*wxWHITE); + m_loading_tip_txt->SetFont(Label::Body_15); + + wxBoxSizer* m_sizer_binding_button = new wxBoxSizer(wxHORIZONTAL); + m_sizer_binding_button->Add(0, 0, 1, wxEXPAND, 5); + + m_button_close = new Button(binding_panel, _L("Close")); + m_button_close->SetBackgroundColor(btn_bg_white); + m_button_close->SetBorderColor(BIND_DIALOG_GREY900); + m_button_close->SetSize(BIND_DIALOG_BUTTON_SIZE); + m_button_close->SetMinSize(BIND_DIALOG_BUTTON_SIZE); + m_button_close->SetTextColor(BIND_DIALOG_GREY900); + m_button_close->SetCornerRadius(FromDIP(12)); + m_sizer_binding_button->Add(m_button_close, 0, wxALIGN_CENTER, 0); + + auto sizer_binding = new wxBoxSizer(wxVERTICAL); + sizer_binding->Add(0, 0, 0, wxTOP, FromDIP(80)); + sizer_binding->Add(m_loading_txt, 0, wxALIGN_CENTER, 0); + sizer_binding->Add(0, 0, 0, wxTOP, FromDIP(10)); + sizer_binding->Add(m_loading_tip_txt, 0, wxALIGN_CENTER, 0); + sizer_binding->Add(0, 0, 0, wxTOP, FromDIP(30)); + sizer_binding->Add(m_sizer_binding_button, 0, wxALIGN_RIGHT | wxRIGHT, FromDIP(20)); + binding_panel->SetSizer(sizer_binding); + binding_panel->Layout(); + binding_panel->Fit(); + + + + sizer_main->Add(m_line_top, 0, wxEXPAND, 0); + sizer_main->Add(m_simplebook, 0, wxEXPAND, 0); + + + + SetSizer(sizer_main); + Layout(); + Fit(); + + m_button_bind->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PingCodeBindDialog::on_bind_printer), NULL, this); + m_button_cancel->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PingCodeBindDialog::on_cancel), NULL, this); + m_button_close->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PingCodeBindDialog::on_cancel), NULL, this); + + m_simplebook->SetSelection(0); +} + +void PingCodeBindDialog::on_key_input(wxKeyEvent& evt) +{ + int keyCode = evt.GetKeyCode(); + + if (keyCode == WXK_BACK || (keyCode >= '0' && keyCode <= '9') || (keyCode >= 'a' && keyCode <= 'z') || (keyCode >= 'A' && keyCode <= 'Z')) + { + evt.Skip(); + } + else + { + wxBell(); + return; + } +} + +void PingCodeBindDialog::on_text_changed(wxCommandEvent& event) { + //switch focus to the text text input + wxTextCtrl* text_input = static_cast(event.GetEventObject()); + int idx = -1; + for (int i = 0; i < PING_CODE_LENGTH; i++) { + if (text_input == m_text_input_single_code[i]->GetTextCtrl()) { + idx = i; + break; + } + } + + if (idx != -1 && text_input->GetValue().Length() == 1) { + if (idx < PING_CODE_LENGTH-1) { + m_text_input_single_code[idx + 1]->SetFocus(); + } + + auto has_empty = false; + for (int i = 0; i < PING_CODE_LENGTH; i++) { + if (m_text_input_single_code[i]->GetTextCtrl()->GetValue().ToStdString().empty()) { + has_empty = true; + } + } + + if (has_empty) { + m_button_bind->Enable(false); + } + else { + m_button_bind->Enable(true); + } + + /*if (idx == PING_CODE_LENGTH - 1) { + m_button_bind->Enable(true); + }*/ + } + +} + +void PingCodeBindDialog::on_key_backspace(wxKeyEvent& event) +{ + wxTextCtrl* text_input = static_cast(event.GetEventObject()); + int idx = -1; + for (int i = 0; i < 6; i++) { + if (text_input == m_text_input_single_code[i]->GetTextCtrl()) { + idx = i; + break; + } + } + + if (event.GetKeyCode() == WXK_BACK && idx >= 0) { + CallAfter([this, idx]() { + m_text_input_single_code[idx - 1]->SetFocus(); + m_button_bind->Enable(false); + }); + } + event.Skip(); +} + +void PingCodeBindDialog::on_bind_printer(wxCommandEvent& event) +{ + wxString ping_code; + + for (int i = 0; i < PING_CODE_LENGTH; i++) { + ping_code += m_text_input_single_code[i]->GetTextCtrl()->GetValue().ToStdString(); + } + + NetworkAgent* agent = wxGetApp().getAgent(); + if (agent && agent->is_user_login() && ping_code.length() == PING_CODE_LENGTH) { + auto result = agent->ping_bind(ping_code.ToStdString()); + + if(result < 0){ + MessageDialog msg_wingow(nullptr, _L("Log in failed. Please check the Pin Code."), "", wxAPPLY | wxOK); + msg_wingow.ShowModal(); + return; + } + m_simplebook->SetSelection(1); + } +} + +void PingCodeBindDialog::on_cancel(wxCommandEvent& event) +{ + EndModal(wxCLOSE); +} + +void PingCodeBindDialog::on_dpi_changed(const wxRect& suggested_rect) +{ + + Fit(); + Refresh(); +} + + +PingCodeBindDialog::~PingCodeBindDialog() { + m_button_bind->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PingCodeBindDialog::on_bind_printer), NULL, this); + m_button_cancel->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PingCodeBindDialog::on_cancel), NULL, this); + m_button_close->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PingCodeBindDialog::on_cancel), NULL, this); +} + BindMachineDialog::BindMachineDialog(Plater *plater /*= nullptr*/) : DPIDialog(static_cast(wxGetApp().mainframe), wxID_ANY, _L("Log in printer"), wxDefaultPosition, wxDefaultSize, wxCAPTION) { diff --git a/src/slic3r/GUI/BindDialog.hpp b/src/slic3r/GUI/BindDialog.hpp index 636d088112..a4ffd8fbff 100644 --- a/src/slic3r/GUI/BindDialog.hpp +++ b/src/slic3r/GUI/BindDialog.hpp @@ -19,7 +19,6 @@ #include #include #include "wxExtensions.hpp" -#include "Plater.hpp" #include "Widgets/StepCtrl.hpp" #include "Widgets/ProgressDialog.hpp" #include "Widgets/Button.hpp" @@ -29,15 +28,21 @@ #include "BBLStatusBar.hpp" #include "BBLStatusBarBind.hpp" #include "Jobs/Worker.hpp" +#include "GUI_Utils.hpp" +#include "Widgets/TextInput.hpp" +#include "Jobs/PrintJob.hpp" +#include "Jobs/SendJob.hpp" +#include "DeviceManager.hpp" #define BIND_DIALOG_GREY200 wxColour(248, 248, 248) #define BIND_DIALOG_GREY800 wxColour(50, 58, 61) #define BIND_DIALOG_GREY900 wxColour(38, 46, 48) #define BIND_DIALOG_BUTTON_SIZE wxSize(FromDIP(68), FromDIP(24)) #define BIND_DIALOG_BUTTON_PANEL_SIZE wxSize(FromDIP(450), FromDIP(30)) +#define PING_CODE_LENGTH 6 namespace Slic3r { namespace GUI { - +class Plater; struct MemoryStruct { char * memory; @@ -45,6 +50,47 @@ struct MemoryStruct size_t size; }; +class PingCodeBindDialog : public DPIDialog +{ +private: + + Label* m_status_text; + wxStaticText* m_text_input_title; + wxStaticText* m_link_show_ping_code_wiki; + TextInput* m_text_input_single_code[PING_CODE_LENGTH]; + Button* m_button_bind; + Button* m_button_cancel; + Button* m_button_close; + wxSimplebook* m_simplebook; + wxPanel* request_bind_panel; + wxPanel* binding_panel; + + wxScrolledWindow* m_sw_bind_failed_info; + Label* m_bind_failed_info; + Label* m_st_txt_error_code{ nullptr }; + Label* m_st_txt_error_desc{ nullptr }; + Label* m_st_txt_extra_info{ nullptr }; + wxHyperlinkCtrl* m_link_network_state{ nullptr }; + wxString m_result_info; + wxString m_result_extra; + wxString m_ping_code_wiki; + bool m_show_error_info_state = true; + + int m_result_code; + std::shared_ptr m_status_bar; + +public: + PingCodeBindDialog(Plater* plater = nullptr); + ~PingCodeBindDialog(); + + void on_key_input(wxKeyEvent& evt); + void on_text_changed(wxCommandEvent& event); + void on_key_backspace(wxKeyEvent& event); + void on_cancel(wxCommandEvent& event); + void on_bind_printer(wxCommandEvent& event); + void on_dpi_changed(const wxRect& suggested_rect) override; +}; + class BindMachineDialog : public DPIDialog { private: diff --git a/src/slic3r/GUI/BitmapCache.cpp b/src/slic3r/GUI/BitmapCache.cpp index d5facd3f3f..d382f657e3 100644 --- a/src/slic3r/GUI/BitmapCache.cpp +++ b/src/slic3r/GUI/BitmapCache.cpp @@ -323,7 +323,7 @@ wxBitmap* BitmapCache::load_svg(const std::string &bitmap_name, unsigned target_ // map of color replaces std::map replaces; -replaces["\"#0x00AE42\""] = "\"#009688\""; + replaces["\"#0x00AE42\""] = "\"#009688\""; replaces["\"#00FF00\""] = "\"#52c7b8\""; if (dark_mode) { replaces["\"#262E30\""] = "\"#EFEFF0\""; @@ -334,7 +334,7 @@ replaces["\"#0x00AE42\""] = "\"#009688\""; replaces["\"#6B6B6B\""] = "\"#818182\""; replaces["\"#909090\""] = "\"#FFFFFF\""; replaces["\"#00FF00\""] = "\"#FF0000\""; -replaces["\"#009688\""] = "\"#00675b\""; + replaces["\"#009688\""] = "\"#00675b\""; } //if (!new_color.empty()) // replaces["\"#ED6B21\""] = "\"" + new_color + "\""; diff --git a/src/slic3r/GUI/CaliHistoryDialog.cpp b/src/slic3r/GUI/CaliHistoryDialog.cpp index ec3d76ecb9..e47c5bd2da 100644 --- a/src/slic3r/GUI/CaliHistoryDialog.cpp +++ b/src/slic3r/GUI/CaliHistoryDialog.cpp @@ -55,9 +55,10 @@ static wxString get_preset_name_by_filament_id(std::string filament_id) return preset_name; } -HistoryWindow::HistoryWindow(wxWindow* parent, const std::vector& calib_results_history) +HistoryWindow::HistoryWindow(wxWindow* parent, const std::vector& calib_results_history, bool& show) : DPIDialog(parent, wxID_ANY, _L("Flow Dynamics Calibration Result"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE) , m_calib_results_history(calib_results_history) + , m_show_history_dialog(show) { this->SetBackgroundColour(*wxWHITE); auto main_sizer = new wxBoxSizer(wxVERTICAL); @@ -73,11 +74,11 @@ HistoryWindow::HistoryWindow(wxWindow* parent, const std::vector& scroll_window->SetSizer(scroll_sizer); Button * mew_btn = new Button(scroll_window, _L("New")); - StateColor btn_bg_green(std::pair(wxColour(27, 136, 68), StateColor::Pressed), std::pair(wxColour(61, 203, 115), StateColor::Hovered), - std::pair(wxColour(0, 174, 66), StateColor::Normal)); + StateColor btn_bg_green(std::pair(wxColour(0, 137, 123), StateColor::Pressed), std::pair(wxColour(38, 166, 154), StateColor::Hovered), + std::pair(wxColour(0, 150, 136), StateColor::Normal)); mew_btn->SetBackgroundColour(*wxWHITE); mew_btn->SetBackgroundColor(btn_bg_green); - mew_btn->SetBorderColor(wxColour(0, 174, 66)); + mew_btn->SetBorderColor(wxColour(0, 150, 136)); mew_btn->SetTextColor(wxColour("#FFFFFE")); mew_btn->SetMinSize(wxSize(FromDIP(100), FromDIP(24))); mew_btn->SetMaxSize(wxSize(FromDIP(100), FromDIP(24))); @@ -138,11 +139,14 @@ HistoryWindow::HistoryWindow(wxWindow* parent, const std::vector& m_refresh_timer->SetOwner(this); m_refresh_timer->Start(200); Bind(wxEVT_TIMER, &HistoryWindow::on_timer, this); + + m_show_history_dialog = true; } HistoryWindow::~HistoryWindow() { m_refresh_timer->Stop(); + m_show_history_dialog = false; } void HistoryWindow::sync_history_result(MachineObject* obj) @@ -364,6 +368,12 @@ float HistoryWindow::get_nozzle_value() void HistoryWindow::on_click_new_button(wxCommandEvent& event) { + if (curr_obj && curr_obj->get_printer_series() == PrinterSeries::SERIES_P1P && m_calib_results_history.size() >= 16) { + MessageDialog msg_dlg(nullptr, wxString::Format(_L("This machine type can only hold %d history results per nozzle."), 16), wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + return; + } + NewCalibrationHistoryDialog dlg(this, m_calib_results_history); dlg.ShowModal(); } @@ -560,7 +570,7 @@ wxArrayString NewCalibrationHistoryDialog::get_all_filaments(const MachineObject } NewCalibrationHistoryDialog::NewCalibrationHistoryDialog(wxWindow *parent, const std::vector history_results) - : DPIDialog(parent, wxID_ANY, _L("New Flow Dynamics Calibration"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE) + : DPIDialog(parent, wxID_ANY, _L("New Flow Dynamic Calibration"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE) , m_history_results(history_results) { Slic3r::DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager(); @@ -570,6 +580,8 @@ NewCalibrationHistoryDialog::NewCalibrationHistoryDialog(wxWindow *parent, const if (!obj) return; + curr_obj = obj; + this->SetBackgroundColour(*wxWHITE); auto main_sizer = new wxBoxSizer(wxVERTICAL); @@ -628,11 +640,11 @@ NewCalibrationHistoryDialog::NewCalibrationHistoryDialog(wxWindow *parent, const auto btn_sizer = new wxBoxSizer(wxHORIZONTAL); Button * ok_btn = new Button(top_panel, _L("Ok")); - StateColor btn_bg_green(std::pair(wxColour(27, 136, 68), StateColor::Pressed), std::pair(wxColour(61, 203, 115), StateColor::Hovered), - std::pair(wxColour(0, 174, 66), StateColor::Normal)); + StateColor btn_bg_green(std::pair(wxColour(0, 137, 123), StateColor::Pressed), std::pair(wxColour(38, 166, 154), StateColor::Hovered), + std::pair(wxColour(0, 150, 136), StateColor::Normal)); ok_btn->SetBackgroundColour(*wxWHITE); ok_btn->SetBackgroundColor(btn_bg_green); - ok_btn->SetBorderColor(wxColour(0, 174, 66)); + ok_btn->SetBorderColor(wxColour(0, 150, 136)); ok_btn->SetTextColor(wxColour("#FFFFFE")); ok_btn->SetMinSize(wxSize(-1, FromDIP(24))); ok_btn->SetCornerRadius(FromDIP(12)); @@ -699,26 +711,18 @@ void NewCalibrationHistoryDialog::on_ok(wxCommandEvent &event) // Check for duplicate names from history { - struct PACalibResult - { - size_t operator()(const std::pair &item) const - { - return std::hash()(item.first) * std::hash()(item.second); - } - }; - std::unordered_set, PACalibResult> set; - set.insert({m_new_result.name, m_new_result.filament_id}); + auto iter = std::find_if(m_history_results.begin(), m_history_results.end(), [this](const PACalibResult &item) { + return item.name == m_new_result.name && item.filament_id == m_new_result.filament_id; + }); - for (auto &result : m_history_results) { - if (!set.insert({result.name, result.filament_id}).second) { - MessageDialog msg_dlg(nullptr, - wxString::Format(_L("There is already a historical calibration result with the same name: %s. Only one of the results with the same name " - "is saved. Are you sure you want to override the historical result?"), - result.name), - wxEmptyString, wxICON_WARNING | wxYES_NO); - if (msg_dlg.ShowModal() != wxID_YES) - return; - } + if (iter != m_history_results.end()) { + MessageDialog msg_dlg(nullptr, + wxString::Format(_L("There is already a historical calibration result with the same name: %s. Only one of the results with the same name " + "is saved. Are you sure you want to override the historical result?"), + m_new_result.name), + wxEmptyString, wxICON_WARNING | wxYES_NO); + if (msg_dlg.ShowModal() != wxID_YES) + return; } } diff --git a/src/slic3r/GUI/CaliHistoryDialog.hpp b/src/slic3r/GUI/CaliHistoryDialog.hpp index 94b3a874aa..8f7b49a25a 100644 --- a/src/slic3r/GUI/CaliHistoryDialog.hpp +++ b/src/slic3r/GUI/CaliHistoryDialog.hpp @@ -11,7 +11,7 @@ namespace GUI { class HistoryWindow : public DPIDialog { public: - HistoryWindow(wxWindow* parent, const std::vector& calib_results_history); + HistoryWindow(wxWindow* parent, const std::vector& calib_results_history, bool& show); ~HistoryWindow(); void on_dpi_changed(const wxRect& suggested_rect) {} void on_select_nozzle(wxCommandEvent& evt); @@ -33,6 +33,7 @@ protected: wxTimer* m_refresh_timer { nullptr }; + bool& m_show_history_dialog; std::vector m_calib_results_history; MachineObject* curr_obj { nullptr }; int history_version = -1; @@ -74,6 +75,7 @@ protected: protected: PACalibResult m_new_result; std::vector m_history_results; + MachineObject * curr_obj; TextInput *m_name_value{nullptr}; TextInput *m_k_value{nullptr}; diff --git a/src/slic3r/GUI/CalibrationWizard.cpp b/src/slic3r/GUI/CalibrationWizard.cpp index cbeabeb3cd..713b3833f3 100644 --- a/src/slic3r/GUI/CalibrationWizard.cpp +++ b/src/slic3r/GUI/CalibrationWizard.cpp @@ -18,6 +18,7 @@ static const wxString NA_STR = _L("N/A"); static const float MIN_PA_K_VALUE = 0.0; static const float MAX_PA_K_VALUE = 0.3; static const float MIN_PA_K_VALUE_STEP = 0.001; +static const int MAX_PA_HISTORY_RESULTS_NUMS = 16; std::map get_cached_selected_filament(MachineObject* obj) { std::map selected_filament_map; @@ -429,7 +430,7 @@ void PressureAdvanceWizard::on_cali_action(wxCommandEvent& evt) { CaliPageActionType action = static_cast(evt.GetInt()); if (action == CaliPageActionType::CALI_ACTION_MANAGE_RESULT) { - HistoryWindow history_dialog(this, m_calib_results_history); + HistoryWindow history_dialog(this, m_calib_results_history, m_show_result_dialog); history_dialog.on_device_connected(curr_obj); history_dialog.ShowModal(); } @@ -467,7 +468,17 @@ void PressureAdvanceWizard::on_cali_action(wxCommandEvent& evt) void PressureAdvanceWizard::update(MachineObject* obj) { + if (!obj) + return; + CalibrationWizard::update(obj); + + if (!m_show_result_dialog) { + if (obj->cali_version != -1 && obj->cali_version != cali_version) { + cali_version = obj->cali_version; + CalibUtils::emit_get_PA_calib_info(obj->nozzle_diameter, ""); + } + } } void PressureAdvanceWizard::on_device_connected(MachineObject* obj) @@ -648,11 +659,21 @@ void PressureAdvanceWizard::on_cali_start() cali_page->set_pa_cali_image(int(pa_cali_method)); curr_obj->manual_pa_cali_method = pa_cali_method; - CalibUtils::calib_generic_PA(calib_info, wx_err_string); + if (curr_obj->pa_calib_tab.size() >= MAX_PA_HISTORY_RESULTS_NUMS) { + MessageDialog msg_dlg(nullptr, wxString::Format(_L("This machine type can only hold 16 history results per nozzle. " + "You can delete the existing historical results and then start calibration. " + "Or you can continue the calibration, but you cannot create new calibration historical results. \n" + "Do you still want to continue the calibration?"), MAX_PA_HISTORY_RESULTS_NUMS), wxEmptyString, wxICON_WARNING | wxYES | wxCANCEL); + if (msg_dlg.ShowModal() != wxID_YES) { + return; + } + } - if (!wx_err_string.empty()) { - MessageDialog msg_dlg(nullptr, wx_err_string, wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); + if (!CalibUtils::calib_generic_PA(calib_info, wx_err_string)) { + if (!wx_err_string.empty()) { + MessageDialog msg_dlg(nullptr, wx_err_string, wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + } return; } @@ -713,6 +734,30 @@ void PressureAdvanceWizard::on_cali_save() if (!save_page->get_manual_result(new_pa_cali_result)) { return; } + + + auto iter = std::find_if(curr_obj->pa_calib_tab.begin(), curr_obj->pa_calib_tab.end(), [&new_pa_cali_result](const PACalibResult &item) { + return item.name == new_pa_cali_result.name && item.filament_id == item.filament_id; + }); + + if (iter != curr_obj->pa_calib_tab.end()) { + MessageDialog + msg_dlg(nullptr, + wxString::Format(_L("There is already a historical calibration result with the same name: %s. Only one of the results with the same name " + "is saved. Are you sure you want to override the historical result?"), + new_pa_cali_result.name), + wxEmptyString, wxICON_WARNING | wxYES_NO); + if (msg_dlg.ShowModal() != wxID_YES) + return; + } + else if (curr_obj->pa_calib_tab.size() >= MAX_PA_HISTORY_RESULTS_NUMS) { + MessageDialog msg_dlg(nullptr, + wxString::Format(_L("This machine type can only hold %d history results per nozzle. This result will not be saved."), MAX_PA_HISTORY_RESULTS_NUMS), + wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + return; + } + CalibUtils::set_PA_calib_result({new_pa_cali_result}, false); } else { auto save_page = static_cast(save_step->page); @@ -1020,7 +1065,13 @@ void FlowRateWizard::on_cali_start(CaliPresetStage stage, float cali_value, Flow calib_info.filament_prest = temp_filament_preset; if (cali_stage > 0) { - CalibUtils::calib_flowrate(cali_stage, calib_info, wx_err_string); + if (!CalibUtils::calib_flowrate(cali_stage, calib_info, wx_err_string)) { + if (!wx_err_string.empty()) { + MessageDialog msg_dlg(nullptr, wx_err_string, wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + } + return; + } } else { wx_err_string = _L("Internal Error") + wxString(": Invalid calibration stage"); diff --git a/src/slic3r/GUI/CalibrationWizard.hpp b/src/slic3r/GUI/CalibrationWizard.hpp index 14cfd50a95..34550b4b7f 100644 --- a/src/slic3r/GUI/CalibrationWizard.hpp +++ b/src/slic3r/GUI/CalibrationWizard.hpp @@ -121,7 +121,9 @@ protected: void on_device_connected(MachineObject* obj) override; + bool m_show_result_dialog = false; std::vector m_calib_results_history; + int cali_version = -1; }; class FlowRateWizard : public CalibrationWizard { diff --git a/src/slic3r/GUI/CalibrationWizardCaliPage.cpp b/src/slic3r/GUI/CalibrationWizardCaliPage.cpp index d412146741..cd63eaf38a 100644 --- a/src/slic3r/GUI/CalibrationWizardCaliPage.cpp +++ b/src/slic3r/GUI/CalibrationWizardCaliPage.cpp @@ -382,7 +382,7 @@ void CalibrationCaliPage::update_subtask(MachineObject* obj) m_printing_panel->update_subtask_name(wxString::Format("%s", GUI::from_u8(obj->subtask_name))); if (obj->get_modeltask() && obj->get_modeltask()->design_id > 0) { - m_printing_panel->show_profile_info(true, wxString::FromUTF8(obj->get_modeltask()->profile_name)); + m_printing_panel->show_profile_info(wxString::FromUTF8(obj->get_modeltask()->profile_name)); } else { m_printing_panel->show_profile_info(false); @@ -502,4 +502,4 @@ float CalibrationCaliPage::get_selected_calibration_nozzle_dia(MachineObject* ob return 0.4; } -}} +}} \ No newline at end of file diff --git a/src/slic3r/GUI/CalibrationWizardPresetPage.cpp b/src/slic3r/GUI/CalibrationWizardPresetPage.cpp index e6941066c2..482ce61a12 100644 --- a/src/slic3r/GUI/CalibrationWizardPresetPage.cpp +++ b/src/slic3r/GUI/CalibrationWizardPresetPage.cpp @@ -1,3 +1,4 @@ +#include #include "CalibrationWizardPresetPage.hpp" #include "I18N.hpp" #include "Widgets/Label.hpp" @@ -312,7 +313,7 @@ void CaliPresetCustomRangePanel::create_panel(wxWindow* parent) m_title_texts[i]->Wrap(-1); m_title_texts[i]->SetFont(::Label::Body_14); item_sizer->Add(m_title_texts[i], 0, wxALL, 0); - m_value_inputs[i] = new TextInput(parent, wxEmptyString, _L("\u2103"), "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, 0); + m_value_inputs[i] = new TextInput(parent, wxEmptyString, wxString::FromUTF8("°C"), "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, 0); m_value_inputs[i]->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); m_value_inputs[i]->GetTextCtrl()->Bind(wxEVT_TEXT, [this, i](wxCommandEvent& event) { std::string number = m_value_inputs[i]->GetTextCtrl()->GetValue().ToStdString(); @@ -391,7 +392,7 @@ void CaliPresetTipsPanel::create_panel(wxWindow* parent) auto nozzle_temp_sizer = new wxBoxSizer(wxVERTICAL); auto nozzle_temp_text = new Label(parent, _L("Nozzle temperature")); nozzle_temp_text->SetFont(Label::Body_12); - m_nozzle_temp = new TextInput(parent, wxEmptyString, _L("\u2103"), "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, wxTE_READONLY); + m_nozzle_temp = new TextInput(parent, wxEmptyString, wxString::FromUTF8("°C"), "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, wxTE_READONLY); m_nozzle_temp->SetBorderWidth(0); nozzle_temp_sizer->Add(nozzle_temp_text, 0, wxALIGN_LEFT); nozzle_temp_sizer->Add(m_nozzle_temp, 0, wxEXPAND); @@ -406,7 +407,7 @@ void CaliPresetTipsPanel::create_panel(wxWindow* parent) auto bed_temp_text = new Label(parent, _L("Bed temperature")); bed_temp_text->SetFont(Label::Body_12); - m_bed_temp = new Label(parent, _L("- \u2103")); + m_bed_temp = new Label(parent, wxString::FromUTF8("- °C")); m_bed_temp->SetFont(Label::Body_12); bed_temp_sizer->Add(bed_temp_text, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(10)); bed_temp_sizer->Add(m_bed_temp, 0, wxALIGN_CENTER); @@ -414,7 +415,7 @@ void CaliPresetTipsPanel::create_panel(wxWindow* parent) auto max_flow_sizer = new wxBoxSizer(wxVERTICAL); auto max_flow_text = new Label(parent, _L("Max volumetric speed")); max_flow_text->SetFont(Label::Body_12); - m_max_volumetric_speed = new TextInput(parent, wxEmptyString, _L("mm\u00B3"), "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, wxTE_READONLY); + m_max_volumetric_speed = new TextInput(parent, wxEmptyString, wxString::FromUTF8("mm³"), "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, wxTE_READONLY); m_max_volumetric_speed->SetBorderWidth(0); max_flow_sizer->Add(max_flow_text, 0, wxALIGN_LEFT); max_flow_sizer->Add(m_max_volumetric_speed, 0, wxEXPAND); @@ -1204,7 +1205,7 @@ void CalibrationPresetPage::update_show_status() show_status(CaliPresetPageStatus::CaliPresetStatusInPrinting); return; } - else if (need_check_sdcard(obj_) && obj_->get_sdcard_state() == MachineObject::SdcardState::NO_SDCARD) { + else if (!obj_->is_support_print_without_sd && (obj_->get_sdcard_state() == MachineObject::SdcardState::NO_SDCARD)) { show_status(CaliPresetPageStatus::CaliPresetStatusNoSdcard); return; } @@ -1424,10 +1425,10 @@ void CalibrationPresetPage::set_cali_method(CalibrationMethod method) m_custom_range_panel->set_titles(titles); wxArrayString values; - values.push_back(_L("0")); - values.push_back(_L("0.5")); - values.push_back(_L("0.005")); - m_custom_range_panel->set_values(values); + values.push_back(wxString::Format(wxT("%.0f"), 0)); + values.push_back(wxString::Format(wxT("%.2f"), 0.05)); + values.push_back(wxString::Format(wxT("%.3f"), 0.005)); + m_custom_range_panel->set_values(values); m_custom_range_panel->set_unit(""); m_custom_range_panel->Show(); @@ -1479,7 +1480,7 @@ void CalibrationPresetPage::on_cali_cancel_job() { BOOST_LOG_TRIVIAL(info) << "CalibrationWizard::print_job: enter canceled"; if (CalibUtils::print_worker) { - BOOST_LOG_TRIVIAL(info) << "calibration_print_job: canceled"; + BOOST_LOG_TRIVIAL(info) << "calibration_print_job: canceled"; CalibUtils::print_worker->cancel_all(); CalibUtils::print_worker->wait_for_idle(); } @@ -1913,7 +1914,7 @@ MaxVolumetricSpeedPresetPage::MaxVolumetricSpeedPresetPage( titles.push_back(_L("Step")); m_custom_range_panel->set_titles(titles); - m_custom_range_panel->set_unit(_L("mm\u00B3/s")); + m_custom_range_panel->set_unit("mm³/s"); } } }} diff --git a/src/slic3r/GUI/Camera.hpp b/src/slic3r/GUI/Camera.hpp index 49a964b69e..328e8aa1a6 100644 --- a/src/slic3r/GUI/Camera.hpp +++ b/src/slic3r/GUI/Camera.hpp @@ -150,7 +150,7 @@ public: // returns true if the camera z axis (forward) is pointing in the negative direction of the world z axis bool is_looking_downward() const { return get_dir_forward().dot(Vec3d::UnitZ()) < 0.0; } - + bool is_looking_front() const { return abs(get_dir_up().dot(Vec3d::UnitZ())-1) < 0.001; } // forces camera right vector to be parallel to XY plane void recover_from_free_camera() { if (std::abs(get_dir_right()(2)) > EPSILON) diff --git a/src/slic3r/GUI/DeviceManager.cpp b/src/slic3r/GUI/DeviceManager.cpp index b9a6b758b6..9e3cb574b1 100644 --- a/src/slic3r/GUI/DeviceManager.cpp +++ b/src/slic3r/GUI/DeviceManager.cpp @@ -20,6 +20,8 @@ #include "fast_float/fast_float.h" #define CALI_DEBUG +#define MINUTE_30 1800000 //ms +#define TIME_OUT 5000 //ms namespace pt = boost::property_tree; @@ -335,15 +337,15 @@ wxString HMSItem::get_module_name(ModuleID module_id) switch (module_id) { case MODULE_MC: - return _L("MC"); + return "MC"; case MODULE_MAINBOARD: - return _L("MainBoard"); + return "MainBoard"; case MODULE_AMS: - return _L("AMS"); + return "AMS"; case MODULE_TH: - return _L("TH"); + return "TH"; case MODULE_XCAM: - return _L("XCam"); + return "XCam"; default: wxString text = _L("Unknown") + wxString::Format("0x%x", (unsigned)module_id); return text; @@ -452,7 +454,7 @@ void MachineObject::erase_user_access_code() AppConfig* config = GUI::wxGetApp().app_config; if (config) { GUI::wxGetApp().app_config->erase("user_access_code", dev_id); - GUI::wxGetApp().app_config->save(); + //GUI::wxGetApp().app_config->save(); } } @@ -1390,6 +1392,12 @@ void MachineObject::parse_status(int flag) if(!is_support_motor_noise_cali){ is_support_motor_noise_cali = ((flag >> 21) & 0x1) != 0; } + + is_support_nozzle_blob_detection = ((flag >> 25) & 0x1) != 0; + nozzle_blob_detection_enabled = ((flag >> 24) & 0x1) != 0; + + is_support_air_print_detection = ((flag >> 29) & 0x1) != 0; + ams_air_print_status = ((flag >> 28) & 0x1) != 0; if (!is_support_p1s_plus) { auto supported_plus = ((flag >> 27) & 0x1) != 0; @@ -1984,6 +1992,16 @@ int MachineObject::command_set_printing_option(bool auto_recovery) return this->publish_json(j.dump()); } +int MachineObject::command_nozzle_blob_detect(bool nozzle_blob_detect) +{ + json j; + j["print"]["command"] = "print_option"; + j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); + j["print"]["nozzle_blob_detect"] = nozzle_blob_detect; + nozzle_blob_detection_enabled = nozzle_blob_detect; + return this->publish_json(j.dump()); +} + int MachineObject::command_set_prompt_sound(bool prompt_sound){ json j; j["print"]["command"] = "print_option"; @@ -2016,6 +2034,19 @@ int MachineObject::command_ams_switch_filament(bool switch_filament) return this->publish_json(j.dump()); } +int MachineObject::command_ams_air_print_detect(bool air_print_detect) +{ + json j; + j["print"]["command"] = "print_option"; + j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); + j["print"]["air_print_detect"] = air_print_detect; + + ams_air_print_status = air_print_detect; + BOOST_LOG_TRIVIAL(trace) << "command_ams_air_print_detect:" << air_print_detect; + + return this->publish_json(j.dump()); +} + int MachineObject::command_axis_control(std::string axis, double unit, double input_val, int speed) { @@ -2214,6 +2245,7 @@ int MachineObject::command_start_flow_ratio_calibration(const X1CCalibInfos& cal j["print"]["tray_id"] = calib_data.calib_datas[0].tray_id; j["print"]["nozzle_diameter"] = to_string_nozzle_diameter(calib_data.calib_datas[0].nozzle_diameter); + std::string filament_ids; for (int i = 0; i < calib_data.calib_datas.size(); ++i) { j["print"]["filaments"][i]["tray_id"] = calib_data.calib_datas[i].tray_id; j["print"]["filaments"][i]["bed_temp"] = calib_data.calib_datas[i].bed_temp; @@ -2222,6 +2254,10 @@ int MachineObject::command_start_flow_ratio_calibration(const X1CCalibInfos& cal j["print"]["filaments"][i]["nozzle_temp"] = calib_data.calib_datas[i].nozzle_temp; j["print"]["filaments"][i]["def_flow_ratio"] = std::to_string(calib_data.calib_datas[i].flow_rate); j["print"]["filaments"][i]["max_volumetric_speed"] = std::to_string(calib_data.calib_datas[i].max_volumetric_speed); + + if (i > 0) + filament_ids += ","; + filament_ids += calib_data.calib_datas[i].filament_id; } BOOST_LOG_TRIVIAL(trace) << "flowrate_cali: " << j.dump(); @@ -2623,7 +2659,7 @@ static ENUM enum_index_of(char const *key, char const **enum_names, int enum_cou return defl; } -int MachineObject::parse_json(std::string payload) +int MachineObject::parse_json(std::string payload, bool key_field_only) { CNumericLocalesSetter locales_setter; @@ -2701,8 +2737,79 @@ int MachineObject::parse_json(std::string payload) } uint64_t t_utc = j.value("t_utc", 0ULL); - if (t_utc > 0) + if (t_utc > 0) { last_utc_time = std::chrono::system_clock::time_point(t_utc * 1ms); + std::chrono::system_clock::time_point now = std::chrono::system_clock::now(); + auto millisec_since_epoch = std::chrono::duration_cast(now.time_since_epoch()).count(); + auto delay = millisec_since_epoch - t_utc; //ms + + std::string message_type = is_lan_mode_printer() ? "Local Mqtt" : is_tunnel_mqtt ? "Tunnel Mqtt" : "Cloud Mqtt"; + if (!message_delay.empty()) { + const auto& [first_type, first_time_stamp, first_delay] = message_delay.front(); + const auto& [last_type, last_time_stap, last_delay] = message_delay.back(); + + BOOST_LOG_TRIVIAL(debug) << __FUNCTION__ << ", message delay, last time stamp: " << last_time_stap; + if (last_time_stap - first_time_stamp >= MINUTE_30) { + // record, excluding current data + int total = message_delay.size(); + int local_mqtt = 0; + int tunnel_mqtt = 0; + int cloud_mqtt = 0; + + int local_mqtt_timeout = 0; + int tunnel_mqtt_timeout = 0; + int cloud_mqtt_timeout = 0; + + for (const auto& [type, time_stamp, delay] : message_delay) { + if (type == "Local Mqtt") { + local_mqtt++; + if (delay >= TIME_OUT) { + local_mqtt_timeout++; + } + } + else if (type == "Tunnel Mqtt") { + tunnel_mqtt++; + if (delay >= TIME_OUT) { + tunnel_mqtt_timeout++; + } + } + else if (type == "Cloud Mqtt"){ + cloud_mqtt++; + if (delay >= TIME_OUT) { + cloud_mqtt_timeout++; + } + } + } + + BOOST_LOG_TRIVIAL(debug) << __FUNCTION__ << ", message delay, message total: " << total; + try { + if (m_agent) { + json j_message; + + // Convert timestamp to time + std::time_t t = time_t(last_time_stap / 1000); //s + std::tm* now_tm = std::localtime(&t); + char buffer[80]; + std::strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", now_tm); + + std::string time_str = std::string(buffer); + j_message["time"] = time_str; + j_message["total"] = total; + j_message["local_mqtt"] = std::to_string(local_mqtt_timeout) + "/" + std::to_string(local_mqtt); + j_message["tunnel_mqtt"] = std::to_string(tunnel_mqtt_timeout) + "/" + std::to_string(tunnel_mqtt); + j_message["cloud_mqtt"] = std::to_string(cloud_mqtt_timeout) + "/" + std::to_string(cloud_mqtt); + + m_agent->track_event("message_delay", j_message.dump()); + } + } + catch (...) {} + + message_delay.clear(); + message_delay.shrink_to_fit(); + } + } + message_delay.push_back(std::make_tuple(message_type, t_utc, delay)); + } else last_utc_time = last_update_time; @@ -2778,179 +2885,181 @@ int MachineObject::parse_json(std::string payload) } } + if (key_field_only) { + if (!DeviceManager::EnableMultiMachine) { + if (jj.contains("support_tunnel_mqtt")) { + if (jj["support_tunnel_mqtt"].is_boolean()) { + is_support_tunnel_mqtt = jj["support_tunnel_mqtt"].get(); + } + } + } + } else { + //supported function + if (jj.contains("support_chamber_temp_edit")) { + if (jj["support_chamber_temp_edit"].is_boolean()) { + is_support_chamber_edit = jj["support_chamber_temp_edit"].get(); + } + } - //supported function - if (jj.contains("support_chamber_temp_edit")) { - if (jj["support_chamber_temp_edit"].is_boolean()) { - is_support_chamber_edit = jj["support_chamber_temp_edit"].get(); + if (jj.contains("support_extrusion_cali")) { + if (jj["support_extrusion_cali"].is_boolean()) { + is_support_extrusion_cali = jj["support_extrusion_cali"].get(); + } } - } - if (jj.contains("support_extrusion_cali")) { - if (jj["support_extrusion_cali"].is_boolean()) { - is_support_extrusion_cali = jj["support_extrusion_cali"].get(); + if (jj.contains("support_first_layer_inspect")) { + if (jj["support_first_layer_inspect"].is_boolean()) { + is_support_first_layer_inspect = jj["support_first_layer_inspect"].get(); + } } - } - if (jj.contains("support_first_layer_inspect")) { - if (jj["support_first_layer_inspect"].is_boolean()) { - is_support_first_layer_inspect = jj["support_first_layer_inspect"].get(); + if (jj.contains("support_ai_monitoring")) { + if (jj["support_ai_monitoring"].is_boolean()) { + is_support_ai_monitoring = jj["support_ai_monitoring"].get(); + } } - } - - if (jj.contains("support_ai_monitoring")) { - if (jj["support_ai_monitoring"].is_boolean()) { - is_support_ai_monitoring = jj["support_ai_monitoring"].get(); - } - } - if (jj.contains("support_lidar_calibration")) { - if (jj["support_lidar_calibration"].is_boolean()) { - is_support_lidar_calibration = jj["support_lidar_calibration"].get(); + if (jj.contains("support_lidar_calibration")) { + if (jj["support_lidar_calibration"].is_boolean()) { + is_support_lidar_calibration = jj["support_lidar_calibration"].get(); + } } - } - - if (jj.contains("support_build_plate_marker_detect")) { - if (jj["support_build_plate_marker_detect"].is_boolean()) { - is_support_build_plate_marker_detect = jj["support_build_plate_marker_detect"].get(); - } - } - if (jj.contains("support_flow_calibration")) { - if (jj["support_flow_calibration"].is_boolean()) { - is_support_flow_calibration = jj["support_flow_calibration"].get(); + if (jj.contains("support_build_plate_marker_detect")) { + if (jj["support_build_plate_marker_detect"].is_boolean()) { + is_support_build_plate_marker_detect = jj["support_build_plate_marker_detect"].get(); + } } - } - if (jj.contains("support_print_without_sd")) { - if (jj["support_print_without_sd"].is_boolean()) { - is_support_print_without_sd = jj["support_print_without_sd"].get(); + if (jj.contains("support_flow_calibration")) { + if (jj["support_flow_calibration"].is_boolean()) { + is_support_flow_calibration = jj["support_flow_calibration"].get(); + } } - } - if (jj.contains("support_print_all")) { - if (jj["support_print_all"].is_boolean()) { - is_support_print_all = jj["support_print_all"].get(); + if (jj.contains("support_print_without_sd")) { + if (jj["support_print_without_sd"].is_boolean()) { + is_support_print_without_sd = jj["support_print_without_sd"].get(); + } } - } - if (jj.contains("support_send_to_sd")) { - if (jj["support_send_to_sd"].is_boolean()) { - is_support_send_to_sdcard = jj["support_send_to_sd"].get(); + if (jj.contains("support_print_all")) { + if (jj["support_print_all"].is_boolean()) { + is_support_print_all = jj["support_print_all"].get(); + } } - } - - if (jj.contains("support_aux_fan")) { - if (jj["support_aux_fan"].is_boolean()) { - is_support_aux_fan = jj["support_aux_fan"].get(); + if (jj.contains("support_send_to_sd")) { + if (jj["support_send_to_sd"].is_boolean()) { + is_support_send_to_sdcard = jj["support_send_to_sd"].get(); + } } - } - - if (jj.contains("support_chamber_fan")) { - if (jj["support_chamber_fan"].is_boolean()) { - is_support_chamber_fan = jj["support_chamber_fan"].get(); - } - } - - if (jj.contains("support_filament_backup")) { - if (jj["support_filament_backup"].is_boolean()) { - is_support_filament_backup = jj["support_filament_backup"].get(); - } - } - if (jj.contains("support_update_remain")) { - if (jj["support_update_remain"].is_boolean()) { - is_support_update_remain = jj["support_update_remain"].get(); + if (jj.contains("support_aux_fan")) { + if (jj["support_aux_fan"].is_boolean()) { + is_support_aux_fan = jj["support_aux_fan"].get(); + } } - } - if (jj.contains("support_auto_leveling")) { - if (jj["support_auto_leveling"].is_boolean()) { - is_support_auto_leveling = jj["support_auto_leveling"].get(); + if (jj.contains("support_chamber_fan")) { + if (jj["support_chamber_fan"].is_boolean()) { + is_support_chamber_fan = jj["support_chamber_fan"].get(); + } } - } - if (jj.contains("support_auto_recovery_step_loss")) { - if (jj["support_auto_recovery_step_loss"].is_boolean()) { - is_support_auto_recovery_step_loss = jj["support_auto_recovery_step_loss"].get(); + if (jj.contains("support_filament_backup")) { + if (jj["support_filament_backup"].is_boolean()) { + is_support_filament_backup = jj["support_filament_backup"].get(); + } } - } - - if (jj.contains("support_ams_humidity")) { - if (jj["support_ams_humidity"].is_boolean()) { - is_support_ams_humidity = jj["support_ams_humidity"].get(); - } - } - - if (jj.contains("support_prompt_sound")) { - if (jj["support_prompt_sound"].is_boolean()) { - is_support_prompt_sound = jj["support_prompt_sound"].get(); - } - } - - //if (jj.contains("support_filament_tangle_detect")) { - // if (jj["support_filament_tangle_detect"].is_boolean()) { - // is_support_filament_tangle_detect = jj["support_filament_tangle_detect"].get(); - // } - //} - if (jj.contains("support_1080dpi")) { - if (jj["support_1080dpi"].is_boolean()) { - is_support_1080dpi = jj["support_1080dpi"].get(); + if (jj.contains("support_update_remain")) { + if (jj["support_update_remain"].is_boolean()) { + is_support_update_remain = jj["support_update_remain"].get(); + } } - } - - if (jj.contains("support_cloud_print_only")) { - if (jj["support_cloud_print_only"].is_boolean()) { - is_support_cloud_print_only = jj["support_cloud_print_only"].get(); - } - } - - if (jj.contains("support_command_ams_switch")) { - if (jj["support_command_ams_switch"].is_boolean()) { - is_support_command_ams_switch = jj["support_command_ams_switch"].get(); - } - } - - if (jj.contains("support_mqtt_alive")) { - if (jj["support_mqtt_alive"].is_boolean()) { - is_support_mqtt_alive = jj["support_mqtt_alive"].get(); - } - } - - if (jj.contains("support_tunnel_mqtt")) { - if (jj["support_tunnel_mqtt"].is_boolean()) { - is_support_tunnel_mqtt = jj["support_tunnel_mqtt"].get(); - } - } - if (jj.contains("support_motor_noise_cali")) { - if (jj["support_motor_noise_cali"].is_boolean()) { - is_support_motor_noise_cali = jj["support_motor_noise_cali"].get(); + if (jj.contains("support_auto_leveling")) { + if (jj["support_auto_leveling"].is_boolean()) { + is_support_auto_leveling = jj["support_auto_leveling"].get(); + } } - } - if (jj.contains("support_timelapse")) { - if (jj["support_timelapse"].is_boolean()) { - is_support_timelapse = jj["support_timelapse"].get(); + if (jj.contains("support_auto_recovery_step_loss")) { + if (jj["support_auto_recovery_step_loss"].is_boolean()) { + is_support_auto_recovery_step_loss = jj["support_auto_recovery_step_loss"].get(); + } } - } - if (jj.contains("support_user_preset")) { - if (jj["support_user_preset"].is_boolean()) { - is_support_user_preset = jj["support_user_preset"].get(); + if (jj.contains("support_ams_humidity")) { + if (jj["support_ams_humidity"].is_boolean()) { + is_support_ams_humidity = jj["support_ams_humidity"].get(); + } } - } - if (jj.contains("nozzle_max_temperature")) { - if (jj["nozzle_max_temperature"].is_number_integer()) { - nozzle_max_temperature = jj["nozzle_max_temperature"].get(); + if (jj.contains("support_prompt_sound")) { + if (jj["support_prompt_sound"].is_boolean()) { + is_support_prompt_sound = jj["support_prompt_sound"].get(); + } } - } - if (jj.contains("bed_temperature_limit")) { - if (jj["bed_temperature_limit"].is_number_integer()) { - bed_temperature_limit = jj["bed_temperature_limit"].get(); + //if (jj.contains("support_filament_tangle_detect")) { + // if (jj["support_filament_tangle_detect"].is_boolean()) { + // is_support_filament_tangle_detect = jj["support_filament_tangle_detect"].get(); + // } + //} + + if (jj.contains("support_1080dpi")) { + if (jj["support_1080dpi"].is_boolean()) { + is_support_1080dpi = jj["support_1080dpi"].get(); + } + } + + if (jj.contains("support_cloud_print_only")) { + if (jj["support_cloud_print_only"].is_boolean()) { + is_support_cloud_print_only = jj["support_cloud_print_only"].get(); + } + } + + if (jj.contains("support_command_ams_switch")) { + if (jj["support_command_ams_switch"].is_boolean()) { + is_support_command_ams_switch = jj["support_command_ams_switch"].get(); + } + } + + if (jj.contains("support_mqtt_alive")) { + if (jj["support_mqtt_alive"].is_boolean()) { + is_support_mqtt_alive = jj["support_mqtt_alive"].get(); + } + } + + if (jj.contains("support_motor_noise_cali")) { + if (jj["support_motor_noise_cali"].is_boolean()) { + is_support_motor_noise_cali = jj["support_motor_noise_cali"].get(); + } + } + + if (jj.contains("support_timelapse")) { + if (jj["support_timelapse"].is_boolean()) { + is_support_timelapse = jj["support_timelapse"].get(); + } + } + + if (jj.contains("support_user_preset")) { + if (jj["support_user_preset"].is_boolean()) { + is_support_user_preset = jj["support_user_preset"].get(); + } + } + + if (jj.contains("nozzle_max_temperature")) { + if (jj["nozzle_max_temperature"].is_number_integer()) { + nozzle_max_temperature = jj["nozzle_max_temperature"].get(); + } + } + + if (jj.contains("bed_temperature_limit")) { + if (jj["bed_temperature_limit"].is_number_integer()) { + bed_temperature_limit = jj["bed_temperature_limit"].get(); + } } } @@ -2962,7 +3071,7 @@ int MachineObject::parse_json(std::string payload) if (jj["errno"].is_number()) { if (jj["errno"].get() == -2) { wxString text = _L("The current chamber temperature or the target chamber temperature exceeds 45\u2103.In order to avoid extruder clogging,low temperature filament(PLA/PETG/TPU) is not allowed to be loaded."); - GUI::wxGetApp().show_dialog(text); + GUI::wxGetApp().push_notification(text); } } } @@ -2982,7 +3091,7 @@ int MachineObject::parse_json(std::string payload) #if __WXOSX__ set_ctt_dlg(text); #else - GUI::wxGetApp().show_dialog(text); + GUI::wxGetApp().push_notification(text); #endif } } @@ -2998,21 +3107,6 @@ int MachineObject::parse_json(std::string payload) if (jj.contains("print_type")) { print_type = jj["print_type"].get(); } - - if (jj.contains("home_flag")) { - home_flag = jj["home_flag"].get(); - parse_status(home_flag); - } - if (jj.contains("hw_switch_state")) { - hw_switch_state = jj["hw_switch_state"].get(); - } - - if (jj.contains("mc_remaining_time")) { - if (jj["mc_remaining_time"].is_string()) - mc_left_time = stoi(j["print"]["mc_remaining_time"].get()) * 60; - else if (jj["mc_remaining_time"].is_number_integer()) - mc_left_time = j["print"]["mc_remaining_time"].get() * 60; - } if (jj.contains("mc_percent")) { if (jj["mc_percent"].is_string()) mc_print_percent = stoi(j["print"]["mc_percent"].get()); @@ -3033,74 +3127,69 @@ int MachineObject::parse_json(std::string payload) if (jj.contains("mc_print_error_code")) { if (jj["mc_print_error_code"].is_number()) mc_print_error_code = jj["mc_print_error_code"].get(); - } - if (jj.contains("mc_print_line_number")) { - if (jj["mc_print_line_number"].is_string() && !jj["mc_print_line_number"].is_null()) - mc_print_line_number = atoi(jj["mc_print_line_number"].get().c_str()); + if (jj.contains("mc_remaining_time")) { + if (jj["mc_remaining_time"].is_string()) + mc_left_time = stoi(j["print"]["mc_remaining_time"].get()) * 60; + else if (jj["mc_remaining_time"].is_number_integer()) + mc_left_time = j["print"]["mc_remaining_time"].get() * 60; } if (jj.contains("print_error")) { if (jj["print_error"].is_number()) print_error = jj["print_error"].get(); } - + if (!key_field_only) { + if (jj.contains("home_flag")) { + home_flag = jj["home_flag"].get(); + parse_status(home_flag); + } + if (jj.contains("hw_switch_state")) { + hw_switch_state = jj["hw_switch_state"].get(); + } + if (jj.contains("mc_print_line_number")) { + if (jj["mc_print_line_number"].is_string() && !jj["mc_print_line_number"].is_null()) + mc_print_line_number = atoi(jj["mc_print_line_number"].get().c_str()); + } + } #pragma endregion #pragma region online - // parse online info - try { - if (jj.contains("online")) { - if (jj["online"].contains("ahb")) { - if (jj["online"]["ahb"].get()) { - online_ahb = true; - } else { - online_ahb = false; + if (!key_field_only) { + // parse online info + try { + if (jj.contains("online")) { + if (jj["online"].contains("ahb")) { + if (jj["online"]["ahb"].get()) { + online_ahb = true; + } else { + online_ahb = false; + } + } + if (jj["online"].contains("rfid")) { + if (jj["online"]["rfid"].get()) { + online_rfid = true; + } else { + online_rfid = false; + } + } + std::string str = jj.dump(); + if (jj["online"].contains("version")) { + online_version = jj["online"]["version"].get(); + } + if (last_online_version != online_version) { + last_online_version = online_version; + GUI::wxGetApp().CallAfter([this] { + this->command_get_version(); + }); } } - if (jj["online"].contains("rfid")) { - if (jj["online"]["rfid"].get()) { - online_rfid = true; - } else { - online_rfid = false; - } - } - std::string str = jj.dump(); - if (jj["online"].contains("version")) { - online_version = jj["online"]["version"].get(); - } - if (last_online_version != online_version) { - last_online_version = online_version; - GUI::wxGetApp().CallAfter([this] { - this->command_get_version(); - }); - } + } catch (...) { + ; } - } catch (...) { - ; } #pragma endregion #pragma region print_task - if (jj.contains("printer_type")) { - printer_type = parse_printer_type(jj["printer_type"].get()); - } - - if (jj.contains("subtask_name")) { - subtask_name = jj["subtask_name"].get(); - } - if (jj.contains("layer_num")) { - curr_layer = jj["layer_num"].get(); - } - if (jj.contains("total_layer_num")) { - total_layers = jj["total_layer_num"].get(); - if (total_layers == 0) - is_support_layer_num = false; - else - is_support_layer_num = true; - } else { - is_support_layer_num = false; - } - if (jj.contains("gcode_state")) { this->set_print_state(jj["gcode_state"].get()); } @@ -3112,26 +3201,52 @@ int MachineObject::parse_json(std::string payload) is_support_wait_sending_finish = false; } - if (jj.contains("queue_number")) { - this->queue_number = jj["queue_number"].get(); - } else { - this->queue_number = 0; + if (jj.contains("subtask_name")) { + subtask_name = jj["subtask_name"].get(); } - if (jj.contains("task_id")) { - this->task_id_ = jj["task_id"].get(); - } + if (!key_field_only) { + if (jj.contains("printer_type")) { + printer_type = parse_printer_type(jj["printer_type"].get()); + } - if (jj.contains("gcode_file")) - this->m_gcode_file = jj["gcode_file"].get(); - if (jj.contains("gcode_file_prepare_percent")) { - std::string percent_str = jj["gcode_file_prepare_percent"].get(); - if (!percent_str.empty()) { - try{ - this->gcode_file_prepare_percent = atoi(percent_str.c_str()); - } catch(...) {} + if (jj.contains("layer_num")) { + curr_layer = jj["layer_num"].get(); + } + if (jj.contains("total_layer_num")) { + total_layers = jj["total_layer_num"].get(); + if (total_layers == 0) + is_support_layer_num = false; + else + is_support_layer_num = true; + } + else { + is_support_layer_num = false; + } + if (jj.contains("queue_number")) { + this->queue_number = jj["queue_number"].get(); + } + else { + this->queue_number = 0; + } + + if (jj.contains("task_id")) { + this->task_id_ = jj["task_id"].get(); + } + + if (jj.contains("gcode_file")) + this->m_gcode_file = jj["gcode_file"].get(); + if (jj.contains("gcode_file_prepare_percent")) { + std::string percent_str = jj["gcode_file_prepare_percent"].get(); + if (!percent_str.empty()) { + try { + this->gcode_file_prepare_percent = atoi(percent_str.c_str()); + } + catch (...) {} + } } } + if (jj.contains("project_id") && jj.contains("profile_id") && jj.contains("subtask_id") @@ -3170,99 +3285,104 @@ int MachineObject::parse_json(std::string payload) #pragma endregion #pragma region status - /* temperature */ - if (jj.contains("bed_temper")) { - if (jj["bed_temper"].is_number()) { - bed_temp = jj["bed_temper"].get(); + if (!key_field_only) { + /* temperature */ + if (jj.contains("bed_temper")) { + if (jj["bed_temper"].is_number()) { + bed_temp = jj["bed_temper"].get(); + } } - } - if (jj.contains("bed_target_temper")) { - if (jj["bed_target_temper"].is_number()) { - bed_temp_target = jj["bed_target_temper"].get(); + if (jj.contains("bed_target_temper")) { + if (jj["bed_target_temper"].is_number()) { + bed_temp_target = jj["bed_target_temper"].get(); + } } - } - if (jj.contains("frame_temper")) { - if (jj["frame_temper"].is_number()) { - frame_temp = jj["frame_temper"].get(); + if (jj.contains("frame_temper")) { + if (jj["frame_temper"].is_number()) { + frame_temp = jj["frame_temper"].get(); + } } - } - if (jj.contains("nozzle_temper")) { - if (jj["nozzle_temper"].is_number()) { - nozzle_temp = jj["nozzle_temper"].get(); + if (jj.contains("nozzle_temper")) { + if (jj["nozzle_temper"].is_number()) { + nozzle_temp = jj["nozzle_temper"].get(); + } } - } - if (jj.contains("nozzle_target_temper")) { - if (jj["nozzle_target_temper"].is_number()) { - nozzle_temp_target = jj["nozzle_target_temper"].get(); + if (jj.contains("nozzle_target_temper")) { + if (jj["nozzle_target_temper"].is_number()) { + nozzle_temp_target = jj["nozzle_target_temper"].get(); + } } - } - if (jj.contains("chamber_temper")) { - if (jj["chamber_temper"].is_number()) { - chamber_temp = jj["chamber_temper"].get(); + if (jj.contains("chamber_temper")) { + if (jj["chamber_temper"].is_number()) { + chamber_temp = jj["chamber_temper"].get(); + } } - } - if (jj.contains("ctt")) { - if (jj["ctt"].is_number()) { - chamber_temp_target = jj["ctt"].get(); + if (jj.contains("ctt")) { + if (jj["ctt"].is_number()) { + chamber_temp_target = jj["ctt"].get(); + } } - } - /* signals */ - if (jj.contains("link_th_state")) - link_th = jj["link_th_state"].get(); - if (jj.contains("link_ams_state")) - link_ams = jj["link_ams_state"].get(); - if (jj.contains("wifi_signal")) - wifi_signal = jj["wifi_signal"].get(); + /* signals */ + if (jj.contains("link_th_state")) + link_th = jj["link_th_state"].get(); + if (jj.contains("link_ams_state")) + link_ams = jj["link_ams_state"].get(); + if (jj.contains("wifi_signal")) + wifi_signal = jj["wifi_signal"].get(); - /* cooling */ - if (jj.contains("fan_gear")) { - fan_gear = jj["fan_gear"].get(); - big_fan2_speed = (int)((fan_gear & 0x00FF0000) >> 16); - big_fan1_speed = (int)((fan_gear & 0x0000FF00) >> 8); - cooling_fan_speed= (int)((fan_gear & 0x000000FF) >> 0); - } - else { - if (jj.contains("cooling_fan_speed")) { - cooling_fan_speed = stoi(jj["cooling_fan_speed"].get()); - cooling_fan_speed = round( floor(cooling_fan_speed / float(1.5)) * float(25.5) ); + /* cooling */ + if (jj.contains("fan_gear")) { + fan_gear = jj["fan_gear"].get(); + big_fan2_speed = (int)((fan_gear & 0x00FF0000) >> 16); + big_fan1_speed = (int)((fan_gear & 0x0000FF00) >> 8); + cooling_fan_speed = (int)((fan_gear & 0x000000FF) >> 0); } else { - cooling_fan_speed = 0; + if (jj.contains("cooling_fan_speed")) { + cooling_fan_speed = stoi(jj["cooling_fan_speed"].get()); + cooling_fan_speed = round(floor(cooling_fan_speed / float(1.5)) * float(25.5)); + } + else { + cooling_fan_speed = 0; + } + + if (jj.contains("big_fan1_speed")) { + big_fan1_speed = stoi(jj["big_fan1_speed"].get()); + big_fan1_speed = round( floor(big_fan1_speed / float(1.5)) * float(25.5) ); + } + else { + big_fan1_speed = 0; + } + + if (jj.contains("big_fan2_speed")) { + big_fan2_speed = stoi(jj["big_fan2_speed"].get()); + big_fan2_speed = round( floor(big_fan2_speed / float(1.5)) * float(25.5) ); + } + else { + big_fan2_speed = 0; + } } - if (jj.contains("big_fan1_speed")) { - big_fan1_speed = stoi(jj["big_fan1_speed"].get()); - big_fan1_speed = round( floor(big_fan1_speed / float(1.5)) * float(25.5) ); + if (jj.contains("heatbreak_fan_speed")) { + heatbreak_fan_speed = stoi(jj["heatbreak_fan_speed"].get()); } - else { - big_fan1_speed = 0; - } - - if (jj.contains("big_fan2_speed")) { - big_fan2_speed = stoi(jj["big_fan2_speed"].get()); - big_fan2_speed = round( floor(big_fan2_speed / float(1.5)) * float(25.5) ); - } - else { - big_fan2_speed = 0; - } - } - - if (jj.contains("heatbreak_fan_speed")) { - heatbreak_fan_speed = stoi(jj["heatbreak_fan_speed"].get()); - } - /* parse speed */ - try { - if (jj.contains("spd_lvl")) { - printing_speed_lvl = (PrintingSpeedLevel)jj["spd_lvl"].get(); + /* parse speed */ + try { + if (jj.contains("spd_lvl")) { + printing_speed_lvl = (PrintingSpeedLevel)jj["spd_lvl"].get(); + } + if (jj.contains("spd_mag")) { + printing_speed_mag = jj["spd_mag"].get(); + } + if (jj.contains("heatbreak_fan_speed")) { + heatbreak_fan_speed = stoi(jj["heatbreak_fan_speed"].get()); + } } - if (jj.contains("spd_mag")) { - printing_speed_mag = jj["spd_mag"].get(); + catch (...) { + ; } } - catch (...) { - ; - } try { if (jj.contains("stg")) { @@ -3283,115 +3403,119 @@ int MachineObject::parse_json(std::string payload) ; } - /*get filam_bak*/ - try { - if (jj.contains("filam_bak")) { - is_support_show_filament_backup = true; - filam_bak.clear(); - if (jj["filam_bak"].is_array()) { - for (auto it = jj["filam_bak"].begin(); it != jj["filam_bak"].end(); it++) { - filam_bak.push_back(it.value().get()); + if (!key_field_only) { + /*get filam_bak*/ + try { + if (jj.contains("filam_bak")) { + is_support_show_filament_backup = true; + filam_bak.clear(); + if (jj["filam_bak"].is_array()) { + for (auto it = jj["filam_bak"].begin(); it != jj["filam_bak"].end(); it++) { + filam_bak.push_back(it.value().get()); + } } } - } - else { - is_support_show_filament_backup = false; - } - } - catch (...) { - ; - } - - /* get fimware type */ - try { - if (jj.contains("mess_production_state")) { - if (jj["mess_production_state"].get() == "engineer") - firmware_type = PrinterFirmwareType::FIRMWARE_TYPE_ENGINEER; - else if (jj["mess_production_state"].get() == "product") - firmware_type = PrinterFirmwareType::FIRMWARE_TYPE_PRODUCTION; - } - } - catch (...) { - ; - } - - try { - if (jj.contains("lifecycle")) { - if (jj["lifecycle"].get() == "engineer") - lifecycle = PrinterFirmwareType::FIRMWARE_TYPE_ENGINEER; - else if (jj["lifecycle"].get() == "product") - lifecycle = PrinterFirmwareType::FIRMWARE_TYPE_PRODUCTION; - } - } - catch (...) { - ; - } - - try { - if (jj.contains("lights_report") && jj["lights_report"].is_array()) { - for (auto it = jj["lights_report"].begin(); it != jj["lights_report"].end(); it++) { - if ((*it)["node"].get().compare("chamber_light") == 0) - chamber_light = light_effect_parse((*it)["mode"].get()); - if ((*it)["node"].get().compare("work_light") == 0) - work_light = light_effect_parse((*it)["mode"].get()); - } - } - } - catch (...) { - ; - } - // media - try { - if (jj.contains("sdcard")) { - if (jj["sdcard"].get()) - sdcard_state = MachineObject::SdcardState::HAS_SDCARD_NORMAL; - else - sdcard_state = MachineObject::SdcardState::NO_SDCARD; - } else { - //do not check sdcard if no sdcard field - sdcard_state = MachineObject::SdcardState::NO_SDCARD; - } - } - catch (...) { - ; - } -#pragma endregion - try { - if (jj.contains("nozzle_diameter")) { - - if (nozzle_setting_hold_count > 0) { - nozzle_setting_hold_count--; - } else { - if (jj["nozzle_diameter"].is_number_float()) { - nozzle_diameter = jj["nozzle_diameter"].get(); - } - else if (jj["nozzle_diameter"].is_string()) { - nozzle_diameter = string_to_float(jj["nozzle_diameter"].get()); - } - } - - - } - } - catch(...) { - ; - } - - try { - if (jj.contains("nozzle_type")) { - - if (nozzle_setting_hold_count > 0) { - nozzle_setting_hold_count--; - } else { - if (jj["nozzle_type"].is_string()) { - nozzle_type = jj["nozzle_type"].get(); + is_support_show_filament_backup = false; + } + } + catch (...) { + ; + } + + /* get fimware type */ + try { + if (jj.contains("mess_production_state")) { + if (jj["mess_production_state"].get() == "engineer") + firmware_type = PrinterFirmwareType::FIRMWARE_TYPE_ENGINEER; + else if (jj["mess_production_state"].get() == "product") + firmware_type = PrinterFirmwareType::FIRMWARE_TYPE_PRODUCTION; + } + } + catch (...) { + ; + } + } + if (!key_field_only) { + try { + if (jj.contains("lifecycle")) { + if (jj["lifecycle"].get() == "engineer") + lifecycle = PrinterFirmwareType::FIRMWARE_TYPE_ENGINEER; + else if (jj["lifecycle"].get() == "product") + lifecycle = PrinterFirmwareType::FIRMWARE_TYPE_PRODUCTION; + } + } + catch (...) { + ; + } + + try { + if (jj.contains("lights_report") && jj["lights_report"].is_array()) { + for (auto it = jj["lights_report"].begin(); it != jj["lights_report"].end(); it++) { + if ((*it)["node"].get().compare("chamber_light") == 0) + chamber_light = light_effect_parse((*it)["mode"].get()); + if ((*it)["node"].get().compare("work_light") == 0) + work_light = light_effect_parse((*it)["mode"].get()); } } } + catch (...) { + ; + } + // media + try { + if (jj.contains("sdcard")) { + if (jj["sdcard"].get()) + sdcard_state = MachineObject::SdcardState::HAS_SDCARD_NORMAL; + else + sdcard_state = MachineObject::SdcardState::NO_SDCARD; + } else { + //do not check sdcard if no sdcard field + sdcard_state = MachineObject::SdcardState::NO_SDCARD; + } + } + catch (...) { + ; + } } - catch (...) { - ; +#pragma endregion + if (!key_field_only) { + try { + if (jj.contains("nozzle_diameter")) { + if (nozzle_setting_hold_count > 0) { + nozzle_setting_hold_count--; + } else { + if (jj["nozzle_diameter"].is_number_float()) { + nozzle_diameter = jj["nozzle_diameter"].get(); + } + else if (jj["nozzle_diameter"].is_string()) { + nozzle_diameter = string_to_float(jj["nozzle_diameter"].get()); + } + } + + + } + } + catch(...) { + ; + } + + try { + if (jj.contains("nozzle_type")) { + + if (nozzle_setting_hold_count > 0) { + nozzle_setting_hold_count--; + } + else { + if (jj["nozzle_type"].is_string()) { + nozzle_type = jj["nozzle_type"].get(); + } + } + } + } + catch (...) { + ; + } } #pragma region upgrade @@ -3492,147 +3616,151 @@ int MachineObject::parse_json(std::string payload) #pragma endregion #pragma region camera - // parse camera info - try { - if (jj.contains("ipcam")) { - json const & ipcam = jj["ipcam"]; - if (ipcam.contains("ipcam_record")) { - if (camera_recording_hold_count > 0) - camera_recording_hold_count--; - else { - if (ipcam["ipcam_record"].get() == "enable") { - camera_recording_when_printing = true; - } + if (!key_field_only) { + // parse camera info + try { + if (jj.contains("ipcam")) { + json const & ipcam = jj["ipcam"]; + if (ipcam.contains("ipcam_record")) { + if (camera_recording_hold_count > 0) + camera_recording_hold_count--; else { - camera_recording_when_printing = false; - } - } - } - if (ipcam.contains("timelapse")) { - if (camera_timelapse_hold_count > 0) - camera_timelapse_hold_count--; - else { - if (ipcam["timelapse"].get() == "enable") { - camera_timelapse = true; - } - else { - camera_timelapse = false; - } - } - } - if (ipcam.contains("ipcam_dev")) { - if (ipcam["ipcam_dev"].get() == "1") { - has_ipcam = true; - } else { - has_ipcam = false; - } - } - if (ipcam.contains("resolution")) { - if (camera_resolution_hold_count > 0) - camera_resolution_hold_count--; - else { - camera_resolution = ipcam["resolution"].get(); - } - } - if (ipcam.contains("resolution_supported")) { - std::vector resolution_supported; - for (auto res : ipcam["resolution_supported"]) - resolution_supported.emplace_back(res.get()); - camera_resolution_supported.swap(resolution_supported); - } - if (ipcam.contains("liveview")) { - char const *local_protos[] = {"none", "disabled", "local", "rtsps", "rtsp"}; - liveview_local = enum_index_of(ipcam["liveview"].value("local", "none").c_str(), local_protos, 5, LiveviewLocal::LVL_None); - liveview_remote = ipcam["liveview"].value("remote", "disabled") == "enabled"; - } - if (ipcam.contains("file")) { - file_local = ipcam["file"].value("local", "disabled") == "enabled"; - file_remote = ipcam["file"].value("remote", "disabled") == "enabled"; - file_model_download = ipcam["file"].value("model_download", "disabled") == "enabled"; - } - virtual_camera = ipcam.value("virtual_camera", "disabled") == "enabled"; - if (ipcam.contains("rtsp_url")) { - local_rtsp_url = ipcam["rtsp_url"].get(); - liveview_local = local_rtsp_url.empty() ? LVL_None : local_rtsp_url == "disable" - ? LVL_Disable : boost::algorithm::starts_with(local_rtsp_url, "rtsps") ? LVL_Rtsps : LVL_Rtsp; - } - if (ipcam.contains("tutk_server")) { - tutk_state = ipcam["tutk_server"].get(); - } - } - } - catch (...) { - ; - } - - try { - if (jj.contains("xcam")) { - if (xcam_ai_monitoring_hold_count > 0) - xcam_ai_monitoring_hold_count--; - else { - if (jj["xcam"].contains("printing_monitor")) { - // new protocol - xcam_ai_monitoring = jj["xcam"]["printing_monitor"].get(); - } else { - // old version protocol - if (jj["xcam"].contains("spaghetti_detector")) { - xcam_ai_monitoring = jj["xcam"]["spaghetti_detector"].get(); - if (jj["xcam"].contains("print_halt")) { - bool print_halt = jj["xcam"]["print_halt"].get(); - if (print_halt) { xcam_ai_monitoring_sensitivity = "medium"; } + if (ipcam["ipcam_record"].get() == "enable") { + camera_recording_when_printing = true; + } + else { + camera_recording_when_printing = false; } } } - if (jj["xcam"].contains("halt_print_sensitivity")) { - xcam_ai_monitoring_sensitivity = jj["xcam"]["halt_print_sensitivity"].get(); + if (ipcam.contains("timelapse")) { + if (camera_timelapse_hold_count > 0) + camera_timelapse_hold_count--; + else { + if (ipcam["timelapse"].get() == "enable") { + camera_timelapse = true; + } + else { + camera_timelapse = false; + } + } } - } - - if (xcam_first_layer_hold_count > 0) - xcam_first_layer_hold_count--; - else { - if (jj["xcam"].contains("first_layer_inspector")) { - xcam_first_layer_inspector = jj["xcam"]["first_layer_inspector"].get(); + if (ipcam.contains("ipcam_dev")) { + if (ipcam["ipcam_dev"].get() == "1") { + has_ipcam = true; + } else { + has_ipcam = false; + } } - } - - if (xcam_buildplate_marker_hold_count > 0) - xcam_buildplate_marker_hold_count--; - else { - if (jj["xcam"].contains("buildplate_marker_detector")) { - xcam_buildplate_marker_detector = jj["xcam"]["buildplate_marker_detector"].get(); - is_support_build_plate_marker_detect = true; - } else { - is_support_build_plate_marker_detect = false; + if (ipcam.contains("resolution")) { + if (camera_resolution_hold_count > 0) + camera_resolution_hold_count--; + else { + camera_resolution = ipcam["resolution"].get(); + } + } + if (ipcam.contains("resolution_supported")) { + std::vector resolution_supported; + for (auto res : ipcam["resolution_supported"]) + resolution_supported.emplace_back(res.get()); + camera_resolution_supported.swap(resolution_supported); + } + if (ipcam.contains("liveview")) { + char const *local_protos[] = {"none", "disabled", "local", "rtsps", "rtsp"}; + liveview_local = enum_index_of(ipcam["liveview"].value("local", "none").c_str(), local_protos, 5, LiveviewLocal::LVL_None); + liveview_remote = ipcam["liveview"].value("remote", "disabled") == "enabled"; + } + if (ipcam.contains("file")) { + file_local = ipcam["file"].value("local", "disabled") == "enabled"; + file_remote = ipcam["file"].value("remote", "disabled") == "enabled"; + file_model_download = ipcam["file"].value("model_download", "disabled") == "enabled"; + } + virtual_camera = ipcam.value("virtual_camera", "disabled") == "enabled"; + if (ipcam.contains("rtsp_url")) { + local_rtsp_url = ipcam["rtsp_url"].get(); + liveview_local = local_rtsp_url.empty() ? LVL_None : local_rtsp_url == "disable" + ? LVL_Disable : boost::algorithm::starts_with(local_rtsp_url, "rtsps") ? LVL_Rtsps : LVL_Rtsp; + } + if (ipcam.contains("tutk_server")) { + tutk_state = ipcam["tutk_server"].get(); } } } - } - catch (...) { - ; + catch (...) { + ; + } + + try { + if (jj.contains("xcam")) { + if (xcam_ai_monitoring_hold_count > 0) + xcam_ai_monitoring_hold_count--; + else { + if (jj["xcam"].contains("printing_monitor")) { + // new protocol + xcam_ai_monitoring = jj["xcam"]["printing_monitor"].get(); + } else { + // old version protocol + if (jj["xcam"].contains("spaghetti_detector")) { + xcam_ai_monitoring = jj["xcam"]["spaghetti_detector"].get(); + if (jj["xcam"].contains("print_halt")) { + bool print_halt = jj["xcam"]["print_halt"].get(); + if (print_halt) { xcam_ai_monitoring_sensitivity = "medium"; } + } + } + } + if (jj["xcam"].contains("halt_print_sensitivity")) { + xcam_ai_monitoring_sensitivity = jj["xcam"]["halt_print_sensitivity"].get(); + } + } + + if (xcam_first_layer_hold_count > 0) + xcam_first_layer_hold_count--; + else { + if (jj["xcam"].contains("first_layer_inspector")) { + xcam_first_layer_inspector = jj["xcam"]["first_layer_inspector"].get(); + } + } + + if (xcam_buildplate_marker_hold_count > 0) + xcam_buildplate_marker_hold_count--; + else { + if (jj["xcam"].contains("buildplate_marker_detector")) { + xcam_buildplate_marker_detector = jj["xcam"]["buildplate_marker_detector"].get(); + is_support_build_plate_marker_detect = true; + } else { + is_support_build_plate_marker_detect = false; + } + } + } + } + catch (...) { + ; + } } #pragma endregion #pragma region hms - // parse hms msg - try { - hms_list.clear(); - if (jj.contains("hms")) { - if (jj["hms"].is_array()) { - for (auto it = jj["hms"].begin(); it != jj["hms"].end(); it++) { - HMSItem item; - if ((*it).contains("attr") && (*it).contains("code")) { - unsigned attr = (*it)["attr"].get(); - unsigned code = (*it)["code"].get(); - item.parse_hms_info(attr, code); + if (!key_field_only) { + // parse hms msg + try { + hms_list.clear(); + if (jj.contains("hms")) { + if (jj["hms"].is_array()) { + for (auto it = jj["hms"].begin(); it != jj["hms"].end(); it++) { + HMSItem item; + if ((*it).contains("attr") && (*it).contains("code")) { + unsigned attr = (*it)["attr"].get(); + unsigned code = (*it)["code"].get(); + item.parse_hms_info(attr, code); + } + hms_list.push_back(item); } - hms_list.push_back(item); } } } - } - catch (...) { - ; + catch (...) { + ; + } } #pragma endregion @@ -3675,459 +3803,460 @@ int MachineObject::parse_json(std::string payload) if (jj["ams"].contains("tray_exist_bits")) { tray_exist_bits = stol(jj["ams"]["tray_exist_bits"].get(), nullptr, 16); } - if (jj["ams"].contains("tray_read_done_bits")) { - tray_read_done_bits = stol(jj["ams"]["tray_read_done_bits"].get(), nullptr, 16); - } - if (jj["ams"].contains("tray_reading_bits")) { - tray_reading_bits = stol(jj["ams"]["tray_reading_bits"].get(), nullptr, 16); - ams_support_use_ams = true; - } - if (jj["ams"].contains("tray_is_bbl_bits")) { - tray_is_bbl_bits = stol(jj["ams"]["tray_is_bbl_bits"].get(), nullptr, 16); - } - if (jj["ams"].contains("version")) { - if (jj["ams"]["version"].is_number()) - ams_version = jj["ams"]["version"].get(); - } - if (jj["ams"].contains("tray_now")) { - this->_parse_tray_now(jj["ams"]["tray_now"].get()); - } - if (jj["ams"].contains("tray_tar")) { - m_tray_tar = jj["ams"]["tray_tar"].get(); - } - if (jj["ams"].contains("ams_rfid_status")) - ams_rfid_status = jj["ams"]["ams_rfid_status"].get(); - if (jj["ams"].contains("humidity")) { - if (jj["ams"]["humidity"].is_string()) { - std::string humidity_str = jj["ams"]["humidity"].get(); - try { - ams_humidity = atoi(humidity_str.c_str()); - } catch (...) { - ; - } + if (!key_field_only) { + if (jj["ams"].contains("tray_read_done_bits")) { + tray_read_done_bits = stol(jj["ams"]["tray_read_done_bits"].get(), nullptr, 16); } - } - - if (jj["ams"].contains("insert_flag") || jj["ams"].contains("power_on_flag") - || jj["ams"].contains("calibrate_remain_flag")) { - if (ams_user_setting_hold_count > 0) { - ams_user_setting_hold_count--; - } else { - if (jj["ams"].contains("insert_flag")) { - ams_insert_flag = jj["ams"]["insert_flag"].get(); - } - if (jj["ams"].contains("power_on_flag")) { - ams_power_on_flag = jj["ams"]["power_on_flag"].get(); - } - if (jj["ams"].contains("calibrate_remain_flag")) { - ams_calibrate_remain_flag = jj["ams"]["calibrate_remain_flag"].get(); - } + if (jj["ams"].contains("tray_reading_bits")) { + tray_reading_bits = stol(jj["ams"]["tray_reading_bits"].get(), nullptr, 16); + ams_support_use_ams = true; } - } - if (ams_exist_bits != last_ams_exist_bits - || last_tray_exist_bits != last_tray_exist_bits - || tray_is_bbl_bits != last_is_bbl_bits - || tray_read_done_bits != last_read_done_bits - || last_ams_version != ams_version) { - is_ams_need_update = true; - } - else { - is_ams_need_update = false; - } - - json j_ams = jj["ams"]["ams"]; - std::set ams_id_set; - - for (auto it = amsList.begin(); it != amsList.end(); it++) { - ams_id_set.insert(it->first); - } - for (auto it = j_ams.begin(); it != j_ams.end(); it++) { - if (!it->contains("id")) continue; - std::string ams_id = (*it)["id"].get(); - ams_id_set.erase(ams_id); - Ams* curr_ams = nullptr; - auto ams_it = amsList.find(ams_id); - if (ams_it == amsList.end()) { - Ams* new_ams = new Ams(ams_id); - try { - if (!ams_id.empty()) { - int ams_id_int = atoi(ams_id.c_str()); - new_ams->is_exists = (ams_exist_bits & (1 << ams_id_int)) != 0 ? true : false; - } - } - catch (...) { - ; - } - amsList.insert(std::make_pair(ams_id, new_ams)); - // new ams added event - curr_ams = new_ams; - } else { - curr_ams = ams_it->second; + if (jj["ams"].contains("tray_is_bbl_bits")) { + tray_is_bbl_bits = stol(jj["ams"]["tray_is_bbl_bits"].get(), nullptr, 16); } - if (!curr_ams) continue; - - if (it->contains("humidity")) { - std::string humidity = (*it)["humidity"].get(); - - try { - curr_ams->humidity = atoi(humidity.c_str()); - } - catch (...) { - ; - } + if (jj["ams"].contains("version")) { + if (jj["ams"]["version"].is_number()) + ams_version = jj["ams"]["version"].get(); } - - - if (it->contains("tray")) { - std::set tray_id_set; - for (auto it = curr_ams->trayList.begin(); it != curr_ams->trayList.end(); it++) { - tray_id_set.insert(it->first); - } - for (auto tray_it = (*it)["tray"].begin(); tray_it != (*it)["tray"].end(); tray_it++) { - if (!tray_it->contains("id")) continue; - std::string tray_id = (*tray_it)["id"].get(); - tray_id_set.erase(tray_id); - // compare tray_list - AmsTray* curr_tray = nullptr; - auto tray_iter = curr_ams->trayList.find(tray_id); - if (tray_iter == curr_ams->trayList.end()) { - AmsTray* new_tray = new AmsTray(tray_id); - curr_ams->trayList.insert(std::make_pair(tray_id, new_tray)); - curr_tray = new_tray; - } - else { - curr_tray = tray_iter->second; - } - if (!curr_tray) continue; - - if (curr_tray->hold_count > 0) { - curr_tray->hold_count--; - continue; - } - - curr_tray->id = (*tray_it)["id"].get(); - if (tray_it->contains("tag_uid")) - curr_tray->tag_uid = (*tray_it)["tag_uid"].get(); - else - curr_tray->tag_uid = "0"; - if (tray_it->contains("tray_info_idx") && tray_it->contains("tray_type")) { - curr_tray->setting_id = (*tray_it)["tray_info_idx"].get(); - //std::string type = (*tray_it)["tray_type"].get(); - std::string type = setting_id_to_type(curr_tray->setting_id, (*tray_it)["tray_type"].get()); - if (curr_tray->setting_id == "GFS00") { - curr_tray->type = "PLA-S"; - } - else if (curr_tray->setting_id == "GFS01") { - curr_tray->type = "PA-S"; - } else { - curr_tray->type = type; - } - if (filament_list.find(curr_tray->setting_id) == filament_list.end()) { - wxColour color = *wxWHITE; - char col_buf[10]; - sprintf(col_buf, "%02X%02X%02XFF", (int) color.Red(), (int) color.Green(), (int) color.Blue()); - try { - this->command_ams_filament_settings(std::stoi(ams_id), std::stoi(tray_id), "", "", std::string(col_buf), "", 0, 0); - continue; - } catch (...) { - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " " << __LINE__ << " stoi error and ams_id: " << ams_id << " tray_id" << tray_id; - } - } - } else { - curr_tray->setting_id = ""; - curr_tray->type = ""; - } - if (tray_it->contains("tray_sub_brands")) - curr_tray->sub_brands = (*tray_it)["tray_sub_brands"].get(); - else - curr_tray->sub_brands = ""; - if (tray_it->contains("tray_weight")) - curr_tray->weight = (*tray_it)["tray_weight"].get(); - else - curr_tray->weight = ""; - if (tray_it->contains("tray_diameter")) - curr_tray->diameter = (*tray_it)["tray_diameter"].get(); - else - curr_tray->diameter = ""; - if (tray_it->contains("tray_temp")) - curr_tray->temp = (*tray_it)["tray_temp"].get(); - else - curr_tray->temp = ""; - if (tray_it->contains("tray_time")) - curr_tray->time = (*tray_it)["tray_time"].get(); - else - curr_tray->time = ""; - if (tray_it->contains("bed_temp_type")) - curr_tray->bed_temp_type = (*tray_it)["bed_temp_type"].get(); - else - curr_tray->bed_temp_type = ""; - if (tray_it->contains("bed_temp")) - curr_tray->bed_temp = (*tray_it)["bed_temp"].get(); - else - curr_tray->bed_temp = ""; - if (tray_it->contains("tray_color")) { - auto color = (*tray_it)["tray_color"].get(); - curr_tray->update_color_from_str(color); - } else { - curr_tray->color = ""; - } - if (tray_it->contains("nozzle_temp_max")) { - curr_tray->nozzle_temp_max = (*tray_it)["nozzle_temp_max"].get(); - } - else - curr_tray->nozzle_temp_max = ""; - if (tray_it->contains("nozzle_temp_min")) - curr_tray->nozzle_temp_min = (*tray_it)["nozzle_temp_min"].get(); - else - curr_tray->nozzle_temp_min = ""; - if (curr_tray->nozzle_temp_min != "" && curr_tray->nozzle_temp_max != "") { - try { - std::string preset_setting_id; - bool is_equation = preset_bundle->check_filament_temp_equation_by_printer_type_and_nozzle_for_mas_tray( - MachineObject::get_preset_printer_model_name(this->printer_type), nozzle_diameter_str, curr_tray->setting_id, - curr_tray->tag_uid, curr_tray->nozzle_temp_min, curr_tray->nozzle_temp_max, preset_setting_id); - if (!is_equation) { - command_ams_filament_settings(std::stoi(ams_id), std::stoi(tray_id), curr_tray->setting_id, preset_setting_id, - curr_tray->color, curr_tray->type, - std::stoi(curr_tray->nozzle_temp_min), - std::stoi(curr_tray->nozzle_temp_max)); - } - } catch (...) { - BOOST_LOG_TRIVIAL(info) << "check fail and curr_tray ams_id" << ams_id << " curr_tray tray_id"<contains("xcam_info")) - curr_tray->xcam_info = (*tray_it)["xcam_info"].get(); - else - curr_tray->xcam_info = ""; - if (tray_it->contains("tray_uuid")) - curr_tray->uuid = (*tray_it)["tray_uuid"].get(); - else - curr_tray->uuid = "0"; - - if (tray_it->contains("ctype")) - curr_tray->ctype = (*tray_it)["ctype"].get(); - else - curr_tray->ctype = 0; - curr_tray->cols.clear(); - if (tray_it->contains("cols")) { - if ((*tray_it)["cols"].is_array()) { - for (auto it = (*tray_it)["cols"].begin(); it != (*tray_it)["cols"].end(); it++) { - curr_tray->cols.push_back(it.value().get()); - } - } - } - - if (tray_it->contains("remain")) { - curr_tray->remain = (*tray_it)["remain"].get(); - } else { - curr_tray->remain = -1; - } - int ams_id_int = 0; - int tray_id_int = 0; + if (jj["ams"].contains("tray_now")) { + this->_parse_tray_now(jj["ams"]["tray_now"].get()); + } + if (jj["ams"].contains("tray_tar")) { + m_tray_tar = jj["ams"]["tray_tar"].get(); + } + if (jj["ams"].contains("ams_rfid_status")) + ams_rfid_status = jj["ams"]["ams_rfid_status"].get(); + if (jj["ams"].contains("humidity")) { + if (jj["ams"]["humidity"].is_string()) { + std::string humidity_str = jj["ams"]["humidity"].get(); try { - if (!ams_id.empty() && !curr_tray->id.empty()) { - ams_id_int = atoi(ams_id.c_str()); - tray_id_int = atoi(curr_tray->id.c_str()); - curr_tray->is_exists = (tray_exist_bits & (1 << (ams_id_int * 4 + tray_id_int))) != 0 ? true : false; + ams_humidity = atoi(humidity_str.c_str()); + } catch (...) { + ; + } + } + } + + if (jj["ams"].contains("insert_flag") || jj["ams"].contains("power_on_flag") + || jj["ams"].contains("calibrate_remain_flag")) { + if (ams_user_setting_hold_count > 0) { + ams_user_setting_hold_count--; + } else { + if (jj["ams"].contains("insert_flag")) { + ams_insert_flag = jj["ams"]["insert_flag"].get(); + } + if (jj["ams"].contains("power_on_flag")) { + ams_power_on_flag = jj["ams"]["power_on_flag"].get(); + } + if (jj["ams"].contains("calibrate_remain_flag")) { + ams_calibrate_remain_flag = jj["ams"]["calibrate_remain_flag"].get(); + } + } + } + if (ams_exist_bits != last_ams_exist_bits + || last_tray_exist_bits != last_tray_exist_bits + || tray_is_bbl_bits != last_is_bbl_bits + || tray_read_done_bits != last_read_done_bits + || last_ams_version != ams_version) { + is_ams_need_update = true; + } + else { + is_ams_need_update = false; + } + + json j_ams = jj["ams"]["ams"]; + std::set ams_id_set; + + for (auto it = amsList.begin(); it != amsList.end(); it++) { + ams_id_set.insert(it->first); + } + for (auto it = j_ams.begin(); it != j_ams.end(); it++) { + if (!it->contains("id")) continue; + std::string ams_id = (*it)["id"].get(); + ams_id_set.erase(ams_id); + Ams* curr_ams = nullptr; + auto ams_it = amsList.find(ams_id); + if (ams_it == amsList.end()) { + Ams* new_ams = new Ams(ams_id); + try { + if (!ams_id.empty()) { + int ams_id_int = atoi(ams_id.c_str()); + new_ams->is_exists = (ams_exist_bits & (1 << ams_id_int)) != 0 ? true : false; } } catch (...) { + ; } - if (tray_it->contains("setting_id")) { - curr_tray->filament_setting_id = (*tray_it)["setting_id"].get(); + amsList.insert(std::make_pair(ams_id, new_ams)); + // new ams added event + curr_ams = new_ams; + } else { + curr_ams = ams_it->second; + } + if (!curr_ams) continue; + + if (it->contains("humidity")) { + std::string humidity = (*it)["humidity"].get(); + + try { + curr_ams->humidity = atoi(humidity.c_str()); } - - - auto curr_time = std::chrono::system_clock::now(); - auto diff = std::chrono::duration_cast(curr_time - extrusion_cali_set_hold_start); - if (diff.count() > HOLD_TIMEOUT || diff.count() < 0 - || ams_id_int != (extrusion_cali_set_tray_id / 4) - || tray_id_int != (extrusion_cali_set_tray_id % 4)) { - if (tray_it->contains("k")) { - curr_tray->k = (*tray_it)["k"].get(); - } - if (tray_it->contains("n")) { - curr_tray->n = (*tray_it)["n"].get(); - } - } - - std::string temp = tray_it->dump(); - - if (tray_it->contains("cali_idx")) { - curr_tray->cali_idx = (*tray_it)["cali_idx"].get(); + catch (...) { + ; } } - // remove not in trayList - for (auto tray_it = tray_id_set.begin(); tray_it != tray_id_set.end(); tray_it++) { - std::string tray_id = *tray_it; - auto tray = curr_ams->trayList.find(tray_id); - if (tray != curr_ams->trayList.end()) { - curr_ams->trayList.erase(tray_id); - BOOST_LOG_TRIVIAL(trace) << "parse_json: remove ams_id=" << ams_id << ", tray_id=" << tray_id; + + + if (it->contains("tray")) { + std::set tray_id_set; + for (auto it = curr_ams->trayList.begin(); it != curr_ams->trayList.end(); it++) { + tray_id_set.insert(it->first); + } + for (auto tray_it = (*it)["tray"].begin(); tray_it != (*it)["tray"].end(); tray_it++) { + if (!tray_it->contains("id")) continue; + std::string tray_id = (*tray_it)["id"].get(); + tray_id_set.erase(tray_id); + // compare tray_list + AmsTray* curr_tray = nullptr; + auto tray_iter = curr_ams->trayList.find(tray_id); + if (tray_iter == curr_ams->trayList.end()) { + AmsTray* new_tray = new AmsTray(tray_id); + curr_ams->trayList.insert(std::make_pair(tray_id, new_tray)); + curr_tray = new_tray; + } + else { + curr_tray = tray_iter->second; + } + if (!curr_tray) continue; + + if (curr_tray->hold_count > 0) { + curr_tray->hold_count--; + continue; + } + + curr_tray->id = (*tray_it)["id"].get(); + if (tray_it->contains("tag_uid")) + curr_tray->tag_uid = (*tray_it)["tag_uid"].get(); + else + curr_tray->tag_uid = "0"; + if (tray_it->contains("tray_info_idx") && tray_it->contains("tray_type")) { + curr_tray->setting_id = (*tray_it)["tray_info_idx"].get(); + //std::string type = (*tray_it)["tray_type"].get(); + std::string type = setting_id_to_type(curr_tray->setting_id, (*tray_it)["tray_type"].get()); + if (curr_tray->setting_id == "GFS00") { + curr_tray->type = "PLA-S"; + } + else if (curr_tray->setting_id == "GFS01") { + curr_tray->type = "PA-S"; + } else { + curr_tray->type = type; + } + if (filament_list.find(curr_tray->setting_id) == filament_list.end()) { + wxColour color = *wxWHITE; + char col_buf[10]; + sprintf(col_buf, "%02X%02X%02XFF", (int) color.Red(), (int) color.Green(), (int) color.Blue()); + try { + this->command_ams_filament_settings(std::stoi(ams_id), std::stoi(tray_id), "", "", std::string(col_buf), "", 0, 0); + continue; + } catch (...) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " " << __LINE__ << " stoi error and ams_id: " << ams_id << " tray_id" << tray_id; + } + } + } else { + curr_tray->setting_id = ""; + curr_tray->type = ""; + } + if (tray_it->contains("tray_sub_brands")) + curr_tray->sub_brands = (*tray_it)["tray_sub_brands"].get(); + else + curr_tray->sub_brands = ""; + if (tray_it->contains("tray_weight")) + curr_tray->weight = (*tray_it)["tray_weight"].get(); + else + curr_tray->weight = ""; + if (tray_it->contains("tray_diameter")) + curr_tray->diameter = (*tray_it)["tray_diameter"].get(); + else + curr_tray->diameter = ""; + if (tray_it->contains("tray_temp")) + curr_tray->temp = (*tray_it)["tray_temp"].get(); + else + curr_tray->temp = ""; + if (tray_it->contains("tray_time")) + curr_tray->time = (*tray_it)["tray_time"].get(); + else + curr_tray->time = ""; + if (tray_it->contains("bed_temp_type")) + curr_tray->bed_temp_type = (*tray_it)["bed_temp_type"].get(); + else + curr_tray->bed_temp_type = ""; + if (tray_it->contains("bed_temp")) + curr_tray->bed_temp = (*tray_it)["bed_temp"].get(); + else + curr_tray->bed_temp = ""; + if (tray_it->contains("tray_color")) { + auto color = (*tray_it)["tray_color"].get(); + curr_tray->update_color_from_str(color); + } else { + curr_tray->color = ""; + } + if (tray_it->contains("nozzle_temp_max")) { + curr_tray->nozzle_temp_max = (*tray_it)["nozzle_temp_max"].get(); + } + else + curr_tray->nozzle_temp_max = ""; + if (tray_it->contains("nozzle_temp_min")) + curr_tray->nozzle_temp_min = (*tray_it)["nozzle_temp_min"].get(); + else + curr_tray->nozzle_temp_min = ""; + if (curr_tray->nozzle_temp_min != "" && curr_tray->nozzle_temp_max != "") { + try { + std::string preset_setting_id; + bool is_equation = preset_bundle->check_filament_temp_equation_by_printer_type_and_nozzle_for_mas_tray( + MachineObject::get_preset_printer_model_name(this->printer_type), nozzle_diameter_str, curr_tray->setting_id, + curr_tray->tag_uid, curr_tray->nozzle_temp_min, curr_tray->nozzle_temp_max, preset_setting_id); + if (!is_equation) { + command_ams_filament_settings(std::stoi(ams_id), std::stoi(tray_id), curr_tray->setting_id, preset_setting_id, + curr_tray->color, curr_tray->type, + std::stoi(curr_tray->nozzle_temp_min), + std::stoi(curr_tray->nozzle_temp_max)); + } + } catch (...) { + BOOST_LOG_TRIVIAL(info) << "check fail and curr_tray ams_id" << ams_id << " curr_tray tray_id"<contains("xcam_info")) + curr_tray->xcam_info = (*tray_it)["xcam_info"].get(); + else + curr_tray->xcam_info = ""; + if (tray_it->contains("tray_uuid")) + curr_tray->uuid = (*tray_it)["tray_uuid"].get(); + else + curr_tray->uuid = "0"; + + if (tray_it->contains("ctype")) + curr_tray->ctype = (*tray_it)["ctype"].get(); + else + curr_tray->ctype = 0; + curr_tray->cols.clear(); + if (tray_it->contains("cols")) { + if ((*tray_it)["cols"].is_array()) { + for (auto it = (*tray_it)["cols"].begin(); it != (*tray_it)["cols"].end(); it++) { + curr_tray->cols.push_back(it.value().get()); + } + } + } + + if (tray_it->contains("remain")) { + curr_tray->remain = (*tray_it)["remain"].get(); + } else { + curr_tray->remain = -1; + } + int ams_id_int = 0; + int tray_id_int = 0; + try { + if (!ams_id.empty() && !curr_tray->id.empty()) { + ams_id_int = atoi(ams_id.c_str()); + tray_id_int = atoi(curr_tray->id.c_str()); + curr_tray->is_exists = (tray_exist_bits & (1 << (ams_id_int * 4 + tray_id_int))) != 0 ? true : false; + } + } + catch (...) { + } + if (tray_it->contains("setting_id")) { + curr_tray->filament_setting_id = (*tray_it)["setting_id"].get(); + } + auto curr_time = std::chrono::system_clock::now(); + auto diff = std::chrono::duration_cast(curr_time - extrusion_cali_set_hold_start); + if (diff.count() > HOLD_TIMEOUT || diff.count() < 0 + || ams_id_int != (extrusion_cali_set_tray_id / 4) + || tray_id_int != (extrusion_cali_set_tray_id % 4)) { + if (tray_it->contains("k")) { + curr_tray->k = (*tray_it)["k"].get(); + } + if (tray_it->contains("n")) { + curr_tray->n = (*tray_it)["n"].get(); + } + } + + std::string temp = tray_it->dump(); + + if (tray_it->contains("cali_idx")) { + curr_tray->cali_idx = (*tray_it)["cali_idx"].get(); + } + } + // remove not in trayList + for (auto tray_it = tray_id_set.begin(); tray_it != tray_id_set.end(); tray_it++) { + std::string tray_id = *tray_it; + auto tray = curr_ams->trayList.find(tray_id); + if (tray != curr_ams->trayList.end()) { + curr_ams->trayList.erase(tray_id); + BOOST_LOG_TRIVIAL(trace) << "parse_json: remove ams_id=" << ams_id << ", tray_id=" << tray_id; + } } } } - } - // remove not in amsList - for (auto it = ams_id_set.begin(); it != ams_id_set.end(); it++) { - std::string ams_id = *it; - auto ams = amsList.find(ams_id); - if (ams != amsList.end()) { - BOOST_LOG_TRIVIAL(trace) << "parse_json: remove ams_id=" << ams_id; - amsList.erase(ams_id); + // remove not in amsList + for (auto it = ams_id_set.begin(); it != ams_id_set.end(); it++) { + std::string ams_id = *it; + auto ams = amsList.find(ams_id); + if (ams != amsList.end()) { + BOOST_LOG_TRIVIAL(trace) << "parse_json: remove ams_id=" << ams_id; + amsList.erase(ams_id); + } } } } } /* vitrual tray*/ - try { - if (jj.contains("vt_tray")) { - if (jj["vt_tray"].contains("id")) - vt_tray.id = jj["vt_tray"]["id"].get(); - auto curr_time = std::chrono::system_clock::now(); - auto diff = std::chrono::duration_cast(curr_time - extrusion_cali_set_hold_start); - if (diff.count() > HOLD_TIMEOUT || diff.count() < 0 - || extrusion_cali_set_tray_id != VIRTUAL_TRAY_ID) { - if (jj["vt_tray"].contains("k")) - vt_tray.k = jj["vt_tray"]["k"].get(); - if (jj["vt_tray"].contains("n")) - vt_tray.n = jj["vt_tray"]["n"].get(); - } - ams_support_virtual_tray = true; + if (!key_field_only) { + try { + if (jj.contains("vt_tray")) { + if (jj["vt_tray"].contains("id")) + vt_tray.id = jj["vt_tray"]["id"].get(); + auto curr_time = std::chrono::system_clock::now(); + auto diff = std::chrono::duration_cast(curr_time - extrusion_cali_set_hold_start); + if (diff.count() > HOLD_TIMEOUT || diff.count() < 0 + || extrusion_cali_set_tray_id != VIRTUAL_TRAY_ID) { + if (jj["vt_tray"].contains("k")) + vt_tray.k = jj["vt_tray"]["k"].get(); + if (jj["vt_tray"].contains("n")) + vt_tray.n = jj["vt_tray"]["n"].get(); + } + ams_support_virtual_tray = true; - if (vt_tray.hold_count > 0) { - vt_tray.hold_count--; - } else { - if (jj["vt_tray"].contains("tag_uid")) - vt_tray.tag_uid = jj["vt_tray"]["tag_uid"].get(); - else - vt_tray.tag_uid = "0"; - if (jj["vt_tray"].contains("tray_info_idx") && jj["vt_tray"].contains("tray_type")) { - vt_tray.setting_id = jj["vt_tray"]["tray_info_idx"].get(); - //std::string type = jj["vt_tray"]["tray_type"].get(); - std::string type = setting_id_to_type(vt_tray.setting_id, jj["vt_tray"]["tray_type"].get()); - if (vt_tray.setting_id == "GFS00") { - vt_tray.type = "PLA-S"; - } - else if (vt_tray.setting_id == "GFS01") { - vt_tray.type = "PA-S"; + if (vt_tray.hold_count > 0) { + vt_tray.hold_count--; + } else { + if (jj["vt_tray"].contains("tag_uid")) + vt_tray.tag_uid = jj["vt_tray"]["tag_uid"].get(); + else + vt_tray.tag_uid = "0"; + if (jj["vt_tray"].contains("tray_info_idx") && jj["vt_tray"].contains("tray_type")) { + vt_tray.setting_id = jj["vt_tray"]["tray_info_idx"].get(); + //std::string type = jj["vt_tray"]["tray_type"].get(); + std::string type = setting_id_to_type(vt_tray.setting_id, jj["vt_tray"]["tray_type"].get()); + if (vt_tray.setting_id == "GFS00") { + vt_tray.type = "PLA-S"; + } + else if (vt_tray.setting_id == "GFS01") { + vt_tray.type = "PA-S"; + } + else { + vt_tray.type = type; + } + if (filament_list.find(vt_tray.setting_id) == filament_list.end()) { + wxColour color = *wxWHITE; + char col_buf[10]; + sprintf(col_buf, "%02X%02X%02XFF", (int) color.Red(), (int) color.Green(), (int) color.Blue()); + try { + BOOST_LOG_TRIVIAL(info) << "no filament_id in filament_list and reset vt_tray and the filament_id is: " << vt_tray.setting_id; + this->command_ams_filament_settings(255, std::stoi(vt_tray.id), "", "", std::string(col_buf), "", 0, 0); + } catch (...) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " " << __LINE__ << " stoi error and tray_id" << vt_tray.id; + } + } } else { - vt_tray.type = type; + vt_tray.setting_id = ""; + vt_tray.type = ""; } - if (filament_list.find(vt_tray.setting_id) == filament_list.end()) { - wxColour color = *wxWHITE; - char col_buf[10]; - sprintf(col_buf, "%02X%02X%02XFF", (int) color.Red(), (int) color.Green(), (int) color.Blue()); + if (jj["vt_tray"].contains("tray_sub_brands")) + vt_tray.sub_brands = jj["vt_tray"]["tray_sub_brands"].get(); + else + vt_tray.sub_brands = ""; + if (jj["vt_tray"].contains("tray_weight")) + vt_tray.weight = jj["vt_tray"]["tray_weight"].get(); + else + vt_tray.weight = ""; + if (jj["vt_tray"].contains("tray_diameter")) + vt_tray.diameter = jj["vt_tray"]["tray_diameter"].get(); + else + vt_tray.diameter = ""; + if (jj["vt_tray"].contains("tray_temp")) + vt_tray.temp = jj["vt_tray"]["tray_temp"].get(); + else + vt_tray.temp = ""; + if (jj["vt_tray"].contains("tray_time")) + vt_tray.time = jj["vt_tray"]["tray_time"].get(); + else + vt_tray.time = ""; + if (jj["vt_tray"].contains("bed_temp_type")) + vt_tray.bed_temp_type = jj["vt_tray"]["bed_temp_type"].get(); + else + vt_tray.bed_temp_type = ""; + if (jj["vt_tray"].contains("bed_temp")) + vt_tray.bed_temp = jj["vt_tray"]["bed_temp"].get(); + else + vt_tray.bed_temp = ""; + if (jj["vt_tray"].contains("tray_color")) { + auto color = jj["vt_tray"]["tray_color"].get(); + vt_tray.update_color_from_str(color); + } else { + vt_tray.color = ""; + } + if (jj["vt_tray"].contains("nozzle_temp_max")) + vt_tray.nozzle_temp_max = jj["vt_tray"]["nozzle_temp_max"].get(); + else + vt_tray.nozzle_temp_max = ""; + if (jj["vt_tray"].contains("nozzle_temp_min")) + vt_tray.nozzle_temp_min = jj["vt_tray"]["nozzle_temp_min"].get(); + else + vt_tray.nozzle_temp_min = ""; + if (vt_tray.nozzle_temp_min != "" && vt_tray.nozzle_temp_max != "") { try { - BOOST_LOG_TRIVIAL(info) << "no filament_id in filament_list and reset vt_tray and the filament_id is: " << vt_tray.setting_id; - this->command_ams_filament_settings(255, std::stoi(vt_tray.id), "", "", std::string(col_buf), "", 0, 0); - } catch (...) { - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " " << __LINE__ << " stoi error and tray_id" << vt_tray.id; + std::string preset_setting_id; + bool is_equation = preset_bundle->check_filament_temp_equation_by_printer_type_and_nozzle_for_mas_tray( + MachineObject::get_preset_printer_model_name(this->printer_type), nozzle_diameter_str, vt_tray.setting_id, vt_tray.tag_uid, + vt_tray.nozzle_temp_min, vt_tray.nozzle_temp_max, preset_setting_id); + if (!is_equation) { + command_ams_filament_settings(255, std::stoi(vt_tray.id), vt_tray.setting_id, preset_setting_id, vt_tray.color, vt_tray.type, + std::stoi(vt_tray.nozzle_temp_min), std::stoi(vt_tray.nozzle_temp_max)); + } } - } - } - else { - vt_tray.setting_id = ""; - vt_tray.type = ""; - } - if (jj["vt_tray"].contains("tray_sub_brands")) - vt_tray.sub_brands = jj["vt_tray"]["tray_sub_brands"].get(); - else - vt_tray.sub_brands = ""; - if (jj["vt_tray"].contains("tray_weight")) - vt_tray.weight = jj["vt_tray"]["tray_weight"].get(); - else - vt_tray.weight = ""; - if (jj["vt_tray"].contains("tray_diameter")) - vt_tray.diameter = jj["vt_tray"]["tray_diameter"].get(); - else - vt_tray.diameter = ""; - if (jj["vt_tray"].contains("tray_temp")) - vt_tray.temp = jj["vt_tray"]["tray_temp"].get(); - else - vt_tray.temp = ""; - if (jj["vt_tray"].contains("tray_time")) - vt_tray.time = jj["vt_tray"]["tray_time"].get(); - else - vt_tray.time = ""; - if (jj["vt_tray"].contains("bed_temp_type")) - vt_tray.bed_temp_type = jj["vt_tray"]["bed_temp_type"].get(); - else - vt_tray.bed_temp_type = ""; - if (jj["vt_tray"].contains("bed_temp")) - vt_tray.bed_temp = jj["vt_tray"]["bed_temp"].get(); - else - vt_tray.bed_temp = ""; - if (jj["vt_tray"].contains("tray_color")) { - auto color = jj["vt_tray"]["tray_color"].get(); - vt_tray.update_color_from_str(color); - } else { - vt_tray.color = ""; - } - if (jj["vt_tray"].contains("nozzle_temp_max")) - vt_tray.nozzle_temp_max = jj["vt_tray"]["nozzle_temp_max"].get(); - else - vt_tray.nozzle_temp_max = ""; - if (jj["vt_tray"].contains("nozzle_temp_min")) - vt_tray.nozzle_temp_min = jj["vt_tray"]["nozzle_temp_min"].get(); - else - vt_tray.nozzle_temp_min = ""; - if (vt_tray.nozzle_temp_min != "" && vt_tray.nozzle_temp_max != "") { - try { - std::string preset_setting_id; - bool is_equation = preset_bundle->check_filament_temp_equation_by_printer_type_and_nozzle_for_mas_tray( - MachineObject::get_preset_printer_model_name(this->printer_type), nozzle_diameter_str, vt_tray.setting_id, vt_tray.tag_uid, - vt_tray.nozzle_temp_min, vt_tray.nozzle_temp_max, preset_setting_id); - if (!is_equation) { - command_ams_filament_settings(255, std::stoi(vt_tray.id), vt_tray.setting_id, preset_setting_id, vt_tray.color, vt_tray.type, - std::stoi(vt_tray.nozzle_temp_min), std::stoi(vt_tray.nozzle_temp_max)); + catch(...) { + BOOST_LOG_TRIVIAL(info) << "check fail and vt_tray.id" << vt_tray.id; } - } - catch(...) { - BOOST_LOG_TRIVIAL(info) << "check fail and vt_tray.id" << vt_tray.id; - } - } - if (jj["vt_tray"].contains("xcam_info")) - vt_tray.xcam_info = jj["vt_tray"]["xcam_info"].get(); - else - vt_tray.xcam_info = ""; - if (jj["vt_tray"].contains("tray_uuid")) - vt_tray.uuid = jj["vt_tray"]["tray_uuid"].get(); - else - vt_tray.uuid = "0"; + } + if (jj["vt_tray"].contains("xcam_info")) + vt_tray.xcam_info = jj["vt_tray"]["xcam_info"].get(); + else + vt_tray.xcam_info = ""; + if (jj["vt_tray"].contains("tray_uuid")) + vt_tray.uuid = jj["vt_tray"]["tray_uuid"].get(); + else + vt_tray.uuid = "0"; - if (jj["vt_tray"].contains("cali_idx")) - vt_tray.cali_idx = jj["vt_tray"]["cali_idx"].get(); - else - vt_tray.cali_idx = -1; - - vt_tray.cols.clear(); - if (jj["vt_tray"].contains("cols")) { - if (jj["vt_tray"].is_array()) { - for (auto it = jj["vt_tray"].begin(); it != jj["vt_tray"].end(); it++) { - vt_tray.cols.push_back(it.value().get()); + if (jj["vt_tray"].contains("cali_idx")) + vt_tray.cali_idx = jj["vt_tray"]["cali_idx"].get(); + else + vt_tray.cali_idx = -1; + vt_tray.cols.clear(); + if (jj["vt_tray"].contains("cols")) { + if (jj["vt_tray"].is_array()) { + for (auto it = jj["vt_tray"].begin(); it != jj["vt_tray"].end(); it++) { + vt_tray.cols.push_back(it.value().get()); + } } } - } - if (jj["vt_tray"].contains("remain")) { - vt_tray.remain = jj["vt_tray"]["remain"].get(); - } - else { - vt_tray.remain = -1; + if (jj["vt_tray"].contains("remain")) { + vt_tray.remain = jj["vt_tray"]["remain"].get(); + } + else { + vt_tray.remain = -1; + } } + } else { + ams_support_virtual_tray = false; + is_support_extrusion_cali = false; } - } else { - ams_support_virtual_tray = false; - is_support_extrusion_cali = false; } - } - catch (...) { - ; + catch (...) { + ; + } } #pragma endregion @@ -4151,10 +4280,10 @@ int MachineObject::parse_json(std::string payload) result = jj["result"].get(); if (result == "FAIL") { wxString text = _L("Failed to start printing job"); - GUI::wxGetApp().show_dialog(text); + GUI::wxGetApp().push_notification(text); } } - } else if (jj["command"].get() == "ams_filament_setting") { + } else if (jj["command"].get() == "ams_filament_setting" && !key_field_only) { // BBS trigger ams UI update ams_version = -1; @@ -4207,7 +4336,7 @@ int MachineObject::parse_json(std::string payload) } } } - } else if (jj["command"].get() == "xcam_control_set") { + } else if (jj["command"].get() == "xcam_control_set" && !key_field_only) { if (jj.contains("module_name")) { if (jj.contains("enable") || jj.contains("control")) { bool enable = false; @@ -4267,27 +4396,24 @@ int MachineObject::parse_json(std::string payload) else if (jj["result"].get() == "fail") { std::string cali_mode = jj["command"].get(); std::string reason = jj["reason"].get(); - GUI::wxGetApp().CallAfter([cali_mode, reason] { - wxString info = ""; - if (reason == "invalid nozzle_diameter" || reason == "nozzle_diameter is not supported") { - info = _L("This calibration does not support the currently selected nozzle diameter"); - } - else if (reason == "invalid handle_flowrate_cali param") { - info = _L("Current flowrate cali param is invalid"); - } - else if (reason == "nozzle_diameter is not matched") { - info = _L("Selected diameter and machine diameter do not match"); - } - else if (reason == "generate auto filament cali gcode failure") { - info = _L("Failed to generate cali gcode"); - } - else { - info = reason; - } - GUI::MessageDialog msg_dlg(nullptr, info, _L("Calibration error"), wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - BOOST_LOG_TRIVIAL(trace) << cali_mode << " result fail, reason = " << reason; - }); + wxString info = ""; + if (reason == "invalid nozzle_diameter" || reason == "nozzle_diameter is not supported") { + info = _L("This calibration does not support the currently selected nozzle diameter"); + } + else if (reason == "invalid handle_flowrate_cali param") { + info = _L("Current flowrate cali param is invalid"); + } + else if (reason == "nozzle_diameter is not matched") { + info = _L("Selected diameter and machine diameter do not match"); + } + else if (reason == "generate auto filament cali gcode failure") { + info = _L("Failed to generate cali gcode"); + } + else { + info = reason; + } + GUI::wxGetApp().push_notification(info, _L("Calibration error"), UserNotificationStyle::UNS_WARNING_CONFIRM); + BOOST_LOG_TRIVIAL(trace) << cali_mode << " result fail, reason = " << reason; } } } else if (jj["command"].get() == "extrusion_cali_set") { @@ -4490,7 +4616,7 @@ int MachineObject::parse_json(std::string payload) BOOST_LOG_TRIVIAL(info) << "no pa calib result"; } } - else if (jj["command"].get() == "flowrate_get_result") { + else if (jj["command"].get() == "flowrate_get_result" && !key_field_only) { this->reset_flow_rate_cali_result(); get_flow_calib_result = true; @@ -4521,44 +4647,47 @@ int MachineObject::parse_json(std::string payload) } } } - - try { - if (j.contains("camera")) { - if (j["camera"].contains("command")) { - if (j["camera"]["command"].get() == "ipcam_timelapse") { - if (j["camera"]["control"].get() == "enable") - this->camera_timelapse = true; - if (j["camera"]["control"].get() == "disable") - this->camera_timelapse = false; - BOOST_LOG_TRIVIAL(info) << "ack of timelapse = " << camera_timelapse; - } else if (j["camera"]["command"].get() == "ipcam_record_set") { - if (j["camera"]["control"].get() == "enable") - this->camera_recording_when_printing = true; - if (j["camera"]["control"].get() == "disable") - this->camera_recording_when_printing = false; - BOOST_LOG_TRIVIAL(info) << "ack of ipcam_record_set " << camera_recording_when_printing; - } else if (j["camera"]["command"].get() == "ipcam_resolution_set") { - this->camera_resolution = j["camera"]["resolution"].get(); - BOOST_LOG_TRIVIAL(info) << "ack of resolution = " << camera_resolution; + if (!key_field_only) { + try { + if (j.contains("camera")) { + if (j["camera"].contains("command")) { + if (j["camera"]["command"].get() == "ipcam_timelapse") { + if (j["camera"]["control"].get() == "enable") + this->camera_timelapse = true; + if (j["camera"]["control"].get() == "disable") + this->camera_timelapse = false; + BOOST_LOG_TRIVIAL(info) << "ack of timelapse = " << camera_timelapse; + } else if (j["camera"]["command"].get() == "ipcam_record_set") { + if (j["camera"]["control"].get() == "enable") + this->camera_recording_when_printing = true; + if (j["camera"]["control"].get() == "disable") + this->camera_recording_when_printing = false; + BOOST_LOG_TRIVIAL(info) << "ack of ipcam_record_set " << camera_recording_when_printing; + } else if (j["camera"]["command"].get() == "ipcam_resolution_set") { + this->camera_resolution = j["camera"]["resolution"].get(); + BOOST_LOG_TRIVIAL(info) << "ack of resolution = " << camera_resolution; + } } } - } - } catch (...) {} - - // upgrade - try { - if (j.contains("upgrade")) { - if (j["upgrade"].contains("command")) { - if (j["upgrade"]["command"].get() == "upgrade_confirm") { - this->upgrade_display_state = UpgradingInProgress; - upgrade_display_hold_count = HOLD_COUNT_MAX; - BOOST_LOG_TRIVIAL(info) << "ack of upgrade_confirm"; - } - } - } + } catch (...) {} } - catch (...) { - ; + + if (!key_field_only) { + // upgrade + try { + if (j.contains("upgrade")) { + if (j["upgrade"].contains("command")) { + if (j["upgrade"]["command"].get() == "upgrade_confirm") { + this->upgrade_display_state = UpgradingInProgress; + upgrade_display_hold_count = HOLD_COUNT_MAX; + BOOST_LOG_TRIVIAL(info) << "ack of upgrade_confirm"; + } + } + } + } + catch (...) { + ; + } } // event info @@ -4574,19 +4703,17 @@ int MachineObject::parse_json(std::string payload) } catch (...) {} - if (m_active_state == Active && !module_vers.empty() && check_version_valid() + if (!key_field_only) { + if (m_active_state == Active && !module_vers.empty() && check_version_valid() && !is_camera_busy_off()) { - m_active_state = UpdateToDate; - parse_version_func(); - if (is_support_tunnel_mqtt && connection_type() != "lan") { - m_agent->start_subscribe("tunnel"); + m_active_state = UpdateToDate; + parse_version_func(); + if (is_support_tunnel_mqtt && connection_type() != "lan") { + m_agent->start_subscribe("tunnel"); + } + parse_state_changed_event(); } - } else if (m_active_state == UpdateToDate && is_camera_busy_off()) { - m_active_state = Active; - m_agent->stop_subscribe("tunnel"); - } - - parse_state_changed_event(); + } } catch (...) { BOOST_LOG_TRIVIAL(trace) << "parse_json failed! dev_id=" << this->dev_id <<", payload = " << payload; @@ -4930,6 +5057,24 @@ bool MachineObject::is_firmware_info_valid() return m_firmware_valid; } +std::string MachineObject::get_string_from_fantype(FanType type) +{ + switch (type) { + case FanType::COOLING_FAN: + return "cooling_fan"; + case FanType::BIG_COOLING_FAN: + return "big_cooling_fan"; + case FanType::CHAMBER_FAN: + return "chamber_fan"; + default: + return ""; + } + return ""; +} + +bool DeviceManager::EnableMultiMachine = false; +bool DeviceManager::key_field_only = false; + DeviceManager::DeviceManager(NetworkAgent* agent) { m_agent = agent; @@ -5042,12 +5187,12 @@ void DeviceManager::on_machine_alive(std::string json_str) if (obj->dev_ip.compare(dev_ip) != 0) { if ( connection_name.empty() ) { - BOOST_LOG_TRIVIAL(info) << "MachineObject IP changed from " << obj->dev_ip << " to " << dev_ip; + BOOST_LOG_TRIVIAL(info) << "MachineObject IP changed from " << Slic3r::GUI::wxGetApp().format_IP(obj->dev_ip) << " to " << Slic3r::GUI::wxGetApp().format_IP(dev_ip); obj->dev_ip = dev_ip; } else { if ( obj->dev_connection_name.empty() || obj->dev_connection_name.compare(connection_name) == 0) { - BOOST_LOG_TRIVIAL(info) << "MachineObject IP changed from " << obj->dev_ip << " to " << dev_ip << " connection_name is " << connection_name; + BOOST_LOG_TRIVIAL(info) << "MachineObject IP changed from " << Slic3r::GUI::wxGetApp().format_IP(obj->dev_ip) << " to " << Slic3r::GUI::wxGetApp().format_IP(dev_ip) << " connection_name is " << connection_name; if(obj->dev_connection_name.empty()){obj->dev_connection_name = connection_name;} obj->dev_ip = dev_ip; } @@ -5103,7 +5248,7 @@ void DeviceManager::on_machine_alive(std::string json_str) }*/ - BOOST_LOG_TRIVIAL(debug) << "SsdpDiscovery::New Machine, ip = " << dev_ip << ", printer_name= " << dev_name << ", printer_type = " << printer_type_str << ", signal = " << printer_signal; + BOOST_LOG_TRIVIAL(info) << "SsdpDiscovery::New Machine, ip = " << Slic3r::GUI::wxGetApp().format_IP(dev_ip) << ", printer_name= " << dev_name << ", printer_type = " << printer_type_str << ", signal = " << printer_signal; } } catch (...) { @@ -5327,6 +5472,54 @@ MachineObject* DeviceManager::get_selected_machine() return nullptr; } +void DeviceManager::add_user_subscribe() +{ + /* user machine */ + std::vector dev_list; + for (auto it = userMachineList.begin(); it != userMachineList.end(); it++) { + dev_list.push_back(it->first); + BOOST_LOG_TRIVIAL(trace) << "add_user_subscribe: " << it->first; + } + m_agent->add_subscribe(dev_list); +} + +void DeviceManager::del_user_subscribe() +{ + /* user machine */ + std::vector dev_list; + for (auto it = userMachineList.begin(); it != userMachineList.end(); it++) { + dev_list.push_back(it->first); + BOOST_LOG_TRIVIAL(trace) << "del_user_subscribe: " << it->first; + } + m_agent->del_subscribe(dev_list); +} + +void DeviceManager::subscribe_device_list(std::vector dev_list) +{ + std::vector unsub_list; + subscribe_list_cache.clear(); + for (auto& it : subscribe_list_cache) { + if (it != selected_machine) { + unsub_list.push_back(it); + BOOST_LOG_TRIVIAL(trace) << "subscribe_device_list: unsub dev id = " << it; + } + } + BOOST_LOG_TRIVIAL(trace) << "subscribe_device_list: unsub_list size = " << unsub_list.size(); + + if (!selected_machine.empty()) { + subscribe_list_cache.push_back(selected_machine); + } + for (auto& it : dev_list) { + subscribe_list_cache.push_back(it); + BOOST_LOG_TRIVIAL(trace) << "subscribe_device_list: sub dev id = " << it; + } + BOOST_LOG_TRIVIAL(trace) << "subscribe_device_list: sub_list size = " << subscribe_list_cache.size(); + if (!unsub_list.empty()) + m_agent->del_subscribe(unsub_list); + if (!dev_list.empty()) + m_agent->add_subscribe(subscribe_list_cache); +} + std::map DeviceManager::get_my_machine_list() { std::map result; @@ -5351,6 +5544,19 @@ std::map DeviceManager::get_my_machine_list() return result; } +std::map DeviceManager::get_my_cloud_machine_list() +{ + std::map result; + + for (auto it = userMachineList.begin(); it != userMachineList.end(); it++) { + if (!it->second) + continue; + if (!it->second->is_lan_mode_printer()) + result.emplace(*it); + } + return result; +} + std::string DeviceManager::get_first_online_user_machine() { for (auto it = userMachineList.begin(); it != userMachineList.end(); it++) { if (it->second && it->second->is_online()) { diff --git a/src/slic3r/GUI/DeviceManager.hpp b/src/slic3r/GUI/DeviceManager.hpp index b8e7f3d451..6aca7ee5f6 100644 --- a/src/slic3r/GUI/DeviceManager.hpp +++ b/src/slic3r/GUI/DeviceManager.hpp @@ -325,6 +325,9 @@ private: std::string access_code; std::string user_access_code; + // type, time stamp, delay + std::vector> message_delay; + public: enum LIGHT_EFFECT { @@ -488,6 +491,7 @@ public: bool ams_power_on_flag { false }; bool ams_calibrate_remain_flag { false }; bool ams_auto_switch_filament_flag { false }; + bool ams_air_print_status { false }; bool ams_support_use_ams { false }; bool ams_support_virtual_tray { true }; int ams_humidity; @@ -569,7 +573,7 @@ public: int upgrade_display_state = 0; // 0 : upgrade unavailable, 1: upgrade idle, 2: upgrading, 3: upgrade_finished int upgrade_display_hold_count = 0; PrinterFirmwareType firmware_type; // engineer|production - PrinterFirmwareType lifecycle { PrinterFirmwareType::FIRMEARE_TYPE_UKNOWN }; + PrinterFirmwareType lifecycle { PrinterFirmwareType::FIRMWARE_TYPE_PRODUCTION }; std::string upgrade_progress; std::string upgrade_message; std::string upgrade_status; @@ -615,6 +619,7 @@ public: int curr_layer = 0; int total_layers = 0; bool is_support_layer_num { false }; + bool nozzle_blob_detection_enabled{ false }; int cali_version = -1; float cali_selected_nozzle_dia { 0.0 }; @@ -754,6 +759,8 @@ public: bool is_support_wait_sending_finish{false}; bool is_support_user_preset{false}; bool is_support_p1s_plus{false}; + bool is_support_nozzle_blob_detection{false}; + bool is_support_air_print_detection{false}; int nozzle_max_temperature = -1; int bed_temperature_limit = -1; @@ -844,6 +851,7 @@ public: int command_ams_user_settings(int ams_id, bool start_read_opt, bool tray_read_opt, bool remain_flag = false); int command_ams_user_settings(int ams_id, AmsOptionType op, bool value); int command_ams_switch_filament(bool switch_filament); + int command_ams_air_print_detect(bool air_print_detect); int command_ams_calibrate(int ams_id); int command_ams_filament_settings(int ams_id, int tray_id, std::string filament_id, std::string setting_id, std::string tray_color, std::string tray_type, int nozzle_temp_min, int nozzle_temp_max); int command_ams_select_tray(std::string tray_id); @@ -868,6 +876,8 @@ public: // set print option int command_set_printing_option(bool auto_recovery); + int command_nozzle_blob_detect(bool nozzle_blob_detect); + // axis string is X, Y, Z, E int command_axis_control(std::string axis, double unit = 1.0f, double input_val = 1.0f, int speed = 3000); @@ -932,7 +942,7 @@ public: int publish_json(std::string json_str, int qos = 0); int cloud_publish_json(std::string json_str, int qos = 0); int local_publish_json(std::string json_str, int qos = 0); - int parse_json(std::string payload); + int parse_json(std::string payload, bool key_filed_only = false); int publish_gcode(std::string gcode_str); std::string setting_id_to_type(std::string setting_id, std::string tray_type); @@ -946,14 +956,16 @@ public: bool m_firmware_thread_started { false }; void get_firmware_info(); bool is_firmware_info_valid(); + std::string get_string_from_fantype(FanType type); }; class DeviceManager { private: NetworkAgent* m_agent { nullptr }; - public: + static bool EnableMultiMachine; + DeviceManager(NetworkAgent* agent = nullptr); ~DeviceManager(); void set_agent(NetworkAgent* agent); @@ -978,9 +990,14 @@ public: bool set_selected_machine(std::string dev_id, bool need_disconnect = false); MachineObject* get_selected_machine(); + void add_user_subscribe(); + void del_user_subscribe(); + + void subscribe_device_list(std::vector dev_list); /* return machine has access code and user machine if login*/ std::map get_my_machine_list(); + std::map get_my_cloud_machine_list(); std::string get_first_online_user_machine(); void modify_device_name(std::string dev_id, std::string dev_name); void update_user_machine_list_info(); @@ -997,6 +1014,11 @@ public: std::map get_local_machine_list(); void load_last_machine(); + std::vector subscribe_list_cache; + + static void set_key_field_parsing(bool enable) { DeviceManager::key_field_only = enable; } + + static bool key_field_only; static json function_table; static json filaments_blacklist; diff --git a/src/slic3r/GUI/Field.cpp b/src/slic3r/GUI/Field.cpp index 6738b32266..a66b3819fd 100644 --- a/src/slic3r/GUI/Field.cpp +++ b/src/slic3r/GUI/Field.cpp @@ -28,6 +28,7 @@ #include "Widgets/ComboBox.hpp" #include "Widgets/TextCtrl.h" +#include "../Utils/ColorSpaceConvert.hpp" #ifdef __WXOSX__ #define wxOSX true #else @@ -1704,6 +1705,7 @@ void ColourPicker::BUILD() if (parent_is_custom_ctrl && m_opt.height < 0) opt_height = (double)temp->GetSize().GetHeight() / m_em_unit; temp->SetFont(Slic3r::GUI::wxGetApp().normal_font()); + convert_to_picker_widget(temp); if (!wxOSX) temp->SetBackgroundStyle(wxBG_STYLE_PAINT); wxGetApp().UpdateDarkUI(temp->GetPickerCtrl()); @@ -1760,6 +1762,7 @@ void ColourPicker::set_value(const boost::any& value, bool change_event) boost::any& ColourPicker::get_value() { + save_colors_to_config(); auto colour = static_cast(window)->GetColour(); if (colour == wxTransparentColour) m_value = std::string(""); @@ -1798,6 +1801,44 @@ void ColourPicker::sys_color_changed() #endif } +void ColourPicker::on_button_click(wxCommandEvent &event) { +#if !defined(__linux__) && !defined(__LINUX__) + if (m_clrData) { + std::vector colors = wxGetApp().app_config->get_custom_color_from_config(); + for (int i = 0; i < colors.size(); i++) { + m_clrData->SetCustomColour(i, string_to_wxColor(colors[i])); + } + } + m_picker_widget->OnButtonClick(event); +#endif +} + +void ColourPicker::convert_to_picker_widget(wxColourPickerCtrl *widget) +{ +#if !defined(__linux__) && !defined(__LINUX__) + m_picker_widget = dynamic_cast(widget->GetPickerCtrl()); + if (m_picker_widget) { + m_picker_widget->Bind(wxEVT_BUTTON, &ColourPicker::on_button_click, this); + m_clrData = m_picker_widget->GetColourData(); + } +#endif +} + +void ColourPicker::save_colors_to_config() { +#if !defined(__linux__) && !defined(__LINUX__) + if (m_clrData) { + std::vector colors; + if (colors.size() != CUSTOM_COLOR_COUNT) { + colors.resize(CUSTOM_COLOR_COUNT); + } + for (int i = 0; i < CUSTOM_COLOR_COUNT; i++) { + colors[i] = color_to_string(m_clrData->GetCustomColour(i)); + } + wxGetApp().app_config->save_custom_color_to_config(colors); + } +#endif +} + void PointCtrl::BUILD() { auto temp = new wxBoxSizer(wxHORIZONTAL); diff --git a/src/slic3r/GUI/Field.hpp b/src/slic3r/GUI/Field.hpp index d86a790eb4..8cf36eb54f 100644 --- a/src/slic3r/GUI/Field.hpp +++ b/src/slic3r/GUI/Field.hpp @@ -481,6 +481,14 @@ public: void enable() override { dynamic_cast(window)->Enable(); } void disable() override{ dynamic_cast(window)->Disable(); } wxWindow* getWindow() override { return window; } + +private: + void convert_to_picker_widget(wxColourPickerCtrl *widget); + void on_button_click(wxCommandEvent &WXUNUSED(ev)); + void save_colors_to_config(); +private: + wxColourData* m_clrData{nullptr}; + wxColourPickerWidget* m_picker_widget{nullptr}; }; class PointCtrl : public Field { diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 1661eb003e..e90e59301d 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -4183,10 +4183,10 @@ void GCodeViewer::render_all_plates_stats(const std::vectorget_extruders(true); for (size_t extruder_id : plate_extruders) { extruder_id -= 1; - if (plate_print_statistics.volumes_per_extruder.find(extruder_id) == plate_print_statistics.volumes_per_extruder.end()) - flushed_volume_of_extruders_all_plates[extruder_id] += 0; + if (plate_print_statistics.model_volumes_per_extruder.find(extruder_id) == plate_print_statistics.model_volumes_per_extruder.end()) + model_volume_of_extruders_all_plates[extruder_id] += 0; else { - double model_volume = plate_print_statistics.volumes_per_extruder.at(extruder_id); + double model_volume = plate_print_statistics.model_volumes_per_extruder.at(extruder_id); model_volume_of_extruders_all_plates[extruder_id] += model_volume; } if (plate_print_statistics.flush_per_filament.find(extruder_id) == plate_print_statistics.flush_per_filament.end()) @@ -4736,12 +4736,12 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv // used filament statistics for (size_t extruder_id : m_extruder_ids) { - if (m_print_statistics.volumes_per_extruder.find(extruder_id) == m_print_statistics.volumes_per_extruder.end()) { + if (m_print_statistics.model_volumes_per_extruder.find(extruder_id) == m_print_statistics.model_volumes_per_extruder.end()) { model_used_filaments_m.push_back(0.0); model_used_filaments_g.push_back(0.0); } else { - double volume = m_print_statistics.volumes_per_extruder.at(extruder_id); + double volume = m_print_statistics.model_volumes_per_extruder.at(extruder_id); auto [model_used_filament_m, model_used_filament_g] = get_used_filament_from_volume(volume, extruder_id); model_used_filaments_m.push_back(model_used_filament_m); model_used_filaments_g.push_back(model_used_filament_g); @@ -4862,9 +4862,9 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv { // calculate used filaments data for (size_t extruder_id : m_extruder_ids) { - if (m_print_statistics.volumes_per_extruder.find(extruder_id) == m_print_statistics.volumes_per_extruder.end()) + if (m_print_statistics.model_volumes_per_extruder.find(extruder_id) == m_print_statistics.model_volumes_per_extruder.end()) continue; - double volume = m_print_statistics.volumes_per_extruder.at(extruder_id); + double volume = m_print_statistics.model_volumes_per_extruder.at(extruder_id); auto [model_used_filament_m, model_used_filament_g] = get_used_filament_from_volume(volume, extruder_id); model_used_filaments_m.push_back(model_used_filament_m); diff --git a/src/slic3r/GUI/GLToolbar.cpp b/src/slic3r/GUI/GLToolbar.cpp index 8e99bb1bc2..c39d615d5e 100644 --- a/src/slic3r/GUI/GLToolbar.cpp +++ b/src/slic3r/GUI/GLToolbar.cpp @@ -35,6 +35,8 @@ wxDEFINE_EVENT(EVT_GLTOOLBAR_EXPORT_ALL_SLICED_FILE, SimpleEvent); wxDEFINE_EVENT(EVT_GLTOOLBAR_PRINT_SELECT, SimpleEvent); wxDEFINE_EVENT(EVT_GLTOOLBAR_SEND_TO_PRINTER, SimpleEvent); wxDEFINE_EVENT(EVT_GLTOOLBAR_SEND_TO_PRINTER_ALL, SimpleEvent); +wxDEFINE_EVENT(EVT_GLTOOLBAR_PRINT_MULTI_MACHINE, SimpleEvent); + wxDEFINE_EVENT(EVT_GLTOOLBAR_ADD, SimpleEvent); wxDEFINE_EVENT(EVT_GLTOOLBAR_DELETE, SimpleEvent); diff --git a/src/slic3r/GUI/GLToolbar.hpp b/src/slic3r/GUI/GLToolbar.hpp index 28ad69bb53..cdb7e27779 100644 --- a/src/slic3r/GUI/GLToolbar.hpp +++ b/src/slic3r/GUI/GLToolbar.hpp @@ -35,6 +35,8 @@ wxDECLARE_EVENT(EVT_GLTOOLBAR_EXPORT_ALL_SLICED_FILE, SimpleEvent); wxDECLARE_EVENT(EVT_GLTOOLBAR_PRINT_SELECT, SimpleEvent); wxDECLARE_EVENT(EVT_GLTOOLBAR_SEND_TO_PRINTER, SimpleEvent); wxDECLARE_EVENT(EVT_GLTOOLBAR_SEND_TO_PRINTER_ALL, SimpleEvent); +wxDECLARE_EVENT(EVT_GLTOOLBAR_PRINT_MULTI_MACHINE, SimpleEvent); + wxDECLARE_EVENT(EVT_GLTOOLBAR_ADD, SimpleEvent); wxDECLARE_EVENT(EVT_GLTOOLBAR_DELETE, SimpleEvent); diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 0c925c1286..4b09dcf120 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -3,6 +3,8 @@ #include "GUI_Init.hpp" #include "GUI_ObjectList.hpp" #include "GUI_Factories.hpp" +#include "slic3r/GUI/UserManager.hpp" +#include "slic3r/GUI/TaskManager.hpp" #include "format.hpp" #include "libslic3r_version.h" @@ -151,6 +153,7 @@ class MainFrame; void start_ping_test() { + return; wxArrayString output; wxExecute("ping www.amazon.com", output, wxEXEC_NODISABLE); @@ -1599,6 +1602,22 @@ void GUI_App::init_networking_callbacks() return; BOOST_LOG_TRIVIAL(trace) << "static: server connected"; m_agent->set_user_selected_machine(m_agent->get_user_selected_machine()); + if (this->is_enable_multi_machine()) { + auto evt = new wxCommandEvent(EVT_UPDATE_MACHINE_LIST); + wxQueueEvent(this, evt); + } + m_agent->set_user_selected_machine(m_agent->get_user_selected_machine()); + //subscribe device + if (m_agent->is_user_login()) { + m_agent->start_device_subscribe(); + /* resubscribe the cache dev list */ + if (this->is_enable_multi_machine()) { + DeviceManager* dev = this->getDeviceManager(); + if (dev && !dev->subscribe_list_cache.empty()) { + dev->subscribe_device_list(dev->subscribe_list_cache); + } + } + } }); }); @@ -1618,7 +1637,9 @@ void GUI_App::init_networking_callbacks() obj->command_get_version(); obj->erase_user_access_code(); obj->command_get_access_code(); - GUI::wxGetApp().sidebar().load_ams_list(obj->dev_id, obj); + if (!is_enable_multi_machine()) { + GUI::wxGetApp().sidebar().load_ams_list(obj->dev_id, obj); + } } }); }); @@ -1714,11 +1735,21 @@ void GUI_App::init_networking_callbacks() MachineObject* obj = this->m_device_manager->get_user_machine(dev_id); if (obj) { obj->is_ams_need_update = false; - obj->parse_json(msg); auto sel = this->m_device_manager->get_selected_machine(); - if ((sel == obj || sel == nullptr) && obj->is_ams_need_update) { - GUI::wxGetApp().sidebar().load_ams_list(obj->dev_id, obj); + + if (sel && sel->dev_id == dev_id) { + obj->parse_json(msg); + } + else { + obj->parse_json(msg, true); + } + + + if (!this->is_enable_multi_machine()) { + if ((sel == obj || sel == nullptr) && obj->is_ams_need_update) { + GUI::wxGetApp().sidebar().load_ams_list(obj->dev_id, obj); + } } } }); @@ -1726,6 +1757,25 @@ void GUI_App::init_networking_callbacks() m_agent->set_on_message_fn(message_arrive_fn); + auto user_message_arrive_fn = [this](std::string user_id, std::string msg) { + if (m_is_closing) { + return; + } + CallAfter([this, user_id, msg] { + if (m_is_closing) + return; + + //check user + if (user_id == m_agent->get_user_id()) { + this->m_user_manager->parse_json(msg); + } + + }); + }; + + m_agent->set_on_user_message_fn(user_message_arrive_fn); + + auto lan_message_arrive_fn = [this](std::string dev_id, std::string msg) { if (m_is_closing) { return; @@ -1740,11 +1790,15 @@ void GUI_App::init_networking_callbacks() } if (obj) { - obj->parse_json(msg); + obj->parse_json(msg, DeviceManager::key_field_only); if (this->m_device_manager->get_selected_machine() == obj && obj->is_ams_need_update) { GUI::wxGetApp().sidebar().load_ams_list(obj->dev_id, obj); } } + obj = m_device_manager->get_local_machine(dev_id); + if (obj) { + obj->parse_json(msg, DeviceManager::key_field_only); + } }); }; m_agent->set_on_local_message_fn(lan_message_arrive_fn); @@ -2054,6 +2108,11 @@ int GUI_App::OnExit() m_device_manager = nullptr; } + if (m_user_manager) { + delete m_user_manager; + m_user_manager = nullptr; + } + if (m_agent) { // BBS avoid a crash on mac platform #ifdef __WINDOWS__ @@ -2402,6 +2461,7 @@ bool GUI_App::on_init_inner() preset_bundle->set_default_suppressed(true); Bind(EVT_SET_SELECTED_MACHINE, &GUI_App::on_set_selected_machine, this); + Bind(EVT_UPDATE_MACHINE_LIST, &GUI_App::on_update_machine_list, this); Bind(EVT_USER_LOGIN, &GUI_App::on_user_login, this); Bind(EVT_USER_LOGIN_HANDLE, &GUI_App::on_user_login_handle, this); Bind(EVT_CHECK_PRIVACY_VER, &GUI_App::on_check_privacy_update, this); @@ -2724,6 +2784,22 @@ __retry: else m_device_manager->set_agent(m_agent); + if (!m_user_manager) + m_user_manager = new Slic3r::UserManager(m_agent); + else + m_user_manager->set_agent(m_agent); + + if (this->is_enable_multi_machine()) { + if (!m_task_manager) { + m_task_manager = new Slic3r::TaskManager(m_agent); + m_task_manager->start(); + } + m_agent->enable_multi_machine(true); + DeviceManager::EnableMultiMachine = true; + } else { + m_agent->enable_multi_machine(false); + DeviceManager::EnableMultiMachine = false; + } //BBS set config dir if (m_agent) { @@ -2753,6 +2829,9 @@ __retry: if (!m_device_manager) m_device_manager = new Slic3r::DeviceManager(); + + if (!m_user_manager) + m_user_manager = new Slic3r::UserManager(); } return true; @@ -3794,6 +3873,21 @@ std::string GUI_App::handle_web_request(std::string cmd) if (path.has_value()) { wxLaunchDefaultBrowser(path.value()); } + } + else if (command_str.compare("homepage_makerlab_get") == 0) { + //if (mainframe->m_webview) { mainframe->m_webview->SendMakerlabList(); } + } + else if (command_str.compare("makerworld_model_open") == 0) + { + if (root.get_child_optional("model") != boost::none) { + pt::ptree data_node = root.get_child("model"); + boost::optional path = data_node.get_optional("url"); + if (path.has_value()) + { + wxString realurl = from_u8(url_decode(path.value())); + wxGetApp().request_model_download(realurl); + } + } } } } @@ -3947,9 +4041,17 @@ void GUI_App::enable_user_preset_folder(bool enable) void GUI_App::on_set_selected_machine(wxCommandEvent &evt) { DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); - if (!dev || m_agent) return; + if (dev) { + dev->set_selected_machine(m_agent->get_user_selected_machine()); + } +} - dev->set_selected_machine(m_agent->get_user_selected_machine()); +void GUI_App::on_update_machine_list(wxCommandEvent &evt) +{ + /* DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (dev) { + dev->add_user_subscribe(); + }*/ } void GUI_App::on_user_login_handle(wxCommandEvent &evt) @@ -4383,6 +4485,24 @@ std::string GUI_App::format_display_version() return version_display; } +std::string GUI_App::format_IP(const std::string& ip) +{ + std::string format_ip = ip; + size_t pos_st = 0; + size_t pos_en = 0; + + for (int i = 0; i < 2; i++) { + pos_en = format_ip.find('.', pos_st + 1); + if (pos_en == std::string::npos) { + return ip; + } + format_ip.replace(pos_st, pos_en - pos_st, "***"); + pos_st = pos_en + 1; + } + + return format_ip; +} + void GUI_App::show_dialog(wxString msg) { if (m_info_dialog_content.empty()) { @@ -4393,6 +4513,26 @@ void GUI_App::show_dialog(wxString msg) } } +void GUI_App::push_notification(wxString msg, wxString title, UserNotificationStyle style) +{ + if (!this->is_enable_multi_machine()) { + if (style == UserNotificationStyle::UNS_NORMAL) { + if (m_info_dialog_content.empty()) { + wxCommandEvent* evt = new wxCommandEvent(EVT_SHOW_DIALOG); + evt->SetString(msg); + GUI::wxGetApp().QueueEvent(evt); + m_info_dialog_content = msg; + } + } + else if (style == UserNotificationStyle::UNS_WARNING_CONFIRM) { + GUI::wxGetApp().CallAfter([msg, title] { + GUI::MessageDialog msg_dlg(nullptr, msg, title, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + }); + } + } +} + void GUI_App::reload_settings() { if (preset_bundle && m_agent) { @@ -5964,6 +6104,25 @@ std::string GUI_App::url_encode(std::string value) { return Http::url_encode(value); } +void GUI_App::popup_ping_bind_dialog() +{ + if (m_ping_code_binding_dialog == nullptr) { + m_ping_code_binding_dialog = new PingCodeBindDialog(); + m_ping_code_binding_dialog->ShowModal(); + remove_ping_bind_dialog(); + } +} + +void GUI_App::remove_ping_bind_dialog() +{ + if (m_ping_code_binding_dialog != nullptr) { + m_ping_code_binding_dialog->Destroy(); + delete m_mall_publish_dialog; + m_ping_code_binding_dialog = nullptr; + } +} + + void GUI_App::remove_mall_system_dialog() { if (m_mall_publish_dialog != nullptr) { diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 2186b1ab53..62cce8a075 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -16,9 +16,11 @@ #include "libslic3r/Preset.hpp" #include "libslic3r/PresetBundle.hpp" #include "slic3r/GUI/DeviceManager.hpp" +#include "slic3r/GUI/UserNotification.hpp" #include "slic3r/Utils/NetworkAgent.hpp" #include "slic3r/GUI/WebViewDialog.hpp" #include "slic3r/GUI/WebUserLoginDialog.hpp" +#include "slic3r/GUI/BindDialog.hpp" #include "slic3r/GUI/HMS.hpp" #include "slic3r/GUI/Jobs/UpgradeNetworkJob.hpp" #include "slic3r/GUI/HttpServer.hpp" @@ -55,8 +57,10 @@ class PresetBundle; class PresetUpdater; class ModelObject; class Model; +class UserManager; class DeviceManager; class NetworkAgent; +class TaskManager; namespace GUI{ @@ -74,6 +78,7 @@ struct GUI_InitParams; class ParamsDialog; class HMSQuery; class ModelMallDialog; +class PingCodeBindDialog; enum FileType @@ -273,6 +278,8 @@ private: //BBS bool m_is_closing {false}; Slic3r::DeviceManager* m_device_manager { nullptr }; + Slic3r::UserManager* m_user_manager { nullptr }; + Slic3r::TaskManager* m_task_manager { nullptr }; NetworkAgent* m_agent { nullptr }; std::vector need_delete_presets; // store setting ids of preset std::vector m_create_preset_blocked { false, false, false, false, false, false }; // excceed limit @@ -307,6 +314,7 @@ private: bool OnInit() override; int OnExit() override; bool initialized() const { return m_initialized; } + inline bool is_enable_multi_machine() { return this->app_config&& this->app_config->get("enable_multi_machine") == "true"; } std::map test_url_state; @@ -318,6 +326,7 @@ private: void show_message_box(std::string msg) { wxMessageBox(msg); } EAppMode get_app_mode() const { return m_app_mode; } Slic3r::DeviceManager* getDeviceManager() { return m_device_manager; } + Slic3r::TaskManager* getTaskManager() { return m_task_manager; } HMSQuery* get_hms_query() { return hms_query; } NetworkAgent* getAgent() { return m_agent; } bool is_editor() const { return m_app_mode == EAppMode::Editor; } @@ -442,6 +451,7 @@ private: void handle_http_error(unsigned int status, std::string body); void on_http_error(wxCommandEvent &evt); void on_set_selected_machine(wxCommandEvent& evt); + void on_update_machine_list(wxCommandEvent& evt); void on_user_login(wxCommandEvent &evt); void on_user_login_handle(wxCommandEvent& evt); void enable_user_preset_folder(bool enable); @@ -460,7 +470,9 @@ private: void set_skip_version(bool skip = true); void no_new_version(); static std::string format_display_version(); + std::string format_IP(const std::string& ip); void show_dialog(wxString msg); + void push_notification(wxString msg, wxString title = wxEmptyString, UserNotificationStyle style = UserNotificationStyle::UNS_NORMAL); void reload_settings(); void remove_user_presets(); void sync_preset(Preset* preset); @@ -552,6 +564,7 @@ private: std::string m_mall_model_download_url; std::string m_mall_model_download_name; ModelMallDialog* m_mall_publish_dialog{ nullptr }; + PingCodeBindDialog* m_ping_code_binding_dialog{ nullptr }; void set_download_model_url(std::string url) {m_mall_model_download_url = url;} void set_download_model_name(std::string name) {m_mall_model_download_name = name;} @@ -570,6 +583,9 @@ private: std::string url_encode(std::string value); std::string url_decode(std::string value); + void popup_ping_bind_dialog(); + void remove_ping_bind_dialog(); + // Parameters extracted from the command line to be passed to GUI after initialization. GUI_InitParams* init_params { nullptr }; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoText.cpp b/src/slic3r/GUI/Gizmos/GLGizmoText.cpp index 271368d9e6..5290a81f8c 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoText.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoText.cpp @@ -24,6 +24,7 @@ #include #include "libslic3r/SVG.hpp" #include +#include "wx/fontenum.h" namespace Slic3r { namespace GUI { @@ -34,6 +35,119 @@ static const wxColour FONT_TEXTURE_FG = *wxWHITE; static const int FONT_SIZE = 12; static const float SELECTABLE_INNER_OFFSET = 8.0f; +static std::vector font_black_list = { +#ifdef _WIN32 + "MT Extra", + "Marlett", + "Symbol", + "Webdings", + "Wingdings", + "Wingdings 2", + "Wingdings 3", +#endif +}; + +static const wxFontEncoding font_encoding = wxFontEncoding::wxFONTENCODING_SYSTEM; + +#ifdef _WIN32 +static bool load_hfont(void *hfont, DWORD &dwTable, DWORD &dwOffset, size_t &size, HDC hdc = nullptr) +{ + bool del_hdc = false; + if (hdc == nullptr) { + del_hdc = true; + hdc = ::CreateCompatibleDC(NULL); + if (hdc == NULL) return false; + } + + // To retrieve the data from the beginning of the file for TrueType + // Collection files specify 'ttcf' (0x66637474). + dwTable = 0x66637474; + dwOffset = 0; + + ::SelectObject(hdc, hfont); + size = ::GetFontData(hdc, dwTable, dwOffset, NULL, 0); + if (size == GDI_ERROR) { + // HFONT is NOT TTC(collection) + dwTable = 0; + size = ::GetFontData(hdc, dwTable, dwOffset, NULL, 0); + } + + if (size == 0 || size == GDI_ERROR) { + if (del_hdc) ::DeleteDC(hdc); + return false; + } + return true; +} +#endif // _WIN32 + +bool can_load(const wxFont &font) +{ +#ifdef _WIN32 + DWORD dwTable = 0, dwOffset = 0; + size_t size = 0; + void* hfont = font.GetHFONT(); + if (!load_hfont(hfont, dwTable, dwOffset, size)) + return false; + return hfont != nullptr; +#elif defined(__APPLE__) + return true; +#elif defined(__linux__) + return true; +#endif + return false; +} + +std::vector init_face_names() +{ + std::vector valid_font_names; + wxArrayString facenames = wxFontEnumerator::GetFacenames(font_encoding); + std::vector bad_fonts; + + // validation lambda + auto is_valid_font = [coding = font_encoding, bad = bad_fonts](const wxString &name) { + if (name.empty()) + return false; + + // vertical font start with @, we will filter it out + // Not sure if it is only in Windows so filtering is on all platforms + if (name[0] == '@') + return false; + + // previously detected bad font + auto it = std::lower_bound(bad.begin(), bad.end(), name); + if (it != bad.end() && *it == name) + return false; + + wxFont wx_font(wxFontInfo().FaceName(name).Encoding(coding)); + // Faster chech if wx_font is loadable but not 100% + // names could contain not loadable font + if (!wx_font.IsOk()) + return false; + + if (!can_load(wx_font)) + return false; + + return true; + }; + + std::sort(facenames.begin(), facenames.end()); + for (const wxString &name : facenames) { + if (is_valid_font(name)) { + valid_font_names.push_back(name.ToStdString()); + } + else { + bad_fonts.emplace_back(name); + } + } + assert(std::is_sorted(bad_fonts.begin(), bad_fonts.end())); + + for (auto iter = font_black_list.begin(); iter != font_black_list.end(); ++iter) { + valid_font_names.erase(std::remove(valid_font_names.begin(), valid_font_names.end(), *iter), valid_font_names.end()); + } + + return valid_font_names; +} + class Line_3D { public: @@ -142,7 +256,9 @@ GLGizmoText::~GLGizmoText() bool GLGizmoText::on_init() { - m_avail_font_names = init_occt_fonts(); + m_avail_font_names = init_face_names(); + + //m_avail_font_names = init_occt_fonts(); update_font_texture(); m_scale = m_imgui->get_font_size(); m_shortcut_key = WXK_CONTROL_T; diff --git a/src/slic3r/GUI/HMS.cpp b/src/slic3r/GUI/HMS.cpp index f6b7432aa8..898ed9aa1a 100644 --- a/src/slic3r/GUI/HMS.cpp +++ b/src/slic3r/GUI/HMS.cpp @@ -41,30 +41,45 @@ int get_hms_info_version(std::string& version) return result; } -int HMSQuery::download_hms_info() +int HMSQuery::download_hms_related(std::string hms_type, json* receive_json) { + std::string local_version = "0"; + load_from_local(local_version, hms_type, receive_json); AppConfig* config = wxGetApp().app_config; if (!config) return -1; std::string hms_host = wxGetApp().app_config->get_hms_host(); std::string lang; std::string query_params = HMSQuery::build_query_params(lang); - std::string url = (boost::format("https://%1%/query.php?%2%") % hms_host % query_params).str(); + std::string url; + if (hms_type.compare(QUERY_HMS_INFO) == 0) { + url = (boost::format("https://%1%/query.php?%2%&v=%3%") % hms_host % query_params % local_version).str(); + } + else if (hms_type.compare(QUERY_HMS_ACTION) == 0) { + url = (boost::format("https://%1%/hms/GetActionImage.php?v=%2%") % hms_host % local_version).str(); + } BOOST_LOG_TRIVIAL(info) << "hms: download url = " << url; - Slic3r::Http http = Slic3r::Http::get(url); - m_hms_json.clear(); - http.on_complete([this](std::string body, unsigned status) { + http.on_complete([this, receive_json, hms_type](std::string body, unsigned status) { try { json j = json::parse(body); if (j.contains("result")) { if (j["result"] == 0 && j.contains("data")) { - this->m_hms_json = j["data"]; + if (hms_type.compare(QUERY_HMS_INFO) == 0) { + (*receive_json) = j["data"]; + this->save_local = true; + } + else if (hms_type.compare(QUERY_HMS_ACTION) == 0) { + (*receive_json)["data"] = j["data"]; + this->save_local = true; + } if (j.contains("ver")) - m_hms_json["version"] = std::to_string(j["ver"].get()); - } else { - this->m_hms_json.clear(); + (*receive_json)["version"] = std::to_string(j["ver"].get()); + } else if (j["result"] == 201){ + BOOST_LOG_TRIVIAL(info) << "HMSQuery: HMS info is the latest version"; + }else{ + receive_json->clear(); BOOST_LOG_TRIVIAL(info) << "HMSQuery: update hms info error = " << j["result"].get(); } } @@ -77,19 +92,21 @@ int HMSQuery::download_hms_info() BOOST_LOG_TRIVIAL(error) << "HMSQuery: update hms info error = " << error << ", body = " << body << ", status = " << status; }).perform_sync(); - if (!m_hms_json.empty()) - save_to_local(lang); + if (!receive_json->empty() && save_local == true) { + save_to_local(lang, hms_type, *receive_json); + save_local = false; + } return 0; } -int HMSQuery::load_from_local(std::string &version_info) +int HMSQuery::load_from_local(std::string& version_info, std::string hms_type, json* load_json) { if (data_dir().empty()) { - version_info = ""; + version_info = "0"; BOOST_LOG_TRIVIAL(error) << "HMS: load_from_local, data_dir() is empty"; return -1; } - std::string filename = get_hms_file(HMSQuery::hms_language_code()); + std::string filename = get_hms_file(hms_type, HMSQuery::hms_language_code()); auto hms_folder = (boost::filesystem::path(data_dir()) / "hms"); if (!fs::exists(hms_folder)) fs::create_directory(hms_folder); @@ -98,9 +115,9 @@ int HMSQuery::load_from_local(std::string &version_info) std::ifstream json_file(encode_path(dir_str.c_str())); try { if (json_file.is_open()) { - json_file >> m_hms_json; - if (m_hms_json.contains("version")) { - version_info = m_hms_json["version"].get(); + json_file >> (*load_json); + if ((*load_json).contains("version")) { + version_info = (*load_json)["version"].get(); return 0; } else { BOOST_LOG_TRIVIAL(warning) << "HMS: load_from_local, no version info"; @@ -108,28 +125,28 @@ int HMSQuery::load_from_local(std::string &version_info) } } } catch(...) { - version_info = ""; + version_info = "0"; BOOST_LOG_TRIVIAL(error) << "HMS: load_from_local failed"; return -1; } - version_info = ""; + version_info = "0"; return 0; } -int HMSQuery::save_to_local(std::string lang) +int HMSQuery::save_to_local(std::string lang, std::string hms_type, json save_json) { if (data_dir().empty()) { BOOST_LOG_TRIVIAL(error) << "HMS: save_to_local, data_dir() is empty"; return -1; } - std::string filename = get_hms_file(lang); + std::string filename = get_hms_file(hms_type,lang); auto hms_folder = (boost::filesystem::path(data_dir()) / "hms"); if (!fs::exists(hms_folder)) fs::create_directory(hms_folder); std::string dir_str = (hms_folder / filename).make_preferred().string(); std::ofstream json_file(encode_path(dir_str.c_str())); if (json_file.is_open()) { - json_file << std::setw(4) << m_hms_json << std::endl; + json_file << std::setw(4) << save_json << std::endl; json_file.close(); return 0; } @@ -166,9 +183,13 @@ std::string HMSQuery::build_query_params(std::string& lang) return query_params; } -std::string HMSQuery::get_hms_file(std::string lang) +std::string HMSQuery::get_hms_file(std::string hms_type, std::string lang) { - //std::string lang_code = HMSQuery::hms_language_code(); + //return hms action filename + if (hms_type.compare(QUERY_HMS_ACTION) == 0) { + return (boost::format("hms_action.json")).str(); + } + //return hms filename return (boost::format("hms_%1%.json") % lang).str(); } @@ -185,9 +206,9 @@ wxString HMSQuery::_query_hms_msg(std::string long_error_code, std::string lang_ if (long_error_code.empty()) return wxEmptyString; - if (m_hms_json.contains("device_hms")) { - if (m_hms_json["device_hms"].contains(lang_code)) { - for (auto item = m_hms_json["device_hms"][lang_code].begin(); item != m_hms_json["device_hms"][lang_code].end(); item++) { + if (m_hms_info_json.contains("device_hms")) { + if (m_hms_info_json["device_hms"].contains(lang_code)) { + for (auto item = m_hms_info_json["device_hms"][lang_code].begin(); item != m_hms_info_json["device_hms"][lang_code].end(); item++) { if (item->contains("ecode")) { std::string temp_string = (*item)["ecode"].get(); if (boost::to_upper_copy(temp_string) == long_error_code) { @@ -201,8 +222,8 @@ wxString HMSQuery::_query_hms_msg(std::string long_error_code, std::string lang_ } else { BOOST_LOG_TRIVIAL(error) << "hms: query_hms_msg, do not contains lang_code = " << lang_code; // return first language - if (!m_hms_json["device_hms"].empty()) { - for (auto lang : m_hms_json["device_hms"]) { + if (!m_hms_info_json["device_hms"].empty()) { + for (auto lang : m_hms_info_json["device_hms"]) { for (auto item = lang.begin(); item != lang.end(); item++) { if (item->contains("ecode")) { std::string temp_string = (*item)["ecode"].get(); @@ -225,9 +246,9 @@ wxString HMSQuery::_query_hms_msg(std::string long_error_code, std::string lang_ wxString HMSQuery::_query_error_msg(std::string error_code, std::string lang_code) { - if (m_hms_json.contains("device_error")) { - if (m_hms_json["device_error"].contains(lang_code)) { - for (auto item = m_hms_json["device_error"][lang_code].begin(); item != m_hms_json["device_error"][lang_code].end(); item++) { + if (m_hms_info_json.contains("device_error")) { + if (m_hms_info_json["device_error"].contains(lang_code)) { + for (auto item = m_hms_info_json["device_error"][lang_code].begin(); item != m_hms_info_json["device_error"][lang_code].end(); item++) { if (item->contains("ecode") && boost::to_upper_copy((*item)["ecode"].get()) == error_code) { if (item->contains("intro")) { return wxString::FromUTF8((*item)["intro"].get()); @@ -238,8 +259,8 @@ wxString HMSQuery::_query_error_msg(std::string error_code, std::string lang_cod } else { BOOST_LOG_TRIVIAL(error) << "hms: query_error_msg, do not contains lang_code = " << lang_code; // return first language - if (!m_hms_json["device_error"].empty()) { - for (auto lang : m_hms_json["device_error"]) { + if (!m_hms_info_json["device_error"].empty()) { + for (auto lang : m_hms_info_json["device_error"]) { for (auto item = lang.begin(); item != lang.end(); item++) { if (item->contains("ecode") && boost::to_upper_copy((*item)["ecode"].get()) == error_code) { if (item->contains("intro")) { @@ -258,6 +279,33 @@ wxString HMSQuery::_query_error_msg(std::string error_code, std::string lang_cod return wxEmptyString; } +wxString HMSQuery::_query_error_url_action(std::string long_error_code, std::string dev_id, std::vector& button_action) +{ + if (m_hms_action_json.contains("data")) { + for (auto item = m_hms_action_json["data"].begin(); item != m_hms_action_json["data"].end(); item++) { + if (item->contains("ecode") && boost::to_upper_copy((*item)["ecode"].get()) == long_error_code) { + if (item->contains("device") && (boost::to_upper_copy((*item)["device"].get()) == dev_id || + (*item)["device"].get() == "default")) { + if (item->contains("actions")) { + for (auto item_actions = (*item)["actions"].begin(); item_actions != (*item)["actions"].end(); item_actions++) { + button_action.emplace_back(item_actions->get()); + } + } + if (item->contains("image")) { + return wxString::FromUTF8((*item)["image"].get()); + } + } + } + } + } + else { + BOOST_LOG_TRIVIAL(info) << "data is not exists"; + return wxEmptyString; + } + return wxEmptyString; +} + + wxString HMSQuery::query_print_error_msg(int print_error) { char buf[32]; @@ -266,29 +314,22 @@ wxString HMSQuery::query_print_error_msg(int print_error) return _query_error_msg(std::string(buf), lang_code); } +wxString HMSQuery::query_print_error_url_action(int print_error, std::string dev_id, std::vector& button_action) +{ + char buf[32]; + ::sprintf(buf, "%08X", print_error); + //The first three digits of SN number + dev_id = dev_id.substr(0, 3); + return _query_error_url_action(std::string(buf), dev_id, button_action); +} + + int HMSQuery::check_hms_info() { boost::thread check_thread = boost::thread([this] { - bool download_new_hms_info = true; - // load local hms json file - std::string version = ""; - if (load_from_local(version) == 0) { - BOOST_LOG_TRIVIAL(info) << "HMS: check_hms_info current version = " << version; - std::string new_version; - get_hms_info_version(new_version); - BOOST_LOG_TRIVIAL(info) << "HMS: check_hms_info latest version = " << new_version; - if (new_version.empty()) {return 0;} - - if (!version.empty() && version == new_version) { - download_new_hms_info = false; - } - } - BOOST_LOG_TRIVIAL(info) << "HMS: check_hms_info need download new hms info = " << download_new_hms_info; - // download if version is update - if (download_new_hms_info) { - download_hms_info(); - } + download_hms_related(QUERY_HMS_INFO, &m_hms_info_json); + download_hms_related(QUERY_HMS_ACTION, &m_hms_action_json); return 0; }); return 0; diff --git a/src/slic3r/GUI/HMS.hpp b/src/slic3r/GUI/HMS.hpp index 64edf84caa..01df19ed38 100644 --- a/src/slic3r/GUI/HMS.hpp +++ b/src/slic3r/GUI/HMS.hpp @@ -16,23 +16,30 @@ namespace Slic3r { namespace GUI { #define HMS_INFO_FILE "hms.json" +#define QUERY_HMS_INFO "query_hms_info" +#define QUERY_HMS_ACTION "query_hms_action" class HMSQuery { protected: - json m_hms_json; - int download_hms_info(); - int load_from_local(std::string& version_info); - int save_to_local(std::string lang); - std::string get_hms_file(std::string lang); - wxString _query_hms_msg(std::string long_error_code, std::string lang_code = "en"); - wxString _query_error_msg(std::string long_error_code, std::string lang_code = "en"); + json m_hms_info_json; + json m_hms_action_json; + int download_hms_related(std::string hms_type,json* receive_json); + int load_from_local(std::string& version_info, std::string hms_type, json* load_json); + int save_to_local(std::string lang, std::string hms_type,json save_json); + std::string get_hms_file(std::string hms_type, std::string lang = std::string("en")); + wxString _query_hms_msg(std::string long_error_code, std::string lang_code = std::string("en")); + wxString _query_error_msg(std::string long_error_code, std::string lang_code = std::string("en")); + wxString _query_error_url_action(std::string long_error_code, std::string dev_id, std::vector& button_action); public: HMSQuery() {} int check_hms_info(); wxString query_hms_msg(std::string long_error_code); wxString query_print_error_msg(int print_error); + wxString query_print_error_url_action(int print_error, std::string dev_id, std::vector& button_action); static std::string hms_language_code(); static std::string build_query_params(std::string& lang); + + bool save_local = false; }; int get_hms_info_version(std::string &version); diff --git a/src/slic3r/GUI/Jobs/BindJob.cpp b/src/slic3r/GUI/Jobs/BindJob.cpp index 57b22cc221..5809b8be7e 100644 --- a/src/slic3r/GUI/Jobs/BindJob.cpp +++ b/src/slic3r/GUI/Jobs/BindJob.cpp @@ -124,9 +124,9 @@ void BindJob::process(Ctl &ctl) } dev->update_user_machine_list_info(); - wxCommandEvent event(EVT_BIND_MACHINE_SUCCESS); - event.SetEventObject(m_event_handle); - wxPostEvent(m_event_handle, event); + wxCommandEvent event(EVT_BIND_MACHINE_SUCCESS); + event.SetEventObject(m_event_handle); + wxPostEvent(m_event_handle, event); return; } diff --git a/src/slic3r/GUI/Jobs/EmbossJob.cpp b/src/slic3r/GUI/Jobs/EmbossJob.cpp index 83bdd53b31..45931691e1 100644 --- a/src/slic3r/GUI/Jobs/EmbossJob.cpp +++ b/src/slic3r/GUI/Jobs/EmbossJob.cpp @@ -979,7 +979,8 @@ TriangleMesh create_default_mesh() std::string path = Slic3r::resources_dir() + "/data/embossed_text.obj"; TriangleMesh triangle_mesh; std::string message; - if (!load_obj(path.c_str(), &triangle_mesh, message)) { + ObjInfo obj_info; + if (!load_obj(path.c_str(), &triangle_mesh, obj_info, message)) { // when can't load mesh use cube return TriangleMesh(its_make_cube(36., 4., 2.5)); } diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index c7a990734d..2e23d64e66 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -92,6 +92,7 @@ wxDEFINE_EVENT(EVT_CHECK_PRIVACY_VER, wxCommandEvent); wxDEFINE_EVENT(EVT_CHECK_PRIVACY_SHOW, wxCommandEvent); wxDEFINE_EVENT(EVT_SHOW_IP_DIALOG, wxCommandEvent); wxDEFINE_EVENT(EVT_SET_SELECTED_MACHINE, wxCommandEvent); +wxDEFINE_EVENT(EVT_UPDATE_MACHINE_LIST, wxCommandEvent); wxDEFINE_EVENT(EVT_UPDATE_PRESET_CB, SimpleEvent); @@ -1078,14 +1079,21 @@ void MainFrame::init_tabpanel() { m_printer_view->load_url(url, key); }); m_printer_view->Hide(); - + + if (wxGetApp().is_enable_multi_machine()) { + m_multi_machine = new MultiMachinePage(m_tabpanel, wxID_ANY, wxDefaultPosition, wxDefaultSize); + m_multi_machine->SetBackgroundColour(*wxWHITE); + // TODO: change the bitmap + m_tabpanel->AddPage(m_multi_machine, _L("Multi-device"), std::string("tab_multi_active"), std::string("tab_multi_active"), false); + } + m_project = new ProjectPanel(m_tabpanel, wxID_ANY, wxDefaultPosition, wxDefaultSize); m_project->SetBackgroundColour(*wxWHITE); m_tabpanel->AddPage(m_project, _L("Project"), std::string("tab_auxiliary_active"), std::string("tab_auxiliary_active"), false); m_calibration = new CalibrationPanel(m_tabpanel, wxID_ANY, wxDefaultPosition, wxDefaultSize); m_calibration->SetBackgroundColour(*wxWHITE); - m_tabpanel->AddPage(m_calibration, _L("Calibration"), std::string("tab_monitor_active"), std::string("tab_monitor_active"), false); + m_tabpanel->AddPage(m_calibration, _L("Calibration"), std::string("tab_calibration_active"), std::string("tab_calibration_active"), false); if (m_plater) { // load initial config @@ -1479,6 +1487,7 @@ bool MainFrame::can_reslice() const wxBoxSizer* MainFrame::create_side_tools() { + enable_multi_machine = wxGetApp().is_enable_multi_machine(); int em = em_unit(); wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL); @@ -1536,7 +1545,7 @@ wxBoxSizer* MainFrame::create_side_tools() m_print_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent& event) { //this->m_plater->select_view_3D("Preview"); - if (m_print_select == ePrintAll || m_print_select == ePrintPlate) + if (m_print_select == ePrintAll || m_print_select == ePrintPlate || m_print_select == ePrintMultiMachine) { m_plater->apply_background_progress(); // check valid of print @@ -1547,6 +1556,8 @@ wxBoxSizer* MainFrame::create_side_tools() wxPostEvent(m_plater, SimpleEvent(EVT_GLTOOLBAR_PRINT_ALL)); if (m_print_select == ePrintPlate) wxPostEvent(m_plater, SimpleEvent(EVT_GLTOOLBAR_PRINT_PLATE)); + if(m_print_select == ePrintMultiMachine) + wxPostEvent(m_plater, SimpleEvent(EVT_GLTOOLBAR_PRINT_MULTI_MACHINE)); } } else if (m_print_select == eExportGcode) @@ -1563,6 +1574,8 @@ wxBoxSizer* MainFrame::create_side_tools() wxPostEvent(m_plater, SimpleEvent(EVT_GLTOOLBAR_SEND_TO_PRINTER)); else if (m_print_select == eSendToPrinterAll) wxPostEvent(m_plater, SimpleEvent(EVT_GLTOOLBAR_SEND_TO_PRINTER_ALL)); + /* else if (m_print_select == ePrintMultiMachine) + wxPostEvent(m_plater, SimpleEvent(EVT_GLTOOLBAR_PRINT_MULTI_MACHINE));*/ }); m_slice_option_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent& event) @@ -1701,6 +1714,25 @@ wxBoxSizer* MainFrame::create_side_tools() p->Dismiss(); }); + p->append_button(print_plate_btn); + p->append_button(print_all_btn); + p->append_button(send_to_printer_btn); + p->append_button(send_to_printer_all_btn); + if (enable_multi_machine) { + SideButton* print_multi_machine_btn = new SideButton(p, _L("Send to Multi-device"), ""); + print_multi_machine_btn->SetCornerRadius(0); + print_multi_machine_btn->Bind(wxEVT_BUTTON, [this, p](wxCommandEvent&) { + m_print_btn->SetLabel(_L("Send to Multi-device")); + m_print_select = ePrintMultiMachine; + m_print_enable = get_enable_print_status(); + m_print_btn->Enable(m_print_enable); + this->Layout(); + p->Dismiss(); + }); + p->append_button(print_multi_machine_btn); + } + p->append_button(export_sliced_file_btn); + p->append_button(export_all_sliced_file_btn); SideButton* export_gcode_btn = new SideButton(p, _L("Export G-code file"), ""); export_gcode_btn->SetCornerRadius(0); export_gcode_btn->Bind(wxEVT_BUTTON, [this, p](wxCommandEvent&) { @@ -1710,13 +1742,7 @@ wxBoxSizer* MainFrame::create_side_tools() m_print_btn->Enable(m_print_enable); this->Layout(); p->Dismiss(); - }); - p->append_button(print_plate_btn); - p->append_button(print_all_btn); - p->append_button(send_to_printer_btn); - p->append_button(send_to_printer_all_btn); - p->append_button(export_sliced_file_btn); - p->append_button(export_all_sliced_file_btn); + }); p->append_button(export_gcode_btn); } @@ -1859,6 +1885,14 @@ bool MainFrame::get_enable_print_status() enable = false; } } + else if (m_print_select == ePrintMultiMachine) + { + if (!current_plate->is_slice_result_ready_for_print()) + { + enable = false; + } + enable = enable && !is_all_plates; + } BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": m_print_select %1%, enable= %2% ")%m_print_select %enable; @@ -1979,6 +2013,7 @@ void MainFrame::on_dpi_changed(const wxRect& suggested_rect) m_param_panel->msw_rescale(); m_project->msw_rescale(); m_monitor->msw_rescale(); + m_multi_machine->msw_rescale(); m_calibration->msw_rescale(); // BBS @@ -3290,6 +3325,13 @@ void MainFrame::jump_to_monitor(std::string dev_id) ((MonitorPanel*)m_monitor)->select_machine(dev_id); } +void MainFrame::jump_to_multipage() +{ + m_tabpanel->SetSelection(tpMultiDevice); + ((MultiMachinePage*)m_multi_machine)->jump_to_send_page(); +} + + //BBS GUI refactor: remove unused layout new/dlg void MainFrame::select_tab(size_t tab/* = size_t(-1)*/) { @@ -3655,6 +3697,10 @@ void MainFrame::update_side_preset_ui() //BBS: update the preset m_plater->sidebar().update_presets(Preset::TYPE_PRINTER); m_plater->sidebar().update_presets(Preset::TYPE_FILAMENT); + + + //take off multi machine + if(m_multi_machine){m_multi_machine->clear_page();} } void MainFrame::on_select_default_preset(SimpleEvent& evt) diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp index 9ef81a8b08..7c267f498c 100644 --- a/src/slic3r/GUI/MainFrame.hpp +++ b/src/slic3r/GUI/MainFrame.hpp @@ -32,6 +32,7 @@ #include "BBLTopbar.hpp" #include "PrinterWebView.hpp" #include "calib_dlg.hpp" +#include "MultiMachinePage.hpp" #define ENABEL_PRINT_ALL 0 @@ -98,6 +99,7 @@ class MainFrame : public DPIFrame wxMenuBar* m_menubar{ nullptr }; //wxMenu* publishMenu{ nullptr }; wxMenu * m_calib_menu{nullptr}; + bool enable_multi_machine{ false }; #if 0 wxMenuItem* m_menu_item_repeat { nullptr }; // doesn't used now @@ -199,21 +201,6 @@ protected: #endif public: - - //BBS GUI refactor - enum PrintSelectType - { - ePrintAll = 0, - ePrintPlate = 1, - eExportSlicedFile = 2, - eExportGcode = 3, - eSendGcode = 4, - eSendToPrinter = 5, - eSendToPrinterAll = 6, - eUploadGcode = 7, - eExportAllSlicedFile = 8 - }; - MainFrame(); ~MainFrame() = default; @@ -224,10 +211,11 @@ public: tp3DEditor = 1, tpPreview = 2, tpMonitor = 3, - tpProject = 4, - tpCalibration = 5, - tpAuxiliary = 6, - toDebugTool = 7, + tpMultiDevice = 4, + tpProject = 5, + tpCalibration = 6, + tpAuxiliary = 7, + toDebugTool = 8, }; //BBS: add slice&&print status update logic @@ -240,6 +228,20 @@ public: eEventPrintUpdate = 4 }; + // BBS GUI refactor + enum PrintSelectType { + ePrintAll = 0, + ePrintPlate = 1, + eExportSlicedFile = 2, + eExportGcode = 3, + eSendGcode = 4, + eSendToPrinter = 5, + eSendToPrinterAll = 6, + eUploadGcode = 7, + eExportAllSlicedFile = 8, + ePrintMultiMachine = 9 + }; + void update_layout(); // Called when closing the application and when switching the application language. @@ -308,6 +310,7 @@ public: void load_config(const DynamicPrintConfig& config); //BBS: jump to monitor void jump_to_monitor(std::string dev_id = ""); + void jump_to_multipage(); //BBS: hint when jump to 3Deditor under preview only mode bool preview_only_hint(); // Select tab in m_tabpanel @@ -361,6 +364,7 @@ public: MonitorPanel* m_monitor{ nullptr }; //AuxiliaryPanel* m_auxiliary{ nullptr }; + MultiMachinePage* m_multi_machine{ nullptr }; ProjectPanel* m_project{ nullptr }; CalibrationPanel* m_calibration{ nullptr }; @@ -413,6 +417,7 @@ wxDECLARE_EVENT(EVT_CHECK_PRIVACY_VER, wxCommandEvent); wxDECLARE_EVENT(EVT_CHECK_PRIVACY_SHOW, wxCommandEvent); wxDECLARE_EVENT(EVT_SHOW_IP_DIALOG, wxCommandEvent); wxDECLARE_EVENT(EVT_SET_SELECTED_MACHINE, wxCommandEvent); +wxDECLARE_EVENT(EVT_UPDATE_MACHINE_LIST, wxCommandEvent); wxDECLARE_EVENT(EVT_UPDATE_PRESET_CB, SimpleEvent); diff --git a/src/slic3r/GUI/MediaFilePanel.cpp b/src/slic3r/GUI/MediaFilePanel.cpp index 944006f3c4..b2032b09ad 100644 --- a/src/slic3r/GUI/MediaFilePanel.cpp +++ b/src/slic3r/GUI/MediaFilePanel.cpp @@ -120,7 +120,7 @@ MediaFilePanel::MediaFilePanel(wxWindow * parent) m_button_management->SetTextColorNormal(*wxWHITE); m_button_management->Enable(false); m_button_refresh->SetBorderWidth(0); - m_button_refresh->SetBackgroundColorNormal(wxColor("#00AE42")); + m_button_refresh->SetBackgroundColorNormal(wxColor("#009688")); m_button_refresh->SetTextColorNormal(*wxWHITE); m_button_refresh->Enable(false); diff --git a/src/slic3r/GUI/MediaPlayCtrl.cpp b/src/slic3r/GUI/MediaPlayCtrl.cpp index bdc3de924e..b69ea2b8b2 100644 --- a/src/slic3r/GUI/MediaPlayCtrl.cpp +++ b/src/slic3r/GUI/MediaPlayCtrl.cpp @@ -546,6 +546,13 @@ void MediaPlayCtrl::msw_rescale() { m_button_play->Rescale(); } +void MediaPlayCtrl::jump_to_play() +{ + if (m_last_state != MEDIASTATE_IDLE) + return; + TogglePlay(); +} + void MediaPlayCtrl::onStateChanged(wxMediaEvent &event) { auto last_state = m_last_state; diff --git a/src/slic3r/GUI/MediaPlayCtrl.h b/src/slic3r/GUI/MediaPlayCtrl.h index c4e088876c..f6e8d0dbec 100644 --- a/src/slic3r/GUI/MediaPlayCtrl.h +++ b/src/slic3r/GUI/MediaPlayCtrl.h @@ -42,6 +42,8 @@ public: void msw_rescale(); + void jump_to_play(); + protected: void onStateChanged(wxMediaEvent & event); diff --git a/src/slic3r/GUI/Monitor.cpp b/src/slic3r/GUI/Monitor.cpp index dfb3ef974c..333f4d3de0 100644 --- a/src/slic3r/GUI/Monitor.cpp +++ b/src/slic3r/GUI/Monitor.cpp @@ -132,6 +132,8 @@ AddMachinePanel::~AddMachinePanel() { update_hms_tag(); e.Skip(); }); + + Bind(EVT_JUMP_TO_HMS, &MonitorPanel::jump_to_HMS, this); } MonitorPanel::~MonitorPanel() @@ -196,7 +198,7 @@ MonitorPanel::~MonitorPanel() m_tabpanel->AddPage(m_upgrade_panel, _L("Update"), "", false); m_hms_panel = new HMSPanel(m_tabpanel); - m_tabpanel->AddPage(m_hms_panel, _L("HMS"),"", false); + m_tabpanel->AddPage(m_hms_panel, "HMS","", false); m_initialized = true; show_status((int)MonitorStatus::MONITOR_NO_PRINTER); @@ -530,5 +532,34 @@ Freeze(); Thaw(); } +std::string MonitorPanel::get_string_from_tab(PrinterTab tab) +{ + switch (tab) { + case PT_STATUS : + return "status"; + case PT_MEDIA: + return "sd_card"; + case PT_UPDATE: + return "update"; + case PT_HMS: + return "HMS"; + case PT_DEBUG: + return "debug"; + default: + return ""; + } + return ""; +} + +void MonitorPanel::jump_to_HMS(wxCommandEvent& e) +{ + if (!this->IsShown()) + return; + auto page = m_tabpanel->GetCurrentPage(); + if (page && page != m_hms_panel) + m_tabpanel->SetSelection(PT_HMS); +} + + } // GUI } // Slic3r diff --git a/src/slic3r/GUI/Monitor.hpp b/src/slic3r/GUI/Monitor.hpp index 715e3e0c17..8da56ddc3b 100644 --- a/src/slic3r/GUI/Monitor.hpp +++ b/src/slic3r/GUI/Monitor.hpp @@ -148,11 +148,15 @@ public: void update_side_panel(); void show_status(int status); + std::string get_string_from_tab(PrinterTab tab); + MachineObject *obj { nullptr }; std::string last_conn_type = "undedefined"; void stop_update() {update_flag = false;}; void start_update() {update_flag = true;}; + + void jump_to_HMS(wxCommandEvent& e); }; diff --git a/src/slic3r/GUI/MsgDialog.cpp b/src/slic3r/GUI/MsgDialog.cpp index 3e4380a566..4dd700fd46 100644 --- a/src/slic3r/GUI/MsgDialog.cpp +++ b/src/slic3r/GUI/MsgDialog.cpp @@ -550,7 +550,7 @@ Newer3mfVersionDialog::Newer3mfVersionDialog(wxWindow *parent, const Semver *fil , m_new_keys(new_keys) { this->SetBackgroundColour(*wxWHITE); - std::string icon_path = (boost::format("%1%/images/BambuStudioTitle.ico") % resources_dir()).str(); + std::string icon_path = (boost::format("%1%/images/OrcaSlicerTitle.ico") % resources_dir()).str(); SetIcon(wxIcon(encode_path(icon_path.c_str()), wxBITMAP_TYPE_ICO)); wxBoxSizer *main_sizer = new wxBoxSizer(wxVERTICAL); @@ -614,8 +614,8 @@ wxBoxSizer *Newer3mfVersionDialog::get_btn_sizer() { wxBoxSizer *horizontal_sizer = new wxBoxSizer(wxHORIZONTAL); horizontal_sizer->Add(0, 0, 1, wxEXPAND, 0); - StateColor btn_bg_green(std::pair(wxColour(27, 136, 68), StateColor::Pressed), std::pair(wxColour(61, 203, 115), StateColor::Hovered), - std::pair(wxColour(0, 174, 66), StateColor::Normal)); + StateColor btn_bg_green(std::pair(wxColour(0, 137, 123), StateColor::Pressed), std::pair(wxColour(38, 166, 154), StateColor::Hovered), + std::pair(wxColour(0, 150, 136), StateColor::Normal)); StateColor btn_bg_white(std::pair(wxColour(206, 206, 206), StateColor::Pressed), std::pair(wxColour(238, 238, 238), StateColor::Hovered), std::pair(*wxWHITE, StateColor::Normal)); bool file_version_newer = (*m_file_version) > (*m_cloud_version); diff --git a/src/slic3r/GUI/MultiMachine.cpp b/src/slic3r/GUI/MultiMachine.cpp new file mode 100644 index 0000000000..fc7f91daa7 --- /dev/null +++ b/src/slic3r/GUI/MultiMachine.cpp @@ -0,0 +1,268 @@ +#include "MultiMachine.hpp" +#include "I18N.hpp" + +#include "GUI_App.hpp" +#include "MainFrame.hpp" + +namespace Slic3r { +namespace GUI { + + +wxDEFINE_EVENT(EVT_MULTI_CLOUD_TASK_SELECTED, wxCommandEvent); +wxDEFINE_EVENT(EVT_MULTI_LOCAL_TASK_SELECTED, wxCommandEvent); +wxDEFINE_EVENT(EVT_MULTI_DEVICE_SELECTED, wxCommandEvent); +wxDEFINE_EVENT(EVT_MULTI_DEVICE_SELECTED_FINHSH, wxCommandEvent); +wxDEFINE_EVENT(EVT_MULTI_DEVICE_VIEW, wxCommandEvent); +wxDEFINE_EVENT(EVT_MULTI_REFRESH, wxCommandEvent); + +DeviceItem::DeviceItem(wxWindow* parent, MachineObject* obj) + : wxWindow(parent, wxID_ANY) + , obj_(obj) +{ + sync_state(); + Bind(EVT_MULTI_REFRESH, &DeviceItem::on_refresh, this); +} + +void DeviceItem::on_refresh(wxCommandEvent& evt) +{ + Refresh(); +} + +void DeviceItem::sync_state() +{ + if (obj_) { + state_online = obj_->is_online(); + state_dev_name = obj_->dev_name; + + //printable + if (obj_->print_status == "IDLE") { + state_printable = 0; + } + else if (obj_->print_status == "FINISH") { + state_printable = 1; + } + else if (obj_->print_status == "FAILED") { + state_printable = 2; + } + else if (obj_->is_in_printing()) { + state_printable = 3; + } + else { + state_printable = 6; + } + + if (is_blocking_printing(obj_)) { + state_printable = 5; + } + + if (obj_->is_in_upgrading()) { + state_printable = 4; + } + + state_enable_ams = obj_->ams_exist_bits; + + + //device + if (obj_->print_status == "IDLE") { + state_device = 0; + } + else if (obj_->print_status == "FINISH") { + state_device = 1; + } + else if (obj_->print_status == "FAILED") { + state_device = 2; + } + else if (obj_->print_status == "RUNNING") { + state_device = 3; + } + else if (obj_->print_status == "PAUSE") { + state_device = 4; + } + else if (obj_->print_status == "PREPARE") { + state_device = 5; + } + else if (obj_->print_status == "SLICING") { + state_device = 6; + } + else { + state_device = 7; + } + } +} + +void DeviceItem::selected() +{ + if (state_selected != 2) { + state_selected = 1; + } +} + +void DeviceItem::unselected() +{ + if (state_selected != 2) { + state_selected = 0; + } +} + +bool DeviceItem::is_blocking_printing(MachineObject* obj_) +{ + DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (!dev) return true; + auto target_model = obj_->printer_type; + std::string source_model = ""; + + PresetBundle* preset_bundle = wxGetApp().preset_bundle; + source_model = preset_bundle->printers.get_edited_preset().get_printer_type(preset_bundle); + + if (source_model != target_model) { + std::vector compatible_machine = dev->get_compatible_machine(target_model); + vector::iterator it = find(compatible_machine.begin(), compatible_machine.end(), source_model); + if (it == compatible_machine.end()) { + return true; + } + } + + return false; +} + +void DeviceItem::update_item(const DeviceItem* item) +{ + // Except for the selected status, everything else is updated + if (this == item) + return; + this->state_online = item->state_online; + this->state_printable = item->state_printable; + this->state_enable_ams = item->state_enable_ams; + this->state_device = item->state_device; + this->state_local_task = item->state_local_task; +} + +wxString DeviceItem::get_state_printable() +{ + //0-idle 1-finish 2-printing 3-upgrading 4-preset incompatible 5-unknown + std::vector str_state_printable; + str_state_printable.push_back(_L("Idle")); + str_state_printable.push_back(_L("Idle")); + str_state_printable.push_back(_L("Idle")); + str_state_printable.push_back(_L("Printing")); + str_state_printable.push_back(_L("Upgrading")); + str_state_printable.push_back(_L("Incompatible")); + str_state_printable.push_back(_L("syncing")); + + return str_state_printable[state_printable]; +} + +wxString DeviceItem::get_state_device() +{ + //0-idle 1-finish 2-running 3-pause 4-failed 5-prepare + std::vector str_state_device; + str_state_device.push_back(_L("Idle")); + str_state_device.push_back(_L("Printing Finish")); + str_state_device.push_back(_L("Printing Failed")); + str_state_device.push_back(_L("Printing")); + str_state_device.push_back(_L("PrintingPause")); + str_state_device.push_back(_L("Prepare")); + str_state_device.push_back(_L("Slicing")); + str_state_device.push_back(_L("syncing")); + + return str_state_device[state_device]; +} + +wxString DeviceItem::get_local_state_task() +{ + //0-padding 1-sending 2-sending finish 3-sending cancel 4-sending failed 5-Removed + std::vector str_state_task; + str_state_task.push_back(_L("Pending")); + str_state_task.push_back(_L("Sending")); + str_state_task.push_back(_L("Sending Finish")); + str_state_task.push_back(_L("Sending Cancel")); + str_state_task.push_back(_L("Sending Failed")); + str_state_task.push_back(_L("Printing")); + str_state_task.push_back(_L("Print Success")); + str_state_task.push_back(_L("Print Failed")); + str_state_task.push_back(_L("Removed")); + str_state_task.push_back(_L("Idle")); + return str_state_task[state_local_task]; +} + +wxString DeviceItem::get_cloud_state_task() +{ + //0-printing 1-printing finish 2-printing failed + std::vector str_state_task; + str_state_task.push_back(_L("Printing")); + str_state_task.push_back(_L("Printing Finish")); + str_state_task.push_back(_L("Printing Failed")); + + return str_state_task[state_cloud_task]; +} + + +std::vector selected_machines(const std::vector& dev_item_list, std::string search_text) +{ + std::vector res; + for (const auto& item : dev_item_list) { + const MachineObject* dev = item->get_obj(); + const std::string& dev_name = dev->dev_name; + const std::string& dev_ip = dev->dev_ip; + + auto name_it = dev_name.find(search_text); + auto ip_it = dev_ip.find(search_text); + + if (name_it != std::string::npos || ip_it != std::string::npos) + res.emplace_back(item); + } + + return res; +} + +SortItem::SortItem() +{ + sort_map.emplace(std::make_pair(SortRule::SR_None, [this](const DeviceItem* d1, const DeviceItem* d2) { + return d1->state_dev_name > d2->state_dev_name; + })); + sort_map.emplace(std::make_pair(SortRule::SR_DEV_NAME, [this](const DeviceItem* d1, const DeviceItem* d2) { + return this->big ? d1->state_dev_name > d2->state_dev_name : d1->state_dev_name < d2->state_dev_name; + })); + sort_map.emplace(std::make_pair(SortRule::SR_ONLINE, [this](const DeviceItem* d1, const DeviceItem* d2) { + return this->big ? d1->state_online > d2->state_online : d1->state_online < d2->state_online; + })); + sort_map.emplace(std::make_pair(SortRule::SR_PRINTABLE, [this](const DeviceItem* d1, const DeviceItem* d2) { + return this->big ? d1->state_printable > d2->state_printable : d1->state_printable < d2->state_printable; + })); + sort_map.emplace(std::make_pair(SortRule::SR_EN_AMS, [this](const DeviceItem* d1, const DeviceItem* d2) { + return this->big ? d1->state_enable_ams > d2->state_enable_ams : d1->state_enable_ams < d2->state_enable_ams; + })); + sort_map.emplace(std::make_pair(SortRule::SR_DEV_STATE, [this](const DeviceItem* d1, const DeviceItem* d2) { + return this->big ? d1->state_device > d2->state_device : d1->state_device < d2->state_device; + })); + sort_map.emplace(std::make_pair(SortRule::SR_LOCAL_TASK_STATE, [this](const DeviceItem* d1, const DeviceItem* d2) { + return this->big ? d1->state_local_task > d2->state_local_task : d1->state_local_task < d2->state_local_task; + })); + sort_map.emplace(std::make_pair(SortRule::SR_CLOUD_TASK_STATE, [this](const DeviceItem* d1, const DeviceItem* d2) { + return this->big ? d1->state_cloud_task > d2->state_cloud_task : d1->state_cloud_task < d2->state_cloud_task; + })); + sort_map.emplace(std::make_pair(SortRule::SR_SEND_TIME, [this](const DeviceItem* d1, const DeviceItem* d2) { + return this->big ? d1->m_send_time > d2->m_send_time : d1->m_send_time < d2->m_send_time; + })); +} + +SortItem::SortCallBack SortItem::get_call_back() +{ + return sort_map[rule]; +} + +void SortItem::set_role(SortRule rule, bool big) +{ + this->rule = rule; + this->big = big; +} + +void SortItem::set_role(SortMultiMachineCB cb, SortRule rl, bool big) +{ + this->cb = cb; + this->rule = rl; + this->big = big; +} + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/MultiMachine.hpp b/src/slic3r/GUI/MultiMachine.hpp new file mode 100644 index 0000000000..48a6ed4180 --- /dev/null +++ b/src/slic3r/GUI/MultiMachine.hpp @@ -0,0 +1,121 @@ +#ifndef slic3r_MultiMachine_hpp_ +#define slic3r_MultiMachine_hpp_ + +#include "GUI_Utils.hpp" +#include "DeviceManager.hpp" +#include + +namespace Slic3r { +namespace GUI { + + +#define DEVICE_ITEM_MAX_WIDTH 900 +#define SEND_ITEM_MAX_HEIGHT 30 +#define DEVICE_ITEM_MAX_HEIGHT 50 + +#define TABLE_HEAR_NORMAL_COLOUR wxColour(238, 238, 238) +#define TABLE_HEAD_PRESSED_COLOUR wxColour(150, 150, 150) +#define CTRL_BUTTON_NORMAL_COLOUR wxColour(255, 255, 255) +#define CTRL_BUTTON_PRESSEN_COLOUR wxColour(150, 150, 150) +#define TABLE_HEAD_FONT Label::Body_13 +#define ICON_SIZE FromDIP(16) + +class DeviceItem : public wxWindow +{ +public: + MachineObject* obj_{nullptr}; + int state_online = { 0 }; //0-Offline 1-Online + std::string state_dev_name; //device name + int state_printable{ 0 }; //0-idle 1-finish 2-failed 3-printing 4-upgrading 5-preset incompatible 6-unknown + int state_selected{ 0 }; //0-selected 1-unselected 2-un selectable + int state_enable_ams{ 0 };//0-no ams 1-enabled ams 2-not enabled ams + int state_device{ 0 }; //0-idle 1-finish 2-failed 3-running 4-pause 5-prepare 6-slicing 7-removed + int state_local_task{ 0 }; //0-padding 1-sending 2-sending finish 3-sending cancel 4-sending failed 5-TS_PRINT_SUCCESS 6- TS_PRINT_FAILED 7-TS_REMOVED 8-TS_IDLE + int state_cloud_task{ 0 }; //0-printing 1-printing finish 2-printing failed + int state_optional{0}; //0-Not optional 1-Optional + std::string m_send_time; + +public: + + DeviceItem(wxWindow* parent, MachineObject* obj); + ~DeviceItem() {}; + + void on_refresh(wxCommandEvent& evt); + void sync_state(); + wxString get_state_printable(); + wxString get_state_device(); + wxString get_local_state_task(); + wxString get_cloud_state_task(); + MachineObject* get_obj() const { return obj_; } + + int get_state_online() const { return state_online; } + int get_state_printable() const { return state_printable; } + int get_state_selected() const { return state_selected; } + int get_state_enable_ams() const { return state_enable_ams; } + int get_state_device() const { return state_device; } + int get_state_local_task() const { return state_local_task; } + int get_state_cloud_task() const { return state_cloud_task; } + std::string get_state_dev_name() const { return state_dev_name; } + + void selected(); + void unselected(); + bool is_blocking_printing(MachineObject* obj_); + void update_item(const DeviceItem* item); +}; + +std::vector selected_machines(const std::vector& dev_item_list, std::string search_text); + +struct ObjState +{ + std::string dev_id; + std::string state_dev_name; + int state_device{ 0 }; +}; + +struct SortItem +{ + typedef std::function SortCallBack; + typedef std::function SortMultiMachineCB; + + enum SortRule : uint8_t + { + SR_None = 0, + SR_DEV_NAME = 1, + SR_ONLINE, + SR_PRINTABLE, + SR_EN_AMS, + SR_DEV_STATE, + SR_LOCAL_TASK_STATE, + SR_CLOUD_TASK_STATE, + SR_SEND_TIME, + SR_MACHINE_NAME, + SR_MACHINE_STATE, + SR_COUNT + }; + + SortRule rule{ SortRule::SR_None }; + bool big{ true }; + std::unordered_map sort_map; + SortMultiMachineCB cb; + + SortItem(); + SortItem(SortRule sr) { rule = sr; } + + SortCallBack get_call_back(); + void set_role(SortRule rule, bool big); + void set_role(SortMultiMachineCB cb, SortRule rl, bool big); + SortMultiMachineCB get_machine_call_back() const { return cb; } +}; + + +wxDECLARE_EVENT(EVT_MULTI_DEVICE_SELECTED, wxCommandEvent); +wxDECLARE_EVENT(EVT_MULTI_DEVICE_SELECTED_FINHSH, wxCommandEvent); +wxDECLARE_EVENT(EVT_MULTI_DEVICE_VIEW, wxCommandEvent); +wxDECLARE_EVENT(EVT_MULTI_CLOUD_TASK_SELECTED, wxCommandEvent); +wxDECLARE_EVENT(EVT_MULTI_LOCAL_TASK_SELECTED, wxCommandEvent); +wxDECLARE_EVENT(EVT_MULTI_REFRESH, wxCommandEvent); + +} // namespace GUI +} // namespace Slic3r + +#endif diff --git a/src/slic3r/GUI/MultiMachineManagerPage.cpp b/src/slic3r/GUI/MultiMachineManagerPage.cpp new file mode 100644 index 0000000000..27898b78fa --- /dev/null +++ b/src/slic3r/GUI/MultiMachineManagerPage.cpp @@ -0,0 +1,725 @@ +#include "MultiMachineManagerPage.hpp" +#include "GUI_App.hpp" +#include "MainFrame.hpp" + +namespace Slic3r { +namespace GUI { + +MultiMachineItem::MultiMachineItem(wxWindow* parent, MachineObject* obj) + : DeviceItem(parent, obj) +{ + SetBackgroundColour(*wxWHITE); + SetMinSize(wxSize(FromDIP(DEVICE_ITEM_MAX_WIDTH), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + SetMaxSize(wxSize(FromDIP(DEVICE_ITEM_MAX_WIDTH), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + + Bind(wxEVT_PAINT, &MultiMachineItem::paintEvent, this); + Bind(wxEVT_ENTER_WINDOW, &MultiMachineItem::OnEnterWindow, this); + Bind(wxEVT_LEAVE_WINDOW, &MultiMachineItem::OnLeaveWindow, this); + Bind(wxEVT_LEFT_DOWN, &MultiMachineItem::OnLeftDown, this); + Bind(wxEVT_MOTION, &MultiMachineItem::OnMove, this); + Bind(EVT_MULTI_DEVICE_VIEW, [this, obj](auto& e) { + wxGetApp().mainframe->jump_to_monitor(obj->dev_id); + if (wxGetApp().mainframe->m_monitor->get_status_panel()->get_media_play_ctrl()) { + wxGetApp().mainframe->m_monitor->get_status_panel()->get_media_play_ctrl()->jump_to_play(); + } + }); + wxGetApp().UpdateDarkUIWin(this); +} + +void MultiMachineItem::OnEnterWindow(wxMouseEvent& evt) +{ + m_hover = true; + Refresh(); +} + +void MultiMachineItem::OnLeaveWindow(wxMouseEvent& evt) +{ + m_hover = false; + Refresh(); +} + +void MultiMachineItem::OnLeftDown(wxMouseEvent& evt) +{ + int left = FromDIP(DEVICE_LEFT_PADDING_LEFT + + DEVICE_LEFT_DEV_NAME + + DEVICE_LEFT_PRO_NAME + + DEVICE_LEFT_PRO_INFO); + auto mouse_pos = ClientToScreen(evt.GetPosition()); + auto item = this->ClientToScreen(wxPoint(0, 0)); + + if (mouse_pos.x > (item.x + left) && + mouse_pos.x < (item.x + left + FromDIP(90)) && + mouse_pos.y > item.y && + mouse_pos.y < (item.y + DEVICE_ITEM_MAX_HEIGHT)) { + post_event(wxCommandEvent(EVT_MULTI_DEVICE_VIEW)); + } +} + +void MultiMachineItem::OnMove(wxMouseEvent& evt) +{ + int left = FromDIP(DEVICE_LEFT_PADDING_LEFT + + DEVICE_LEFT_DEV_NAME + + DEVICE_LEFT_PRO_NAME + + DEVICE_LEFT_PRO_INFO); + + auto mouse_pos = ClientToScreen(evt.GetPosition()); + auto item = this->ClientToScreen(wxPoint(0, 0)); + + if (mouse_pos.x > (item.x + left) && + mouse_pos.x < (item.x + left + FromDIP(90)) && + mouse_pos.y > item.y && + mouse_pos.y < (item.y + DEVICE_ITEM_MAX_HEIGHT)) { + SetCursor(wxCURSOR_HAND); + } + else { + SetCursor(wxCURSOR_ARROW); + } +} + +void MultiMachineItem::paintEvent(wxPaintEvent& evt) +{ + wxPaintDC dc(this); + render(dc); +} + +void MultiMachineItem::render(wxDC& dc) +{ +#ifdef __WXMSW__ + wxSize size = GetSize(); + wxMemoryDC memdc; + wxBitmap bmp(size.x, size.y); + memdc.SelectObject(bmp); + memdc.Blit({ 0, 0 }, size, &dc, { 0, 0 }); + + { + wxGCDC dc2(memdc); + doRender(dc2); + } + + memdc.SelectObject(wxNullBitmap); + dc.DrawBitmap(bmp, 0, 0); +#else + doRender(dc); +#endif +} + +void MultiMachineItem::DrawTextWithEllipsis(wxDC& dc, const wxString& text, int maxWidth, int left, int top) { + wxSize size = GetSize(); + wxFont font = dc.GetFont(); + + wxSize textSize = dc.GetTextExtent(text); + dc.SetTextForeground(StateColor::darkModeColorFor(wxColour(50, 58, 61))); + int textWidth = textSize.GetWidth(); + + if (textWidth > maxWidth) { + wxString truncatedText = text; + int ellipsisWidth = dc.GetTextExtent("...").GetWidth(); + int numChars = text.length(); + + for (int i = numChars - 1; i >= 0; --i) { + truncatedText = text.substr(0, i) + "..."; + int truncatedWidth = dc.GetTextExtent(truncatedText).GetWidth(); + + if (truncatedWidth <= maxWidth - ellipsisWidth) { + break; + } + } + + if (top == 0) { + dc.DrawText(truncatedText, left, (size.y - textSize.y) / 2); + } + else { + dc.DrawText(truncatedText, left, (size.y - textSize.y) / 2 - top); + } + + } + else { + if (top == 0) { + dc.DrawText(text, left, (size.y - textSize.y) / 2); + } + else { + dc.DrawText(text, left, (size.y - textSize.y) / 2 - top); + } + } +} + +void MultiMachineItem::doRender(wxDC& dc) +{ + wxSize size = GetSize(); + dc.SetPen(wxPen(*wxBLACK)); + + int left = FromDIP(DEVICE_LEFT_PADDING_LEFT); + + if (obj_) { + //dev name + wxString dev_name = wxString::FromUTF8(obj_->dev_name); + if (!obj_->is_online()) { + dev_name = dev_name + "(" + _L("Offline") + ")"; + } + dc.SetFont(Label::Body_13); + DrawTextWithEllipsis(dc, dev_name, FromDIP(DEVICE_LEFT_DEV_NAME), left); + left += FromDIP(DEVICE_LEFT_DEV_NAME); + + //project name + wxString project_name = _L("No task"); + if (obj_->is_in_printing()) { + project_name = wxString::Format("%s", GUI::from_u8(obj_->subtask_name)); + } + dc.SetFont(Label::Body_13); + DrawTextWithEllipsis(dc, project_name, FromDIP(DEVICE_LEFT_PRO_NAME), left); + left += FromDIP(DEVICE_LEFT_PRO_NAME); + + //state + dc.SetFont(Label::Body_13); + if (state_device == 0) { + dc.SetTextForeground(*wxBLACK); + DrawTextWithEllipsis(dc, get_state_device(), FromDIP(DEVICE_LEFT_PRO_INFO), left); + } + else if (state_device == 1) { + dc.SetTextForeground(wxColour(0,174,66)); + DrawTextWithEllipsis(dc, get_state_device(), FromDIP(DEVICE_LEFT_PRO_INFO), left); + } + else if (state_device == 2) + { + dc.SetTextForeground(wxColour(208,27,27)); + DrawTextWithEllipsis(dc, get_state_device(), FromDIP(DEVICE_LEFT_PRO_INFO), left); + } + else if (state_device > 2 && state_device < 7) { + dc.SetFont(Label::Body_12); + dc.SetTextForeground(wxColour(0, 150, 136)); + if (obj_->get_curr_stage().IsEmpty() && obj_->subtask_) { + //wxString layer_info = wxString::Format(_L("Layer: %d/%d"), obj_->curr_layer, obj_->total_layers); + wxString progress_info = wxString::Format("%d", obj_->subtask_->task_progress); + wxString left_time = wxString::Format("%s", get_left_time(obj_->mc_left_time)); + + DrawTextWithEllipsis(dc, progress_info + "% | " + left_time, FromDIP(DEVICE_LEFT_PRO_INFO), left, FromDIP(10)); + + + dc.SetPen(wxPen(wxColour(233,233,233))); + dc.SetBrush(wxBrush(wxColour(233,233,233))); + dc.DrawRoundedRectangle(left, FromDIP(30), FromDIP(DEVICE_LEFT_PRO_INFO), FromDIP(10), 2); + + dc.SetPen(wxPen(wxColour(0, 150, 136))); + dc.SetBrush(wxBrush(wxColour(0, 150, 136))); + dc.DrawRoundedRectangle(left, FromDIP(30), FromDIP(DEVICE_LEFT_PRO_INFO) * (static_cast(obj_->subtask_->task_progress) / 100.0f), FromDIP(10), 2); + } + else { + DrawTextWithEllipsis(dc, obj_->get_curr_stage(), FromDIP(DEVICE_LEFT_PRO_INFO), left); + } + + } + else { + dc.SetTextForeground(*wxBLACK); + DrawTextWithEllipsis(dc, get_state_device(), FromDIP(DEVICE_LEFT_PRO_INFO), left); + } + + left += FromDIP(DEVICE_LEFT_PRO_INFO); + + //button + dc.SetPen(wxPen(wxColour(38, 46, 48))); + dc.SetBrush(wxBrush(wxColour(*wxWHITE))); + dc.DrawRoundedRectangle(left, (size.y - FromDIP(38)) / 2, FromDIP(90), FromDIP(38), 6); + dc.SetFont(Label::Body_14); + dc.SetTextForeground(*wxBLACK); + dc.DrawText(_L("View"),left + FromDIP(90) / 2 - dc.GetTextExtent(_L("View")).x / 2, (size.y -dc.GetTextExtent(_L("View")).y) / 2); + + } + + if (m_hover) { + dc.SetPen(wxPen(wxColour(0, 150, 136))); + dc.SetBrush(*wxTRANSPARENT_BRUSH); + dc.DrawRoundedRectangle(0, 0, size.x, size.y, 3); + } +} + +void MultiMachineItem::post_event(wxCommandEvent&& event) +{ + event.SetEventObject(this); + event.SetString(obj_->dev_id); + event.SetInt(state_selected); + wxPostEvent(this, event); +} + +void MultiMachineItem::DoSetSize(int x, int y, int width, int height, int sizeFlags /*= wxSIZE_AUTO*/) +{ + wxWindow::DoSetSize(x, y, width, height, sizeFlags); +} + +wxString MultiMachineItem::get_left_time(int mc_left_time) +{ + // update gcode progress + std::string left_time; + wxString left_time_text = _L("N/A"); + + try { + left_time = get_bbl_monitor_time_dhm(mc_left_time); + } + catch (...) { + ; + } + + if (!left_time.empty()) left_time_text = wxString::Format("-%s", left_time); + return left_time_text; +} + + +MultiMachineManagerPage::MultiMachineManagerPage(wxWindow* parent) + : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL) +{ +#ifdef __WINDOWS__ + SetDoubleBuffered(true); +#endif //__WINDOWS__ + SetBackgroundColour(wxColour(0xEEEEEE)); + m_main_panel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); + m_main_panel->SetBackgroundColour(*wxWHITE); + m_main_sizer = new wxBoxSizer(wxVERTICAL); + + StateColor head_bg( + std::pair(TABLE_HEAD_PRESSED_COLOUR, StateColor::Pressed), + std::pair(TABLE_HEAR_NORMAL_COLOUR, StateColor::Normal) + ); + + //edit prints + auto m_btn_bg_enable = StateColor( + std::pair(wxColour(0, 137, 123), StateColor::Pressed), + std::pair(wxColour(38, 166, 154), StateColor::Hovered), + std::pair(wxColour(0, 150, 136), StateColor::Normal) + ); + + + StateColor clean_bg(std::pair(wxColour(255, 255, 255), StateColor::Disabled), std::pair(wxColour(206, 206, 206), StateColor::Pressed), + std::pair(wxColour(238, 238, 238), StateColor::Hovered), std::pair(wxColour(255, 255, 255), StateColor::Enabled), + std::pair(wxColour(255, 255, 255), StateColor::Normal)); + StateColor clean_bd(std::pair(wxColour(144, 144, 144), StateColor::Disabled), std::pair(wxColour(38, 46, 48), StateColor::Enabled)); + StateColor clean_text(std::pair(wxColour(144, 144, 144), StateColor::Disabled), std::pair(wxColour(38, 46, 48), StateColor::Enabled)); + + auto sizer_button_printer = new wxBoxSizer(wxHORIZONTAL); + sizer_button_printer->SetMinSize(wxSize(FromDIP(DEVICE_ITEM_MAX_WIDTH), -1)); + m_button_edit = new Button(m_main_panel, _L("Edit Printers")); + m_button_edit->SetBackgroundColor(clean_bg); + m_button_edit->SetBorderColor(clean_bd); + m_button_edit->SetTextColor(clean_text); + m_button_edit->SetFont(Label::Body_12); + m_button_edit->SetCornerRadius(6); + m_button_edit->SetMinSize(wxSize(FromDIP(90), FromDIP(36))); + m_button_edit->SetMaxSize(wxSize(FromDIP(90), FromDIP(36))); + + m_button_edit->Bind(wxEVT_BUTTON, [this](wxCommandEvent& evt) { + MultiMachinePickPage dlg; + dlg.ShowModal(); + refresh_user_device(); + evt.Skip(); + }); + + sizer_button_printer->Add( 0, 0, 1, wxEXPAND, 5 ); + sizer_button_printer->Add(m_button_edit, 0, wxALIGN_CENTER, 0); + + m_table_head_panel = new wxPanel(m_main_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize); + m_table_head_panel->SetMinSize(wxSize(FromDIP(DEVICE_ITEM_MAX_WIDTH), -1)); + m_table_head_panel->SetMaxSize(wxSize(FromDIP(DEVICE_ITEM_MAX_WIDTH), -1)); + m_table_head_panel->SetBackgroundColour(TABLE_HEAR_NORMAL_COLOUR); + m_table_head_sizer = new wxBoxSizer(wxHORIZONTAL); + + m_printer_name = new Button(m_table_head_panel, _L("Device Name"), "toolbar_double_directional_arrow", wxNO_BORDER, ICON_SIZE); + m_printer_name->SetBackgroundColor(head_bg); + m_printer_name->SetFont(TABLE_HEAD_FONT); + m_printer_name->SetCornerRadius(0); + m_printer_name->SetMinSize(wxSize(FromDIP(DEVICE_LEFT_DEV_NAME), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_printer_name->SetMaxSize(wxSize(FromDIP(DEVICE_LEFT_DEV_NAME), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_printer_name->SetCenter(false); + m_printer_name->Bind(wxEVT_ENTER_WINDOW, [&](wxMouseEvent& evt) { + SetCursor(wxCURSOR_HAND); + }); + m_printer_name->Bind(wxEVT_LEAVE_WINDOW, [&](wxMouseEvent& evt) { + SetCursor(wxCURSOR_ARROW); + }); + m_printer_name->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& evt) { + device_dev_name_big = !device_dev_name_big; + auto sortcb = [this](ObjState s1, ObjState s2) { + return device_dev_name_big ? s1.state_dev_name > s2.state_dev_name : s1.state_dev_name < s2.state_dev_name; + }; + this->m_sort.set_role(sortcb, SortItem::SR_MACHINE_NAME, device_dev_name_big); + this->refresh_user_device(); + }); + + + m_task_name = new Button(m_table_head_panel, _L("Task Name"), "", wxNO_BORDER, ICON_SIZE); + m_task_name->SetBackgroundColor(TABLE_HEAR_NORMAL_COLOUR); + m_task_name->SetFont(TABLE_HEAD_FONT); + m_task_name->SetCornerRadius(0); + m_task_name->SetMinSize(wxSize(FromDIP(DEVICE_LEFT_DEV_NAME), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_task_name->SetMaxSize(wxSize(FromDIP(DEVICE_LEFT_DEV_NAME), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_task_name->SetCenter(false); + + + + m_status = new Button(m_table_head_panel, _L("Device Status"), "toolbar_double_directional_arrow", wxNO_BORDER, ICON_SIZE); + m_status->SetBackgroundColor(head_bg); + m_status->SetFont(TABLE_HEAD_FONT); + m_status->SetCornerRadius(0); + m_status->SetMinSize(wxSize(FromDIP(DEVICE_LEFT_PRO_INFO), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_status->SetMaxSize(wxSize(FromDIP(DEVICE_LEFT_PRO_INFO), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_status->SetCenter(false); + m_status->Bind(wxEVT_ENTER_WINDOW, [&](wxMouseEvent& evt) { + SetCursor(wxCURSOR_HAND); + }); + m_status->Bind(wxEVT_LEAVE_WINDOW, [&](wxMouseEvent& evt) { + SetCursor(wxCURSOR_ARROW); + }); + m_status->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& evt) { + device_state_big = !device_state_big; + auto sortcb = [this](ObjState s1, ObjState s2) { + return device_state_big ? s1.state_device > s2.state_device : s1.state_device < s2.state_device; + }; + this->m_sort.set_role(sortcb, SortItem::SortRule::SR_MACHINE_STATE, device_state_big); + this->refresh_user_device(); + }); + + + m_action = new Button(m_table_head_panel, _L("Actions"), "", wxNO_BORDER, ICON_SIZE, false); + m_action->SetBackgroundColor(TABLE_HEAR_NORMAL_COLOUR); + m_action->SetFont(TABLE_HEAD_FONT); + m_action->SetCornerRadius(0); + m_action->SetMinSize(wxSize(FromDIP(DEVICE_LEFT_PRO_NAME), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_action->SetMaxSize(wxSize(FromDIP(DEVICE_LEFT_PRO_NAME), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_action->SetCenter(false); + + + m_table_head_sizer->AddSpacer(FromDIP(DEVICE_LEFT_PADDING_LEFT)); + m_table_head_sizer->Add(m_printer_name, 0, wxALIGN_CENTER_VERTICAL, 0); + m_table_head_sizer->Add(m_task_name, 0, wxALIGN_CENTER_VERTICAL, 0); + m_table_head_sizer->Add(m_status, 0, wxALIGN_CENTER_VERTICAL, 0); + m_table_head_sizer->Add(m_action, 0, wxLEFT, 0); + + m_table_head_panel->SetSizer(m_table_head_sizer); + m_table_head_panel->Layout(); + + m_tip_text = new wxStaticText(m_main_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER); + m_tip_text->SetMinSize(wxSize(FromDIP(DEVICE_ITEM_MAX_WIDTH), -1)); + m_tip_text->SetMaxSize(wxSize(FromDIP(DEVICE_ITEM_MAX_WIDTH), -1)); + m_tip_text->SetLabel(_L("Please select the devices you would like to manage here (up to 6 devices)")); + m_tip_text->SetForegroundColour(wxColour(50, 58, 61)); + m_tip_text->SetFont(::Label::Head_20); + m_tip_text->Wrap(-1); + + m_button_add = new Button(m_main_panel, _L("Add")); + m_button_add->SetBackgroundColor(m_btn_bg_enable); + m_button_add->SetBorderColor(m_btn_bg_enable); + m_button_add->SetTextColor(*wxWHITE); + m_button_add->SetFont(Label::Body_12); + m_button_add->SetCornerRadius(6); + m_button_add->SetMinSize(wxSize(FromDIP(90), FromDIP(36))); + m_button_add->SetMaxSize(wxSize(FromDIP(90), FromDIP(36))); + + m_button_add->Bind(wxEVT_BUTTON, [this](wxCommandEvent& evt) { + MultiMachinePickPage dlg; + dlg.ShowModal(); + refresh_user_device(); + evt.Skip(); + }); + + m_machine_list = new wxScrolledWindow(m_main_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize); + m_machine_list->SetBackgroundColour(*wxWHITE); + m_machine_list->SetScrollRate(0, 5); + m_machine_list->SetMinSize(wxSize(FromDIP(DEVICE_ITEM_MAX_WIDTH), 10 * FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_machine_list->SetMaxSize(wxSize(FromDIP(DEVICE_ITEM_MAX_WIDTH), 10 * FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + + m_sizer_machine_list = new wxBoxSizer(wxVERTICAL); + m_machine_list->SetSizer(m_sizer_machine_list); + m_machine_list->Layout(); + + // add flipping page + StateColor ctrl_bg( + std::pair(CTRL_BUTTON_PRESSEN_COLOUR, StateColor::Pressed), + std::pair(CTRL_BUTTON_NORMAL_COLOUR, StateColor::Normal) + ); + + m_flipping_panel = new wxPanel(m_main_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize); + m_flipping_panel->SetMinSize(wxSize(FromDIP(DEVICE_ITEM_MAX_WIDTH), -1)); + m_flipping_panel->SetMaxSize(wxSize(FromDIP(DEVICE_ITEM_MAX_WIDTH), -1)); + m_flipping_panel->SetBackgroundColour(*wxWHITE); + + m_flipping_page_sizer = new wxBoxSizer(wxHORIZONTAL); + m_page_sizer = new wxBoxSizer(wxVERTICAL); + btn_last_page = new Button(m_flipping_panel, "", "go_last_plate", 0, FromDIP(20)); + btn_last_page->SetMinSize(wxSize(FromDIP(20), FromDIP(20))); + btn_last_page->SetMaxSize(wxSize(FromDIP(20), FromDIP(20))); + btn_last_page->SetBackgroundColor(head_bg); + btn_last_page->Bind(wxEVT_LEFT_DOWN, [&](wxMouseEvent& evt) { + evt.Skip(); + if (m_current_page == 0) + return; + btn_last_page->Enable(false); + btn_next_page->Enable(false); + start_timer(); + m_current_page--; + if (m_current_page < 0) + m_current_page = 0; + refresh_user_device(); + update_page_number(); + }); + st_page_number = new wxStaticText(m_flipping_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize); + btn_next_page = new Button(m_flipping_panel, "", "go_next_plate", 0, FromDIP(20)); + btn_next_page->SetMinSize(wxSize(FromDIP(20), FromDIP(20))); + btn_next_page->SetMaxSize(wxSize(FromDIP(20), FromDIP(20))); + btn_next_page->SetBackgroundColor(head_bg); + btn_next_page->Bind(wxEVT_LEFT_DOWN, [&](wxMouseEvent& evt) { + evt.Skip(); + if (m_current_page == m_total_page - 1) + return; + btn_last_page->Enable(false); + btn_next_page->Enable(false); + start_timer(); + m_current_page++; + if (m_current_page > m_total_page - 1) + m_current_page = m_total_page - 1; + refresh_user_device(); + update_page_number(); + }); + + m_page_num_input = new ::TextInput(m_flipping_panel, wxEmptyString, wxEmptyString, wxEmptyString, wxDefaultPosition, wxSize(FromDIP(50), -1), wxTE_PROCESS_ENTER); + StateColor input_bg(std::pair(wxColour("#F0F0F1"), StateColor::Disabled), std::pair(*wxWHITE, StateColor::Enabled)); + m_page_num_input->SetBackgroundColor(input_bg); + m_page_num_input->GetTextCtrl()->SetValue("1"); + wxTextValidator validator(wxFILTER_DIGITS); + m_page_num_input->GetTextCtrl()->SetValidator(validator); + m_page_num_input->GetTextCtrl()->Bind(wxEVT_TEXT_ENTER, [&](wxCommandEvent& e) { + page_num_enter_evt(); + }); + + m_page_num_enter = new Button(m_flipping_panel, _("Go")); + m_page_num_enter->SetMinSize(wxSize(FromDIP(25), FromDIP(25))); + m_page_num_enter->SetMaxSize(wxSize(FromDIP(25), FromDIP(25))); + m_page_num_enter->SetBackgroundColor(ctrl_bg); + m_page_num_enter->SetCornerRadius(FromDIP(5)); + m_page_num_enter->Bind(wxEVT_COMMAND_BUTTON_CLICKED, [&](auto& evt) { + page_num_enter_evt(); + }); + + m_flipping_page_sizer->Add(0, 0, 1, wxEXPAND, 0); + m_flipping_page_sizer->Add(btn_last_page, 0, wxALIGN_CENTER, 0); + m_flipping_page_sizer->Add(st_page_number, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, FromDIP(5)); + m_flipping_page_sizer->Add(btn_next_page, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, FromDIP(5)); + m_flipping_page_sizer->Add(m_page_num_input, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, FromDIP(20)); + m_flipping_page_sizer->Add(m_page_num_enter, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, FromDIP(5)); + m_page_sizer->Add(m_flipping_page_sizer, 0, wxALIGN_CENTER_HORIZONTAL, FromDIP(5)); + m_flipping_panel->SetSizer(m_page_sizer); + m_flipping_panel->Layout(); + + m_main_sizer->AddSpacer(FromDIP(16)); + m_main_sizer->Add(sizer_button_printer, 0, wxALIGN_CENTER_HORIZONTAL, 0); + m_main_sizer->AddSpacer(FromDIP(5)); + m_main_sizer->Add(m_table_head_panel, 0, wxALIGN_CENTER_HORIZONTAL, 0); + m_main_sizer->Add(m_tip_text, 0, wxALIGN_CENTER_HORIZONTAL | wxTOP, FromDIP(50)); + m_main_sizer->Add(m_button_add, 0, wxALIGN_CENTER_HORIZONTAL | wxTOP, FromDIP(16)); + m_main_sizer->Add(m_machine_list, 0, wxALIGN_CENTER_HORIZONTAL, 0); + m_main_sizer->Add(m_flipping_panel, 0, wxALIGN_CENTER_HORIZONTAL, 0); + m_main_panel->SetSizer(m_main_sizer); + m_main_panel->Layout(); + page_sizer = new wxBoxSizer(wxVERTICAL); + page_sizer->Add(m_main_panel, 1, wxALL | wxEXPAND, FromDIP(25)); + + SetSizer(page_sizer); + Layout(); + Fit(); + + Bind(wxEVT_TIMER, &MultiMachineManagerPage::on_timer, this); +} + +void MultiMachineManagerPage::update_page() +{ + for (int i = 0; i < m_device_items.size(); i++) { + m_device_items[i]->sync_state(); + m_device_items[i]->Refresh(); + } +} + +void MultiMachineManagerPage::refresh_user_device(bool clear) +{ + m_sizer_machine_list->Clear(true); + m_device_items.clear(); + + if(clear) return; + + Slic3r::DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (!dev) return; + + auto all_machine = dev->get_my_cloud_machine_list(); + auto user_machine = std::map(); + + //selected machine + for (int i = 0; i < PICK_DEVICE_MAX; i++) { + auto dev_id = wxGetApp().app_config->get("multi_devices", std::to_string(i)); + + if (all_machine.count(dev_id) > 0) { + user_machine[dev_id] = all_machine[dev_id]; + } + } + + + m_total_count = user_machine.size(); + + m_state_objs.clear(); + for (auto it = user_machine.begin(); it != user_machine.end(); ++it) { + sync_state(it->second); + } + + //sort + if (m_sort.rule != SortItem::SortRule::SR_None) { + std::sort(m_state_objs.begin(), m_state_objs.end(), m_sort.get_machine_call_back()); + } + + double result = static_cast(user_machine.size()) / m_count_page_item; + m_total_page = std::ceil(result); + + std::vector sort_devices = extractRange(m_state_objs, m_current_page * m_count_page_item, (m_current_page + 1) * m_count_page_item - 1 ); + std::vector subscribe_list; + + for (auto i = 0; i < sort_devices.size(); ++i) { + auto dev_id = sort_devices[i].dev_id; + + auto machine = user_machine[dev_id]; + + MultiMachineItem* di = new MultiMachineItem(m_machine_list, machine); + m_device_items.push_back(di); + m_sizer_machine_list->Add(m_device_items[i], 0, wxALL | wxEXPAND, 0); + + subscribe_list.push_back(dev_id); + } + + dev->subscribe_device_list(subscribe_list); + + m_tip_text->Show(m_device_items.empty()); + m_button_add->Show(m_device_items.empty()); + + update_page_number(); + m_flipping_panel->Show(m_total_page > 1); + m_sizer_machine_list->Layout(); + Layout(); +} + +std::vector MultiMachineManagerPage::extractRange(const std::vector& source, int start, int end) { + std::vector result; + + if (start < 0 || start > end || source.size() <= 0) { + return result; + } + + if ( end >= source.size() ) { + end = source.size(); + } + + auto startIter = source.begin() + start; + auto endIter = source.begin() + end; + result.assign(startIter, endIter); + return result; +} + +void MultiMachineManagerPage::sync_state(MachineObject* obj_) +{ + ObjState state_obj; + + if (obj_) { + state_obj.dev_id = obj_->dev_id; + state_obj.state_dev_name = obj_->dev_name; + + if (obj_->print_status == "IDLE") { + state_obj.state_device = 0; + } + else if (obj_->print_status == "FINISH") { + state_obj.state_device = 1; + } + else if (obj_->print_status == "FAILED") { + state_obj.state_device = 2; + } + else if (obj_->print_status == "RUNNING") { + state_obj.state_device = 3; + } + else if (obj_->print_status == "PAUSE") { + state_obj.state_device = 4; + } + else if (obj_->print_status == "PREPARE") { + state_obj.state_device = 5; + } + else if (obj_->print_status == "SLICING") { + state_obj.state_device = 6; + } + else { + state_obj.state_device = 7; + } + } + m_state_objs.push_back(state_obj); +} + +bool MultiMachineManagerPage::Show(bool show) +{ + if (show) { + refresh_user_device(); + } + else { + Slic3r::DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (dev) { + dev->subscribe_device_list(std::vector()); + } + } + return wxPanel::Show(show); +} + +void MultiMachineManagerPage::start_timer() +{ + if (m_flipping_timer) { + m_flipping_timer->Stop(); + } + else { + m_flipping_timer = new wxTimer(); + } + + m_flipping_timer->SetOwner(this); + m_flipping_timer->Start(1000); + wxPostEvent(this, wxTimerEvent()); +} + +void MultiMachineManagerPage::update_page_number() +{ + double result = static_cast(m_total_count) / m_count_page_item; + m_total_page = std::ceil(result); + + wxString number = wxString(std::to_string(m_current_page + 1)) + " / " + wxString(std::to_string(m_total_page)); + st_page_number->SetLabel(number); +} + +void MultiMachineManagerPage::on_timer(wxTimerEvent& event) +{ + m_flipping_timer->Stop(); + if (btn_last_page) + btn_last_page->Enable(true); + if (btn_next_page) + btn_next_page->Enable(true); +} + +void MultiMachineManagerPage::clear_page() +{ + +} + +void MultiMachineManagerPage::page_num_enter_evt() +{ + btn_last_page->Enable(false); + btn_next_page->Enable(false); + start_timer(); + auto value = m_page_num_input->GetTextCtrl()->GetValue(); + long page_num = 0; + if (value.ToLong(&page_num)) { + if (page_num > m_total_page) + m_current_page = m_total_page - 1; + else if (page_num < 1) + m_current_page = 0; + else + m_current_page = page_num - 1; + } + refresh_user_device(); + update_page_number(); +} + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/MultiMachineManagerPage.hpp b/src/slic3r/GUI/MultiMachineManagerPage.hpp new file mode 100644 index 0000000000..87d8d9866e --- /dev/null +++ b/src/slic3r/GUI/MultiMachineManagerPage.hpp @@ -0,0 +1,114 @@ +#ifndef slic3r_MultiMachineMangerPage_hpp_ +#define slic3r_MultiMachineMangerPage_hpp_ + +#include "GUI_Utils.hpp" +#include "MultiMachine.hpp" + +namespace Slic3r { +namespace GUI { + +#define DEVICE_LEFT_PADDING_LEFT 15 +#define DEVICE_LEFT_DEV_NAME 180 +#define DEVICE_LEFT_PRO_NAME 180 +#define DEVICE_LEFT_PRO_INFO 320 + +class MultiMachineItem : public DeviceItem +{ + +public: + MultiMachineItem(wxWindow* parent, MachineObject* obj); + ~MultiMachineItem() {}; + + void OnEnterWindow(wxMouseEvent& evt); + void OnLeaveWindow(wxMouseEvent& evt); + void OnLeftDown(wxMouseEvent& evt); + void OnMove(wxMouseEvent& evt); + + void paintEvent(wxPaintEvent& evt); + void render(wxDC& dc); + void DrawTextWithEllipsis(wxDC& dc, const wxString& text, int maxWidth, int left, int top = 0); + void doRender(wxDC& dc); + void post_event(wxCommandEvent&& event); + virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO); + +public: + bool m_hover{ false }; + ScalableBitmap m_bitmap_check_disable; + ScalableBitmap m_bitmap_check_off; + ScalableBitmap m_bitmap_check_on; + wxString get_left_time(int mc_left_time); +}; + +class MultiMachineManagerPage : public wxPanel +{ +public: + MultiMachineManagerPage(wxWindow* parent); + ~MultiMachineManagerPage() {}; + + void update_page(); + void refresh_user_device(bool clear = false); + + void sync_state(MachineObject* obj_); + bool Show(bool show); + + std::vector extractRange(const std::vector& source, int start, int end); + + void start_timer(); + void update_page_number(); + void on_timer(wxTimerEvent& event); + void clear_page(); + + void page_num_enter_evt(); + +private: + std::vector m_state_objs; + std::vector m_device_items; + SortItem m_sort; + bool device_dev_name_big{ true }; + bool device_state_big{ true }; + + + Button* m_button_edit{nullptr}; + wxBoxSizer* page_sizer{ nullptr }; + wxPanel* m_main_panel{ nullptr }; + wxBoxSizer* m_main_sizer{nullptr}; + wxBoxSizer* m_sizer_machine_list{nullptr}; + wxScrolledWindow* m_machine_list{ nullptr }; + wxStaticText* m_selected_num{ nullptr }; + + // table head + wxPanel* m_table_head_panel{ nullptr }; + wxBoxSizer* m_table_head_sizer{ nullptr }; + Button* m_printer_name{ nullptr }; + Button* m_task_name{ nullptr }; + Button* m_status{ nullptr }; + Button* m_action{ nullptr }; + Button* m_stop_all_botton{nullptr}; + + // tip when no device + wxStaticText* m_tip_text{ nullptr }; + Button* m_button_add{ nullptr }; + + // Flipping pages + int m_current_page{ 0 }; + int m_total_page{ 0 }; + int m_total_count{ 0 }; + int m_count_page_item{ 10 }; + + bool prev{ false }; + bool next{ false }; + Button* btn_last_page{ nullptr }; + Button* btn_next_page{ nullptr }; + wxStaticText* st_page_number{ nullptr }; + wxBoxSizer* m_flipping_page_sizer{ nullptr }; + wxBoxSizer* m_page_sizer{ nullptr }; + wxPanel* m_flipping_panel{ nullptr }; + wxTimer* m_flipping_timer{ nullptr }; + TextInput* m_page_num_input{ nullptr }; + Button* m_page_num_enter{ nullptr }; +}; + +} // namespace GUI +} // namespace Slic3r + +#endif diff --git a/src/slic3r/GUI/MultiMachinePage.cpp b/src/slic3r/GUI/MultiMachinePage.cpp new file mode 100644 index 0000000000..4ed797c0fd --- /dev/null +++ b/src/slic3r/GUI/MultiMachinePage.cpp @@ -0,0 +1,485 @@ +#include "MultiMachinePage.hpp" +#include "GUI_App.hpp" +#include "MainFrame.hpp" + +namespace Slic3r { +namespace GUI { + + +MultiMachinePage::MultiMachinePage(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) + : wxPanel(parent, id, pos, size, style) +{ + init_tabpanel(); + m_main_sizer = new wxBoxSizer(wxHORIZONTAL); + m_main_sizer->Add(m_tabpanel, 1, wxEXPAND | wxLEFT, 0); + SetSizerAndFit(m_main_sizer); + Layout(); + Fit(); + + wxGetApp().UpdateDarkUIWin(this); + + init_timer(); + Bind(wxEVT_TIMER, &MultiMachinePage::on_timer, this); +} + +MultiMachinePage::~MultiMachinePage() +{ + if (m_refresh_timer) + m_refresh_timer->Stop(); + delete m_refresh_timer; +} + +void MultiMachinePage::jump_to_send_page() +{ + m_tabpanel->SetSelection(1); +} + +void MultiMachinePage::on_sys_color_changed() +{ +} + +void MultiMachinePage::msw_rescale() +{ +} + +bool MultiMachinePage::Show(bool show) +{ + if (show) { + m_refresh_timer->Stop(); + m_refresh_timer->SetOwner(this); + m_refresh_timer->Start(2000); + wxPostEvent(this, wxTimerEvent()); + } + else { + m_refresh_timer->Stop(); + } + + auto page = m_tabpanel->GetCurrentPage(); + if (page) + page->Show(show); + return wxPanel::Show(show); +} + +void MultiMachinePage::init_tabpanel() +{ + auto m_side_tools = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(220), FromDIP(18))); + wxBoxSizer* sizer_side_tools = new wxBoxSizer(wxHORIZONTAL); + sizer_side_tools->Add(m_side_tools, 1, wxEXPAND, 0); + m_tabpanel = new Tabbook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, sizer_side_tools, wxNB_LEFT | wxTAB_TRAVERSAL | wxNB_NOPAGETHEME); + m_tabpanel->SetBackgroundColour(wxColour("#FEFFFF")); + m_tabpanel->Bind(wxEVT_BOOKCTRL_PAGE_CHANGED, [this](wxBookCtrlEvent& e) {; }); + + m_local_task_manager = new LocalTaskManagerPage(m_tabpanel); + m_cloud_task_manager = new CloudTaskManagerPage(m_tabpanel); + m_machine_manager = new MultiMachineManagerPage(m_tabpanel); + + m_tabpanel->AddPage(m_machine_manager, _L("Device"), "", true); + m_tabpanel->AddPage(m_local_task_manager, _L("Task Sending"), "", false); + m_tabpanel->AddPage(m_cloud_task_manager, _L("Task Sent"), "", false); +} + +void MultiMachinePage::init_timer() +{ + m_refresh_timer = new wxTimer(); + //m_refresh_timer->SetOwner(this); + //m_refresh_timer->Start(8000); + //wxPostEvent(this, wxTimerEvent()); +} + +void MultiMachinePage::on_timer(wxTimerEvent& event) +{ + m_local_task_manager->update_page(); + m_cloud_task_manager->update_page(); + m_machine_manager->update_page(); +} + +void MultiMachinePage::clear_page() +{ + m_local_task_manager->refresh_user_device(true); + m_cloud_task_manager->refresh_user_device(true); + m_machine_manager->refresh_user_device(true); +} + +DevicePickItem::DevicePickItem(wxWindow* parent, MachineObject* obj) + : DeviceItem(parent, obj) +{ + SetBackgroundColour(*wxWHITE); + m_bitmap_check_disable = ScalableBitmap(this, "check_off_disabled", 18); + m_bitmap_check_off = ScalableBitmap(this, "check_off_focused", 18); + m_bitmap_check_on = ScalableBitmap(this, "check_on", 18); + + + SetMinSize(wxSize(FromDIP(400), FromDIP(30))); + SetMaxSize(wxSize(FromDIP(400), FromDIP(30))); + + Bind(wxEVT_PAINT, &DevicePickItem::paintEvent, this); + Bind(wxEVT_ENTER_WINDOW, &DevicePickItem::OnEnterWindow, this); + Bind(wxEVT_LEAVE_WINDOW, &DevicePickItem::OnLeaveWindow, this); + Bind(wxEVT_LEFT_DOWN, &DevicePickItem::OnLeftDown, this); + Bind(wxEVT_MOTION, &DevicePickItem::OnMove, this); + Bind(EVT_MULTI_DEVICE_SELECTED, &DevicePickItem::OnSelectedDevice, this); + wxGetApp().UpdateDarkUIWin(this); +} + +void DevicePickItem::DrawTextWithEllipsis(wxDC& dc, const wxString& text, int maxWidth, int left, int top /*= 0*/) +{ + wxSize size = GetSize(); + wxFont font = dc.GetFont(); + + wxSize textSize = dc.GetTextExtent(text); + dc.SetTextForeground(StateColor::darkModeColorFor(wxColour(50, 58, 61))); + int textWidth = textSize.GetWidth(); + + if (textWidth > maxWidth) { + wxString truncatedText = text; + int ellipsisWidth = dc.GetTextExtent("...").GetWidth(); + int numChars = text.length(); + + for (int i = numChars - 1; i >= 0; --i) { + truncatedText = text.substr(0, i) + "..."; + int truncatedWidth = dc.GetTextExtent(truncatedText).GetWidth(); + + if (truncatedWidth <= maxWidth - ellipsisWidth) { + break; + } + } + + if (top == 0) { + dc.DrawText(truncatedText, left, (size.y - textSize.y) / 2); + } + else { + dc.DrawText(truncatedText, left, (size.y - textSize.y) / 2 - top); + } + + } + else { + if (top == 0) { + dc.DrawText(text, left, (size.y - textSize.y) / 2); + } + else { + dc.DrawText(text, left, (size.y - textSize.y) / 2 - top); + } + } +} + +void DevicePickItem::OnEnterWindow(wxMouseEvent& evt) +{ + m_hover = true; + Refresh(false); +} + +void DevicePickItem::OnLeaveWindow(wxMouseEvent& evt) +{ + m_hover = false; + Refresh(false); +} + +void DevicePickItem::OnSelectedDevice(wxCommandEvent& evt) +{ + auto dev_id = evt.GetString(); + auto state = evt.GetInt(); + if (state == 0) { + state_selected = 1; + } + else if (state == 1) { + state_selected = 0; + } + Refresh(false); + evt.Skip(); + + post_event(wxCommandEvent(EVT_MULTI_DEVICE_SELECTED_FINHSH)); +} + +void DevicePickItem::OnLeftDown(wxMouseEvent& evt) +{ + int left = FromDIP(15); + auto mouse_pos = ClientToScreen(evt.GetPosition()); + auto item = this->ClientToScreen(wxPoint(0, 0)); + + if (mouse_pos.x > (item.x + left) && + mouse_pos.x < (item.x + left + m_bitmap_check_disable.GetBmpWidth()) && + mouse_pos.y > item.y && + mouse_pos.y < (item.y + DEVICE_ITEM_MAX_HEIGHT)) { + + post_event(wxCommandEvent(EVT_MULTI_DEVICE_SELECTED)); + } +} + +void DevicePickItem::OnMove(wxMouseEvent& evt) +{ + int left = FromDIP(15); + auto mouse_pos = ClientToScreen(evt.GetPosition()); + auto item = this->ClientToScreen(wxPoint(0, 0)); + + if (mouse_pos.x > (item.x + left) && + mouse_pos.x < (item.x + left + m_bitmap_check_disable.GetBmpWidth()) && + mouse_pos.y > item.y && + mouse_pos.y < (item.y + DEVICE_ITEM_MAX_HEIGHT)) { + SetCursor(wxCURSOR_HAND); + } + else { + SetCursor(wxCURSOR_ARROW); + } +} + +void DevicePickItem::paintEvent(wxPaintEvent& evt) +{ + wxPaintDC dc(this); + render(dc); +} + +void DevicePickItem::render(wxDC& dc) +{ +#ifdef __WXMSW__ + wxSize size = GetSize(); + wxMemoryDC memdc; + wxBitmap bmp(size.x, size.y); + memdc.SelectObject(bmp); + memdc.Blit({ 0, 0 }, size, &dc, { 0, 0 }); + + { + wxGCDC dc2(memdc); + doRender(dc2); + } + + memdc.SelectObject(wxNullBitmap); + dc.DrawBitmap(bmp, 0, 0); +#else + doRender(dc); +#endif +} + +void DevicePickItem::doRender(wxDC& dc) +{ + wxSize size = GetSize(); + dc.SetPen(wxPen(*wxBLACK)); + + int left = FromDIP(PICK_LEFT_PADDING_LEFT); + + + //checkbox + if (state_selected == 0) { + dc.DrawBitmap(m_bitmap_check_off.bmp(), wxPoint(left, (size.y - m_bitmap_check_disable.GetBmpSize().y) / 2)); + } + else if (state_selected == 1) { + dc.DrawBitmap(m_bitmap_check_on.bmp(), wxPoint(left, (size.y - m_bitmap_check_disable.GetBmpSize().y) / 2)); + } + + left += FromDIP(PICK_LEFT_PRINTABLE); + + //dev names + DrawTextWithEllipsis(dc, wxString::FromUTF8(get_obj()->dev_name), FromDIP(PICK_LEFT_DEV_NAME), left); + left += FromDIP(PICK_LEFT_DEV_NAME); +} +void DevicePickItem::post_event(wxCommandEvent&& event) +{ + event.SetEventObject(this); + event.SetString(obj_->dev_id); + event.SetInt(state_selected); + wxPostEvent(this, event); +} + +void DevicePickItem::DoSetSize(int x, int y, int width, int height, int sizeFlags /*= wxSIZE_AUTO*/) +{ + wxWindow::DoSetSize(x, y, width, height, sizeFlags); +} + +MultiMachinePickPage::MultiMachinePickPage(Plater* plater /*= nullptr*/) + : DPIDialog(static_cast(wxGetApp().mainframe), wxID_ANY, + _L("Edit multiple printers"), + wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX | wxRESIZE_BORDER) +{ +#ifdef __WINDOWS__ + SetDoubleBuffered(true); +#endif //__WINDOWS__ + + app_config = get_app_config(); + + SetBackgroundColour(*wxWHITE); + // icon + std::string icon_path = (boost::format("%1%/images/OrcaSlicerTitle.ico") % resources_dir()).str(); + SetIcon(wxIcon(encode_path(icon_path.c_str()), wxBITMAP_TYPE_ICO)); + + wxBoxSizer* main_sizer = new wxBoxSizer(wxVERTICAL); + + auto line_top = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 1), wxTAB_TRAVERSAL); + line_top->SetBackgroundColour(wxColour(166, 169, 170)); + + m_label = new Label(this, _L("Select connected printetrs (0/6)")); + + scroll_macine_list = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL); + scroll_macine_list->SetSize(wxSize(FromDIP(400), FromDIP(10 * 30))); + scroll_macine_list->SetMinSize(wxSize(FromDIP(400), FromDIP(10 * 30))); + scroll_macine_list->SetMaxSize(wxSize(FromDIP(400), FromDIP(10 * 30))); + scroll_macine_list->SetBackgroundColour(*wxWHITE); + scroll_macine_list->SetScrollRate(0, 5); + + sizer_machine_list = new wxBoxSizer(wxVERTICAL); + scroll_macine_list->SetSizer(sizer_machine_list); + scroll_macine_list->Layout(); + + main_sizer->Add(line_top, 0, wxEXPAND, 0); + main_sizer->AddSpacer(FromDIP(10)); + main_sizer->Add(m_label, 0, wxLEFT, FromDIP(20)); + main_sizer->Add(scroll_macine_list, 0, wxLEFT|wxRIGHT, FromDIP(20)); + main_sizer->AddSpacer(FromDIP(10)); + + SetSizer(main_sizer); + Layout(); + Fit(); + Centre(wxBOTH); + + wxGetApp().UpdateDlgDarkUI(this); +} + +MultiMachinePickPage::~MultiMachinePickPage() +{ + +} + +int MultiMachinePickPage::get_selected_count() +{ + int count = 0; + for (auto it = m_device_items.begin(); it != m_device_items.end(); it++) { + if (it->second->state_selected == 1) { + count++; + } + } + return count; +} + +void MultiMachinePickPage::update_selected_count() +{ + std::vector selected_multi_devices; + + int count = 0; + for (auto it = m_device_items.begin(); it != m_device_items.end(); it++) { + if (it->second->state_selected == 1 ) { + selected_multi_devices.push_back(it->second->obj_->dev_id); + count++; + } + } + + m_selected_count = count; + m_label->SetLabel(wxString::Format(_L("Select Connected Printetrs (%d/6)"), m_selected_count)); + + if (m_selected_count > PICK_DEVICE_MAX) { + MessageDialog msg_wingow(nullptr, wxString::Format(_L("The maximum number of printers that can be selected is %d"), PICK_DEVICE_MAX), "", wxAPPLY | wxOK); + if (msg_wingow.ShowModal() == wxOK) { + return; + } + } + + for (int i = 0; i < PICK_DEVICE_MAX; i++) { + app_config->erase("multi_devices",std::to_string(i)); + } + + for (int j = 0; j < selected_multi_devices.size(); j++) { + app_config->set_str("multi_devices", std::to_string(j), selected_multi_devices[j]); + } + app_config->save(); +} + +void MultiMachinePickPage::on_dpi_changed(const wxRect& suggested_rect) +{ + +} + +void MultiMachinePickPage::on_sys_color_changed() +{ + +} + +void MultiMachinePickPage::refresh_user_device() +{ + std::vector selected_multi_devices; + + for(int i = 0; i < PICK_DEVICE_MAX; i++){ + auto dev_id = app_config->get("multi_devices", std::to_string(i)); + selected_multi_devices.push_back(dev_id); + } + + sizer_machine_list->Clear(false); + Slic3r::DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (!dev) { + for (auto it = m_device_items.begin(); it != m_device_items.end(); it++) { + wxWindow* child = it->second; + child->Destroy(); + } + return; + } + + auto user_machine = dev->get_my_cloud_machine_list(); + auto task_manager = wxGetApp().getTaskManager(); + + std::vector subscribe_list; + + for (auto it = user_machine.begin(); it != user_machine.end(); ++it) { + DevicePickItem* di = new DevicePickItem(scroll_macine_list, it->second); + + di->Bind(EVT_MULTI_DEVICE_SELECTED_FINHSH, [this, di](auto& e) { + int count = get_selected_count(); + if (count > PICK_DEVICE_MAX) { + di->unselected(); + return; + } + update_selected_count(); + }); + + /* if (m_device_items.find(it->first) != m_device_items.end()) { + auto item = m_device_items[it->first]; + if (item->state_selected == 1 && di->state_printable <= 2) + di->state_selected = item->state_selected; + item->Destroy(); + }*/ + m_device_items[it->first] = di; + + //update state + if (task_manager) { + m_device_items[it->first]->state_local_task = task_manager->query_task_state(it->first); + } + + //update selected + auto dev_it = std::find(selected_multi_devices.begin(), selected_multi_devices.end(), it->second->dev_id ); + if (dev_it != selected_multi_devices.end()) { + di->state_selected = 1; + } + + sizer_machine_list->Add(di, 0, wxALL | wxEXPAND, 0); + subscribe_list.push_back(it->first); + } + + dev->subscribe_device_list(subscribe_list); + + sizer_machine_list->Layout(); + Layout(); + Fit(); +} + +void MultiMachinePickPage::on_confirm(wxCommandEvent& event) +{ + +} + +bool MultiMachinePickPage::Show(bool show) +{ + if (show) { + refresh_user_device(); + update_selected_count(); + //m_refresh_timer->Stop(); + //m_refresh_timer->SetOwner(this); + //m_refresh_timer->Start(4000); + //wxPostEvent(this, wxTimerEvent()); + } + else { + //m_refresh_timer->Stop(); + Slic3r::DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (dev) { + dev->subscribe_device_list(std::vector()); + } + } + return wxDialog::Show(show); +} + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/MultiMachinePage.hpp b/src/slic3r/GUI/MultiMachinePage.hpp new file mode 100644 index 0000000000..0572c30d1b --- /dev/null +++ b/src/slic3r/GUI/MultiMachinePage.hpp @@ -0,0 +1,104 @@ +#ifndef slic3r_MultiMachinePage_hpp_ +#define slic3r_MultiMachinePage_hpp_ + +#include "libslic3r/libslic3r.h" +#include "GUI_App.hpp" +#include "GUI_Utils.hpp" +#include "MultiTaskManagerPage.hpp" +#include "MultiMachineManagerPage.hpp" +#include "Tabbook.hpp" + +#include "wx/button.h" + +namespace Slic3r { +namespace GUI { + +#define PICK_LEFT_PADDING_LEFT 15 +#define PICK_LEFT_PRINTABLE 40 +#define PICK_LEFT_DEV_NAME 250 +#define PICK_LEFT_DEV_STATUS 250 +#define PICK_DEVICE_MAX 6 + +class MultiMachinePage : public wxPanel +{ +private: + wxTimer* m_refresh_timer = nullptr; + wxSizer* m_main_sizer{ nullptr }; + LocalTaskManagerPage* m_local_task_manager{ nullptr }; + CloudTaskManagerPage* m_cloud_task_manager{ nullptr }; + MultiMachineManagerPage* m_machine_manager{ nullptr }; + Tabbook* m_tabpanel{ nullptr }; + +public: + MultiMachinePage(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL); + ~MultiMachinePage(); + + void jump_to_send_page(); + + void on_sys_color_changed(); + void msw_rescale(); + bool Show(bool show); + + void init_tabpanel(); + void init_timer(); + void on_timer(wxTimerEvent& event); + + void clear_page(); +}; + + +class DevicePickItem : public DeviceItem +{ + +public: + DevicePickItem(wxWindow* parent, MachineObject* obj); + ~DevicePickItem() {}; + + void DrawTextWithEllipsis(wxDC& dc, const wxString& text, int maxWidth, int left, int top = 0); + void OnEnterWindow(wxMouseEvent& evt); + void OnLeaveWindow(wxMouseEvent& evt); + void OnSelectedDevice(wxCommandEvent& evt); + void OnLeftDown(wxMouseEvent& evt); + void OnMove(wxMouseEvent& evt); + + void paintEvent(wxPaintEvent& evt); + void render(wxDC& dc); + void doRender(wxDC& dc); + void post_event(wxCommandEvent&& event); + virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO); + +public: + bool m_hover{ false }; + ScalableBitmap m_bitmap_check_disable; + ScalableBitmap m_bitmap_check_off; + ScalableBitmap m_bitmap_check_on; +}; + + +class MultiMachinePickPage : public DPIDialog +{ +private: + AppConfig* app_config; + Label* m_label{ nullptr }; + wxScrolledWindow* scroll_macine_list{ nullptr }; + wxBoxSizer* m_sizer_body{ nullptr }; + wxBoxSizer* sizer_machine_list{ nullptr }; + std::map m_device_items; + int m_selected_count{0}; +public: + MultiMachinePickPage(Plater* plater = nullptr); + ~MultiMachinePickPage(); + + int get_selected_count(); + void update_selected_count(); + void on_dpi_changed(const wxRect& suggested_rect); + void on_sys_color_changed(); + void refresh_user_device(); + void on_confirm(wxCommandEvent& event); + bool Show(bool show); +}; + +} // namespace GUI +} // namespace Slic3r + +#endif diff --git a/src/slic3r/GUI/MultiPrintJob.cpp b/src/slic3r/GUI/MultiPrintJob.cpp new file mode 100644 index 0000000000..6da49ebc6d --- /dev/null +++ b/src/slic3r/GUI/MultiPrintJob.cpp @@ -0,0 +1,7 @@ +#include "MultiPrintJob.hpp" + +namespace Slic3r { +namespace GUI { + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/MultiPrintJob.hpp b/src/slic3r/GUI/MultiPrintJob.hpp new file mode 100644 index 0000000000..233b464a4d --- /dev/null +++ b/src/slic3r/GUI/MultiPrintJob.hpp @@ -0,0 +1,10 @@ +#ifndef slic3r_MultiPrintJob_hpp_ +#define slic3r_MultiPrintJob_hpp_ + +namespace Slic3r { +namespace GUI { + +} // namespace GUI +} // namespace Slic3r + +#endif diff --git a/src/slic3r/GUI/MultiSendMachineModel.cpp b/src/slic3r/GUI/MultiSendMachineModel.cpp new file mode 100644 index 0000000000..101a3f1781 --- /dev/null +++ b/src/slic3r/GUI/MultiSendMachineModel.cpp @@ -0,0 +1,33 @@ +#include "MultiSendMachineModel.hpp" + +namespace Slic3r { +namespace GUI { + +MultiSendMachineModel::MultiSendMachineModel() +{ + ; +} + +MultiSendMachineModel::~MultiSendMachineModel() +{ + ; +} + +void MultiSendMachineModel::Init() +{ + ; +} + +wxDataViewItem MultiSendMachineModel::AddMachine(MachineObject* obj) +{ + wxString name = from_u8(obj->dev_name); + + wxDataViewItem new_item; + + // TODO + return new_item; +} + + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/MultiSendMachineModel.hpp b/src/slic3r/GUI/MultiSendMachineModel.hpp new file mode 100644 index 0000000000..60318163c6 --- /dev/null +++ b/src/slic3r/GUI/MultiSendMachineModel.hpp @@ -0,0 +1,25 @@ +#ifndef slic3r_MultiSendMachineModel_hpp_ +#define slic3r_MultiSendMachineModel_hpp_ + +#include "DeviceManager.hpp" + +namespace Slic3r { +namespace GUI { + +class MultiSendMachineModel : public wxDataViewModel +{ +public: + MultiSendMachineModel(); + ~MultiSendMachineModel(); + + void Init(); + + wxDataViewItem AddMachine(MachineObject* obj); + +private: +}; + +} // namespace GUI +} // namespace Slic3r + +#endif diff --git a/src/slic3r/GUI/MultiTaskManagerPage.cpp b/src/slic3r/GUI/MultiTaskManagerPage.cpp new file mode 100644 index 0000000000..778350e825 --- /dev/null +++ b/src/slic3r/GUI/MultiTaskManagerPage.cpp @@ -0,0 +1,1436 @@ +#include "MultiTaskManagerPage.hpp" +#include "I18N.hpp" + +#include "GUI_App.hpp" +#include "MainFrame.hpp" +#include "Widgets/RadioBox.hpp" +#include +#include + +namespace Slic3r { +namespace GUI { + +MultiTaskItem::MultiTaskItem(wxWindow* parent, MachineObject* obj, int type) + : DeviceItem(parent, obj), + m_task_type(type) +{ + SetBackgroundColour(*wxWHITE); + SetMinSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + SetMaxSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + + Bind(wxEVT_PAINT, &MultiTaskItem::paintEvent, this); + Bind(wxEVT_ENTER_WINDOW, &MultiTaskItem::OnEnterWindow, this); + Bind(wxEVT_LEAVE_WINDOW, &MultiTaskItem::OnLeaveWindow, this); + Bind(wxEVT_LEFT_DOWN, &MultiTaskItem::OnLeftDown, this); + Bind(wxEVT_MOTION, &MultiTaskItem::OnMove, this); + Bind(EVT_MULTI_DEVICE_SELECTED, &MultiTaskItem::OnSelectedDevice, this); + + m_bitmap_check_disable = ScalableBitmap(this, "check_off_disabled", 18); + m_bitmap_check_off = ScalableBitmap(this, "check_off_focused", 18); + m_bitmap_check_on = ScalableBitmap(this, "check_on", 18); + + wxBoxSizer* main_sizer = new wxBoxSizer(wxVERTICAL); + wxBoxSizer* item_sizer = new wxBoxSizer(wxHORIZONTAL); + + + auto m_btn_bg_enable = StateColor( + std::pair(wxColour(0, 137, 123), StateColor::Pressed), + std::pair(wxColour(38, 166, 154), StateColor::Hovered), + std::pair(wxColour(0, 150, 136), StateColor::Normal) + ); + + m_button_resume = new Button(this, _L("Resume")); + m_button_resume->SetBackgroundColor(m_btn_bg_enable); + m_button_resume->SetBorderColor(m_btn_bg_enable); + m_button_resume->SetFont(Label::Body_12); + m_button_resume->SetTextColor(StateColor::darkModeColorFor("#FFFFFE")); + m_button_resume->SetMinSize(wxSize(FromDIP(70), FromDIP(35))); + m_button_resume->SetCornerRadius(6); + + + StateColor clean_bg(std::pair(wxColour(255, 255, 255), StateColor::Disabled), std::pair(wxColour(206, 206, 206), StateColor::Pressed), + std::pair(wxColour(238, 238, 238), StateColor::Hovered), std::pair(wxColour(255, 255, 255), StateColor::Enabled), + std::pair(wxColour(255, 255, 255), StateColor::Normal)); + StateColor clean_bd(std::pair(wxColour(144, 144, 144), StateColor::Disabled), std::pair(wxColour(38, 46, 48), StateColor::Enabled)); + StateColor clean_text(std::pair(wxColour(144, 144, 144), StateColor::Disabled), std::pair(wxColour(38, 46, 48), StateColor::Enabled)); + + m_button_cancel = new Button(this, _L("Cancel")); + m_button_cancel->SetBackgroundColor(clean_bg); + m_button_cancel->SetBorderColor(clean_bd); + m_button_cancel->SetTextColor(clean_text); + m_button_cancel->SetFont(Label::Body_12); + m_button_cancel->SetCornerRadius(6); + m_button_cancel->SetMinSize(wxSize(FromDIP(70), FromDIP(35))); + + m_button_pause = new Button(this, _L("Pause")); + m_button_pause->SetBackgroundColor(clean_bg); + m_button_pause->SetBorderColor(clean_bd); + m_button_pause->SetTextColor(clean_text); + m_button_pause->SetFont(Label::Body_12); + m_button_pause->SetCornerRadius(6); + m_button_pause->SetMinSize(wxSize(FromDIP(70), FromDIP(35))); + + m_button_stop = new Button(this, _L("Stop")); + m_button_stop->SetBackgroundColor(clean_bg); + m_button_stop->SetBorderColor(clean_bd); + m_button_stop->SetTextColor(clean_text); + m_button_stop->SetFont(Label::Body_12); + m_button_stop->SetCornerRadius(6); + m_button_stop->SetMinSize(wxSize(FromDIP(70), FromDIP(35))); + + + item_sizer->Add(0, 0, 1, wxEXPAND, 0); + item_sizer->Add(m_button_cancel, 0, wxALIGN_CENTER, 0); + item_sizer->Add(m_button_resume, 0, wxALIGN_CENTER, 0); + item_sizer->Add(m_button_pause, 0, wxALIGN_CENTER, 0); + item_sizer->Add(m_button_stop, 0, wxALIGN_CENTER, 0); + + m_button_cancel->Hide(); + m_button_pause->Hide(); + m_button_resume->Hide(); + m_button_stop->Hide(); + + main_sizer->Add(item_sizer, 1, wxEXPAND, 0); + SetSizer(main_sizer); + Layout(); + + m_button_cancel->Bind(wxEVT_BUTTON, [this](auto& e) { + onCancel(); + }); + + m_button_pause->Bind(wxEVT_BUTTON, [this](auto& e) { + onPause(); + }); + + m_button_resume->Bind(wxEVT_BUTTON, [this](auto& e) { + onResume(); + }); + + m_button_stop->Bind(wxEVT_BUTTON, [this](auto& e) { + onStop(); + }); + + wxGetApp().UpdateDarkUIWin(this); +} + +void MultiTaskItem::update_info() +{ + //local + if (m_task_type == 0) { + m_button_stop->Hide(); + m_button_pause->Hide(); + m_button_resume->Hide(); + if (state_local_task == 0 || state_local_task == 1) { + m_button_cancel->Show(); + Layout(); + } + else { + m_button_cancel->Hide(); + Layout(); + } + } + //cloud + else if (m_task_type == 1 && get_obj() && (m_job_id == get_obj()->profile_id_)) { + m_button_cancel->Hide(); + + if (obj_ && obj_->is_in_printing() && state_cloud_task == 0 ) { + if (obj_->can_abort()) { + m_button_stop->Show(); + } + else { + m_button_stop->Hide(); + } + + if (obj_->can_pause()) { + m_button_pause->Show(); + } + else { + m_button_pause->Hide(); + } + + if (obj_->can_resume()) { + m_button_resume->Show(); + } + else { + m_button_resume->Hide(); + } + + Layout(); + } + else { + m_button_stop->Hide(); + m_button_pause->Hide(); + m_button_resume->Hide(); + Layout(); + } + } + else { + m_button_cancel->Hide(); + m_button_stop->Hide(); + m_button_pause->Hide(); + m_button_resume->Hide(); + Layout(); + } +} + +void MultiTaskItem::onPause() +{ + if (get_obj() && !get_obj()->can_resume()) { + BOOST_LOG_TRIVIAL(info) << "MultiTask: pause current print task dev_id =" << get_obj()->dev_id; + get_obj()->command_task_pause(); + m_button_pause->Hide(); + m_button_resume->Show(); + Layout(); + } +} + +void MultiTaskItem::onResume() +{ + if (get_obj() && get_obj()->can_resume()) { + BOOST_LOG_TRIVIAL(info) << "MultiTask: resume current print task dev_id =" << get_obj()->dev_id; + get_obj()->command_task_resume(); + m_button_pause->Show(); + m_button_resume->Hide(); + Layout(); + } +} + +void MultiTaskItem::onStop() +{ + if (get_obj()) { + BOOST_LOG_TRIVIAL(info) << "MultiTask: abort current print task dev_id =" << get_obj()->dev_id; + get_obj()->command_task_abort(); + m_button_pause->Hide(); + m_button_resume->Hide(); + m_button_stop->Hide(); + state_cloud_task = 2; + Layout(); + Refresh(); + } +} + + +void MultiTaskItem::onCancel() +{ + if (task_obj) { + task_obj->cancel(); + if (!task_obj->get_job_id().empty()) { + get_obj()->command_task_cancel(task_obj->get_job_id()); + } + } +} + +void MultiTaskItem::OnEnterWindow(wxMouseEvent& evt) +{ + m_hover = true; + Refresh(); +} + +void MultiTaskItem::OnLeaveWindow(wxMouseEvent& evt) +{ + m_hover = false; + Refresh(); +} + +void MultiTaskItem::OnSelectedDevice(wxCommandEvent& evt) +{ + auto dev_id = evt.GetString(); + auto state = evt.GetInt(); + if (state == 0) { + state_selected = 1; + } + else if (state == 1) { + state_selected = 0; + } + Refresh(); +} + +void MultiTaskItem::OnLeftDown(wxMouseEvent& evt) +{ + int left = FromDIP(15); + auto mouse_pos = ClientToScreen(evt.GetPosition()); + auto item = this->ClientToScreen(wxPoint(0, 0)); + + if (mouse_pos.x > (item.x + left) && + mouse_pos.x < (item.x + left + m_bitmap_check_disable.GetBmpWidth()) && + mouse_pos.y > item.y && + mouse_pos.y < (item.y + DEVICE_ITEM_MAX_HEIGHT)) { + + if (m_task_type == 0 && state_local_task <= 1) { + post_event(wxCommandEvent(EVT_MULTI_DEVICE_SELECTED)); + } + else if (m_task_type == 1 && state_cloud_task == 0) { + post_event(wxCommandEvent(EVT_MULTI_DEVICE_SELECTED)); + } + } +} + +void MultiTaskItem::OnMove(wxMouseEvent& evt) +{ + int left = FromDIP(15); + auto mouse_pos = ClientToScreen(evt.GetPosition()); + auto item = this->ClientToScreen(wxPoint(0, 0)); + + if (mouse_pos.x > (item.x + left) && + mouse_pos.x < (item.x + left + m_bitmap_check_disable.GetBmpWidth()) && + mouse_pos.y > item.y && + mouse_pos.y < (item.y + DEVICE_ITEM_MAX_HEIGHT)) { + SetCursor(wxCURSOR_HAND); + } + else { + SetCursor(wxCURSOR_ARROW); + } +} + +void MultiTaskItem::paintEvent(wxPaintEvent& evt) +{ + wxPaintDC dc(this); + render(dc); +} + +void MultiTaskItem::render(wxDC& dc) +{ +#ifdef __WXMSW__ + wxSize size = GetSize(); + wxMemoryDC memdc; + wxBitmap bmp(size.x, size.y); + memdc.SelectObject(bmp); + memdc.Blit({ 0, 0 }, size, &dc, { 0, 0 }); + + { + wxGCDC dc2(memdc); + doRender(dc2); + } + + memdc.SelectObject(wxNullBitmap); + dc.DrawBitmap(bmp, 0, 0); +#else + doRender(dc); +#endif +} + +void MultiTaskItem::doRender(wxDC& dc) +{ + wxSize size = GetSize(); + dc.SetPen(wxPen(*wxBLACK)); + + int left = FromDIP(TASK_LEFT_PADDING_LEFT); + + + //checkbox + if (m_task_type == 0) { + if (state_local_task >= 2) { + dc.DrawBitmap(m_bitmap_check_disable.bmp(), wxPoint(left, (size.y - m_bitmap_check_disable.GetBmpSize().y) / 2)); + } + else { + if (state_selected == 0) { + dc.DrawBitmap(m_bitmap_check_off.bmp(), wxPoint(left, (size.y - m_bitmap_check_disable.GetBmpSize().y) / 2)); + } + else if (state_selected == 1) { + dc.DrawBitmap(m_bitmap_check_on.bmp(), wxPoint(left, (size.y - m_bitmap_check_disable.GetBmpSize().y) / 2)); + } + } + } + else if(m_task_type == 1){ + if (state_cloud_task != 0) { + dc.DrawBitmap(m_bitmap_check_disable.bmp(), wxPoint(left, (size.y - m_bitmap_check_disable.GetBmpSize().y) / 2)); + } + else { + if (state_selected == 0) { + dc.DrawBitmap(m_bitmap_check_off.bmp(), wxPoint(left, (size.y - m_bitmap_check_disable.GetBmpSize().y) / 2)); + } + else if (state_selected == 1) { + dc.DrawBitmap(m_bitmap_check_on.bmp(), wxPoint(left, (size.y - m_bitmap_check_disable.GetBmpSize().y) / 2)); + } + } + } + + + left += FromDIP(TASK_LEFT_PRINTABLE); + + //project name + DrawTextWithEllipsis(dc, m_project_name, FromDIP(TASK_LEFT_PRO_NAME), left); + left += FromDIP(TASK_LEFT_PRO_NAME); + + //dev name + DrawTextWithEllipsis(dc, m_dev_name, FromDIP(TASK_LEFT_DEV_NAME), left); + left += FromDIP(TASK_LEFT_DEV_NAME); + + //local task state + if (m_task_type == 0) { + DrawTextWithEllipsis(dc, get_local_state_task(), FromDIP(TASK_LEFT_PRO_STATE), left); + } + else { + DrawTextWithEllipsis(dc, get_cloud_state_task(), FromDIP(TASK_LEFT_PRO_STATE), left); + } + + left += FromDIP(TASK_LEFT_PRO_STATE); + + //cloud task info + if (m_task_type == 1) { + if (get_obj()) { + if (state_cloud_task == 0 && m_job_id == get_obj()->profile_id_) { + dc.SetFont(Label::Body_13); + if (state_device == 0) { + dc.SetTextForeground(*wxBLACK); + DrawTextWithEllipsis(dc, get_state_device(), FromDIP(DEVICE_LEFT_PRO_INFO), left); + } + else if (state_device == 1) { + dc.SetTextForeground(wxColour(0, 150, 136)); + DrawTextWithEllipsis(dc, get_state_device(), FromDIP(DEVICE_LEFT_PRO_INFO), left); + } + else if (state_device == 2) + { + dc.SetTextForeground(wxColour(208, 27, 27)); + DrawTextWithEllipsis(dc, get_state_device(), FromDIP(DEVICE_LEFT_PRO_INFO), left); + } + else if (state_device > 2 && state_device < 7) { + dc.SetFont(Label::Body_12); + dc.SetTextForeground(wxColour(0, 150, 136)); + if (obj_->get_curr_stage().IsEmpty()) { + //wxString layer_info = wxString::Format(_L("Layer: %d/%d"), obj_->curr_layer, obj_->total_layers); + wxString progress_info = wxString::Format("%d", obj_->subtask_->task_progress); + wxString left_time = wxString::Format("%s", get_left_time(obj_->mc_left_time)); + + DrawTextWithEllipsis(dc, progress_info + "% | " + left_time, FromDIP(TASK_LEFT_PRO_INFO), left, FromDIP(10)); + + dc.SetPen(wxPen(wxColour(233, 233, 233))); + dc.SetBrush(wxBrush(wxColour(233, 233, 233))); + dc.DrawRoundedRectangle(left, FromDIP(30), FromDIP(TASK_LEFT_PRO_INFO), FromDIP(10), 2); + + dc.SetPen(wxPen(wxColour(0, 150, 136))); + dc.SetBrush(wxBrush(wxColour(0, 150, 136))); + dc.DrawRoundedRectangle(left, FromDIP(30), FromDIP(TASK_LEFT_PRO_INFO) * (static_cast(obj_->subtask_->task_progress) / 100.0f), FromDIP(10), 2); + } + else { + DrawTextWithEllipsis(dc, obj_->get_curr_stage(), FromDIP(TASK_LEFT_PRO_INFO), left); + } + } + else { + dc.SetTextForeground(*wxBLACK); + DrawTextWithEllipsis(dc, get_state_device(), FromDIP(TASK_LEFT_PRO_INFO), left); + } + } + } + } + else { + if (state_local_task == 1) { + wxString progress_info = wxString::Format("%d", m_sending_percent); + DrawTextWithEllipsis(dc, progress_info + "% " , FromDIP(TASK_LEFT_PRO_INFO), left, FromDIP(10)); + + dc.SetPen(wxPen(wxColour(233, 233, 233))); + dc.SetBrush(wxBrush(wxColour(233, 233, 233))); + dc.DrawRoundedRectangle(left, FromDIP(30), FromDIP(TASK_LEFT_PRO_INFO), FromDIP(10), 2); + + dc.SetPen(wxPen(wxColour(0, 150, 136))); + dc.SetBrush(wxBrush(wxColour(0, 150, 136))); + dc.DrawRoundedRectangle(left, FromDIP(30), FromDIP(TASK_LEFT_PRO_INFO) * (static_cast(m_sending_percent) / 100.0f), FromDIP(10), 2); + } + /*else { + if () { + + } + if (m_button_cancel->IsShown()) { + m_button_cancel->Hide(); + Layout(); + } + }*/ + } + left += FromDIP(TASK_LEFT_PRO_INFO); + + //send time + dc.SetFont(Label::Body_13); + dc.SetTextForeground(*wxBLACK); + + if (!boost::algorithm::contains(m_send_time, "1970")) { + DrawTextWithEllipsis(dc, m_send_time, FromDIP(TASK_LEFT_SEND_TIME), left); + } + + left += FromDIP(TASK_LEFT_SEND_TIME); + + if (m_hover) { + dc.SetPen(wxPen(wxColour(0, 150, 136))); + dc.SetBrush(*wxTRANSPARENT_BRUSH); + dc.DrawRoundedRectangle(0, 0, size.x, size.y, 3); + } +} + +void MultiTaskItem::DrawTextWithEllipsis(wxDC& dc, const wxString& text, int maxWidth, int left, int top) { + wxSize size = GetSize(); + wxFont font = dc.GetFont(); + + wxSize textSize = dc.GetTextExtent(text); + + dc.SetTextForeground(StateColor::darkModeColorFor(wxColour(50, 58, 61))); + + int textWidth = textSize.GetWidth(); + + if (textWidth > maxWidth) { + wxString truncatedText = text; + int ellipsisWidth = dc.GetTextExtent("...").GetWidth(); + int numChars = text.length(); + + for (int i = numChars - 1; i >= 0; --i) { + truncatedText = text.substr(0, i) + "..."; + int truncatedWidth = dc.GetTextExtent(truncatedText).GetWidth(); + + if (truncatedWidth <= maxWidth - ellipsisWidth) { + break; + } + } + + if (top == 0) { + dc.DrawText(truncatedText, left, (size.y - textSize.y) / 2); + } + else { + dc.DrawText(truncatedText, left, (size.y - textSize.y) / 2 - top); + } + + } + else { + if (top == 0) { + dc.DrawText(text, left, (size.y - textSize.y) / 2); + } + else { + dc.DrawText(text, left, (size.y - textSize.y) / 2 - top); + } + } +} + +void MultiTaskItem::post_event(wxCommandEvent&& event) +{ + event.SetEventObject(this); + event.SetString(m_dev_id); + event.SetInt(state_selected); + wxPostEvent(this, event); +} + +void MultiTaskItem::DoSetSize(int x, int y, int width, int height, int sizeFlags /*= wxSIZE_AUTO*/) +{ + wxWindow::DoSetSize(x, y, width, height, sizeFlags); +} + +wxString MultiTaskItem::get_left_time(int mc_left_time) +{ + // update gcode progress + std::string left_time; + wxString left_time_text = _L("N/A"); + + try { + left_time = get_bbl_monitor_time_dhm(mc_left_time); + } + catch (...) { + ; + } + + if (!left_time.empty()) left_time_text = wxString::Format("-%s", left_time); + return left_time_text; +} + + +LocalTaskManagerPage::LocalTaskManagerPage(wxWindow* parent) + : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL) +{ +#ifdef __WINDOWS__ + SetDoubleBuffered(true); +#endif //__WINDOWS__ + SetBackgroundColour(wxColour(0xEEEEEE)); + m_main_panel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); + m_main_panel->SetBackgroundColour(*wxWHITE); + m_main_sizer = new wxBoxSizer(wxVERTICAL); + + StateColor head_bg( + std::pair(TABLE_HEAD_PRESSED_COLOUR, StateColor::Pressed), + std::pair(TABLE_HEAR_NORMAL_COLOUR, StateColor::Normal) + ); + + m_table_head_panel = new wxPanel(m_main_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize); + m_table_head_panel->SetMinSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), -1)); + m_table_head_panel->SetMaxSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), -1)); + m_table_head_panel->SetBackgroundColour(TABLE_HEAR_NORMAL_COLOUR); + m_table_head_sizer = new wxBoxSizer(wxHORIZONTAL); + + m_select_checkbox = new CheckBox(m_table_head_panel, wxID_ANY); + m_select_checkbox->SetMinSize(wxSize(FromDIP(TASK_LEFT_PRINTABLE), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_select_checkbox->SetMaxSize(wxSize(FromDIP(TASK_LEFT_PRINTABLE), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_table_head_sizer->Add(m_select_checkbox, 0, wxALIGN_CENTER_VERTICAL, 0); + + m_select_checkbox->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent& e) { + if (m_select_checkbox->GetValue()) { + for (auto it = m_task_items.begin(); it != m_task_items.end(); it++) { + + if (it->second->state_local_task <= 1) { + it->second->selected(); + } + } + } + else { + for (auto it = m_task_items.begin(); it != m_task_items.end(); it++) { + it->second->unselected(); + } + } + Refresh(false); + e.Skip(); + }); + + + m_task_name = new Button(m_table_head_panel, _L("Task Name"), "", wxNO_BORDER, ICON_SIZE); + m_task_name->SetBackgroundColor(TABLE_HEAR_NORMAL_COLOUR); + m_task_name->SetFont(TABLE_HEAD_FONT); + m_task_name->SetCornerRadius(0); + m_task_name->SetMinSize(wxSize(FromDIP(TASK_LEFT_PRO_NAME), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_task_name->SetMaxSize(wxSize(FromDIP(TASK_LEFT_PRO_NAME), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_task_name->SetCenter(false); + m_table_head_sizer->Add(m_task_name, 0, wxALIGN_CENTER_VERTICAL, 0); + + m_printer_name = new Button(m_table_head_panel, _L("Device Name"), "toolbar_double_directional_arrow", wxNO_BORDER, ICON_SIZE); + m_printer_name->SetBackgroundColor(head_bg); + m_printer_name->SetFont(TABLE_HEAD_FONT); + m_printer_name->SetCornerRadius(0); + m_printer_name->SetMinSize(wxSize(FromDIP(TASK_LEFT_DEV_NAME), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_printer_name->SetMaxSize(wxSize(FromDIP(TASK_LEFT_DEV_NAME), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_printer_name->SetCenter(false); + m_printer_name->Bind(wxEVT_ENTER_WINDOW, [&](wxMouseEvent& evt) { + SetCursor(wxCURSOR_HAND); + }); + m_printer_name->Bind(wxEVT_LEAVE_WINDOW, [&](wxMouseEvent& evt) { + SetCursor(wxCURSOR_ARROW); + }); + m_printer_name->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& evt) { + device_name_big = !device_name_big; + this->m_sort.set_role(SortItem::SortRule::SR_DEV_NAME, device_name_big); + this->refresh_user_device(); + }); + m_table_head_sizer->Add(m_printer_name, 0, wxALIGN_CENTER_VERTICAL, 0); + + m_status = new Button(m_table_head_panel, _L("Task Status"), "toolbar_double_directional_arrow", wxNO_BORDER, ICON_SIZE); + m_status->SetBackgroundColor(head_bg); + m_status->SetFont(TABLE_HEAD_FONT); + m_status->SetCornerRadius(0); + m_status->SetMinSize(wxSize(FromDIP(TASK_LEFT_PRO_STATE), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_status->SetMaxSize(wxSize(FromDIP(TASK_LEFT_PRO_STATE), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_status->SetCenter(false); + m_status->Bind(wxEVT_ENTER_WINDOW, [&](wxMouseEvent& evt) { + SetCursor(wxCURSOR_HAND); + }); + m_status->Bind(wxEVT_LEAVE_WINDOW, [&](wxMouseEvent& evt) { + SetCursor(wxCURSOR_ARROW); + }); + m_status->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& evt) { + device_state_big = !device_state_big; + this->m_sort.set_role(SortItem::SortRule::SR_LOCAL_TASK_STATE, device_state_big); + this->refresh_user_device(); + }); + m_table_head_sizer->Add(m_status, 0, wxALIGN_CENTER_VERTICAL, 0); + + m_info = new Button(m_table_head_panel, _L("Info"), "", wxNO_BORDER, ICON_SIZE); + m_info->SetBackgroundColor(TABLE_HEAR_NORMAL_COLOUR); + m_info->SetFont(TABLE_HEAD_FONT); + m_info->SetCornerRadius(0); + m_info->SetMinSize(wxSize(FromDIP(TASK_LEFT_PRO_INFO), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_info->SetMaxSize(wxSize(FromDIP(TASK_LEFT_PRO_INFO), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_info->SetCenter(false); + m_table_head_sizer->Add(m_info, 0, wxALIGN_CENTER_VERTICAL, 0); + + m_send_time = new Button(m_table_head_panel, _L("Sent Time"), "toolbar_double_directional_arrow", wxNO_BORDER, ICON_SIZE, false); + m_send_time->SetBackgroundColor(head_bg); + m_send_time->SetFont(TABLE_HEAD_FONT); + m_send_time->SetCornerRadius(0); + m_send_time->SetMinSize(wxSize(FromDIP(TASK_LEFT_SEND_TIME), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_send_time->SetMaxSize(wxSize(FromDIP(TASK_LEFT_SEND_TIME), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_send_time->SetCenter(false); + m_send_time->Bind(wxEVT_ENTER_WINDOW, [&](wxMouseEvent& evt) { + SetCursor(wxCURSOR_HAND); + }); + m_send_time->Bind(wxEVT_LEAVE_WINDOW, [&](wxMouseEvent& evt) { + SetCursor(wxCURSOR_ARROW); + }); + m_send_time->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& evt) { + device_send_time = !device_send_time; + this->m_sort.set_role(SortItem::SortRule::SR_SEND_TIME, device_send_time); + this->refresh_user_device(); + }); + m_table_head_sizer->Add(m_send_time, 0, wxALIGN_CENTER_VERTICAL, 0); + + m_action = new Button(m_table_head_panel, _L("Actions"), "", wxNO_BORDER, ICON_SIZE, false); + m_action->SetBackgroundColor(TABLE_HEAR_NORMAL_COLOUR); + m_action->SetFont(TABLE_HEAD_FONT); + m_action->SetCornerRadius(0); + /* m_action->SetMinSize(wxSize(FromDIP(TASK_LEFT_PRO_INFO), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_action->SetMaxSize(wxSize(FromDIP(TASK_LEFT_PRO_INFO), FromDIP(DEVICE_ITEM_MAX_HEIGHT)));*/ + m_action->SetCenter(false); + m_table_head_sizer->Add(m_action, 0, wxALIGN_CENTER_VERTICAL, 0); + m_table_head_panel->SetSizer(m_table_head_sizer); + m_table_head_panel->Layout(); + + m_tip_text = new wxStaticText(m_main_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER); + m_tip_text->SetMinSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), -1)); + m_tip_text->SetMaxSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), -1)); + m_tip_text->SetLabel(_L("There are no tasks to be sent!")); + m_tip_text->SetForegroundColour(wxColour(50, 58, 61)); + m_tip_text->SetFont(::Label::Head_24); + m_tip_text->Wrap(-1); + + m_task_list = new wxScrolledWindow(m_main_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize); + m_task_list->SetBackgroundColour(*wxWHITE); + m_task_list->SetScrollRate(0, 5); + m_task_list->SetMinSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_task_list->SetMaxSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), 10 * FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + + m_sizer_task_list = new wxBoxSizer(wxVERTICAL); + m_task_list->SetSizer(m_sizer_task_list); + m_task_list->Layout(); + + m_main_sizer->AddSpacer(FromDIP(50)); + m_main_sizer->Add(m_table_head_panel, 0, wxALIGN_CENTER_HORIZONTAL, 0); + m_main_sizer->Add(m_tip_text, 0, wxALIGN_CENTER_HORIZONTAL | wxTOP, FromDIP(50)); + m_main_sizer->Add(m_task_list, 0, wxALIGN_CENTER_HORIZONTAL, 0); + m_main_sizer->AddSpacer(FromDIP(5)); + + // ctrl panel + StateColor ctrl_bg( + std::pair(CTRL_BUTTON_PRESSEN_COLOUR, StateColor::Pressed), + std::pair(CTRL_BUTTON_NORMAL_COLOUR, StateColor::Normal) + ); + + m_ctrl_btn_panel = new wxPanel(m_main_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); + m_ctrl_btn_panel->SetBackgroundColour(*wxWHITE); + m_ctrl_btn_panel->SetMinSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), -1)); + m_ctrl_btn_panel->SetMaxSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), -1)); + m_btn_sizer = new wxBoxSizer(wxHORIZONTAL); + btn_stop_all = new Button(m_ctrl_btn_panel, _L("Stop")); + btn_stop_all->SetBackgroundColor(ctrl_bg); + btn_stop_all->SetCornerRadius(FromDIP(5)); + m_sel_text = new wxStaticText(m_ctrl_btn_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize); + + m_btn_sizer->Add(m_sel_text, 0, wxLEFT, FromDIP(15));; + m_btn_sizer->Add(btn_stop_all, 0, wxLEFT, FromDIP(10)); + m_ctrl_btn_panel->SetSizer(m_btn_sizer); + m_ctrl_btn_panel->Layout(); + + m_main_sizer->AddSpacer(FromDIP(10)); + m_main_sizer->Add(m_ctrl_btn_panel, 0, wxALIGN_CENTER_HORIZONTAL, 0); + + btn_stop_all->Bind(wxEVT_BUTTON, &LocalTaskManagerPage::cancel_all, this); + m_main_panel->SetSizer(m_main_sizer); + m_main_panel->Layout(); + + page_sizer = new wxBoxSizer(wxVERTICAL); + page_sizer->Add(m_main_panel, 1, wxALL | wxEXPAND, FromDIP(25)); + + wxGetApp().UpdateDarkUIWin(this); + + SetSizer(page_sizer); + Layout(); + Fit(); +} + +void LocalTaskManagerPage::update_page() +{ + for (auto it = m_task_items.begin(); it != m_task_items.end(); it++) { + it->second->update_info(); + } +} + +void LocalTaskManagerPage::refresh_user_device(bool clear) +{ + m_sizer_task_list->Clear(false); + + Slic3r::DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (!dev) { + for (auto it = m_task_items.begin(); it != m_task_items.end(); it++) { + wxWindow* child = it->second; + child->Destroy(); + } + m_ctrl_btn_panel->Show(false); + return; + } + + if(clear)return; + + std::vector subscribe_list; + std::vector task_temps; + + auto all_machine = dev->get_my_cloud_machine_list(); + auto user_machine = std::map(); + + //selected machine + for (int i = 0; i < PICK_DEVICE_MAX; i++) { + auto dev_id = wxGetApp().app_config->get("multi_devices", std::to_string(i)); + + if (all_machine.count(dev_id) > 0) { + user_machine[dev_id] = all_machine[dev_id]; + } + } + + auto task_manager = wxGetApp().getTaskManager(); + if (task_manager) { + auto m_task_obj_list = task_manager->get_local_task_list(); + + for (auto it = m_task_obj_list.rbegin(); it != m_task_obj_list.rend(); ++it) { + + TaskStateInfo* task_state_info = it->second; + + if(!task_state_info) continue; + + MultiTaskItem* mtitem = new MultiTaskItem(m_task_list, nullptr, 0); + mtitem->task_obj = task_state_info; + mtitem->m_project_name = wxString::FromUTF8(task_state_info->get_task_name()); + mtitem->m_dev_name = task_state_info->get_device_name(); + mtitem->m_dev_id = task_state_info->params().dev_id; + mtitem->m_send_time = task_state_info->get_sent_time(); + mtitem->state_local_task = task_state_info->state(); + + task_state_info->set_state_changed_fn([this, mtitem](TaskState state, int percent) { + mtitem->state_local_task = state; + if (state == TaskState::TS_SEND_COMPLETED) { + + mtitem->m_send_time = mtitem->task_obj->get_sent_time(); + wxCommandEvent event(EVT_MULTI_REFRESH); + event.SetEventObject(mtitem); + wxPostEvent(mtitem, event); + } + mtitem->m_sending_percent = percent; + }); + + if (m_task_items.find(it->first) != m_task_items.end()) { + MultiTaskItem* item = m_task_items[it->first]; + if (item->state_selected == 1 && mtitem->state_local_task < 2) + mtitem->state_selected = item->state_selected; + item->Destroy(); + } + + m_task_items[it->first] = mtitem; + task_temps.push_back(mtitem); + } + + if (m_sort.rule != SortItem::SortRule::SR_None && m_sort.rule != SortItem::SortRule::SR_SEND_TIME) { + std::sort(task_temps.begin(), task_temps.end(), m_sort.get_call_back()); + } + + for (const auto& item : task_temps) + m_sizer_task_list->Add(item, 0, wxALL | wxEXPAND, 0); + + // maintenance + auto it = m_task_items.begin(); + while (it != m_task_items.end()) { + if (m_task_obj_list.find(it->first) != m_task_obj_list.end()) + ++it; + else { + it->second->Destroy(); + it = m_task_items.erase(it); + } + } + + dev->subscribe_device_list(subscribe_list); + int num = m_task_items.size() > 10 ? 10 : m_task_items.size(); + m_task_list->SetMinSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), num * FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_task_list->Layout(); + } + m_tip_text->Show(m_task_items.empty()); + m_ctrl_btn_panel->Show(!m_task_items.empty()); + Layout(); +} + +bool LocalTaskManagerPage::Show(bool show) +{ + if (show) { + refresh_user_device(); + } + else { + Slic3r::DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (dev) { + dev->subscribe_device_list(std::vector()); + } + } + return wxPanel::Show(show); +} + +void LocalTaskManagerPage::cancel_all(wxCommandEvent& evt) +{ + for (auto it = m_task_items.begin(); it != m_task_items.end(); it++) { + if (it->second->m_button_cancel->IsShown() && (it->second->get_state_selected() == 1) && it->second->state_local_task < 2) { + it->second->onCancel(); + } + } +} + +CloudTaskManagerPage::CloudTaskManagerPage(wxWindow* parent) + : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL) +{ +#ifdef __WINDOWS__ + SetDoubleBuffered(true); +#endif //__WINDOWS__ + SetBackgroundColour(wxColour(0xEEEEEE)); + m_sort.set_role(SortItem::SR_SEND_TIME, true); + + SetBackgroundColour(wxColour(0xEEEEEE)); + m_main_panel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); + m_main_panel->SetBackgroundColour(*wxWHITE); + m_main_sizer = new wxBoxSizer(wxVERTICAL); + + StateColor head_bg( + std::pair(TABLE_HEAD_PRESSED_COLOUR, StateColor::Pressed), + std::pair(TABLE_HEAR_NORMAL_COLOUR, StateColor::Normal) + ); + + StateColor ctrl_bg( + std::pair(CTRL_BUTTON_PRESSEN_COLOUR, StateColor::Pressed), + std::pair(CTRL_BUTTON_NORMAL_COLOUR, StateColor::Normal) + ); + + m_table_head_panel = new wxPanel(m_main_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize); + m_table_head_panel->SetMinSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), -1)); + m_table_head_panel->SetMaxSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), -1)); + m_table_head_panel->SetBackgroundColour(TABLE_HEAR_NORMAL_COLOUR); + m_table_head_sizer = new wxBoxSizer(wxHORIZONTAL); + + m_select_checkbox = new CheckBox(m_table_head_panel, wxID_ANY); + m_select_checkbox->SetMinSize(wxSize(FromDIP(TASK_LEFT_PRINTABLE), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_select_checkbox->SetMaxSize(wxSize(FromDIP(TASK_LEFT_PRINTABLE), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + //m_table_head_sizer->AddSpacer(FromDIP(TASK_LEFT_PADDING_LEFT)); + m_table_head_sizer->Add(m_select_checkbox, 0, wxALIGN_CENTER_VERTICAL, 0); + + m_select_checkbox->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent& e) { + if (m_select_checkbox->GetValue()) { + for (auto it = m_task_items.begin(); it != m_task_items.end(); it++) { + + if (it->second->state_cloud_task == 0) { + it->second->selected(); + } + } + } + else { + for (auto it = m_task_items.begin(); it != m_task_items.end(); it++) { + it->second->unselected(); + } + } + Refresh(false); + e.Skip(); + }); + + + + m_task_name = new Button(m_table_head_panel, _L("Task Name"), "", wxNO_BORDER, ICON_SIZE); + m_task_name->SetBackgroundColor(TABLE_HEAR_NORMAL_COLOUR); + m_task_name->SetFont(TABLE_HEAD_FONT); + m_task_name->SetCornerRadius(0); + m_task_name->SetMinSize(wxSize(FromDIP(TASK_LEFT_PRO_NAME), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_task_name->SetMaxSize(wxSize(FromDIP(TASK_LEFT_PRO_NAME), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_task_name->SetCenter(false); + m_table_head_sizer->Add(m_task_name, 0, wxALIGN_CENTER_VERTICAL, 0); + + m_printer_name = new Button(m_table_head_panel, _L("Device Name"), "toolbar_double_directional_arrow", wxNO_BORDER, ICON_SIZE); + m_printer_name->SetBackgroundColor(head_bg); + m_printer_name->SetFont(TABLE_HEAD_FONT); + m_printer_name->SetCornerRadius(0); + m_printer_name->SetMinSize(wxSize(FromDIP(TASK_LEFT_DEV_NAME), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_printer_name->SetMaxSize(wxSize(FromDIP(TASK_LEFT_DEV_NAME), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_printer_name->SetCenter(false); + m_printer_name->Bind(wxEVT_ENTER_WINDOW, [&](wxMouseEvent& evt) { + SetCursor(wxCURSOR_HAND); + }); + m_printer_name->Bind(wxEVT_LEAVE_WINDOW, [&](wxMouseEvent& evt) { + SetCursor(wxCURSOR_ARROW); + }); + m_printer_name->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& evt) { + device_name_big = !device_name_big; + this->m_sort.set_role(SortItem::SortRule::SR_DEV_NAME, device_name_big); + this->refresh_user_device(); + }); + m_table_head_sizer->Add(m_printer_name, 0, wxALIGN_CENTER_VERTICAL, 0); + + m_status = new Button(m_table_head_panel, _L("Task Status"), "toolbar_double_directional_arrow", wxNO_BORDER, ICON_SIZE); + m_status->SetBackgroundColor(head_bg); + m_status->SetFont(TABLE_HEAD_FONT); + m_status->SetCornerRadius(0); + m_status->SetMinSize(wxSize(FromDIP(TASK_LEFT_PRO_STATE), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_status->SetMaxSize(wxSize(FromDIP(TASK_LEFT_PRO_STATE), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_status->SetCenter(false); + m_status->Bind(wxEVT_ENTER_WINDOW, [&](wxMouseEvent& evt) { + SetCursor(wxCURSOR_HAND); + }); + m_status->Bind(wxEVT_LEAVE_WINDOW, [&](wxMouseEvent& evt) { + SetCursor(wxCURSOR_ARROW); + }); + m_status->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& evt) { + device_state_big = !device_state_big; + this->m_sort.set_role(SortItem::SortRule::SR_CLOUD_TASK_STATE, device_state_big); + this->refresh_user_device(); + }); + m_table_head_sizer->Add(m_status, 0, wxALIGN_CENTER_VERTICAL, 0); + + m_info = new Button(m_table_head_panel, _L("Info"), "", wxNO_BORDER, ICON_SIZE); + m_info->SetBackgroundColor(TABLE_HEAR_NORMAL_COLOUR); + m_info->SetFont(TABLE_HEAD_FONT); + m_info->SetCornerRadius(0); + m_info->SetMinSize(wxSize(FromDIP(TASK_LEFT_PRO_INFO), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_info->SetMaxSize(wxSize(FromDIP(TASK_LEFT_PRO_INFO), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_info->SetCenter(false); + m_table_head_sizer->Add(m_info, 0, wxALIGN_CENTER_VERTICAL, 0); + + m_send_time = new Button(m_table_head_panel, _L("Sent Time"), "toolbar_double_directional_arrow", wxNO_BORDER, ICON_SIZE, false); + m_send_time->SetBackgroundColor(head_bg); + m_send_time->SetFont(TABLE_HEAD_FONT); + m_send_time->SetCornerRadius(0); + m_send_time->SetMinSize(wxSize(FromDIP(TASK_LEFT_SEND_TIME), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_send_time->SetMaxSize(wxSize(FromDIP(TASK_LEFT_SEND_TIME), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_send_time->SetCenter(false); + m_send_time->Bind(wxEVT_ENTER_WINDOW, [&](wxMouseEvent& evt) { + SetCursor(wxCURSOR_HAND); + }); + m_send_time->Bind(wxEVT_LEAVE_WINDOW, [&](wxMouseEvent& evt) { + SetCursor(wxCURSOR_ARROW); + }); + m_send_time->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& evt) { + device_send_time = !device_send_time; + this->m_sort.set_role(SortItem::SortRule::SR_SEND_TIME, device_send_time); + this->refresh_user_device(); + }); + m_table_head_sizer->Add(m_send_time, 0, wxALIGN_CENTER_VERTICAL, 0); + + m_action = new Button(m_table_head_panel, _L("Actions"), "", wxNO_BORDER, ICON_SIZE, false); + m_action->SetBackgroundColor(TABLE_HEAR_NORMAL_COLOUR); + m_action->SetFont(TABLE_HEAD_FONT); + m_action->SetCornerRadius(0); + m_action->SetMinSize(wxSize(FromDIP(TASK_LEFT_PRO_INFO), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_action->SetMaxSize(wxSize(FromDIP(TASK_LEFT_PRO_INFO), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_action->SetCenter(false); + m_table_head_sizer->Add(m_action, 0, wxALIGN_CENTER_VERTICAL, 0); + m_table_head_panel->SetSizer(m_table_head_sizer); + m_table_head_panel->Layout(); + + m_tip_text = new wxStaticText(m_main_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER); + m_tip_text->SetMinSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), -1)); + m_tip_text->SetMaxSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), -1)); + m_tip_text->SetLabel(_L("No historical tasks!")); + m_tip_text->SetForegroundColour(wxColour(50, 58, 61)); + m_tip_text->SetFont(::Label::Head_24); + m_tip_text->Wrap(-1); + + m_loading_text = new wxStaticText(m_main_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER); + m_loading_text->SetMinSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), -1)); + m_loading_text->SetMaxSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), -1)); + m_loading_text->SetLabel(_L("Loading...")); + m_loading_text->SetForegroundColour(wxColour(50, 58, 61)); + m_loading_text->SetFont(::Label::Head_24); + m_loading_text->Wrap(-1); + m_loading_text->Show(false); + + m_task_list = new wxScrolledWindow(m_main_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize); + m_task_list->SetBackgroundColour(*wxWHITE); + m_task_list->SetScrollRate(0, 5); + m_task_list->SetMinSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_task_list->SetMaxSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), 10 * FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + + m_sizer_task_list = new wxBoxSizer(wxVERTICAL); + m_task_list->SetSizer(m_sizer_task_list); + m_task_list->Layout(); + m_task_list->Fit(); + + m_main_sizer->AddSpacer(FromDIP(50)); + m_main_sizer->Add(m_table_head_panel, 0, wxALIGN_CENTER_HORIZONTAL, 0); + m_main_sizer->Add(m_tip_text, 0, wxALIGN_CENTER_HORIZONTAL | wxTOP, FromDIP(50)); + m_main_sizer->Add(m_loading_text, 0, wxALIGN_CENTER_HORIZONTAL | wxTOP, FromDIP(50)); + m_main_sizer->Add(m_task_list, 0, wxALIGN_CENTER_HORIZONTAL, 0); + m_main_sizer->AddSpacer(FromDIP(5)); + + // add flipping page + m_flipping_panel = new wxPanel(m_main_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize); + m_flipping_panel->SetMinSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), -1)); + m_flipping_panel->SetMaxSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), -1)); + m_flipping_panel->SetBackgroundColour(*wxWHITE); + + m_flipping_page_sizer = new wxBoxSizer(wxHORIZONTAL); + m_page_sizer = new wxBoxSizer(wxVERTICAL); + btn_last_page = new Button(m_flipping_panel, "", "go_last_plate", wxBORDER_NONE, FromDIP(20)); + btn_last_page->SetMinSize(wxSize(FromDIP(20), FromDIP(20))); + btn_last_page->SetMaxSize(wxSize(FromDIP(20), FromDIP(20))); + btn_last_page->SetBackgroundColor(head_bg); + btn_last_page->Bind(wxEVT_COMMAND_BUTTON_CLICKED, [&](auto& evt) { + evt.Skip(); + if (m_current_page == 0) + return; + enable_buttons(false); + start_timer(); + m_current_page--; + if (m_current_page < 0) + m_current_page = 0; + refresh_user_device(); + update_page_number(); + /*m_sizer_task_list->Clear(false); + m_loading_text->Show(true); + Layout();*/ + }); + st_page_number = new wxStaticText(m_flipping_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize); + btn_next_page = new Button(m_flipping_panel, "", "go_next_plate", wxBORDER_NONE, FromDIP(20)); + btn_next_page->SetMinSize(wxSize(FromDIP(20), FromDIP(20))); + btn_next_page->SetMaxSize(wxSize(FromDIP(20), FromDIP(20))); + btn_next_page->SetBackgroundColor(head_bg); + btn_next_page->Bind(wxEVT_COMMAND_BUTTON_CLICKED, [&](auto& evt) { + evt.Skip(); + if (m_current_page == m_total_page - 1) + return; + enable_buttons(false); + start_timer(); + m_current_page++; + if (m_current_page > m_total_page - 1) + m_current_page = m_total_page - 1; + refresh_user_device(); + update_page_number(); + /*m_sizer_task_list->Clear(false); + m_loading_text->Show(true); + Layout();*/ + }); + + m_page_num_input = new ::TextInput(m_flipping_panel, wxEmptyString, wxEmptyString, wxEmptyString, wxDefaultPosition, wxSize(FromDIP(50), -1), wxTE_PROCESS_ENTER); + StateColor input_bg(std::pair(wxColour("#F0F0F1"), StateColor::Disabled), std::pair(*wxWHITE, StateColor::Enabled)); + m_page_num_input->SetBackgroundColor(input_bg); + m_page_num_input->GetTextCtrl()->SetValue("1"); + wxTextValidator validator(wxFILTER_DIGITS); + m_page_num_input->GetTextCtrl()->SetValidator(validator); + m_page_num_input->GetTextCtrl()->Bind(wxEVT_TEXT_ENTER, [&](wxCommandEvent& e) { + page_num_enter_evt(); + }); + + m_page_num_enter = new Button(m_flipping_panel, _("Go")); + m_page_num_enter->SetMinSize(wxSize(FromDIP(25), FromDIP(25))); + m_page_num_enter->SetMaxSize(wxSize(FromDIP(25), FromDIP(25))); + m_page_num_enter->SetBackgroundColor(ctrl_bg); + m_page_num_enter->SetCornerRadius(FromDIP(5)); + m_page_num_enter->Bind(wxEVT_COMMAND_BUTTON_CLICKED, [&](auto& evt) { + page_num_enter_evt(); + }); + + m_flipping_page_sizer->Add(0, 0, 1, wxEXPAND, 0); + m_flipping_page_sizer->Add(btn_last_page, 0, wxALIGN_CENTER, 0); + m_flipping_page_sizer->Add(st_page_number, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, FromDIP(5)); + m_flipping_page_sizer->Add(btn_next_page, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, FromDIP(5)); + m_flipping_page_sizer->Add(m_page_num_input, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, FromDIP(20)); + m_flipping_page_sizer->Add(m_page_num_enter, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, FromDIP(5)); + m_flipping_page_sizer->Add(0, 0, 1, wxEXPAND, 0); + m_page_sizer->Add(m_flipping_page_sizer, 0, wxALIGN_CENTER_HORIZONTAL, FromDIP(5)); + m_flipping_panel->SetSizer(m_page_sizer); + m_flipping_panel->Layout(); + m_main_sizer->Add(m_flipping_panel, 0, wxALIGN_CENTER_HORIZONTAL, 0); + + m_ctrl_btn_panel = new wxPanel(m_main_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); + m_ctrl_btn_panel->SetBackgroundColour(*wxWHITE); + m_ctrl_btn_panel->SetMinSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), -1)); + m_ctrl_btn_panel->SetMaxSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), -1)); + m_btn_sizer = new wxBoxSizer(wxHORIZONTAL); + btn_pause_all = new Button(m_ctrl_btn_panel, _L("Pause")); + btn_pause_all->SetBackgroundColor(ctrl_bg); + btn_pause_all->SetCornerRadius(FromDIP(5)); + btn_continue_all = new Button(m_ctrl_btn_panel, _L("Resume")); + btn_continue_all->SetBackgroundColor(ctrl_bg); + btn_continue_all->SetCornerRadius(FromDIP(5)); + btn_stop_all = new Button(m_ctrl_btn_panel, _L("Stop")); + btn_stop_all->SetBackgroundColor(ctrl_bg); + btn_stop_all->SetCornerRadius(FromDIP(5)); + m_sel_text = new wxStaticText(m_ctrl_btn_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize); + + btn_pause_all->Bind(wxEVT_BUTTON, &CloudTaskManagerPage::pause_all, this); + btn_continue_all->Bind(wxEVT_BUTTON, &CloudTaskManagerPage::resume_all, this); + btn_stop_all->Bind(wxEVT_BUTTON, &CloudTaskManagerPage::stop_all, this); + + m_btn_sizer->Add(m_sel_text, 0, wxLEFT, FromDIP(15)); + m_btn_sizer->Add(btn_pause_all, 0, wxLEFT, FromDIP(10)); + m_btn_sizer->Add(btn_continue_all, 0, wxLEFT, FromDIP(10)); + m_btn_sizer->Add(btn_stop_all, 0, wxLEFT, FromDIP(10)); + m_ctrl_btn_panel->SetSizer(m_btn_sizer); + m_ctrl_btn_panel->Layout(); + + m_main_sizer->AddSpacer(FromDIP(10)); + m_main_sizer->Add(m_ctrl_btn_panel, 0, wxALIGN_CENTER_HORIZONTAL, 0); + m_main_panel->SetSizer(m_main_sizer); + m_main_panel->Layout(); + + page_sizer = new wxBoxSizer(wxVERTICAL); + page_sizer->Add(m_main_panel, 1, wxALL | wxEXPAND, FromDIP(25)); + Bind(wxEVT_TIMER, &CloudTaskManagerPage::on_timer, this); + + wxGetApp().UpdateDarkUIWin(this); + + SetSizer(page_sizer); + Layout(); + Fit(); +} + +CloudTaskManagerPage::~CloudTaskManagerPage() +{ + if (m_flipping_timer) + m_flipping_timer->Stop(); + delete m_flipping_timer; +} + + +void CloudTaskManagerPage::refresh_user_device(bool clear) +{ + m_sizer_task_list->Clear(false); + + Slic3r::DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (!dev) { + for (auto it = m_task_items.begin(); it != m_task_items.end(); it++) { + wxWindow* child = it->second; + child->Destroy(); + } + m_flipping_panel->Show(false); + m_ctrl_btn_panel->Show(false); + return; + } + + if (clear) return; + + std::vector task_temps; + std::vector subscribe_list; + + auto all_machine = dev->get_my_cloud_machine_list(); + auto user_machine = std::map(); + + //selected machine + for (int i = 0; i < PICK_DEVICE_MAX; i++) { + auto dev_id = wxGetApp().app_config->get("multi_devices", std::to_string(i)); + + if (all_machine.count(dev_id) > 0) { + user_machine[dev_id] = all_machine[dev_id]; + } + } + + auto task_manager = wxGetApp().getTaskManager(); + if (task_manager) { + auto m_task_obj_list = task_manager->get_task_list(m_current_page, m_count_page_item, m_total_count); + + for (auto it = m_task_obj_list.begin(); it != m_task_obj_list.end(); it++) { + + TaskStateInfo task_state_info = it->second; + MachineObject* machine_obj = nullptr; + + if (user_machine.count(task_state_info.params().dev_id)) { + machine_obj = user_machine[task_state_info.params().dev_id]; + } + + MultiTaskItem* mtitem = new MultiTaskItem(m_task_list, machine_obj, 1); + //mtitem->task_obj = task_state_info; + mtitem->m_job_id = task_state_info.get_job_id(); + mtitem->m_project_name = wxString::FromUTF8(task_state_info.get_task_name()); + mtitem->m_dev_name = task_state_info.get_device_name(); + mtitem->m_dev_id = task_state_info.params().dev_id; + + mtitem->m_send_time = utc_time_to_date(task_state_info.start_time); + + if (task_state_info.state() == TS_PRINTING) { + mtitem->state_cloud_task = 0; + } + else if (task_state_info.state() == TS_PRINT_SUCCESS) { + mtitem->state_cloud_task = 1; + } + else if (task_state_info.state() == TS_PRINT_FAILED) { + mtitem->state_cloud_task = 2; + } + + if (m_task_items.find(it->first) != m_task_items.end()) { + MultiTaskItem* item = m_task_items[it->first]; + if (item->state_selected == 1 && mtitem->state_cloud_task == 0) + mtitem->state_selected = item->state_selected; + item->Destroy(); + } + + m_task_items[it->first] = mtitem; + mtitem->update_info(); + task_temps.push_back(mtitem); + + auto find_it = std::find(subscribe_list.begin(), subscribe_list.end(), mtitem->m_dev_id); + if (find_it == subscribe_list.end()) { + subscribe_list.push_back(mtitem->m_dev_id); + } + } + + dev->subscribe_device_list(subscribe_list); + + if (m_sort.rule == SortItem::SortRule::SR_None) { + this->device_send_time = true; + m_sort.set_role(SortItem::SortRule::SR_SEND_TIME, device_send_time); + } + std::sort(task_temps.begin(), task_temps.end(), m_sort.get_call_back()); + + for (const auto& item : task_temps) + m_sizer_task_list->Add(item, 0, wxALL | wxEXPAND, 0); + + // maintenance + auto it = m_task_items.begin(); + while (it != m_task_items.end()) { + if (m_task_obj_list.find(it->first) != m_task_obj_list.end()) { + ++it; + } + else { + it->second->Destroy(); + it = m_task_items.erase(it); + } + } + m_sizer_task_list->Layout(); + int num = m_task_items.size() > 10 ? 10 : m_task_items.size(); + m_task_list->SetMinSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), num * FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_task_list->Layout(); + } + + update_page_number(); + + m_tip_text->Show(m_task_items.empty()); + m_flipping_panel->Show(m_total_page > 1); + m_ctrl_btn_panel->Show(!m_task_items.empty()); + Layout(); +} + +std::string CloudTaskManagerPage::utc_time_to_date(std::string utc_time) +{ + /*std::tm timeInfo = {}; + std::istringstream iss(utc_time); + iss >> std::get_time(&timeInfo, "%Y-%m-%dT%H:%M:%SZ"); + + std::chrono::system_clock::time_point tp = std::chrono::system_clock::from_time_t(std::mktime(&timeInfo)); + std::time_t localTime = std::chrono::system_clock::to_time_t(tp); + std::tm* localTimeInfo = std::localtime(&localTime); + + std::stringstream ss; + ss << std::put_time(localTimeInfo, "%Y-%m-%d %H:%M:%S"); + return ss.str();*/ + std::string send_time; + + + std::tm timeInfo = {}; + std::istringstream iss(utc_time); + iss >> std::get_time(&timeInfo, "%Y-%m-%dT%H:%M:%SZ"); + + std::chrono::system_clock::time_point tp = std::chrono::system_clock::from_time_t(std::mktime(&timeInfo)); + std::time_t utcTime = std::chrono::system_clock::to_time_t(tp); + + + wxDateTime::TimeZone tz(wxDateTime::Local); + long offset = tz.GetOffset(); + + + std::time_t localTime = utcTime + offset; + + std::tm* localTimeInfo = std::localtime(&localTime); + std::stringstream ss; + ss << std::put_time(localTimeInfo, "%Y-%m-%d %H:%M:%S"); + send_time = ss.str(); + + + return send_time; +} + + +bool CloudTaskManagerPage::Show(bool show) +{ + if (show) { + refresh_user_device(); + } + else { + Slic3r::DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (dev) { + dev->subscribe_device_list(std::vector()); + } + } + + return wxPanel::Show(show); +} + +void CloudTaskManagerPage::update_page() +{ + for (auto it = m_task_items.begin(); it != m_task_items.end(); it++) { + it->second->sync_state(); + it->second->update_info(); + } +} + +void CloudTaskManagerPage::update_page_number() +{ + double result = static_cast(m_total_count) / m_count_page_item; + m_total_page = std::ceil(result); + + wxString number = wxString(std::to_string(m_current_page + 1)) + " / " + wxString(std::to_string(m_total_page)); + st_page_number->SetLabel(number); +} + +void CloudTaskManagerPage::start_timer() +{ + if (m_flipping_timer) { + m_flipping_timer->Stop(); + } + else { + m_flipping_timer = new wxTimer(); + } + + m_flipping_timer->SetOwner(this); + m_flipping_timer->Start(1000); + wxPostEvent(this, wxTimerEvent()); +} + +void CloudTaskManagerPage::on_timer(wxTimerEvent& event) +{ + m_flipping_timer->Stop(); + enable_buttons(true); + update_page_number(); +} + +void CloudTaskManagerPage::pause_all(wxCommandEvent& evt) +{ + for (auto it = m_task_items.begin(); it != m_task_items.end(); it++) { + if (it->second->m_button_pause->IsShown() && (it->second->get_state_selected() == 1) && it->second->state_cloud_task == 0) { + it->second->onPause(); + } + } +} + +void CloudTaskManagerPage::resume_all(wxCommandEvent& evt) +{ + for (auto it = m_task_items.begin(); it != m_task_items.end(); it++) { + if (it->second->m_button_resume->IsShown() && (it->second->get_state_selected() == 1) && it->second->state_cloud_task == 0) { + it->second->onResume(); + } + } +} + +void CloudTaskManagerPage::stop_all(wxCommandEvent& evt) +{ + for (auto it = m_task_items.begin(); it != m_task_items.end(); it++) { + if (it->second->m_button_stop->IsShown() && (it->second->get_state_selected() == 1) && it->second->state_cloud_task == 0) { + it->second->onStop(); + } + } +} + +void CloudTaskManagerPage::enable_buttons(bool enable) +{ + btn_last_page->Enable(enable); + btn_next_page->Enable(enable); + btn_pause_all->Enable(enable); + btn_continue_all->Enable(enable); + btn_stop_all->Enable(enable); +} + +void CloudTaskManagerPage::page_num_enter_evt() +{ + enable_buttons(false); + start_timer(); + auto value = m_page_num_input->GetTextCtrl()->GetValue(); + long page_num = 0; + if (value.ToLong(&page_num)) { + if (page_num > m_total_page) + m_current_page = m_total_page - 1; + else if (page_num < 1) + m_current_page = 0; + else + m_current_page = page_num - 1; + } + refresh_user_device(); + update_page_number(); + /*m_sizer_task_list->Clear(false); + m_loading_text->Show(true); + Layout();*/ +} + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/MultiTaskManagerPage.hpp b/src/slic3r/GUI/MultiTaskManagerPage.hpp new file mode 100644 index 0000000000..40341560ed --- /dev/null +++ b/src/slic3r/GUI/MultiTaskManagerPage.hpp @@ -0,0 +1,208 @@ +#ifndef slic3r_MultiTaskManagerPage_hpp_ +#define slic3r_MultiTaskManagerPage_hpp_ + +#include "GUI_App.hpp" +#include "GUI_Utils.hpp" +#include "MultiMachine.hpp" +#include "DeviceManager.hpp" +#include "TaskManager.hpp" +#include "Widgets/Label.hpp" +#include "Widgets/Button.hpp" +#include "Widgets/CheckBox.hpp" +#include "Widgets/ComboBox.hpp" +#include "Widgets/ScrolledWindow.hpp" +#include "Widgets/PopupWindow.hpp" +#include "Widgets/TextInput.hpp" + +namespace Slic3r { +namespace GUI { + +#define CLOUD_TASK_ITEM_MAX_WIDTH 1100 +#define TASK_ITEM_MAX_WIDTH 900 +#define TASK_LEFT_PADDING_LEFT 15 +#define TASK_LEFT_PRINTABLE 40 +#define TASK_LEFT_PRO_NAME 180 +#define TASK_LEFT_DEV_NAME 150 +#define TASK_LEFT_PRO_STATE 170 +#define TASK_LEFT_PRO_INFO 230 +#define TASK_LEFT_SEND_TIME 180 + +class MultiTaskItem : public DeviceItem +{ +public: + MultiTaskItem(wxWindow* parent, MachineObject* obj, int type); + ~MultiTaskItem() {}; + + + void OnEnterWindow(wxMouseEvent& evt); + void OnLeaveWindow(wxMouseEvent& evt); + void OnSelectedDevice(wxCommandEvent& evt); + void OnLeftDown(wxMouseEvent& evt); + void OnMove(wxMouseEvent& evt); + + void paintEvent(wxPaintEvent& evt); + void render(wxDC& dc); + void doRender(wxDC& dc); + void DrawTextWithEllipsis(wxDC& dc, const wxString& text, int maxWidth, int left, int top = 0); + void post_event(wxCommandEvent&& event); + virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO); + + bool m_hover{ false }; + wxString get_left_time(int mc_left_time); + + ScalableBitmap m_bitmap_check_disable; + ScalableBitmap m_bitmap_check_off; + ScalableBitmap m_bitmap_check_on; + + int m_sending_percent{0}; + int m_task_type{0}; //0-local 1-cloud + wxString m_project_name; + wxString m_dev_name; + std::string m_dev_id; + TaskStateInfo* task_obj { nullptr }; + std::string m_job_id; + //std::string m_sent_time; + + Button* m_button_resume{ nullptr }; + Button* m_button_cancel{ nullptr }; + Button* m_button_pause{ nullptr }; + Button* m_button_stop{ nullptr }; + + void update_info(); + void onPause(); + void onResume(); + void onStop(); + void onCancel(); +}; + +class LocalTaskManagerPage : public wxPanel +{ +public: + LocalTaskManagerPage(wxWindow* parent); + ~LocalTaskManagerPage() {}; + + void update_page(); + void refresh_user_device(bool clear = false); + bool Show(bool show); + void cancel_all(wxCommandEvent& evt); + +private: + SortItem m_sort; + std::map m_task_items; + bool device_name_big{ true }; + bool device_state_big{ true }; + bool device_send_time{ true }; + + wxPanel* m_main_panel{ nullptr }; + wxBoxSizer* m_main_sizer{ nullptr }; + wxBoxSizer* page_sizer{ nullptr }; + wxBoxSizer* m_sizer_task_list{ nullptr }; + wxScrolledWindow* m_task_list{ nullptr }; + wxStaticText* m_selected_num{ nullptr }; + + // table head + wxPanel* m_table_head_panel{ nullptr }; + wxBoxSizer* m_table_head_sizer{ nullptr }; + CheckBox* m_select_checkbox{ nullptr }; + Button* m_task_name{ nullptr }; + Button* m_printer_name{ nullptr }; + Button* m_status{ nullptr }; + Button* m_info{ nullptr }; + Button* m_send_time{ nullptr }; + Button* m_action{ nullptr }; + + // ctrl button for all + int m_sel_number{0}; + wxPanel* m_ctrl_btn_panel{ nullptr }; + wxBoxSizer* m_btn_sizer{ nullptr }; + Button* btn_stop_all{ nullptr }; + wxStaticText* m_sel_text{ nullptr }; + + // tip when no device + wxStaticText* m_tip_text{ nullptr }; +}; + +class CloudTaskManagerPage : public wxPanel +{ +public: + CloudTaskManagerPage(wxWindow* parent); + ~CloudTaskManagerPage(); + + void update_page(); + void refresh_user_device(bool clear = false); + std::string utc_time_to_date(std::string utc_time); + bool Show(bool show); + void update_page_number(); + void start_timer(); + void on_timer(wxTimerEvent& event); + + void pause_all(wxCommandEvent& evt); + void resume_all(wxCommandEvent& evt); + void stop_all(wxCommandEvent& evt); + + void enable_buttons(bool enable); + void page_num_enter_evt(); + +private: + SortItem m_sort; + bool device_name_big{ true }; + bool device_state_big{ true }; + bool device_send_time{ true }; + + /* job_id -> sel */ + std::map m_task_items; + + wxPanel* m_main_panel{ nullptr }; + wxBoxSizer* page_sizer{ nullptr }; + wxBoxSizer* m_sizer_task_list{ nullptr }; + wxBoxSizer* m_main_sizer{ nullptr }; + wxScrolledWindow* m_task_list{ nullptr }; + wxStaticText* m_selected_num{ nullptr }; + + // Flipping pages + int m_current_page{ 0 }; + int m_total_page{0}; + int m_total_count{ 0 }; + int m_count_page_item{ 10 }; + bool prev{ false }; + bool next{ false }; + Button* btn_last_page{ nullptr }; + Button* btn_next_page{ nullptr }; + wxStaticText* st_page_number{ nullptr }; + wxBoxSizer* m_flipping_page_sizer{ nullptr }; + wxBoxSizer* m_page_sizer{ nullptr }; + wxPanel* m_flipping_panel{ nullptr }; + wxTimer* m_flipping_timer{ nullptr }; + TextInput* m_page_num_input{ nullptr }; + Button* m_page_num_enter{ nullptr }; + + // table head + wxPanel* m_table_head_panel{ nullptr }; + wxBoxSizer* m_table_head_sizer{ nullptr }; + CheckBox* m_select_checkbox{ nullptr }; + Button* m_task_name{ nullptr }; + Button* m_printer_name{ nullptr }; + Button* m_status{ nullptr }; + Button* m_info{ nullptr }; + Button* m_send_time{ nullptr }; + Button* m_action{ nullptr }; + + // ctrl button for all + int m_sel_number; + wxPanel* m_ctrl_btn_panel{ nullptr }; + wxBoxSizer* m_btn_sizer{ nullptr }; + Button* btn_pause_all{ nullptr }; + Button* btn_continue_all{ nullptr }; + Button* btn_stop_all{ nullptr }; + wxStaticText* m_sel_text{ nullptr }; + + // tip when no device + wxStaticText* m_tip_text{ nullptr }; + wxStaticText* m_loading_text{ nullptr }; +}; + + +} // namespace GUI +} // namespace Slic3r + +#endif diff --git a/src/slic3r/GUI/MultiTaskModel.cpp b/src/slic3r/GUI/MultiTaskModel.cpp new file mode 100644 index 0000000000..b23468b93e --- /dev/null +++ b/src/slic3r/GUI/MultiTaskModel.cpp @@ -0,0 +1,6 @@ + +namespace Slic3r { +namespace GUI { + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/MultiTaskModel.hpp b/src/slic3r/GUI/MultiTaskModel.hpp new file mode 100644 index 0000000000..6b233e9302 --- /dev/null +++ b/src/slic3r/GUI/MultiTaskModel.hpp @@ -0,0 +1,11 @@ +#ifndef slic3r_MultiTaskModel_hpp_ +#define slic3r_MultiTaskModel_hpp_ + +namespace Slic3r { +namespace GUI { + + +} // namespace GUI +} // namespace Slic3r + +#endif diff --git a/src/slic3r/GUI/ObjColorDialog.cpp b/src/slic3r/GUI/ObjColorDialog.cpp new file mode 100644 index 0000000000..648faffbf9 --- /dev/null +++ b/src/slic3r/GUI/ObjColorDialog.cpp @@ -0,0 +1,817 @@ +#include +#include +//#include "libslic3r/FlushVolCalc.hpp" +#include "ObjColorDialog.hpp" +#include "BitmapCache.hpp" +#include "GUI.hpp" +#include "I18N.hpp" +#include "GUI_App.hpp" +#include "MsgDialog.hpp" +#include "Widgets/Button.hpp" +#include "slic3r/Utils/ColorSpaceConvert.hpp" +#include "MainFrame.hpp" +#include "libslic3r/Config.hpp" +#include "BitmapComboBox.hpp" +#include "Widgets/ComboBox.hpp" +#include + +#include "libslic3r/ObjColorUtils.hpp" + +using namespace Slic3r; +using namespace Slic3r::GUI; + +int objcolor_scale(const int val) { return val * Slic3r::GUI::wxGetApp().em_unit() / 10; } +int OBJCOLOR_ITEM_WIDTH() { return objcolor_scale(30); } +static const wxColour g_text_color = wxColour(107, 107, 107, 255); +const int HEADER_BORDER = 5; +const int CONTENT_BORDER = 3; +const int PANEL_WIDTH = 370; +const int COLOR_LABEL_WIDTH = 180; +#define ICON_SIZE wxSize(FromDIP(16), FromDIP(16)) +#define MIN_OBJCOLOR_DIALOG_WIDTH FromDIP(400) +#define FIX_SCROLL_HEIGTH FromDIP(400) +#define BTN_SIZE wxSize(FromDIP(58), FromDIP(24)) +#define BTN_GAP FromDIP(20) + +static void update_ui(wxWindow* window) +{ + Slic3r::GUI::wxGetApp().UpdateDarkUI(window); +} + +static const char g_min_cluster_color = 1; +//static const char g_max_cluster_color = 15; +static const char g_max_color = 16; +const StateColor ok_btn_bg(std::pair(wxColour(0, 137, 123), StateColor::Pressed), + std::pair(wxColour(38, 166, 154), StateColor::Hovered), + std::pair(wxColour(0, 150, 136), StateColor::Normal)); +const StateColor ok_btn_disable_bg(std::pair(wxColour(205, 201, 201), StateColor::Pressed), + std::pair(wxColour(205, 201, 201), StateColor::Hovered), + std::pair(wxColour(205, 201, 201), StateColor::Normal)); +wxBoxSizer* ObjColorDialog::create_btn_sizer(long flags) +{ + auto btn_sizer = new wxBoxSizer(wxHORIZONTAL); + btn_sizer->AddStretchSpacer(); + + StateColor ok_btn_bd( + std::pair(wxColour(0, 150, 136), StateColor::Normal) + ); + StateColor ok_btn_text( + std::pair(wxColour(255, 255, 254), StateColor::Normal) + ); + StateColor cancel_btn_bg( + std::pair(wxColour(206, 206, 206), StateColor::Pressed), + std::pair(wxColour(238, 238, 238), StateColor::Hovered), + std::pair(wxColour(255, 255, 255), StateColor::Normal) + ); + StateColor cancel_btn_bd_( + std::pair(wxColour(38, 46, 48), StateColor::Normal) + ); + StateColor cancel_btn_text( + std::pair(wxColour(38, 46, 48), StateColor::Normal) + ); + StateColor calc_btn_bg( + std::pair(wxColour(0, 137, 123), StateColor::Pressed), + std::pair(wxColour(38, 166, 154), StateColor::Hovered), + std::pair(wxColour(0, 150, 136), StateColor::Normal) + ); + StateColor calc_btn_bd( + std::pair(wxColour(0, 150, 136), StateColor::Normal) + ); + StateColor calc_btn_text( + std::pair(wxColour(255, 255, 254), StateColor::Normal) + ); + if (flags & wxOK) { + Button* ok_btn = new Button(this, _L("OK")); + ok_btn->SetMinSize(BTN_SIZE); + ok_btn->SetCornerRadius(FromDIP(12)); + ok_btn->Enable(false); + ok_btn->SetBackgroundColor(ok_btn_disable_bg); + ok_btn->SetBorderColor(ok_btn_bd); + ok_btn->SetTextColor(ok_btn_text); + ok_btn->SetFocus(); + ok_btn->SetId(wxID_OK); + btn_sizer->Add(ok_btn, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, BTN_GAP); + m_button_list[wxOK] = ok_btn; + } + if (flags & wxCANCEL) { + Button* cancel_btn = new Button(this, _L("Cancel")); + cancel_btn->SetMinSize(BTN_SIZE); + cancel_btn->SetCornerRadius(FromDIP(12)); + cancel_btn->SetBackgroundColor(cancel_btn_bg); + cancel_btn->SetBorderColor(cancel_btn_bd_); + cancel_btn->SetTextColor(cancel_btn_text); + cancel_btn->SetId(wxID_CANCEL); + btn_sizer->Add(cancel_btn, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, BTN_GAP); + m_button_list[wxCANCEL] = cancel_btn; + } + return btn_sizer; +} + +void ObjColorDialog::on_dpi_changed(const wxRect &suggested_rect) +{ + for (auto button_item : m_button_list) + { + if (button_item.first == wxRESET) + { + button_item.second->SetMinSize(wxSize(FromDIP(75), FromDIP(24))); + button_item.second->SetCornerRadius(FromDIP(12)); + } + if (button_item.first == wxOK) { + button_item.second->SetMinSize(BTN_SIZE); + button_item.second->SetCornerRadius(FromDIP(12)); + } + if (button_item.first == wxCANCEL) { + button_item.second->SetMinSize(BTN_SIZE); + button_item.second->SetCornerRadius(FromDIP(12)); + } + } + m_panel_ObjColor->msw_rescale(); + this->Refresh(); +}; + +ObjColorDialog::ObjColorDialog(wxWindow * parent, + std::vector & input_colors, + bool is_single_color, + const std::vector &extruder_colours, + std::vector & filament_ids, + unsigned char & first_extruder_id) + : DPIDialog(parent ? parent : static_cast(wxGetApp().mainframe), + wxID_ANY, + _(L("Obj file Import color")), + wxDefaultPosition, + wxDefaultSize, + wxDEFAULT_DIALOG_STYLE /* | wxRESIZE_BORDER*/) + , m_filament_ids(filament_ids) + , m_first_extruder_id(first_extruder_id) +{ + std::string icon_path = (boost::format("%1%/images/OrcaSlicerTitle.ico") % Slic3r::resources_dir()).str(); + SetIcon(wxIcon(Slic3r::encode_path(icon_path.c_str()), wxBITMAP_TYPE_ICO)); + + auto m_line_top = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 1)); + m_line_top->SetBackgroundColour(wxColour(166, 169, 170)); + + this->SetBackgroundColour(*wxWHITE); + this->SetMinSize(wxSize(MIN_OBJCOLOR_DIALOG_WIDTH, -1)); + + m_panel_ObjColor = new ObjColorPanel(this, input_colors, is_single_color, extruder_colours, filament_ids, first_extruder_id); + + auto main_sizer = new wxBoxSizer(wxVERTICAL); + main_sizer->Add(m_line_top, 0, wxEXPAND, 0); + // set min sizer width according to extruders count + auto sizer_width = (int) (2.8 * OBJCOLOR_ITEM_WIDTH()); + sizer_width = sizer_width > MIN_OBJCOLOR_DIALOG_WIDTH ? sizer_width : MIN_OBJCOLOR_DIALOG_WIDTH; + main_sizer->SetMinSize(wxSize(sizer_width, -1)); + main_sizer->Add(m_panel_ObjColor, 1, wxEXPAND | wxALL, 0); + + auto btn_sizer = create_btn_sizer(wxOK | wxCANCEL); + { + m_button_list[wxOK]->Bind(wxEVT_UPDATE_UI, ([this](wxUpdateUIEvent &e) { + if (m_panel_ObjColor->is_ok() == m_button_list[wxOK]->IsEnabled()) { return; } + m_button_list[wxOK]->Enable(m_panel_ObjColor->is_ok()); + m_button_list[wxOK]->SetBackgroundColor(m_panel_ObjColor->is_ok() ? ok_btn_bg : ok_btn_disable_bg); + })); + } + main_sizer->Add(btn_sizer, 0, wxBOTTOM | wxRIGHT | wxEXPAND, BTN_GAP); + SetSizer(main_sizer); + main_sizer->SetSizeHints(this); + + if (this->FindWindowById(wxID_OK, this)) { + this->FindWindowById(wxID_OK, this)->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) {// if OK button is clicked.. + m_panel_ObjColor->update_filament_ids(); + EndModal(wxID_OK); + }, wxID_OK); + } + if (this->FindWindowById(wxID_CANCEL, this)) { + update_ui(static_cast(this->FindWindowById(wxID_CANCEL, this))); + this->FindWindowById(wxID_CANCEL, this)->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { EndModal(wxCANCEL); }); + } + this->Bind(wxEVT_CLOSE_WINDOW, [this](wxCloseEvent& e) { EndModal(wxCANCEL); }); + + wxGetApp().UpdateDlgDarkUI(this); +} +RGBA convert_to_rgba(const wxColour &color) +{ + RGBA rgba; + rgba[0] = std::clamp(color.Red() / 255.f, 0.f, 1.f); + rgba[1] = std::clamp(color.Green() / 255.f, 0.f, 1.f); + rgba[2] = std::clamp(color.Blue() / 255.f, 0.f, 1.f); + rgba[3] = std::clamp(color.Alpha() / 255.f, 0.f, 1.f); + return rgba; +} +wxColour convert_to_wxColour(const RGBA &color) +{ + auto r = std::clamp((int) (color[0] * 255.f), 0, 255); + auto g = std::clamp((int) (color[1] * 255.f), 0, 255); + auto b = std::clamp((int) (color[2] * 255.f), 0, 255); + auto a = std::clamp((int) (color[3] * 255.f), 0, 255); + wxColour wx_color(r,g,b,a); + return wx_color; +} +// This panel contains all control widgets for both simple and advanced mode (these reside in separate sizers) +ObjColorPanel::ObjColorPanel(wxWindow * parent, + std::vector& input_colors, + bool is_single_color, + const std::vector& extruder_colours, + std::vector & filament_ids, + unsigned char & first_extruder_id) + : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize /*,wxBORDER_RAISED*/) + , m_input_colors(input_colors) + , m_filament_ids(filament_ids) + , m_first_extruder_id(first_extruder_id) +{ + if (input_colors.size() == 0) { return; } + for (const std::string& color : extruder_colours) { + m_colours.push_back(wxColor(color)); + } + //deal input_colors + m_input_colors_size = input_colors.size(); + for (size_t i = 0; i < input_colors.size(); i++) { + if (color_is_equal(input_colors[i] , UNDEFINE_COLOR)) { // not define color range:0~1 + input_colors[i]=convert_to_rgba( m_colours[0]); + } + } + if (is_single_color && input_colors.size() >=1) { + m_cluster_colors_from_algo.emplace_back(input_colors[0]); + m_cluster_colours.emplace_back(convert_to_wxColour(input_colors[0])); + m_cluster_labels_from_algo.reserve(m_input_colors_size); + for (size_t i = 0; i < m_input_colors_size; i++) { + m_cluster_labels_from_algo.emplace_back(0); + } + m_cluster_map_filaments.resize(m_cluster_colors_from_algo.size()); + m_color_num_recommend = m_color_cluster_num_by_algo = m_cluster_colors_from_algo.size(); + } else {//cluster deal + deal_algo(-1); + } + //end first cluster + //draw ui + auto sizer_width = FromDIP(300); + // Create two switched panels with their own sizers + m_sizer_simple = new wxBoxSizer(wxVERTICAL); + m_page_simple = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); + m_page_simple->SetSizer(m_sizer_simple); + m_page_simple->SetBackgroundColour(*wxWHITE); + + update_ui(m_page_simple); + // BBS + m_sizer_simple->AddSpacer(FromDIP(10)); + // BBS: for tunning flush volumes + { + //color cluster results + wxBoxSizer * specify_cluster_sizer = new wxBoxSizer(wxHORIZONTAL); + wxStaticText *specify_color_cluster_title = new wxStaticText(m_page_simple, wxID_ANY, _L("Specify number of colors:")); + specify_color_cluster_title->SetFont(Label::Head_14); + specify_cluster_sizer->Add(specify_color_cluster_title, 0, wxALIGN_CENTER | wxALL, FromDIP(5)); + + m_color_cluster_num_by_user_ebox = new wxTextCtrl(m_page_simple, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(FromDIP(25), -1), wxTE_PROCESS_ENTER); + m_color_cluster_num_by_user_ebox->SetValue(std::to_string(m_color_cluster_num_by_algo).c_str()); + {//event + auto on_apply_color_cluster_text_modify = [this](wxEvent &e) { + wxString str = m_color_cluster_num_by_user_ebox->GetValue(); + int number = wxAtoi(str); + if (number > m_color_num_recommend || number < g_min_cluster_color) { + number = number < g_min_cluster_color ? g_min_cluster_color : m_color_num_recommend; + str = wxString::Format(("%d"), number); + m_color_cluster_num_by_user_ebox->SetValue(str); + MessageDialog dlg(nullptr, wxString::Format(_L("The color count should be in range [%d, %d]."), g_min_cluster_color, m_color_num_recommend), + _L("Warning"), wxICON_WARNING | wxOK); + dlg.ShowModal(); + } + e.Skip(); + }; + m_color_cluster_num_by_user_ebox->Bind(wxEVT_TEXT_ENTER, on_apply_color_cluster_text_modify); + m_color_cluster_num_by_user_ebox->Bind(wxEVT_KILL_FOCUS, on_apply_color_cluster_text_modify); + m_color_cluster_num_by_user_ebox->Bind(wxEVT_COMMAND_TEXT_UPDATED, [this](wxCommandEvent &) { + wxString str = m_color_cluster_num_by_user_ebox->GetValue(); + int number = wxAtof(str); + if (number > m_color_num_recommend || number < g_min_cluster_color) { + number = number < g_min_cluster_color ? g_min_cluster_color : m_color_num_recommend; + str = wxString::Format(("%d"), number); + m_color_cluster_num_by_user_ebox->SetValue(str); + m_color_cluster_num_by_user_ebox->SetInsertionPointEnd(); + } + if (m_last_cluster_num != number) { + deal_algo(number, true); + Layout(); + //Fit(); + Refresh(); + Update(); + m_last_cluster_num = number; + } + }); + m_color_cluster_num_by_user_ebox->Bind(wxEVT_CHAR, [this](wxKeyEvent &e) { + int keycode = e.GetKeyCode(); + wxString input_char = wxString::Format("%c", keycode); + long value; + if (!input_char.ToLong(&value)) + return; + e.Skip(); + }); + } + specify_cluster_sizer->AddSpacer(FromDIP(2)); + specify_cluster_sizer->Add(m_color_cluster_num_by_user_ebox, 0, wxALIGN_CENTER | wxALL, 0); + specify_cluster_sizer->AddSpacer(FromDIP(15)); + wxStaticText *recommend_color_cluster_title = new wxStaticText(m_page_simple, wxID_ANY, "(" + std::to_string(m_color_num_recommend) + " " + _L("Recommended ") + ")"); + specify_cluster_sizer->Add(recommend_color_cluster_title, 0, wxALIGN_CENTER | wxALL, 0); + + m_sizer_simple->Add(specify_cluster_sizer, 0, wxEXPAND | wxLEFT, FromDIP(20)); + + wxBoxSizer * current_filaments_title_sizer = new wxBoxSizer(wxHORIZONTAL); + wxStaticText *current_filaments_title = new wxStaticText(m_page_simple, wxID_ANY, _L("Current filament colors:")); + current_filaments_title->SetFont(Label::Head_14); + current_filaments_title_sizer->Add(current_filaments_title, 0, wxALIGN_CENTER | wxALL, FromDIP(5)); + m_sizer_simple->Add(current_filaments_title_sizer, 0, wxEXPAND | wxLEFT, FromDIP(20)); + + wxBoxSizer * current_filaments_sizer = new wxBoxSizer(wxHORIZONTAL); + current_filaments_sizer->AddSpacer(FromDIP(10)); + for (size_t i = 0; i < m_colours.size(); i++) { + auto extruder_icon_sizer = create_extruder_icon_and_rgba_sizer(m_page_simple, i, m_colours[i]); + current_filaments_sizer->Add(extruder_icon_sizer, 0, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL, FromDIP(10)); + } + m_sizer_simple->Add(current_filaments_sizer, 0, wxEXPAND | wxLEFT, FromDIP(20)); + //colors table + m_scrolledWindow = new wxScrolledWindow(m_page_simple,wxID_ANY,wxDefaultPosition,wxDefaultSize,wxSB_VERTICAL); + m_sizer_simple->Add(m_scrolledWindow, 0, wxEXPAND | wxALL, FromDIP(5)); + draw_table(); + //buttons + wxBoxSizer *quick_set_sizer = new wxBoxSizer(wxHORIZONTAL); + wxStaticText *quick_set_title = new wxStaticText(m_page_simple, wxID_ANY, _L("Quick set:")); + quick_set_title->SetFont(Label::Head_12); + quick_set_sizer->Add(quick_set_title, 0, wxALIGN_CENTER | wxALL, 0); + quick_set_sizer->AddSpacer(FromDIP(10)); + + auto calc_approximate_match_btn_sizer = create_approximate_match_btn_sizer(m_page_simple); + auto calc_add_btn_sizer = create_add_btn_sizer(m_page_simple); + auto calc_reset_btn_sizer = create_reset_btn_sizer(m_page_simple); + quick_set_sizer->Add(calc_add_btn_sizer, 0, wxALIGN_CENTER | wxALL, 0); + quick_set_sizer->AddSpacer(FromDIP(10)); + quick_set_sizer->Add(calc_approximate_match_btn_sizer, 0, wxALIGN_CENTER | wxALL, 0); + quick_set_sizer->AddSpacer(FromDIP(10)); + quick_set_sizer->Add(calc_reset_btn_sizer, 0, wxALIGN_CENTER | wxALL, 0); + quick_set_sizer->AddSpacer(FromDIP(10)); + m_sizer_simple->Add(quick_set_sizer, 0, wxEXPAND | wxLEFT, FromDIP(30)); + + wxBoxSizer *warning_sizer = new wxBoxSizer(wxHORIZONTAL); + m_warning_text = new wxStaticText(m_page_simple, wxID_ANY, ""); + warning_sizer->Add(m_warning_text, 0, wxALIGN_CENTER | wxALL, 0); + m_sizer_simple->Add(warning_sizer, 0, wxEXPAND | wxLEFT, FromDIP(30)); + + m_sizer_simple->AddSpacer(10); + } + deal_default_strategy(); + //page_simple//page_advanced + m_sizer = new wxBoxSizer(wxVERTICAL); + m_sizer->Add(m_page_simple, 0, wxEXPAND, 0); + + m_sizer->SetSizeHints(this); + SetSizer(m_sizer); + this->Layout(); +} + +void ObjColorPanel::msw_rescale() +{ + for (unsigned int i = 0; i < m_extruder_icon_list.size(); ++i) { + auto bitmap = *get_extruder_color_icon(m_colours[i].GetAsString(wxC2S_HTML_SYNTAX).ToStdString(), std::to_string(i + 1), FromDIP(16), FromDIP(16)); + m_extruder_icon_list[i]->SetBitmap(bitmap); + } + /* for (unsigned int i = 0; i < m_color_cluster_icon_list.size(); ++i) { + auto bitmap = *get_extruder_color_icon(m_cluster_colours[i].GetAsString(wxC2S_HTML_SYNTAX).ToStdString(), std::to_string(i + 1), FromDIP(16), FromDIP(16)); + m_color_cluster_icon_list[i]->SetBitmap(bitmap); + }*/ +} + +bool ObjColorPanel::is_ok() { + for (auto item : m_result_icon_list) { + if (item->bitmap_combox->IsShown()) { + auto selection = item->bitmap_combox->GetSelection(); + if (selection < 1) { + return false; + } + } + } + return true; +} + +void ObjColorPanel::update_filament_ids() +{ + if (m_is_add_filament) { + for (auto c:m_new_add_colors) { + /*auto evt = new ColorEvent(EVT_ADD_CUSTOM_FILAMENT, c); + wxQueueEvent(wxGetApp().plater(), evt);*/ + wxGetApp().sidebar().add_custom_filament(c); + } + } + //deal m_filament_ids + m_filament_ids.clear(); + m_filament_ids.reserve(m_input_colors_size); + for (size_t i = 0; i < m_input_colors_size; i++) { + auto label = m_cluster_labels_from_algo[i]; + m_filament_ids.emplace_back(m_cluster_map_filaments[label]); + } + m_first_extruder_id = m_cluster_map_filaments[0]; +} + +wxBoxSizer *ObjColorPanel::create_approximate_match_btn_sizer(wxWindow *parent) +{ + auto btn_sizer = new wxBoxSizer(wxHORIZONTAL); + StateColor calc_btn_bg(std::pair(wxColour(0, 137, 123), StateColor::Pressed), std::pair(wxColour(38, 166, 154), StateColor::Hovered), + std::pair(wxColour(0, 150, 136), StateColor::Normal)); + StateColor calc_btn_bd(std::pair(wxColour(0, 150, 136), StateColor::Normal)); + StateColor calc_btn_text(std::pair(wxColour(255, 255, 254), StateColor::Normal)); + //create btn + m_quick_approximate_match_btn = new Button(parent, _L("Color match")); + m_quick_approximate_match_btn->SetToolTip(_L("Approximate color matching.")); + auto cur_btn = m_quick_approximate_match_btn; + cur_btn->SetFont(Label::Body_13); + cur_btn->SetMinSize(wxSize(FromDIP(60), FromDIP(20))); + cur_btn->SetCornerRadius(FromDIP(10)); + cur_btn->SetBackgroundColor(calc_btn_bg); + cur_btn->SetBorderColor(calc_btn_bd); + cur_btn->SetTextColor(calc_btn_text); + cur_btn->SetFocus(); + btn_sizer->Add(cur_btn, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 0); + cur_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent &) { + deal_approximate_match_btn(); + }); + return btn_sizer; +} + +wxBoxSizer *ObjColorPanel::create_add_btn_sizer(wxWindow *parent) +{ + auto btn_sizer = new wxBoxSizer(wxHORIZONTAL); + StateColor calc_btn_bg(std::pair(wxColour(0, 137, 123), StateColor::Pressed), std::pair(wxColour(38, 166, 154), StateColor::Hovered), + std::pair(wxColour(0, 150, 136), StateColor::Normal)); + StateColor calc_btn_bd(std::pair(wxColour(0, 150, 136), StateColor::Normal)); + StateColor calc_btn_text(std::pair(wxColour(255, 255, 254), StateColor::Normal)); + // create btn + m_quick_add_btn = new Button(parent, _L("Append")); + m_quick_add_btn->SetToolTip(_L("Add consumable extruder after existing extruders.")); + auto cur_btn = m_quick_add_btn; + cur_btn->SetFont(Label::Body_13); + cur_btn->SetMinSize(wxSize(FromDIP(60), FromDIP(20))); + cur_btn->SetCornerRadius(FromDIP(10)); + cur_btn->SetBackgroundColor(calc_btn_bg); + cur_btn->SetBorderColor(calc_btn_bd); + cur_btn->SetTextColor(calc_btn_text); + cur_btn->SetFocus(); + btn_sizer->Add(cur_btn, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 0); + cur_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent &) { + deal_add_btn(); + }); + return btn_sizer; +} + +wxBoxSizer *ObjColorPanel::create_reset_btn_sizer(wxWindow *parent) +{ + auto btn_sizer = new wxBoxSizer(wxHORIZONTAL); + StateColor calc_btn_bg(std::pair(wxColour(0, 137, 123), StateColor::Pressed), std::pair(wxColour(38, 166, 154), StateColor::Hovered), + std::pair(wxColour(0, 150, 136), StateColor::Normal)); + StateColor calc_btn_bd(std::pair(wxColour(0, 150, 136), StateColor::Normal)); + StateColor calc_btn_text(std::pair(wxColour(255, 255, 254), StateColor::Normal)); + // create btn + m_quick_reset_btn = new Button(parent, _L("Reset")); + m_quick_add_btn->SetToolTip(_L("Reset mapped extruders.")); + auto cur_btn = m_quick_reset_btn; + cur_btn->SetFont(Label::Body_13); + cur_btn->SetMinSize(wxSize(FromDIP(60), FromDIP(20))); + cur_btn->SetCornerRadius(FromDIP(10)); + cur_btn->SetBackgroundColor(calc_btn_bg); + cur_btn->SetBorderColor(calc_btn_bd); + cur_btn->SetTextColor(calc_btn_text); + cur_btn->SetFocus(); + btn_sizer->Add(cur_btn, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 0); + cur_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent &) { + deal_reset_btn(); + }); + return btn_sizer; +} + +wxBoxSizer *ObjColorPanel::create_extruder_icon_and_rgba_sizer(wxWindow *parent, int id, const wxColour &color) +{ + auto icon_sizer = new wxBoxSizer(wxHORIZONTAL); + wxButton *icon = new wxButton(parent, wxID_ANY, {}, wxDefaultPosition, ICON_SIZE, wxBORDER_NONE | wxBU_AUTODRAW); + icon->SetBitmap(*get_extruder_color_icon(color.GetAsString(wxC2S_HTML_SYNTAX).ToStdString(), std::to_string(id + 1), FromDIP(16), FromDIP(16))); + icon->SetCanFocus(false); + m_extruder_icon_list.emplace_back(icon); + icon_sizer->Add(icon, 0, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL, FromDIP(10)); // wxALIGN_CENTER_VERTICAL | wxTOP | wxBOTTOM + + icon_sizer->AddSpacer(FromDIP(5)); + return icon_sizer; +} + +std::string ObjColorPanel::get_color_str(const wxColour &color) { + std::string str = ("R:" + std::to_string(color.Red()) + + std::string(" G:") + std::to_string(color.Green()) + + std::string(" B:") + std::to_string(color.Blue()) + + std::string(" A:") + std::to_string(color.Alpha())); + return str; +} + +ComboBox *ObjColorPanel::CreateEditorCtrl(wxWindow *parent, int id) // wxRect labelRect,, const wxVariant &value +{ + std::vector icons = get_extruder_color_icons(); + const double em = Slic3r::GUI::wxGetApp().em_unit(); + bool thin_icon = false; + const int icon_width = lround((thin_icon ? 2 : 4.4) * em); + const int icon_height = lround(2 * em); + m_combox_icon_width = icon_width; + m_combox_icon_height = icon_height; + wxColour undefined_color(0,255,0,255); + icons.insert(icons.begin(), get_extruder_color_icon(undefined_color.GetAsString(wxC2S_HTML_SYNTAX).ToStdString(), std::to_string(-1), icon_width, icon_height)); + if (icons.empty()) + return nullptr; + + ::ComboBox *c_editor = new ::ComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(FromDIP(m_combox_width), -1), 0, nullptr, + wxCB_READONLY | CB_NO_DROP_ICON | CB_NO_TEXT); + c_editor->SetMinSize(wxSize(FromDIP(m_combox_width), -1)); + c_editor->SetMaxSize(wxSize(FromDIP(m_combox_width), -1)); + c_editor->GetDropDown().SetUseContentWidth(true); + for (size_t i = 0; i < icons.size(); i++) { + c_editor->Append(wxString::Format("%d", i), *icons[i]); + if (i == 0) { + c_editor->SetItemTooltip(i,undefined_color.GetAsString(wxC2S_HTML_SYNTAX)); + } else { + c_editor->SetItemTooltip(i, m_colours[i-1].GetAsString(wxC2S_HTML_SYNTAX)); + } + } + c_editor->SetSelection(0); + c_editor->SetName(wxString::Format("%d", id)); + c_editor->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &evt) { + auto *com_box = static_cast(evt.GetEventObject()); + int i = atoi(com_box->GetName().c_str()); + if (i < m_cluster_map_filaments.size()) { m_cluster_map_filaments[i] = com_box->GetSelection(); } + evt.StopPropagation(); + }); + return c_editor; +} + +void ObjColorPanel::deal_approximate_match_btn() +{ + auto calc_color_distance = [](wxColour c1, wxColour c2) { + float lab[2][3]; + RGB2Lab(c1.Red(), c1.Green(), c1.Blue(), &lab[0][0], &lab[0][1], &lab[0][2]); + RGB2Lab(c2.Red(), c2.Green(), c2.Blue(), &lab[1][0], &lab[1][1], &lab[1][2]); + + return DeltaE76(lab[0][0], lab[0][1], lab[0][2], lab[1][0], lab[1][1], lab[1][2]); + }; + m_warning_text->SetLabelText(""); + if (m_result_icon_list.size() == 0) { return; } + auto map_count = m_result_icon_list[0]->bitmap_combox->GetCount() -1; + if (map_count < 1) { return; } + for (size_t i = 0; i < m_cluster_colours.size(); i++) { + auto c = m_cluster_colours[i]; + std::vector color_dists; + color_dists.resize(map_count); + for (size_t j = 0; j < map_count; j++) { + auto tip_color = m_result_icon_list[0]->bitmap_combox->GetItemTooltip(j+1); + wxColour candidate_c(tip_color); + color_dists[j].distance = calc_color_distance(c, candidate_c); + color_dists[j].id = j + 1; + } + std::sort(color_dists.begin(), color_dists.end(), [](ColorDistValue &a, ColorDistValue& b) { + return a.distance < b.distance; + }); + auto new_index= color_dists[0].id; + m_result_icon_list[i]->bitmap_combox->SetSelection(new_index); + m_cluster_map_filaments[i] = new_index; + } +} + +void ObjColorPanel::show_sizer(wxSizer *sizer, bool show) +{ + wxSizerItemList items = sizer->GetChildren(); + for (wxSizerItemList::iterator it = items.begin(); it != items.end(); ++it) { + wxSizerItem *item = *it; + if (wxWindow *window = item->GetWindow()) { + window->Show(show); + } + if (wxSizer *son_sizer = item->GetSizer()) { + show_sizer(son_sizer, show); + } + } +} + +void ObjColorPanel::redraw_part_table() { + //show all and set -1 + deal_reset_btn(); + for (size_t i = 0; i < m_row_sizer_list.size(); i++) { + show_sizer(m_row_sizer_list[i], true); + } + if (m_cluster_colours.size() < m_row_sizer_list.size()) { // show part + for (size_t i = m_cluster_colours.size(); i < m_row_sizer_list.size(); i++) { + show_sizer(m_row_sizer_list[i], false); + //m_row_panel_list[i]->Show(false); // show_sizer(m_left_color_cluster_boxsizer_list[i],false); + // m_result_icon_list[i]->bitmap_combox->Show(false); + } + } else if (m_cluster_colours.size() > m_row_sizer_list.size()) { + for (size_t i = m_row_sizer_list.size(); i < m_cluster_colours.size(); i++) { + int id = i; + wxPanel *row_panel = new wxPanel(m_scrolledWindow); + row_panel->SetBackgroundColour((i+1) % 2 == 0 ? *wxWHITE : wxColour(238, 238, 238)); + auto row_sizer = new wxGridSizer(1, 2, 1, 3); + row_panel->SetSizer(row_sizer); + + row_panel->SetMinSize(wxSize(FromDIP(PANEL_WIDTH), -1)); + row_panel->SetMaxSize(wxSize(FromDIP(PANEL_WIDTH), -1)); + + auto cluster_color_icon_sizer = create_color_icon_and_rgba_sizer(row_panel, id, m_cluster_colours[id]); + row_sizer->Add(cluster_color_icon_sizer, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, FromDIP(CONTENT_BORDER)); + // result_combox + create_result_button_sizer(row_panel, id); + row_sizer->Add(m_result_icon_list[id]->bitmap_combox, 0, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL, 0); + + m_row_sizer_list.emplace_back(row_sizer); + m_gridsizer->Add(row_panel, 0, wxALIGN_LEFT | wxALL, FromDIP(HEADER_BORDER)); + } + m_gridsizer->Layout(); + } + for (size_t i = 0; i < m_cluster_colours.size(); i++) { // update data + // m_color_cluster_icon_list//m_color_cluster_text_list + update_color_icon_and_rgba_sizer(i, m_cluster_colours[i]); + } + m_scrolledWindow->Refresh(); +} + +void ObjColorPanel::draw_table() +{ + auto row = std::max(m_cluster_colours.size(), m_colours.size()) + 1; + m_gridsizer = new wxGridSizer(row, 1, 1, 3); //(int rows, int cols, int vgap, int hgap ); + + m_color_cluster_icon_list.clear(); + m_extruder_icon_list.clear(); + float row_height ; + for (size_t ii = 0; ii < row; ii++) { + wxPanel *row_panel = new wxPanel(m_scrolledWindow); + row_panel->SetBackgroundColour(ii % 2 == 0 ? *wxWHITE : wxColour(238, 238, 238)); + auto row_sizer = new wxGridSizer(1, 2, 1, 5); + row_panel->SetSizer(row_sizer); + + row_panel->SetMinSize(wxSize(FromDIP(PANEL_WIDTH), -1)); + row_panel->SetMaxSize(wxSize(FromDIP(PANEL_WIDTH), -1)); + if (ii == 0) { + wxStaticText *colors_left_title = new wxStaticText(row_panel, wxID_ANY, _L("Cluster colors")); + colors_left_title->SetFont(Label::Head_14); + row_sizer->Add(colors_left_title, 0, wxALIGN_CENTER | wxALL, FromDIP(HEADER_BORDER)); + + wxStaticText *colors_middle_title = new wxStaticText(row_panel, wxID_ANY, _L("Map Filament")); + colors_middle_title->SetFont(Label::Head_14); + row_sizer->Add(colors_middle_title, 0, wxALIGN_CENTER | wxALL, FromDIP(HEADER_BORDER)); + } else { + int id = ii - 1; + if (id < m_cluster_colours.size()) { + auto cluster_color_icon_sizer = create_color_icon_and_rgba_sizer(row_panel, id, m_cluster_colours[id]); + row_sizer->Add(cluster_color_icon_sizer, 0, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL, FromDIP(CONTENT_BORDER)); + // result_combox + create_result_button_sizer(row_panel, id); + row_sizer->Add(m_result_icon_list[id]->bitmap_combox, 0, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL, FromDIP(CONTENT_BORDER)); + } + } + row_height = row_panel->GetSize().GetHeight(); + if (ii>=1) { + m_row_sizer_list.emplace_back(row_sizer); + } + m_gridsizer->Add(row_panel, 0, wxALIGN_LEFT | wxALL, FromDIP(HEADER_BORDER)); + } + m_scrolledWindow->SetSizer(m_gridsizer); + int totalHeight = row_height *(row+1) * 2; + m_scrolledWindow->SetVirtualSize(MIN_OBJCOLOR_DIALOG_WIDTH, totalHeight); + auto look = FIX_SCROLL_HEIGTH; + if (totalHeight > FIX_SCROLL_HEIGTH) { + m_scrolledWindow->SetMinSize(wxSize(MIN_OBJCOLOR_DIALOG_WIDTH, FIX_SCROLL_HEIGTH)); + m_scrolledWindow->SetMaxSize(wxSize(MIN_OBJCOLOR_DIALOG_WIDTH, FIX_SCROLL_HEIGTH)); + } + else { + m_scrolledWindow->SetMinSize(wxSize(MIN_OBJCOLOR_DIALOG_WIDTH, totalHeight)); + } + m_scrolledWindow->EnableScrolling(false, true); + m_scrolledWindow->ShowScrollbars(wxSHOW_SB_NEVER, wxSHOW_SB_DEFAULT);//wxSHOW_SB_ALWAYS + m_scrolledWindow->SetScrollRate(20, 20); +} + +void ObjColorPanel::deal_algo(char cluster_number, bool redraw_ui) +{ + if (m_last_cluster_number == cluster_number) { + return; + } + m_last_cluster_number = cluster_number; + QuantKMeans quant(10); + quant.apply(m_input_colors, m_cluster_colors_from_algo, m_cluster_labels_from_algo, (int)cluster_number); + m_cluster_colours.clear(); + m_cluster_colours.reserve(m_cluster_colors_from_algo.size()); + for (size_t i = 0; i < m_cluster_colors_from_algo.size(); i++) { + m_cluster_colours.emplace_back(convert_to_wxColour(m_cluster_colors_from_algo[i])); + } + if (m_cluster_colours.size() == 0) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ",m_cluster_colours.size() = 0\n"; + return; + } + m_cluster_map_filaments.resize(m_cluster_colors_from_algo.size()); + m_color_cluster_num_by_algo = m_cluster_colors_from_algo.size(); + if (cluster_number == -1) { + m_color_num_recommend = m_color_cluster_num_by_algo; + } + //redraw ui + if (redraw_ui) { + redraw_part_table(); + deal_default_strategy(); + } +} + +void ObjColorPanel::deal_default_strategy() +{ + deal_add_btn(); + deal_approximate_match_btn(); + m_warning_text->SetLabelText(_L("Note:The color has been selected, you can choose OK \n to continue or manually adjust it.")); +} + +void ObjColorPanel::deal_add_btn() +{ + if (m_colours.size() > g_max_color) { return; } + deal_reset_btn(); + std::vector new_icons; + auto new_color_size = m_cluster_colors_from_algo.size(); + new_icons.reserve(new_color_size); + m_new_add_colors.clear(); + m_new_add_colors.reserve(new_color_size); + int new_index = m_colours.size() + 1; + bool is_exceed = false; + for (size_t i = 0; i < new_color_size; i++) { + if (m_colours.size() + new_icons.size() >= g_max_color) { + is_exceed = true; + break; + } + wxColour cur_color = convert_to_wxColour(m_cluster_colors_from_algo[i]); + m_new_add_colors.emplace_back(cur_color); + new_icons.emplace_back(get_extruder_color_icon(cur_color.GetAsString(wxC2S_HTML_SYNTAX).ToStdString(), + std::to_string(new_index), m_combox_icon_width, m_combox_icon_height)); + new_index++; + } + new_index = m_colours.size() + 1; + for (size_t i = 0; i < m_result_icon_list.size(); i++) { + auto item = m_result_icon_list[i]; + for (size_t k = 0; k < new_icons.size(); k++) { + item->bitmap_combox->Append(wxString::Format("%d", item->bitmap_combox->GetCount()), *new_icons[k]); + item->bitmap_combox->SetItemTooltip(item->bitmap_combox->GetCount() -1,m_new_add_colors[k].GetAsString(wxC2S_HTML_SYNTAX)); + } + item->bitmap_combox->SetSelection(new_index); + m_cluster_map_filaments[i] = new_index; + new_index++; + } + if (is_exceed) { + deal_approximate_match_btn(); + m_warning_text->SetLabelText(_L("Waring:The count of newly added and \n current extruders exceeds 16.")); + } + m_is_add_filament = true; +} + +void ObjColorPanel::deal_reset_btn() +{ + for (auto item : m_result_icon_list) { + // delete redundant bitmap + while (item->bitmap_combox->GetCount() > m_colours.size()+ 1) { + item->bitmap_combox->DeleteOneItem(item->bitmap_combox->GetCount() - 1); + } + item->bitmap_combox->SetSelection(0); + } + m_is_add_filament = false; + m_new_add_colors.clear(); + m_warning_text->SetLabelText(""); +} + +void ObjColorPanel::create_result_button_sizer(wxWindow *parent, int id) +{ + for (size_t i = m_result_icon_list.size(); i < id + 1; i++) { + m_result_icon_list.emplace_back(new ButtonState()); + } + m_result_icon_list[id]->bitmap_combox = CreateEditorCtrl(parent,id); +} + +wxBoxSizer *ObjColorPanel::create_color_icon_and_rgba_sizer(wxWindow *parent, int id, const wxColour& color) +{ + auto icon_sizer = new wxBoxSizer(wxHORIZONTAL); + icon_sizer->AddSpacer(FromDIP(40)); + wxButton *icon = new wxButton(parent, wxID_ANY, {}, wxDefaultPosition, ICON_SIZE, wxBORDER_NONE | wxBU_AUTODRAW); + icon->SetBitmap(*get_extruder_color_icon(color.GetAsString(wxC2S_HTML_SYNTAX).ToStdString(), std::to_string(id + 1), FromDIP(16), FromDIP(16))); + icon->SetCanFocus(false); + m_color_cluster_icon_list.emplace_back(icon); + icon_sizer->Add(icon, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, 0); // wxALIGN_CENTER_VERTICAL | wxTOP | wxBOTTOM + icon_sizer->AddSpacer(FromDIP(10)); + + std::string message = get_color_str(color); + wxStaticText *rgba_title = new wxStaticText(parent, wxID_ANY, message.c_str()); + m_color_cluster_text_list.emplace_back(rgba_title); + rgba_title->SetMinSize(wxSize(FromDIP(COLOR_LABEL_WIDTH), -1)); + rgba_title->SetMaxSize(wxSize(FromDIP(COLOR_LABEL_WIDTH), -1)); + //rgba_title->SetFont(Label::Head_12); + icon_sizer->Add(rgba_title, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, 0); + return icon_sizer; +} + +void ObjColorPanel::update_color_icon_and_rgba_sizer(int id, const wxColour &color) +{ + if (id < m_color_cluster_text_list.size()) { + auto icon = m_color_cluster_icon_list[id]; + icon->SetBitmap(*get_extruder_color_icon(color.GetAsString(wxC2S_HTML_SYNTAX).ToStdString(), std::to_string(id + 1), FromDIP(16), FromDIP(16))); + std::string message = get_color_str(color); + m_color_cluster_text_list[id]->SetLabelText(message.c_str()); + } +} diff --git a/src/slic3r/GUI/ObjColorDialog.hpp b/src/slic3r/GUI/ObjColorDialog.hpp new file mode 100644 index 0000000000..6019035973 --- /dev/null +++ b/src/slic3r/GUI/ObjColorDialog.hpp @@ -0,0 +1,114 @@ +#ifndef _OBJ_COLOR_DIALOG_H_ +#define _OBJ_COLOR_DIALOG_H_ + +#include "GUI_Utils.hpp" +#include "libslic3r/Color.hpp" +#include +#include +#include +#include +#include +#include +class Button; +class Label; +class ComboBox; +struct ColorDistValue +{ + int id; + float distance; +}; +class ObjColorPanel : public wxPanel +{ +public: + // BBS + ObjColorPanel(wxWindow * parent, + std::vector & input_colors,bool is_single_color, + const std::vector & extruder_colours, + std::vector & filament_ids, + unsigned char & first_extruder_id); + void msw_rescale(); + bool is_ok(); + void update_filament_ids(); + struct ButtonState + { + ComboBox* bitmap_combox{nullptr}; + bool is_map{false};//int id{0}; + }; +private: + wxBoxSizer *create_approximate_match_btn_sizer(wxWindow *parent); + wxBoxSizer *create_add_btn_sizer(wxWindow *parent); + wxBoxSizer *create_reset_btn_sizer(wxWindow *parent); + wxBoxSizer *create_extruder_icon_and_rgba_sizer(wxWindow *parent, int id, const wxColour& color); + std::string get_color_str(const wxColour &color); + void create_result_button_sizer(wxWindow *parent, int id); + wxBoxSizer *create_color_icon_and_rgba_sizer(wxWindow *parent, int id, const wxColour& color); + void update_color_icon_and_rgba_sizer(int id, const wxColour &color); + ComboBox* CreateEditorCtrl(wxWindow *parent,int id); + void draw_table(); + void show_sizer(wxSizer *sizer, bool show); + void redraw_part_table(); + void deal_approximate_match_btn(); + void deal_add_btn(); + void deal_reset_btn(); + void deal_algo(char cluster_number,bool redraw_ui =false); + void deal_default_strategy(); +private: + //view ui + wxScrolledWindow * m_scrolledWindow = nullptr; + wxPanel * m_page_simple = nullptr; + wxBoxSizer * m_sizer = nullptr; + wxBoxSizer * m_sizer_simple = nullptr; + wxTextCtrl *m_color_cluster_num_by_user_ebox{nullptr}; + wxStaticText * m_warning_text{nullptr}; + Button * m_quick_approximate_match_btn{nullptr}; + Button * m_quick_add_btn{nullptr}; + Button * m_quick_reset_btn{nullptr}; + std::vector m_extruder_icon_list; + std::vector m_color_cluster_icon_list;//need modeify + std::vector m_color_cluster_text_list;//need modeify + std::vector m_row_sizer_list; // control show or not + std::vector m_result_icon_list; + int m_last_cluster_num{-1}; + const int m_combox_width{50}; + int m_combox_icon_width; + int m_combox_icon_height; + wxGridSizer* m_gridsizer = nullptr; + wxStaticText * m_test = nullptr; + //data + char m_last_cluster_number{-2}; + std::vector& m_input_colors; + int m_color_num_recommend{0}; + int m_color_cluster_num_by_algo{0}; + int m_input_colors_size{0}; + std::vector m_colours;//from project and show right + std::vector m_cluster_map_filaments;//show middle + std::vector m_cluster_colours;//from_algo and show left + bool m_can_add_filament{true}; + std::vector m_new_add_colors; + //algo result + std::vector m_cluster_colors_from_algo; + std::vector m_cluster_labels_from_algo; + //result + bool m_is_add_filament{false}; + unsigned char& m_first_extruder_id; + std::vector &m_filament_ids; +}; + +class ObjColorDialog : public Slic3r::GUI::DPIDialog +{ +public: + ObjColorDialog(wxWindow * parent, + std::vector& input_colors, bool is_single_color, + const std::vector & extruder_colours, + std::vector& filament_ids, + unsigned char & first_extruder_id); + wxBoxSizer* create_btn_sizer(long flags); + void on_dpi_changed(const wxRect &suggested_rect) override; +private: + ObjColorPanel* m_panel_ObjColor = nullptr; + std::unordered_map m_button_list; + std::vector& m_filament_ids; + unsigned char & m_first_extruder_id; +}; + +#endif // _WIPE_TOWER_DIALOG_H_ \ No newline at end of file diff --git a/src/slic3r/GUI/PartPlate.cpp b/src/slic3r/GUI/PartPlate.cpp index 119e3394ef..df761f00ee 100644 --- a/src/slic3r/GUI/PartPlate.cpp +++ b/src/slic3r/GUI/PartPlate.cpp @@ -1580,14 +1580,7 @@ std::vector PartPlate::get_used_extruders() std::set used_extruders_set; PrintEstimatedStatistics& ps = result->print_statistics; - // model usage - for (const auto&item:ps.volumes_per_extruder) - used_extruders_set.emplace(item.first + 1); - // support usage - for (const auto&item:ps.support_volumes_per_extruder) - used_extruders_set.emplace(item.first + 1); - // wipe tower usage - for (const auto&item:ps.wipe_tower_volumes_per_extruder) + for (const auto& item : ps.total_volumes_per_extruder) used_extruders_set.emplace(item.first + 1); return std::vector(used_extruders_set.begin(), used_extruders_set.end()); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 939bb29dbe..f3f2ef310a 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -116,6 +116,7 @@ #include "Jobs/BoostThreadWorker.hpp" #include "BackgroundSlicingProcess.hpp" #include "SelectMachine.hpp" +#include "SendMultiMachinePage.hpp" #include "SendToPrinter.hpp" #include "PublishDialog.hpp" #include "ModelMall.hpp" @@ -156,6 +157,7 @@ #include #include // Needs to be last because reasons :-/ #include "WipeTowerDialog.hpp" +#include "ObjColorDialog.hpp" #include "libslic3r/CustomGCode.hpp" #include "libslic3r/Platform.hpp" @@ -209,7 +211,9 @@ wxDEFINE_EVENT(EVT_PRINT_FROM_SDCARD_VIEW, SimpleEvent); wxDEFINE_EVENT(EVT_CREATE_FILAMENT, SimpleEvent); wxDEFINE_EVENT(EVT_MODIFY_FILAMENT, SimpleEvent); - +wxDEFINE_EVENT(EVT_ADD_FILAMENT, SimpleEvent); +wxDEFINE_EVENT(EVT_DEL_FILAMENT, SimpleEvent); +wxDEFINE_EVENT(EVT_ADD_CUSTOM_FILAMENT, ColorEvent); bool Plater::has_illegal_filename_characters(const wxString& wxs_name) { std::string name = into_u8(wxs_name); @@ -431,7 +435,7 @@ void Sidebar::priv::show_preset_comboboxes() void Sidebar::priv::on_search_update() { m_object_list->assembly_plate_object_name(); - + wxString search_text = m_search_bar->GetValue(); m_object_list->GetModel()->search_object(search_text); dia->update_list(); @@ -491,37 +495,63 @@ void Sidebar::priv::hide_rich_tip(wxButton* btn) } #endif -std::vector get_min_flush_volumes() +std::vector get_min_flush_volumes(const DynamicPrintConfig& full_config) { std::vectorextra_flush_volumes; - const auto& full_config = wxGetApp().preset_bundle->full_config(); - auto& printer_config = wxGetApp().preset_bundle->printers.get_edited_preset().config; + //const auto& full_config = wxGetApp().preset_bundle->full_config(); + //auto& printer_config = wxGetApp().preset_bundle->printers.get_edited_preset().config; - ConfigOption* nozzle_volume_opt = printer_config.option("nozzle_volume"); + const ConfigOption* nozzle_volume_opt = full_config.option("nozzle_volume"); int nozzle_volume_val = nozzle_volume_opt ? (int)nozzle_volume_opt->getFloat() : 0; - int machine_enabled_level = printer_config.option("enable_long_retraction_when_cut")->value; - bool machine_activated = printer_config.option("long_retractions_when_cut")->values[0] == 1; + const ConfigOptionInt* enable_long_retraction_when_cut_opt = full_config.option("enable_long_retraction_when_cut"); + int machine_enabled_level = 0; + if (enable_long_retraction_when_cut_opt) { + machine_enabled_level = enable_long_retraction_when_cut_opt->value; + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": get enable_long_retraction_when_cut from config, value=%1%")%machine_enabled_level; + } + const ConfigOptionBools* long_retractions_when_cut_opt = full_config.option("long_retractions_when_cut"); + bool machine_activated = false; + if (long_retractions_when_cut_opt) { + machine_activated = long_retractions_when_cut_opt->values[0] == 1; + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": get long_retractions_when_cut from config, value=%1%, activated=%2%")%long_retractions_when_cut_opt->values[0] %machine_activated; + } - auto filament_retraction_distance_when_cut = full_config.option("filament_retraction_distances_when_cut"); - auto printer_retraction_distance_when_cut = full_config.option("retraction_distances_when_cut"); - auto filament_long_retractions_when_cut = full_config.option("filament_long_retractions_when_cut"); + size_t filament_size = full_config.option("filament_diameter")->values.size(); + std::vector filament_retraction_distance_when_cut(filament_size, 18.0f), printer_retraction_distance_when_cut(filament_size, 18.0f); + std::vector filament_long_retractions_when_cut(filament_size, 0); + const ConfigOptionFloats* filament_retraction_distances_when_cut_opt = full_config.option("filament_retraction_distances_when_cut"); + if (filament_retraction_distances_when_cut_opt) { + filament_retraction_distance_when_cut = filament_retraction_distances_when_cut_opt->values; + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": get filament_retraction_distance_when_cut from config, size=%1%, values=%2%")%filament_retraction_distance_when_cut.size() %filament_retraction_distances_when_cut_opt->serialize(); + } + + const ConfigOptionFloats* printer_retraction_distance_when_cut_opt = full_config.option("retraction_distances_when_cut"); + if (printer_retraction_distance_when_cut_opt) { + printer_retraction_distance_when_cut = printer_retraction_distance_when_cut_opt->values; + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": get retraction_distances_when_cut from config, size=%1%, values=%2%")%printer_retraction_distance_when_cut.size() %printer_retraction_distance_when_cut_opt->serialize(); + } + + const ConfigOptionBools* filament_long_retractions_when_cut_opt = full_config.option("filament_long_retractions_when_cut"); + if (filament_long_retractions_when_cut_opt) { + filament_long_retractions_when_cut = filament_long_retractions_when_cut_opt->values; + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": get filament_long_retractions_when_cut from config, size=%1%, values=%2%")%filament_long_retractions_when_cut.size() %filament_long_retractions_when_cut_opt->serialize(); + } - size_t filament_size = filament_retraction_distance_when_cut->values.size(); for (size_t idx = 0; idx < filament_size; ++idx) { int extra_flush_volume = nozzle_volume_val; - int retract_length = machine_enabled_level && machine_activated ? printer_retraction_distance_when_cut->values[0] : 0; + int retract_length = machine_enabled_level && machine_activated ? printer_retraction_distance_when_cut[0] : 0; - char filament_activated = filament_long_retractions_when_cut->values[idx]; - double filament_retract_length = filament_retraction_distance_when_cut->values[idx]; + unsigned char filament_activated = filament_long_retractions_when_cut[idx]; + double filament_retract_length = filament_retraction_distance_when_cut[idx]; if (filament_activated == 0) retract_length = 0; else if (filament_activated == 1 && machine_enabled_level == LongRectrationLevel::EnableFilament) { if (!std::isnan(filament_retract_length)) - retract_length = (int)filament_retraction_distance_when_cut->values[idx]; + retract_length = (int)filament_retraction_distance_when_cut[idx]; else - retract_length = printer_retraction_distance_when_cut->values[0]; + retract_length = printer_retraction_distance_when_cut[0]; } extra_flush_volume -= PI * 1.75 * 1.75 / 4 * retract_length; @@ -849,7 +879,8 @@ Sidebar::Sidebar(Plater *parent) float flush_multiplier = flush_multi_opt ? flush_multi_opt->getFloat() : 1.f; const std::vector extruder_colours = wxGetApp().plater()->get_extruder_colors_from_plater_config(); - const auto& extra_flush_volumes = get_min_flush_volumes(); + const auto& full_config = wxGetApp().preset_bundle->full_config(); + const auto& extra_flush_volumes = get_min_flush_volumes(full_config); WipingDialog dlg(parent, cast(init_matrix), cast(init_extruders), extruder_colours, extra_flush_volumes, flush_multiplier); if (dlg.ShowModal() == wxID_OK) { std::vector matrix = dlg.get_matrix(); @@ -1266,7 +1297,7 @@ void Sidebar::update_presets(Preset::Type preset_type) if (preset) { if (preset->is_compatible) preset_bundle.set_filament_preset(0, name); } - + } for (size_t i = 0; i < filament_cnt; i++) @@ -1559,6 +1590,43 @@ void Sidebar::on_filaments_change(size_t num_filaments) dynamic_filament_list.update(); } +void Sidebar::add_filament() { + // BBS: limit filament choices to 16 + if (p->combos_filament.size() >= 16) return; + wxColour new_col = Plater::get_next_color_for_filament(); + add_custom_filament(new_col); +} + +void Sidebar::delete_filament() { + if (p->combos_filament.size() <= 1) return; + + size_t filament_count = p->combos_filament.size() - 1; + if (wxGetApp().preset_bundle->is_the_only_edited_filament(filament_count) || (filament_count == 1)) { + wxGetApp().get_tab(Preset::TYPE_FILAMENT)->select_preset(wxGetApp().preset_bundle->filament_presets[0], false, "", true); + } + + if (p->editing_filament >= filament_count) { + p->editing_filament = -1; + } + + wxGetApp().preset_bundle->set_num_filaments(filament_count); + wxGetApp().plater()->on_filaments_change(filament_count); + wxGetApp().get_tab(Preset::TYPE_PRINT)->update(); + wxGetApp().preset_bundle->export_selections(*wxGetApp().app_config); +} + +void Sidebar::add_custom_filament(wxColour new_col) { + if (p->combos_filament.size() >= 16) return; + + int filament_count = p->combos_filament.size() + 1; + std::string new_color = new_col.GetAsString(wxC2S_HTML_SYNTAX).ToStdString(); + wxGetApp().preset_bundle->set_num_filaments(filament_count, new_color); + wxGetApp().plater()->on_filaments_change(filament_count); + wxGetApp().get_tab(Preset::TYPE_PRINT)->update(); + wxGetApp().preset_bundle->export_selections(*wxGetApp().app_config); + auto_calc_flushing_volumes(filament_count - 1); +} + void Sidebar::on_bed_type_change(BedType bed_type) { // btDefault option is not included in global bed type setting @@ -1894,13 +1962,14 @@ void Sidebar::auto_calc_flushing_volumes(const int modify_id) auto& preset_bundle = wxGetApp().preset_bundle; auto& project_config = preset_bundle->project_config; auto& printer_config = preset_bundle->printers.get_edited_preset().config; + const auto& full_config = wxGetApp().preset_bundle->full_config(); auto& ams_multi_color_filament = preset_bundle->ams_multi_color_filment; auto& ams_filament_list = preset_bundle->filament_ams_list; const std::vector& init_matrix = (project_config.option("flush_volumes_matrix"))->values; const std::vector& init_extruders = (project_config.option("flush_volumes_vector"))->values; - const std::vector& min_flush_volumes= get_min_flush_volumes(); + const std::vector& min_flush_volumes= get_min_flush_volumes(full_config); ConfigOptionFloat* flush_multi_opt = project_config.option("flush_multiplier"); float flush_multiplier = flush_multi_opt ? flush_multi_opt->getFloat() : 1.f; @@ -2077,6 +2146,7 @@ struct Plater::priv MenuFactory menus; SelectMachineDialog* m_select_machine_dlg = nullptr; + SendMultiMachinePage* m_send_multi_dlg = nullptr; SendToPrinterDialog* m_send_to_sdcard_dlg = nullptr; PublishDialog *m_publish_dlg = nullptr; @@ -2424,6 +2494,9 @@ struct Plater::priv void on_action_layersediting(SimpleEvent&); void on_create_filament(SimpleEvent &); void on_modify_filament(SimpleEvent &); + void on_add_filament(SimpleEvent &); + void on_delete_filament(SimpleEvent &); + void on_add_custom_filament(ColorEvent &); void on_object_select(SimpleEvent&); void show_right_click_menu(Vec2d mouse_position, wxMenu *menu); @@ -2540,6 +2613,7 @@ struct Plater::priv //BBS: add popup object table logic bool PopupObjectTable(int object_id, int volume_id, const wxPoint& position); void on_action_send_to_printer(bool isall = false); + void on_action_send_to_multi_machine(SimpleEvent&); int update_print_required_data(Slic3r::DynamicPrintConfig config, Slic3r::Model model, Slic3r::PlateDataPtrs plate_data_list, std::string file_name, std::string file_path); private: bool layers_height_allowed() const; @@ -2580,7 +2654,6 @@ private: //record print preset void record_start_print_preset(std::string action); - }; const std::regex Plater::priv::pattern_bundle(".*[.](amf|amf[.]xml|zip[.]amf|3mf)", std::regex::icase); @@ -2698,7 +2771,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) this->q->Bind(wxEVT_SYS_COLOUR_CHANGED, &priv::on_apple_change_color_mode, this); this->q->Bind(EVT_CREATE_FILAMENT, &priv::on_create_filament, this); this->q->Bind(EVT_MODIFY_FILAMENT, &priv::on_modify_filament, this); - + this->q->Bind(EVT_ADD_CUSTOM_FILAMENT, &priv::on_add_custom_filament, this); main_frame->m_tabpanel->Bind(wxEVT_NOTEBOOK_PAGE_CHANGING, &priv::on_tab_selection_changing, this); auto* panel_3d = new wxPanel(q); @@ -2969,6 +3042,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) q->Bind(EVT_GLTOOLBAR_EXPORT_ALL_SLICED_FILE, &priv::on_action_export_all_sliced_file, this); q->Bind(EVT_GLTOOLBAR_SEND_TO_PRINTER, &priv::on_action_export_to_sdcard, this); q->Bind(EVT_GLTOOLBAR_SEND_TO_PRINTER_ALL, &priv::on_action_export_to_sdcard_all, this); + q->Bind(EVT_GLTOOLBAR_PRINT_MULTI_MACHINE, &priv::on_action_send_to_multi_machine, this); q->Bind(EVT_GLCANVAS_PLATE_SELECT, &priv::on_plate_selected, this); q->Bind(EVT_DOWNLOAD_PROJECT, &priv::on_action_download_project, this); q->Bind(EVT_IMPORT_MODEL_ID, &priv::on_action_request_model_id, this); @@ -3941,7 +4015,17 @@ std::vector Plater::priv::load_files(const std::vector& input_ std::vector project_presets; bool is_xxx; Semver file_version; - + + //ObjImportColorFn obj_color_fun=nullptr; + auto obj_color_fun = [this, &path](std::vector &input_colors, bool is_single_color, std::vector &filament_ids, + unsigned char &first_extruder_id) { + if (!boost::iends_with(path.string(), ".obj")) { return; } + const std::vector extruder_colours = wxGetApp().plater()->get_extruder_colors_from_plater_config(); + ObjColorDialog color_dlg(nullptr, input_colors, is_single_color, extruder_colours, filament_ids, first_extruder_id); + if (color_dlg.ShowModal() != wxID_OK) { + filament_ids.clear(); + } + }; model = Slic3r::Model::read_from_file( path.string(), nullptr, nullptr, strategy, &plate_data, &project_presets, &is_xxx, &file_version, nullptr, [this, &dlg, real_filename, &progress_percent, &file_percent, INPUT_FILES_RATIO, total_files, i, &designer_model_id, &designer_country_code](int current, int total, bool &cancel, std::string &mode_id, std::string &code) @@ -3971,7 +4055,8 @@ std::vector Plater::priv::load_files(const std::vector& input_ if (!isUtf8StepFile) Slic3r::GUI::show_info(nullptr, _L("Name of components inside step file is not UTF8 format!") + "\n\n" + _L("The name may show garbage characters!"), _L("Attention!")); - }); + }, + nullptr, 0, obj_color_fun); if (designer_model_id.empty() && boost::algorithm::iends_with(path.string(), ".stl")) { @@ -6959,6 +7044,14 @@ void Plater::priv::on_action_print_plate(SimpleEvent&) record_start_print_preset("print_plate"); } +void Plater::priv::on_action_send_to_multi_machine(SimpleEvent&) +{ + if (!m_send_multi_dlg) + m_send_multi_dlg = new SendMultiMachinePage(q); + m_send_multi_dlg->prepare(partplate_list.get_curr_plate_index()); + m_send_multi_dlg->ShowModal(); +} + void Plater::priv::on_action_print_plate_from_sdcard(SimpleEvent&) { if (q != nullptr) { @@ -7018,6 +7111,7 @@ void Plater::priv::on_action_send_to_printer(bool isall) m_send_to_sdcard_dlg->ShowModal(); } + void Plater::priv::on_action_select_sliced_plate(wxCommandEvent &evt) { if (q != nullptr) { @@ -7088,7 +7182,6 @@ void Plater::priv::on_action_export_to_sdcard_all(SimpleEvent&) } } - //BBS: add plate select logic void Plater::priv::on_plate_selected(SimpleEvent&) { @@ -8071,6 +8164,19 @@ void Plater::priv::on_modify_filament(SimpleEvent &evt) } +void Plater::priv::on_add_filament(SimpleEvent &evt) { + sidebar->add_filament(); +} + +void Plater::priv::on_delete_filament(SimpleEvent &evt) { + sidebar->delete_filament(); +} + +void Plater::priv::on_add_custom_filament(ColorEvent &evt) +{ + sidebar->add_custom_filament(evt.data); +} + void Plater::priv::enter_gizmos_stack() { assert(m_undo_redo_stack_active == &m_undo_redo_stack_main); @@ -8628,7 +8734,7 @@ int Plater::new_project(bool skip_confirm, bool silent, const wxString& project_ void Plater::load_project(wxString const& filename2, wxString const& originfile) { - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "filename is: " << filename2 << "and originfile is: " << originfile; + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "filename is: " << filename2 << "and originfile is: " << originfile; BOOST_LOG_TRIVIAL(info) << __FUNCTION__; auto filename = filename2; auto check = [&filename, this] (bool yes_or_no) { @@ -8702,13 +8808,13 @@ void Plater::load_project(wxString const& filename2, if (load_restore && originfile.IsEmpty()) { p->set_project_name(_L("Untitled")); } - + } else { if (using_exported_file()) { BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << __LINE__ << " using ecported set project filename: " << filename; p->set_project_filename(filename); } - + } // BBS set default 3D view and direction after loading project @@ -8869,6 +8975,14 @@ void Plater::import_model_id(wxString download_info) { vecFiles.clear(); wxString extension = fs::path(filename.wx_str()).extension().c_str(); + + + //check file suffix + if (!extension.Contains(".3mf")) { + msg = _L("Download failed, unknown file format."); + return; + } + auto name = filename.substr(0, filename.length() - extension.length() - 1); for (const auto& iter : boost::filesystem::directory_iterator(target_path)) @@ -8916,17 +9030,35 @@ void Plater::import_model_id(wxString download_info) fs::path tmp_path = target_path; tmp_path += format(".%1%", ".download"); - + auto filesize = 0; + bool size_limit = false; auto http = Http::get(download_url.ToStdString()); while (cont && retry_count < max_retries) { retry_count++; - http.on_progress([&percent, &cont, &msg](Http::Progress progress, bool& cancel) { + http.on_progress([&percent, &cont, &msg, &filesize, &size_limit](Http::Progress progress, bool& cancel) { + if (!cont) cancel = true; if (progress.dltotal != 0) { + + if (filesize == 0) { + filesize = progress.dltotal; + double megabytes = static_cast(progress.dltotal) / (1024 * 1024); + //The maximum size of a 3mf file is 500mb + if (megabytes > 500) { + cont = false; + size_limit = true; + } + } percent = progress.dlnow * 100 / progress.dltotal; } - msg = wxString::Format(_L("Project downloaded %d%%"), percent); + + if (size_limit) { + msg = _L("Download failed, File size exception."); + } + else { + msg = wxString::Format(_L("Project downloaded %d%%"), percent); + } }) .on_error([&msg, &cont, &retry_count, max_retries](std::string body, std::string error, unsigned http_status) { (void)body; @@ -8936,7 +9068,7 @@ void Plater::import_model_id(wxString download_info) error); if (retry_count == max_retries) { - msg = _L("Importing to Orca Slicer failed. Please download the file and manually import it."); + msg = _L("Importing to Bambu Studio failed. Please download the file and manually import it."); cont = false; } }) @@ -8985,7 +9117,7 @@ void Plater::import_model_id(wxString download_info) } // show save new project - p->set_project_filename(filename); + p->set_project_filename(target_path.wstring()); p->notification_manager->push_import_finished_notification(target_path.string(), target_path.parent_path().string(), false); } else { @@ -8997,7 +9129,6 @@ void Plater::import_model_id(wxString download_info) return; } } - //BBS download project by project id void Plater::download_project(const wxString& project_id) { @@ -9731,14 +9862,12 @@ void Plater::load_gcode(const wxString& filename) //BBS: add cost info when drag in gcode auto& ps = current_result->print_statistics; double total_cost = 0.0; - for (auto& volumes_map : { ps.volumes_per_extruder,ps.flush_per_filament ,ps.wipe_tower_volumes_per_extruder }) { - for (auto volume : volumes_map) { - size_t extruder_id = volume.first; - double density = current_result->filament_densities.at(extruder_id); - double cost = current_result->filament_costs.at(extruder_id); - double weight = volume.second * density * 0.001; - total_cost += weight * cost * 0.001; - } + for (auto volume : ps.total_volumes_per_extruder) { + size_t extruder_id = volume.first; + double density = current_result->filament_densities.at(extruder_id); + double cost = current_result->filament_costs.at(extruder_id); + double weight = volume.second * density * 0.001; + total_cost += weight * cost * 0.001; } current_print.print_statistics().total_cost = total_cost; @@ -9757,7 +9886,7 @@ void Plater::load_gcode(const wxString& filename) } else { set_project_filename(filename); } - + } void Plater::reload_gcode_from_disk() @@ -11519,6 +11648,7 @@ int Plater::export_3mf(const boost::filesystem::path& output_path, SaveStrategy // get type and color for platedata auto* filament_color = dynamic_cast(cfg.option("filament_colour")); auto* nozzle_diameter_option = dynamic_cast(cfg.option("nozzle_diameter")); + auto* filament_id_opt = dynamic_cast(cfg.option("filament_ids")); std::string nozzle_diameter_str; if (nozzle_diameter_option) nozzle_diameter_str = nozzle_diameter_option->serialize(); @@ -11532,6 +11662,7 @@ int Plater::export_3mf(const boost::filesystem::path& output_path, SaveStrategy for (auto it = plate_data->slice_filaments_info.begin(); it != plate_data->slice_filaments_info.end(); it++) { std::string display_filament_type; it->type = cfg.get_filament_type(display_filament_type, it->id); + it->filament_id = filament_id_opt ? filament_id_opt->get_at(it->id) : ""; it->color = filament_color ? filament_color->get_at(it->id) : "#FFFFFF"; // save filament info used in curr plate int index = p->partplate_list.get_curr_plate_index(); diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index acc896b07c..a2fa773129 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -117,7 +117,10 @@ wxDECLARE_EVENT(EVT_GLCANVAS_COLOR_MODE_CHANGED, SimpleEvent); wxDECLARE_EVENT(EVT_PRINT_FROM_SDCARD_VIEW, SimpleEvent); wxDECLARE_EVENT(EVT_CREATE_FILAMENT, SimpleEvent); wxDECLARE_EVENT(EVT_MODIFY_FILAMENT, SimpleEvent); - +wxDECLARE_EVENT(EVT_ADD_FILAMENT, SimpleEvent); +wxDECLARE_EVENT(EVT_DEL_FILAMENT, SimpleEvent); +using ColorEvent = Event; +wxDECLARE_EVENT(EVT_ADD_CUSTOM_FILAMENT, ColorEvent); const wxString DEFAULT_PROJECT_NAME = "Untitled"; class Sidebar : public wxPanel @@ -153,6 +156,9 @@ public: void jump_to_option(const std::string& opt_key, Preset::Type type, const std::wstring& category); // BBS. Add on_filaments_change() method. void on_filaments_change(size_t num_filaments); + void add_filament(); + void delete_filament(); + void add_custom_filament(wxColour new_col); // BBS void on_bed_type_change(BedType bed_type); void load_ams_list(std::string const & device, MachineObject* obj); @@ -827,7 +833,7 @@ private: bool m_was_scheduled; }; -std::vector get_min_flush_volumes(); +std::vector get_min_flush_volumes(const DynamicPrintConfig& full_config); } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp index bbca3a5a08..298ed85ed7 100644 --- a/src/slic3r/GUI/Preferences.cpp +++ b/src/slic3r/GUI/Preferences.cpp @@ -1046,6 +1046,7 @@ wxWindow* PreferencesDialog::create_general_page() auto item_calc_mode = create_item_checkbox(_L("Flushing volumes: Auto-calculate everytime the color changed."), page, _L("If enabled, auto-calculate everytime the color changed."), 50, "auto_calculate"); auto item_calc_in_long_retract = create_item_checkbox(_L("Flushing volumes: Auto-calculate every time when the filament is changed."), page, _L("If enabled, auto-calculate every time when filament is changed"), 50, "auto_calculate_when_filament_change"); auto item_remember_printer_config = create_item_checkbox(_L("Remember printer configuration"), page, _L("If enabled, Orca will remember and switch filament/process configuration for each printer automatically."), 50, "remember_printer_config"); + auto item_multi_machine = create_item_checkbox(_L("Multi-device Management(Take effect after restarting Studio)."), page, _L("With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices."), 50, "enable_multi_machine"); auto title_presets = create_item_title(_L("Presets"), page, _L("Presets")); auto title_network = create_item_title(_L("Network"), page, _L("Network")); auto item_user_sync = create_item_checkbox(_L("Auto sync user presets(Printer/Filament/Process)"), page, _L("User Sync"), 50, "sync_user_preset"); @@ -1111,6 +1112,7 @@ wxWindow* PreferencesDialog::create_general_page() sizer_page->Add(item_show_splash_screen, 0, wxTOP, FromDIP(3)); sizer_page->Add(item_hints, 0, wxTOP, FromDIP(3)); sizer_page->Add(item_calc_in_long_retract, 0, wxTOP, FromDIP(3)); + sizer_page->Add(item_multi_machine, 0, wxTOP, FromDIP(3)); sizer_page->Add(title_presets, 0, wxTOP | wxEXPAND, FromDIP(20)); sizer_page->Add(item_calc_mode, 0, wxTOP, FromDIP(3)); sizer_page->Add(item_user_sync, 0, wxTOP, FromDIP(3)); diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp index 4b53c0e359..e634c4fe1a 100644 --- a/src/slic3r/GUI/PresetComboBoxes.cpp +++ b/src/slic3r/GUI/PresetComboBoxes.cpp @@ -36,7 +36,9 @@ #include "../Utils/ASCIIFolding.hpp" #include "../Utils/FixModelByWin10.hpp" #include "../Utils/UndoRedo.hpp" +#include "../Utils/ColorSpaceConvert.hpp" #include "BitmapCache.hpp" +#include "SavePresetDialog.hpp" #include "MsgDialog.hpp" #include "ParamsDialog.hpp" @@ -625,37 +627,6 @@ bool PresetComboBox::selection_is_changed_according_to_physical_printers() return true; } -void PlaterPresetComboBox::save_custom_color_to_config(const std::vector& colors) -{ - auto set_colors = [](std::map &data, const std::vector &colors) { - for (size_t i = 0; i < colors.size(); i++) { - data[std::to_string(10 + i)] = colors[i]; //for map sort:10 begin - } - }; - if (colors.size() > 0) { - if (!wxGetApp().app_config->has_section("custom_color_list")) { - std::map data; - set_colors(data,colors); - wxGetApp().app_config->set_section("custom_color_list", data); - } else { - auto data = wxGetApp().app_config->get_section("custom_color_list"); - auto data_modify = const_cast *>(&data); - set_colors(*data_modify, colors); - wxGetApp().app_config->set_section("custom_color_list", *data_modify); - } - } -} - -std::vector PlaterPresetComboBox::get_custom_color_from_config() { - std::vector colors; - if (wxGetApp().app_config->has_section("custom_color_list")) { - auto data = wxGetApp().app_config->get_section("custom_color_list"); - for (auto iter : data) { - colors.push_back(iter.second); - } - } - return colors; -} // --------------------------------- // *** PlaterPresetComboBox *** // --------------------------------- @@ -704,21 +675,9 @@ PlaterPresetComboBox::PlaterPresetComboBox(wxWindow *parent, Preset::Type preset m_clrData.SetColour(clr_picker->GetBackgroundColour()); m_clrData.SetChooseFull(true); m_clrData.SetChooseAlpha(false); - auto color_to_string = [](const wxColour& color) { - std::string str = std::to_string(color.Red()) + "," + std::to_string(color.Green()) + "," + std::to_string(color.Blue()) + "," + std::to_string(color.Alpha()); - return str; - }; - auto string_to_wxColor = [](const std::string& str) { - wxColour color; - std::vector result; - boost::split(result, str, boost::is_any_of(",")); - if (result.size() == 4) { - color = wxColour(std::stoi(result[0]), std::stoi(result[1]), std::stoi(result[2]), std::stoi(result[3])); - } - return color; - }; - std::vector colors=get_custom_color_from_config(); - for (int i = 0; i < colors.size(); i++) { + + std::vector colors = wxGetApp().app_config->get_custom_color_from_config(); + for (int i = 0; i < colors.size(); i++) { m_clrData.SetCustomColour(i, string_to_wxColor(colors[i])); } wxColourDialog dialog(this, &m_clrData); @@ -726,13 +685,13 @@ PlaterPresetComboBox::PlaterPresetComboBox(wxWindow *parent, Preset::Type preset if ( dialog.ShowModal() == wxID_OK ) { m_clrData = dialog.GetColourData(); - const int custom_color_count = 15; - if (colors.size() != custom_color_count) { - colors.resize(custom_color_count); } - for (int i = 0; i < custom_color_count; i++) { + if (colors.size() != CUSTOM_COLOR_COUNT) { + colors.resize(CUSTOM_COLOR_COUNT); + } + for (int i = 0; i < CUSTOM_COLOR_COUNT; i++) { colors[i] = color_to_string(m_clrData.GetCustomColour(i)); } - save_custom_color_to_config(colors); + wxGetApp().app_config->save_custom_color_to_config(colors); // get current color DynamicPrintConfig* cfg = &wxGetApp().preset_bundle->project_config; auto colors = static_cast(cfg->option("filament_colour")->clone()); @@ -999,7 +958,8 @@ void PlaterPresetComboBox::update() std::map nonsys_presets; //BBS: add project embedded presets logic std::map project_embedded_presets; - std::map system_presets; + std::map system_presets; + std::map preset_descriptions; //BBS: move system to the end wxString selected_system_preset; @@ -1040,13 +1000,15 @@ void PlaterPresetComboBox::update() wxBitmap* bmp = get_bmp(preset); assert(bmp); - const std::string name = preset.alias.empty() ? preset.name : preset.alias; + const wxString name = get_preset_name(preset); + preset_descriptions.emplace(name, from_u8(preset.description)); + if (preset.is_default || preset.is_system) { //BBS: move system to the end - system_presets.emplace(get_preset_name(preset), bmp); + system_presets.emplace(name, bmp); if (is_selected) { tooltip = get_tooltip(preset); - selected_system_preset = get_preset_name(preset); + selected_system_preset = name; } //Append(get_preset_name(preset), *bmp); //validate_selection(is_selected); @@ -1057,17 +1019,17 @@ void PlaterPresetComboBox::update() //BBS: add project embedded preset logic else if (preset.is_project_embedded) { - project_embedded_presets.emplace(get_preset_name(preset), bmp); + project_embedded_presets.emplace(name, bmp); if (is_selected) { - selected_user_preset = get_preset_name(preset); + selected_user_preset = name; tooltip = wxString::FromUTF8(preset.name.c_str()); } } else { - nonsys_presets.emplace(get_preset_name(preset), bmp); + nonsys_presets.emplace(name, bmp); if (is_selected) { - selected_user_preset = get_preset_name(preset); + selected_user_preset = name; //BBS set tooltip tooltip = get_tooltip(preset); } @@ -1084,7 +1046,7 @@ void PlaterPresetComboBox::update() { set_label_marker(Append(separator(L("Project-inside presets")), wxNullBitmap)); for (std::map::iterator it = project_embedded_presets.begin(); it != project_embedded_presets.end(); ++it) { - Append(it->first, *it->second); + SetItemTooltip(Append(it->first, *it->second), preset_descriptions[it->first]); validate_selection(it->first == selected_user_preset); } } @@ -1092,7 +1054,7 @@ void PlaterPresetComboBox::update() { set_label_marker(Append(separator(L("User presets")), wxNullBitmap)); for (std::map::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) { - Append(it->first, *it->second); + SetItemTooltip(Append(it->first, *it->second), preset_descriptions[it->first]); validate_selection(it->first == selected_user_preset); } } @@ -1101,7 +1063,7 @@ void PlaterPresetComboBox::update() { set_label_marker(Append(separator(L("System presets")), wxNullBitmap)); for (std::map::iterator it = system_presets.begin(); it != system_presets.end(); ++it) { - Append(it->first, *it->second); + SetItemTooltip(Append(it->first, *it->second), preset_descriptions[it->first]); validate_selection(it->first == selected_system_preset); } } @@ -1250,6 +1212,7 @@ void TabPresetComboBox::update() std::map> project_embedded_presets; //BBS: move system to the end std::map> system_presets; + std::map preset_descriptions; wxString selected = ""; //BBS: move system to the end @@ -1276,11 +1239,14 @@ void TabPresetComboBox::update() wxBitmap* bmp = get_bmp(preset); assert(bmp); + const wxString name = get_preset_name(preset); + preset_descriptions.emplace(name, from_u8(preset.description)); + if (preset.is_default || preset.is_system) { //BBS: move system to the end - system_presets.emplace(get_preset_name(preset), std::pair(bmp, is_enabled)); + system_presets.emplace(name, std::pair(bmp, is_enabled)); if (i == idx_selected) - selected = get_preset_name(preset); + selected = name; //int item_id = Append(get_preset_name(preset), *bmp); //if (!is_enabled) // set_label_marker(item_id, LABEL_ITEM_DISABLED); @@ -1290,16 +1256,16 @@ void TabPresetComboBox::update() else if (preset.is_project_embedded) { //std::pair pair(bmp, is_enabled); - project_embedded_presets.emplace(get_preset_name(preset), std::pair(bmp, is_enabled)); + project_embedded_presets.emplace(name, std::pair(bmp, is_enabled)); if (i == idx_selected) - selected = get_preset_name(preset); + selected = name; } else { std::pair pair(bmp, is_enabled); - nonsys_presets.emplace(get_preset_name(preset), std::pair(bmp, is_enabled)); + nonsys_presets.emplace(name, std::pair(bmp, is_enabled)); if (i == idx_selected) - selected = get_preset_name(preset); + selected = name; } //BBS: move system to the end //if (i + 1 == m_collection->num_default_presets()) @@ -1315,6 +1281,7 @@ void TabPresetComboBox::update() set_label_marker(Append(separator(L("Project-inside presets")), wxNullBitmap)); for (std::map>::iterator it = project_embedded_presets.begin(); it != project_embedded_presets.end(); ++it) { int item_id = Append(it->first, *it->second.first); + SetItemTooltip(item_id, preset_descriptions[it->first]); bool is_enabled = it->second.second; if (!is_enabled) set_label_marker(item_id, LABEL_ITEM_DISABLED); @@ -1326,6 +1293,7 @@ void TabPresetComboBox::update() set_label_marker(Append(separator(L("User presets")), wxNullBitmap)); for (std::map>::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) { int item_id = Append(it->first, *it->second.first); + SetItemTooltip(item_id, preset_descriptions[it->first]); bool is_enabled = it->second.second; if (!is_enabled) set_label_marker(item_id, LABEL_ITEM_DISABLED); @@ -1338,6 +1306,7 @@ void TabPresetComboBox::update() set_label_marker(Append(separator(L("System presets")), wxNullBitmap)); for (std::map>::iterator it = system_presets.begin(); it != system_presets.end(); ++it) { int item_id = Append(it->first, *it->second.first); + SetItemTooltip(item_id, preset_descriptions[it->first]); bool is_enabled = it->second.second; if (!is_enabled) set_label_marker(item_id, LABEL_ITEM_DISABLED); diff --git a/src/slic3r/GUI/PresetComboBoxes.hpp b/src/slic3r/GUI/PresetComboBoxes.hpp index 6431354643..8069e687ef 100644 --- a/src/slic3r/GUI/PresetComboBoxes.hpp +++ b/src/slic3r/GUI/PresetComboBoxes.hpp @@ -2,9 +2,9 @@ #define slic3r_PresetComboBoxes_hpp_ //#include +#include #include #include -#include #include "libslic3r/Preset.hpp" #include "wxExtensions.hpp" @@ -164,8 +164,6 @@ public: PlaterPresetComboBox(wxWindow *parent, Preset::Type preset_type); ~PlaterPresetComboBox(); - void save_custom_color_to_config(const std::vector &colors); - std::vector get_custom_color_from_config(); ScalableButton* edit_btn { nullptr }; // BBS diff --git a/src/slic3r/GUI/PrintOptionsDialog.cpp b/src/slic3r/GUI/PrintOptionsDialog.cpp index 42667173c6..168da3886e 100644 --- a/src/slic3r/GUI/PrintOptionsDialog.cpp +++ b/src/slic3r/GUI/PrintOptionsDialog.cpp @@ -67,6 +67,12 @@ PrintOptionsDialog::PrintOptionsDialog(wxWindow* parent) } evt.Skip(); }); + m_cb_nozzle_blob->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent& evt) { + if (obj) { + obj->command_nozzle_blob_detect(m_cb_nozzle_blob->GetValue()); + } + evt.Skip(); + }); wxGetApp().UpdateDlgDarkUI(this); } @@ -163,6 +169,18 @@ void PrintOptionsDialog::update_options(MachineObject* obj_) m_cb_filament_tangle->Hide(); line6->Hide(); } + if (false/*obj_->is_support_nozzle_blob_detection*/) { + text_nozzle_blob->Show(); + m_cb_nozzle_blob->Show(); + text_nozzle_blob_caption->Show(); + line7->Show(); + } + else { + text_nozzle_blob->Hide(); + m_cb_nozzle_blob->Hide(); + text_nozzle_blob_caption->Hide(); + line7->Hide(); + } this->Freeze(); @@ -171,6 +189,7 @@ void PrintOptionsDialog::update_options(MachineObject* obj_) m_cb_auto_recovery->SetValue(obj_->xcam_auto_recovery_step_loss); m_cb_sup_sound->SetValue(obj_->xcam_allow_prompt_sound); m_cb_filament_tangle->SetValue(obj_->xcam_filament_tangle_detect); + m_cb_nozzle_blob->SetValue(obj_->nozzle_blob_detection_enabled); m_cb_ai_monitoring->SetValue(obj_->xcam_ai_monitoring); for (auto i = AiMonitorSensitivityLevel::LOW; i < LEVELS_NUM; i = (AiMonitorSensitivityLevel) (i + 1)) { @@ -325,6 +344,38 @@ wxBoxSizer* PrintOptionsDialog::create_settings_group(wxWindow* parent) line6 = new StaticLine(parent, false); line6->SetLineColour(STATIC_BOX_LINE_COL); sizer->Add(line6, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(20)); + sizer->Add(0, 0, 0, wxTOP, FromDIP(20)); + + //nozzle blob detect + line_sizer = new wxBoxSizer(wxHORIZONTAL); + m_cb_nozzle_blob = new CheckBox(parent); + text_nozzle_blob = new wxStaticText(parent, wxID_ANY, _L("Nozzle Clumping Detection")); + text_nozzle_blob->SetFont(Label::Body_14); + line_sizer->Add(FromDIP(5), 0, 0, 0); + line_sizer->Add(m_cb_nozzle_blob, 0, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(5)); + line_sizer->Add(text_nozzle_blob, 1, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(5)); + sizer->Add(0, 0, 0, wxTOP, FromDIP(15)); + sizer->Add(line_sizer, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(18)); + line_sizer->Add(FromDIP(5), 0, 0, 0); + + line_sizer = new wxBoxSizer(wxHORIZONTAL); + wxString nozzle_blob_caption_text = _L("Check if the nozzle is clumping by filament or other foreign objects."); + text_nozzle_blob_caption = new Label(parent, nozzle_blob_caption_text); + text_nozzle_blob_caption->SetFont(Label::Body_14); + text_nozzle_blob_caption->Wrap(-1); + text_nozzle_blob_caption->SetForegroundColour(STATIC_TEXT_CAPTION_COL); + line_sizer->Add(FromDIP(30), 0, 0, 0); + line_sizer->Add(text_nozzle_blob_caption, 1, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(0)); + sizer->Add(line_sizer, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(18)); + + line7 = new StaticLine(parent, false); + line7->SetLineColour(STATIC_BOX_LINE_COL); + sizer->Add(line7, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(20)); + + text_nozzle_blob->Hide(); + m_cb_nozzle_blob->Hide(); + text_nozzle_blob_caption->Hide(); + line7->Hide(); ai_monitoring_level_list->Connect( wxEVT_COMBOBOX, wxCommandEventHandler(PrintOptionsDialog::set_ai_monitor_sensitivity), NULL, this ); @@ -487,6 +538,8 @@ void PrinterPartsDialog::set_nozzle_type(wxCommandEvent& evt) nozzle_diameter_checkbox->Append(wxString::Format(_L("%.1f"), diameter_list[i])); } nozzle_diameter_checkbox->SetSelection(0); + + last_nozzle_type = type; set_nozzle_diameter(evt); } @@ -526,7 +579,11 @@ bool PrinterPartsDialog::Show(bool show) CentreOnParent(); auto type = obj->nozzle_type; - auto diameter = round(obj->nozzle_diameter * 10) / 10; + auto diameter = 0.4f; + + if (obj->nozzle_diameter > 0) { + diameter = round(obj->nozzle_diameter * 10) / 10; + } nozzle_type_checkbox->Clear(); nozzle_diameter_checkbox->Clear(); diff --git a/src/slic3r/GUI/PrintOptionsDialog.hpp b/src/slic3r/GUI/PrintOptionsDialog.hpp index ce67b76720..63fe24af63 100644 --- a/src/slic3r/GUI/PrintOptionsDialog.hpp +++ b/src/slic3r/GUI/PrintOptionsDialog.hpp @@ -49,6 +49,7 @@ protected: CheckBox* m_cb_auto_recovery; CheckBox* m_cb_sup_sound; CheckBox* m_cb_filament_tangle; + CheckBox* m_cb_nozzle_blob; wxStaticText* text_first_layer; wxStaticText* text_ai_monitoring; wxStaticText* text_ai_monitoring_caption; @@ -58,12 +59,15 @@ protected: wxStaticText* text_auto_recovery; wxStaticText* text_sup_sound; wxStaticText* text_filament_tangle; + wxStaticText* text_nozzle_blob; + wxStaticText* text_nozzle_blob_caption; StaticLine* line1; StaticLine* line2; StaticLine* line3; StaticLine* line4; StaticLine* line5; StaticLine* line6; + StaticLine* line7; wxBoxSizer* create_settings_group(wxWindow* parent); bool print_halt = false; diff --git a/src/slic3r/GUI/Printer/PrinterFileSystem.cpp b/src/slic3r/GUI/Printer/PrinterFileSystem.cpp index 8e1ef55e92..46debf2123 100644 --- a/src/slic3r/GUI/Printer/PrinterFileSystem.cpp +++ b/src/slic3r/GUI/Printer/PrinterFileSystem.cpp @@ -7,9 +7,9 @@ #include "../../Utils/NetworkAgent.hpp" #include "../BitmapCache.hpp" +#include #include #include -#include #include #include @@ -1139,8 +1139,7 @@ void PrinterFileSystem::RecvMessageThread() if (n == 0) { HandleResponse(l, sample); } else if (n == Bambu_stream_end) { - if (m_status == ListSyncing) - m_stopped = true; + m_stopped = true; Reconnect(l, m_status == ListSyncing ? ERROR_RES_BUSY : ERROR_PIPE); } else if (n == Bambu_would_block) { m_cond.timed_wait(l, boost::posix_time::milliseconds(m_messages.empty() && m_callbacks.empty() ? 1000 : 20)); @@ -1219,10 +1218,6 @@ void PrinterFileSystem::HandleResponse(boost::unique_lock &l, Bamb } } -namespace Slic3r { namespace GUI { - extern wxString hide_passwd(wxString url, std::vector const &passwords); -}} - void PrinterFileSystem::Reconnect(boost::unique_lock &l, int result) { if (m_session.tunnel) { @@ -1266,7 +1261,7 @@ void PrinterFileSystem::Reconnect(boost::unique_lock &l, int resul if (m_last_error == 0) m_stopped = true; } else { - wxLogMessage("PrinterFileSystem::Reconnect Initialized: %s", Slic3r::GUI::hide_passwd(wxString::FromUTF8(url), {"authkey=", "passwd="})); + wxLogInfo("PrinterFileSystem::Reconnect Initialized: %s", wxString::FromUTF8(url)); l.unlock(); m_status = Status::Connecting; wxLogMessage("PrinterFileSystem::Reconnect Connecting"); @@ -1288,6 +1283,9 @@ void PrinterFileSystem::Reconnect(boost::unique_lock &l, int resul m_session.tunnel = tunnel; wxLogMessage("PrinterFileSystem::Reconnect Connected"); break; + } else if (ret == 1) { + m_stopped = true; + ret = ERROR_RES_BUSY; } if (tunnel) { Bambu_Close(tunnel); diff --git a/src/slic3r/GUI/ReleaseNote.cpp b/src/slic3r/GUI/ReleaseNote.cpp index 85d1d276e1..617397f32f 100644 --- a/src/slic3r/GUI/ReleaseNote.cpp +++ b/src/slic3r/GUI/ReleaseNote.cpp @@ -31,12 +31,16 @@ wxDEFINE_EVENT(EVT_SECONDARY_CHECK_CONFIRM, wxCommandEvent); wxDEFINE_EVENT(EVT_SECONDARY_CHECK_CANCEL, wxCommandEvent); wxDEFINE_EVENT(EVT_SECONDARY_CHECK_DONE, wxCommandEvent); wxDEFINE_EVENT(EVT_SECONDARY_CHECK_RESUME, wxCommandEvent); +wxDEFINE_EVENT(EVT_LOAD_VAMS_TRAY, wxCommandEvent); wxDEFINE_EVENT(EVT_CHECKBOX_CHANGE, wxCommandEvent); wxDEFINE_EVENT(EVT_ENTER_IP_ADDRESS, wxCommandEvent); wxDEFINE_EVENT(EVT_CLOSE_IPADDRESS_DLG, wxCommandEvent); wxDEFINE_EVENT(EVT_CHECK_IP_ADDRESS_FAILED, wxCommandEvent); wxDEFINE_EVENT(EVT_SECONDARY_CHECK_RETRY, wxCommandEvent); +wxDEFINE_EVENT(EVT_PRINT_ERROR_STOP, wxCommandEvent); wxDEFINE_EVENT(EVT_UPDATE_NOZZLE, wxCommandEvent); +wxDEFINE_EVENT(EVT_JUMP_TO_HMS, wxCommandEvent); +wxDEFINE_EVENT(EVT_JUMP_TO_LIVEVIEW, wxCommandEvent); ReleaseNoteDialog::ReleaseNoteDialog(Plater *plater /*= nullptr*/) : DPIDialog(static_cast(wxGetApp().mainframe), wxID_ANY, _L("Release Note"), wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX) @@ -860,6 +864,306 @@ void SecondaryCheckDialog::rescale() m_button_cancel->Rescale(); } +PrintErrorDialog::PrintErrorDialog(wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style) + :DPIFrame(parent, id, title, pos, size, style) +{ + std::string icon_path = (boost::format("%1%/images/OrcaSlicerTitle.ico") % resources_dir()).str(); + SetIcon(wxIcon(encode_path(icon_path.c_str()), wxBITMAP_TYPE_ICO)); + SetBackgroundColour(*wxWHITE); + + btn_bg_white = StateColor(std::pair(wxColour(206, 206, 206), StateColor::Pressed), std::pair(wxColour(238, 238, 238), StateColor::Hovered), + std::pair(*wxWHITE, StateColor::Normal)); + + m_sizer_main = new wxBoxSizer(wxVERTICAL); + auto m_line_top = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(350), 1)); + m_line_top->SetBackgroundColour(wxColour(166, 169, 170)); + m_sizer_main->Add(m_line_top, 0, wxEXPAND, 0); + m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(5)); + + wxBoxSizer* m_sizer_right = new wxBoxSizer(wxVERTICAL); + + m_sizer_right->Add(0, 0, 1, wxTOP, FromDIP(5)); + + m_vebview_release_note = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL); + m_vebview_release_note->SetScrollRate(0, 5); + m_vebview_release_note->SetBackgroundColour(*wxWHITE); + m_vebview_release_note->SetMinSize(wxSize(FromDIP(320), FromDIP(250))); + m_sizer_right->Add(m_vebview_release_note, 0, wxEXPAND | wxRIGHT | wxLEFT, FromDIP(15)); + + m_error_prompt_pic_static = new wxStaticBitmap(m_vebview_release_note, wxID_ANY, wxBitmap(), wxDefaultPosition, wxSize(FromDIP(300), FromDIP(180))); + + auto bottom_sizer = new wxBoxSizer(wxVERTICAL); + m_sizer_button = new wxBoxSizer(wxVERTICAL); + + bottom_sizer->Add(m_sizer_button, 0, wxEXPAND | wxRIGHT | wxLEFT, 0); + + m_sizer_right->Add(bottom_sizer, 0, wxEXPAND | wxRIGHT | wxLEFT, FromDIP(15)); + m_sizer_right->Add(0, 0, 0, wxTOP, FromDIP(10)); + + m_sizer_main->Add(m_sizer_right, 0, wxBOTTOM | wxEXPAND, FromDIP(5)); + + Bind(wxEVT_CLOSE_WINDOW, [this](auto& e) {this->on_hide(); }); + Bind(wxEVT_ACTIVATE, [this](auto& e) { if (!e.GetActive()) this->RequestUserAttention(wxUSER_ATTENTION_ERROR); }); + Bind(wxEVT_WEBREQUEST_STATE, &PrintErrorDialog::on_webrequest_state, this); + + + SetSizer(m_sizer_main); + Layout(); + m_sizer_main->Fit(this); + + init_button_list(); + + CenterOnParent(); + wxGetApp().UpdateFrameDarkUI(this); +} + +void PrintErrorDialog::post_event(wxCommandEvent&& event) +{ + if (event_parent) { + event.SetString(""); + event.SetEventObject(event_parent); + wxPostEvent(event_parent, event); + event.Skip(); + } +} + +void PrintErrorDialog::on_webrequest_state(wxWebRequestEvent& evt) +{ + BOOST_LOG_TRIVIAL(trace) << "monitor: monitor_panel web request state = " << evt.GetState(); + switch (evt.GetState()) { + case wxWebRequest::State_Completed: { + wxImage img(*evt.GetResponse().GetStream()); + wxImage resize_img = img.Scale(FromDIP(320), FromDIP(180), wxIMAGE_QUALITY_HIGH); + wxBitmap error_prompt_pic = resize_img; + m_error_prompt_pic_static->SetBitmap(error_prompt_pic); + Layout(); + Fit(); + + break; + } + case wxWebRequest::State_Failed: + case wxWebRequest::State_Cancelled: + case wxWebRequest::State_Unauthorized: { + m_error_prompt_pic_static->SetBitmap(wxBitmap()); + break; + } + case wxWebRequest::State_Active: + case wxWebRequest::State_Idle: break; + default: break; + } +} + +void PrintErrorDialog::update_text_image(wxString text, wxString image_url) +{ + //if (!m_sizer_text_release_note) { + // m_sizer_text_release_note = new wxBoxSizer(wxVERTICAL); + //} + wxBoxSizer* sizer_text_release_note = new wxBoxSizer(wxVERTICAL); + + + if (!m_staticText_release_note) { + m_staticText_release_note = new Label(m_vebview_release_note, text, LB_AUTO_WRAP); + sizer_text_release_note->Add(m_error_prompt_pic_static, 0, wxALIGN_CENTER, FromDIP(5)); + sizer_text_release_note->Add(m_staticText_release_note, 0, wxALIGN_CENTER , FromDIP(5)); + m_vebview_release_note->SetSizer(sizer_text_release_note); + } + if (!image_url.empty()) { + web_request = wxWebSession::GetDefault().CreateRequest(this, image_url); + BOOST_LOG_TRIVIAL(trace) << "monitor: create new webrequest, state = " << web_request.GetState() << ", url = " << image_url; + if (web_request.GetState() == wxWebRequest::State_Idle) + web_request.Start(); + BOOST_LOG_TRIVIAL(trace) << "monitor: start new webrequest, state = " << web_request.GetState() << ", url = " << image_url; + m_error_prompt_pic_static->Show(); + + } + else { + m_error_prompt_pic_static->Hide(); + } + sizer_text_release_note->Layout(); + m_staticText_release_note->SetMaxSize(wxSize(FromDIP(300), -1)); + m_staticText_release_note->SetMinSize(wxSize(FromDIP(300), -1)); + m_staticText_release_note->SetLabelText(text); + m_vebview_release_note->Layout(); + + auto text_size = m_staticText_release_note->GetBestSize(); + if (text_size.y < FromDIP(360)) + if (!image_url.empty()) { + m_vebview_release_note->SetMinSize(wxSize(FromDIP(320), text_size.y + FromDIP(220))); + } + else { + m_vebview_release_note->SetMinSize(wxSize(FromDIP(320), text_size.y + FromDIP(25))); + } + else { + m_vebview_release_note->SetMinSize(wxSize(FromDIP(320), FromDIP(340))); + } + + Layout(); + Fit(); +} + +void PrintErrorDialog::on_show() +{ + wxGetApp().UpdateFrameDarkUI(this); + + this->Show(); + this->Raise(); +} + +void PrintErrorDialog::on_hide() +{ + //m_sizer_button->Clear(); + //m_sizer_button->Layout(); + //m_used_button.clear(); + this->Hide(); + if (web_request.IsOk() && web_request.GetState() == wxWebRequest::State_Active) { + BOOST_LOG_TRIVIAL(info) << "web_request: cancelled"; + web_request.Cancel(); + } + m_error_prompt_pic_static->SetBitmap(wxBitmap()); + + if (wxGetApp().mainframe != nullptr) { + wxGetApp().mainframe->Show(); + wxGetApp().mainframe->Raise(); + } +} + +void PrintErrorDialog::update_title_style(wxString title, std::vector button_style, wxWindow* parent) +{ + SetTitle(title); + event_parent = parent; + for (int used_button_id : m_used_button) { + if (m_button_list.find(used_button_id) != m_button_list.end()) { + m_button_list[used_button_id]->Hide(); + } + } + m_sizer_button->Clear(); + m_used_button = button_style; + for (int button_id : button_style) { + if (m_button_list.find(button_id) != m_button_list.end()) { + m_sizer_button->Add(m_button_list[button_id], 0, wxALL, FromDIP(5)); + m_button_list[button_id]->Show(); + } + } + Layout(); + Fit(); + +} + +void PrintErrorDialog::init_button(PrintErrorButton style,wxString buton_text) { + Button* print_error_button = new Button(this, buton_text); + print_error_button->SetBackgroundColor(btn_bg_white); + print_error_button->SetBorderColor(wxColour(38, 46, 48)); + print_error_button->SetFont(Label::Body_14); + print_error_button->SetSize(wxSize(FromDIP(300), FromDIP(30))); + print_error_button->SetMinSize(wxSize(FromDIP(300), FromDIP(30))); + print_error_button->SetMaxSize(wxSize(-1, FromDIP(30))); + print_error_button->SetCornerRadius(FromDIP(5)); + print_error_button->Hide(); + m_button_list[style] = print_error_button; + +} + +void PrintErrorDialog::init_button_list() { + + init_button(RESUME_PRINTING, _L("Resume Printing")); + m_button_list[RESUME_PRINTING]->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { + post_event(wxCommandEvent(EVT_SECONDARY_CHECK_RESUME)); + e.Skip(); + }); + + init_button(RESUME_PRINTING_DEFECTS, _L("Resume Printing(defects acceptable)")); + m_button_list[RESUME_PRINTING_DEFECTS]->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { + post_event(wxCommandEvent(EVT_SECONDARY_CHECK_RESUME)); + e.Skip(); + }); + + + init_button(RESUME_PRINTING_PROBELM_SOLVED, _L("Resume Printing(problem solved)")); + m_button_list[RESUME_PRINTING_PROBELM_SOLVED]->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { + post_event(wxCommandEvent(EVT_SECONDARY_CHECK_RESUME)); + e.Skip(); + }); + + init_button(STOP_PRINTING, _L("Stop Printing")); + m_button_list[STOP_PRINTING]->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { + post_event(wxCommandEvent(EVT_PRINT_ERROR_STOP)); + e.Skip(); + }); + + init_button(CHECK_ASSISTANT, _L("Check Assistant")); + m_button_list[CHECK_ASSISTANT]->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { + post_event(wxCommandEvent(EVT_JUMP_TO_HMS)); + this->on_hide(); + }); + + init_button(FILAMENT_EXTRUDED, _L("Filament Extruded, Continue")); + m_button_list[FILAMENT_EXTRUDED]->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { + post_event(wxCommandEvent(EVT_SECONDARY_CHECK_DONE)); + e.Skip(); + }); + + init_button(RETRY_FILAMENT_EXTRUDED, _L("Not Extruded Yet, Retry")); + m_button_list[RETRY_FILAMENT_EXTRUDED]->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { + wxCommandEvent evt(EVT_SECONDARY_CHECK_RETRY, GetId()); + e.SetEventObject(this); + GetEventHandler()->ProcessEvent(evt); + this->on_hide(); + }); + + init_button(CONTINUE, _L("Finished, Continue")); + m_button_list[CONTINUE]->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { + post_event(wxCommandEvent(EVT_SECONDARY_CHECK_DONE)); + e.Skip(); + }); + + init_button(LOAD_VIRTUAL_TRAY, _L("Load Filament")); + m_button_list[LOAD_VIRTUAL_TRAY]->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { + post_event(wxCommandEvent(EVT_LOAD_VAMS_TRAY)); + e.Skip(); + }); + + init_button(OK_BUTTON, _L("OK")); + m_button_list[OK_BUTTON]->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { + wxCommandEvent evt(EVT_SECONDARY_CHECK_CONFIRM, GetId()); + e.SetEventObject(this); + GetEventHandler()->ProcessEvent(evt); + this->on_hide(); + }); + + init_button(FILAMENT_LOAD_RESUME, _L("Filament Loaded, Resume")); + m_button_list[FILAMENT_LOAD_RESUME]->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { + post_event(wxCommandEvent(EVT_SECONDARY_CHECK_RESUME)); + e.Skip(); + }); + + init_button(JUMP_TO_LIVEVIEW, _L("View Liveview")); + m_button_list[JUMP_TO_LIVEVIEW]->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { + post_event(wxCommandEvent(EVT_JUMP_TO_LIVEVIEW)); + e.Skip(); + }); +} + +PrintErrorDialog::~PrintErrorDialog() +{ + +} + +void PrintErrorDialog::on_dpi_changed(const wxRect& suggested_rect) +{ + rescale(); +} + +void PrintErrorDialog::msw_rescale() { + wxGetApp().UpdateFrameDarkUI(this); + Refresh(); +} + +void PrintErrorDialog::rescale() +{ + for(auto used_button:m_used_button) + m_button_list[used_button]->Rescale(); +} + ConfirmBeforeSendDialog::ConfirmBeforeSendDialog(wxWindow* parent, wxWindowID id, const wxString& title, enum ButtonStyle btn_style, const wxPoint& pos, const wxSize& size, long style, bool not_show_again_check) :DPIDialog(parent, id, title, pos, size, style) { @@ -1121,7 +1425,7 @@ void ConfirmBeforeSendDialog::disable_button_ok() void ConfirmBeforeSendDialog::enable_button_ok() { m_button_ok->Enable(); - StateColor btn_bg_green(std::pair(wxColour(61, 203, 115), StateColor::Pressed), std::pair(wxColour(61, 203, 115), StateColor::Hovered), + StateColor btn_bg_green(std::pair(wxColour(38, 166, 154), StateColor::Pressed), std::pair(wxColour(38, 166, 154), StateColor::Hovered), std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Normal)); m_button_ok->SetBackgroundColor(btn_bg_green); m_button_ok->SetBorderColor(btn_bg_green); diff --git a/src/slic3r/GUI/ReleaseNote.hpp b/src/slic3r/GUI/ReleaseNote.hpp index 80727df552..d8ad66644c 100644 --- a/src/slic3r/GUI/ReleaseNote.hpp +++ b/src/slic3r/GUI/ReleaseNote.hpp @@ -47,7 +47,11 @@ wxDECLARE_EVENT(EVT_SECONDARY_CHECK_CANCEL, wxCommandEvent); wxDECLARE_EVENT(EVT_SECONDARY_CHECK_RETRY, wxCommandEvent); wxDECLARE_EVENT(EVT_SECONDARY_CHECK_DONE, wxCommandEvent); wxDECLARE_EVENT(EVT_SECONDARY_CHECK_RESUME, wxCommandEvent); +wxDECLARE_EVENT(EVT_PRINT_ERROR_STOP, wxCommandEvent); wxDECLARE_EVENT(EVT_UPDATE_NOZZLE, wxCommandEvent); +wxDECLARE_EVENT(EVT_LOAD_VAMS_TRAY, wxCommandEvent); +wxDECLARE_EVENT(EVT_JUMP_TO_HMS, wxCommandEvent); +wxDECLARE_EVENT(EVT_JUMP_TO_LIVEVIEW, wxCommandEvent); class ReleaseNoteDialog : public DPIDialog { @@ -159,6 +163,57 @@ public: std::string show_again_config_text = ""; }; +class PrintErrorDialog : public DPIFrame +{ +private: + wxWindow* event_parent{ nullptr }; +public: + enum PrintErrorButton { + RESUME_PRINTING = 2, + RESUME_PRINTING_DEFECTS = 3, + RESUME_PRINTING_PROBELM_SOLVED = 4, + STOP_PRINTING = 5, + CHECK_ASSISTANT = 6, + FILAMENT_EXTRUDED = 7, + RETRY_FILAMENT_EXTRUDED = 8, + CONTINUE = 9, + LOAD_VIRTUAL_TRAY = 10, + OK_BUTTON = 11, + FILAMENT_LOAD_RESUME, + JUMP_TO_LIVEVIEW, + ERROR_BUTTON_COUNT + }; + PrintErrorDialog( + wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxString& title = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxCLOSE_BOX | wxCAPTION + ); + void update_text_image(wxString text, wxString image_url); + void on_show(); + void on_hide(); + void update_title_style(wxString title, std::vector style, wxWindow* parent = nullptr); + void post_event(wxCommandEvent&& event); + void rescale(); + ~PrintErrorDialog(); + void on_dpi_changed(const wxRect& suggested_rect); + void msw_rescale(); + void init_button(PrintErrorButton style, wxString buton_text); + void init_button_list(); + void on_webrequest_state(wxWebRequestEvent& evt); + + StateColor btn_bg_white; + wxWebRequest web_request; + wxStaticBitmap* m_error_prompt_pic_static; + Label* m_staticText_release_note{ nullptr }; + wxBoxSizer* m_sizer_main; + wxBoxSizer* m_sizer_button; + wxScrolledWindow* m_vebview_release_note{ nullptr }; + std::map m_button_list; + std::vector m_used_button; +}; struct ConfirmBeforeSendInfo { diff --git a/src/slic3r/GUI/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp index 62f602c27b..08a9cdd96c 100644 --- a/src/slic3r/GUI/SelectMachine.cpp +++ b/src/slic3r/GUI/SelectMachine.cpp @@ -398,12 +398,15 @@ SelectMachinePopup::SelectMachinePopup(wxWindow *parent) auto other_title = create_title_panel(_L("Other Device")); m_sizer_other_devices = new wxBoxSizer(wxVERTICAL); + + m_panel_ping_code = new PinCodePanel(m_scrolledWindow, wxID_ANY, wxDefaultPosition, SELECT_MACHINE_ITEM_SIZE); + m_sizxer_scrolledWindow->Add(own_title, 0, wxEXPAND | wxLEFT, FromDIP(15)); m_sizxer_scrolledWindow->Add(m_sizer_my_devices, 0, wxEXPAND, 0); + m_sizxer_scrolledWindow->Add(m_panel_ping_code, 0, wxEXPAND, 0); m_sizxer_scrolledWindow->Add(other_title, 0, wxEXPAND | wxLEFT, FromDIP(15)); m_sizxer_scrolledWindow->Add(m_sizer_other_devices, 0, wxEXPAND, 0); - m_sizer_main->Add(m_scrolledWindow, 0, wxALL | wxEXPAND, FromDIP(2)); SetSizer(m_sizer_main); @@ -872,6 +875,17 @@ void SelectMachinePopup::OnLeftUp(wxMouseEvent &event) } } + //pin code + auto pc_rect = m_panel_ping_code->ClientToScreen(wxPoint(0, 0)); + if (mouse_pos.x > pc_rect.x && mouse_pos.y > pc_rect.y && mouse_pos.x < (pc_rect.x + m_panel_ping_code->GetSize().x) && mouse_pos.y < (pc_rect.y + m_panel_ping_code->GetSize().y)) { + /*wxMouseEvent event(wxEVT_LEFT_UP); + auto tag_pos = m_panel_ping_code->ScreenToClient(mouse_pos); + event.SetPosition(tag_pos); + event.SetEventObject(m_panel_ping_code); + wxPostEvent(m_panel_ping_code, event);*/ + wxGetApp().popup_ping_bind_dialog(); + } + //hyper link auto h_rect = m_hyperlink->ClientToScreen(wxPoint(0, 0)); if (mouse_pos.x > h_rect.x && mouse_pos.y > h_rect.y && mouse_pos.x < (h_rect.x + m_hyperlink->GetSize().x) && mouse_pos.y < (h_rect.y + m_hyperlink->GetSize().y)) { @@ -4581,4 +4595,80 @@ void EditDevNameDialog::on_edit_name(wxCommandEvent &e) ThumbnailPanel::~ThumbnailPanel() {} + PinCodePanel::PinCodePanel(wxWindow* parent, wxWindowID winid /*= wxID_ANY*/, const wxPoint& pos /*= wxDefaultPosition*/, const wxSize& size /*= wxDefaultSize*/) + { + wxPanel::Create(parent, winid, pos, SELECT_MACHINE_ITEM_SIZE); + Bind(wxEVT_PAINT, &PinCodePanel::OnPaint, this); + SetSize(SELECT_MACHINE_ITEM_SIZE); + SetMaxSize(SELECT_MACHINE_ITEM_SIZE); + SetMinSize(SELECT_MACHINE_ITEM_SIZE); + + m_bitmap = ScalableBitmap(this, "bind_device_ping_code",10); + + this->Bind(wxEVT_ENTER_WINDOW, &PinCodePanel::on_mouse_enter, this); + this->Bind(wxEVT_LEAVE_WINDOW, &PinCodePanel::on_mouse_leave, this); + this->Bind(wxEVT_LEFT_UP, &PinCodePanel::on_mouse_left_up, this); + } + + void PinCodePanel::OnPaint(wxPaintEvent& event) + { + wxPaintDC dc(this); + render(dc); + } + + void PinCodePanel::render(wxDC& dc) + { +#ifdef __WXMSW__ + wxSize size = GetSize(); + wxMemoryDC memdc; + wxBitmap bmp(size.x, size.y); + memdc.SelectObject(bmp); + memdc.Blit({ 0, 0 }, size, &dc, { 0, 0 }); + + { + wxGCDC dc2(memdc); + doRender(dc2); + } + + memdc.SelectObject(wxNullBitmap); + dc.DrawBitmap(bmp, 0, 0); +#else + doRender(dc); +#endif + } + + void PinCodePanel::doRender(wxDC& dc) + { + auto size = GetSize(); + dc.DrawBitmap(m_bitmap.bmp(), wxPoint(FromDIP(20), (size.y - m_bitmap.GetBmpSize().y) / 2)); + dc.SetFont(::Label::Head_13); + dc.SetTextForeground(wxColour(38, 46, 48)); + wxString txt = _L("Bind with Pin Code"); + auto txt_size = dc.GetTextExtent(txt); + dc.DrawText(txt, wxPoint(FromDIP(40), (size.y - txt_size.y) / 2)); + + if (m_hover) { + dc.SetPen(SELECT_MACHINE_BRAND); + dc.SetBrush(*wxTRANSPARENT_BRUSH); + dc.DrawRectangle(0, 0, size.x, size.y); + } + } + + void PinCodePanel::on_mouse_enter(wxMouseEvent& evt) + { + m_hover = true; + Refresh(); + } + + void PinCodePanel::on_mouse_leave(wxMouseEvent& evt) + { + m_hover = false; + Refresh(); + } + + void PinCodePanel::on_mouse_left_up(wxMouseEvent& evt) + { + wxGetApp().popup_ping_bind_dialog(); + } + }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/SelectMachine.hpp b/src/slic3r/GUI/SelectMachine.hpp index d9ea4cb8f4..bab4d3d4e9 100644 --- a/src/slic3r/GUI/SelectMachine.hpp +++ b/src/slic3r/GUI/SelectMachine.hpp @@ -210,6 +210,27 @@ public: MachineObjectPanel *mPanel; }; +class PinCodePanel : public wxPanel +{ +public: + PinCodePanel(wxWindow* parent, + wxWindowID winid = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize); + ~PinCodePanel() {}; + + ScalableBitmap m_bitmap; + bool m_hover{false}; + + void OnPaint(wxPaintEvent& event); + void render(wxDC& dc); + void doRender(wxDC& dc); + + void on_mouse_enter(wxMouseEvent& evt); + void on_mouse_leave(wxMouseEvent& evt); + void on_mouse_left_up(wxMouseEvent& evt); +}; + class ThumbnailPanel; @@ -232,8 +253,11 @@ public: private: int m_my_devices_count{0}; int m_other_devices_count{0}; + PinCodePanel* m_panel_ping_code{nullptr}; wxWindow* m_placeholder_panel{nullptr}; wxHyperlinkCtrl* m_hyperlink{nullptr}; + Label* m_ping_code_text{nullptr}; + wxStaticBitmap* m_img_ping_code{nullptr}; wxBoxSizer * m_sizer_body{nullptr}; wxBoxSizer * m_sizer_my_devices{nullptr}; wxBoxSizer * m_sizer_other_devices{nullptr}; diff --git a/src/slic3r/GUI/SendMultiMachinePage.cpp b/src/slic3r/GUI/SendMultiMachinePage.cpp new file mode 100644 index 0000000000..368bfa9161 --- /dev/null +++ b/src/slic3r/GUI/SendMultiMachinePage.cpp @@ -0,0 +1,1618 @@ +#include "SendMultiMachinePage.hpp" +#include "TaskManager.hpp" +#include "I18N.hpp" + +#include "GUI_App.hpp" +#include "MainFrame.hpp" +#include "Widgets/RadioBox.hpp" +#include + +namespace Slic3r { +namespace GUI { + + + +WX_DEFINE_LIST(AmsRadioSelectorList); + +class ScrolledWindow : public wxScrolledWindow { +public: + ScrolledWindow(wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxVSCROLL) : wxScrolledWindow(parent, id, pos, size, style) {} + + bool ShouldScrollToChildOnFocus(wxWindow* child) override { return false; } +}; + +SendDeviceItem::SendDeviceItem(wxWindow* parent, MachineObject* obj) + : DeviceItem(parent, obj) +{ + SetBackgroundColour(*wxWHITE); + m_bitmap_check_disable = ScalableBitmap(this, "check_off_disabled", 18); + m_bitmap_check_off = ScalableBitmap(this, "check_off_focused", 18); + m_bitmap_check_on = ScalableBitmap(this, "check_on", 18); + + + SetMinSize(wxSize(FromDIP(DEVICE_ITEM_MAX_WIDTH), FromDIP(SEND_ITEM_MAX_HEIGHT))); + SetMaxSize(wxSize(FromDIP(DEVICE_ITEM_MAX_WIDTH), FromDIP(SEND_ITEM_MAX_HEIGHT))); + + Bind(wxEVT_PAINT, &SendDeviceItem::paintEvent, this); + Bind(wxEVT_ENTER_WINDOW, &SendDeviceItem::OnEnterWindow, this); + Bind(wxEVT_LEAVE_WINDOW, &SendDeviceItem::OnLeaveWindow, this); + Bind(wxEVT_LEFT_DOWN, &SendDeviceItem::OnLeftDown, this); + Bind(wxEVT_MOTION, &SendDeviceItem::OnMove, this); + Bind(EVT_MULTI_DEVICE_SELECTED, &SendDeviceItem::OnSelectedDevice, this); + wxGetApp().UpdateDarkUIWin(this); +} + +void SendDeviceItem::DrawTextWithEllipsis(wxDC& dc, const wxString& text, int maxWidth, int left, int top /*= 0*/) +{ + wxSize size = GetSize(); + wxFont font = dc.GetFont(); + + wxSize textSize = dc.GetTextExtent(text); + dc.SetTextForeground(StateColor::darkModeColorFor(wxColour(50, 58, 61))); + int textWidth = textSize.GetWidth(); + + if (textWidth > maxWidth) { + wxString truncatedText = text; + int ellipsisWidth = dc.GetTextExtent("...").GetWidth(); + int numChars = text.length(); + + for (int i = numChars - 1; i >= 0; --i) { + truncatedText = text.substr(0, i) + "..."; + int truncatedWidth = dc.GetTextExtent(truncatedText).GetWidth(); + + if (truncatedWidth <= maxWidth - ellipsisWidth) { + break; + } + } + + if (top == 0) { + dc.DrawText(truncatedText, left, (size.y - textSize.y) / 2); + } + else { + dc.DrawText(truncatedText, left, (size.y - textSize.y) / 2 - top); + } + + } + else { + if (top == 0) { + dc.DrawText(text, left, (size.y - textSize.y) / 2); + } + else { + dc.DrawText(text, left, (size.y - textSize.y) / 2 - top); + } + } +} + +void SendDeviceItem::OnEnterWindow(wxMouseEvent& evt) +{ + m_hover = true; + Refresh(false); +} + +void SendDeviceItem::OnLeaveWindow(wxMouseEvent& evt) +{ + m_hover = false; + Refresh(false); +} + +void SendDeviceItem::OnSelectedDevice(wxCommandEvent& evt) +{ + auto dev_id = evt.GetString(); + auto state = evt.GetInt(); + if (state == 0) { + state_selected = 1; + } + else if (state == 1) { + state_selected = 0; + } + Refresh(false); +} + +void SendDeviceItem::OnLeftDown(wxMouseEvent& evt) +{ + int left = FromDIP(15); + auto mouse_pos = ClientToScreen(evt.GetPosition()); + auto item = this->ClientToScreen(wxPoint(0, 0)); + + if (mouse_pos.x > (item.x + left) && + mouse_pos.x < (item.x + left + m_bitmap_check_disable.GetBmpWidth()) && + mouse_pos.y > item.y && + mouse_pos.y < (item.y + DEVICE_ITEM_MAX_HEIGHT)) { + + if (state_printable <= 2 && state_local_task > 1) { + post_event(wxCommandEvent(EVT_MULTI_DEVICE_SELECTED)); + } + } +} + +void SendDeviceItem::OnMove(wxMouseEvent& evt) +{ + int left = FromDIP(15); + auto mouse_pos = ClientToScreen(evt.GetPosition()); + auto item = this->ClientToScreen(wxPoint(0, 0)); + + if (mouse_pos.x > (item.x + left) && + mouse_pos.x < (item.x + left + m_bitmap_check_disable.GetBmpWidth()) && + mouse_pos.y > item.y && + mouse_pos.y < (item.y + DEVICE_ITEM_MAX_HEIGHT)) { + SetCursor(wxCURSOR_HAND); + } + else { + SetCursor(wxCURSOR_ARROW); + } +} + +void SendDeviceItem::paintEvent(wxPaintEvent& evt) +{ + wxPaintDC dc(this); + render(dc); +} + +void SendDeviceItem::render(wxDC& dc) +{ +#ifdef __WXMSW__ + wxSize size = GetSize(); + wxMemoryDC memdc; + wxBitmap bmp(size.x, size.y); + memdc.SelectObject(bmp); + memdc.Blit({ 0, 0 }, size, &dc, { 0, 0 }); + + { + wxGCDC dc2(memdc); + doRender(dc2); + } + + memdc.SelectObject(wxNullBitmap); + dc.DrawBitmap(bmp, 0, 0); +#else + doRender(dc); +#endif +} + +void SendDeviceItem::doRender(wxDC& dc) +{ + wxSize size = GetSize(); + dc.SetPen(wxPen(*wxBLACK)); + + int left = FromDIP(SEND_LEFT_PADDING_LEFT); + + + //checkbox + if (state_printable > 2) { + dc.DrawBitmap(m_bitmap_check_disable.bmp(), wxPoint(left, (size.y - m_bitmap_check_disable.GetBmpSize().y) / 2 )); + } + else { + if (state_selected == 0) { + dc.DrawBitmap(m_bitmap_check_off.bmp(), wxPoint(left, (size.y - m_bitmap_check_disable.GetBmpSize().y) / 2 )); + } + else if(state_selected == 1) { + dc.DrawBitmap(m_bitmap_check_on.bmp(), wxPoint(left, (size.y - m_bitmap_check_disable.GetBmpSize().y) / 2 )); + } + } + + //task status + if (state_local_task <= 1) { + dc.DrawBitmap(m_bitmap_check_disable.bmp(), wxPoint(left, (size.y - m_bitmap_check_disable.GetBmpSize().y) / 2 )); + } + + left += FromDIP(SEND_LEFT_PRINTABLE); + + //dev names + DrawTextWithEllipsis(dc, wxString::FromUTF8(get_obj()->dev_name), FromDIP(SEND_LEFT_DEV_NAME), left); + left += FromDIP(SEND_LEFT_DEV_NAME); + + //device state + if (state_printable <= 2) { + dc.SetTextForeground(wxColour(0, 150, 136)); + } + else { + dc.SetTextForeground(wxColour(208, 27, 27)); + } + + DrawTextWithEllipsis(dc, get_state_printable(), FromDIP(SEND_LEFT_DEV_NAME), left); + left += FromDIP(SEND_LEFT_DEV_STATUS); + + dc.SetTextForeground(*wxBLACK); + + //task state + //DrawTextWithEllipsis(dc, get_local_state_task(), FromDIP(SEND_LEFT_DEV_NAME), left); + //left += FromDIP(SEND_LEFT_DEV_STATUS); + + + //AMS + if (!obj_->has_ams()) { + DrawTextWithEllipsis(dc, _L("No AMS"), FromDIP(SEND_LEFT_DEV_NAME), left); + } + else { + DrawTextWithEllipsis(dc, _L("AMS"), FromDIP(SEND_LEFT_DEV_NAME), left); + } + + if (m_hover) { + dc.SetPen(wxPen(wxColour(0, 150, 136))); + dc.SetBrush(*wxTRANSPARENT_BRUSH); + dc.DrawRoundedRectangle(0, 0, size.x, size.y, 3); + } +} +void SendDeviceItem::post_event(wxCommandEvent&& event) +{ + event.SetEventObject(this); + event.SetString(obj_->dev_id); + event.SetInt(state_selected); + wxPostEvent(this, event); +} + +void SendDeviceItem::DoSetSize(int x, int y, int width, int height, int sizeFlags /*= wxSIZE_AUTO*/) +{ + wxWindow::DoSetSize(x, y, width, height, sizeFlags); +} + +SendMultiMachinePage::SendMultiMachinePage(Plater* plater) + : DPIDialog(static_cast(wxGetApp().mainframe), wxID_ANY, + _L("Send to Multi-device"), + wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX | wxRESIZE_BORDER) + ,m_plater(plater) +{ +#ifdef __WINDOWS__ + SetDoubleBuffered(true); +#endif //__WINDOWS__ + + app_config = get_app_config(); + + SetBackgroundColour(*wxWHITE); + // icon + std::string icon_path = (boost::format("%1%/images/OrcaSlicerTitle.ico") % resources_dir()).str(); + SetIcon(wxIcon(encode_path(icon_path.c_str()), wxBITMAP_TYPE_ICO)); + + wxBoxSizer* main_sizer = new wxBoxSizer(wxVERTICAL); + + auto line_top = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 1), wxTAB_TRAVERSAL); + line_top->SetBackgroundColour(wxColour(166, 169, 170)); + main_sizer->Add(line_top, 0, wxEXPAND, 0); + main_sizer->AddSpacer(FromDIP(10)); + + m_main_scroll = new ScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL); + m_main_scroll->SetBackgroundColour(*wxWHITE); + m_main_scroll->SetScrollRate(5, 5); + + m_sizer_body = new wxBoxSizer(wxVERTICAL); + m_main_page = create_page(); + m_sizer_body->Add(m_main_page, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(38)); + m_main_scroll->SetSizerAndFit(m_sizer_body); + m_main_scroll->Layout(); + m_main_scroll->Fit(); + m_main_scroll->Centre(wxBOTH); + + main_sizer->Add(m_main_scroll, 1, wxEXPAND); + + SetSizer(main_sizer); + Layout(); + Fit(); + Centre(wxBOTH); + + m_mapping_popup = new AmsMapingPopup(m_main_page); + Bind(EVT_SET_FINISH_MAPPING, &SendMultiMachinePage::on_set_finish_mapping, this); + Bind(wxEVT_LEFT_DOWN, [this](auto& e) {check_fcous_state(this); e.Skip(); }); + m_main_page->Bind(wxEVT_LEFT_DOWN, [this](auto& e) {check_fcous_state(this); e.Skip(); }); + m_main_scroll->Bind(wxEVT_LEFT_DOWN, [this](auto& e) {check_fcous_state(this); e.Skip(); }); + + init_timer(); + Bind(wxEVT_TIMER, &SendMultiMachinePage::on_timer, this); + wxGetApp().UpdateDlgDarkUI(this); +} + +SendMultiMachinePage::~SendMultiMachinePage() +{ + // TODO + m_radio_group.DeleteContents(true); + + if (m_refresh_timer) + m_refresh_timer->Stop(); + delete m_refresh_timer; +} + +void SendMultiMachinePage::prepare(int plate_idx) +{ + // TODO + m_print_plate_idx = plate_idx; +} + +void SendMultiMachinePage::on_dpi_changed(const wxRect& suggested_rect) +{ + +} + +void SendMultiMachinePage::on_sys_color_changed() +{ + +} + +void SendMultiMachinePage::refresh_user_device() +{ + sizer_machine_list->Clear(false); + Slic3r::DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (!dev) { + for (auto it = m_device_items.begin(); it != m_device_items.end(); it++) { + wxWindow* child = it->second; + child->Destroy(); + } + return; + } + + auto all_machine = dev->get_my_cloud_machine_list(); + auto user_machine = std::map(); + + //selected machine + for (int i = 0; i < PICK_DEVICE_MAX; i++) { + auto dev_id = app_config->get("multi_devices", std::to_string(i)); + + if (all_machine.count(dev_id) > 0) { + user_machine[dev_id] = all_machine[dev_id]; + } + } + + + auto task_manager = wxGetApp().getTaskManager(); + + std::vector subscribe_list; + std::vector dev_temp; + + for (auto it = user_machine.begin(); it != user_machine.end(); ++it) { + SendDeviceItem* di = new SendDeviceItem(scroll_macine_list, it->second); + if (m_device_items.find(it->first) != m_device_items.end()) { + auto item = m_device_items[it->first]; + if (item->state_selected == 1 && di->state_printable <= 2) + di->state_selected = item->state_selected; + item->Destroy(); + } + m_device_items[it->first] = di; + + //update state + if (task_manager) { + m_device_items[it->first]->state_local_task = task_manager->query_task_state(it->first); + } + + dev_temp.push_back(m_device_items[it->first]); + subscribe_list.push_back(it->first); + } + + dev->subscribe_device_list(subscribe_list); + + if (m_sort.rule == SortItem::SortRule::SR_None) { + this->device_printable_big = false; + m_sort.set_role(SortItem::SR_DEV_STATE, device_printable_big); + } + std::sort(dev_temp.begin(), dev_temp.end(), m_sort.get_call_back()); + + for (auto i = 0; i < dev_temp.size(); ++i) { + sizer_machine_list->Add(dev_temp[i], 0, wxALL | wxEXPAND, 0); + } + + // maintenance dev_items + auto it = m_device_items.begin(); + while (it != m_device_items.end()) { + if (user_machine.find(it->first) != user_machine.end()) { + ++it; + } + else { + it->second->Destroy(); + it = m_device_items.erase(it); + } + } + m_tip_text->Show(m_device_items.empty()); + m_button_add->Show(m_device_items.empty()); + sizer_machine_list->Layout(); + Layout(); + Fit(); +} + +BBL::PrintParams SendMultiMachinePage::request_params(MachineObject* obj) +{ + BBL::PrintParams params; + + //get all setting + bool bed_leveling = app_config->get("print", "bed_leveling") == "1" ? true : false; + bool flow_cali = app_config->get("print", "flow_cali") == "1" ? true : false; + bool timelapse = app_config->get("print", "timelapse") == "1" ? true : false; + auto use_ams = false; + + AmsRadioSelectorList::Node* node = m_radio_group.GetFirst(); + auto groupid = 0; + + + while (node) { + AmsRadioSelector* rs = node->GetData(); + if (rs->m_param_name == "use_ams" && rs->m_radiobox->GetValue()) { + use_ams = true; + } + + if (rs->m_param_name == "use_extra" && rs->m_radiobox->GetValue()) { + use_ams = false; + } + + node = node->GetNext(); + } + + //use ams + + + PrintPrepareData job_data; + m_plater->get_print_job_data(&job_data); + + if (&job_data) { + std::string temp_file = Slic3r::resources_dir() + "/check_access_code.txt"; + auto check_access_code_path = temp_file.c_str(); + BOOST_LOG_TRIVIAL(trace) << "sned_job: check_access_code_path = " << check_access_code_path; + job_data._temp_path = fs::path(check_access_code_path); + } + + int curr_plate_idx; + if (job_data.plate_idx >= 0) + curr_plate_idx = job_data.plate_idx + 1; + else if (job_data.plate_idx == PLATE_CURRENT_IDX) + curr_plate_idx = m_plater->get_partplate_list().get_curr_plate_index() + 1; + else if (job_data.plate_idx == PLATE_ALL_IDX) + curr_plate_idx = m_plater->get_partplate_list().get_curr_plate_index() + 1; + else + curr_plate_idx = m_plater->get_partplate_list().get_curr_plate_index() + 1; + + params.dev_ip = obj->dev_ip; + params.dev_id = obj->dev_id; + params.dev_name = obj->dev_name; + params.ftp_folder = obj->get_ftp_folder(); + params.connection_type = obj->connection_type(); + params.print_type = "from_normal"; + params.filename = job_data._3mf_path.string(); + params.config_filename = job_data._3mf_config_path.string(); + params.plate_index = curr_plate_idx; + params.task_bed_leveling = bed_leveling; + params.task_flow_cali = flow_cali; + params.task_vibration_cali = false; + params.task_layer_inspect = true; + params.task_record_timelapse = timelapse; + + if (use_ams) { + std::string ams_array; + std::string mapping_info; + get_ams_mapping_result(ams_array, mapping_info); + params.ams_mapping = ams_array; + params.ams_mapping_info = mapping_info; + } + else { + params.ams_mapping = ""; + params.ams_mapping_info = ""; + } + + params.connection_type = obj->connection_type(); + params.task_use_ams = use_ams; + + PartPlate* curr_plate = m_plater->get_partplate_list().get_curr_plate(); + if (curr_plate) { + params.task_bed_type = bed_type_to_gcode_string( curr_plate->get_bed_type(true)); + } + + wxString filename; + if (m_current_project_name.IsEmpty()) { + filename = m_plater->get_export_gcode_filename("", true, m_print_plate_idx == PLATE_ALL_IDX ? true : false); + } + else { + filename = m_current_project_name; + } + + if (m_print_plate_idx == PLATE_ALL_IDX && filename.empty()) { + filename = _L("Untitled"); + } + + if (filename.empty()) { + filename = m_plater->get_export_gcode_filename("", true); + if (filename.empty()) filename = _L("Untitled"); + } + + if (params.preset_name.empty()) { params.preset_name = wxString::Format("%s_plate_%d", filename, m_print_plate_idx).ToStdString(); } + if (params.project_name.empty()) { params.project_name = filename.ToUTF8(); } + + + + // check access code and ip address + if (obj->connection_type() == "lan") { + /*params.dev_id = m_dev_id; + params.project_name = "verify_job"; + params.filename = job_data._temp_path.string(); + params.connection_type = this->connection_type; + + result = m_agent->start_send_gcode_to_sdcard(params, nullptr, nullptr, nullptr); + if (result != 0) { + BOOST_LOG_TRIVIAL(error) << "access code is invalid"; + m_enter_ip_address_fun_fail(); + m_job_finished = true; + return; + } + + params.project_name = ""; + params.filename = "";*/ + } + else { + if (params.dev_ip.empty()) + params.comments = "no_ip"; + else if (obj->is_support_cloud_print_only) + params.comments = "low_version"; + else if (!obj->has_sdcard()) + params.comments = "no_sdcard"; + else if (params.password.empty()) + params.comments = "no_password"; + } + + return params; +} + +bool SendMultiMachinePage::get_ams_mapping_result(std::string& mapping_array_str, std::string& ams_mapping_info) +{ + if (m_ams_mapping_result.empty()) + return false; + + bool valid_mapping_result = true; + int invalid_count = 0; + for (int i = 0; i < m_ams_mapping_result.size(); i++) { + if (m_ams_mapping_result[i].tray_id == -1) { + valid_mapping_result = false; + invalid_count++; + } + } + + if (invalid_count == m_ams_mapping_result.size()) { + return false; + } + else { + json j = json::array(); + json mapping_info_json = json::array(); + + for (int i = 0; i < wxGetApp().preset_bundle->filament_presets.size(); i++) { + int tray_id = -1; + json mapping_item; + mapping_item["ams"] = tray_id; + mapping_item["targetColor"] = ""; + mapping_item["filamentId"] = ""; + mapping_item["filamentType"] = ""; + + for (int k = 0; k < m_ams_mapping_result.size(); k++) { + if (m_ams_mapping_result[k].id == i) { + tray_id = m_ams_mapping_result[k].tray_id; + mapping_item["ams"] = tray_id; + mapping_item["filamentType"] = m_filaments[k].type; + auto it = wxGetApp().preset_bundle->filaments.find_preset(wxGetApp().preset_bundle->filament_presets[i]); + if (it != nullptr) { + mapping_item["filamentId"] = it->filament_id; + } + //convert #RRGGBB to RRGGBBAA + mapping_item["sourceColor"] = m_filaments[k].color; + mapping_item["targetColor"] = m_ams_mapping_result[k].color; + } + } + j.push_back(tray_id); + mapping_info_json.push_back(mapping_item); + } + mapping_array_str = j.dump(); + ams_mapping_info = mapping_info_json.dump(); + return valid_mapping_result; + } + return true; +} + +void SendMultiMachinePage::on_send(wxCommandEvent& event) +{ + event.Skip(); + BOOST_LOG_TRIVIAL(info) << "SendMultiMachinePage: on_send"; + + int result = m_plater->send_gcode(m_print_plate_idx, [this](int export_stage, int current, int total, bool& cancel) { + if (m_is_canceled) return; + bool cancelled = false; + wxString msg = _L("Preparing print job"); + //m_status_bar->update_status(msg, cancelled, 10, true); + //m_export_3mf_cancel = cancel = cancelled; + }); + + if (m_is_canceled || m_export_3mf_cancel) { + BOOST_LOG_TRIVIAL(info) << "print_job: m_export_3mf_cancel or m_is_canceled"; + //m_status_bar->set_status_text(task_canceled_text); + return; + } + + if (result < 0) { + wxString msg = _L("Abnormal print file data. Please slice again"); + //m_status_bar->set_status_text(msg); + return; + } + + // export config 3mf if needed + result = m_plater->export_config_3mf(m_print_plate_idx); + if (result < 0) { + BOOST_LOG_TRIVIAL(trace) << "export_config_3mf failed, result = " << result; + return; + } + + if (m_is_canceled || m_export_3mf_cancel) { + BOOST_LOG_TRIVIAL(info) << "print_job: m_export_3mf_cancel or m_is_canceled"; + //m_status_bar->set_status_text(task_canceled_text); + return; + } + + + std::vector print_params; + + for (auto it = m_device_items.begin(); it != m_device_items.end(); ++it) { + auto obj = it->second->get_obj(); + + if (obj && obj->is_online() && !obj->can_abort() && !obj->is_in_upgrading() && it->second->get_state_selected() == 1 && it->second->state_printable <= 2) { + + if (!it->second->is_blocking_printing(obj)) { + BBL::PrintParams params = request_params(obj); + print_params.push_back(params); + } + } + } + + if (wxGetApp().getTaskManager()) { + TaskSettings settings; + + try + { + if (app_config->get("sending_interval").empty()) { + app_config->set("sending_interval", "1"); + app_config->save(); + } + + if ( app_config->get("max_send").empty()) { + app_config->set("max_send", "10"); + app_config->save(); + } + + + settings.sending_interval = std::stoi(app_config->get("sending_interval")) * 60; + settings.max_sending_at_same_time = std::stoi(app_config->get("max_send")); + wxGetApp().getTaskManager()->start_print(print_params, &settings); + } + catch (...) + {} + } + //jump to info + EndModal(wxCLOSE); + wxGetApp().mainframe->jump_to_multipage(); +} + +bool SendMultiMachinePage::Show(bool show) +{ + if (show) { + refresh_user_device(); + set_default(); + + m_refresh_timer->Stop(); + m_refresh_timer->SetOwner(this); + m_refresh_timer->Start(4000); + wxPostEvent(this, wxTimerEvent()); + } + else { + m_refresh_timer->Stop(); + Slic3r::DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (dev) { + dev->subscribe_device_list(std::vector()); + } + } + return wxDialog::Show(show); +} + +wxBoxSizer* SendMultiMachinePage::create_item_title(wxString title, wxWindow* parent, wxString tooltip) +{ + wxBoxSizer* m_sizer_title = new wxBoxSizer(wxHORIZONTAL); + + auto m_title = new wxStaticText(parent, wxID_ANY, title, wxDefaultPosition, wxDefaultSize, 0); + m_title->SetForegroundColour(DESIGN_GRAY800_COLOR); + m_title->SetFont(::Label::Head_13); + m_title->Wrap(-1); + m_title->SetToolTip(tooltip); + + auto m_line = new wxPanel(parent, wxID_ANY, wxDefaultPosition, wxSize(-1, 1), wxTAB_TRAVERSAL); + m_line->SetBackgroundColour(DESIGN_GRAY400_COLOR); + + m_sizer_title->Add(m_title, 0, wxALIGN_CENTER | wxALL, 3); + m_sizer_title->Add(0, 0, 0, wxLEFT, 9); + wxBoxSizer* sizer_line = new wxBoxSizer(wxVERTICAL); + sizer_line->Add(m_line, 0, wxEXPAND, 0); + m_sizer_title->Add(sizer_line, 1, wxALIGN_CENTER, 0); + + return m_sizer_title; +} + +wxBoxSizer* SendMultiMachinePage::create_item_checkbox(wxString title, wxWindow* parent, wxString tooltip, int padding_left, std::string param) +{ + wxBoxSizer* m_sizer_checkbox = new wxBoxSizer(wxHORIZONTAL); + m_sizer_checkbox->Add(0, 0, 0, wxEXPAND | wxLEFT, 23); + auto checkbox = new ::CheckBox(parent); + + checkbox->SetValue((app_config->get("print", param) == "1") ? true : false); + + m_sizer_checkbox->Add(checkbox, 0, wxALIGN_CENTER, 0); + m_sizer_checkbox->Add(0, 0, 0, wxEXPAND | wxLEFT, 8); + + auto checkbox_title = new wxStaticText(parent, wxID_ANY, title, wxDefaultPosition, wxDefaultSize, 0); + checkbox_title->SetForegroundColour(DESIGN_GRAY900_COLOR); + checkbox_title->SetFont(::Label::Body_13); + + auto size = checkbox_title->GetTextExtent(title); + checkbox_title->SetMinSize(wxSize(size.x + FromDIP(5), -1)); + checkbox_title->Wrap(-1); + m_sizer_checkbox->Add(checkbox_title, 0, wxALIGN_CENTER | wxALL, 3); + + // save + checkbox->Bind(wxEVT_TOGGLEBUTTON, [this, checkbox, param](wxCommandEvent& e) { + app_config->set_str("print", param, checkbox->GetValue() ? std::string("1") : std::string("0")); + app_config->save(); + e.Skip(); + }); + + checkbox->SetToolTip(tooltip); + m_checkbox_map.emplace(param, checkbox); + return m_sizer_checkbox; +} + +wxBoxSizer* SendMultiMachinePage::create_item_input(wxString str_before, wxString str_after, wxWindow* parent, wxString tooltip, std::string param) +{ + wxBoxSizer* sizer_input = new wxBoxSizer(wxHORIZONTAL); + auto input_title = new wxStaticText(parent, wxID_ANY, str_before); + input_title->SetForegroundColour(DESIGN_GRAY900_COLOR); + input_title->SetFont(::Label::Body_13); + input_title->SetToolTip(tooltip); + input_title->Wrap(-1); + + auto input = new ::TextInput(parent, wxEmptyString, wxEmptyString, wxEmptyString, wxDefaultPosition, DESIGN_INPUT_SIZE, wxTE_PROCESS_ENTER); + StateColor input_bg(std::pair(wxColour("#F0F0F1"), StateColor::Disabled), std::pair(*wxWHITE, StateColor::Enabled)); + input->SetBackgroundColor(input_bg); + input->GetTextCtrl()->SetValue(app_config->get(param)); + wxTextValidator validator(wxFILTER_DIGITS); + input->GetTextCtrl()->SetValidator(validator); + + auto second_title = new wxStaticText(parent, wxID_ANY, str_after, wxDefaultPosition, wxDefaultSize, wxST_ELLIPSIZE_END); + second_title->SetForegroundColour(DESIGN_GRAY900_COLOR); + second_title->SetFont(::Label::Body_13); + second_title->SetToolTip(tooltip); + second_title->Wrap(-1); + + sizer_input->Add(0, 0, 0, wxEXPAND | wxLEFT, 23); + sizer_input->Add(input_title, 0, wxALIGN_CENTER_VERTICAL | wxALL, 3); + sizer_input->Add(input, 0, wxALIGN_CENTER_VERTICAL, 0); + sizer_input->Add(0, 0, 0, wxEXPAND | wxLEFT, 3); + sizer_input->Add(second_title, 0, wxALIGN_CENTER_VERTICAL | wxALL, 3); + + input->GetTextCtrl()->Bind(wxEVT_TEXT_ENTER, [this, param, input](wxCommandEvent& e) { + auto value = input->GetTextCtrl()->GetValue(); + app_config->set(param, std::string(value.mb_str())); + app_config->save(); + e.Skip(); + }); + + input->GetTextCtrl()->Bind(wxEVT_KILL_FOCUS, [this, param, input](wxFocusEvent& e) { + auto value = input->GetTextCtrl()->GetValue(); + app_config->set(param, std::string(value.mb_str())); + app_config->save(); + e.Skip(); + }); + + m_input_map.emplace(param, input); + return sizer_input; +} + +wxBoxSizer* SendMultiMachinePage::create_item_radiobox(wxString title, wxWindow* parent, wxString tooltip, int groupid, std::string param) +{ + wxBoxSizer* radiobox_sizer = new wxBoxSizer(wxHORIZONTAL); + + RadioBox* radiobox = new RadioBox(parent); + radiobox->SetBackgroundColour(wxColour(248, 248, 248)); + radiobox->Bind(wxEVT_LEFT_DOWN, &SendMultiMachinePage::OnSelectRadio, this); + + AmsRadioSelector* rs = new AmsRadioSelector; + rs->m_groupid = groupid; + rs->m_param_name = param; + rs->m_radiobox = radiobox; + rs->m_selected = false; + m_radio_group.Append(rs); + + wxStaticText* text = new wxStaticText(parent, wxID_ANY, title, wxDefaultPosition, wxDefaultSize); + radiobox_sizer->Add(radiobox, 0, wxLEFT, FromDIP(23)); + radiobox_sizer->Add(text, 0, wxLEFT, FromDIP(10)); + radiobox->SetToolTip(tooltip); + text->SetToolTip(tooltip); + return radiobox_sizer; +} + +void SendMultiMachinePage::OnSelectRadio(wxMouseEvent& event) +{ + AmsRadioSelectorList::Node* node = m_radio_group.GetFirst(); + auto groupid = 0; + + while (node) { + AmsRadioSelector* rs = node->GetData(); + if (rs->m_radiobox->GetId() == event.GetId()) groupid = rs->m_groupid; + node = node->GetNext(); + } + + node = m_radio_group.GetFirst(); + while (node) { + AmsRadioSelector* rs = node->GetData(); + if (rs->m_groupid == groupid && rs->m_radiobox->GetId() == event.GetId()) rs->m_radiobox->SetValue(true); + if (rs->m_groupid == groupid && rs->m_radiobox->GetId() != event.GetId()) rs->m_radiobox->SetValue(false); + node = node->GetNext(); + } +} + +void SendMultiMachinePage::on_select_radio(std::string param) +{ + AmsRadioSelectorList::Node* node = m_radio_group.GetFirst(); + auto groupid = 0; + + while (node) { + AmsRadioSelector* rs = node->GetData(); + if (rs->m_param_name == param) groupid = rs->m_groupid; + node = node->GetNext(); + } + + node = m_radio_group.GetFirst(); + while (node) { + AmsRadioSelector* rs = node->GetData(); + if (rs->m_groupid == groupid && rs->m_param_name == param) rs->m_radiobox->SetValue(true); + if (rs->m_groupid == groupid && rs->m_param_name != param) rs->m_radiobox->SetValue(false); + node = node->GetNext(); + } +} + +bool SendMultiMachinePage::get_value_radio(std::string param) +{ + AmsRadioSelectorList::Node* node = m_radio_group.GetFirst(); + auto groupid = 0; + while (node) { + AmsRadioSelector* rs = node->GetData(); + if (rs->m_groupid == groupid && rs->m_param_name == param) + return rs->m_radiobox->GetValue(); + node = node->GetNext(); + } + return false; +} + +void SendMultiMachinePage::on_set_finish_mapping(wxCommandEvent& evt) +{ + auto selection_data = evt.GetString(); + auto selection_data_arr = wxSplit(selection_data.ToStdString(), '|'); + + BOOST_LOG_TRIVIAL(info) << "The ams mapping selection result: data is " << selection_data; + + if (selection_data_arr.size() == 6) { + auto ams_colour = wxColour(wxAtoi(selection_data_arr[0]), wxAtoi(selection_data_arr[1]), wxAtoi(selection_data_arr[2]), wxAtoi(selection_data_arr[3])); + int old_filament_id = (int)wxAtoi(selection_data_arr[5]); + + int ctype = 0; + std::vector material_cols; + std::vector tray_cols; + for (auto mapping_item : m_mapping_popup->m_mapping_item_list) { + if (mapping_item->m_tray_data.id == evt.GetInt()) { + ctype = mapping_item->m_tray_data.ctype; + material_cols = mapping_item->m_tray_data.material_cols; + for (auto col : mapping_item->m_tray_data.material_cols) { + wxString color = wxString::Format("#%02X%02X%02X%02X", col.Red(), col.Green(), col.Blue(), col.Alpha()); + tray_cols.push_back(color.ToStdString()); + } + break; + } + } + + for (auto i = 0; i < m_ams_mapping_result.size(); i++) { + if (m_ams_mapping_result[i].id == wxAtoi(selection_data_arr[5])) { + m_ams_mapping_result[i].tray_id = evt.GetInt(); + auto ams_colour = wxColour(wxAtoi(selection_data_arr[0]), wxAtoi(selection_data_arr[1]), wxAtoi(selection_data_arr[2]), wxAtoi(selection_data_arr[3])); + wxString color = wxString::Format("#%02X%02X%02X%02X", ams_colour.Red(), ams_colour.Green(), ams_colour.Blue(), ams_colour.Alpha()); + m_ams_mapping_result[i].color = color.ToStdString(); + m_ams_mapping_result[i].ctype = ctype; + m_ams_mapping_result[i].colors = tray_cols; + } + BOOST_LOG_TRIVIAL(trace) << "The ams mapping result: id is " << m_ams_mapping_result[i].id << "tray_id is " << m_ams_mapping_result[i].tray_id; + } + + MaterialHash::iterator iter = m_material_list.begin(); + while (iter != m_material_list.end()) { + Material* item = iter->second; + MaterialItem* m = item->item; + if (item->id == m_current_filament_id) { + auto ams_colour = wxColour(wxAtoi(selection_data_arr[0]), wxAtoi(selection_data_arr[1]), wxAtoi(selection_data_arr[2]), wxAtoi(selection_data_arr[3])); + m->set_ams_info(ams_colour, selection_data_arr[4], ctype, material_cols); + } + iter++; + } + + } +} + +wxPanel* SendMultiMachinePage::create_page() +{ + auto main_page = new wxPanel(m_main_scroll, wxID_ANY, wxDefaultPosition, wxDefaultSize); + main_page->SetBackgroundColour(*wxWHITE); + wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL); + + // add title + m_title_panel = new wxPanel(main_page, wxID_ANY, wxDefaultPosition, wxDefaultSize); + m_title_panel->SetBackgroundColour(*wxWHITE); + m_title_sizer = new wxBoxSizer(wxHORIZONTAL); + + m_rename_switch_panel = new wxSimplebook(m_title_panel); + + m_rename_normal_panel = new wxPanel(m_rename_switch_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); + m_rename_normal_panel->SetBackgroundColour(*wxWHITE); + rename_sizer_v = new wxBoxSizer(wxVERTICAL); + rename_sizer_h = new wxBoxSizer(wxHORIZONTAL); + + m_task_name = new wxStaticText(m_rename_normal_panel, wxID_ANY, wxT("MyLabel"), wxDefaultPosition, wxDefaultSize, wxST_ELLIPSIZE_END); + m_task_name->SetFont(::Label::Body_13); + m_task_name->SetMaxSize(wxSize(FromDIP(390), -1)); + m_rename_button = new ScalableButton(m_rename_normal_panel, wxID_ANY, "ams_editable"); + m_rename_button->SetBackgroundColour(*wxWHITE); + rename_sizer_h->Add(m_task_name, 0, wxALIGN_CENTER, 0); + rename_sizer_h->Add(m_rename_button, 0, wxALIGN_CENTER, 0); + rename_sizer_v->Add(rename_sizer_h, 1, wxALIGN_CENTER, 0); + m_rename_normal_panel->SetSizer(rename_sizer_v); + m_rename_normal_panel->Layout(); + rename_sizer_v->Fit(m_rename_normal_panel); + + //rename edit + m_rename_edit_panel = new wxPanel(m_rename_switch_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); + m_rename_edit_panel->SetBackgroundColour(*wxWHITE); + auto rename_edit_sizer_v = new wxBoxSizer(wxVERTICAL); + + m_rename_input = new ::TextInput(m_rename_edit_panel, wxEmptyString, wxEmptyString, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER); + m_rename_input->GetTextCtrl()->SetFont(::Label::Body_13); + m_rename_input->SetSize(wxSize(FromDIP(220), FromDIP(24))); + m_rename_input->SetMinSize(wxSize(FromDIP(220), FromDIP(24))); + m_rename_input->SetMaxSize(wxSize(FromDIP(220), FromDIP(24))); + m_rename_input->Bind(wxEVT_TEXT_ENTER, [this](auto& e) {on_rename_enter(); }); + m_rename_input->Bind(wxEVT_KILL_FOCUS, [this](auto& e) { + if (!m_rename_input->HasFocus() && !m_task_name->HasFocus()) + on_rename_enter(); + else + e.Skip(); }); + rename_edit_sizer_v->Add(m_rename_input, 1, wxALIGN_CENTER, 0); + + m_rename_edit_panel->SetSizer(rename_edit_sizer_v); + m_rename_edit_panel->Layout(); + rename_edit_sizer_v->Fit(m_rename_edit_panel); + + m_rename_button->Bind(wxEVT_BUTTON, &SendMultiMachinePage::on_rename_click, this); + m_rename_switch_panel->AddPage(m_rename_normal_panel, wxEmptyString, true); + m_rename_switch_panel->AddPage(m_rename_edit_panel, wxEmptyString, false); + Bind(wxEVT_CHAR_HOOK, [this](wxKeyEvent& e) { + if (e.GetKeyCode() == WXK_ESCAPE) { + if (m_rename_switch_panel->GetSelection() == 0) { + e.Skip(); + } + else { + m_rename_switch_panel->SetSelection(0); + m_task_name->SetLabel(m_current_project_name); + m_rename_normal_panel->Layout(); + } + } + else { + e.Skip(); + } + }); + + m_text_sizer = new wxBoxSizer(wxVERTICAL); + m_text_sizer->Add(m_rename_switch_panel, 0, wxALIGN_CENTER_HORIZONTAL, 0); + + m_panel_image = new wxPanel(m_title_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); + m_image_sizer = new wxBoxSizer(wxHORIZONTAL); + m_thumbnail_panel = new ThumbnailPanel(m_panel_image); + m_thumbnail_panel->SetSize(wxSize(THUMBNAIL_SIZE, THUMBNAIL_SIZE)); + m_thumbnail_panel->SetMinSize(wxSize(THUMBNAIL_SIZE, THUMBNAIL_SIZE)); + m_thumbnail_panel->SetMaxSize(wxSize(THUMBNAIL_SIZE, THUMBNAIL_SIZE)); + m_thumbnail_panel->SetBackgroundColour(*wxRED); + m_image_sizer->Add(m_thumbnail_panel, 0, wxALIGN_CENTER, 0); + m_panel_image->SetSizer(m_image_sizer); + m_panel_image->Layout(); + m_title_sizer->Add(m_panel_image, 0, wxLEFT, 0); + + wxBoxSizer* m_sizer_basic = new wxBoxSizer(wxHORIZONTAL); + wxBoxSizer* m_sizer_basic_time = new wxBoxSizer(wxHORIZONTAL); + wxBoxSizer* m_sizer_basic_weight = new wxBoxSizer(wxHORIZONTAL); + + print_time = new ScalableBitmap(m_title_panel, "print-time", 18); + timeimg = new wxStaticBitmap(m_title_panel, wxID_ANY, print_time->bmp(), wxDefaultPosition, wxSize(FromDIP(18), FromDIP(18)), 0); + m_sizer_basic_time->Add(timeimg, 1, wxEXPAND | wxALL, FromDIP(5)); + m_stext_time = new wxStaticText(m_title_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT); + m_sizer_basic_time->Add(m_stext_time, 0, wxALL, FromDIP(5)); + m_sizer_basic->Add(m_sizer_basic_time, 0, wxALIGN_CENTER, 0); + m_sizer_basic->Add(0, 0, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(30)); + + print_weight = new ScalableBitmap(m_title_panel, "print-weight", 18); + weightimg = new wxStaticBitmap(m_title_panel, wxID_ANY, print_weight->bmp(), wxDefaultPosition, wxSize(FromDIP(18), FromDIP(18)), 0); + m_sizer_basic_weight->Add(weightimg, 1, wxEXPAND | wxALL, FromDIP(5)); + m_stext_weight = new wxStaticText(m_title_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT); + m_sizer_basic_weight->Add(m_stext_weight, 0, wxALL, FromDIP(5)); + m_sizer_basic->Add(m_sizer_basic_weight, 0, wxALIGN_CENTER, 0); + + m_text_sizer->Add(m_sizer_basic, wxALIGN_CENTER, 0); + m_title_sizer->Add(m_text_sizer, 0, wxALIGN_CENTER_VERTICAL, 0); + m_title_panel->SetSizer(m_title_sizer); + m_title_panel->Layout(); + sizer->Add(m_title_panel, 0, wxALIGN_CENTER_HORIZONTAL, 0); + + // add filament + wxBoxSizer* title_filament = create_item_title(_L("Filament"), main_page, ""); + wxBoxSizer* radio_sizer = new wxBoxSizer(wxHORIZONTAL); + wxBoxSizer* use_external_sizer = create_item_radiobox(_L("Use External Spool"), main_page, "", 0, "use_external"); + wxBoxSizer* use_ams_sizer = create_item_radiobox(_L("Use AMS"), main_page, "", 0, "use_ams"); + radio_sizer->Add(use_external_sizer, 0, wxLeft, FromDIP(20)); + radio_sizer->Add(use_ams_sizer, 0, wxLeft, FromDIP(5)); + sizer->Add(title_filament, 0, wxEXPAND, 0); + sizer->Add(radio_sizer, 0, wxLEFT, FromDIP(20)); + sizer->AddSpacer(FromDIP(5)); + on_select_radio("use_external"); + + // add ams item + m_ams_list_sizer = new wxGridSizer(0, 4, 0, FromDIP(5)); + //sync_ams_list(); + sizer->Add(m_ams_list_sizer, 0, wxLEFT, FromDIP(25)); + sizer->AddSpacer(FromDIP(10)); + + // select printer + wxBoxSizer* title_select_printer = create_item_title(_L("Select Printers"), main_page, ""); + + // add table head + StateColor head_bg( + std::pair(TABLE_HEAD_PRESSED_COLOUR, StateColor::Pressed), + std::pair(TABLE_HEAR_NORMAL_COLOUR, StateColor::Normal) + ); + + m_table_head_panel = new wxPanel(main_page, wxID_ANY, wxDefaultPosition, wxDefaultSize); + m_table_head_panel->SetMinSize(wxSize(FromDIP(DEVICE_ITEM_MAX_WIDTH), -1)); + m_table_head_panel->SetMaxSize(wxSize(FromDIP(DEVICE_ITEM_MAX_WIDTH), -1)); + m_table_head_panel->SetBackgroundColour(TABLE_HEAR_NORMAL_COLOUR); + m_table_head_sizer = new wxBoxSizer(wxHORIZONTAL); + + m_select_checkbox = new CheckBox(m_table_head_panel, wxID_ANY); + m_table_head_sizer->AddSpacer(FromDIP(SEND_LEFT_PADDING_LEFT)); + m_table_head_sizer->Add(m_select_checkbox, 0, wxALIGN_CENTER_VERTICAL, 0); + + m_select_checkbox->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent& e) { + if (m_select_checkbox->GetValue()) { + for (auto it = m_device_items.begin(); it != m_device_items.end(); it++) { + + if (it->second->state_printable <= 2) { + it->second->selected(); + } + } + } + else { + for (auto it = m_device_items.begin(); it != m_device_items.end(); it++) { + it->second->unselected(); + } + } + Refresh(false); + e.Skip(); + }); + + m_printer_name = new Button(m_table_head_panel, _L("Device Name"), "toolbar_double_directional_arrow", wxNO_BORDER, ICON_SIZE); + m_printer_name->SetBackgroundColor(head_bg); + m_printer_name->SetCornerRadius(0); + m_printer_name->SetFont(TABLE_HEAD_FONT); + m_printer_name->SetMinSize(wxSize(FromDIP(SEND_LEFT_DEV_NAME), FromDIP(SEND_ITEM_MAX_HEIGHT))); + m_printer_name->SetMaxSize(wxSize(FromDIP(SEND_LEFT_DEV_NAME), FromDIP(SEND_ITEM_MAX_HEIGHT))); + m_printer_name->SetCenter(false); + m_printer_name->Bind(wxEVT_ENTER_WINDOW, [&](wxMouseEvent& evt) { + SetCursor(wxCURSOR_HAND); + }); + m_printer_name->Bind(wxEVT_LEAVE_WINDOW, [&](wxMouseEvent& evt) { + SetCursor(wxCURSOR_ARROW); + }); + m_printer_name->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& evt) { + device_name_big = !device_name_big; + this->m_sort.set_role(SortItem::SortRule::SR_DEV_NAME, device_name_big); + this->refresh_user_device(); + }); + + m_table_head_sizer->Add( 0, 0, 0, wxLEFT, FromDIP(10) ); + m_table_head_sizer->Add(m_printer_name, 0, wxALIGN_CENTER_VERTICAL, 0); + + m_device_status = new Button(m_table_head_panel, _L("Device Status"), "toolbar_double_directional_arrow", wxNO_BORDER, ICON_SIZE); + m_device_status->SetBackgroundColor(head_bg); + m_device_status->SetFont(TABLE_HEAD_FONT); + m_device_status->SetCornerRadius(0); + m_device_status->SetMinSize(wxSize(FromDIP(SEND_LEFT_DEV_STATUS), FromDIP(SEND_ITEM_MAX_HEIGHT))); + m_device_status->SetMaxSize(wxSize(FromDIP(SEND_LEFT_DEV_STATUS), FromDIP(SEND_ITEM_MAX_HEIGHT))); + m_device_status->SetCenter(false); + m_device_status->Bind(wxEVT_ENTER_WINDOW, [&](wxMouseEvent& evt) { + SetCursor(wxCURSOR_HAND); + }); + m_device_status->Bind(wxEVT_LEAVE_WINDOW, [&](wxMouseEvent& evt) { + SetCursor(wxCURSOR_ARROW); + }); + m_device_status->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& evt) { + device_printable_big = !device_printable_big; + this->m_sort.set_role(SortItem::SortRule::SR_PRINTABLE, device_printable_big); + this->refresh_user_device(); + evt.Skip(); + }); + m_table_head_sizer->Add(m_device_status, 0, wxALIGN_CENTER_VERTICAL, 0); + + /*m_task_status = new Button(m_table_head_panel, _L("Task Status"), "toolbar_double_directional_arrow", wxNO_BORDER, ICON_SIZE); + m_task_status->SetBackgroundColor(head_bg); + m_task_status->SetFont(TABLE_HEAD_FONT); + m_task_status->SetCornerRadius(0); + m_task_status->SetMinSize(wxSize(FromDIP(SEND_LEFT_DEV_STATUS), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_task_status->SetMaxSize(wxSize(FromDIP(SEND_LEFT_DEV_STATUS), FromDIP(DEVICE_ITEM_MAX_HEIGHT))); + m_task_status->SetCenter(false); + m_task_status->Bind(wxEVT_ENTER_WINDOW, [&](wxMouseEvent& evt) { + SetCursor(wxCURSOR_HAND); + }); + m_task_status->Bind(wxEVT_LEAVE_WINDOW, [&](wxMouseEvent& evt) { + SetCursor(wxCURSOR_ARROW); + }); + m_task_status->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& evt) { + device_printable_big = !device_printable_big; + this->m_sort.set_role(SortItem::SortRule::SR_PRINTABLE, device_printable_big); + this->refresh_user_device(); + evt.Skip(); + });*/ + + //m_table_head_sizer->Add(m_task_status, 0, wxALIGN_CENTER_VERTICAL, 0); + + m_ams = new Button(m_table_head_panel, _L("Ams Status"), "toolbar_double_directional_arrow", wxNO_BORDER, ICON_SIZE, false); + m_ams->SetBackgroundColor(head_bg); + m_ams->SetCornerRadius(0); + m_ams->SetFont(TABLE_HEAD_FONT); + m_ams->SetMinSize(wxSize(FromDIP(TASK_LEFT_SEND_TIME), FromDIP(SEND_ITEM_MAX_HEIGHT))); + m_ams->SetMaxSize(wxSize(FromDIP(TASK_LEFT_SEND_TIME), FromDIP(SEND_ITEM_MAX_HEIGHT))); + m_ams->SetCenter(false); + m_ams->Bind(wxEVT_ENTER_WINDOW, [&](wxMouseEvent& evt) { + SetCursor(wxCURSOR_HAND); + }); + m_ams->Bind(wxEVT_LEAVE_WINDOW, [&](wxMouseEvent& evt) { + SetCursor(wxCURSOR_ARROW); + }); + m_ams->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& evt) { + device_en_ams_big = !device_en_ams_big; + this->m_sort.set_role(SortItem::SortRule::SR_EN_AMS, device_en_ams_big); + this->refresh_user_device(); + evt.Skip(); + }); + m_table_head_sizer->Add(m_ams, 0, wxALIGN_CENTER_VERTICAL, 0); + + m_refresh_button = new Button(m_table_head_panel, "", "mall_control_refresh", wxNO_BORDER, ICON_SIZE, false); + m_refresh_button->SetBackgroundColor(head_bg); + m_refresh_button->SetCornerRadius(0); + m_refresh_button->SetFont(TABLE_HEAD_FONT); + m_refresh_button->SetMinSize(wxSize(FromDIP(50), FromDIP(SEND_ITEM_MAX_HEIGHT))); + m_refresh_button->SetMaxSize(wxSize(FromDIP(50), FromDIP(SEND_ITEM_MAX_HEIGHT))); + m_refresh_button->Bind(wxEVT_ENTER_WINDOW, [&](wxMouseEvent& evt) { + SetCursor(wxCURSOR_HAND); + }); + m_refresh_button->Bind(wxEVT_LEAVE_WINDOW, [&](wxMouseEvent& evt) { + SetCursor(wxCURSOR_ARROW); + }); + m_refresh_button->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& evt) { + this->refresh_user_device(); + evt.Skip(); + }); + m_table_head_sizer->Add(m_refresh_button, 0, wxALIGN_CENTER_VERTICAL, 0); + + m_table_head_panel->SetSizer(m_table_head_sizer); + m_table_head_panel->Layout(); + + m_tip_text = new wxStaticText(main_page, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER); + m_tip_text->SetMinSize(wxSize(FromDIP(DEVICE_ITEM_MAX_WIDTH), -1)); + m_tip_text->SetMaxSize(wxSize(FromDIP(DEVICE_ITEM_MAX_WIDTH), -1)); + m_tip_text->SetLabel(_L("Please select the devices you would like to manage here (up to 6 devices)")); + m_tip_text->SetForegroundColour(DESIGN_GRAY800_COLOR); + m_tip_text->SetFont(::Label::Head_20); + m_tip_text->Wrap(-1); + + auto m_btn_bg_enable = StateColor( + std::pair(wxColour(0, 137, 123), StateColor::Pressed), + std::pair(wxColour(38, 166, 154), StateColor::Hovered), + std::pair(wxColour(0, 150, 136), StateColor::Normal) + ); + + m_button_add = new Button(main_page, _L("Add")); + m_button_add->SetBackgroundColor(m_btn_bg_enable); + m_button_add->SetBorderColor(m_btn_bg_enable); + m_button_add->SetTextColor(*wxWHITE); + m_button_add->SetFont(Label::Body_12); + m_button_add->SetCornerRadius(6); + m_button_add->SetMinSize(wxSize(FromDIP(90), FromDIP(36))); + m_button_add->SetMaxSize(wxSize(FromDIP(90), FromDIP(36))); + + m_button_add->Bind(wxEVT_BUTTON, [this](wxCommandEvent& evt) { + MultiMachinePickPage dlg; + dlg.ShowModal(); + refresh_user_device(); + evt.Skip(); + }); + + scroll_macine_list = new wxScrolledWindow(main_page, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(800), FromDIP(300)), wxHSCROLL | wxVSCROLL); + scroll_macine_list->SetBackgroundColour(*wxWHITE); + scroll_macine_list->SetScrollRate(5, 5); + scroll_macine_list->SetMinSize(wxSize(FromDIP(DEVICE_ITEM_MAX_WIDTH), 10 * FromDIP(SEND_ITEM_MAX_HEIGHT))); + scroll_macine_list->SetMaxSize(wxSize(FromDIP(DEVICE_ITEM_MAX_WIDTH), 10 * FromDIP(SEND_ITEM_MAX_HEIGHT))); + + sizer_machine_list = new wxBoxSizer(wxVERTICAL); + scroll_macine_list->SetSizer(sizer_machine_list); + scroll_macine_list->Layout(); + + sizer->Add(title_select_printer, 0, wxEXPAND, 0); + sizer->Add(m_table_head_panel, 0, wxALIGN_CENTER | wxLEFT | wxRIGHT, FromDIP(40)); + sizer->Add(m_tip_text, 0, wxALIGN_CENTER_HORIZONTAL | wxTOP, FromDIP(100)); + sizer->Add(m_button_add, 0, wxALIGN_CENTER_HORIZONTAL | wxTOP, FromDIP(20)); + sizer->Add(scroll_macine_list, 0, wxALIGN_CENTER | wxLEFT | wxRIGHT, FromDIP(40)); + sizer->AddSpacer(FromDIP(10)); + + // add printing options + wxBoxSizer* title_print_option = create_item_title(_L("Printing Options"), main_page, ""); + wxBoxSizer* item_bed_level = create_item_checkbox(_("Bed Leveling"), main_page, "", 50, "bed_leveling"); + wxBoxSizer* item_timelapse = create_item_checkbox(_("Timelapse"), main_page, "", 50, "timelapse"); + wxBoxSizer* item_flow_dy_ca = create_item_checkbox(_("Flow Dynamic Calibration"), main_page, "", 50, "flow_cali"); + sizer->Add(title_print_option, 0, wxEXPAND, 0); + wxBoxSizer* options_sizer_v = new wxBoxSizer(wxHORIZONTAL); + options_sizer_v->Add(item_bed_level, 0, wxLEFT, 0); + options_sizer_v->Add(item_timelapse, 0, wxLEFT, FromDIP(100)); + sizer->Add(options_sizer_v, 0, wxLEFT, FromDIP(20)); + sizer->Add(item_flow_dy_ca, 0, wxLEFT, FromDIP(20)); + sizer->AddSpacer(FromDIP(10)); + + // add send option + wxBoxSizer* title_send_option = create_item_title(_L("Send Options"), main_page, ""); + wxBoxSizer* max_printer_send = create_item_input(_L("Send"), _L("printers at the same time.(It depends on how many devices can undergo heating at the same time.)"), main_page, "", "max_send"); + wxBoxSizer* delay_time = create_item_input(_L("Wait"), _L("minute each batch.(It depends on how long it takes to complete the heating.)"), main_page, "", "sending_interval"); + sizer->Add(title_send_option, 0, wxEXPAND, 0); + sizer->Add(max_printer_send, 0, wxLEFT, FromDIP(20)); + sizer->AddSpacer(FromDIP(3)); + sizer->Add(delay_time, 0, wxLEFT, FromDIP(20)); + sizer->AddSpacer(FromDIP(10)); + + // add send button + btn_bg_enable = StateColor(std::pair(wxColour(0, 137, 123), StateColor::Pressed), std::pair(wxColour(38, 166, 154), StateColor::Hovered), + std::pair(wxColour(0, 150, 136), StateColor::Normal)); + + m_button_send = new Button(main_page, _L("Send")); + m_button_send->SetBackgroundColor(btn_bg_enable); + m_button_send->SetBorderColor(btn_bg_enable); + m_button_send->SetTextColor(StateColor::darkModeColorFor("#FFFFFE")); + m_button_send->SetSize(wxSize(FromDIP(120), FromDIP(40))); + m_button_send->SetMinSize(wxSize(FromDIP(120), FromDIP(40))); + m_button_send->SetMinSize(wxSize(FromDIP(120), FromDIP(40))); + m_button_send->SetCornerRadius(FromDIP(5)); + m_button_send->Bind(wxEVT_BUTTON, &SendMultiMachinePage::on_send, this); + //m_button_send->Disable(); + //m_button_send->SetBackgroundColor(wxColour(0x90, 0x90, 0x90)); + //m_button_send->SetBorderColor(wxColour(0x90, 0x90, 0x90)); + sizer->Add(m_button_send, 0, wxALIGN_CENTER, 0); + + main_page->SetSizer(sizer); + main_page->Layout(); + main_page->Fit(); + return main_page; +} + +void SendMultiMachinePage::sync_ams_list() +{ + // for black list + std::vector materials; + std::vector brands; + std::vector display_materials; + std::vector m_filaments_id; + auto preset_bundle = wxGetApp().preset_bundle; + + for (auto filament_name : preset_bundle->filament_presets) { + for (int f_index = 0; f_index < preset_bundle->filaments.size(); f_index++) { + PresetCollection* filament_presets = &wxGetApp().preset_bundle->filaments; + Preset* preset = &filament_presets->preset(f_index); + + if (preset && filament_name.compare(preset->name) == 0) { + std::string display_filament_type; + std::string filament_type = preset->config.get_filament_type(display_filament_type); + std::string m_filament_id = preset->filament_id; + display_materials.push_back(display_filament_type); + materials.push_back(filament_type); + m_filaments_id.push_back(m_filament_id); + + std::string m_vendor_name = ""; + auto vendor = dynamic_cast(preset->config.option("filament_vendor")); + if (vendor && (vendor->values.size() > 0)) { + std::string vendor_name = vendor->values[0]; + m_vendor_name = vendor_name; + } + brands.push_back(m_vendor_name); + } + } + } + + auto extruders = wxGetApp().plater()->get_partplate_list().get_curr_plate()->get_used_extruders(); + BitmapCache bmcache; + MaterialHash::iterator iter = m_material_list.begin(); + while (iter != m_material_list.end()) { + int id = iter->first; + Material* item = iter->second; + item->item->Destroy(); + delete item; + iter++; + } + + m_ams_list_sizer->Clear(); + m_material_list.clear(); + m_filaments.clear(); + m_ams_mapping_result.clear(); + + for (auto i = 0; i < extruders.size(); i++) { + auto extruder = extruders[i] - 1; + auto colour = wxGetApp().preset_bundle->project_config.opt_string("filament_colour", (unsigned int)extruder); + unsigned char rgb[4]; + bmcache.parse_color4(colour, rgb); + + auto colour_rgb = wxColour((int)rgb[0], (int)rgb[1], (int)rgb[2], (int)rgb[3]); + if (extruder >= materials.size() || extruder < 0 || extruder >= display_materials.size()) continue; + + MaterialItem* item = new MaterialItem(m_main_page, colour_rgb, _L(display_materials[extruder])); + item->set_ams_info(wxColour("#CECECE"), "A1", 0, std::vector()); + m_ams_list_sizer->Add(item, 0, wxALL, FromDIP(4)); + + item->Bind(wxEVT_LEFT_UP, [this, item, materials, extruder](wxMouseEvent& e) {}); + item->Bind(wxEVT_LEFT_DOWN, [this, item, materials, extruder](wxMouseEvent& e) { + MaterialHash::iterator iter = m_material_list.begin(); + while (iter != m_material_list.end()) { + int id = iter->first; + Material* item = iter->second; + MaterialItem* m = item->item; + m->on_normal(); + iter++; + } + + m_current_filament_id = extruder; + item->on_selected(); + + auto mouse_pos = ClientToScreen(e.GetPosition()); + wxPoint rect = item->ClientToScreen(wxPoint(0, 0)); + + // update ams data + if (get_value_radio("use_ams")) { + if (m_mapping_popup->IsShown()) return; + wxPoint pos = item->ClientToScreen(wxPoint(0, 0)); + pos.y += item->GetRect().height; + m_mapping_popup->Move(pos); + m_mapping_popup->set_parent_item(item); + m_mapping_popup->set_current_filament_id(extruder); + m_mapping_popup->set_tag_texture(materials[extruder]); + m_mapping_popup->update_ams_data_multi_machines(); + m_mapping_popup->Popup(); + } + }); + + Material* material_item = new Material(); + material_item->id = extruder; + material_item->item = item; + m_material_list[i] = material_item; + + // build for ams mapping + if (extruder < materials.size() && extruder >= 0) { + FilamentInfo info; + info.id = extruder; + info.tray_id = 0; + info.type = materials[extruder]; + info.brand = brands[extruder]; + info.filament_id = m_filaments_id[extruder]; + //info.color = wxString::Format("#%02X%02X%02X%02X", colour_rgb.Red(), colour_rgb.Green(), colour_rgb.Blue(), colour_rgb.Alpha()).ToStdString(); + info.color = "#CECECEFF"; + m_filaments.push_back(info); + m_ams_mapping_result.push_back(info); + } + } + + if (extruders.size() <= 8) { + m_ams_list_sizer->SetCols(extruders.size()); + } + else { + m_ams_list_sizer->SetCols(8); + } +} + +void SendMultiMachinePage::set_default_normal(const ThumbnailData& data) +{ + if (data.is_valid()) { + wxImage image(data.width, data.height); + image.InitAlpha(); + for (unsigned int r = 0; r < data.height; ++r) { + unsigned int rr = (data.height - 1 - r) * data.width; + for (unsigned int c = 0; c < data.width; ++c) { + unsigned char* px = (unsigned char*)data.pixels.data() + 4 * (rr + c); + image.SetRGB((int)c, (int)r, px[0], px[1], px[2]); + image.SetAlpha((int)c, (int)r, px[3]); + } + } + image = image.Rescale(THUMBNAIL_SIZE, THUMBNAIL_SIZE); + m_thumbnail_panel->set_thumbnail(image); + } + + m_main_scroll->Layout(); + m_main_scroll->Fit(); + + // basic info + auto aprint_stats = m_plater->get_partplate_list().get_current_fff_print().print_statistics(); + wxString time; + PartPlate* plate = m_plater->get_partplate_list().get_curr_plate(); + if (plate) { + if (plate->get_slice_result()) { time = wxString::Format("%s", short_time(get_time_dhms(plate->get_slice_result()->print_statistics.modes[0].time))); } + } + + char weight[64]; + if (wxGetApp().app_config->get("use_inches") == "1") { + ::sprintf(weight, " %.2f oz", aprint_stats.total_weight * 0.035274); + } + else { + ::sprintf(weight, " %.2f g", aprint_stats.total_weight); + } + + m_stext_time->SetLabel(time); + m_stext_weight->SetLabel(weight); +} + +void SendMultiMachinePage::set_default() +{ + wxString filename = m_plater->get_export_gcode_filename("", true, m_print_plate_idx == PLATE_ALL_IDX ? true : false); + if (m_print_plate_idx == PLATE_ALL_IDX && filename.empty()) { + filename = _L("Untitled"); + } + + if (filename.empty()) { + filename = m_plater->get_export_gcode_filename("", true); + if (filename.empty()) filename = _L("Untitled"); + } + + fs::path filename_path(filename.c_str()); + std::string file_name = filename_path.filename().string(); + if (from_u8(file_name).find(_L("Untitled")) != wxString::npos) { + PartPlate* part_plate = m_plater->get_partplate_list().get_plate(m_print_plate_idx); + if (part_plate) { + if (std::vector objects = part_plate->get_objects_on_this_plate(); objects.size() > 0) { + file_name = objects[0]->name; + for (int i = 1; i < objects.size(); i++) { + file_name += (" + " + objects[i]->name); + } + } + if (file_name.size() > 100) { + file_name = file_name.substr(0, 97) + "..."; + } + } + } + + m_current_project_name = wxString::FromUTF8(file_name); + //unsupported character filter + m_current_project_name = from_u8(filter_characters(m_current_project_name.ToUTF8().data(), "<>[]:/\\|?*\"")); + + m_task_name->SetLabel(m_current_project_name); + + sync_ams_list(); + set_default_normal(m_plater->get_partplate_list().get_curr_plate()->thumbnail_data); +} + +void SendMultiMachinePage::on_rename_enter() +{ + if (m_is_rename_mode == false) { + return; + } + else { + m_is_rename_mode = false; + } + + auto new_file_name = m_rename_input->GetTextCtrl()->GetValue(); + wxString temp; + int num = 0; + for (auto t : new_file_name) { + if (t == wxString::FromUTF8("\x20")) { + num++; + if (num == 1) temp += t; + } + else { + num = 0; + temp += t; + } + } + new_file_name = temp; + auto m_valid_type = Valid; + wxString info_line; + + const char* unusable_symbols = "<>[]:/\\|?*\""; + + const std::string unusable_suffix = PresetCollection::get_suffix_modified(); //"(modified)"; + for (size_t i = 0; i < std::strlen(unusable_symbols); i++) { + if (new_file_name.find_first_of(unusable_symbols[i]) != std::string::npos) { + info_line = _L("Name is invalid;") + "\n" + _L("illegal characters:") + " " + unusable_symbols; + m_valid_type = NoValid; + break; + } + } + + if (m_valid_type == Valid && new_file_name.find(unusable_suffix) != std::string::npos) { + info_line = _L("Name is invalid;") + "\n" + _L("illegal suffix:") + "\n\t" + from_u8(PresetCollection::get_suffix_modified()); + m_valid_type = NoValid; + } + + if (m_valid_type == Valid && new_file_name.empty()) { + info_line = _L("The name is not allowed to be empty."); + m_valid_type = NoValid; + } + + if (m_valid_type == Valid && new_file_name.find_first_of(' ') == 0) { + info_line = _L("The name is not allowed to start with space character."); + m_valid_type = NoValid; + } + + if (m_valid_type == Valid && new_file_name.find_last_of(' ') == new_file_name.length() - 1) { + info_line = _L("The name is not allowed to end with space character."); + m_valid_type = NoValid; + } + + if (m_valid_type == Valid && new_file_name.size() >= 100) { + info_line = _L("The name length exceeds the limit."); + m_valid_type = NoValid; + } + + if (m_valid_type != Valid) { + MessageDialog msg_wingow(nullptr, info_line, "", wxICON_WARNING | wxOK); + if (msg_wingow.ShowModal() == wxID_OK) { + m_rename_switch_panel->SetSelection(0); + m_task_name->SetLabel(m_current_project_name); + m_rename_normal_panel->Layout(); + return; + } + } + + m_current_project_name = new_file_name; + m_rename_switch_panel->SetSelection(0); + m_task_name->SetLabelText(m_current_project_name); + m_rename_normal_panel->Layout(); +} + +void SendMultiMachinePage::check_fcous_state(wxWindow* window) +{ + check_focus(window); + auto children = window->GetChildren(); + for (auto child : children) { + check_fcous_state(child); + } +} + +void SendMultiMachinePage::check_focus(wxWindow* window) +{ + if (window == m_rename_input || window == m_rename_input->GetTextCtrl()) { + on_rename_enter(); + } +} + +void SendMultiMachinePage::on_rename_click(wxCommandEvent& event) +{ + m_is_rename_mode = true; + m_rename_input->GetTextCtrl()->SetValue(m_current_project_name); + m_rename_switch_panel->SetSelection(1); + m_rename_input->GetTextCtrl()->SetFocus(); + m_rename_input->GetTextCtrl()->SetInsertionPointEnd(); +} + +void SendMultiMachinePage::init_timer() +{ + m_refresh_timer = new wxTimer(); +} + +void SendMultiMachinePage::on_timer(wxTimerEvent& event) +{ + for (auto it = m_device_items.begin(); it != m_device_items.end(); it++) { + it->second->sync_state(); + it->second->Refresh(); + } +} + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/SendMultiMachinePage.hpp b/src/slic3r/GUI/SendMultiMachinePage.hpp new file mode 100644 index 0000000000..418f8cfa09 --- /dev/null +++ b/src/slic3r/GUI/SendMultiMachinePage.hpp @@ -0,0 +1,210 @@ +#ifndef slic3r_SendMultiMachinePage_hpp_ +#define slic3r_SendMultiMachinePage_hpp_ + +#include "GUI_Utils.hpp" +#include "MultiMachine.hpp" +#include "DeviceManager.hpp" +#include "Widgets/Label.hpp" +#include "Widgets/Button.hpp" +#include "Widgets/CheckBox.hpp" +#include "Widgets/ComboBox.hpp" +#include "Widgets/ScrolledWindow.hpp" +#include "Widgets/PopupWindow.hpp" +#include "Widgets/TextInput.hpp" +#include "AmsMappingPopup.hpp" +#include "SelectMachine.hpp" + +namespace Slic3r { +namespace GUI { +#define SEND_LEFT_PADDING_LEFT 15 +#define SEND_LEFT_PRINTABLE 40 +#define SEND_LEFT_DEV_NAME 250 +#define SEND_LEFT_DEV_STATUS 250 +#define SEND_LEFT_TAKS_STATUS 180 + +#define DESIGN_SELECTOR_NOMORE_COLOR wxColour(248, 248, 248) +#define DESIGN_GRAY900_COLOR wxColour(38, 46, 48) +#define DESIGN_GRAY800_COLOR wxColour(50, 58, 61) +#define DESIGN_GRAY600_COLOR wxColour(144, 144, 144) +#define DESIGN_GRAY400_COLOR wxColour(166, 169, 170) +#define DESIGN_RESOUTION_PREFERENCES wxSize(FromDIP(540), -1) +#define DESIGN_COMBOBOX_SIZE wxSize(FromDIP(140), -1) +#define DESIGN_LARGE_COMBOBOX_SIZE wxSize(FromDIP(160), -1) +#define DESIGN_INPUT_SIZE wxSize(FromDIP(50), -1) + +#define MATERIAL_ITEM_SIZE wxSize(FromDIP(64), FromDIP(34)) +#define MATERIAL_ITEM_REAL_SIZE wxSize(FromDIP(62), FromDIP(32)) +#define MAPPING_ITEM_REAL_SIZE wxSize(FromDIP(48), FromDIP(45)) + +#define THUMBNAIL_SIZE FromDIP(128) + +class RadioBox; +class AmsRadioSelector +{ +public: + wxString m_param_name; + int m_groupid; + RadioBox* m_radiobox; + bool m_selected = false; +}; + +WX_DECLARE_LIST(AmsRadioSelector, AmsRadioSelectorList); + +class SendDeviceItem : public DeviceItem +{ + +public: + SendDeviceItem(wxWindow* parent, MachineObject* obj); + ~SendDeviceItem() {}; + + void DrawTextWithEllipsis(wxDC& dc, const wxString& text, int maxWidth, int left, int top = 0); + void OnEnterWindow(wxMouseEvent& evt); + void OnLeaveWindow(wxMouseEvent& evt); + void OnSelectedDevice(wxCommandEvent& evt); + void OnLeftDown(wxMouseEvent& evt); + void OnMove(wxMouseEvent& evt); + + void paintEvent(wxPaintEvent& evt); + void render(wxDC& dc); + void doRender(wxDC& dc); + void post_event(wxCommandEvent&& event); + virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO); + +public: + bool m_hover{false}; + ScalableBitmap m_bitmap_check_disable; + ScalableBitmap m_bitmap_check_off; + ScalableBitmap m_bitmap_check_on; +}; + +class Plater; +class SendMultiMachinePage : public DPIDialog +{ +private: + /* dev_id -> device_item */ + std::map m_device_items; + + wxTimer* m_refresh_timer = nullptr; + + // sort + SortItem m_sort; + bool device_name_big{ true }; + bool device_printable_big{ true }; + bool device_en_ams_big{ true }; + + Button* m_button_send{ nullptr }; + wxScrolledWindow* scroll_macine_list{ nullptr }; + wxBoxSizer* sizer_machine_list{ nullptr }; + Plater* m_plater{ nullptr }; + + int m_print_plate_idx; + bool m_is_canceled{ false }; + bool m_export_3mf_cancel{ false }; + AppConfig* app_config; + + wxPanel* m_main_page{ nullptr }; + wxScrolledWindow* m_main_scroll{ nullptr }; + wxBoxSizer* m_sizer_body{ nullptr }; + wxGridSizer* m_ams_list_sizer{ nullptr }; + AmsMapingPopup* m_mapping_popup{ nullptr }; + + AmsRadioSelectorList m_radio_group; + MaterialHash m_material_list; + std::map m_checkbox_map; + std::map m_input_map; + std::vector m_filaments; + std::vector m_ams_mapping_result; + int m_current_filament_id{ 0 }; + + StateColor btn_bg_enable; + + // table head + wxPanel* m_table_head_panel{ nullptr }; + wxBoxSizer* m_table_head_sizer{ nullptr }; + CheckBox* m_select_checkbox{ nullptr }; + Button* m_printer_name{ nullptr }; + Button* m_device_status{ nullptr }; + //Button* m_task_status{ nullptr }; + Button* m_ams{ nullptr }; + Button* m_refresh_button{ nullptr }; + + // rename + wxSimplebook* m_rename_switch_panel{ nullptr }; + wxPanel* m_rename_normal_panel{ nullptr }; + wxPanel* m_rename_edit_panel{ nullptr }; + TextInput* m_rename_input{ nullptr }; + ScalableButton* m_rename_button{ nullptr }; + wxBoxSizer* rename_sizer_v{ nullptr }; + wxBoxSizer* rename_sizer_h{ nullptr }; + wxStaticText* m_task_name{ nullptr }; + wxString m_current_project_name; + bool m_is_rename_mode{ false }; + + // title and thumbnail + wxPanel* m_title_panel{ nullptr }; + wxBoxSizer* m_title_sizer{ nullptr }; + wxBoxSizer* m_text_sizer{ nullptr }; + ScalableBitmap* m_print_time{ nullptr }; + wxStaticBitmap* m_time_img{ nullptr }; + wxStaticText* m_stext_time{ nullptr }; + wxStaticText* m_stext_weight{ nullptr }; + wxStaticBitmap* timeimg{ nullptr }; + ScalableBitmap* print_time{ nullptr }; + wxStaticBitmap* weightimg{ nullptr }; + ScalableBitmap* print_weight{ nullptr }; + wxBoxSizer* m_thumbnail_sizer{ nullptr }; + ThumbnailPanel* m_thumbnail_panel{nullptr}; + wxPanel* m_panel_image{ nullptr }; + wxBoxSizer* m_image_sizer{ nullptr }; + + // tip when no device + wxStaticText* m_tip_text{ nullptr }; + Button* m_button_add{ nullptr }; + +public: + SendMultiMachinePage(Plater* plater = nullptr); + ~SendMultiMachinePage(); + + void prepare(int plate_idx); + + void on_dpi_changed(const wxRect& suggested_rect); + void on_sys_color_changed(); + void refresh_user_device(); + void on_send(wxCommandEvent& event); + bool Show(bool show); + + BBL::PrintParams request_params(MachineObject* obj); + + bool get_ams_mapping_result(std::string& mapping_array_str, std::string& ams_mapping_info); + wxBoxSizer* create_item_title(wxString title, wxWindow* parent, wxString tooltip); + wxBoxSizer* create_item_checkbox(wxString title, wxWindow* parent, wxString tooltip, int padding_left, std::string param); + wxBoxSizer* create_item_input(wxString str_before, wxString str_after, wxWindow* parent, wxString tooltip, std::string param); + wxBoxSizer* create_item_radiobox(wxString title, wxWindow* parent, wxString tooltip, int groupid, std::string param); + + wxPanel* create_page(); + void sync_ams_list(); + void set_default_normal(const ThumbnailData& data); + void set_default(); + void on_rename_enter(); + void check_fcous_state(wxWindow* window); + void check_focus(wxWindow* window); + +protected: + void OnSelectRadio(wxMouseEvent& event); + void on_select_radio(std::string param); + bool get_value_radio(std::string param); + void on_set_finish_mapping(wxCommandEvent& evt); + void on_rename_click(wxCommandEvent& event); + + void on_timer(wxTimerEvent& event); + void init_timer(); + +private: + +}; + + +} // namespace GUI +} // namespace Slic3r + +#endif diff --git a/src/slic3r/GUI/StatusPanel.cpp b/src/slic3r/GUI/StatusPanel.cpp index 6c55a27b4f..80fe7199a7 100644 --- a/src/slic3r/GUI/StatusPanel.cpp +++ b/src/slic3r/GUI/StatusPanel.cpp @@ -84,7 +84,8 @@ static std::vector message_containing_retry{ "07FF 8011", "07FF 8012", "07FF 8013", - "12FF 8007" + "12FF 8007", + "1200 8006" }; static std::vector message_containing_done{ @@ -1779,6 +1780,14 @@ StatusPanel::StatusPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, co Bind(EVT_FAN_CHANGED, &StatusPanel::on_fan_changed, this); Bind(EVT_SECONDARY_CHECK_DONE, &StatusPanel::on_print_error_done, this); Bind(EVT_SECONDARY_CHECK_RESUME, &StatusPanel::on_subtask_pause_resume, this); + Bind(EVT_PRINT_ERROR_STOP, &StatusPanel::on_subtask_abort, this); + Bind(EVT_LOAD_VAMS_TRAY, &StatusPanel::on_ams_load_vams, this); + Bind(EVT_JUMP_TO_LIVEVIEW, [this](wxCommandEvent& e) { + m_media_play_ctrl->jump_to_play(); + if (m_print_error_dlg) + m_print_error_dlg->on_hide(); + }); + m_switch_speed->Connect(wxEVT_LEFT_DOWN, wxCommandEventHandler(StatusPanel::on_switch_speed), NULL, this); m_calibration_btn->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_start_calibration), NULL, this); @@ -1933,6 +1942,8 @@ void StatusPanel::on_subtask_pause_resume(wxCommandEvent &event) } if (m_print_error_dlg) { m_print_error_dlg->on_hide(); + }if (m_print_error_dlg_no_action) { + m_print_error_dlg_no_action->on_hide(); } } @@ -2156,52 +2167,76 @@ void StatusPanel::show_recenter_dialog() { obj->command_go_home(); } -void StatusPanel::show_error_message(MachineObject* obj, wxString msg, std::string print_error_str) +void StatusPanel::show_error_message(MachineObject* obj, wxString msg, std::string print_error_str, wxString image_url, std::vector used_button) { if (msg.IsEmpty()) { error_info_reset(); } else { m_project_task_panel->show_error_msg(msg); - auto it_retry = std::find(message_containing_retry.begin(), message_containing_retry.end(), print_error_str); - auto it_done = std::find(message_containing_done.begin(), message_containing_done.end(), print_error_str); - auto it_resume = std::find(message_containing_resume.begin(), message_containing_resume.end(), print_error_str); + if (!used_button.empty()) { + BOOST_LOG_TRIVIAL(info) << "show print error! error_msg = " << msg; + if (m_print_error_dlg == nullptr) { + m_print_error_dlg = new PrintErrorDialog(this->GetParent(), wxID_ANY, _L("Error")); + } - BOOST_LOG_TRIVIAL(info) << "show print error! error_msg = " << msg; - if (m_print_error_dlg == nullptr) { - m_print_error_dlg = new SecondaryCheckDialog(this->GetParent(), wxID_ANY, _L("Warning"), SecondaryCheckDialog::ButtonStyle::ONLY_CONFIRM); - } + m_print_error_dlg->update_title_style(_L("Error"), used_button, this); + m_print_error_dlg->update_text_image(msg, image_url); + m_print_error_dlg->Bind(EVT_SECONDARY_CHECK_CONFIRM, [this, obj](wxCommandEvent& e) { + if (obj) { + obj->command_clean_print_error(obj->subtask_id_, obj->print_error); + } + }); - if (it_done != message_containing_done.end() && it_retry != message_containing_retry.end()) { - m_print_error_dlg->update_title_style(_L("Warning"), SecondaryCheckDialog::ButtonStyle::DONE_AND_RETRY, this); - } - else if (it_done != message_containing_done.end()) { - m_print_error_dlg->update_title_style(_L("Warning"), SecondaryCheckDialog::ButtonStyle::CONFIRM_AND_DONE, this); - } - else if (it_retry != message_containing_retry.end()) { - m_print_error_dlg->update_title_style(_L("Warning"), SecondaryCheckDialog::ButtonStyle::CONFIRM_AND_RETRY, this); - } - else if (it_resume!= message_containing_resume.end()) { - m_print_error_dlg->update_title_style(_L("Warning"), SecondaryCheckDialog::ButtonStyle::CONFIRM_AND_RESUME, this); + m_print_error_dlg->Bind(EVT_SECONDARY_CHECK_RETRY, [this, obj](wxCommandEvent& e) { + if (m_ams_control) { + m_ams_control->on_retry(); + } + }); + + m_print_error_dlg->on_show(); } else { - m_print_error_dlg->update_title_style(_L("Warning"), SecondaryCheckDialog::ButtonStyle::ONLY_CONFIRM, this); + //old error code dialog + auto it_retry = std::find(message_containing_retry.begin(), message_containing_retry.end(), print_error_str); + auto it_done = std::find(message_containing_done.begin(), message_containing_done.end(), print_error_str); + auto it_resume = std::find(message_containing_resume.begin(), message_containing_resume.end(), print_error_str); + + BOOST_LOG_TRIVIAL(info) << "show print error! error_msg = " << msg; + if (m_print_error_dlg_no_action == nullptr) { + m_print_error_dlg_no_action = new SecondaryCheckDialog(this->GetParent(), wxID_ANY, _L("Warning"), SecondaryCheckDialog::ButtonStyle::ONLY_CONFIRM); + } + + if (it_done != message_containing_done.end() && it_retry != message_containing_retry.end()) { + m_print_error_dlg_no_action->update_title_style(_L("Warning"), SecondaryCheckDialog::ButtonStyle::DONE_AND_RETRY, this); + } + else if (it_done != message_containing_done.end()) { + m_print_error_dlg_no_action->update_title_style(_L("Warning"), SecondaryCheckDialog::ButtonStyle::CONFIRM_AND_DONE, this); + } + else if (it_retry != message_containing_retry.end()) { + m_print_error_dlg_no_action->update_title_style(_L("Warning"), SecondaryCheckDialog::ButtonStyle::CONFIRM_AND_RETRY, this); + } + else if (it_resume != message_containing_resume.end()) { + m_print_error_dlg_no_action->update_title_style(_L("Warning"), SecondaryCheckDialog::ButtonStyle::CONFIRM_AND_RESUME, this); + } + else { + m_print_error_dlg_no_action->update_title_style(_L("Warning"), SecondaryCheckDialog::ButtonStyle::ONLY_CONFIRM, this); + } + m_print_error_dlg_no_action->update_text(msg); + m_print_error_dlg_no_action->Bind(EVT_SECONDARY_CHECK_CONFIRM, [this, obj](wxCommandEvent& e) { + if (obj) { + obj->command_clean_print_error(obj->subtask_id_, obj->print_error); + } + }); + + m_print_error_dlg_no_action->Bind(EVT_SECONDARY_CHECK_RETRY, [this, obj](wxCommandEvent& e) { + if (m_ams_control) { + m_ams_control->on_retry(); + } + }); + + m_print_error_dlg_no_action->on_show(); } - m_print_error_dlg->update_text(msg); - - m_print_error_dlg->Bind(EVT_SECONDARY_CHECK_CONFIRM, [this, obj](wxCommandEvent& e) { - if (obj) { - obj->command_clean_print_error(obj->subtask_id_, obj->print_error); - } - }); - - m_print_error_dlg->Bind(EVT_SECONDARY_CHECK_RETRY, [this, obj](wxCommandEvent& e) { - if (m_ams_control) { - m_ams_control->on_retry(); - } - }); - - m_print_error_dlg->on_show(); wxGetApp().mainframe->RequestUserAttention(wxUSER_ATTENTION_ERROR); } } @@ -2224,13 +2259,19 @@ void StatusPanel::update_error_message() } wxString error_msg = wxGetApp().get_hms_query()->query_print_error_msg(obj->print_error); + std::vector used_button; + wxString error_image_url = wxGetApp().get_hms_query()->query_print_error_url_action(obj->print_error,obj->dev_id, used_button); + // special case + if (print_error_str == "0300 8003" || print_error_str == "0300 8002" || print_error_str == "0300 800A") + used_button.emplace_back(PrintErrorDialog::PrintErrorButton::JUMP_TO_LIVEVIEW); if (!error_msg.IsEmpty()) { wxDateTime now = wxDateTime::Now(); - wxString show_time = now.Format("%H:%M:%S"); - error_msg = wxString::Format("%s[%s %s]", + wxString show_time = now.Format("%Y-%m-%d %H:%M:%S"); + + error_msg = wxString::Format("%s\n[%s %s]", error_msg, print_error_str, show_time); - show_error_message(obj, error_msg, print_error_str); + show_error_message(obj, error_msg, print_error_str,error_image_url,used_button); } else { BOOST_LOG_TRIVIAL(info) << "show print error! error_msg is empty, print error = " << obj->print_error; } @@ -2531,6 +2572,7 @@ void StatusPanel::update_ams(MachineObject *obj) m_ams_setting_dlg->update_starting_read_mode(obj->ams_power_on_flag); m_ams_setting_dlg->update_remain_mode(obj->ams_calibrate_remain_flag); m_ams_setting_dlg->update_switch_filament(obj->ams_auto_switch_filament_flag); + m_ams_setting_dlg->update_air_printing_detection(obj->ams_air_print_status); } } if (m_filament_setting_dlg) { m_filament_setting_dlg->obj = obj; } @@ -3515,6 +3557,16 @@ void StatusPanel::on_ams_load_curr() } } +void StatusPanel::on_ams_load_vams(wxCommandEvent& event) { + BOOST_LOG_TRIVIAL(info) << "on_ams_load_vams_tray"; + + m_ams_control->SwitchAms(std::to_string(VIRTUAL_TRAY_ID)); + on_ams_load_curr(); + if (m_print_error_dlg) { + m_print_error_dlg->on_hide(); + } +} + void StatusPanel::on_ams_unload(SimpleEvent &event) { if (obj) { obj->command_ams_switch(255); } @@ -3839,6 +3891,8 @@ void StatusPanel::on_print_error_done(wxCommandEvent& event) obj->command_ams_control("done"); if (m_print_error_dlg) { m_print_error_dlg->on_hide(); + }if (m_print_error_dlg_no_action) { + m_print_error_dlg_no_action->on_hide(); } } } diff --git a/src/slic3r/GUI/StatusPanel.hpp b/src/slic3r/GUI/StatusPanel.hpp index d82c6371b6..eee2fafdfe 100644 --- a/src/slic3r/GUI/StatusPanel.hpp +++ b/src/slic3r/GUI/StatusPanel.hpp @@ -452,6 +452,7 @@ public: wxBoxSizer *create_settings_group(wxWindow *parent); void show_ams_group(bool show = true); + MediaPlayCtrl* get_media_play_ctrl() {return m_media_play_ctrl;}; }; @@ -471,7 +472,8 @@ protected: CalibrationDialog* calibration_dlg {nullptr}; AMSMaterialsSetting *m_filament_setting_dlg{nullptr}; - SecondaryCheckDialog* m_print_error_dlg = nullptr; + PrintErrorDialog* m_print_error_dlg = nullptr; + SecondaryCheckDialog* m_print_error_dlg_no_action = nullptr; SecondaryCheckDialog* abort_dlg = nullptr; SecondaryCheckDialog* con_load_dlg = nullptr; SecondaryCheckDialog* ctrl_e_hint_dlg = nullptr; @@ -524,7 +526,7 @@ protected: void on_subtask_pause_resume(wxCommandEvent &event); void on_subtask_abort(wxCommandEvent &event); void on_print_error_clean(wxCommandEvent &event); - void show_error_message(MachineObject* obj, wxString msg, std::string print_error_str = ""); + void show_error_message(MachineObject* obj, wxString msg, std::string print_error_str = "",wxString image_url="",std::vector used_button=std::vector()); void error_info_reset(); void show_recenter_dialog(); @@ -553,6 +555,7 @@ protected: void on_ams_load(SimpleEvent &event); void update_filament_step(); void on_ams_load_curr(); + void on_ams_load_vams(wxCommandEvent& event); void on_ams_unload(SimpleEvent &event); void on_ams_filament_backup(SimpleEvent& event); void on_ams_setting_click(SimpleEvent& event); diff --git a/src/slic3r/GUI/TaskManager.cpp b/src/slic3r/GUI/TaskManager.cpp new file mode 100644 index 0000000000..0c4169ad9a --- /dev/null +++ b/src/slic3r/GUI/TaskManager.cpp @@ -0,0 +1,400 @@ +#include "TaskManager.hpp" + +#include "libslic3r/Thread.hpp" +#include "nlohmann/json.hpp" +#include "MainFrame.hpp" +#include "GUI_App.hpp" + +using namespace nlohmann; + +namespace Slic3r { +wxDEFINE_EVENT(EVT_MULTI_SEND_LIMIT, wxCommandEvent); + +int TaskManager::MaxSendingAtSameTime = 5; +int TaskManager::SendingInterval = 180; + +std::string get_task_state_enum_str(TaskState ts) +{ + switch (ts) { + case TaskState::TS_PENDING: + return "task pending"; + case TaskState::TS_SENDING: + return "task sending"; + case TaskState::TS_SEND_COMPLETED: + return "task sending completed"; + case TaskState::TS_SEND_CANCELED: + return "task sending canceled"; + case TaskState::TS_SEND_FAILED: + return "task sending failed"; + case TaskState::TS_PRINTING: + return "task printing"; + case TaskState::TS_PRINT_SUCCESS: + return "task print success"; + case TaskState::TS_PRINT_FAILED: + return "task print failed"; + case TaskState::TS_IDLE: + return "task idle"; + case TaskState::TS_REMOVED: + return "task removed"; + default: + assert(false); + } + return "unknown task state"; +} + +TaskState parse_task_status(int status) +{ + switch (status) + { + case 1: + return TaskState::TS_PRINTING; + case 2: + return TaskState::TS_PRINT_SUCCESS; + case 3: + return TaskState::TS_PRINT_FAILED; + case 4: + return TaskState::TS_PRINTING; + default: + return TaskState::TS_PRINTING; + } + return TaskState::TS_PRINTING; +} + +int TaskStateInfo::g_task_info_id = 0; + +TaskStateInfo::TaskStateInfo(BBL::PrintParams param) + : m_state(TaskState::TS_PENDING) + , m_params(param) + , m_sending_percent(0) + , m_state_changed_fn(nullptr) + , m_cancel(false) +{ + task_info_id = ++TaskStateInfo::g_task_info_id; + + this->set_task_name(param.project_name); + this->set_device_name(param.dev_name); + + cancel_fn = [this]() { + return m_cancel; + }; + update_status_fn = [this](int stage, int code, std::string msg) { + + if (stage == PrintingStageLimit) + { + //limit + //wxCommandEvent event(EVT_MULTI_SEND_LIMIT); + //wxPostEvent(this, event); + GUI::wxGetApp().mainframe->CallAfter([]() { + GUI::wxGetApp().show_dialog("The printing task exceeds the limit, supporting a maximum of 6 printers."); + }); + } + + const int StagePercentPoint[(int)PrintingStageFinished + 1] = { + 10, // PrintingStageCreate + 25, // PrintingStageUpload + 70, // PrintingStageWaiting + 75, // PrintingStageRecord + 90, // PrintingStageSending + 95, // PrintingStageFinished + 100 // PrintingStageFinished + }; + BOOST_LOG_TRIVIAL(trace) << "task_manager: update task, " << m_params.dev_id << ", stage = " << stage << "code = " << code; + // update current percnet + int curr_percent = 0; + if (stage >= 0 && stage <= (int)PrintingStageFinished) { + curr_percent = StagePercentPoint[stage]; + if ((stage == BBL::SendingPrintJobStage::PrintingStageUpload + || stage == BBL::SendingPrintJobStage::PrintingStageRecord) + && (code > 0 && code <= 100)) { + curr_percent = (StagePercentPoint[stage + 1] - StagePercentPoint[stage]) * code / 100 + StagePercentPoint[stage]; + BOOST_LOG_TRIVIAL(trace) << "task_manager: percent = " << curr_percent; + } + } + + BOOST_LOG_TRIVIAL(trace) << "task_manager: update task, curr_percent = " << curr_percent; + update_sending_percent(curr_percent); + }; + + wait_fn = [this](int status, std::string job_info) { + BOOST_LOG_TRIVIAL(info) << "task_manager: get_job_info = " << job_info; + m_job_id = job_info; + return true; + }; +} + +void TaskStateInfo::cancel() +{ + m_cancel = true; + if (m_state == TaskState::TS_PENDING) + m_state = TaskState::TS_REMOVED; + update(); +} + +bool TaskGroup::need_schedule(std::chrono::system_clock::time_point last, TaskStateInfo* task) +{ + /* only pending task will be scheduled */ + if (task->state() != TaskState::TS_PENDING) + return false; + std::chrono::system_clock::time_point curr_time = std::chrono::system_clock::now(); + auto diff = std::chrono::duration_cast(curr_time - last); + if (diff.count() > TaskManager::SendingInterval * 1000) { + BOOST_LOG_TRIVIAL(trace) << "task_manager: diff count = " << diff.count() << " milliseconds"; + return true; + } + return false; +} + +void TaskManager::set_max_send_at_same_time(int count) +{ + TaskManager::MaxSendingAtSameTime = count; +} + +TaskManager::TaskManager(NetworkAgent* agent) + :m_agent(agent) +{ + ; +} + + +int TaskManager::start_print(const std::vector& params, TaskSettings* settings) +{ + BOOST_LOG_TRIVIAL(info) << "task_manager: start_print size = " << params.size(); + TaskManager::MaxSendingAtSameTime = settings->max_sending_at_same_time; + TaskManager::SendingInterval = settings->sending_interval; + m_map_mutex.lock(); + TaskGroup task_group(*settings); + task_group.tasks.reserve(params.size()); + for (auto it = params.begin(); it != params.end(); it++) { + TaskStateInfo* new_item = new TaskStateInfo(*it); + task_group.append(new_item); + } + m_cache_map.push_back(task_group); + m_map_mutex.unlock(); + return 0; +} + +static int start_print_test(BBL::PrintParams& params, OnUpdateStatusFn update_fn, WasCancelledFn cancel_fn, OnWaitFn wait_fn) +{ + int tick = 2; + for (int i = 0; i < 100 * tick; i++) { + boost::this_thread::sleep_for(boost::chrono::milliseconds(100)); + if (cancel_fn) { + if (cancel_fn()) { + return -1; + } + } + if (i == tick) { + if (update_fn) update_fn(PrintingStageCreate, 0, ""); + } + if (i >= 20 * tick && i <= 70 * tick) { + int percent = (i - 20 * tick) * 2 / tick; + if (update_fn) update_fn(PrintingStageUpload, percent, ""); + } + + if (i == 80 * tick) + if (update_fn) update_fn(PrintingStageSending, 0, ""); + if (i == 99 * tick) + if (update_fn) update_fn(PrintingStageFinished, 0, ""); + } + return 0; +} + +int TaskManager::schedule(TaskStateInfo* task) +{ + if (!m_agent) { + assert(false); + return -1; + } + if (task->state() != TaskState::TS_PENDING) + return 0; + assert(task->state() == TaskState::TS_PENDING); + task->set_state(TaskState::TS_SENDING); + + BOOST_LOG_TRIVIAL(trace) << "task_manager: schedule a task to dev_id = " << task->params().dev_id; + boost::thread* new_sending_thread = new boost::thread(); + *new_sending_thread = Slic3r::create_thread( + [this, task] { + if (!m_agent) { + BOOST_LOG_TRIVIAL(trace) << "task_manager: NetworkAgent is nullptr"; + return; + } + assert(m_agent); +// DEBUG FOR TEST +#if 0 + int result = start_print_test(task->get_params(), task->update_status_fn, task->cancel_fn, task->wait_fn); +#else + int result = m_agent->start_print(task->get_params(), task->update_status_fn, task->cancel_fn, task->wait_fn); +#endif + if (result == 0) { + last_sent_timestamp = std::chrono::system_clock::now(); + task->set_sent_time(last_sent_timestamp); + task->set_state(TaskState::TS_SEND_COMPLETED); + } + else { + if (!task->is_canceled()) { + task->set_state(TaskState::TS_SEND_FAILED); + } else { + task->set_state(TaskState::TS_SEND_CANCELED); + } + } + + /* remove from sending task list */ + m_scedule_mutex.lock(); + auto it = std::find(m_scedule_list.begin(), m_scedule_list.end(), task); + if (it != m_scedule_list.end()) { + BOOST_LOG_TRIVIAL(trace) << "task_manager: schedule, scedule task has removed from list"; + m_scedule_list.erase(it); + } + else { + /*assert(false);*/ + } + m_scedule_mutex.unlock(); + } + ); + m_sending_thread_list.push_back(new_sending_thread); + return 0; +} + +void TaskManager::start() +{ + if (m_started) { + return; + } + m_started = true; + m_scedule_thread = Slic3r::create_thread( + [this] { + BOOST_LOG_TRIVIAL(trace) << "task_manager: thread start()"; + while (m_started) { + m_map_mutex.lock(); + for (auto it = m_cache_map.begin(); it != m_cache_map.end(); it++) { + for (auto iter = it->tasks.begin(); iter != it->tasks.end(); iter++) { + m_scedule_mutex.lock(); + if (m_scedule_list.size() < TaskManager::MaxSendingAtSameTime + && it->need_schedule(last_sent_timestamp, *iter)) { + m_scedule_list.push_back(*iter); + } + m_scedule_mutex.unlock(); + } + } + m_map_mutex.unlock(); + if (!m_scedule_list.empty()) { + //BOOST_LOG_TRIVIAL(trace) << "task_manager: need scedule task count = " << m_scedule_list.size(); + m_scedule_mutex.lock(); + for (auto it = m_scedule_list.begin(); it != m_scedule_list.end(); it++) { + this->schedule(*it); + } + m_scedule_mutex.unlock(); + } + boost::this_thread::sleep_for(boost::chrono::milliseconds(100)); + } + BOOST_LOG_TRIVIAL(trace) << "task_manager: thread exit()"; + }); +} + +void TaskManager::stop() +{ + m_started = false; + if (m_scedule_thread.joinable()) + m_scedule_thread.join(); +} + +std::map TaskManager::get_local_task_list() +{ + std::map out; + m_map_mutex.lock(); + for (auto it = m_cache_map.begin(); it != m_cache_map.end(); it++) { + for (auto iter = (*it).tasks.begin(); iter != (*it).tasks.end(); iter++) { + if ((*iter)->state() == TaskState::TS_PENDING + || (*iter)->state() == TaskState::TS_SENDING + || (*iter)->state() == TaskState::TS_SEND_CANCELED + || (*iter)->state() == TaskState::TS_SEND_COMPLETED + || (*iter)->state() == TaskState::TS_SEND_FAILED) { + out.insert(std::make_pair((*iter)->task_info_id, *iter)); + } + } + } + m_map_mutex.unlock(); + return out; +} + +std::map TaskManager::get_task_list(int curr_page, int page_count, int& total) +{ + std::map out; + if (m_agent) { + BBL::TaskQueryParams task_query_params; + task_query_params.limit = page_count; + task_query_params.offset = curr_page * page_count; + std::string task_info; + int result = m_agent->get_user_tasks(task_query_params, &task_info); + BOOST_LOG_TRIVIAL(trace) << "task_manager: get_task_list task_info=" << task_info; + if (result == 0) { + try { + json j = json::parse(task_info); + if (j.contains("total")) { + total = j["total"].get(); + } + if (!j.contains("hits")) { + return out; + } + BOOST_LOG_TRIVIAL(trace) << "task_manager: get_task_list task count =" << j["hits"].size(); + for (auto& hit : j["hits"]) { + TaskStateInfo task_info; + int64_t design_id = 0; + if (hit.contains("designId")) { + design_id = hit["designId"].get(); + } + if (design_id > 0 && hit.contains("designTitle")) { + task_info.set_task_name(hit["designTitle"].get()); + } else { + if (hit.contains("title")) + task_info.set_task_name(hit["title"].get()); + } + if (hit.contains("deviceName")) + task_info.set_device_name(hit["deviceName"].get()); + if (hit.contains("deviceId")) + task_info.params().dev_id = hit["deviceId"].get(); + if (hit.contains("id")) + task_info.set_job_id(std::to_string(hit["id"].get())); + if (hit.contains("status")) + task_info.set_state(parse_task_status(hit["status"].get())); + if (hit.contains("cover")) + task_info.thumbnail_url = hit["cover"].get(); + if (hit.contains("startTime")) + task_info.start_time = hit["startTime"].get(); + if (hit.contains("endTime")) + task_info.end_time = hit["endTime"].get(); + if (hit.contains("profileId")) + task_info.profile_id = std::to_string(hit["profileId"].get()); + if (!task_info.get_job_id().empty()) + out.insert(std::make_pair(task_info.get_job_id(), task_info)); + } + } + catch(...) { + } + } + } + return out; +} + +TaskState TaskManager::query_task_state(std::string dev_id) +{ + /* priority: TS_SENDING > TS_PENDING > TS_IDLE */ + TaskState ts = TaskState::TS_IDLE; + m_map_mutex.lock(); + for (auto& task_group : m_cache_map) { + for (auto it = task_group.tasks.begin(); it != task_group.tasks.end(); it++) { + if ((*it)->params().dev_id == dev_id) { + if ((*it)->state() == TS_SENDING) { + m_map_mutex.unlock(); + return TS_SENDING; + } else if ((*it)->state() == TS_PENDING) { + ts = TS_PENDING; + } + } + } + } + m_map_mutex.unlock(); + return ts; +} + +} // namespace Slic3r diff --git a/src/slic3r/GUI/TaskManager.hpp b/src/slic3r/GUI/TaskManager.hpp new file mode 100644 index 0000000000..5a2abd5a83 --- /dev/null +++ b/src/slic3r/GUI/TaskManager.hpp @@ -0,0 +1,182 @@ +#ifndef slic3r_TaskManager_hpp_ +#define slic3r_TaskManager_hpp_ + +#include "DeviceManager.hpp" +#include +#include + +namespace Slic3r { + +enum TaskState +{ + TS_PENDING = 0, + TS_SENDING, + TS_SEND_COMPLETED, + TS_SEND_CANCELED, + TS_SEND_FAILED, + TS_PRINTING, + /* queray in Machine Object: IDLE, PREPARE, RUNNING, PAUSE, FINISH, FAILED, SLICING */ + TS_PRINT_SUCCESS, + TS_PRINT_FAILED, + TS_REMOVED, + TS_IDLE, +}; + +std::string get_task_state_enum_str(TaskState ts); + +class TaskStateInfo +{ +public: + static int g_task_info_id; + typedef std::function StateChangedFn; + + TaskStateInfo(const BBL::PrintParams param); + + TaskStateInfo() { + task_info_id = ++TaskStateInfo::g_task_info_id; + } + + TaskState state() { return m_state; } + void set_state(TaskState ts) { + BOOST_LOG_TRIVIAL(trace) << "TaskStateInfo set state = " << get_task_state_enum_str(ts); + m_state = ts; + if (m_state_changed_fn) { + m_state_changed_fn(m_state, m_sending_percent); + } + } + BBL::PrintParams get_params() { return m_params; } + + BBL::PrintParams& params() { return m_params; } + + std::string get_job_id(){return profile_id;} + + void update_sending_percent(int percent) { + m_sending_percent = percent; + update(); + } + void set_sent_time(std::chrono::system_clock::time_point time) { + sent_time = time; + update(); + } + void set_state_changed_fn(StateChangedFn fn) { + m_state_changed_fn = fn; + update(); + } + void set_cancel_fn(WasCancelledFn fn) { + cancel_fn = fn; + } + + void set_task_name(std::string name) { m_task_name = name; } + void set_device_name(std::string name) { m_device_name = name; } + void set_job_id(std::string job_id) { m_job_id = job_id; } + + void update() { + if (m_state_changed_fn) { + m_state_changed_fn(m_state, m_sending_percent); + } + } + + void cancel(); + bool is_canceled() { return m_cancel; } + + std::string get_device_name() {return m_device_name;}; + std::string get_task_name() {return m_task_name;}; + std::string get_sent_time() { + std::time_t time = std::chrono::system_clock::to_time_t(sent_time); + std::tm* timeInfo = std::localtime(&time); + + std::stringstream ss; + ss << std::put_time(timeInfo, "%Y-%m-%d %H:%M:%S"); + std::string str = ss.str(); + return str; + }; + + /* sending timelapse */ + std::chrono::system_clock::time_point sent_time; + WasCancelledFn cancel_fn; + OnUpdateStatusFn update_status_fn; + OnWaitFn wait_fn; + std::string thumbnail_url; + std::string start_time; + std::string end_time; + std::string profile_id; + int task_info_id; +private: + bool m_cancel; + TaskState m_state; + std::string m_task_name; + std::string m_device_name; + BBL::PrintParams m_params; + int m_sending_percent; + std::string m_job_id; + StateChangedFn m_state_changed_fn; +}; + +class TaskSettings +{ +public: + int sending_interval { 180 }; /* sending a job every 60 seconds */ + int max_sending_at_same_time { 1 }; +}; + +class TaskGroup +{ +public: + std::vector tasks; + TaskSettings settings; + + TaskGroup(TaskSettings s) + : settings(s) + { + } + + void append(TaskStateInfo* task) { + this->tasks.push_back(task); + } + + bool need_schedule(std::chrono::system_clock::time_point last, TaskStateInfo* task); +}; + +class TaskManager +{ +public: + static int MaxSendingAtSameTime; + static int SendingInterval; + TaskManager(NetworkAgent* agent); + + int start_print(const std::vector& params, TaskSettings* settings = nullptr); + + static void set_max_send_at_same_time(int count); + + void start(); + void stop(); + + std::map get_local_task_list(); + + /* curr_page is start with 0 */ + std::map get_task_list(int curr_page, int page_count, int& total); + + TaskState query_task_state(std::string dev_id); + +private: + int schedule(TaskStateInfo* task); + + boost::thread m_scedule_thread; + + std::vector m_cache_map; + std::mutex m_map_mutex; + /* sending task list */ + std::vector m_scedule_list; + std::vector m_sending_thread_list; + std::mutex m_scedule_mutex; + bool m_started { false }; + NetworkAgent* m_agent { nullptr }; + + std::chrono::system_clock::time_point last_sent_timestamp; +}; + + +wxDECLARE_EVENT(EVT_MULTI_SEND_LIMIT, wxCommandEvent); +} // namespace Slic3r + +#endif diff --git a/src/slic3r/GUI/UserManager.cpp b/src/slic3r/GUI/UserManager.cpp new file mode 100644 index 0000000000..29f5f2d137 --- /dev/null +++ b/src/slic3r/GUI/UserManager.cpp @@ -0,0 +1,76 @@ +#include "libslic3r/libslic3r.h" +#include "UserManager.hpp" +#include "DeviceManager.hpp" +#include "NetworkAgent.hpp" +#include "GUI.hpp" +#include "GUI_App.hpp" +#include "MsgDialog.hpp" + + +namespace Slic3r { + +UserManager::UserManager(NetworkAgent* agent) +{ + m_agent = agent; +} + +UserManager::~UserManager() +{ +} + +void UserManager::set_agent(NetworkAgent* agent) +{ + m_agent = agent; +} + +int UserManager::parse_json(std::string payload) +{ + bool restored_json = false; + json j; + json j_pre = json::parse(payload); + if (j_pre.empty()) { + return -1; + } + + //bind/unbind + + try { + if (j_pre.contains("bind")) { + if (j_pre["bind"].contains("command")) { + + //bind + if (j_pre["bind"]["command"].get() == "bind") { + std::string dev_id; + std:; string result; + + if (j_pre["bind"].contains("dev_id")) { + dev_id = j_pre["bind"]["dev_id"].get(); + } + + if (j_pre["bind"].contains("result")) { + result = j_pre["bind"]["result"].get(); + } + + if (result == "success") { + DeviceManager* dev = GUI::wxGetApp().getDeviceManager(); + if (!dev) {return -1;} + + if (GUI::wxGetApp().m_ping_code_binding_dialog && GUI::wxGetApp().m_ping_code_binding_dialog->IsShown()) { + GUI::wxGetApp().m_ping_code_binding_dialog->EndModal(wxCLOSE); + GUI::MessageDialog msgdialog(nullptr, _L("Log in successful."), "", wxAPPLY | wxOK); + msgdialog.ShowModal(); + } + dev->update_user_machine_list_info(); + dev->set_selected_machine(dev_id); + return 0; + } + } + } + } + } + catch (...){} + + return -1; +} + +} // namespace Slic3r \ No newline at end of file diff --git a/src/slic3r/GUI/UserManager.hpp b/src/slic3r/GUI/UserManager.hpp new file mode 100644 index 0000000000..a7f402cbac --- /dev/null +++ b/src/slic3r/GUI/UserManager.hpp @@ -0,0 +1,36 @@ +#ifndef slic3r_UserManager_hpp_ +#define slic3r_UserManager_hpp_ + +#include +#include +#include +#include +#include +#include +#include +#include "nlohmann/json.hpp" +#include "slic3r/Utils/json_diff.hpp" +#include "slic3r/Utils/NetworkAgent.hpp" + + +using namespace nlohmann; + +namespace Slic3r { + +class NetworkAgent; + +class UserManager +{ +private: + NetworkAgent* m_agent { nullptr }; + +public: + UserManager(NetworkAgent* agent = nullptr); + ~UserManager(); + + void set_agent(NetworkAgent* agent); + int parse_json(std::string payload); +}; +} // namespace Slic3r + +#endif // slic3r_UserManager_hpp_ diff --git a/src/slic3r/GUI/UserNotification.cpp b/src/slic3r/GUI/UserNotification.cpp new file mode 100644 index 0000000000..81ee408297 --- /dev/null +++ b/src/slic3r/GUI/UserNotification.cpp @@ -0,0 +1,5 @@ +#include "UserNotification.hpp" + +namespace Slic3r { + +} // namespace Slic3r diff --git a/src/slic3r/GUI/UserNotification.hpp b/src/slic3r/GUI/UserNotification.hpp new file mode 100644 index 0000000000..6dcba1b2c5 --- /dev/null +++ b/src/slic3r/GUI/UserNotification.hpp @@ -0,0 +1,20 @@ +#ifndef slic3r_UserNotification_hpp_ +#define slic3r_UserNotification_hpp_ + + +namespace Slic3r { + +enum class UserNotificationStyle { + UNS_NORMAL, + UNS_WARNING_CONFIRM, +}; + +class UserNotification +{ +public: + UserNotification() {} +}; + +} // namespace Slic3r + +#endif diff --git a/src/slic3r/GUI/WebGuideDialog.cpp b/src/slic3r/GUI/WebGuideDialog.cpp index 86f8a2a0d4..d08092ecb6 100644 --- a/src/slic3r/GUI/WebGuideDialog.cpp +++ b/src/slic3r/GUI/WebGuideDialog.cpp @@ -13,6 +13,7 @@ #include #include +#include #include #include #include @@ -1061,11 +1062,11 @@ int GuideFrame::LoadProfile() //intptr_t handle; //_finddata_t findData; - //handle = _findfirst(TargetFolderSearch.mb_str(), &findData); // 查找目录中的第一个文件 + //handle = _findfirst(TargetFolderSearch.mb_str(), &findData); // ??????????? //if (handle == -1) { return -1; } //do { - // if (findData.attrib & _A_SUBDIR && strcmp(findData.name, ".") == 0 && strcmp(findData.name, "..") == 0) // 是否是子目录并且不为"."或".." + // if (findData.attrib & _A_SUBDIR && strcmp(findData.name, ".") == 0 && strcmp(findData.name, "..") == 0) // ??????????"."?".." // { // // cout << findData.name << "\t\n"; // } else { @@ -1073,11 +1074,12 @@ int GuideFrame::LoadProfile() // LoadProfileFamily(strVendor, TargetFolder + findData.name); // } - //} while (_findnext(handle, &findData) == 0); // 查找目录中的下一个文件 + //} while (_findnext(handle, &findData) == 0); // ??????????? // BBS: change directories by design //BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", will load config from %1%.") % bbl_bundle_path; m_ProfileJson = json::parse("{}"); + //m_ProfileJson["configpath"] = Slic3r::data_dir(); m_ProfileJson["model"] = json::array(); m_ProfileJson["machine"] = json::object(); m_ProfileJson["filament"] = json::object(); @@ -1098,11 +1100,11 @@ int GuideFrame::LoadProfile() // intptr_t handle; //_finddata_t findData; - //handle = _findfirst((bbl_bundle_path / "*.json").make_preferred().string().c_str(), &findData); // 查找目录中的第一个文件 + //handle = _findfirst((bbl_bundle_path / "*.json").make_preferred().string().c_str(), &findData); // ??????????? // if (handle == -1) { return -1; } // do { - // if (findData.attrib & _A_SUBDIR && strcmp(findData.name, ".") == 0 && strcmp(findData.name, "..") == 0) // 是否是子目录并且不为"."或".." + // if (findData.attrib & _A_SUBDIR && strcmp(findData.name, ".") == 0 && strcmp(findData.name, "..") == 0) // ??????????"."?".." // { // // cout << findData.name << "\t\n"; // } else { @@ -1110,7 +1112,7 @@ int GuideFrame::LoadProfile() // LoadProfileFamily(w2s(strVendor), vendor_dir.make_preferred().string() + "\\"+ findData.name); // } - //} while (_findnext(handle, &findData) == 0); // 查找目录中的下一个文件 + //} while (_findnext(handle, &findData) == 0); // ??????????? //load BBL bundle from user data path @@ -1124,9 +1126,10 @@ int GuideFrame::LoadProfile() } else { //cout << "is a file" << endl; //cout << iter->path().string() << endl; + wxString strVendor = from_u8(iter->path().string()).BeforeLast('.'); strVendor = strVendor.AfterLast( '\\'); - strVendor = strVendor.AfterLast('/'); + strVendor = strVendor.AfterLast('\/'); wxString strExtension = from_u8(iter->path().string()).AfterLast('.').Lower(); if (w2s(strVendor) == PresetBundle::BBL_BUNDLE && strExtension.CmpNoCase("json") == 0) @@ -1145,7 +1148,7 @@ int GuideFrame::LoadProfile() //cout << iter->path().string() << endl; wxString strVendor = from_u8(iter->path().string()).BeforeLast('.'); strVendor = strVendor.AfterLast( '\\'); - strVendor = strVendor.AfterLast('/'); + strVendor = strVendor.AfterLast('\/'); wxString strExtension = from_u8(iter->path().string()).AfterLast('.').Lower(); if (w2s(strVendor) != PresetBundle::BBL_BUNDLE && strExtension.CmpNoCase("json")==0) @@ -1473,13 +1476,7 @@ int GuideFrame::LoadProfileFamily(std::string strVendor, std::string strFilePath // wxString strCoverPath = wxString::Format("%s\\%s\\%s_cover.png", strFolder, strVendor, std::string(s1.mb_str())); std::string cover_file = s1 + "_cover.png"; - boost::filesystem::path cover_path = boost::filesystem::absolute(boost::filesystem::path(resources_dir()) / "/profiles/" / strVendor / cover_file).make_preferred(); - if (!boost::filesystem::exists(cover_path)) { - cover_path = - (boost::filesystem::absolute(boost::filesystem::path(resources_dir()) / "/web/image/printer/") / - cover_file) - .make_preferred(); - } + boost::filesystem::path cover_path = boost::filesystem::absolute(vendor_dir / cover_file).make_preferred(); OneModel["cover"] = cover_path.string(); OneModel["nozzle_selected"] = ""; @@ -1545,7 +1542,7 @@ int GuideFrame::LoadProfileFamily(std::string strVendor, std::string strFilePath json pm = json::parse(contents); std::string strInstant = pm["instantiation"]; - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "Load Filament:" << s1 << ",Path:" << sub_file << ",instantiation:" << strInstant; + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "Load Filament:" << s1 << ",Path:" << sub_file << ",instantiation?" << strInstant; if (strInstant == "true") { std::string sV; @@ -1639,7 +1636,7 @@ std::string GuideFrame::w2s(wxString sSrc) void GuideFrame::GetStardardFilePath(std::string &FilePath) { StrReplace(FilePath, "\\", w2s(wxString::Format("%c", boost::filesystem::path::preferred_separator))); - StrReplace(FilePath, "/", w2s(wxString::Format("%c", boost::filesystem::path::preferred_separator))); + StrReplace(FilePath, "\/", w2s(wxString::Format("%c", boost::filesystem::path::preferred_separator))); } bool GuideFrame::LoadFile(std::string jPath, std::string &sContent) diff --git a/src/slic3r/GUI/Widgets/AMSControl.cpp b/src/slic3r/GUI/Widgets/AMSControl.cpp index 35784465ae..ea2fea852c 100644 --- a/src/slic3r/GUI/Widgets/AMSControl.cpp +++ b/src/slic3r/GUI/Widgets/AMSControl.cpp @@ -87,7 +87,7 @@ bool AMSinfo::parse_ams_info(MachineObject *obj, Ams *ams, bool remain_flag, boo wxColour(255, 255, 255); } - if (obj->get_printer_series() == PrinterSeries::SERIES_X1 && it->second->is_tray_info_ready()) { + if (it->second->is_tray_info_ready() && obj->cali_version >= 0) { CalibUtils::get_pa_k_n_value_by_cali_idx(obj, it->second->cali_idx, info.k, info.n); } else { @@ -648,7 +648,6 @@ void AMSLib::create(wxWindow *parent, wxWindowID id, const wxPoint &pos, const w m_bitmap_readonly = ScalableBitmap(this, "ams_readonly", 14); m_bitmap_readonly_light = ScalableBitmap(this, "ams_readonly_light", 14); m_bitmap_transparent = ScalableBitmap(this, "transparent_ams_lib", 68); - m_bitmap_transparent_def = ScalableBitmap(this, "transparent_ams_lib", 68); m_bitmap_extra_tray_left = ScalableBitmap(this, "extra_ams_tray_left", 80); m_bitmap_extra_tray_right = ScalableBitmap(this, "extra_ams_tray_right", 80); @@ -840,7 +839,7 @@ void AMSLib::render_extra_text(wxDC& dc) void AMSLib::render_generic_text(wxDC &dc) { bool show_k_value = true; - if (m_obj && (m_obj->get_printer_series() == PrinterSeries::SERIES_X1) && (abs(m_info.k - 0) < 1e-3)) { + if (m_obj && (m_obj->cali_version >= 0) && (abs(m_info.k - 0) < 1e-3)) { show_k_value = false; } @@ -867,7 +866,7 @@ void AMSLib::render_generic_text(wxDC &dc) dc.SetFont(::Label::Body_13); dc.SetTextForeground(temp_text_colour); auto alpha = m_info.material_colour.Alpha(); - if (alpha != 0 && alpha != 255) { + if (alpha != 0 && alpha != 255 && alpha != 254) { dc.SetTextForeground(*wxBLACK); } @@ -1116,6 +1115,9 @@ void AMSLib::render_generic_lib(wxDC &dc) // selected if (m_selected) { dc.SetPen(wxPen(tmp_lib_colour, 2, wxSOLID)); + if (tmp_lib_colour.Alpha() == 0) { + dc.SetPen(wxPen(wxColour(tmp_lib_colour.Red(), tmp_lib_colour.Green(),tmp_lib_colour.Blue(),128), 2, wxSOLID)); + } dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); if (m_radius == 0) { dc.DrawRectangle(0, 0, size.x, size.y); @@ -1147,17 +1149,37 @@ void AMSLib::render_generic_lib(wxDC &dc) } //draw remain + auto alpha = m_info.material_colour.Alpha(); int height = size.y - FromDIP(8); - int curr_height = height * float(m_info.material_remain * 1.0 / 100.0); dc.SetFont(::Label::Body_13); + int curr_height = height * float(m_info.material_remain * 1.0 / 100.0); + dc.SetFont(::Label::Body_13); int top = height - curr_height; if (curr_height >= FromDIP(6)) { //transparent - auto alpha = m_info.material_colour.Alpha(); + if (alpha == 0) { - dc.DrawBitmap(m_bitmap_transparent_def.bmp(), FromDIP(4), FromDIP(4)); + dc.DrawBitmap(m_bitmap_transparent.bmp(), FromDIP(4), FromDIP(4)); + } + else if (alpha != 255 && alpha != 254) { + if (transparent_changed) { + std::string rgb = (tmp_lib_colour.GetAsString(wxC2S_HTML_SYNTAX)).ToStdString(); + if (rgb.size() == 9) { + //delete alpha value + rgb = rgb.substr(0, rgb.size() - 2); + } + float alpha_f = 0.7 * tmp_lib_colour.Alpha() / 255.0; + std::vector replace; + replace.push_back(rgb); + std::string fill_replace = "fill-opacity=\"" + std::to_string(alpha_f); + replace.push_back(fill_replace); + m_bitmap_transparent = ScalableBitmap(this, "transparent_ams_lib", 68, false, false, true, replace); + transparent_changed = false; + + } + dc.DrawBitmap(m_bitmap_transparent.bmp(), FromDIP(4), FromDIP(4)); } //gradient if (m_info.material_cols.size() > 1) { @@ -1214,34 +1236,29 @@ void AMSLib::render_generic_lib(wxDC &dc) } } else { + auto brush = dc.GetBrush(); + if (alpha != 0 && alpha != 255 && alpha != 254) dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); #ifdef __APPLE__ dc.DrawRoundedRectangle(FromDIP(4), FromDIP(4) + top, size.x - FromDIP(8), curr_height, m_radius); #else dc.DrawRoundedRectangle(FromDIP(4), FromDIP(4) + top, size.x - FromDIP(8), curr_height, m_radius - 1); - if (alpha != 0 && alpha != 255) { - if (transparent_changed) { - std::string rgb = (tmp_lib_colour.GetAsString(wxC2S_HTML_SYNTAX)).ToStdString(); - if (rgb.size() == 8) { - //delete alpha value - rgb= rgb.substr(0, rgb.size() - 2); - } - float alpha_f = 0.3 * tmp_lib_colour.Alpha() / 255.0; - std::vector replace; - replace.push_back(rgb); - std::string fill_replace = "fill-opacity=\"" + std::to_string(alpha_f); - replace.push_back(fill_replace); - m_bitmap_transparent = ScalableBitmap(this, "transparent_ams_lib", 68, false, false, true, replace); - transparent_changed = false; - } - dc.DrawBitmap(m_bitmap_transparent.bmp(), FromDIP(4), FromDIP(4)); - } #endif + dc.SetBrush(brush); } } if (top > 2) { if (curr_height >= FromDIP(6)) { dc.DrawRectangle(FromDIP(4), FromDIP(4) + top, size.x - FromDIP(8), FromDIP(2)); + if (alpha != 255 && alpha != 254) { + dc.SetPen(wxPen(*wxWHITE)); + dc.SetBrush(wxBrush(*wxWHITE)); +#ifdef __APPLE__ + dc.DrawRoundedRectangle(FromDIP(4), FromDIP(4) , size.x - FromDIP(8), top, m_radius); +#else + dc.DrawRoundedRectangle(FromDIP(4), FromDIP(4) , size.x - FromDIP(8), top, m_radius - 1); +#endif + } if (tmp_lib_colour.Red() > 238 && tmp_lib_colour.Green() > 238 && tmp_lib_colour.Blue() > 238) { dc.SetPen(wxPen(wxColour(130, 129, 128), 1, wxSOLID)); dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); @@ -1303,7 +1320,7 @@ void AMSLib::Update(Caninfo info, bool refresh) if (dev->get_selected_machine() && dev->get_selected_machine() != m_obj) { m_obj = dev->get_selected_machine(); } - if (info.material_colour.Alpha() != 0 && info.material_colour.Alpha() != 255 && m_info.material_colour != info.material_colour) { + if (info.material_colour.Alpha() != 0 && info.material_colour.Alpha() != 255 && info.material_colour.Alpha() != 254 && m_info.material_colour != info.material_colour) { transparent_changed = true; } m_info = info; @@ -1341,9 +1358,7 @@ bool AMSLib::Enable(bool enable) { return wxWindow::Enable(enable); } void AMSLib::msw_rescale() { - //m_bitmap_transparent.msw_rescale(); - m_bitmap_transparent_def.msw_rescale(); - + m_bitmap_transparent.msw_rescale(); } /************************************************* @@ -2542,7 +2557,7 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons wxBoxSizer *m_sizer_button = new wxBoxSizer(wxVERTICAL); wxBoxSizer *m_sizer_button_area = new wxBoxSizer(wxHORIZONTAL); - m_button_extruder_feed = new Button(m_button_area, _L("Load Filament")); + m_button_extruder_feed = new Button(m_button_area, _L("Load")); m_button_extruder_feed->SetFont(Label::Body_13); m_button_extruder_feed->SetBackgroundColor(btn_bg_green); @@ -2558,8 +2573,9 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons if (wxGetApp().app_config->get("language") == "ja_JP") m_button_extruder_feed->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "sv_SE") m_button_extruder_feed->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "cs_CZ") m_button_extruder_feed->SetFont(Label::Body_9); + if (wxGetApp().app_config->get("language") == "uk_UA") m_button_extruder_feed->SetFont(Label::Body_9); - m_button_extruder_back = new Button(m_button_area, _L("Unload Filament")); + m_button_extruder_back = new Button(m_button_area, _L("Unload")); m_button_extruder_back->SetBackgroundColor(btn_bg_white); m_button_extruder_back->SetBorderColor(btn_bd_white); m_button_extruder_back->SetTextColor(btn_text_white); @@ -2573,6 +2589,7 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons if (wxGetApp().app_config->get("language") == "ja_JP") m_button_extruder_back->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "sv_SE") m_button_extruder_back->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "cs_CZ") m_button_extruder_back->SetFont(Label::Body_9); + if (wxGetApp().app_config->get("language") == "uk_UA") m_button_extruder_back->SetFont(Label::Body_9); m_sizer_button_area->Add(0, 0, 1, wxEXPAND, 0); m_sizer_button_area->Add(m_button_extruder_back, 0, wxLEFT, FromDIP(6)); @@ -2754,6 +2771,7 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons if (wxGetApp().app_config->get("language") == "ja_JP") m_button_guide->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "sv_SE") m_button_guide->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "cs_CZ") m_button_guide->SetFont(Label::Body_9); + if (wxGetApp().app_config->get("language") == "uk_UA") m_button_guide->SetFont(Label::Body_9); m_button_guide->SetCornerRadius(FromDIP(12)); m_button_guide->SetBorderColor(btn_bd_white); @@ -2771,6 +2789,7 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons if (wxGetApp().app_config->get("language") == "ja_JP") m_button_retry->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "sv_SE") m_button_retry->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "cs_CZ") m_button_retry->SetFont(Label::Body_9); + if (wxGetApp().app_config->get("language") == "uk_UA") m_button_retry->SetFont(Label::Body_9); m_button_retry->SetCornerRadius(FromDIP(12)); m_button_retry->SetBorderColor(btn_bd_white); @@ -2831,7 +2850,7 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons wxBoxSizer *sizer_err_calibration_v = new wxBoxSizer(wxVERTICAL); m_hyperlink = new wxHyperlinkCtrl(m_calibration_err_panel, wxID_ANY, wxEmptyString, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE); m_hyperlink->SetVisitedColour(wxColour(31, 142, 234)); - auto m_tip_calibration_err = new wxStaticText(m_calibration_err_panel, wxID_ANY, _L("A problem occured during calibration. Click to view the solution."), wxDefaultPosition, + auto m_tip_calibration_err = new wxStaticText(m_calibration_err_panel, wxID_ANY, _L("A problem occurred during calibration. Click to view the solution."), wxDefaultPosition, wxDefaultSize, 0); m_tip_calibration_err->SetFont(::Label::Body_14); m_tip_calibration_err->SetForegroundColour(AMS_CONTROL_GRAY700); @@ -3286,7 +3305,7 @@ void AMSControl::show_vams_kn_value(bool show) void AMSControl::update_vams_kn_value(AmsTray tray, MachineObject* obj) { m_vams_lib->m_obj = obj; - if (obj->get_printer_series() == PrinterSeries::SERIES_X1) { + if (obj->cali_version >= 0) { float k_value = 0; float n_value = 0; CalibUtils::get_pa_k_n_value_by_cali_idx(obj, tray.cali_idx, k_value, n_value); @@ -3304,10 +3323,6 @@ void AMSControl::update_vams_kn_value(AmsTray tray, MachineObject* obj) m_vams_info.material_name = tray.get_display_filament_type(); m_vams_info.material_colour = tray.get_color(); m_vams_lib->m_info.material_name = tray.get_display_filament_type(); - auto col= tray.get_color(); - if (col.Alpha() != 0 && col.Alpha() != 255 && col.Alpha() != 254 && m_vams_lib->m_info.material_colour != col) { - m_vams_lib->transparent_changed = true; - } m_vams_lib->m_info.material_colour = tray.get_color(); m_vams_lib->Refresh(); } @@ -3596,7 +3611,7 @@ void AMSControl::ShowFilamentTip(bool hasams) m_simplebook_right->SetSelection(0); if (hasams) { m_tip_right_top->Show(); - m_tip_load_info->SetLabelText(_L("Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically load or unload filiament.")); + m_tip_load_info->SetLabelText(_L("Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically load or unload filaments.")); } else { // m_tip_load_info->SetLabelText(_L("Before loading, please make sure the filament is pushed into toolhead.")); m_tip_right_top->Hide(); diff --git a/src/slic3r/GUI/Widgets/AMSControl.hpp b/src/slic3r/GUI/Widgets/AMSControl.hpp index f4854fc928..afcee66365 100644 --- a/src/slic3r/GUI/Widgets/AMSControl.hpp +++ b/src/slic3r/GUI/Widgets/AMSControl.hpp @@ -299,7 +299,6 @@ public: Caninfo m_info; MachineObject* m_obj = {nullptr}; int m_can_index = 0; - bool transparent_changed = { false }; AMSModel m_ams_model; void Update(Caninfo info, bool refresh = true); @@ -324,7 +323,6 @@ protected: ScalableBitmap m_bitmap_readonly; ScalableBitmap m_bitmap_readonly_light; ScalableBitmap m_bitmap_transparent; - ScalableBitmap m_bitmap_transparent_def; ScalableBitmap m_bitmap_extra_tray_left; ScalableBitmap m_bitmap_extra_tray_right; @@ -341,7 +339,7 @@ protected: bool m_hover = {false}; bool m_show_kn = {false}; bool m_support_cali = {false}; - + bool transparent_changed = {false}; double m_radius = {4}; wxColour m_border_color; diff --git a/src/slic3r/GUI/Widgets/Button.cpp b/src/slic3r/GUI/Widgets/Button.cpp index 7e49b303a4..8ebddd95b6 100644 --- a/src/slic3r/GUI/Widgets/Button.cpp +++ b/src/slic3r/GUI/Widgets/Button.cpp @@ -143,6 +143,11 @@ void Button::SetValue(bool state) bool Button::GetValue() const { return state_handler.states() & StateHandler::Checked; } +void Button::SetCenter(bool isCenter) +{ + this->isCenter = isCenter; +} + void Button::Rescale() { if (this->active_icon.bmp().IsOk()) @@ -199,9 +204,11 @@ void Button::render(wxDC& dc) } // move to center wxRect rcContent = { {0, 0}, size }; - wxSize offset = (size - szContent) / 2; - if (offset.x < 0) offset.x = 0; - rcContent.Deflate(offset.x, offset.y); + if (isCenter) { + wxSize offset = (size - szContent) / 2; + if (offset.x < 0) offset.x = 0; + rcContent.Deflate(offset.x, offset.y); + } // start draw wxPoint pt = rcContent.GetLeftTop(); if (icon.bmp().IsOk()) { diff --git a/src/slic3r/GUI/Widgets/Button.hpp b/src/slic3r/GUI/Widgets/Button.hpp index 2f5c8eaea0..d3496c0e49 100644 --- a/src/slic3r/GUI/Widgets/Button.hpp +++ b/src/slic3r/GUI/Widgets/Button.hpp @@ -17,6 +17,7 @@ class Button : public StaticBox bool pressedDown = false; bool m_selected = true; bool canFocus = true; + bool isCenter = true; static const int buttonWidth = 200; static const int buttonHeight = 50; @@ -54,6 +55,8 @@ public: bool GetValue() const; + void SetCenter(bool isCenter); + void Rescale(); protected: diff --git a/src/slic3r/GUI/Widgets/ComboBox.cpp b/src/slic3r/GUI/Widgets/ComboBox.cpp index 4cc2d34250..175edbb252 100644 --- a/src/slic3r/GUI/Widgets/ComboBox.cpp +++ b/src/slic3r/GUI/Widgets/ComboBox.cpp @@ -39,7 +39,7 @@ ComboBox::ComboBox(wxWindow *parent, int n, const wxString choices[], long style) - : drop(texts, icons) + : drop(texts, tips, icons) { if (style & wxCB_READONLY) style |= wxRIGHT; @@ -155,6 +155,7 @@ int ComboBox::Append(const wxString &item, void * clientData) { texts.push_back(item); + tips.push_back(wxString{}); icons.push_back(bitmap); datas.push_back(clientData); types.push_back(wxClientData_None); @@ -166,6 +167,7 @@ void ComboBox::DoClear() { SetIcon("drop_down"); texts.clear(); + tips.clear(); icons.clear(); datas.clear(); types.clear(); @@ -176,6 +178,7 @@ void ComboBox::DoDeleteOneItem(unsigned int pos) { if (pos >= texts.size()) return; texts.erase(texts.begin() + pos); + tips.erase(tips.begin() + pos); icons.erase(icons.begin() + pos); datas.erase(datas.begin() + pos); types.erase(types.begin() + pos); @@ -197,6 +200,18 @@ void ComboBox::SetString(unsigned int n, wxString const &value) if (n == drop.GetSelection()) SetLabel(value); } +wxString ComboBox::GetItemTooltip(unsigned int n) const +{ + if (n >= texts.size()) return wxString(); + return tips[n]; +} + +void ComboBox::SetItemTooltip(unsigned int n, wxString const &value) { + if (n >= texts.size()) return; + tips[n] = value; + if (n == drop.GetSelection()) drop.SetToolTip(value); +} + wxBitmap ComboBox::GetItemBitmap(unsigned int n) { return icons[n]; } void ComboBox::SetItemBitmap(unsigned int n, wxBitmap const &bitmap) @@ -214,6 +229,7 @@ int ComboBox::DoInsertItems(const wxArrayStringsAdapter &items, if (pos > texts.size()) return -1; for (int i = 0; i < items.GetCount(); ++i) { texts.insert(texts.begin() + pos, items[i]); + tips.insert(tips.begin() + pos, wxString{}); icons.insert(icons.begin() + pos, wxNullBitmap); datas.insert(datas.begin() + pos, clientData ? clientData[i] : NULL); types.insert(types.begin() + pos, type); diff --git a/src/slic3r/GUI/Widgets/ComboBox.hpp b/src/slic3r/GUI/Widgets/ComboBox.hpp index 82b719d6fe..d4b74f4df7 100644 --- a/src/slic3r/GUI/Widgets/ComboBox.hpp +++ b/src/slic3r/GUI/Widgets/ComboBox.hpp @@ -10,6 +10,7 @@ class ComboBox : public wxWindowWithItems { std::vector texts; + std::vector tips; std::vector icons; std::vector datas; std::vector types; @@ -59,9 +60,13 @@ public: wxString GetString(unsigned int n) const override; void SetString(unsigned int n, wxString const &value) override; + wxString GetItemTooltip(unsigned int n) const; + void SetItemTooltip(unsigned int n, wxString const &value); + wxBitmap GetItemBitmap(unsigned int n); void SetItemBitmap(unsigned int n, wxBitmap const &bitmap); bool is_drop_down(){return drop_down;} + void DeleteOneItem(unsigned int pos) { DoDeleteOneItem(pos); } protected: virtual int DoInsertItems(const wxArrayStringsAdapter &items, unsigned int pos, diff --git a/src/slic3r/GUI/Widgets/DropDown.cpp b/src/slic3r/GUI/Widgets/DropDown.cpp index 23a344e5ad..fb417bf0c7 100644 --- a/src/slic3r/GUI/Widgets/DropDown.cpp +++ b/src/slic3r/GUI/Widgets/DropDown.cpp @@ -31,8 +31,10 @@ END_EVENT_TABLE() */ DropDown::DropDown(std::vector &texts, + std::vector &tips, std::vector &icons) : texts(texts) + , tips(tips) , icons(icons) , state_handler(this) , border_color(0xDBDBDB) @@ -46,9 +48,10 @@ DropDown::DropDown(std::vector &texts, DropDown::DropDown(wxWindow * parent, std::vector &texts, + std::vector &tips, std::vector &icons, long style) - : DropDown(texts, icons) + : DropDown(texts, tips, icons) { Create(parent, style); } @@ -306,7 +309,7 @@ void DropDown::render(wxDC &dc) if (!text_off && !text.IsEmpty()) { wxSize tSize = dc.GetMultiLineTextExtent(text); if (pt.x + tSize.x > rcContent.GetRight()) { - if (i == hover_item) + if (i == hover_item && tips[i].IsEmpty()) SetToolTip(text); text = wxControl::Ellipsize(text, dc, wxELLIPSIZE_END, rcContent.GetRight() - pt.x); @@ -459,7 +462,7 @@ void DropDown::mouseMove(wxMouseEvent &event) if (hover >= (int) texts.size()) hover = -1; if (hover == hover_item) return; hover_item = hover; - SetToolTip(""); + if (hover >= 0) SetToolTip(tips[hover]); } paintNow(); } @@ -482,7 +485,7 @@ void DropDown::mouseWheelMoved(wxMouseEvent &event) if (hover >= (int) texts.size()) hover = -1; if (hover != hover_item) { hover_item = hover; - if (hover >= 0) SetToolTip(texts[hover]); + if (hover >= 0) SetToolTip(tips[hover]); } paintNow(); } diff --git a/src/slic3r/GUI/Widgets/DropDown.hpp b/src/slic3r/GUI/Widgets/DropDown.hpp index 86f14aa278..e3cf9b4531 100644 --- a/src/slic3r/GUI/Widgets/DropDown.hpp +++ b/src/slic3r/GUI/Widgets/DropDown.hpp @@ -16,6 +16,7 @@ wxDECLARE_EVENT(EVT_DISMISS, wxCommandEvent); class DropDown : public PopupWindow { std::vector & texts; + std::vector & tips; std::vector & icons; bool need_sync = false; int selection = -1; @@ -45,10 +46,12 @@ class DropDown : public PopupWindow public: DropDown(std::vector &texts, + std::vector &tips, std::vector &icons); DropDown(wxWindow * parent, std::vector &texts, + std::vector &tips, std::vector &icons, long style = 0); diff --git a/src/slic3r/GUI/WipeTowerDialog.cpp b/src/slic3r/GUI/WipeTowerDialog.cpp index 70fa430775..058d3ece5a 100644 --- a/src/slic3r/GUI/WipeTowerDialog.cpp +++ b/src/slic3r/GUI/WipeTowerDialog.cpp @@ -581,18 +581,21 @@ WipingPanel::WipingPanel(wxWindow* parent, const std::vector& matrix, con auto on_apply_text_modify = [this](wxEvent& e) { wxString str = m_flush_multiplier_ebox->GetValue(); - float multiplier = wxAtof(str); - if (multiplier < g_min_flush_multiplier || multiplier > g_max_flush_multiplier) { - str = wxString::Format(("%.2f"), multiplier < g_min_flush_multiplier ? g_min_flush_multiplier : g_max_flush_multiplier); - m_flush_multiplier_ebox->SetValue(str); - MessageDialog dlg(nullptr, - wxString::Format(_L("The multiplier should be in range [%.2f, %.2f]."), g_min_flush_multiplier, g_max_flush_multiplier), - _L("Warning"), wxICON_WARNING | wxOK); - dlg.ShowModal(); - } - for (unsigned int i = 0; i < m_number_of_extruders; ++i) { - for (unsigned int j = 0; j < m_number_of_extruders; ++j) { - edit_boxes[i][j]->SetValue(to_string(int(m_matrix[m_number_of_extruders * j + i] * multiplier))); + str.Replace(",", "."); + double multiplier = 1.f; + if (str.ToDouble(&multiplier)) { + if (multiplier < g_min_flush_multiplier || multiplier > g_max_flush_multiplier) { + str = wxString::Format(("%.2f"), multiplier < g_min_flush_multiplier ? g_min_flush_multiplier : g_max_flush_multiplier); + m_flush_multiplier_ebox->SetValue(str); + MessageDialog dlg(nullptr, + wxString::Format(_L("The multiplier should be in range [%.2f, %.2f]."), g_min_flush_multiplier, g_max_flush_multiplier), + _L("Warning"), wxICON_WARNING | wxOK); + dlg.ShowModal(); + } + for (unsigned int i = 0; i < m_number_of_extruders; ++i) { + for (unsigned int j = 0; j < m_number_of_extruders; ++j) { + edit_boxes[i][j]->SetValue(to_string(int(m_matrix[m_number_of_extruders * j + i] * multiplier))); + } } } @@ -610,12 +613,25 @@ WipingPanel::WipingPanel(wxWindow* parent, const std::vector& matrix, con char flush_multi_str[32] = { 0 }; snprintf(flush_multi_str, sizeof(flush_multi_str), "%.2f", flush_multiplier); m_flush_multiplier_ebox->SetValue(flush_multi_str); + m_flush_multiplier_ebox->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); param_sizer->Add(m_flush_multiplier_ebox, 0, wxALIGN_CENTER | wxALL, 0); param_sizer->AddStretchSpacer(1); m_sizer_advanced->Add(param_sizer, 0, wxEXPAND | wxLEFT, TEXT_BEG_PADDING); m_flush_multiplier_ebox->Bind(wxEVT_TEXT_ENTER, on_apply_text_modify); m_flush_multiplier_ebox->Bind(wxEVT_KILL_FOCUS, on_apply_text_modify); + m_flush_multiplier_ebox->Bind(wxEVT_COMMAND_TEXT_UPDATED, [this](wxCommandEvent&) { + wxString str = m_flush_multiplier_ebox->GetValue(); + str.Replace(",", "."); + double multiplier = 1.f; + if (str.ToDouble(&multiplier)) { + if (multiplier < g_min_flush_multiplier || multiplier > g_max_flush_multiplier) { + str = wxString::Format(("%.2f"), multiplier < g_min_flush_multiplier ? g_min_flush_multiplier : g_max_flush_multiplier); + m_flush_multiplier_ebox->SetValue(str); + } + } + m_flush_multiplier_ebox->SetInsertionPointEnd(); + }); } this->update_warning_texts(); diff --git a/src/slic3r/GUI/WipeTowerDialog.hpp b/src/slic3r/GUI/WipeTowerDialog.hpp index b436b7b979..faa005c8b3 100644 --- a/src/slic3r/GUI/WipeTowerDialog.hpp +++ b/src/slic3r/GUI/WipeTowerDialog.hpp @@ -61,7 +61,12 @@ public: if (m_flush_multiplier_ebox == nullptr) return 1.f; - return std::atof(m_flush_multiplier_ebox->GetValue().c_str()); + wxString str = m_flush_multiplier_ebox->GetValue(); + str.Replace(",", "."); + double multiplier = 1.f; + str.ToDouble(&multiplier); + + return multiplier; } private: diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index b53573d019..b542723e15 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -598,10 +598,9 @@ wxBitmap *get_extruder_color_icon(std::string color, std::string label, int icon return bitmap; } - -void apply_extruder_selector(Slic3r::GUI::BitmapComboBox** ctrl, +void apply_extruder_selector(Slic3r::GUI::BitmapComboBox** ctrl, wxWindow* parent, - const std::string& first_item/* = ""*/, + const std::string& first_item/* = ""*/, wxPoint pos/* = wxDefaultPosition*/, wxSize size/* = wxDefaultSize*/, bool use_thin_icon/* = false*/) diff --git a/src/slic3r/GUI/wxExtensions.hpp b/src/slic3r/GUI/wxExtensions.hpp index f388b52a60..da562a8c6e 100644 --- a/src/slic3r/GUI/wxExtensions.hpp +++ b/src/slic3r/GUI/wxExtensions.hpp @@ -57,7 +57,7 @@ wxBitmap create_menu_bitmap(const std::string& bmp_name); // BBS: support resize by fill border #if 1 -wxBitmap create_scaled_bitmap(const std::string& bmp_name, wxWindow *win = nullptr, +wxBitmap create_scaled_bitmap(const std::string& bmp_name, wxWindow *win = nullptr, const int px_cnt = 16, const bool grayscale = false, const std::string& new_color = std::string(), // color witch will used instead of orange const bool menu_bitmap = false, const bool resize = false, @@ -75,7 +75,6 @@ wxBitmap create_scaled_bitmap(const std::string& bmp_name, wxWindow *win = nullp wxBitmap* get_default_extruder_color_icon(bool thin_icon = false); std::vector get_extruder_color_icons(bool thin_icon = false); wxBitmap * get_extruder_color_icon(std::string color, std::string label, int icon_width, int icon_height); - namespace Slic3r { namespace GUI { class BitmapComboBox; diff --git a/src/slic3r/Utils/CalibUtils.cpp b/src/slic3r/Utils/CalibUtils.cpp index 478b8c4ef8..a089eef2a0 100644 --- a/src/slic3r/Utils/CalibUtils.cpp +++ b/src/slic3r/Utils/CalibUtils.cpp @@ -122,7 +122,16 @@ static bool is_same_nozzle_type(const DynamicPrintConfig &full_config, const Mac std::string filament_type = full_config.opt_string("filament_type", 0); error_msg = wxString::Format(_L("*Printing %s material with %s may cause nozzle damage"), filament_type, to_wstring_name(obj->nozzle_type)); error_msg += "\n"; - return false; + + MessageDialog msg_dlg(nullptr, error_msg, wxEmptyString, wxICON_WARNING | wxOK | wxCANCEL); + auto result = msg_dlg.ShowModal(); + if (result == wxID_OK) { + error_msg.clear(); + return true; + } else { + error_msg.clear(); + return false; + } } } @@ -484,10 +493,10 @@ bool CalibUtils::get_flow_ratio_calib_results(std::vector& return flow_ratio_calib_results.size() > 0; } -void CalibUtils::calib_flowrate(int pass, const CalibInfo &calib_info, wxString &error_message) +bool CalibUtils::calib_flowrate(int pass, const CalibInfo &calib_info, wxString &error_message) { if (pass != 1 && pass != 2) - return; + return false; Model model; std::string input_file; @@ -572,11 +581,24 @@ void CalibUtils::calib_flowrate(int pass, const CalibInfo &calib_info, wxString Calib_Params params; params.mode = CalibMode::Calib_Flow_Rate; - process_and_store_3mf(&model, full_config, params, error_message); - if (!error_message.empty()) - return; + if (!process_and_store_3mf(&model, full_config, params, error_message)) + return false; + + DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (!dev) { + error_message = _L("Need select printer"); + return false; + } + + MachineObject *obj_ = dev->get_selected_machine(); + if (obj_ == nullptr) { + error_message = _L("Need select printer"); + return false; + } + send_to_print(calib_info, error_message, pass); + return true; } void CalibUtils::calib_pa_pattern(const CalibInfo &calib_info, Model& model) @@ -633,11 +655,11 @@ void CalibUtils::calib_pa_pattern(const CalibInfo &calib_info, Model& model) model.calib_pa_pattern = std::make_unique(pa_pattern); } -void CalibUtils::calib_generic_PA(const CalibInfo &calib_info, wxString &error_message) +bool CalibUtils::calib_generic_PA(const CalibInfo &calib_info, wxString &error_message) { const Calib_Params ¶ms = calib_info.params; if (params.mode != CalibMode::Calib_PA_Line && params.mode != CalibMode::Calib_PA_Pattern) - return; + return false; Model model; std::string input_file; @@ -663,11 +685,24 @@ void CalibUtils::calib_generic_PA(const CalibInfo &calib_info, wxString &error_m full_config.apply(filament_config); full_config.apply(printer_config); - process_and_store_3mf(&model, full_config, params, error_message); - if (!error_message.empty()) - return; + if (!process_and_store_3mf(&model, full_config, params, error_message)) + return false; + + DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (!dev) { + error_message = _L("Need select printer"); + return false; + } + + MachineObject *obj_ = dev->get_selected_machine(); + if (obj_ == nullptr) { + error_message = _L("Need select printer"); + return false; + } + send_to_print(calib_info, error_message); + return true; } void CalibUtils::calib_temptue(const CalibInfo &calib_info, wxString &error_message) @@ -935,7 +970,7 @@ bool CalibUtils::get_pa_k_n_value_by_cali_idx(const MachineObject *obj, int cali return false; } -void CalibUtils::process_and_store_3mf(Model *model, const DynamicPrintConfig &full_config, const Calib_Params ¶ms, wxString &error_message) +bool CalibUtils::process_and_store_3mf(Model *model, const DynamicPrintConfig &full_config, const Calib_Params ¶ms, wxString &error_message) { Pointfs bedfs = full_config.opt("printable_area")->values; double print_height = full_config.opt_float("printable_height"); @@ -952,7 +987,7 @@ void CalibUtils::process_and_store_3mf(Model *model, const DynamicPrintConfig &f int count = std::llround(std::ceil((params.end - params.start) / params.step)) + 1; if (count > max_line_nums) { error_message = _L("Unable to calibrate: maybe because the set calibration value range is too large, or the step is too small"); - return; + return false; } } @@ -988,11 +1023,11 @@ void CalibUtils::process_and_store_3mf(Model *model, const DynamicPrintConfig &f unsigned int count = model->update_print_volume_state(build_volume); if (count == 0) { error_message = _L("Unable to calibrate: maybe because the set calibration value range is too large, or the step is too small"); - return; + return false; } // apply the new print config - DynamicPrintConfig new_print_config = std::move(full_config); + DynamicPrintConfig new_print_config = full_config; print->apply(*model, new_print_config); Print *fff_print = dynamic_cast(print); @@ -1006,7 +1041,7 @@ void CalibUtils::process_and_store_3mf(Model *model, const DynamicPrintConfig &f //} if (!check_nozzle_diameter_and_type(full_config, error_message)) - return; + return false; fff_print->process(); part_plate->update_slice_result_valid_state(true); @@ -1045,7 +1080,7 @@ void CalibUtils::process_and_store_3mf(Model *model, const DynamicPrintConfig &f const ModelVolume &model_volume = *model_object.volumes[volume_idx]; for (int instance_idx = 0; instance_idx < (int)model_object.instances.size(); ++ instance_idx) { const ModelInstance &model_instance = *model_object.instances[instance_idx]; - glvolume_collection.load_object_volume(&model_object, obj_idx, volume_idx, instance_idx, "volume", false, true); + glvolume_collection.load_object_volume(&model_object, obj_idx, volume_idx, instance_idx, "volume", true, false, true); glvolume_collection.volumes.back()->set_render_color(new_color); glvolume_collection.volumes.back()->set_color(new_color); //glvolume_collection.volumes.back()->printable = model_instance.printable; @@ -1097,6 +1132,7 @@ void CalibUtils::process_and_store_3mf(Model *model, const DynamicPrintConfig &f success = Slic3r::store_bbs_3mf(store_params); release_PlateData_list(plate_data_list); + return true; } void CalibUtils::send_to_print(const CalibInfo &calib_info, wxString &error_message, int flow_ratio_mode) diff --git a/src/slic3r/Utils/CalibUtils.hpp b/src/slic3r/Utils/CalibUtils.hpp index f6833e7c10..e470efa62a 100644 --- a/src/slic3r/Utils/CalibUtils.hpp +++ b/src/slic3r/Utils/CalibUtils.hpp @@ -49,11 +49,11 @@ public: static void calib_flowrate_X1C(const X1CCalibInfos& calib_infos, std::string& error_message); static void emit_get_flow_ratio_calib_results(float nozzle_diameter); static bool get_flow_ratio_calib_results(std::vector &flow_ratio_calib_results); - static void calib_flowrate(int pass, const CalibInfo &calib_info, wxString &error_message); + static bool calib_flowrate(int pass, const CalibInfo &calib_info, wxString &error_message); static void calib_pa_pattern(const CalibInfo &calib_info, Model &model); - static void calib_generic_PA(const CalibInfo &calib_info, wxString &error_message); + static bool calib_generic_PA(const CalibInfo &calib_info, wxString &error_message); static void calib_temptue(const CalibInfo &calib_info, wxString &error_message); static void calib_max_vol_speed(const CalibInfo &calib_info, wxString &error_message); static void calib_VFA(const CalibInfo &calib_info, wxString &error_message); @@ -68,9 +68,9 @@ public: static bool validate_input_flow_ratio(wxString flow_ratio, float* output_value); private: - static void process_and_store_3mf(Model* model, const DynamicPrintConfig& full_config, const Calib_Params& params, wxString& error_message); + static bool process_and_store_3mf(Model* model, const DynamicPrintConfig& full_config, const Calib_Params& params, wxString& error_message); static void send_to_print(const CalibInfo &calib_info, wxString& error_message, int flow_ratio_mode = 0); // 0: none 1: coarse 2: fine }; } -} +} \ No newline at end of file diff --git a/src/slic3r/Utils/ColorSpaceConvert.cpp b/src/slic3r/Utils/ColorSpaceConvert.cpp index 2634d1c4c1..176bd29304 100644 --- a/src/slic3r/Utils/ColorSpaceConvert.cpp +++ b/src/slic3r/Utils/ColorSpaceConvert.cpp @@ -1,6 +1,8 @@ #include "ColorSpaceConvert.hpp" #include +#include +#include #include const static float param_13 = 1.0f / 3.0f; @@ -234,3 +236,19 @@ float DeltaE76(float l1, float a1, float b1, float l2, float a2, float b2) return std::sqrt(std::pow((l1 - l2), 2) + std::pow((a1 - a2), 2) + std::pow((b1 - b2), 2)); } +std::string color_to_string(const wxColour &color) +{ + std::string str = std::to_string(color.Red()) + "," + std::to_string(color.Green()) + "," + std::to_string(color.Blue()) + "," + std::to_string(color.Alpha()); + return str; +} + +wxColour string_to_wxColor(const std::string &str) +{ + wxColour color; + std::vector result; + boost::split(result, str, boost::is_any_of(",")); + if (result.size() == 4) { + color = wxColour(std::stoi(result[0]), std::stoi(result[1]), std::stoi(result[2]), std::stoi(result[3])); + } + return color; +}; diff --git a/src/slic3r/Utils/ColorSpaceConvert.hpp b/src/slic3r/Utils/ColorSpaceConvert.hpp index 9c3a659a0a..363720d216 100644 --- a/src/slic3r/Utils/ColorSpaceConvert.hpp +++ b/src/slic3r/Utils/ColorSpaceConvert.hpp @@ -1,5 +1,7 @@ #ifndef slic3r_Utils_ColorSpaceConvert_hpp_ #define slic3r_Utils_ColorSpaceConvert_hpp_ +#include +const int CUSTOM_COLOR_COUNT = 16; #include @@ -18,4 +20,7 @@ float DeltaE00(float l1, float a1, float b1, float l2, float a2, float b2); float DeltaE94(float l1, float a1, float b1, float l2, float a2, float b2); float DeltaE76(float l1, float a1, float b1, float l2, float a2, float b2); +class wxColour; +std::string color_to_string(const wxColour &color); +wxColour string_to_wxColor(const std::string &str); #endif /* slic3r_Utils_ColorSpaceConvert_hpp_ */ diff --git a/src/slic3r/Utils/NetworkAgent.cpp b/src/slic3r/Utils/NetworkAgent.cpp index 5f1933567e..9d2f0d82f1 100644 --- a/src/slic3r/Utils/NetworkAgent.cpp +++ b/src/slic3r/Utils/NetworkAgent.cpp @@ -45,6 +45,7 @@ func_set_on_http_error_fn NetworkAgent::set_on_http_error_fn_ptr = nul func_set_get_country_code_fn NetworkAgent::set_get_country_code_fn_ptr = nullptr; func_set_on_subscribe_failure_fn NetworkAgent::set_on_subscribe_failure_fn_ptr = nullptr; func_set_on_message_fn NetworkAgent::set_on_message_fn_ptr = nullptr; +func_set_on_user_message_fn NetworkAgent::set_on_user_message_fn_ptr = nullptr; func_set_on_local_connect_fn NetworkAgent::set_on_local_connect_fn_ptr = nullptr; func_set_on_local_message_fn NetworkAgent::set_on_local_message_fn_ptr = nullptr; func_set_queue_on_main_fn NetworkAgent::set_queue_on_main_fn_ptr = nullptr; @@ -53,6 +54,11 @@ func_is_server_connected NetworkAgent::is_server_connected_ptr = null func_refresh_connection NetworkAgent::refresh_connection_ptr = nullptr; func_start_subscribe NetworkAgent::start_subscribe_ptr = nullptr; func_stop_subscribe NetworkAgent::stop_subscribe_ptr = nullptr; +func_add_subscribe NetworkAgent::add_subscribe_ptr = nullptr; +func_del_subscribe NetworkAgent::del_subscribe_ptr = nullptr; +func_enable_multi_machine NetworkAgent::enable_multi_machine_ptr = nullptr; +func_start_device_subscribe NetworkAgent::start_device_subscribe_ptr = nullptr; +func_stop_device_subscribe NetworkAgent::stop_device_subscribe_ptr = nullptr; func_send_message NetworkAgent::send_message_ptr = nullptr; func_connect_printer NetworkAgent::connect_printer_ptr = nullptr; func_disconnect_printer NetworkAgent::disconnect_printer_ptr = nullptr; @@ -68,6 +74,8 @@ func_get_user_nickanme NetworkAgent::get_user_nickanme_ptr = nullpt func_build_login_cmd NetworkAgent::build_login_cmd_ptr = nullptr; func_build_logout_cmd NetworkAgent::build_logout_cmd_ptr = nullptr; func_build_login_info NetworkAgent::build_login_info_ptr = nullptr; +func_get_model_id_from_desgin_id NetworkAgent::get_model_id_from_desgin_id_ptr = nullptr; +func_ping_bind NetworkAgent::ping_bind_ptr = nullptr; func_bind NetworkAgent::bind_ptr = nullptr; func_unbind NetworkAgent::unbind_ptr = nullptr; func_get_bambulab_host NetworkAgent::get_bambulab_host_ptr = nullptr; @@ -88,6 +96,7 @@ func_set_extra_http_header NetworkAgent::set_extra_http_header_ptr = nu func_get_my_message NetworkAgent::get_my_message_ptr = nullptr; func_check_user_task_report NetworkAgent::check_user_task_report_ptr = nullptr; func_get_user_print_info NetworkAgent::get_user_print_info_ptr = nullptr; +func_get_user_tasks NetworkAgent::get_user_tasks_ptr = nullptr; func_get_printer_firmware NetworkAgent::get_printer_firmware_ptr = nullptr; func_get_task_plate_index NetworkAgent::get_task_plate_index_ptr = nullptr; func_get_user_info NetworkAgent::get_user_info_ptr = nullptr; @@ -204,6 +213,7 @@ int NetworkAgent::initialize_network_module(bool using_backup) set_get_country_code_fn_ptr = reinterpret_cast(get_network_function("bambu_network_set_get_country_code_fn")); set_on_subscribe_failure_fn_ptr = reinterpret_cast(get_network_function("bambu_network_set_on_subscribe_failure_fn")); set_on_message_fn_ptr = reinterpret_cast(get_network_function("bambu_network_set_on_message_fn")); + set_on_user_message_fn_ptr = reinterpret_cast(get_network_function("bambu_network_set_on_user_message_fn")); set_on_local_connect_fn_ptr = reinterpret_cast(get_network_function("bambu_network_set_on_local_connect_fn")); set_on_local_message_fn_ptr = reinterpret_cast(get_network_function("bambu_network_set_on_local_message_fn")); set_queue_on_main_fn_ptr = reinterpret_cast(get_network_function("bambu_network_set_queue_on_main_fn")); @@ -212,6 +222,11 @@ int NetworkAgent::initialize_network_module(bool using_backup) refresh_connection_ptr = reinterpret_cast(get_network_function("bambu_network_refresh_connection")); start_subscribe_ptr = reinterpret_cast(get_network_function("bambu_network_start_subscribe")); stop_subscribe_ptr = reinterpret_cast(get_network_function("bambu_network_stop_subscribe")); + add_subscribe_ptr = reinterpret_cast(get_network_function("bambu_network_add_subscribe")); + del_subscribe_ptr = reinterpret_cast(get_network_function("bambu_network_del_subscribe")); + enable_multi_machine_ptr = reinterpret_cast(get_network_function("bambu_network_enable_multi_machine")); + start_device_subscribe_ptr = reinterpret_cast(get_network_function("bambu_network_start_device_subscribe")); + stop_device_subscribe_ptr = reinterpret_cast(get_network_function("bambu_network_stop_device_subscribe")); send_message_ptr = reinterpret_cast(get_network_function("bambu_network_send_message")); connect_printer_ptr = reinterpret_cast(get_network_function("bambu_network_connect_printer")); disconnect_printer_ptr = reinterpret_cast(get_network_function("bambu_network_disconnect_printer")); @@ -227,6 +242,8 @@ int NetworkAgent::initialize_network_module(bool using_backup) build_login_cmd_ptr = reinterpret_cast(get_network_function("bambu_network_build_login_cmd")); build_logout_cmd_ptr = reinterpret_cast(get_network_function("bambu_network_build_logout_cmd")); build_login_info_ptr = reinterpret_cast(get_network_function("bambu_network_build_login_info")); + ping_bind_ptr = reinterpret_cast(get_network_function("bambu_network_ping_bind")); + get_model_id_from_desgin_id_ptr = reinterpret_cast(get_network_function("bambu_network_get_model_id_from_desgin_id")); bind_ptr = reinterpret_cast(get_network_function("bambu_network_bind")); unbind_ptr = reinterpret_cast(get_network_function("bambu_network_unbind")); get_bambulab_host_ptr = reinterpret_cast(get_network_function("bambu_network_get_bambulab_host")); @@ -247,6 +264,7 @@ int NetworkAgent::initialize_network_module(bool using_backup) get_my_message_ptr = reinterpret_cast(get_network_function("bambu_network_get_my_message")); check_user_task_report_ptr = reinterpret_cast(get_network_function("bambu_network_check_user_task_report")); get_user_print_info_ptr = reinterpret_cast(get_network_function("bambu_network_get_user_print_info")); + get_user_tasks_ptr = reinterpret_cast(get_network_function("bambu_network_get_user_tasks")); get_printer_firmware_ptr = reinterpret_cast(get_network_function("bambu_network_get_printer_firmware")); get_task_plate_index_ptr = reinterpret_cast(get_network_function("bambu_network_get_task_plate_index")); get_user_info_ptr = reinterpret_cast(get_network_function("bambu_network_get_user_info")); @@ -317,6 +335,7 @@ int NetworkAgent::unload_network_module() set_get_country_code_fn_ptr = nullptr; set_on_subscribe_failure_fn_ptr = nullptr; set_on_message_fn_ptr = nullptr; + set_on_user_message_fn_ptr = nullptr; set_on_local_connect_fn_ptr = nullptr; set_on_local_message_fn_ptr = nullptr; set_queue_on_main_fn_ptr = nullptr; @@ -340,6 +359,8 @@ int NetworkAgent::unload_network_module() build_login_cmd_ptr = nullptr; build_logout_cmd_ptr = nullptr; build_login_info_ptr = nullptr; + get_model_id_from_desgin_id_ptr = nullptr; + ping_bind_ptr = nullptr; bind_ptr = nullptr; unbind_ptr = nullptr; get_bambulab_host_ptr = nullptr; @@ -360,6 +381,7 @@ int NetworkAgent::unload_network_module() get_my_message_ptr = nullptr; check_user_task_report_ptr = nullptr; get_user_print_info_ptr = nullptr; + get_user_tasks_ptr = nullptr; get_printer_firmware_ptr = nullptr; get_task_plate_index_ptr = nullptr; get_user_info_ptr = nullptr; @@ -621,6 +643,17 @@ int NetworkAgent::set_on_message_fn(OnMessageFn fn) return ret; } +int NetworkAgent::set_on_user_message_fn(OnMessageFn fn) +{ + int ret = 0; + if (network_agent && set_on_user_message_fn_ptr) { + ret = set_on_user_message_fn_ptr(network_agent, fn); + if (ret) + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << boost::format(" error: network_agent=%1%, ret=%2%") % network_agent % ret; + } + return ret; +} + int NetworkAgent::set_on_local_connect_fn(OnLocalConnectedFn fn) { int ret = 0; @@ -708,6 +741,57 @@ int NetworkAgent::stop_subscribe(std::string module) return ret; } +int NetworkAgent::add_subscribe(std::vector dev_list) +{ + int ret = 0; + if (network_agent && add_subscribe_ptr) { + ret = add_subscribe_ptr(network_agent, dev_list); + if (ret) + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << boost::format(" error: network_agent=%1%, ret=%2%") % network_agent % ret; + } + return ret; +} + +int NetworkAgent::del_subscribe(std::vector dev_list) +{ + int ret = 0; + if (network_agent && del_subscribe_ptr) { + ret = del_subscribe_ptr(network_agent, dev_list); + if (ret) + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << boost::format(" error: network_agent=%1%, ret=%2%") % network_agent % ret; + } + return ret; +} + +void NetworkAgent::enable_multi_machine(bool enable) +{ + if (network_agent && enable_multi_machine_ptr) { + enable_multi_machine_ptr(network_agent, enable); + } +} + +int NetworkAgent::start_device_subscribe() +{ + int ret = 0; + if (network_agent && start_device_subscribe_ptr) { + ret = start_device_subscribe_ptr(network_agent); + if (ret) + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << boost::format(" error: network_agent=%1%, ret=%2%") % network_agent % ret; + } + return ret; +} + +int NetworkAgent::stop_device_subscribe() +{ + int ret = 0; + if (network_agent && stop_device_subscribe_ptr) { + ret = stop_device_subscribe_ptr(network_agent); + if (ret) + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << boost::format(" error: network_agent=%1%, ret=%2%") % network_agent % ret; + } + return ret; +} + int NetworkAgent::send_message(std::string dev_id, std::string json_str, int qos) { int ret = 0; @@ -858,6 +942,30 @@ std::string NetworkAgent::build_login_info() return ret; } +int NetworkAgent::get_model_id_from_desgin_id(std::string& desgin_id, std::string& model_id) +{ + int ret = 0; + if (network_agent && get_model_id_from_desgin_id_ptr) { + ret = get_model_id_from_desgin_id_ptr(network_agent, desgin_id, model_id); + if (ret) + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << boost::format(" error: network_agent=%1%, ret=%2%, pin code=%3%") + % network_agent % ret % desgin_id; + } + return ret; +} + +int NetworkAgent::ping_bind(std::string ping_code) +{ + int ret = 0; + if (network_agent && ping_bind_ptr) { + ret = ping_bind_ptr(network_agent, ping_code); + if (ret) + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << boost::format(" error: network_agent=%1%, ret=%2%, pin code=%3%") + % network_agent % ret % ping_code; + } + return ret; +} + int NetworkAgent::bind(std::string dev_ip, std::string dev_id, std::string sec_link, std::string timezone, bool improved, OnUpdateStatusFn update_fn) { int ret = 0; @@ -934,13 +1042,13 @@ int NetworkAgent::start_local_print_with_record(PrintParams params, OnUpdateStat int NetworkAgent::start_send_gcode_to_sdcard(PrintParams params, OnUpdateStatusFn update_fn, WasCancelledFn cancel_fn, OnWaitFn wait_fn) { - int ret = 0; - if (network_agent && start_send_gcode_to_sdcard_ptr) { - ret = start_send_gcode_to_sdcard_ptr(network_agent, params, update_fn, cancel_fn, wait_fn); - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(" : network_agent=%1%, ret=%2%, dev_id=%3%, task_name=%4%, project_name=%5%") - % network_agent % ret % params.dev_id % params.task_name % params.project_name; - } - return ret; + int ret = 0; + if (network_agent && start_send_gcode_to_sdcard_ptr) { + ret = start_send_gcode_to_sdcard_ptr(network_agent, params, update_fn, cancel_fn, wait_fn); + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(" : network_agent=%1%, ret=%2%, dev_id=%3%, task_name=%4%, project_name=%5%") + % network_agent % ret % params.dev_id % params.task_name % params.project_name; + } + return ret; } int NetworkAgent::start_local_print(PrintParams params, OnUpdateStatusFn update_fn, WasCancelledFn cancel_fn) @@ -1070,6 +1178,16 @@ int NetworkAgent::get_user_print_info(unsigned int* http_code, std::string* http return ret; } +int NetworkAgent::get_user_tasks(TaskQueryParams params, std::string* http_body) +{ + int ret = 0; + if (network_agent && get_user_tasks_ptr) { + ret = get_user_tasks_ptr(network_agent, params, http_body); + BOOST_LOG_TRIVIAL(debug) << __FUNCTION__ << boost::format(" error: network_agent=%1%, ret=%2%, http_body=%3%") % network_agent % ret % (*http_body); + } + return ret; +} + int NetworkAgent::get_printer_firmware(std::string dev_id, unsigned* http_code, std::string* http_body) { int ret = 0; diff --git a/src/slic3r/Utils/NetworkAgent.hpp b/src/slic3r/Utils/NetworkAgent.hpp index 60998c7737..d8f8e604b4 100644 --- a/src/slic3r/Utils/NetworkAgent.hpp +++ b/src/slic3r/Utils/NetworkAgent.hpp @@ -24,6 +24,7 @@ typedef int (*func_set_on_http_error_fn)(void *agent, OnHttpErrorFn fn); typedef int (*func_set_get_country_code_fn)(void *agent, GetCountryCodeFn fn); typedef int (*func_set_on_subscribe_failure_fn)(void *agent, GetSubscribeFailureFn fn); typedef int (*func_set_on_message_fn)(void *agent, OnMessageFn fn); +typedef int (*func_set_on_user_message_fn)(void *agent, OnMessageFn fn); typedef int (*func_set_on_local_connect_fn)(void *agent, OnLocalConnectedFn fn); typedef int (*func_set_on_local_message_fn)(void *agent, OnMessageFn fn); typedef int (*func_set_queue_on_main_fn)(void *agent, QueueOnMainFn fn); @@ -32,6 +33,11 @@ typedef bool (*func_is_server_connected)(void *agent); typedef int (*func_refresh_connection)(void *agent); typedef int (*func_start_subscribe)(void *agent, std::string module); typedef int (*func_stop_subscribe)(void *agent, std::string module); +typedef int (*func_add_subscribe)(void *agent, std::vector dev_list); +typedef int (*func_del_subscribe)(void *agent, std::vector dev_list); +typedef void (*func_enable_multi_machine)(void *agent, bool enable); +typedef int (*func_start_device_subscribe)(void* agent); +typedef int (*func_stop_device_subscribe)(void* agent); typedef int (*func_send_message)(void *agent, std::string dev_id, std::string json_str, int qos); typedef int (*func_connect_printer)(void *agent, std::string dev_id, std::string dev_ip, std::string username, std::string password, bool use_ssl); typedef int (*func_disconnect_printer)(void *agent); @@ -47,6 +53,8 @@ typedef std::string (*func_get_user_nickanme)(void *agent); typedef std::string (*func_build_login_cmd)(void *agent); typedef std::string (*func_build_logout_cmd)(void *agent); typedef std::string (*func_build_login_info)(void *agent); +typedef int (*func_get_model_id_from_desgin_id)(void *agent, std::string& desgin_id, std::string& model_id); +typedef int (*func_ping_bind)(void *agent, std::string ping_code); typedef int (*func_bind)(void *agent, std::string dev_ip, std::string dev_id, std::string sec_link, std::string timezone, bool improved, OnUpdateStatusFn update_fn); typedef int (*func_unbind)(void *agent, std::string dev_id); typedef std::string (*func_get_bambulab_host)(void *agent); @@ -67,6 +75,7 @@ typedef int (*func_set_extra_http_header)(void *agent, std::map dev_list); + int del_subscribe(std::vector dev_list); + void enable_multi_machine(bool enable); + int start_device_subscribe(); + int stop_device_subscribe(); int send_message(std::string dev_id, std::string json_str, int qos); int connect_printer(std::string dev_id, std::string dev_ip, std::string username, std::string password, bool use_ssl); int disconnect_printer(); @@ -150,7 +165,9 @@ public: std::string build_login_cmd(); std::string build_logout_cmd(); std::string build_login_info(); - int bind(std::string dev_ip, std::string dev_id, std::string sec_link, std::string timezone, bool improved, OnUpdateStatusFn update_fn); + int get_model_id_from_desgin_id(std::string& desgin_id, std::string& model_id); + int ping_bind(std::string ping_code); + int bind(std::string dev_ip, std::string dev_id, std::string sec_link, std::string timezone, bool improved, OnUpdateStatusFn update_fn); int unbind(std::string dev_id); std::string get_bambulab_host(); std::string get_user_selected_machine(); @@ -170,6 +187,7 @@ public: int get_my_message(int type, int after, int limit, unsigned int* http_code, std::string* http_body); int check_user_task_report(int* task_id, bool* printable); int get_user_print_info(unsigned int* http_code, std::string* http_body); + int get_user_tasks(TaskQueryParams params, std::string* http_body); int get_printer_firmware(std::string dev_id, unsigned* http_code, std::string* http_body); int get_task_plate_index(std::string task_id, int* plate_index); int get_user_info(int* identifier); @@ -218,6 +236,7 @@ private: static func_set_get_country_code_fn set_get_country_code_fn_ptr; static func_set_on_subscribe_failure_fn set_on_subscribe_failure_fn_ptr; static func_set_on_message_fn set_on_message_fn_ptr; + static func_set_on_user_message_fn set_on_user_message_fn_ptr; static func_set_on_local_connect_fn set_on_local_connect_fn_ptr; static func_set_on_local_message_fn set_on_local_message_fn_ptr; static func_set_queue_on_main_fn set_queue_on_main_fn_ptr; @@ -226,6 +245,11 @@ private: static func_refresh_connection refresh_connection_ptr; static func_start_subscribe start_subscribe_ptr; static func_stop_subscribe stop_subscribe_ptr; + static func_add_subscribe add_subscribe_ptr; + static func_del_subscribe del_subscribe_ptr; + static func_enable_multi_machine enable_multi_machine_ptr; + static func_start_device_subscribe start_device_subscribe_ptr; + static func_stop_device_subscribe stop_device_subscribe_ptr; static func_send_message send_message_ptr; static func_connect_printer connect_printer_ptr; static func_disconnect_printer disconnect_printer_ptr; @@ -241,6 +265,8 @@ private: static func_build_login_cmd build_login_cmd_ptr; static func_build_logout_cmd build_logout_cmd_ptr; static func_build_login_info build_login_info_ptr; + static func_get_model_id_from_desgin_id get_model_id_from_desgin_id_ptr; + static func_ping_bind ping_bind_ptr; static func_bind bind_ptr; static func_unbind unbind_ptr; static func_get_bambulab_host get_bambulab_host_ptr; @@ -261,6 +287,7 @@ private: static func_get_my_message get_my_message_ptr; static func_check_user_task_report check_user_task_report_ptr; static func_get_user_print_info get_user_print_info_ptr; + static func_get_user_tasks get_user_tasks_ptr; static func_get_printer_firmware get_printer_firmware_ptr; static func_get_task_plate_index get_task_plate_index_ptr; static func_get_user_info get_user_info_ptr; diff --git a/src/slic3r/Utils/ProfileDescription.hpp b/src/slic3r/Utils/ProfileDescription.hpp new file mode 100644 index 0000000000..db14c27c58 --- /dev/null +++ b/src/slic3r/Utils/ProfileDescription.hpp @@ -0,0 +1,36 @@ +#include +#include +#ifndef _L +#define _L(s) Slic3r::I18N::translate(s) +#endif + +namespace ProfileDescrption { + const std::string PROFILE_DESCRIPTION_0 = _L("It has a small layer height, and results in almost negligible layer lines and high printing quality. It is suitable for most general printing cases."); + const std::string PROFILE_DESCRIPTION_1 = _L("Compared with the default profile of a 0.2 mm nozzle, it has lower speeds and acceleration, and the sparse infill pattern is Gyroid. So, it results in much higher printing quality, but a much longer printing time."); + const std::string PROFILE_DESCRIPTION_2 = _L("Compared with the default profile of a 0.2 mm nozzle, it has a slightly bigger layer height, and results in almost negligible layer lines, and slightly shorter printing time."); + const std::string PROFILE_DESCRIPTION_3 = _L("Compared with the default profile of a 0.2 mm nozzle, it has a bigger layer height, and results in slightly visible layer lines, but shorter printing time."); + const std::string PROFILE_DESCRIPTION_4 = _L("Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer height, and results in almost invisible layer lines and higher printing quality, but shorter printing time."); + const std::string PROFILE_DESCRIPTION_5 = _L("Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer lines, lower speeds and acceleration, and the sparse infill pattern is Gyroid. So, it results in almost invisible layer lines and much higher printing quality, but much longer printing time."); + const std::string PROFILE_DESCRIPTION_6 = _L("Compared with the default profile of 0.2 mm nozzle, it has a smaller layer height, and results in minimal layer lines and higher printing quality, but shorter printing time."); + const std::string PROFILE_DESCRIPTION_7 = _L("Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer lines, lower speeds and acceleration, and the sparse infill pattern is Gyroid. So, it results in minimal layer lines and much higher printing quality, but much longer printing time."); + const std::string PROFILE_DESCRIPTION_8 = _L("It has a general layer height, and results in general layer lines and printing quality. It is suitable for most general printing cases."); + const std::string PROFILE_DESCRIPTION_9 = _L("Compared with the default profile of a 0.4 mm nozzle, it has more wall loops and a higher sparse infill density. So, it results in higher strength of the prints, but more filament consumption and longer printing time."); + const std::string PROFILE_DESCRIPTION_10 = _L("Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer height, and results in more apparent layer lines and lower printing quality, but slightly shorter printing time."); + const std::string PROFILE_DESCRIPTION_11 = _L("Compared with the default profile of a 0.4 mm nozzle, it has a bigger layer height, and results in more apparent layer lines and lower printing quality, but shorter printing time."); + const std::string PROFILE_DESCRIPTION_12 = _L("Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer height, and results in less apparent layer lines and higher printing quality, but longer printing time."); + const std::string PROFILE_DESCRIPTION_13 = _L("Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer height, lower speeds and acceleration, and the sparse infill pattern is Gyroid. So, it results in less apparent layer lines and much higher printing quality, but much longer printing time."); + const std::string PROFILE_DESCRIPTION_14 = _L("Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer height, and results in almost negligible layer lines and higher printing quality, but longer printing time."); + const std::string PROFILE_DESCRIPTION_15 = _L("Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer height, lower speeds and acceleration, and the sparse infill pattern is Gyroid. So, it results in almost negligible layer lines and much higher printing quality, but much longer printing time."); + const std::string PROFILE_DESCRIPTION_16 = _L("Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer height, and results in almost negligible layer lines and longer printing time."); + const std::string PROFILE_DESCRIPTION_17 = _L("It has a big layer height, and results in apparent layer lines and ordinary printing quality and printing time."); + const std::string PROFILE_DESCRIPTION_18 = _L("Compared with the default profile of a 0.6 mm nozzle, it has more wall loops and a higher sparse infill density. So, it results in higher strength of the prints, but more filament consumption and longer printing time."); + const std::string PROFILE_DESCRIPTION_19 = _L("Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer height, and results in more apparent layer lines and lower printing quality, but shorter printing time in some printing cases."); + const std::string PROFILE_DESCRIPTION_20 = _L("Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer height, and results in much more apparent layer lines and much lower printing quality, but shorter printing time in some printing cases."); + const std::string PROFILE_DESCRIPTION_21 = _L("Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer height, and results in less apparent layer lines and slight higher printing quality, but longer printing time."); + const std::string PROFILE_DESCRIPTION_22 = _L("Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer height, and results in less apparent layer lines and higher printing quality, but longer printing time."); + const std::string PROFILE_DESCRIPTION_23 = _L("It has a very big layer height, and results in very apparent layer lines, low printing quality and general printing time."); + const std::string PROFILE_DESCRIPTION_24 = _L("Compared with the default profile of a 0.8 mm nozzle, it has a bigger layer height, and results in very apparent layer lines and much lower printing quality, but shorter printing time in some printing cases."); + const std::string PROFILE_DESCRIPTION_25 = _L("Compared with the default profile of a 0.8 mm nozzle, it has a much bigger layer height, and results in extremely apparent layer lines and much lower printing quality, but much shorter printing time in some printing cases."); + const std::string PROFILE_DESCRIPTION_26 = _L("Compared with the default profile of a 0.8 mm nozzle, it has a slightly smaller layer height, and results in slightly less but still apparent layer lines and slightly higher printing quality, but longer printing time in some printing cases."); + const std::string PROFILE_DESCRIPTION_27 = _L("Compared with the default profile of a 0.8 mm nozzle, it has a smaller layer height, and results in less but still apparent layer lines and slightly higher printing quality, but longer printing time in some printing cases."); +} \ No newline at end of file diff --git a/src/slic3r/Utils/bambu_networking.hpp b/src/slic3r/Utils/bambu_networking.hpp index 75e17f6b94..6d56cdb029 100644 --- a/src/slic3r/Utils/bambu_networking.hpp +++ b/src/slic3r/Utils/bambu_networking.hpp @@ -95,7 +95,7 @@ namespace BBL { #define BAMBU_NETWORK_LIBRARY "bambu_networking" #define BAMBU_NETWORK_AGENT_NAME "bambu_network_agent" -#define BAMBU_NETWORK_AGENT_VERSION "01.09.00.03" +#define BAMBU_NETWORK_AGENT_VERSION "01.09.01.01" //iot preset type strings #define IOT_PRINTER_TYPE_STRING "printer" @@ -147,6 +147,7 @@ enum SendingPrintJobStage { PrintingStageWaitPrinter = 5, PrintingStageFinished = 6, PrintingStageERROR = 7, + PrintingStageLimit = 8, }; enum PublishingStage { @@ -193,6 +194,7 @@ struct PrintParams { std::string origin_model_id; std::string print_type; std::string dst_file; + std::string dev_name; /* access options */ std::string dev_ip; @@ -212,6 +214,14 @@ struct PrintParams { std::string extra_options; }; +struct TaskQueryParams +{ + std::string dev_id; + int status = 0; + int offset = 0; + int limit = 20; +}; + struct PublishParams { std::string project_name; std::string project_3mf_file; diff --git a/version.inc b/version.inc index ff7e2d5dad..fbffbbac36 100644 --- a/version.inc +++ b/version.inc @@ -17,4 +17,4 @@ set(ORCA_VERSION_MAJOR ${CMAKE_MATCH_1}) set(ORCA_VERSION_MINOR ${CMAKE_MATCH_2}) set(ORCA_VERSION_PATCH ${CMAKE_MATCH_3}) -set(SLIC3R_VERSION "01.09.00.70") +set(SLIC3R_VERSION "01.09.01.58")