Merge branch 'main' into dev/bbl-network-upd

This commit is contained in:
Noisyfox
2025-06-25 08:49:55 +08:00
committed by GitHub
110 changed files with 4133 additions and 1751 deletions
+2 -4
View File
@@ -686,11 +686,9 @@ endif ()
find_path(SPNAV_INCLUDE_DIR spnav.h) find_path(SPNAV_INCLUDE_DIR spnav.h)
if (SPNAV_INCLUDE_DIR) if (SPNAV_INCLUDE_DIR)
find_library(HAVE_SPNAV spnav) find_library(SPNAV_LIB NAMES libspnav.a) # Force linking libspnav statically
if (HAVE_SPNAV) if (SPNAV_LIB)
add_definitions(-DHAVE_SPNAV) add_definitions(-DHAVE_SPNAV)
add_library(libspnav SHARED IMPORTED)
target_link_libraries(libspnav INTERFACE spnav)
message(STATUS "SPNAV library found") message(STATUS "SPNAV library found")
else() else()
message(STATUS "SPNAV library NOT found, Spacenavd not supported") message(STATUS "SPNAV library NOT found, Spacenavd not supported")
+12 -6
View File
@@ -6342,6 +6342,12 @@ msgstr ""
msgid "If enabled, use free camera. If not enabled, use constrained camera." msgid "If enabled, use free camera. If not enabled, use constrained camera."
msgstr "" msgstr ""
msgid "Swap pan and rotate mouse buttons"
msgstr ""
msgid "If enabled, swaps the left and right mouse buttons pan and rotate functions."
msgstr ""
msgid "Reverse mouse zoom" msgid "Reverse mouse zoom"
msgstr "" msgstr ""
@@ -11517,7 +11523,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice " "extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n" "versa.\n"
"\n" "\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec " "It defines the maximum rate by which the extruded volumetric flow in mm³/s² "
"can change over time. Higher values mean higher extrusion rate changes are " "can change over time. Higher values mean higher extrusion rate changes are "
"allowed, resulting in faster speed transitions.\n" "allowed, resulting in faster speed transitions.\n"
"\n" "\n"
@@ -11527,13 +11533,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some " "Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For " "marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these " "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 " "cases a high value of around 300-350 mm³/s² is recommended as this allows "
"just enough smoothing to assist pressure advance achieve a smoother flow " "for just enough smoothing to assist pressure advance achieve a smoother flow "
"transition.\n" "transition.\n"
"\n" "\n"
"For slower printers without pressure advance, the value should be set much " "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 " "lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n" "extruders and 5-10 mm³/s² for Bowden style.\n"
"\n" "\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n" "This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n" "\n"
@@ -12952,7 +12958,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed " "the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\n" "on the wipe tower.\n"
"\n" "\n"
"Before increasing this parameter beyond the default of 90mm/sec, make sure " "Before increasing this parameter beyond the default of 90 mm/s, make sure "
"your printer can reliably bridge at the increased speeds and that ooze when " "your printer can reliably bridge at the increased speeds and that ooze when "
"tool changing is well controlled.\n" "tool changing is well controlled.\n"
"\n" "\n"
+16 -9
View File
@@ -6872,6 +6872,12 @@ msgstr ""
"Si està activat, fa servir la càmera lliure. Si no està activat, fa servir " "Si està activat, fa servir la càmera lliure. Si no està activat, fa servir "
"la càmera restringida." "la càmera restringida."
msgid "Swap pan and rotate mouse buttons"
msgstr "Intercanviar la panoràmica i girar els botons del ratolí"
msgid "If enabled, swaps the left and right mouse buttons pan and rotate functions."
msgstr "Si està activat, intercanvia les funcions de panoràmica i rotació dels botons esquerre i dret del ratolí."
msgid "Reverse mouse zoom" msgid "Reverse mouse zoom"
msgstr "Zoom invers del ratolí" msgstr "Zoom invers del ratolí"
@@ -13264,7 +13270,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice " "extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n" "versa.\n"
"\n" "\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec " "It defines the maximum rate by which the extruded volumetric flow in mm³/s² "
"can change over time. Higher values mean higher extrusion rate changes are " "can change over time. Higher values mean higher extrusion rate changes are "
"allowed, resulting in faster speed transitions.\n" "allowed, resulting in faster speed transitions.\n"
"\n" "\n"
@@ -13274,13 +13280,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some " "Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For " "marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these " "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 " "cases a high value of around 300-350 mm³/s² is recommended as this allows "
"just enough smoothing to assist pressure advance achieve a smoother flow " "for just enough smoothing to assist pressure advance achieve a smoother flow "
"transition.\n" "transition.\n"
"\n" "\n"
"For slower printers without pressure advance, the value should be set much " "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 " "lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n" "extruders and 5-10 mm³/s² for Bowden style.\n"
"\n" "\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n" "This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n" "\n"
@@ -13303,13 +13309,13 @@ msgstr ""
"això, pot proporcionar algun benefici marginal en certs casos en què les " "això, pot proporcionar algun benefici marginal en certs casos en què les "
"velocitats de les característiques varien molt. Per exemple, quan hi ha " "velocitats de les característiques varien molt. Per exemple, quan hi ha "
"desacceleracions agressives a causa dels voladissos. En aquests casos es " "desacceleracions agressives a causa dels voladissos. En aquests casos es "
"recomana un valor elevat d'uns 300-350mm3/s2, ja que això permet un " "recomana un valor elevat d'uns 300-350 mm³/s², ja que això permet un "
"suavitzat suficient per ajudar a avançar la pressió a aconseguir una " "suavitzat suficient per ajudar a avançar la pressió a aconseguir una "
"transició de flux més suau.\n" "transició de flux més suau.\n"
"\n" "\n"
"Per a impressores més lentes sense Avanç de Pressió, el valor s'ha " "Per a impressores més lentes sense Avanç de Pressió, el valor s'ha "
"d'establir molt més baix. Un valor de 10-15mm3/s2 és un bon punt de partida " "d'establir molt més baix. Un valor de 10-15 mm³/s² és un bon punt de partida "
"per als extrusors d'extrusió directa i 5-10mm3/s2 per al tipus Bowden.\n" "per als extrusors d'extrusió directa i 5-10 mm³/s² per al tipus Bowden.\n"
"\n" "\n"
"Aquesta característica es coneix com a Equalitzador de Pressió a Prusa " "Aquesta característica es coneix com a Equalitzador de Pressió a Prusa "
"slicer.\n" "slicer.\n"
@@ -15126,6 +15132,7 @@ msgstr ""
msgid "Maximum wipe tower print speed" msgid "Maximum wipe tower print speed"
msgstr "Velocitat màxima d'impressió de la torre de purga" msgstr "Velocitat màxima d'impressió de la torre de purga"
#, fuzzy
msgid "" msgid ""
"The maximum print speed when purging in the wipe tower and printing the wipe " "The maximum print speed when purging in the wipe tower and printing the wipe "
"tower sparse layers. When purging, if the sparse infill speed or calculated " "tower sparse layers. When purging, if the sparse infill speed or calculated "
@@ -15140,7 +15147,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed " "the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\n" "on the wipe tower.\n"
"\n" "\n"
"Before increasing this parameter beyond the default of 90mm/sec, make sure " "Before increasing this parameter beyond the default of 90 mm/s, make sure "
"your printer can reliably bridge at the increased speeds and that ooze when " "your printer can reliably bridge at the increased speeds and that ooze when "
"tool changing is well controlled.\n" "tool changing is well controlled.\n"
"\n" "\n"
+18 -12
View File
@@ -6698,17 +6698,23 @@ msgstr ""
"Pokud je povoleno, použijte volnou kameru. Pokud není povoleno, použijte " "Pokud je povoleno, použijte volnou kameru. Pokud není povoleno, použijte "
"omezenou kameru." "omezenou kameru."
msgid "Swap pan and rotate mouse buttons"
msgstr "Prohodit tlačítka pro posouvání a otáčení myši"
msgid "If enabled, swaps the left and right mouse buttons pan and rotate functions."
msgstr "Pokud je tato možnost povolena, prohodí levé a pravé tlačítko myši pro funkce posouvání a otáčení."
msgid "Reverse mouse zoom" msgid "Reverse mouse zoom"
msgstr "" msgstr "Zvětšení/zmenšení myší v opačném směru"
msgid "If enabled, reverses the direction of zoom with mouse wheel." msgid "If enabled, reverses the direction of zoom with mouse wheel."
msgstr "" msgstr "Pokud je povoleno, obrací směr přiblížení kolečkem myši."
msgid "Show splash screen" msgid "Show splash screen"
msgstr "Zobrazovat úvodní obrazovku" msgstr "Zobrazovat úvodní obrazovku"
msgid "Show the splash screen during startup." msgid "Show the splash screen during startup."
msgstr "" msgstr "Zobrazit úvodní obrazovku během spuštění."
msgid "Show \"Tip of the day\" notification after start" msgid "Show \"Tip of the day\" notification after start"
msgstr "Zobrazovat \"Tip dne\" po spuštění" msgstr "Zobrazovat \"Tip dne\" po spuštění"
@@ -12375,7 +12381,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice " "extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n" "versa.\n"
"\n" "\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec " "It defines the maximum rate by which the extruded volumetric flow in mm³/s² "
"can change over time. Higher values mean higher extrusion rate changes are " "can change over time. Higher values mean higher extrusion rate changes are "
"allowed, resulting in faster speed transitions.\n" "allowed, resulting in faster speed transitions.\n"
"\n" "\n"
@@ -12385,13 +12391,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some " "Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For " "marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these " "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 " "cases a high value of around 300-350 mm³/s² is recommended as this allows "
"just enough smoothing to assist pressure advance achieve a smoother flow " "for just enough smoothing to assist pressure advance achieve a smoother flow "
"transition.\n" "transition.\n"
"\n" "\n"
"For slower printers without pressure advance, the value should be set much " "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 " "lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n" "extruders and 5-10 mm³/s² for Bowden style.\n"
"\n" "\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n" "This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n" "\n"
@@ -12411,13 +12417,13 @@ msgstr ""
"lab nebo Voron) tato hodnota obvykle není potřebná. Nicméně v některých " "lab nebo Voron) tato hodnota obvykle není potřebná. Nicméně v některých "
"případech, kde se rychlosti funkcí výrazně liší, může poskytnout marginální " "případech, kde se rychlosti funkcí výrazně liší, může poskytnout marginální "
"přínos. Například při agresivních zpomaleních způsobených přesahy. V těchto " "přínos. Například při agresivních zpomaleních způsobených přesahy. V těchto "
"případech se doporučuje vysoká hodnota kolem 300-350 mm3/s2, protože to " "případech se doporučuje vysoká hodnota kolem 300-350 mm³/s², protože to "
"umožňuje dostatečné vyhlazení pro pomoc při dosažení plynulejšího přechodu " "umožňuje dostatečné vyhlazení pro pomoc při dosažení plynulejšího přechodu "
"tlaku při extruzi.\n" "tlaku při extruzi.\n"
"\n" "\n"
"Pro pomalejší tiskárny bez tlakového předstihu by měla být hodnota nastavena " "Pro pomalejší tiskárny bez tlakového předstihu by měla být hodnota nastavena "
"mnohem nižší. Pro přímé pohony je hodnota 10-15 mm3/s2 dobrým výchozím " "mnohem nižší. Pro přímé pohony je hodnota 10-15 mm³/s² dobrým výchozím "
"bodem, a pro styl Bowden 5-10 mm3/s2.\n" "bodem, a pro styl Bowden 5-10 mm³/s².\n"
"\n" "\n"
"Tato funkce je známa jako Pressure Equalizer v programu Prusa Slicer.\n" "Tato funkce je známa jako Pressure Equalizer v programu Prusa Slicer.\n"
"\n" "\n"
@@ -14031,7 +14037,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed " "the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\n" "on the wipe tower.\n"
"\n" "\n"
"Before increasing this parameter beyond the default of 90mm/sec, make sure " "Before increasing this parameter beyond the default of 90 mm/s, make sure "
"your printer can reliably bridge at the increased speeds and that ooze when " "your printer can reliably bridge at the increased speeds and that ooze when "
"tool changing is well controlled.\n" "tool changing is well controlled.\n"
"\n" "\n"
+14 -8
View File
@@ -6939,6 +6939,12 @@ msgstr "Freie Kamera verwenden"
msgid "If enabled, use free camera. If not enabled, use constrained camera." msgid "If enabled, use free camera. If not enabled, use constrained camera."
msgstr "Wenn aktiviert, wird die freie Kamera verwendet." msgstr "Wenn aktiviert, wird die freie Kamera verwendet."
msgid "Swap pan and rotate mouse buttons"
msgstr "Schwenk- und Dreh-Maustasten vertauschen"
msgid "If enabled, swaps the left and right mouse buttons pan and rotate functions."
msgstr "Wenn aktiviert, werden die Schwenk- und Drehfunktionen der linken und rechten Maustaste vertauscht."
msgid "Reverse mouse zoom" msgid "Reverse mouse zoom"
msgstr "Maus-Zoom umkehren" msgstr "Maus-Zoom umkehren"
@@ -13372,7 +13378,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice " "extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n" "versa.\n"
"\n" "\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec " "It defines the maximum rate by which the extruded volumetric flow in mm³/s² "
"can change over time. Higher values mean higher extrusion rate changes are " "can change over time. Higher values mean higher extrusion rate changes are "
"allowed, resulting in faster speed transitions.\n" "allowed, resulting in faster speed transitions.\n"
"\n" "\n"
@@ -13382,13 +13388,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some " "Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For " "marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these " "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 " "cases a high value of around 300-350 mm³/s² is recommended as this allows "
"just enough smoothing to assist pressure advance achieve a smoother flow " "for just enough smoothing to assist pressure advance achieve a smoother flow "
"transition.\n" "transition.\n"
"\n" "\n"
"For slower printers without pressure advance, the value should be set much " "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 " "lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n" "extruders and 5-10 mm³/s² for Bowden style.\n"
"\n" "\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n" "This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n" "\n"
@@ -13411,7 +13417,7 @@ msgstr ""
"erforderlich. Er kann jedoch in bestimmten Fällen einen geringfügigen " "erforderlich. Er kann jedoch in bestimmten Fällen einen geringfügigen "
"Vorteil bieten, in denen sich die Funktionen stark unterscheiden. Zum " "Vorteil bieten, in denen sich die Funktionen stark unterscheiden. Zum "
"Beispiel, wenn es aggressive Verlangsamungen aufgrund von Überhängen gibt. " "Beispiel, wenn es aggressive Verlangsamungen aufgrund von Überhängen gibt. "
"In diesen Fällen wird ein hoher Wert von ca. 300-350mm3/s2 empfohlen, da " "In diesen Fällen wird ein hoher Wert von ca. 300-350 mm³/s² empfohlen, da "
msgid "mm³/s²" msgid "mm³/s²"
msgstr "" msgstr ""
@@ -15244,7 +15250,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed " "the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\n" "on the wipe tower.\n"
"\n" "\n"
"Before increasing this parameter beyond the default of 90mm/sec, make sure " "Before increasing this parameter beyond the default of 90 mm/s, make sure "
"your printer can reliably bridge at the increased speeds and that ooze when " "your printer can reliably bridge at the increased speeds and that ooze when "
"tool changing is well controlled.\n" "tool changing is well controlled.\n"
"\n" "\n"
@@ -19600,7 +19606,7 @@ msgstr ""
#~ "is lower, the lowest speed will be used instead.\n" #~ "is lower, the lowest speed will be used instead.\n"
#~ "Increasing this speed may affect the tower's stability, as purging can be " #~ "Increasing this speed may affect the tower's stability, as purging can be "
#~ "performed over sparse layers. Before increasing this parameter beyond the " #~ "performed over sparse layers. Before increasing this parameter beyond the "
#~ "default of 90mm/sec, make sure your printer can reliably bridge at the " #~ "default of 90 mm/s, make sure your printer can reliably bridge at the "
#~ "increased speeds." #~ "increased speeds."
#~ msgstr "" #~ msgstr ""
#~ "Die maximale Druckgeschwindigkeit beim Reinigen im Reinigungsturm. Wenn " #~ "Die maximale Druckgeschwindigkeit beim Reinigen im Reinigungsturm. Wenn "
+11 -5
View File
@@ -6454,6 +6454,12 @@ msgstr ""
msgid "If enabled, use free camera. If not enabled, use constrained camera." msgid "If enabled, use free camera. If not enabled, use constrained camera."
msgstr "" msgstr ""
msgid "Swap pan and rotate mouse buttons"
msgstr ""
msgid "If enabled, swaps the left and right mouse buttons pan and rotate functions."
msgstr ""
msgid "Reverse mouse zoom" msgid "Reverse mouse zoom"
msgstr "" msgstr ""
@@ -11851,7 +11857,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice " "extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n" "versa.\n"
"\n" "\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec " "It defines the maximum rate by which the extruded volumetric flow in mm³/s² "
"can change over time. Higher values mean higher extrusion rate changes are " "can change over time. Higher values mean higher extrusion rate changes are "
"allowed, resulting in faster speed transitions.\n" "allowed, resulting in faster speed transitions.\n"
"\n" "\n"
@@ -11861,13 +11867,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some " "Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For " "marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these " "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 " "cases a high value of around 300-350 mm³/s² is recommended as this allows "
"for just enough smoothing to assist pressure advance achieve a smoother flow " "for just enough smoothing to assist pressure advance achieve a smoother flow "
"transition.\n" "transition.\n"
"\n" "\n"
"For slower printers without pressure advance, the value should be set much " "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 " "lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n" "extruders and 5-10 mm³/s² for Bowden style.\n"
"\n" "\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n" "This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n" "\n"
@@ -13356,7 +13362,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed " "the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\n" "on the wipe tower.\n"
"\n" "\n"
"Before increasing this parameter beyond the default of 90mm/sec, make sure " "Before increasing this parameter beyond the default of 90 mm/s, make sure "
"your printer can reliably bridge at the increased speeds and that ooze when " "your printer can reliably bridge at the increased speeds and that ooze when "
"tool changing is well controlled.\n" "tool changing is well controlled.\n"
"\n" "\n"
+17 -11
View File
@@ -6893,6 +6893,12 @@ msgstr ""
"Si está activada, utiliza la cámara libre. Si no está activada, utiliza la " "Si está activada, utiliza la cámara libre. Si no está activada, utiliza la "
"cámara restringida." "cámara restringida."
msgid "Swap pan and rotate mouse buttons"
msgstr "Intercambiar los botones de panorámica y rotación del mouse"
msgid "If enabled, swaps the left and right mouse buttons pan and rotate functions."
msgstr "Si está habilitado, intercambia las funciones de panorámica y rotación de los botones izquierdo y derecho del mouse."
msgid "Reverse mouse zoom" msgid "Reverse mouse zoom"
msgstr "Invertir el zoom del ratón" msgstr "Invertir el zoom del ratón"
@@ -13141,7 +13147,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice " "extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n" "versa.\n"
"\n" "\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec " "It defines the maximum rate by which the extruded volumetric flow in mm³/s² "
"can change over time. Higher values mean higher extrusion rate changes are " "can change over time. Higher values mean higher extrusion rate changes are "
"allowed, resulting in faster speed transitions.\n" "allowed, resulting in faster speed transitions.\n"
"\n" "\n"
@@ -13151,13 +13157,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some " "Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For " "marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these " "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 " "cases a high value of around 300-350 mm³/s² is recommended as this allows "
"just enough smoothing to assist pressure advance achieve a smoother flow " "for just enough smoothing to assist pressure advance achieve a smoother flow "
"transition.\n" "transition.\n"
"\n" "\n"
"For slower printers without pressure advance, the value should be set much " "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 " "lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n" "extruders and 5-10 mm³/s² for Bowden style.\n"
"\n" "\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n" "This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n" "\n"
@@ -13168,7 +13174,7 @@ msgstr ""
"(alta velocidad/ancho mayor) a una extrusión de menor flujo (menor velocidad/" "(alta velocidad/ancho mayor) a una extrusión de menor flujo (menor velocidad/"
"ancho menor) y viceversa.\n" "ancho menor) y viceversa.\n"
"\n" "\n"
"Define la velocidad máxima a la que el flujo volumétrico extruido en mm3/seg " "Define la velocidad máxima a la que el flujo volumétrico extruido en mm³/s² "
"puede cambiar con el tiempo. Valores más altos significan que se permiten " "puede cambiar con el tiempo. Valores más altos significan que se permiten "
"cambios de velocidad de extrusión más altos, lo que resulta en transiciones " "cambios de velocidad de extrusión más altos, lo que resulta en transiciones "
"de velocidad más rápidas.\n" "de velocidad más rápidas.\n"
@@ -13180,13 +13186,13 @@ msgstr ""
"embargo, puede proporcionar algún beneficio marginal en ciertos casos en los " "embargo, puede proporcionar algún beneficio marginal en ciertos casos en los "
"que las velocidades de las características varían mucho. Por ejemplo, cuando " "que las velocidades de las características varían mucho. Por ejemplo, cuando "
"hay ralentizaciones agresivas debidas a voladizos. En estos casos, se " "hay ralentizaciones agresivas debidas a voladizos. En estos casos, se "
"recomienda un valor alto de alrededor de 300-350 mm3/s2, ya que esto permite " "recomienda un valor alto de alrededor de 300-350 mm³/s², ya que esto permite "
"el suavizado suficiente para ayudar al avance de presión a lograr una " "el suavizado suficiente para ayudar al avance de presión a lograr una "
"transición de flujo más suave.\n" "transición de flujo más suave.\n"
"\n" "\n"
"Para impresoras más lentas sin avance de presión, el valor debe fijarse " "Para impresoras más lentas sin avance de presión, el valor debe fijarse "
"mucho más bajo. Un valor de 10-15mm3/s2 es un buen punto de partida para " "mucho más bajo. Un valor de 10-15 mm³/s² es un buen punto de partida para "
"extrusoras de accionamiento directo y de 5-10mm3/s2 para las de estilo " "extrusoras de accionamiento directo y de 5-10 mm³/s² para las de estilo "
"Bowden.\n" "Bowden.\n"
"\n" "\n"
"Esta característica es conocida como Pressure Equalizer en Prusa slicer.\n" "Esta característica es conocida como Pressure Equalizer en Prusa slicer.\n"
@@ -14995,7 +15001,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed " "the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\n" "on the wipe tower.\n"
"\n" "\n"
"Before increasing this parameter beyond the default of 90mm/sec, make sure " "Before increasing this parameter beyond the default of 90 mm/s, make sure "
"your printer can reliably bridge at the increased speeds and that ooze when " "your printer can reliably bridge at the increased speeds and that ooze when "
"tool changing is well controlled.\n" "tool changing is well controlled.\n"
"\n" "\n"
@@ -15016,7 +15022,7 @@ msgstr ""
"aumentar la fuerza con la que la boquilla colisiona con las acummulaciones " "aumentar la fuerza con la que la boquilla colisiona con las acummulaciones "
"que se hayan podido formar en la torre de purga.\n" "que se hayan podido formar en la torre de purga.\n"
"\n" "\n"
"Antes de aumentar este parámetro más allá del valor por defecto de 90mm/seg, " "Antes de aumentar este parámetro más allá del valor por defecto de 90mm/s, "
"asegúrese de que su impresora puede puentear de forma fiable a las " "asegúrese de que su impresora puede puentear de forma fiable a las "
"velocidades aumentadas y que el rezume al cambiar de cabezal está bien " "velocidades aumentadas y que el rezume al cambiar de cabezal está bien "
"controlado.\n" "controlado.\n"
+20 -13
View File
@@ -6935,6 +6935,12 @@ msgstr ""
"Si activée, utilise la caméra libre. Si désactivée, utilise la caméra " "Si activée, utilise la caméra libre. Si désactivée, utilise la caméra "
"contrainte." "contrainte."
msgid "Swap pan and rotate mouse buttons"
msgstr "Échanger les boutons de panoramique et de rotation de la souris"
msgid "If enabled, swaps the left and right mouse buttons pan and rotate functions."
msgstr "Si cette option est activée, les fonctions de panoramique et de rotation des boutons gauche et droit de la souris sont échangées."
msgid "Reverse mouse zoom" msgid "Reverse mouse zoom"
msgstr "Inverser le zoom de la souris" msgstr "Inverser le zoom de la souris"
@@ -13441,7 +13447,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice " "extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n" "versa.\n"
"\n" "\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec " "It defines the maximum rate by which the extruded volumetric flow in mm³/s² "
"can change over time. Higher values mean higher extrusion rate changes are " "can change over time. Higher values mean higher extrusion rate changes are "
"allowed, resulting in faster speed transitions.\n" "allowed, resulting in faster speed transitions.\n"
"\n" "\n"
@@ -13451,13 +13457,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some " "Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For " "marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these " "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 " "cases a high value of around 300-350 mm³/s² is recommended as this allows "
"just enough smoothing to assist pressure advance achieve a smoother flow " "for just enough smoothing to assist pressure advance achieve a smoother flow "
"transition.\n" "transition.\n"
"\n" "\n"
"For slower printers without pressure advance, the value should be set much " "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 " "lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n" "extruders and 5-10 mm³/s² for Bowden style.\n"
"\n" "\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n" "This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n" "\n"
@@ -13468,7 +13474,7 @@ msgstr ""
"élevée / largeur de ligne plus grande) à une extrusion à débit plus faible " "élevée / largeur de ligne plus grande) à une extrusion à débit plus faible "
"(vitesse plus faible / largeur de ligne plus petite) et vice versa.\n" "(vitesse plus faible / largeur de ligne plus petite) et vice versa.\n"
"\n" "\n"
"Il définit le taux maximum auquel le débit volumétrique extrudé en mm3/sec " "Il définit le taux maximum auquel le débit volumétrique extrudé en mm³/s² "
"peut varier dans le temps. Des valeurs plus élevées signifient que des " "peut varier dans le temps. Des valeurs plus élevées signifient que des "
"changements du taux d’extrusion plus élevés sont autorisés, ce qui entraîne " "changements du taux d’extrusion plus élevés sont autorisés, ce qui entraîne "
"des transitions de vitesse plus rapides.\n" "des transitions de vitesse plus rapides.\n"
@@ -13480,13 +13486,13 @@ msgstr ""
"Cependant, cela peut apporter un avantage marginal dans certains cas où les " "Cependant, cela peut apporter un avantage marginal dans certains cas où les "
"vitesses varient considérablement. Par exemple, en cas de ralentissements " "vitesses varient considérablement. Par exemple, en cas de ralentissements "
"agressifs dus à des surplombs. Dans ces cas, une valeur élevée d’environ " "agressifs dus à des surplombs. Dans ces cas, une valeur élevée d’environ "
"300-350 mm3/s2 est recommandée car elle permet un lissage juste suffisant " "300-350 mm³/s² est recommandée car elle permet un lissage juste suffisant "
"pour aider l’augmentation de la pression pour obtenir une transition de " "pour aider l’augmentation de la pression pour obtenir une transition de "
"débit plus douce.\n" "débit plus douce.\n"
"\n" "\n"
"Pour les imprimantes plus lentes sans fonction de pressure advance, la " "Pour les imprimantes plus lentes sans fonction de pressure advance, la "
"valeur doit être réglée beaucoup plus bas. Une valeur de 10-15 mm3/s2 est un " "valeur doit être réglée beaucoup plus bas. Une valeur de 10-15 mm³/s² est un "
"bon point de départ en direct drive et de 5-10 mm3/s2 en Bowden.\n" "bon point de départ en direct drive et de 5-10 mm³/s² en Bowden.\n"
"\n" "\n"
"Cette fonctionnalité est connue sous le nom de Pressure Equalizer dans Prusa " "Cette fonctionnalité est connue sous le nom de Pressure Equalizer dans Prusa "
"Slicer.\n" "Slicer.\n"
@@ -15323,6 +15329,7 @@ msgstr ""
msgid "Maximum wipe tower print speed" msgid "Maximum wipe tower print speed"
msgstr "Vitesse maximale d’impression de la tour d’essuyage" msgstr "Vitesse maximale d’impression de la tour d’essuyage"
#, fuzzy
msgid "" msgid ""
"The maximum print speed when purging in the wipe tower and printing the wipe " "The maximum print speed when purging in the wipe tower and printing the wipe "
"tower sparse layers. When purging, if the sparse infill speed or calculated " "tower sparse layers. When purging, if the sparse infill speed or calculated "
@@ -15337,7 +15344,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed " "the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\n" "on the wipe tower.\n"
"\n" "\n"
"Before increasing this parameter beyond the default of 90mm/sec, make sure " "Before increasing this parameter beyond the default of 90 mm/s, make sure "
"your printer can reliably bridge at the increased speeds and that ooze when " "your printer can reliably bridge at the increased speeds and that ooze when "
"tool changing is well controlled.\n" "tool changing is well controlled.\n"
"\n" "\n"
@@ -15358,7 +15365,7 @@ msgstr ""
"augmenter la force avec laquelle la buse entre en collision avec les blobs " "augmenter la force avec laquelle la buse entre en collision avec les blobs "
"qui peuvent s’être formés sur la tour d’essuyage.\n" "qui peuvent s’être formés sur la tour d’essuyage.\n"
"\n" "\n"
"Avant d’augmenter ce paramètre au-delà de la valeur par défaut de 90 mm/sec, " "Avant d’augmenter ce paramètre au-delà de la valeur par défaut de 90 mm/s, "
"assurez-vous que votre imprimante peut effectuer un pontage fiable à des " "assurez-vous que votre imprimante peut effectuer un pontage fiable à des "
"vitesses élevées et que le suintement lors du changement d’outil est bien " "vitesses élevées et que le suintement lors du changement d’outil est bien "
"contrôlé.\n" "contrôlé.\n"
@@ -19841,7 +19848,7 @@ msgstr ""
#~ "is lower, the lowest speed will be used instead.\n" #~ "is lower, the lowest speed will be used instead.\n"
#~ "Increasing this speed may affect the tower's stability, as purging can be " #~ "Increasing this speed may affect the tower's stability, as purging can be "
#~ "performed over sparse layers. Before increasing this parameter beyond the " #~ "performed over sparse layers. Before increasing this parameter beyond the "
#~ "default of 90mm/sec, make sure your printer can reliably bridge at the " #~ "default of 90 mm/s, make sure your printer can reliably bridge at the "
#~ "increased speeds." #~ "increased speeds."
#~ msgstr "" #~ msgstr ""
#~ "Vitesse d’impression maximale lors de la purge dans la tour d’essuyage. " #~ "Vitesse d’impression maximale lors de la purge dans la tour d’essuyage. "
@@ -19850,7 +19857,7 @@ msgstr ""
#~ "vitesse la plus basse qui sera utilisée.\n" #~ "vitesse la plus basse qui sera utilisée.\n"
#~ "L’augmentation de cette vitesse peut affecter la stabilité de la tour, " #~ "L’augmentation de cette vitesse peut affecter la stabilité de la tour, "
#~ "car la purge peut être effectuée sur des couches peu épaisses. Avant " #~ "car la purge peut être effectuée sur des couches peu épaisses. Avant "
#~ "d’augmenter ce paramètre au-delà de la valeur par défaut de 90 mm/sec, " #~ "d’augmenter ce paramètre au-delà de la valeur par défaut de 90 mm/s, "
#~ "assurez-vous que votre imprimante peut effectuer un pontage fiable aux " #~ "assurez-vous que votre imprimante peut effectuer un pontage fiable aux "
#~ "vitesses accrues." #~ "vitesses accrues."
+12 -6
View File
@@ -6614,6 +6614,12 @@ msgstr ""
"Ha engedélyezve van, szabad kamerát használ. Ha nincs engedélyezve, akkor " "Ha engedélyezve van, szabad kamerát használ. Ha nincs engedélyezve, akkor "
"kötött kamerát használ." "kötött kamerát használ."
msgid "Swap pan and rotate mouse buttons"
msgstr "Felcserélt pásztázás és forgatás egérgombok"
msgid "If enabled, swaps the left and right mouse buttons pan and rotate functions."
msgstr "Ha engedélyezve van, felcseréli a bal és jobb egérgomb pásztázási és forgatási funkcióit."
msgid "Reverse mouse zoom" msgid "Reverse mouse zoom"
msgstr "" msgstr ""
@@ -12170,7 +12176,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice " "extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n" "versa.\n"
"\n" "\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec " "It defines the maximum rate by which the extruded volumetric flow in mm³/s² "
"can change over time. Higher values mean higher extrusion rate changes are " "can change over time. Higher values mean higher extrusion rate changes are "
"allowed, resulting in faster speed transitions.\n" "allowed, resulting in faster speed transitions.\n"
"\n" "\n"
@@ -12180,13 +12186,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some " "Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For " "marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these " "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 " "cases a high value of around 300-350 mm³/s² is recommended as this allows "
"just enough smoothing to assist pressure advance achieve a smoother flow " "for just enough smoothing to assist pressure advance achieve a smoother flow "
"transition.\n" "transition.\n"
"\n" "\n"
"For slower printers without pressure advance, the value should be set much " "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 " "lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n" "extruders and 5-10 mm³/s² for Bowden style.\n"
"\n" "\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n" "This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n" "\n"
@@ -13760,7 +13766,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed " "the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\n" "on the wipe tower.\n"
"\n" "\n"
"Before increasing this parameter beyond the default of 90mm/sec, make sure " "Before increasing this parameter beyond the default of 90 mm/s, make sure "
"your printer can reliably bridge at the increased speeds and that ooze when " "your printer can reliably bridge at the increased speeds and that ooze when "
"tool changing is well controlled.\n" "tool changing is well controlled.\n"
"\n" "\n"
+21 -17
View File
@@ -6894,13 +6894,17 @@ msgid "If enabled, use free camera. If not enabled, use constrained camera."
msgstr "" msgstr ""
"Se abilitato, usa la visuale libera. Altrimenti, usa la visuale vincolata." "Se abilitato, usa la visuale libera. Altrimenti, usa la visuale vincolata."
msgid "Swap pan and rotate mouse buttons"
msgstr "Scambia i pulsanti del mouse per ruotare e spostare"
msgid "If enabled, swaps the left and right mouse buttons pan and rotate functions."
msgstr "Se abilitato, inverte le funzioni di panoramica e rotazione dei pulsanti sinistro e destro del mouse."
msgid "Reverse mouse zoom" msgid "Reverse mouse zoom"
msgstr "Inverti zoom del mouse" msgstr "Inverti zoom del mouse"
msgid "If enabled, reverses the direction of zoom with mouse wheel." msgid "If enabled, reverses the direction of zoom with mouse wheel."
msgstr "" msgstr "Se abilitato, inverte la direzione dell'ingrandimento con la rotellina del mouse."
"Se abilitato, inverte la direzione dell'ingrandimento con la rotellina del "
"mouse."
msgid "Show splash screen" msgid "Show splash screen"
msgstr "Mostra schermata iniziale" msgstr "Mostra schermata iniziale"
@@ -13355,7 +13359,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice " "extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n" "versa.\n"
"\n" "\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec " "It defines the maximum rate by which the extruded volumetric flow in mm³/s² "
"can change over time. Higher values mean higher extrusion rate changes are " "can change over time. Higher values mean higher extrusion rate changes are "
"allowed, resulting in faster speed transitions.\n" "allowed, resulting in faster speed transitions.\n"
"\n" "\n"
@@ -13365,13 +13369,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some " "Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For " "marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these " "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 " "cases a high value of around 300-350 mm³/s² is recommended as this allows "
"just enough smoothing to assist pressure advance achieve a smoother flow " "for just enough smoothing to assist pressure advance achieve a smoother flow "
"transition.\n" "transition.\n"
"\n" "\n"
"For slower printers without pressure advance, the value should be set much " "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 " "lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n" "extruders and 5-10 mm³/s² for Bowden style.\n"
"\n" "\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n" "This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n" "\n"
@@ -13383,8 +13387,8 @@ msgstr ""
"un'estrusione a basso flusso (bassa velocità/larghezza inferiore) e " "un'estrusione a basso flusso (bassa velocità/larghezza inferiore) e "
"viceversa.\n" "viceversa.\n"
"\n" "\n"
"Definisce la velocità massima con cui la portata volumetrica estrusa in mm3/" "Definisce la velocità massima con cui la portata volumetrica estrusa in mm³/"
"sec può variare nel tempo. Valori più alti significano che sono consentite " "s² può variare nel tempo. Valori più alti significano che sono consentite "
"variazioni più elevate della velocità di estrusione, con conseguenti " "variazioni più elevate della velocità di estrusione, con conseguenti "
"transizioni di velocità più rapide.\n" "transizioni di velocità più rapide.\n"
"\n" "\n"
@@ -13395,14 +13399,14 @@ msgstr ""
"può fornire alcuni vantaggi marginali in alcuni casi in cui le velocità di " "può fornire alcuni vantaggi marginali in alcuni casi in cui le velocità di "
"stampa di alcuni elementi variano notevolmente, ad esempio quando ci sono " "stampa di alcuni elementi variano notevolmente, ad esempio quando ci sono "
"rallentamenti aggressivi dovuti a sporgenze. In questi casi si consiglia un " "rallentamenti aggressivi dovuti a sporgenze. In questi casi si consiglia un "
"valore elevato di circa 300-350 mm3/s2 in quanto ciò consente un " "valore elevato di circa 300-350 mm³/s² in quanto ciò consente un "
"livellamento sufficiente per aiutare l'anticipo di pressione a ottenere una " "livellamento sufficiente per aiutare l'anticipo di pressione a ottenere una "
"transizione di flusso più graduale.\n" "transizione di flusso più graduale.\n"
"\n" "\n"
"Per le stampanti più lente senza anticipo di pressione, l'opzione deve " "Per le stampanti più lente senza anticipo di pressione, l'opzione deve "
"essere impostata su un valore molto più basso. Un valore di 10-15 mm3/s2 è " "essere impostata su un valore molto più basso. Un valore di 10-15 mm³/s² è "
"un buon punto di partenza per gli estrusori a trasmissione diretta e di 5-10 " "un buon punto di partenza per gli estrusori a trasmissione diretta e di 5-10 "
"mm3/s2 per quelli Bowden.\n" "mm³/s² per quelli Bowden.\n"
"\n" "\n"
"Questa funzione è nota come Equalizzatore di Pressione in Prusa slicer.\n" "Questa funzione è nota come Equalizzatore di Pressione in Prusa slicer.\n"
"\n" "\n"
@@ -15256,7 +15260,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed " "the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\n" "on the wipe tower.\n"
"\n" "\n"
"Before increasing this parameter beyond the default of 90mm/sec, make sure " "Before increasing this parameter beyond the default of 90 mm/s, make sure "
"your printer can reliably bridge at the increased speeds and that ooze when " "your printer can reliably bridge at the increased speeds and that ooze when "
"tool changing is well controlled.\n" "tool changing is well controlled.\n"
"\n" "\n"
@@ -15276,9 +15280,9 @@ msgstr ""
"aumentare la forza con cui l'ugello entra in collisione con eventuali grumi " "aumentare la forza con cui l'ugello entra in collisione con eventuali grumi "
"che si sono formati sulla torre di spurgo.\n" "che si sono formati sulla torre di spurgo.\n"
"\n" "\n"
"Prima di aumentare questo parametro oltre il valore predefinito di 90 mm/" "Prima di aumentare questo parametro oltre il valore predefinito di 90 mm/s, "
"sec, accertati che la stampante sia in grado di gestire in modo affidabile " "accertati che la stampante sia in grado di gestire in modo affidabile le "
"le maggiori velocità, e che il trasudo del materiale durante il cambio di " "maggiori velocità, e che il trasudo del materiale durante il cambio di "
"testina sia ben controllato.\n" "testina sia ben controllato.\n"
"\n" "\n"
"Per i perimetri esterni della torre di spurgo viene utilizzata la velocità " "Per i perimetri esterni della torre di spurgo viene utilizzata la velocità "
+14 -8
View File
@@ -6489,11 +6489,17 @@ msgstr ""
"チェックすると、フリーカメラが使用されます。 そうでない場合は、拘束カメラを使" "チェックすると、フリーカメラが使用されます。 そうでない場合は、拘束カメラを使"
"用します。" "用します。"
msgid "Swap pan and rotate mouse buttons"
msgstr "パンと回転のマウスボタンを入れ替える"
msgid "If enabled, swaps the left and right mouse buttons pan and rotate functions."
msgstr "有効にすると、マウスの左ボタンと右ボタンのパン機能と回転機能が入れ替わります。"
msgid "Reverse mouse zoom" msgid "Reverse mouse zoom"
msgstr "" msgstr "マウスの逆ズーム"
msgid "If enabled, reverses the direction of zoom with mouse wheel." msgid "If enabled, reverses the direction of zoom with mouse wheel."
msgstr "" msgstr "有効にすると、マウス ホイールによるズームの方向が反転します。"
msgid "Show splash screen" msgid "Show splash screen"
msgstr "スプラッシュ画面を表示する" msgstr "スプラッシュ画面を表示する"
@@ -11895,7 +11901,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice " "extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n" "versa.\n"
"\n" "\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec " "It defines the maximum rate by which the extruded volumetric flow in mm³/s² "
"can change over time. Higher values mean higher extrusion rate changes are " "can change over time. Higher values mean higher extrusion rate changes are "
"allowed, resulting in faster speed transitions.\n" "allowed, resulting in faster speed transitions.\n"
"\n" "\n"
@@ -11905,13 +11911,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some " "Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For " "marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these " "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 " "cases a high value of around 300-350 mm³/s² is recommended as this allows "
"just enough smoothing to assist pressure advance achieve a smoother flow " "for just enough smoothing to assist pressure advance achieve a smoother flow "
"transition.\n" "transition.\n"
"\n" "\n"
"For slower printers without pressure advance, the value should be set much " "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 " "lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n" "extruders and 5-10 mm³/s² for Bowden style.\n"
"\n" "\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n" "This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n" "\n"
@@ -13427,7 +13433,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed " "the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\n" "on the wipe tower.\n"
"\n" "\n"
"Before increasing this parameter beyond the default of 90mm/sec, make sure " "Before increasing this parameter beyond the default of 90 mm/s, make sure "
"your printer can reliably bridge at the increased speeds and that ooze when " "your printer can reliably bridge at the increased speeds and that ooze when "
"tool changing is well controlled.\n" "tool changing is well controlled.\n"
"\n" "\n"
+14 -8
View File
@@ -6669,6 +6669,12 @@ msgstr ""
"활성화된 경우 자유로운 카메라 앵글을 사용합니다. 활성화되지 않은 경우 제한된 " "활성화된 경우 자유로운 카메라 앵글을 사용합니다. 활성화되지 않은 경우 제한된 "
"카메라 앵글을 사용합니다." "카메라 앵글을 사용합니다."
msgid "Swap pan and rotate mouse buttons"
msgstr "팬 및 회전 마우스 버튼 바꾸기"
msgid "If enabled, swaps the left and right mouse buttons pan and rotate functions."
msgstr "이 기능을 활성화하면 왼쪽 마우스 버튼과 오른쪽 마우스 버튼의 팬 및 회전 기능이 바뀝니다."
msgid "Reverse mouse zoom" msgid "Reverse mouse zoom"
msgstr "역방향 마우스 줌" msgstr "역방향 마우스 줌"
@@ -12686,7 +12692,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice " "extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n" "versa.\n"
"\n" "\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec " "It defines the maximum rate by which the extruded volumetric flow in mm³/s² "
"can change over time. Higher values mean higher extrusion rate changes are " "can change over time. Higher values mean higher extrusion rate changes are "
"allowed, resulting in faster speed transitions.\n" "allowed, resulting in faster speed transitions.\n"
"\n" "\n"
@@ -12696,12 +12702,12 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some marginal " "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 " "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 " "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 " "of around 300-350 mm³/s² is recommended as this allows for just enough "
"smoothing to assist pressure advance achieve a smoother flow transition.\n" "smoothing to assist pressure advance achieve a smoother flow transition.\n"
"\n" "\n"
"For slower printers without pressure advance, the value should be set much " "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 " "lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n" "extruders and 5-10 mm³/s² for Bowden style.\n"
"\n" "\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n" "This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n" "\n"
@@ -12720,13 +12726,13 @@ msgstr ""
"고속, 고압출량 직접 구동 프린터(예: 뱀부랩 또는 보론)의 경우 일반적으로 이 값" "고속, 고압출량 직접 구동 프린터(예: 뱀부랩 또는 보론)의 경우 일반적으로 이 값"
"이 필요하지 않습니다. 그러나 기능 속도가 크게 달라지는 특정 경우에는 약간의 이" "이 필요하지 않습니다. 그러나 기능 속도가 크게 달라지는 특정 경우에는 약간의 이"
"점을 제공할 수 있습니다. 예를 들어 오버행로 인해 급격하게 감속이 발생하는 경우" "점을 제공할 수 있습니다. 예를 들어 오버행로 인해 급격하게 감속이 발생하는 경우"
"입니다. 이러한 경우 약 300-350mm3/s2의 높은 값이 권장됩니다. 이렇게 하면 프레" "입니다. 이러한 경우 약 300-350 mm³/s²의 높은 값이 권장됩니다. 이렇게 하면 프레"
"셔 어드밴스가 더 부드러운 압출량 전환을 달성하는 데 도움이 될 만큼 충분히 매끄" "셔 어드밴스가 더 부드러운 압출량 전환을 달성하는 데 도움이 될 만큼 충분히 매끄"
"러워질 수 있기 때문입니다.\n" "러워질 수 있기 때문입니다.\n"
"\n" "\n"
"프레셔 어드밴스 기능이 없는 느린 프린터의 경우 값을 훨씬 낮게 설정해야 합니" "프레셔 어드밴스 기능이 없는 느린 프린터의 경우 값을 훨씬 낮게 설정해야 합니"
"다. 10-15mm3/s2 값은 직접 구동 압출기의 좋은 시작점이고 보우덴 스타일의 경우 " "다. 10-15 mm³/s² 값은 직접 구동 압출기의 좋은 시작점이고 보우덴 스타일의 경우 "
"5-10mm3/s2입니다.\n" "5-10 mm³/s²입니다.\n"
"\n" "\n"
"이 기능은 Prusa 슬라이서에서는 프레셔 이퀄라이저(Pressure Equalizer)로 알려져 " "이 기능은 Prusa 슬라이서에서는 프레셔 이퀄라이저(Pressure Equalizer)로 알려져 "
"있습니다.\n" "있습니다.\n"
@@ -14419,7 +14425,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed " "the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\n" "on the wipe tower.\n"
"\n" "\n"
"Before increasing this parameter beyond the default of 90mm/sec, make sure " "Before increasing this parameter beyond the default of 90 mm/s, make sure "
"your printer can reliably bridge at the increased speeds and that ooze when " "your printer can reliably bridge at the increased speeds and that ooze when "
"tool changing is well controlled.\n" "tool changing is well controlled.\n"
"\n" "\n"
+14 -8
View File
@@ -6835,6 +6835,12 @@ msgstr ""
"Jei įjungta, naudoti laisvą kamerą. Jei neįjungta, naudoti stacionarią " "Jei įjungta, naudoti laisvą kamerą. Jei neįjungta, naudoti stacionarią "
"kamerą." "kamerą."
msgid "Swap pan and rotate mouse buttons"
msgstr "Sukeisti judėjimą ir sukimąsi pelės mygtuko"
msgid "If enabled, swaps the left and right mouse buttons pan and rotate functions."
msgstr "Jei įjungta, sukeičia kairiojo ir dešiniojo pelės mygtukų panoraminio ir pasukimo funkcijas."
msgid "Reverse mouse zoom" msgid "Reverse mouse zoom"
msgstr "Apversti pelės didinimą" msgstr "Apversti pelės didinimą"
@@ -13160,7 +13166,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice " "extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n" "versa.\n"
"\n" "\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec " "It defines the maximum rate by which the extruded volumetric flow in mm³/s² "
"can change over time. Higher values mean higher extrusion rate changes are " "can change over time. Higher values mean higher extrusion rate changes are "
"allowed, resulting in faster speed transitions.\n" "allowed, resulting in faster speed transitions.\n"
"\n" "\n"
@@ -13170,13 +13176,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some " "Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For " "marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these " "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 " "cases a high value of around 300-350 mm³/s² is recommended as this allows "
"just enough smoothing to assist pressure advance achieve a smoother flow " "for just enough smoothing to assist pressure advance achieve a smoother flow "
"transition.\n" "transition.\n"
"\n" "\n"
"For slower printers without pressure advance, the value should be set much " "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 " "lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n" "extruders and 5-10 mm³/s² for Bowden style.\n"
"\n" "\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n" "This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n" "\n"
@@ -13197,13 +13203,13 @@ msgstr ""
"\"Bambu lab\" arba \"Voron\") ši vertė paprastai nereikalinga. Tačiau tam " "\"Bambu lab\" arba \"Voron\") ši vertė paprastai nereikalinga. Tačiau tam "
"tikrais atvejais, kai funkcijos greičiai labai skiriasi, ji gali duoti " "tikrais atvejais, kai funkcijos greičiai labai skiriasi, ji gali duoti "
"nedidelę naudą. Pavyzdžiui, kai yra agresyvių sulėtėjimų dėl iškyšų. Tokiais " "nedidelę naudą. Pavyzdžiui, kai yra agresyvių sulėtėjimų dėl iškyšų. Tokiais "
"atvejais rekomenduojama didelė vertė, maždaug 300-350 mm3/s2 , nes tai " "atvejais rekomenduojama didelė vertė, maždaug 300-350 mm³/s² , nes tai "
"leidžia pakankamai išlyginti, kad padedant slėgio avansui būtų pasiektas " "leidžia pakankamai išlyginti, kad padedant slėgio avansui būtų pasiektas "
"sklandesnis srauto perėjimas.\n" "sklandesnis srauto perėjimas.\n"
"\n" "\n"
"Lėtesniems spausdintuvams, kuriuose nėra slėgio didinimo, vertė turėtų būti " "Lėtesniems spausdintuvams, kuriuose nėra slėgio didinimo, vertė turėtų būti "
"nustatyta daug mažesnė. Tiesioginės pavaros ekstruderiams gera pradinė vertė " "nustatyta daug mažesnė. Tiesioginės pavaros ekstruderiams gera pradinė vertė "
"yra 10-15 mm3/s2, o Bowdeno tipo ekstruderiams - 5-10 mm3/s2.\n" "yra 10-15 mm³/s², o Bowdeno tipo ekstruderiams - 5-10 mm³/s².\n"
"\n" "\n"
"Ši funkcija \"Prusa\" programoje \"Prusa slicer\" vadinama slėgio išlyginimo " "Ši funkcija \"Prusa\" programoje \"Prusa slicer\" vadinama slėgio išlyginimo "
"funkcija.\n" "funkcija.\n"
@@ -14997,7 +15003,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed " "the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\n" "on the wipe tower.\n"
"\n" "\n"
"Before increasing this parameter beyond the default of 90mm/sec, make sure " "Before increasing this parameter beyond the default of 90 mm/s, make sure "
"your printer can reliably bridge at the increased speeds and that ooze when " "your printer can reliably bridge at the increased speeds and that ooze when "
"tool changing is well controlled.\n" "tool changing is well controlled.\n"
"\n" "\n"
+12 -6
View File
@@ -6707,6 +6707,12 @@ msgstr ""
"Als dit is ingeschakeld wordt de vrij beweegbare camera gebruikt, anders een " "Als dit is ingeschakeld wordt de vrij beweegbare camera gebruikt, anders een "
"vaste camera." "vaste camera."
msgid "Swap pan and rotate mouse buttons"
msgstr "Wissel de pan- en rotatiemuisknoppen om"
msgid "If enabled, swaps the left and right mouse buttons pan and rotate functions."
msgstr "Als deze optie is ingeschakeld, worden de pan- en rotatiefuncties van de linker- en rechtermuisknop omgedraaid."
msgid "Reverse mouse zoom" msgid "Reverse mouse zoom"
msgstr "Omgekeerde muiszoom" msgstr "Omgekeerde muiszoom"
@@ -12362,7 +12368,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice " "extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n" "versa.\n"
"\n" "\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec " "It defines the maximum rate by which the extruded volumetric flow in mm³/s² "
"can change over time. Higher values mean higher extrusion rate changes are " "can change over time. Higher values mean higher extrusion rate changes are "
"allowed, resulting in faster speed transitions.\n" "allowed, resulting in faster speed transitions.\n"
"\n" "\n"
@@ -12372,13 +12378,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some " "Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For " "marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these " "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 " "cases a high value of around 300-350 mm³/s² is recommended as this allows "
"just enough smoothing to assist pressure advance achieve a smoother flow " "for just enough smoothing to assist pressure advance achieve a smoother flow "
"transition.\n" "transition.\n"
"\n" "\n"
"For slower printers without pressure advance, the value should be set much " "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 " "lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n" "extruders and 5-10 mm³/s² for Bowden style.\n"
"\n" "\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n" "This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n" "\n"
@@ -13974,7 +13980,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed " "the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\n" "on the wipe tower.\n"
"\n" "\n"
"Before increasing this parameter beyond the default of 90mm/sec, make sure " "Before increasing this parameter beyond the default of 90 mm/s, make sure "
"your printer can reliably bridge at the increased speeds and that ooze when " "your printer can reliably bridge at the increased speeds and that ooze when "
"tool changing is well controlled.\n" "tool changing is well controlled.\n"
"\n" "\n"
+16 -10
View File
@@ -6848,6 +6848,12 @@ msgstr "Używanie wolnego widoku kamery"
msgid "If enabled, use free camera. If not enabled, use constrained camera." msgid "If enabled, use free camera. If not enabled, use constrained camera."
msgstr "Przełącza pomiędzy wolnym a ograniczonym widokiem kamery." msgstr "Przełącza pomiędzy wolnym a ograniczonym widokiem kamery."
msgid "Swap pan and rotate mouse buttons"
msgstr "Zamień przyciski przesuwania i obracania myszy"
msgid "If enabled, swaps the left and right mouse buttons pan and rotate functions."
msgstr "Jeśli włączone, zamienia funkcje przesuwania i obracania lewym i prawym przyciskiem myszy."
msgid "Reverse mouse zoom" msgid "Reverse mouse zoom"
msgstr "Odwrócone przybliżanie myszką" msgstr "Odwrócone przybliżanie myszką"
@@ -13193,7 +13199,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice " "extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n" "versa.\n"
"\n" "\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec " "It defines the maximum rate by which the extruded volumetric flow in mm³/s² "
"can change over time. Higher values mean higher extrusion rate changes are " "can change over time. Higher values mean higher extrusion rate changes are "
"allowed, resulting in faster speed transitions.\n" "allowed, resulting in faster speed transitions.\n"
"\n" "\n"
@@ -13203,13 +13209,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some " "Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For " "marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these " "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 " "cases a high value of around 300-350 mm³/s² is recommended as this allows "
"just enough smoothing to assist pressure advance achieve a smoother flow " "for just enough smoothing to assist pressure advance achieve a smoother flow "
"transition.\n" "transition.\n"
"\n" "\n"
"For slower printers without pressure advance, the value should be set much " "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 " "lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n" "extruders and 5-10 mm³/s² for Bowden style.\n"
"\n" "\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n" "This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n" "\n"
@@ -13232,13 +13238,13 @@ msgstr ""
"potrzebna. Może ona jednak zapewnić pewne marginalne korzyści w niektórych " "potrzebna. Może ona jednak zapewnić pewne marginalne korzyści w niektórych "
"przypadkach, gdy prędkości funkcji znacznie się różnią. Na przykład, gdy " "przypadkach, gdy prędkości funkcji znacznie się różnią. Na przykład, gdy "
"występują agresywne spowolnienia spowodowane nawisami. W takich przypadkach " "występują agresywne spowolnienia spowodowane nawisami. W takich przypadkach "
"zalecana jest wysoka wartość około 300-350 mm3/s2, ponieważ pozwala to na " "zalecana jest wysoka wartość około 300-350 mm³/s², ponieważ pozwala to na "
"wystarczające wygładzenie, aby wspomóc wzrost ciśnienia w celu uzyskania " "wystarczające wygładzenie, aby wspomóc wzrost ciśnienia w celu uzyskania "
"płynniejszego przejścia przepływu.\n" "płynniejszego przejścia przepływu.\n"
"\n" "\n"
"W przypadku wolniejszych drukarek bez przyspieszenia ciśnienia wartość ta " "W przypadku wolniejszych drukarek bez przyspieszenia ciśnienia wartość ta "
"powinna być znacznie niższa. Wartość 10-15 mm3/s2 jest dobrym punktem " "powinna być znacznie niższa. Wartość 10-15 mm³/s² jest dobrym punktem "
"wyjścia dla extruderów z napędem bezpośrednim i 5-10 mm3/s2 dla extruderów " "wyjścia dla extruderów z napędem bezpośrednim i 5-10 mm³/s² dla extruderów "
"typu Bowden.\n" "typu Bowden.\n"
"\n" "\n"
"Ta funkcja jest znana jako Pressure Equalizer w Prusa slicer.\n" "Ta funkcja jest znana jako Pressure Equalizer w Prusa slicer.\n"
@@ -15055,7 +15061,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed " "the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\n" "on the wipe tower.\n"
"\n" "\n"
"Before increasing this parameter beyond the default of 90mm/sec, make sure " "Before increasing this parameter beyond the default of 90 mm/s, make sure "
"your printer can reliably bridge at the increased speeds and that ooze when " "your printer can reliably bridge at the increased speeds and that ooze when "
"tool changing is well controlled.\n" "tool changing is well controlled.\n"
"\n" "\n"
@@ -19260,7 +19266,7 @@ msgstr ""
#~ "is lower, the lowest speed will be used instead.\n" #~ "is lower, the lowest speed will be used instead.\n"
#~ "Increasing this speed may affect the tower's stability, as purging can be " #~ "Increasing this speed may affect the tower's stability, as purging can be "
#~ "performed over sparse layers. Before increasing this parameter beyond the " #~ "performed over sparse layers. Before increasing this parameter beyond the "
#~ "default of 90mm/sec, make sure your printer can reliably bridge at the " #~ "default of 90 mm/s, make sure your printer can reliably bridge at the "
#~ "increased speeds." #~ "increased speeds."
#~ msgstr "" #~ msgstr ""
#~ "Maksymalna prędkość drukowania podczas oczyszczania w wieży czyszczącej. " #~ "Maksymalna prędkość drukowania podczas oczyszczania w wieży czyszczącej. "
+18 -12
View File
@@ -6854,6 +6854,12 @@ msgstr "Usar câmera livre"
msgid "If enabled, use free camera. If not enabled, use constrained camera." msgid "If enabled, use free camera. If not enabled, use constrained camera."
msgstr "Se ativado, usa câmera livre. Se não ativado, usa câmera restrita." msgstr "Se ativado, usa câmera livre. Se não ativado, usa câmera restrita."
msgid "Swap pan and rotate mouse buttons"
msgstr "Alterar a panorâmica e girar os botões do mouse"
msgid "If enabled, swaps the left and right mouse buttons pan and rotate functions."
msgstr "Se ativado, troca as funções de panorâmica e rotação dos botões esquerdo e direito do mouse."
msgid "Reverse mouse zoom" msgid "Reverse mouse zoom"
msgstr "Inverter zoom do mouse" msgstr "Inverter zoom do mouse"
@@ -13226,7 +13232,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice " "extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n" "versa.\n"
"\n" "\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec " "It defines the maximum rate by which the extruded volumetric flow in mm³/s² "
"can change over time. Higher values mean higher extrusion rate changes are " "can change over time. Higher values mean higher extrusion rate changes are "
"allowed, resulting in faster speed transitions.\n" "allowed, resulting in faster speed transitions.\n"
"\n" "\n"
@@ -13236,13 +13242,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some " "Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For " "marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these " "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 " "cases a high value of around 300-350 mm³/s² is recommended as this allows "
"just enough smoothing to assist pressure advance achieve a smoother flow " "for just enough smoothing to assist pressure advance achieve a smoother flow "
"transition.\n" "transition.\n"
"\n" "\n"
"For slower printers without pressure advance, the value should be set much " "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 " "lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n" "extruders and 5-10 mm³/s² for Bowden style.\n"
"\n" "\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n" "This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n" "\n"
@@ -13253,7 +13259,7 @@ msgstr ""
"velocidade/maior largura) para uma extrusão de baixo fluxo (baixa velocidade/" "velocidade/maior largura) para uma extrusão de baixo fluxo (baixa velocidade/"
"menor largura) e vice-versa.\n" "menor largura) e vice-versa.\n"
"\n" "\n"
"Define a taxa máxima pela qual o fluxo volumétrico extrudado em mm3/seg pode " "Define a taxa máxima pela qual o fluxo volumétrico extrudado em mm³/s² pode "
"mudar ao longo do tempo. Valores mais altos significam que mudanças de taxa " "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 " "de extrusão mais altas são permitidas, resultando em transições de "
"velocidade mais rápidas.\n" "velocidade mais rápidas.\n"
@@ -13265,20 +13271,20 @@ msgstr ""
"entanto, pode fornecer alguns benefícios marginais em certos casos em que as " "entanto, pode fornecer alguns benefícios marginais em certos casos em que as "
"velocidades das características variam muito. Por exemplo, quando há " "velocidades das características variam muito. Por exemplo, quando há "
"desacelerações agressivas devido a saliências. Nesses casos, um valor alto " "desacelerações agressivas devido a saliências. Nesses casos, um valor alto "
"de cerca de 300-350mm3/s2 é recomendado, pois isso permite apenas suavização " "de cerca de 300-350 mm³/s² é recomendado, pois isso permite apenas suavização "
"suficiente para ajudar o avanço de pressão a alcançar uma transição de fluxo " "suficiente para ajudar o avanço de pressão a alcançar uma transição de fluxo "
"mais suave.\n" "mais suave.\n"
"\n" "\n"
"Para impressoras mais lentas sem avanço de pressão, o valor deve ser " "Para impressoras mais lentas sem avanço de pressão, o valor deve ser "
"definido muito mais baixo. Um valor de 10-15mm3/s2 é um bom ponto de partida " "definido muito mais baixo. Um valor de 10-15 mm³/s² é um bom ponto de partida "
"para extrusoras de acionamento direto e 5-10mm3/s2 para estilo Bowden.\n" "para extrusoras de acionamento direto e 5-10 mm³/s² para estilo Bowden.\n"
"\n" "\n"
"Este recurso é conhecido como Equalizador de Pressão no slicer Prusa.\n" "Este recurso é conhecido como Equalizador de Pressão no slicer Prusa.\n"
"\n" "\n"
"Nota: este parâmetro desativa o ajuste de arco." "Nota: este parâmetro desativa o ajuste de arco."
msgid "mm³/s²" msgid "mm³/s²"
msgstr "mm3/s2" msgstr ""
msgid "Smoothing segment length" msgid "Smoothing segment length"
msgstr "Comprimento do segmento de suavização" msgstr "Comprimento do segmento de suavização"
@@ -15085,7 +15091,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed " "the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\n" "on the wipe tower.\n"
"\n" "\n"
"Before increasing this parameter beyond the default of 90mm/sec, make sure " "Before increasing this parameter beyond the default of 90 mm/s, make sure "
"your printer can reliably bridge at the increased speeds and that ooze when " "your printer can reliably bridge at the increased speeds and that ooze when "
"tool changing is well controlled.\n" "tool changing is well controlled.\n"
"\n" "\n"
@@ -15105,7 +15111,7 @@ msgstr ""
"aumentar a força com que o bico colide com quaisquer bolhas que possam ter " "aumentar a força com que o bico colide com quaisquer bolhas que possam ter "
"se formado na torre de limpeza.\n" "se formado na torre de limpeza.\n"
"\n" "\n"
"Antes de aumentar esse parâmetro além do padrão de 90mm/s, certifique-se de " "Antes de aumentar esse parâmetro além do padrão de 90 mm/s, certifique-se de "
"que sua impressora pode realizar pontes de forma confiável nas velocidades " "que sua impressora pode realizar pontes de forma confiável nas velocidades "
"aumentadas e que o vazamento ao trocar a ferramenta está bem controlado.\n" "aumentadas e que o vazamento ao trocar a ferramenta está bem controlado.\n"
"\n" "\n"
+22 -28
View File
@@ -6931,17 +6931,20 @@ msgid "Use free camera"
msgstr "Использовать свободную камеру" msgstr "Использовать свободную камеру"
msgid "If enabled, use free camera. If not enabled, use constrained camera." msgid "If enabled, use free camera. If not enabled, use constrained camera."
msgstr "" msgstr "Если включено, используется свободное вращение камеры. Если выключено, "
"Если включено, используется свободное вращение камеры. Если выключено, "
"используется вращение камера с ограничениями." "используется вращение камера с ограничениями."
msgid "Swap pan and rotate mouse buttons"
msgstr "Поменять местами кнопки панорамирования и вращения мыши"
msgid "If enabled, swaps the left and right mouse buttons pan and rotate functions."
msgstr "Если включено, меняет местами функции панорамирования и поворота левой и правой кнопок мыши."
msgid "Reverse mouse zoom" msgid "Reverse mouse zoom"
msgstr "Инвертировать управление масштабом" msgstr "Инвертировать управление масштабом"
msgid "If enabled, reverses the direction of zoom with mouse wheel." msgid "If enabled, reverses the direction of zoom with mouse wheel."
msgstr "" msgstr "Если включено, направление масштабирования с помощью колесика мыши будет инвертировано."
"Если включено, направление масштабирования с помощью колесика мыши будет "
"инвертировано."
msgid "Show splash screen" msgid "Show splash screen"
msgstr "Показывать заставку при запуске программы" msgstr "Показывать заставку при запуске программы"
@@ -6953,46 +6956,37 @@ msgid "Show \"Tip of the day\" notification after start"
msgstr "Показывать уведомление с полезным советом при запуске приложения" msgstr "Показывать уведомление с полезным советом при запуске приложения"
msgid "If enabled, useful hints are displayed at startup." msgid "If enabled, useful hints are displayed at startup."
msgstr "" msgstr "Если включено, будут показываться уведомления с полезном советом при запуске приложения."
"Если включено, будут показываться уведомления с полезном советом при запуске "
"приложения."
msgid "Flushing volumes: Auto-calculate every time the color changed." msgid "Flushing volumes: Auto-calculate every time the color changed."
msgstr "Объём очистки: автопересчёт при каждом изменении цвета" msgstr "Объём очистки: автопересчёт при каждом изменении цвета"
msgid "If enabled, auto-calculate every time the color changed." msgid "If enabled, auto-calculate every time the color changed."
msgstr "" msgstr "Если включено, выполняется автоматический перерасчёт объёма очистки при "
"Если включено, выполняется автоматический перерасчёт объёма очистки при "
"каждом изменении цвета." "каждом изменении цвета."
msgid "" msgid "Flushing volumes: Auto-calculate every time when the filament is changed."
"Flushing volumes: Auto-calculate every time when the filament is changed."
msgstr "Объём очистки: автопересчёт при каждой смене прутка" msgstr "Объём очистки: автопересчёт при каждой смене прутка"
msgid "If enabled, auto-calculate every time when filament is changed" msgid "If enabled, auto-calculate every time when filament is changed"
msgstr "" msgstr "Если включено, выполняется автоматический перерасчёт объёма очистки при "
"Если включено, выполняется автоматический перерасчёт объёма очистки при "
"каждой смене прутка." "каждой смене прутка."
msgid "Remember printer configuration" msgid "Remember printer configuration"
msgstr "Запоминать конфигурацию принтера" msgstr "Запоминать конфигурацию принтера"
msgid "" msgid "If enabled, Orca will remember and switch filament/process configuration for "
"If enabled, Orca will remember and switch filament/process configuration for "
"each printer automatically." "each printer automatically."
msgstr "" msgstr "Если включено, программа будет запоминать связь выбранного профиля принтера "
"Если включено, программа будет запоминать связь выбранного профиля принтера "
"с профилем пластиковой нити и процессом печати, выставленными вами в " "с профилем пластиковой нити и процессом печати, выставленными вами в "
"последний раз." "последний раз."
msgid "Multi-device Management (Take effect after restarting Orca Slicer)." msgid "Multi-device Management (Take effect after restarting Orca Slicer)."
msgstr "Управление несколькими принтерами (требуется перезапуск программы)" msgstr "Управление несколькими принтерами (требуется перезапуск программы)"
msgid "" msgid "With this option enabled, you can send a task to multiple devices at the "
"With this option enabled, you can send a task to multiple devices at the "
"same time and manage multiple devices." "same time and manage multiple devices."
msgstr "" msgstr "Если включено, вы сможете управлять несколькими устройствами и отправлять "
"Если включено, вы сможете управлять несколькими устройствами и отправлять "
"задания на печать на несколько устройств одновременно." "задания на печать на несколько устройств одновременно."
msgid "Auto arrange plate after cloning" msgid "Auto arrange plate after cloning"
@@ -13420,7 +13414,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice " "extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n" "versa.\n"
"\n" "\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec " "It defines the maximum rate by which the extruded volumetric flow in mm³/s² "
"can change over time. Higher values mean higher extrusion rate changes are " "can change over time. Higher values mean higher extrusion rate changes are "
"allowed, resulting in faster speed transitions.\n" "allowed, resulting in faster speed transitions.\n"
"\n" "\n"
@@ -13430,13 +13424,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some " "Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For " "marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these " "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 " "cases a high value of around 300-350 mm³/s² is recommended as this allows "
"just enough smoothing to assist pressure advance achieve a smoother flow " "for just enough smoothing to assist pressure advance achieve a smoother flow "
"transition.\n" "transition.\n"
"\n" "\n"
"For slower printers without pressure advance, the value should be set much " "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 " "lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n" "extruders and 5-10 mm³/s² for Bowden style.\n"
"\n" "\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n" "This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n" "\n"
@@ -15353,7 +15347,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed " "the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\n" "on the wipe tower.\n"
"\n" "\n"
"Before increasing this parameter beyond the default of 90mm/sec, make sure " "Before increasing this parameter beyond the default of 90 mm/s, make sure "
"your printer can reliably bridge at the increased speeds and that ooze when " "your printer can reliably bridge at the increased speeds and that ooze when "
"tool changing is well controlled.\n" "tool changing is well controlled.\n"
"\n" "\n"
+20 -16
View File
@@ -6598,30 +6598,34 @@ msgstr ""
msgid "Zoom to mouse position" msgid "Zoom to mouse position"
msgstr "Zooma till musens position" msgstr "Zooma till musens position"
msgid "" msgid "Zoom in towards the mouse pointer's position in the 3D view, rather than the "
"Zoom in towards the mouse pointer's position in the 3D view, rather than the "
"2D window center." "2D window center."
msgstr "" msgstr "Zooma in mot muspekarens position i 3D-vyn, istället för mot 2D-fönstrets "
"Zooma in mot muspekarens position i 3D-vyn, istället för mot 2D-fönstrets "
"mitt." "mitt."
msgid "Use free camera" msgid "Use free camera"
msgstr "" msgstr "Använd fri kamera"
msgid "If enabled, use free camera. If not enabled, use constrained camera." msgid "If enabled, use free camera. If not enabled, use constrained camera."
msgstr "" msgstr "Om aktiverat, använd fri kamera. Om inte aktiverat, använd begränsad kamera."
msgid "Swap pan and rotate mouse buttons"
msgstr "Växla panorerings- och rotationsknapparna på musen"
msgid "If enabled, swaps the left and right mouse buttons pan and rotate functions."
msgstr "Om aktiverat växlar vänster och höger musknapps panorerings- och rotationsfunktioner."
msgid "Reverse mouse zoom" msgid "Reverse mouse zoom"
msgstr "" msgstr "Omvänd muszoomning"
msgid "If enabled, reverses the direction of zoom with mouse wheel." msgid "If enabled, reverses the direction of zoom with mouse wheel."
msgstr "" msgstr "Om aktiverad, vänder zoomriktningen med mushjulet."
msgid "Show splash screen" msgid "Show splash screen"
msgstr "" msgstr "Visa välkomstskärm"
msgid "Show the splash screen during startup." msgid "Show the splash screen during startup."
msgstr "" msgstr "Visa välkomstskärmen under uppstart."
msgid "Show \"Tip of the day\" notification after start" msgid "Show \"Tip of the day\" notification after start"
msgstr "Visa \"Dagens tips\" efter start" msgstr "Visa \"Dagens tips\" efter start"
@@ -12113,7 +12117,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice " "extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n" "versa.\n"
"\n" "\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec " "It defines the maximum rate by which the extruded volumetric flow in mm³/s² "
"can change over time. Higher values mean higher extrusion rate changes are " "can change over time. Higher values mean higher extrusion rate changes are "
"allowed, resulting in faster speed transitions.\n" "allowed, resulting in faster speed transitions.\n"
"\n" "\n"
@@ -12123,13 +12127,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some " "Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For " "marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these " "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 " "cases a high value of around 300-350 mm³/s² is recommended as this allows "
"just enough smoothing to assist pressure advance achieve a smoother flow " "for just enough smoothing to assist pressure advance achieve a smoother flow "
"transition.\n" "transition.\n"
"\n" "\n"
"For slower printers without pressure advance, the value should be set much " "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 " "lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n" "extruders and 5-10 mm³/s² for Bowden style.\n"
"\n" "\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n" "This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n" "\n"
@@ -13660,7 +13664,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed " "the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\n" "on the wipe tower.\n"
"\n" "\n"
"Before increasing this parameter beyond the default of 90mm/sec, make sure " "Before increasing this parameter beyond the default of 90 mm/s, make sure "
"your printer can reliably bridge at the increased speeds and that ooze when " "your printer can reliably bridge at the increased speeds and that ooze when "
"tool changing is well controlled.\n" "tool changing is well controlled.\n"
"\n" "\n"
+16 -11
View File
@@ -6799,12 +6799,17 @@ msgstr ""
"Etkinleştirilirse serbest kamerayı kullanın. Etkin değilse kısıtlı kamerayı " "Etkinleştirilirse serbest kamerayı kullanın. Etkin değilse kısıtlı kamerayı "
"kullanın." "kullanın."
msgid "Swap pan and rotate mouse buttons"
msgstr "Pan ve döndürme işlevlerini fare düğmeleri arasında değiştir"
msgid "If enabled, swaps the left and right mouse buttons pan and rotate functions."
msgstr "Etkinleştirildiğinde, sol ve sağ fare düğmelerinin pan ve döndürme işlevlerini yer değiştirir."
msgid "Reverse mouse zoom" msgid "Reverse mouse zoom"
msgstr "Mouse yakınlaştırmasını tersine çevir" msgstr "Mouse yakınlaştırmasını tersine çevir"
msgid "If enabled, reverses the direction of zoom with mouse wheel." msgid "If enabled, reverses the direction of zoom with mouse wheel."
msgstr "" msgstr "Etkinleştirilirse, mouse tekerleğiyle yakınlaştırmanın yönü tersine çevrilir."
"Etkinleştirilirse, mouse tekerleğiyle yakınlaştırmanın yönü tersine çevrilir."
msgid "Show splash screen" msgid "Show splash screen"
msgstr "Açılış ekranını göster" msgstr "Açılış ekranını göster"
@@ -13061,7 +13066,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice " "extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n" "versa.\n"
"\n" "\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec " "It defines the maximum rate by which the extruded volumetric flow in mm³/s² "
"can change over time. Higher values mean higher extrusion rate changes are " "can change over time. Higher values mean higher extrusion rate changes are "
"allowed, resulting in faster speed transitions.\n" "allowed, resulting in faster speed transitions.\n"
"\n" "\n"
@@ -13071,13 +13076,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some " "Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For " "marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these " "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 " "cases a high value of around 300-350 mm³/s² is recommended as this allows "
"just enough smoothing to assist pressure advance achieve a smoother flow " "for just enough smoothing to assist pressure advance achieve a smoother flow "
"transition.\n" "transition.\n"
"\n" "\n"
"For slower printers without pressure advance, the value should be set much " "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 " "lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n" "extruders and 5-10 mm³/s² for Bowden style.\n"
"\n" "\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n" "This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n" "\n"
@@ -13099,13 +13104,13 @@ msgstr ""
"veya Voron gibi) bu değer genellikle gerekli değildir. Ancak özellik " "veya Voron gibi) bu değer genellikle gerekli değildir. Ancak özellik "
"hızlarının büyük ölçüde değiştiği bazı durumlarda marjinal bir fayda " "hızlarının büyük ölçüde değiştiği bazı durumlarda marjinal bir fayda "
"sağlayabilir. Örneğin, çıkıntılar nedeniyle agresif yavaşlamalar olduğunda. " "sağlayabilir. Örneğin, çıkıntılar nedeniyle agresif yavaşlamalar olduğunda. "
"Bu durumlarda 300-350mm3/s2 civarında yüksek bir değer önerilir çünkü bu, " "Bu durumlarda 300-350 mm³/s² civarında yüksek bir değer önerilir çünkü bu, "
"basınç ilerlemesinin daha yumuşak bir akış geçişi elde etmesine yardımcı " "basınç ilerlemesinin daha yumuşak bir akış geçişi elde etmesine yardımcı "
"olmak için yeterli yumuşatmaya izin verir.\n" "olmak için yeterli yumuşatmaya izin verir.\n"
"\n" "\n"
"Basınç avansı olmayan daha yavaş yazıcılar için değer çok daha düşük " "Basınç avansı olmayan daha yavaş yazıcılar için değer çok daha düşük "
"ayarlanmalıdır. Doğrudan tahrikli ekstruderler için 10-15mm3/s2 ve Bowden " "ayarlanmalıdır. Doğrudan tahrikli ekstruderler için 10-15 mm³/s² ve Bowden "
"tarzı için 5-10mm3/s2 değeri iyi bir başlangıç noktasıdır.\n" "tarzı için 5-10 mm³/s² değeri iyi bir başlangıç noktasıdır.\n"
"\n" "\n"
"Bu özellik Prusa slicer'da Basınç Dengeleyici olarak bilinir.\n" "Bu özellik Prusa slicer'da Basınç Dengeleyici olarak bilinir.\n"
"\n" "\n"
@@ -14898,7 +14903,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed " "the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\n" "on the wipe tower.\n"
"\n" "\n"
"Before increasing this parameter beyond the default of 90mm/sec, make sure " "Before increasing this parameter beyond the default of 90 mm/s, make sure "
"your printer can reliably bridge at the increased speeds and that ooze when " "your printer can reliably bridge at the increased speeds and that ooze when "
"tool changing is well controlled.\n" "tool changing is well controlled.\n"
"\n" "\n"
+12 -6
View File
@@ -6860,6 +6860,12 @@ msgstr ""
"Якщо увімкнено, використовуватиметься вільна камера. Якщо вимкнено, " "Якщо увімкнено, використовуватиметься вільна камера. Якщо вимкнено, "
"використовуватиметься камера з обмеженими можливостями." "використовуватиметься камера з обмеженими можливостями."
msgid "Swap pan and rotate mouse buttons"
msgstr "Поміняти кнопки миші для панорамування й обертання"
msgid "If enabled, swaps the left and right mouse buttons pan and rotate functions."
msgstr "Якщо ввімкнено, змінює місцями функції панорамування та обертання між лівою та правою кнопками миші."
msgid "Reverse mouse zoom" msgid "Reverse mouse zoom"
msgstr "Зворотне масштабування мишкою" msgstr "Зворотне масштабування мишкою"
@@ -13192,7 +13198,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice " "extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n" "versa.\n"
"\n" "\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec " "It defines the maximum rate by which the extruded volumetric flow in mm³/s² "
"can change over time. Higher values mean higher extrusion rate changes are " "can change over time. Higher values mean higher extrusion rate changes are "
"allowed, resulting in faster speed transitions.\n" "allowed, resulting in faster speed transitions.\n"
"\n" "\n"
@@ -13202,13 +13208,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some " "Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For " "marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these " "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 " "cases a high value of around 300-350 mm³/s² is recommended as this allows "
"just enough smoothing to assist pressure advance achieve a smoother flow " "for just enough smoothing to assist pressure advance achieve a smoother flow "
"transition.\n" "transition.\n"
"\n" "\n"
"For slower printers without pressure advance, the value should be set much " "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 " "lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n" "extruders and 5-10 mm³/s² for Bowden style.\n"
"\n" "\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n" "This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n" "\n"
@@ -15024,7 +15030,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed " "the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\n" "on the wipe tower.\n"
"\n" "\n"
"Before increasing this parameter beyond the default of 90mm/sec, make sure " "Before increasing this parameter beyond the default of 90 mm/s, make sure "
"your printer can reliably bridge at the increased speeds and that ooze when " "your printer can reliably bridge at the increased speeds and that ooze when "
"tool changing is well controlled.\n" "tool changing is well controlled.\n"
"\n" "\n"
+14 -7
View File
@@ -6519,6 +6519,12 @@ msgstr "使用自由视角"
msgid "If enabled, use free camera. If not enabled, use constrained camera." msgid "If enabled, use free camera. If not enabled, use constrained camera."
msgstr "如果启用,使用自由视角。如果未启用,使用约束视角。" msgstr "如果启用,使用自由视角。如果未启用,使用约束视角。"
msgid "Swap pan and rotate mouse buttons"
msgstr "交换鼠标按钮的平移与旋转功能"
msgid "If enabled, swaps the left and right mouse buttons pan and rotate functions."
msgstr "启用后,将左键和右键的平移与旋转功能对调"
msgid "Reverse mouse zoom" msgid "Reverse mouse zoom"
msgstr "反转鼠标缩放" msgstr "反转鼠标缩放"
@@ -12033,13 +12039,14 @@ msgstr "挤出头最大可打印的层高。用于限制开启自适应层高时
msgid "Extrusion rate smoothing" msgid "Extrusion rate smoothing"
msgstr "平滑挤出率" msgstr "平滑挤出率"
#, fuzzy
msgid "" msgid ""
"This parameter smooths out sudden extrusion rate changes that happen when " "This parameter smooths out sudden extrusion rate changes that happen when "
"the printer transitions from printing a high flow (high speed/larger width) " "the printer transitions from printing a high flow (high speed/larger width) "
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice " "extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n" "versa.\n"
"\n" "\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec " "It defines the maximum rate by which the extruded volumetric flow in mm³/s² "
"can change over time. Higher values mean higher extrusion rate changes are " "can change over time. Higher values mean higher extrusion rate changes are "
"allowed, resulting in faster speed transitions.\n" "allowed, resulting in faster speed transitions.\n"
"\n" "\n"
@@ -12049,13 +12056,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some " "Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For " "marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these " "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 " "cases a high value of around 300-350 mm³/s² is recommended as this allows "
"just enough smoothing to assist pressure advance achieve a smoother flow " "for just enough smoothing to assist pressure advance achieve a smoother flow "
"transition.\n" "transition.\n"
"\n" "\n"
"For slower printers without pressure advance, the value should be set much " "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 " "lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n" "extruders and 5-10 mm³/s² for Bowden style.\n"
"\n" "\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n" "This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n" "\n"
@@ -12074,7 +12081,7 @@ msgstr ""
"够的平滑,以帮助压力提前实现更平滑的流量过渡。\n" "够的平滑,以帮助压力提前实现更平滑的流量过渡。\n"
"\n" "\n"
"对于没有压力提前的较慢打印机,该值应该设置得非常低。对于近程挤出机来说10-15 " "对于没有压力提前的较慢打印机,该值应该设置得非常低。对于近程挤出机来说10-15 "
"mm3/s2是一个很好值的起点,而对于远程挤出机来说是5-10 mm3/s2。\n" "mm³/s²是一个很好值的起点,而对于远程挤出机来说是5-10 mm³/s²。\n"
"\n" "\n"
"这个功能在Prusa切片机中被称为压力均衡器。\n" "这个功能在Prusa切片机中被称为压力均衡器。\n"
"\n" "\n"
@@ -13624,7 +13631,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed " "the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\n" "on the wipe tower.\n"
"\n" "\n"
"Before increasing this parameter beyond the default of 90mm/sec, make sure " "Before increasing this parameter beyond the default of 90 mm/s, make sure "
"your printer can reliably bridge at the increased speeds and that ooze when " "your printer can reliably bridge at the increased speeds and that ooze when "
"tool changing is well controlled.\n" "tool changing is well controlled.\n"
"\n" "\n"
+15 -7
View File
@@ -6540,6 +6540,12 @@ msgstr "使用自由鏡頭"
msgid "If enabled, use free camera. If not enabled, use constrained camera." msgid "If enabled, use free camera. If not enabled, use constrained camera."
msgstr "如果啟用,則使用自由鏡頭。若未啟用,則使用受限鏡頭。" msgstr "如果啟用,則使用自由鏡頭。若未啟用,則使用受限鏡頭。"
msgid "Swap pan and rotate mouse buttons"
msgstr "交换鼠标按钮的平移与旋转功能"
msgid "If enabled, swaps the left and right mouse buttons pan and rotate functions."
msgstr "启用后,将左键和右键的平移与旋转功能对调"
msgid "Reverse mouse zoom" msgid "Reverse mouse zoom"
msgstr "反轉滑鼠滾輪縮放方向" msgstr "反轉滑鼠滾輪縮放方向"
@@ -12272,13 +12278,14 @@ msgstr "擠出頭最大可列印的層高。用於限制開啟自適應層高時
msgid "Extrusion rate smoothing" msgid "Extrusion rate smoothing"
msgstr "平滑擠出率" msgstr "平滑擠出率"
#, fuzzy
msgid "" msgid ""
"This parameter smooths out sudden extrusion rate changes that happen when " "This parameter smooths out sudden extrusion rate changes that happen when "
"the printer transitions from printing a high flow (high speed/larger width) " "the printer transitions from printing a high flow (high speed/larger width) "
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice " "extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n" "versa.\n"
"\n" "\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec " "It defines the maximum rate by which the extruded volumetric flow in mm³/s² "
"can change over time. Higher values mean higher extrusion rate changes are " "can change over time. Higher values mean higher extrusion rate changes are "
"allowed, resulting in faster speed transitions.\n" "allowed, resulting in faster speed transitions.\n"
"\n" "\n"
@@ -12288,13 +12295,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some " "Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For " "marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these " "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 " "cases a high value of around 300-350 mm³/s² is recommended as this allows "
"just enough smoothing to assist pressure advance achieve a smoother flow " "for just enough smoothing to assist pressure advance achieve a smoother flow "
"transition.\n" "transition.\n"
"\n" "\n"
"For slower printers without pressure advance, the value should be set much " "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 " "lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n" "extruders and 5-10 mm³/s² for Bowden style.\n"
"\n" "\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n" "This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n" "\n"
@@ -13880,6 +13887,7 @@ msgstr "圓錐體頂點處的角度,用於穩定換料塔。 更大的角度
msgid "Maximum wipe tower print speed" msgid "Maximum wipe tower print speed"
msgstr "換料塔最快列印速度" msgstr "換料塔最快列印速度"
#, fuzzy
msgid "" msgid ""
"The maximum print speed when purging in the wipe tower and printing the wipe " "The maximum print speed when purging in the wipe tower and printing the wipe "
"tower sparse layers. When purging, if the sparse infill speed or calculated " "tower sparse layers. When purging, if the sparse infill speed or calculated "
@@ -13894,7 +13902,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed " "the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\n" "on the wipe tower.\n"
"\n" "\n"
"Before increasing this parameter beyond the default of 90mm/sec, make sure " "Before increasing this parameter beyond the default of 90 mm/s, make sure "
"your printer can reliably bridge at the increased speeds and that ooze when " "your printer can reliably bridge at the increased speeds and that ooze when "
"tool changing is well controlled.\n" "tool changing is well controlled.\n"
"\n" "\n"
@@ -13909,7 +13917,7 @@ msgstr ""
"\n" "\n"
"提高此速度可能會影響塔的穩定性,並增加噴嘴與換料塔上斑點的碰撞力。\n" "提高此速度可能會影響塔的穩定性,並增加噴嘴與換料塔上斑點的碰撞力。\n"
"\n" "\n"
"在將此參數提高於預設值 90mm/sec 以上之前,請確保您的印表設備能夠可靠地在更高" "在將此參數提高於預設值 90mm/s 以上之前,請確保您的印表設備能夠可靠地在更高"
"的速度下橋接,並且工具更換時的溢出能良好的被控制。\n" "的速度下橋接,並且工具更換時的溢出能良好的被控制。\n"
"\n" "\n"
"對於換料塔外部周邊,無論此設定如何,都使用內部周邊速度。" "對於換料塔外部周邊,無論此設定如何,都使用內部周邊速度。"
+44
View File
@@ -0,0 +1,44 @@
<svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_50_344)">
<path d="M2.30558 2.99865L3.36346 4.03181L4.42135 2.99837" stroke="#707273" stroke-width="0.5"/>
<path d="M2.75277 2.39845L3.37108 3.00231L3.98939 2.39829" stroke="#ABABAB" stroke-width="0.5"/>
<path d="M3.94212 1.39367L5 2.42683L6.05789 1.39339" stroke="#707273" stroke-width="0.5"/>
<path d="M4.38931 0.793474L5.00762 1.39733L5.62593 0.793312" stroke="#ABABAB" stroke-width="0.5"/>
<path d="M5.56148 2.88305L6.61936 3.91621L7.67725 2.88277" stroke="#707273" stroke-width="0.5"/>
<path d="M6.00867 2.28285L6.62698 2.88671L7.24529 2.28269" stroke="#ABABAB" stroke-width="0.5"/>
<path d="M3.94973 4.62451L5.00761 5.65767L6.0655 4.62423" stroke="#707273" stroke-width="0.5"/>
<path d="M4.39692 4.02431L5.01523 4.62817L5.63354 4.02415" stroke="#ABABAB" stroke-width="0.5"/>
<path d="M5.62593 6.1643L6.68381 7.19746L7.7417 6.16402" stroke="#707273" stroke-width="0.5"/>
<path d="M6.07312 5.5641L6.69143 6.16796L7.30974 5.56394" stroke="#ABABAB" stroke-width="0.5"/>
<path d="M7.19075 4.62451L8.24864 5.65767L9.30652 4.62423" stroke="#707273" stroke-width="0.5"/>
<path d="M7.63794 4.02431L8.25625 4.62817L8.87457 4.02415" stroke="#ABABAB" stroke-width="0.5"/>
<path d="M3.93647 7.79784L4.99436 8.831L6.05224 7.79757" stroke="#707273" stroke-width="0.5"/>
<path d="M4.38366 7.19765L5.00197 7.80151L5.62029 7.19749" stroke="#ABABAB" stroke-width="0.5"/>
<path d="M7.16011 7.79784L8.218 8.831L9.27588 7.79757" stroke="#707273" stroke-width="0.5"/>
<path d="M7.6073 7.19765L8.22561 7.80151L8.84393 7.19749" stroke="#ABABAB" stroke-width="0.5"/>
<path d="M2.28115 6.2777L3.33903 7.31086L4.39692 6.27743" stroke="#707273" stroke-width="0.5"/>
<path d="M2.72834 5.67751L3.34665 6.28137L3.96496 5.67735" stroke="#ABABAB" stroke-width="0.5"/>
<path d="M0.746016 7.9252L1.67045 8.83104L2.72834 7.79761" stroke="#707273" stroke-width="0.5"/>
<path d="M1.05976 7.19765L1.67807 7.80151L2.29638 7.19749" stroke="#ABABAB" stroke-width="0.5"/>
<path d="M0.674093 4.62451L1.73198 5.65767L2.78986 4.62423" stroke="#707273" stroke-width="0.5"/>
<path d="M1.12128 4.02431L1.73959 4.62817L2.3579 4.02415" stroke="#ABABAB" stroke-width="0.5"/>
<path d="M0.678528 1.37752L1.67045 2.32702L2.72834 1.29358" stroke="#707273" stroke-width="0.5"/>
<path d="M1.05976 0.69362L1.67807 1.29748L2.29638 0.693458" stroke="#ABABAB" stroke-width="0.5"/>
<path d="M7.21014 1.24951L8.26802 2.28267L9.32591 1.24923" stroke="#707273" stroke-width="0.5"/>
<path d="M7.76739 0.77738L8.27564 1.25297L8.76419 0.777344" stroke="#ABABAB" stroke-width="0.5"/>
<path d="M8.99436 0.75769H0.99436C0.856289 0.75769 0.74436 0.869619 0.74436 1.00769V9.00769C0.74436 9.14576 0.856289 9.25769 0.99436 9.25769H8.99436C9.13243 9.25769 9.24436 9.14576 9.24436 9.00769V1.00769C9.24436 0.869619 9.13243 0.75769 8.99436 0.75769Z" stroke="#262E30" stroke-width="0.5"/>
<path d="M9.32591 5.65771L5.6773 9.30652" stroke="#262E30" stroke-width="0.5"/>
<path d="M4.43306 0.724121L0.674093 4.48328" stroke="#262E30" stroke-width="0.5"/>
<path d="M9.27161 2.4071L2.42689 9.2522" stroke="#262E30" stroke-width="0.5"/>
<path d="M7.67725 0.693481L0.68421 7.68688" stroke="#262E30" stroke-width="0.5"/>
<path d="M4.34229 9.32598L0.693487 5.67737" stroke="#262E30" stroke-width="0.5"/>
<path d="M9.27588 4.43303L5.51673 0.674072" stroke="#262E30" stroke-width="0.5"/>
<path d="M7.5929 9.27161L0.747808 2.42688" stroke="#262E30" stroke-width="0.5"/>
<path d="M9.30652 7.67724L2.31313 0.684204" stroke="#262E30" stroke-width="0.5"/>
</g>
<defs>
<clipPath id="clip0_50_344">
<rect width="10" height="10" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

+29
View File
@@ -0,0 +1,29 @@
<svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_252_3415)">
<path d="M9.00005 0.799805H1.00005C0.900049 0.799805 0.800049 0.899805 0.800049 0.999805V8.9998C0.800049 9.0998 0.900049 9.1998 1.00005 9.1998H9.00005C9.10005 9.1998 9.20005 9.0998 9.20005 8.9998V0.999805C9.20005 0.899805 9.10005 0.799805 9.00005 0.799805Z" stroke="#009688" stroke-width="0.5"/>
<path d="M4.40245 0.799805L0.78833 4.51161" stroke="#009688" stroke-width="0.5"/>
<path d="M4.98863 6.66064L2.44897 9.2003" stroke="#009688" stroke-width="0.5"/>
<path d="M9.30005 2.3999L8.30005 3.3999" stroke="#009688" stroke-width="0.5"/>
<path d="M7.62586 0.799805L0.78833 7.63733" stroke="#009688" stroke-width="0.5"/>
<path d="M4.30477 9.20004L0.78833 5.68359" stroke="#009688" stroke-width="0.5"/>
<path d="M8.21206 3.43714L5.47705 0.799805" stroke="#009688" stroke-width="0.5"/>
<path d="M4.98853 6.66064L0.78833 2.46045" stroke="#009688" stroke-width="0.5"/>
<path d="M4.98865 3.43714L2.35132 0.799805" stroke="#009688" stroke-width="0.5"/>
<path d="M6.56562 3.38428L4.98853 4.96138" stroke="#009688" stroke-width="0.5"/>
<path d="M8.14272 3.38428L4.98853 6.53847" stroke="#009688" stroke-width="0.5"/>
<path d="M9.22692 4.07471L5.08704 8.21459" stroke="#009688" stroke-width="0.5"/>
<path d="M9.12844 5.94727L5.97424 9.10146" stroke="#009688" stroke-width="0.5"/>
<path d="M9.22718 7.5249L7.55151 9.20057" stroke="#009688" stroke-width="0.5"/>
<path d="M9.22688 4.96138L7.64978 3.38428" stroke="#009688" stroke-width="0.5"/>
<path d="M9.22695 6.53847L6.07275 3.38428" stroke="#009688" stroke-width="0.5"/>
<path d="M9.22692 8.21459L5.08704 4.07471" stroke="#009688" stroke-width="0.5"/>
<path d="M8.24123 9.20009L5.08704 6.0459" stroke="#009688" stroke-width="0.5"/>
<path d="M6.66419 9.10145L4.98853 7.42578" stroke="#009688" stroke-width="0.5"/>
<path d="M5.09767 3.3999H9.20002V8.8697C9.20002 8.96738 9.10235 9.16273 8.907 9.16273H5V3.3999H5.09767Z" stroke="#009688" stroke-width="0.5"/>
</g>
<defs>
<clipPath id="clip0_252_3415">
<rect width="10" height="10" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

+158
View File
@@ -0,0 +1,158 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="10"
height="10"
viewBox="0 0 10 10"
fill="none"
version="1.1"
id="svg5"
sodipodi:docname="param_zigzag.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview5"
pagecolor="#ffffff"
bordercolor="#009688"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="81.3"
inkscape:cx="5"
inkscape:cy="5"
inkscape:window-width="2560"
inkscape:window-height="1009"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg5" />
<g
clip-path="url(#clip0_8991_35043)"
id="g5">
<rect
x="0.75"
y="0.75"
width="8.5"
height="8.5"
rx="0.25"
stroke="#262E30"
stroke-width="0.5"
id="rect1" />
<path
d="M0.872559 0.918608L9.08702 9.13218"
stroke="#262E30"
stroke-width="0.5"
stroke-linecap="round"
id="path1" />
<path
d="M0.872559 3.73519L6.27013 9.13218"
stroke="#262E30"
stroke-width="0.5"
stroke-linecap="round"
id="path2" />
<path
d="M0.87207 6.43369L3.57086 9.13218"
stroke="#262E30"
stroke-width="0.5"
stroke-linecap="round"
id="path3" />
<path
d="M9.20605 6.19391L3.80848 0.796919"
stroke="#262E30"
stroke-width="0.5"
stroke-linecap="round"
id="path4" />
<path
d="M9.20605 3.49542L6.50727 0.796921"
stroke="#262E30"
stroke-width="0.5"
stroke-linecap="round"
id="path5" />
</g>
<g
clip-path="url(#clip0_8991_35043-1)"
id="g5-5"
transform="rotate(-90,4.9876999,5.0055351)"
style="stroke:#009688;stroke-opacity:1">
<rect
x="0.75"
y="0.75"
width="8.5"
height="8.5"
rx="0.25"
stroke="#262e30"
stroke-width="0.5"
id="rect1-3"
style="stroke:#009688;stroke-opacity:1" />
<path
d="M 0.872559,0.918608 9.08702,9.13218"
stroke="#262e30"
stroke-width="0.5"
stroke-linecap="round"
id="path1-4"
style="stroke:#009688;stroke-opacity:1" />
<path
d="M 0.872559,3.73519 6.27013,9.13218"
stroke="#262e30"
stroke-width="0.5"
stroke-linecap="round"
id="path2-4"
style="stroke:#009688;stroke-opacity:1" />
<path
d="M 0.87207,6.43369 3.57086,9.13218"
stroke="#262e30"
stroke-width="0.5"
stroke-linecap="round"
id="path3-0"
style="stroke:#009688;stroke-opacity:1" />
<path
d="M 9.20605,6.19391 3.80848,0.796919"
stroke="#262e30"
stroke-width="0.5"
stroke-linecap="round"
id="path4-1"
style="stroke:#009688;stroke-opacity:1" />
<path
d="M 9.20605,3.49542 6.50727,0.796921"
stroke="#262e30"
stroke-width="0.5"
stroke-linecap="round"
id="path5-0"
style="stroke:#009688;stroke-opacity:1" />
</g>
<defs
id="defs5">
<clipPath
id="clip0_8991_35043">
<rect
width="10"
height="10"
fill="white"
id="rect5" />
</clipPath>
<clipPath
id="clip0_8991_35043-9">
<rect
width="10"
height="10"
fill="#ffffff"
id="rect5-5"
x="0"
y="0" />
</clipPath>
<clipPath
id="clip0_8991_35043-1">
<rect
width="10"
height="10"
fill="#ffffff"
id="rect5-0"
x="0"
y="0" />
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

@@ -6,7 +6,7 @@
"instantiation": "false", "instantiation": "false",
"gcode_flavor": "marlin2", "gcode_flavor": "marlin2",
"before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\nG92 E0.0\n;[layer_z]\n\n", "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\nG92 E0.0\n;[layer_z]\n\n",
"machine_start_gcode": "M4899 T3 ; Enable v3 jerk and S-curve acceleration \nM104 S150 ; Set hotend temp to 150 degrees to prevent ooze\nM190 S{first_layer_bed_temperature[0]} ; set and wait for bed temp to stabilize\nM109 S{first_layer_temperature[0]} ; set final nozzle temp to stabilize\nG28 ;Home", "machine_start_gcode": "M4899 T3 ; Enable v3 jerk and S-curve acceleration \nM104 S150 ; Set hotend temp to 150 degrees to prevent ooze\nM190 S{first_layer_bed_temperature[0]} ; set and wait for bed temp to stabilize\nM109 S{first_layer_temperature[0]} ; set final nozzle temp to stabilize\nG28 ;Home\n;LAYER_COUNT:{total_layer_count}",
"machine_end_gcode": "M104 S0\nM140 S0\n;Retract the filament\nG92 E1\nG1 E-1 F300\nG28 X0 Y0\nM18", "machine_end_gcode": "M104 S0\nM140 S0\n;Retract the filament\nG92 E1\nG1 E-1 F300\nG28 X0 Y0\nM18",
"change_filament_gcode": "M600", "change_filament_gcode": "M600",
"machine_pause_gcode": "M601" "machine_pause_gcode": "M601"
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "Bambulab", "name": "Bambulab",
"url": "http://www.bambulab.com/Parameters/vendor/BBL.json", "url": "http://www.bambulab.com/Parameters/vendor/BBL.json",
"version": "01.10.00.36", "version": "02.00.00.53",
"force_update": "0", "force_update": "0",
"description": "the initial version of BBL configurations", "description": "the initial version of BBL configurations",
"machine_model_list": [ "machine_model_list": [
@@ -103,5 +103,11 @@
"wipe_tower_no_sparse_layers": "0", "wipe_tower_no_sparse_layers": "0",
"xy_contour_compensation": "0", "xy_contour_compensation": "0",
"xy_hole_compensation": "0", "xy_hole_compensation": "0",
"compatible_printers": [] "compatible_printers": [],
"smooth_coefficient": "80",
"overhang_totally_speed": "19",
"scarf_angle_threshold": "155",
"infill_shift_step": "0.4",
"infill_rotate_step": "0",
"symmetric_infill_y_axis": "0"
} }
+74 -1
View File
@@ -31,7 +31,80 @@
"sub_path": "process/0.24mm Standard @Thinker X400.json" "sub_path": "process/0.24mm Standard @Thinker X400.json"
} }
], ],
"filament_list": [], "filament_list": [
{
"name": "fdm_filament_common",
"sub_path": "filament/fdm_filament_common.json"
},
{
"name": "fdm_filament_pla",
"sub_path": "filament/fdm_filament_pla.json"
},
{
"name": "Eryone Standard PLA",
"sub_path": "filament/Eryone Standard PLA.json"
},
{
"name": "Eryone PLA",
"sub_path": "filament/Eryone PLA.json"
},
{
"name": "Eryone PLA-CF",
"sub_path": "filament/Eryone PLA-CF.json"
},
{
"name": "Eryone PA",
"sub_path": "filament/Eryone PA.json"
},
{
"name": "Eryone PA-CF",
"sub_path": "filament/Eryone PA-CF.json"
},
{
"name": "Eryone PA-GF",
"sub_path": "filament/Eryone PA-GF.json"
},
{
"name": "Eryone PP",
"sub_path": "filament/Eryone PP.json"
},
{
"name": "Eryone PP-CF",
"sub_path": "filament/Eryone PP-CF.json"
},
{
"name": "Eryone ABS",
"sub_path": "filament/Eryone ABS.json"
},
{
"name": "Eryone ABS-CF",
"sub_path": "filament/Eryone ABS-CF.json"
},
{
"name": "Eryone PETG",
"sub_path": "filament/Eryone PETG.json"
},
{
"name": "Eryone PETG-CF",
"sub_path": "filament/Eryone PETG-CF.json"
},
{
"name": "Eryone ASA",
"sub_path": "filament/Eryone ASA.json"
},
{
"name": "Eryone ASA-CF",
"sub_path": "filament/Eryone ASA-CF.json"
},
{
"name": "Eryone Silk PLA",
"sub_path": "filament/Eryone Silk PLA.json"
},
{
"name": "Eryone TPU",
"sub_path": "filament/Eryone TPU.json"
}
],
"machine_list": [ "machine_list": [
{ {
"name": "fdm_machine_common", "name": "fdm_machine_common",
@@ -0,0 +1,78 @@
{
"type": "filament",
"filament_id": "EFL81",
"setting_id": "EFSA11",
"name": "Eryone ABS-CF",
"from": "system",
"instantiation": "true",
"inherits": "Eryone Standard PLA",
"compatible_printers": [
"Thinker X400 0.4 nozzle"
],
"filament_end_gcode": [
"; filament end gcode \nSET_FAN_SPEED FAN=filter_fan SPEED=0"
],
"filament_flow_ratio": [
"0.92"
],
"filament_max_volumetric_speed": [
"10"
],
"filament_retraction_length": [
"1"
],
"close_fan_the_first_x_layers": [
"3"
],
"fan_cooling_layer_time": [
"30"
],
"fan_max_speed": [
"60"
],
"fan_min_speed": [
"30"
],
"filament_settings_id": [
"Eryone ABS-CF"
],
"filament_start_gcode": [
"; filament start gcode\nSET_FAN_SPEED FAN=filter_fan SPEED=0"
],
"filament_type": [
"ABS-CF"
],
"filament_vendor": [
"Eryone"
],
"hot_plate_temp": [
"100"
],
"hot_plate_temp_initial_layer": [
"100"
],
"nozzle_temperature": [
"250"
],
"nozzle_temperature_initial_layer": [
"260"
],
"nozzle_temperature_range_high": [
"290"
],
"nozzle_temperature_range_low": [
"240"
],
"slow_down_layer_time": [
"10"
],
"overhang_fan_threshold": [
"25%"
],
"support_material_interface_fan_speed": [
"60"
],
"temperature_vitrification": [
"100"
]
}
@@ -0,0 +1,111 @@
{
"type": "filament",
"filament_id": "EFL91",
"setting_id": "EFSA01",
"name": "Eryone ABS",
"from": "system",
"instantiation": "true",
"inherits": "Eryone Standard PLA",
"compatible_printers": [
"Thinker X400 0.4 nozzle"
],
"close_fan_the_first_x_layers": [
"3"
],
"additional_cooling_fan_speed": [
"0"
],
"complete_print_exhaust_fan_speed": [
"70"
],
"cool_plate_temp": [
"0"
],
"cool_plate_temp_initial_layer": [
"0"
],
"during_print_exhaust_fan_speed": [
"70"
],
"eng_plate_temp": [
"100"
],
"eng_plate_temp_initial_layer": [
"105"
],
"fan_cooling_layer_time": [
"30"
],
"fan_max_speed": [
"70"
],
"fan_min_speed": [
"10"
],
"filament_settings_id": [
"Eryone ABS"
],
"filament_density": [
"1.04"
],
"filament_end_gcode": [
"; filament end gcode\nSET_FAN_SPEED FAN=filter_fan SPEED=0"
],
"filament_start_gcode": [
"; filament start gcode\nSET_FAN_SPEED FAN=filter_fan SPEED=0\n"
],
"filament_type": [
"ABS"
],
"filament_flow_ratio": [
"0.92"
],
"filament_max_volumetric_speed": [
"15"
],
"filament_vendor": [
"Eryone"
],
"hot_plate_temp": [
"95"
],
"hot_plate_temp_initial_layer": [
"95"
],
"nozzle_temperature": [
"255"
],
"nozzle_temperature_initial_layer": [
"260"
],
"nozzle_temperature_range_high": [
"290"
],
"overhang_fan_speed": [
"80"
],
"overhang_fan_threshold": [
"25%"
],
"nozzle_temperature_range_low": [
"240"
],
"required_nozzle_HRC": [
"3"
],
"slow_down_layer_time": [
"4"
],
"support_material_interface_fan_speed": [
"60"
],
"temperature_vitrification": [
"100"
],
"textured_plate_temp": [
"100"
],
"textured_plate_temp_initial_layer": [
"105"
]
}
@@ -0,0 +1,78 @@
{
"type": "filament",
"filament_id": "EFL82",
"setting_id": "EFSA82",
"name": "Eryone ASA-CF",
"from": "system",
"instantiation": "true",
"inherits": "Eryone Standard PLA",
"compatible_printers": [
"Thinker X400 0.4 nozzle"
],
"close_fan_the_first_x_layers": [
"3"
],
"fan_cooling_layer_time": [
"30"
],
"fan_max_speed": [
"50"
],
"fan_min_speed": [
"20"
],
"filament_settings_id": [
"Eryone ASA-CF"
],
"filament_type": [
"ASA-CF"
],
"filament_vendor": [
"Eryone"
],
"filament_end_gcode": [
"; filament end gcode \nSET_FAN_SPEED FAN=filter_fan SPEED=0"
],
"filament_flow_ratio": [
"0.92"
],
"filament_max_volumetric_speed": [
"8"
],
"filament_retraction_length": [
"1"
],
"filament_start_gcode": [
"; filament start gcode\nSET_FAN_SPEED FAN=filter_fan SPEED=0"
],
"hot_plate_temp": [
"110"
],
"hot_plate_temp_initial_layer": [
"110"
],
"nozzle_temperature": [
"260"
],
"nozzle_temperature_initial_layer": [
"275"
],
"nozzle_temperature_range_high": [
"290"
],
"overhang_fan_threshold": [
"25%"
],
"support_material_interface_fan_speed": [
"60"
],
"temperature_vitrification": [
"180"
],
"nozzle_temperature_range_low": [
"240"
],
"slow_down_layer_time": [
"12"
]
}
@@ -0,0 +1,81 @@
{
"type": "filament",
"filament_id": "EFL92",
"setting_id": "EFSA02",
"name": "Eryone ASA",
"from": "system",
"instantiation": "true",
"inherits": "Eryone Standard PLA",
"compatible_printers": [
"Thinker X400 0.4 nozzle"
],
"close_fan_the_first_x_layers": [
"3"
],
"fan_cooling_layer_time": [
"30"
],
"fan_max_speed": [
"50"
],
"fan_min_speed": [
"20"
],
"filament_end_gcode": [
"; filament end gcode \nSET_FAN_SPEED FAN=filter_fan SPEED=0"
],
"filament_flow_ratio": [
"0.92"
],
"filament_max_volumetric_speed": [
"14"
],
"filament_retraction_length": [
"1"
],
"filament_settings_id": [
"Eryone ASA"
],
"filament_type": [
"ASA"
],
"filament_start_gcode": [
"; filament start gcode\nSET_FAN_SPEED FAN=filter_fan SPEED=0"
],
"filament_vendor": [
"Eryone"
],
"hot_plate_temp": [
"110"
],
"hot_plate_temp_initial_layer": [
"110"
],
"nozzle_temperature": [
"265"
],
"nozzle_temperature_initial_layer": [
"270"
],
"nozzle_temperature_range_high": [
"290"
],
"nozzle_temperature_range_low": [
"240"
],
"slow_down_layer_time": [
"12"
],
"overhang_fan_threshold": [
"25%"
],
"slow_down_min_speed": [
"20"
],
"support_material_interface_fan_speed": [
"60"
],
"temperature_vitrification": [
"180"
]
}
@@ -0,0 +1,78 @@
{
"type": "filament",
"filament_id": "EFL72",
"setting_id": "EFSA72",
"name": "Eryone PA-CF",
"from": "system",
"instantiation": "true",
"inherits": "Eryone Standard PLA",
"compatible_printers": [
"Thinker X400 0.4 nozzle"
],
"close_fan_the_first_x_layers": [
"3"
],
"fan_cooling_layer_time": [
"20"
],
"fan_max_speed": [
"40"
],
"fan_min_speed": [
"20"
],
"filament_end_gcode": [
"; filament end gcode \nSET_FAN_SPEED FAN=filter_fan SPEED=0"
],
"filament_flow_ratio": [
"0.94"
],
"filament_max_volumetric_speed": [
"8"
],
"filament_retraction_length": [
"1"
],
"filament_settings_id": [
"Eryone PA-CF"
],
"filament_start_gcode": [
"; filament start gcode\nSET_FAN_SPEED FAN=filter_fan SPEED=0"
],
"filament_type": [
"PA-CF"
],
"filament_vendor": [
"Eryone"
],
"hot_plate_temp": [
"115"
],
"hot_plate_temp_initial_layer": [
"115"
],
"nozzle_temperature": [
"265"
],
"nozzle_temperature_initial_layer": [
"275"
],
"overhang_fan_threshold": [
"25%"
],
"nozzle_temperature_range_high": [
"280"
],
"nozzle_temperature_range_low": [
"240"
],
"support_material_interface_fan_speed": [
"60"
],
"temperature_vitrification": [
"200"
],
"slow_down_layer_time": [
"10"
]
}
@@ -0,0 +1,75 @@
{
"type": "filament",
"filament_id": "EFL73",
"setting_id": "EFSA73",
"name": "Eryone PA-GF",
"from": "system",
"instantiation": "true",
"inherits": "Eryone Standard PLA",
"compatible_printers": [
"Thinker X400 0.4 nozzle"
],
"close_fan_the_first_x_layers": [
"3"
],
"fan_cooling_layer_time": [
"20"
],
"fan_max_speed": [
"40"
],
"fan_min_speed": [
"20"
],
"filament_end_gcode": [
"; filament end gcode \nSET_FAN_SPEED FAN=filter_fan SPEED=0"
],
"filament_flow_ratio": [
"0.94"
],
"filament_retraction_length": [
"1"
],
"filament_settings_id": [
"Eryone PA-GF"
],
"filament_start_gcode": [
"; filament start gcode\nSET_FAN_SPEED FAN=filter_fan SPEED=0"
],
"filament_type": [
"PA-GF"
],
"filament_vendor": [
"Eryone"
],
"hot_plate_temp": [
"110"
],
"hot_plate_temp_initial_layer": [
"110"
],
"nozzle_temperature": [
"270"
],
"nozzle_temperature_initial_layer": [
"280"
],
"nozzle_temperature_range_high": [
"280"
],
"nozzle_temperature_range_low": [
"240"
],
"overhang_fan_threshold": [
"25%"
],
"support_material_interface_fan_speed": [
"60"
],
"temperature_vitrification": [
"200"
],
"slow_down_layer_time": [
"10"
]
}
@@ -0,0 +1,84 @@
{
"type": "filament",
"filament_id": "EFL71",
"setting_id": "EFSA71",
"name": "Eryone PA",
"from": "system",
"instantiation": "true",
"inherits": "Eryone Standard PLA",
"compatible_printers": [
"Thinker X400 0.4 nozzle"
],
"close_fan_the_first_x_layers": [
"3"
],
"fan_cooling_layer_time": [
"30"
],
"fan_max_speed": [
"20"
],
"fan_min_speed": [
"10"
],
"filament_end_gcode": [
"; filament end gcode \nSET_FAN_SPEED FAN=filter_fan SPEED=0"
],
"filament_flow_ratio": [
"0.92"
],
"filament_max_volumetric_speed": [
"8"
],
"filament_notes": [
"brim width >= 20;"
],
"filament_retraction_length": [
"1"
],
"filament_settings_id": [
"Eryone PA"
],
"filament_start_gcode": [
"; filament start gcode\nSET_FAN_SPEED FAN=filter_fan SPEED=0"
],
"filament_type": [
"PA"
],
"filament_vendor": [
"Eryone"
],
"hot_plate_temp": [
"115"
],
"hot_plate_temp_initial_layer": [
"115"
],
"nozzle_temperature": [
"265"
],
"nozzle_temperature_initial_layer": [
"270"
],
"overhang_fan_threshold": [
"25%"
],
"slow_down_layer_time": [
"10"
],
"slow_down_min_speed": [
"15"
],
"support_material_interface_fan_speed": [
"60"
],
"temperature_vitrification": [
"200"
],
"nozzle_temperature_range_high": [
"280"
],
"nozzle_temperature_range_low": [
"240"
]
}
@@ -0,0 +1,82 @@
{
"type": "filament",
"filament_id": "EFL43",
"setting_id": "EFSA43",
"name": "Eryone PETG-CF",
"from": "system",
"instantiation": "true",
"inherits": "Eryone Standard PLA",
"compatible_printers": [
"Thinker X400 0.4 nozzle"
],
"close_fan_the_first_x_layers": [
"3"
],
"fan_cooling_layer_time": [
"30"
],
"fan_max_speed": [
"90"
],
"fan_min_speed": [
"50"
],
"filament_vendor": [
"Eryone"
],
"filament_end_gcode": [
"; filament end gcode \nSET_FAN_SPEED FAN=filter_fan SPEED=0\n"
],
"filament_flow_ratio": [
"0.94"
],
"filament_retraction_length": [
"1"
],
"filament_start_gcode": [
"; filament start gcode\nSET_FAN_SPEED FAN=filter_fan SPEED=1"
],
"filament_max_volumetric_speed": [
"14"
],
"filament_settings_id": [
"Eryone PETG"
],
"filament_type": [
"PETG-CF"
],
"hot_plate_temp": [
"80"
],
"hot_plate_temp_initial_layer": [
"80"
],
"overhang_fan_threshold": [
"25%"
],
"nozzle_temperature": [
"245"
],
"nozzle_temperature_initial_layer": [
"250"
],
"nozzle_temperature_range_high": [
"270"
],
"nozzle_temperature_range_low": [
"225"
],
"slow_down_min_speed": [
"20"
],
"support_material_interface_fan_speed": [
"80"
],
"temperature_vitrification": [
"80"
],
"slow_down_layer_time": [
"7"
]
}
@@ -0,0 +1,61 @@
{
"type": "filament",
"filament_id": "EFL93",
"setting_id": "EFSA03",
"name": "Eryone PETG",
"from": "system",
"instantiation": "true",
"inherits": "Eryone Standard PLA",
"compatible_printers": [
"Thinker X400 0.4 nozzle"
],
"fan_min_speed": [
"90"
],
"close_fan_the_first_x_layers": [
"2"
],
"filament_vendor": [
"Eryone"
],
"filament_end_gcode": [
"; filament end gcode \nSET_FAN_SPEED FAN=filter_fan SPEED=0\n"
],
"filament_start_gcode": [
"; filament start gcode\nSET_FAN_SPEED FAN=filter_fan SPEED=1"
],
"filament_max_volumetric_speed": [
"14"
],
"filament_settings_id": [
"Eryone PETG"
],
"filament_type": [
"PETG"
],
"hot_plate_temp": [
"75"
],
"hot_plate_temp_initial_layer": [
"75"
],
"overhang_fan_threshold": [
"25%"
],
"nozzle_temperature": [
"245"
],
"nozzle_temperature_initial_layer": [
"245"
],
"nozzle_temperature_range_high": [
"270"
],
"nozzle_temperature_range_low": [
"225"
],
"slow_down_layer_time": [
"7"
]
}
@@ -0,0 +1,58 @@
{
"type": "filament",
"filament_id": "EFL40",
"setting_id": "EFSA40",
"name": "Eryone PLA-CF",
"from": "system",
"instantiation": "true",
"inherits": "Eryone Standard PLA",
"compatible_printers": [
"Thinker X400 0.4 nozzle"
],
"fan_min_speed": [
"100"
],
"filament_flow_ratio": [
"0.95"
],
"filament_max_volumetric_speed": [
"15"
],
"filament_retraction_length": [
"1"
],
"filament_settings_id": [
"Eryone PLA-CF"
],
"filament_type": [
"PLA-CF"
],
"hot_plate_temp": [
"55"
],
"hot_plate_temp_initial_layer": [
"55"
],
"filament_start_gcode": [
"; filament start gcode\nSET_FAN_SPEED FAN=filter_fan SPEED=1"
],
"filament_end_gcode": [
"; filament end gcode \nSET_FAN_SPEED FAN=filter_fan SPEED=0"
],
"nozzle_temperature": [
"225"
],
"nozzle_temperature_initial_layer": [
"230"
],
"nozzle_temperature_range_high": [
"250"
],
"slow_down_layer_time": [
"7"
],
"support_material_interface_fan_speed": [
"100"
]
}
@@ -0,0 +1,39 @@
{
"type": "filament",
"filament_id": "EFL90",
"setting_id": "EFSA00",
"name": "Eryone PLA",
"from": "system",
"instantiation": "true",
"inherits": "Eryone Standard PLA",
"compatible_printers": [
"Thinker X400 0.4 nozzle"
],
"fan_min_speed": [
"90"
],
"filament_max_volumetric_speed": [
"20"
],
"filament_settings_id": [
"Eryone PLA"
],
"hot_plate_temp": [
"60"
],
"hot_plate_temp_initial_layer": [
"60"
],
"filament_start_gcode": [
"; filament start gcode\nSET_FAN_SPEED FAN=filter_fan SPEED=1"
],
"filament_end_gcode": [
"; filament end gcode \nSET_FAN_SPEED FAN=filter_fan SPEED=0"
],
"slow_down_layer_time": [
"4"
],
"slow_down_min_speed": [
"15"
]
}
@@ -0,0 +1,75 @@
{
"type": "filament",
"filament_id": "EFL33",
"setting_id": "EFSA33",
"name": "Eryone PP-CF",
"from": "system",
"instantiation": "true",
"inherits": "Eryone Standard PLA",
"compatible_printers": [
"Thinker X400 0.4 nozzle"
],
"fan_max_speed": [
"35"
],
"fan_min_speed": [
"20"
],
"filament_end_gcode": [
"; filament end gcode \nSET_FAN_SPEED FAN=filter_fan SPEED=0"
],
"filament_flow_ratio": [
"0.92"
],
"fan_cooling_layer_time": [
"30"
],
"close_fan_the_first_x_layers": [
"3"
],
"filament_max_volumetric_speed": [
"8"
],
"filament_notes": [
"Printing platform glue spraying"
],
"filament_retraction_length": [
"1"
],
"filament_vendor": [
"Eryone"
],
"filament_settings_id": [
"Eryone PP-CF"
],
"filament_type": [
"PP-CF"
],
"filament_start_gcode": [
"; filament start gcode\nSET_FAN_SPEED FAN=filter_fan SPEED=0"
],
"hot_plate_temp": [
"100"
],
"hot_plate_temp_initial_layer": [
"100"
],
"nozzle_temperature": [
"240"
],
"nozzle_temperature_initial_layer": [
"240"
],
"overhang_fan_threshold": [
"25%"
],
"slow_down_layer_time": [
"10"
],
"support_material_interface_fan_speed": [
"60"
],
"temperature_vitrification": [
"160"
]
}
@@ -0,0 +1,79 @@
{
"type": "filament",
"filament_id": "EFL43",
"setting_id": "EFSA43",
"name": "Eryone PP",
"from": "system",
"instantiation": "true",
"inherits": "Eryone Standard PLA",
"compatible_printers": [
"Thinker X400 0.4 nozzle"
],
"close_fan_the_first_x_layers": [
"3"
],
"fan_cooling_layer_time": [
"30"
],
"fan_max_speed": [
"35"
],
"fan_min_speed": [
"20"
],
"filament_end_gcode": [
"; filament end gcode \nSET_FAN_SPEED FAN=filter_fan SPEED=0"
],
"filament_flow_ratio": [
"0.95"
],
"filament_max_volumetric_speed": [
"10"
],
"filament_notes": [
"Printing platform glue spraying"
],
"filament_vendor": [
"Eryone"
],
"filament_settings_id": [
"Eryone PP"
],
"filament_type": [
"PP"
],
"filament_start_gcode": [
"; filament start gcode\nSET_FAN_SPEED FAN=filter_fan SPEED=0"
],
"hot_plate_temp": [
"100"
],
"hot_plate_temp_initial_layer": [
"100"
],
"nozzle_temperature": [
"230"
],
"nozzle_temperature_initial_layer": [
"235"
],
"overhang_fan_threshold": [
"25%"
],
"nozzle_temperature_range_high": [
"270"
],
"nozzle_temperature_range_low": [
"225"
],
"slow_down_layer_time": [
"10"
],
"support_material_interface_fan_speed": [
"60"
],
"temperature_vitrification": [
"160"
]
}
@@ -0,0 +1,39 @@
{
"type": "filament",
"filament_id": "EFL941",
"setting_id": "EFSA041",
"name": "Eryone Silk PLA",
"from": "system",
"instantiation": "true",
"inherits": "Eryone Standard PLA",
"compatible_printers": [
"Thinker X400 0.4 nozzle"
],
"filament_start_gcode": [
"; filament start gcode\nSET_FAN_SPEED FAN=filter_fan SPEED=1"
],
"filament_end_gcode": [
"; filament end gcode \nSET_FAN_SPEED FAN=filter_fan SPEED=0\n"
],
"filament_max_volumetric_speed": [
"12"
],
"filament_type": [
"Silk"
],
"filament_settings_id": [
"Eryone Silk PLA"
],
"hot_plate_temp": [
"60"
],
"nozzle_temperature": [
"230"
],
"nozzle_temperature_initial_layer": [
"230"
],
"slow_down_layer_time": [
"7"
]
}
@@ -0,0 +1,250 @@
{
"type": "filament",
"name": "Eryone Standard PLA",
"from": "system",
"instantiation": "false",
"compatible_printers": [
"Thinker X400 0.4 nozzle"
],
"activate_air_filtration": [
"0"
],
"activate_chamber_temp_control": [
"0"
],
"additional_cooling_fan_speed": [
"70"
],
"chamber_temperature": [
"0"
],
"close_fan_the_first_x_layers": [
"1"
],
"compatible_printers_condition": "",
"compatible_prints": [],
"compatible_prints_condition": "",
"complete_print_exhaust_fan_speed": [
"80"
],
"cool_plate_temp": [
"60"
],
"cool_plate_temp_initial_layer": [
"60"
],
"default_filament_colour": [
""
],
"during_print_exhaust_fan_speed": [
"60"
],
"enable_overhang_bridge_fan": [
"1"
],
"enable_pressure_advance": [
"0"
],
"eng_plate_temp": [
"60"
],
"eng_plate_temp_initial_layer": [
"60"
],
"fan_cooling_layer_time": [
"100"
],
"fan_max_speed": [
"100"
],
"fan_min_speed": [
"100"
],
"filament_cooling_final_speed": [
"3.4"
],
"filament_cooling_initial_speed": [
"2.2"
],
"filament_cooling_moves": [
"4"
],
"filament_cost": [
"20"
],
"filament_density": [
"1.24"
],
"filament_deretraction_speed": [
"nil"
],
"filament_diameter": [
"1.75"
],
"filament_end_gcode": [
"; filament end gcode \n"
],
"filament_flow_ratio": [
"0.98"
],
"filament_is_support": [
"0"
],
"filament_load_time": [
"0"
],
"filament_loading_speed": [
"28"
],
"filament_loading_speed_start": [
"3"
],
"filament_max_volumetric_speed": [
"12"
],
"filament_minimal_purge_on_wipe_tower": [
"15"
],
"filament_multitool_ramming": [
"0"
],
"filament_multitool_ramming_flow": [
"10"
],
"filament_multitool_ramming_volume": [
"10"
],
"filament_notes": [
""
],
"filament_ramming_parameters": [
"120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6"
],
"filament_retract_before_wipe": [
"nil"
],
"filament_retract_lift_above": [
"nil"
],
"filament_retract_lift_below": [
"nil"
],
"filament_retract_lift_enforce": [
"nil"
],
"filament_retract_restart_extra": [
"nil"
],
"filament_retract_when_changing_layer": [
"nil"
],
"filament_retraction_length": [
"nil"
],
"filament_retraction_minimum_travel": [
"nil"
],
"filament_retraction_speed": [
"nil"
],
"filament_settings_id": [
"Eryone Standard PLA"
],
"filament_shrink": [
"100%"
],
"filament_soluble": [
"0"
],
"filament_start_gcode": [
"; filament start gcode"
],
"filament_toolchange_delay": [
"0"
],
"filament_type": [
"PLA"
],
"filament_unload_time": [
"0"
],
"filament_unloading_speed": [
"90"
],
"filament_unloading_speed_start": [
"100"
],
"filament_vendor": [
"Eryone"
],
"filament_wipe": [
"nil"
],
"filament_wipe_distance": [
"nil"
],
"filament_z_hop": [
"nil"
],
"filament_z_hop_types": [
"nil"
],
"full_fan_speed_layer": [
"0"
],
"hot_plate_temp": [
"60"
],
"hot_plate_temp_initial_layer": [
"65"
],
"nozzle_temperature": [
"220"
],
"nozzle_temperature_initial_layer": [
"220"
],
"nozzle_temperature_range_high": [
"260"
],
"nozzle_temperature_range_low": [
"180"
],
"overhang_fan_speed": [
"100"
],
"overhang_fan_threshold": [
"50%"
],
"pressure_advance": [
"0.02"
],
"reduce_fan_stop_start_freq": [
"1"
],
"required_nozzle_HRC": [
"0"
],
"slow_down_for_layer_cooling": [
"1"
],
"slow_down_layer_time": [
"5"
],
"slow_down_min_speed": [
"10"
],
"support_material_interface_fan_speed": [
"-1"
],
"temperature_vitrification": [
"60"
],
"textured_plate_temp": [
"60"
],
"textured_plate_temp_initial_layer": [
"60"
]
}
@@ -0,0 +1,48 @@
{
"type": "filament",
"filament_id": "EFL95",
"setting_id": "EFSA05",
"name": "Eryone TPU",
"from": "system",
"instantiation": "true",
"inherits": "Eryone Standard PLA",
"compatible_printers": [
"Thinker X400 0.4 nozzle"
],
"filament_end_gcode": [
"; filament end gcode \nSET_FAN_SPEED FAN=filter_fan SPEED=0"
],
"filament_start_gcode": [
"; filament start gcode\nSET_FAN_SPEED FAN=filter_fan SPEED=1"
],
"fan_min_speed": [
"90"
],
"filament_max_volumetric_speed": [
"5"
],
"filament_retraction_length": [
"1.6"
],
"filament_settings_id": [
"Eryone TPU"
],
"filament_type": [
"TPU"
],
"nozzle_temperature": [
"230"
],
"nozzle_temperature_initial_layer": [
"230"
],
"hot_plate_temp": [
"50"
],
"hot_plate_temp_initial_layer": [
"50"
],
"slow_down_layer_time": [
"8"
]
}
@@ -0,0 +1,132 @@
{
"type": "filament",
"name": "fdm_filament_common",
"from": "system",
"instantiation": "false",
"cool_plate_temp": [
"60"
],
"eng_plate_temp": [
"60"
],
"hot_plate_temp": [
"60"
],
"cool_plate_temp_initial_layer": [
"60"
],
"eng_plate_temp_initial_layer": [
"60"
],
"hot_plate_temp_initial_layer": [
"60"
],
"overhang_fan_threshold": [
"95%"
],
"overhang_fan_speed": [
"100"
],
"slow_down_for_layer_cooling": [
"1"
],
"close_fan_the_first_x_layers": [
"3"
],
"filament_end_gcode": [
"; filament end gcode \n"
],
"filament_flow_ratio": [
"1"
],
"reduce_fan_stop_start_freq": [
"0"
],
"fan_cooling_layer_time": [
"60"
],
"filament_cost": [
"0"
],
"filament_density": [
"0"
],
"filament_deretraction_speed": [
"nil"
],
"filament_diameter": [
"1.75"
],
"filament_max_volumetric_speed": [
"0"
],
"filament_minimal_purge_on_wipe_tower": [
"15"
],
"filament_retraction_minimum_travel": [
"nil"
],
"filament_retract_before_wipe": [
"nil"
],
"filament_retract_when_changing_layer": [
"nil"
],
"filament_retraction_length": [
"nil"
],
"filament_z_hop": [
"nil"
],
"filament_retract_restart_extra": [
"nil"
],
"filament_retraction_speed": [
"nil"
],
"filament_settings_id": [
""
],
"filament_soluble": [
"0"
],
"filament_type": [
"PLA"
],
"filament_vendor": [
"Generic"
],
"filament_wipe": [
"nil"
],
"filament_wipe_distance": [
"nil"
],
"nozzle_temperature_initial_layer": [
"200"
],
"full_fan_speed_layer": [
"0"
],
"fan_max_speed": [
"100"
],
"fan_min_speed": [
"35"
],
"slow_down_min_speed": [
"10"
],
"slow_down_layer_time": [
"5"
],
"filament_start_gcode": [
"; Filament gcode\n"
],
"nozzle_temperature": [
"200"
],
"temperature_vitrification": [
"100"
]
}
@@ -0,0 +1,91 @@
{
"type": "filament",
"name": "fdm_filament_pla",
"from": "system",
"instantiation": "false",
"inherits": "fdm_filament_common",
"fan_cooling_layer_time": [
"100"
],
"filament_max_volumetric_speed": [
"12"
],
"filament_type": [
"PLA"
],
"filament_density": [
"1.24"
],
"filament_cost": [
"20"
],
"cool_plate_temp": [
"35"
],
"eng_plate_temp": [
"0"
],
"hot_plate_temp": [
"60"
],
"cool_plate_temp_initial_layer": [
"35"
],
"eng_plate_temp_initial_layer": [
"0"
],
"hot_plate_temp_initial_layer": [
"60"
],
"nozzle_temperature_initial_layer": [
"220"
],
"reduce_fan_stop_start_freq": [
"1"
],
"slow_down_for_layer_cooling": [
"0"
],
"fan_max_speed": [
"100"
],
"fan_min_speed": [
"100"
],
"overhang_fan_speed": [
"100"
],
"overhang_fan_threshold": [
"50%"
],
"close_fan_the_first_x_layers": [
"1"
],
"nozzle_temperature": [
"220"
],
"temperature_vitrification": [
"60"
],
"nozzle_temperature_range_low": [
"190"
],
"nozzle_temperature_range_high": [
"230"
],
"slow_down_min_speed": [
"10"
],
"slow_down_layer_time": [
"4"
],
"additional_cooling_fan_speed": [
"70"
],
"enable_overhang_bridge_fan": [
"0"
],
"filament_start_gcode": [
"; filament start gcode\n"
]
}
@@ -6,7 +6,7 @@
"instantiation": "true", "instantiation": "true",
"printer_model": "Thinker X400", "printer_model": "Thinker X400",
"default_print_profile": "0.20mm Standard @Thinker X400", "default_print_profile": "0.20mm Standard @Thinker X400",
"default_filament_profile":"Generic PLA @System;Generic ABS @System;Generic ASA @System;Generic PETG @System;Generic PLA Silk @System;Generic TPU @System", "default_filament_profile":"Eryone PLA;Eryone ABS;Eryone ASA;Eryone PETG;Eryone Silk PLA;Eryone TPU;Eryone ABS-CF;Eryone ASA-CF;Eryone PA;Eryone PA-CF;Eryone PA-GF;Eryone PETG-CF;Eryone PLA-CF;Eryone PP;Eryone PP-CF;",
"auxiliary_fan": "0", "auxiliary_fan": "0",
"bed_custom_model": "", "bed_custom_model": "",
"bed_custom_texture": "", "bed_custom_texture": "",
@@ -42,11 +42,11 @@
"machine_end_gcode": "PRINT_END", "machine_end_gcode": "PRINT_END",
"machine_load_filament_time": "0", "machine_load_filament_time": "0",
"machine_max_acceleration_e": [ "machine_max_acceleration_e": [
"10000", "5000",
"5000" "5000"
], ],
"machine_max_acceleration_extruding": [ "machine_max_acceleration_extruding": [
"5000", "10000",
"20000" "20000"
], ],
"machine_max_acceleration_retracting": [ "machine_max_acceleration_retracting": [
@@ -110,7 +110,7 @@
"0" "0"
], ],
"machine_pause_gcode": "PAUSE", "machine_pause_gcode": "PAUSE",
"machine_start_gcode": "M117 Heating\nM104 S[first_layer_temperature] ; set extruder temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nPRINT_START \nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM204 S[machine_max_acceleration_extruding] T[machine_max_acceleration_retracting]\n\nM104 S0\nM140 S[bed_temperature_initial_layer_single] ; set bed temp\nM117 Heating\nM190 S[bed_temperature_initial_layer_single]\nM104 S[first_layer_temperature] ; set extruder temp\nM109 S[first_layer_temperature] ; wait for extruder temp\n\n;QUAD_GANTRY_LEVEL\nCLEAN_N S=[first_layer_temperature] X=240 Y=-3 A=0\nM117 Quad Level\n_QUAD_GANTRY_LEVEL horizontal_move_z=10 retry_tolerance=1 LIFT_SPEED=5\nG28 Z\nM117 Quad Level\n_QUAD_GANTRY_LEVEL horizontal_move_z=5 retry_tolerance=0.05 LIFT_SPEED=5\nHOME_Z X=132.5 Y=197.5\nM117 Bed Mesh Level\nBED_MESH_CALIBRATE\nM117 Heating\nG1 Y0.0 Z0.3 F1500 ; move print head up\nM104 S[first_layer_temperature] ; set extruder temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nM117 .\nG92 E0.0\n; intro line\nG1 X175.0 E12 F1000\nG1 Y0.6\nG1 X5.0 E10 F1000\nG92 E0.0\n; intro line\nG1 Y1.0 Z0.2 F1000\nG1 X200.0 E15.0 F1000\nG92 E0.0", "machine_start_gcode": "M117 Heating\nM104 S[first_layer_temperature] ; set extruder temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nPRINT_START \nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM204 S[machine_max_acceleration_extruding] T[machine_max_acceleration_retracting]\nM104 S0\nM140 S[bed_temperature_initial_layer_single] ; set bed temp\nM117 Heating\nM190 S[bed_temperature_initial_layer_single]\nM104 S[first_layer_temperature] ; set extruder temp\nM109 S[first_layer_temperature] ; wait for extruder temp\n;QUAD_GANTRY_LEVEL\nCLEAN_N S=[first_layer_temperature] X=240 Y=-3 A=0 D=0.4\nM117 Quad Level\n_QUAD_GANTRY_LEVEL horizontal_move_z=10 retry_tolerance=1 LIFT_SPEED=5\nG28 Z\nM117 Quad Level\n_QUAD_GANTRY_LEVEL horizontal_move_z=5 retry_tolerance=0.05 LIFT_SPEED=5\nM117 Bed Mesh Level\nG1 X132.5 Y197.5\nG28 N\nBED_MESH_CALIBRATE\nM117 Heating\nG1 X275.0 Y0.0 Z0.3 F1500 ; move print head up\nM104 S[first_layer_temperature] ; set extruder temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nM117 .\nINTRO_LINE D=0.4 ;intro line with 0.4 mm nozzle",
"machine_unload_filament_time": "0", "machine_unload_filament_time": "0",
"manual_filament_change": "0", "manual_filament_change": "0",
"max_layer_height": [ "max_layer_height": [
@@ -126,7 +126,7 @@
"nozzle_type": "hardened_steel", "nozzle_type": "hardened_steel",
"nozzle_volume": "0", "nozzle_volume": "0",
"parking_pos_retraction": "92", "parking_pos_retraction": "92",
"print_host": "192.168.2.8", "print_host": "192.168.2.2",
"print_host_webui": "", "print_host_webui": "",
"printable_area": [ "printable_area": [
"0x0", "0x0",
@@ -8,5 +8,5 @@
"bed_model": "X400_bed.stl", "bed_model": "X400_bed.stl",
"bed_texture": "Thinker_texture.png", "bed_texture": "Thinker_texture.png",
"hotend_model": "", "hotend_model": "",
"default_materials": "Generic PLA @System;Generic ABS @System;Generic ASA @System;Generic PETG @System;Generic PLA Silk @System;Generic TPU @System" "default_materials": "Eryone PLA;Eryone ABS;Eryone ASA;Eryone PETG;Eryone Silk PLA;Eryone TPU;Eryone ABS-CF;Eryone ASA-CF;Eryone PA;Eryone PA-CF;Eryone PA-GF;Eryone PETG-CF;Eryone PLA-CF;Eryone PP;Eryone PP-CF"
} }
@@ -1,13 +1,13 @@
{ {
"brim_object_gap": "0", "brim_object_gap": "0",
"default_acceleration": "8000", "default_acceleration": "10000",
"elefant_foot_compensation": "0.12", "elefant_foot_compensation": "0.12",
"from": "User", "from": "User",
"gap_infill_speed": "300", "gap_infill_speed": "250",
"inherits": "0.20mm Standard @Thinker X400", "inherits": "0.20mm Standard @Thinker X400",
"inner_wall_acceleration": "8000", "inner_wall_acceleration": "8000",
"inner_wall_speed": "300", "inner_wall_speed": "250",
"internal_solid_infill_speed": "300", "internal_solid_infill_speed": "250",
"is_custom_defined": "0", "is_custom_defined": "0",
"layer_height": "0.12", "layer_height": "0.12",
"name": "0.12mm Standard @Thinker X400", "name": "0.12mm Standard @Thinker X400",
@@ -20,9 +20,9 @@
"print_settings_id": "0.12mm Standard @Thinker X400", "print_settings_id": "0.12mm Standard @Thinker X400",
"raft_first_layer_expansion": "10", "raft_first_layer_expansion": "10",
"sparse_infill_density": "15%", "sparse_infill_density": "15%",
"sparse_infill_speed": "300", "sparse_infill_speed": "250",
"top_shell_layers": "5", "top_shell_layers": "5",
"top_shell_thickness": "1", "top_shell_thickness": "1",
"version": "1.9.0.2", "version": "2.3.0.3",
"wall_generator": "classic" "wall_generator": "classic"
} }
@@ -1,13 +1,13 @@
{ {
"brim_object_gap": "0", "brim_object_gap": "0",
"default_acceleration": "8000", "default_acceleration": "10000",
"elefant_foot_compensation": "0.12", "elefant_foot_compensation": "0.12",
"from": "User", "from": "User",
"gap_infill_speed": "300", "gap_infill_speed": "250",
"inherits": "0.20mm Standard @Thinker X400", "inherits": "0.20mm Standard @Thinker X400",
"inner_wall_acceleration": "8000", "inner_wall_acceleration": "8000",
"inner_wall_speed": "300", "inner_wall_speed": "250",
"internal_solid_infill_speed": "300", "internal_solid_infill_speed": "250",
"is_custom_defined": "0", "is_custom_defined": "0",
"layer_height": "0.16", "layer_height": "0.16",
"name": "0.16mm Standard @Thinker X400", "name": "0.16mm Standard @Thinker X400",
@@ -20,9 +20,9 @@
"print_settings_id": "0.16mm Standard @Thinker X400", "print_settings_id": "0.16mm Standard @Thinker X400",
"raft_first_layer_expansion": "10", "raft_first_layer_expansion": "10",
"sparse_infill_density": "15%", "sparse_infill_density": "15%",
"sparse_infill_speed": "300", "sparse_infill_speed": "250",
"top_shell_layers": "5", "top_shell_layers": "5",
"top_shell_thickness": "1", "top_shell_thickness": "1",
"version": "1.9.0.2", "version": "2.3.0.3",
"wall_generator": "classic" "wall_generator": "classic"
} }
@@ -19,14 +19,14 @@
"bridge_density": "100%", "bridge_density": "100%",
"bridge_flow": "0.95", "bridge_flow": "0.95",
"bridge_no_support": "0", "bridge_no_support": "0",
"bridge_speed": "50", "bridge_speed": "45",
"brim_ears_detection_length": "1", "brim_ears_detection_length": "1",
"brim_ears_max_angle": "125", "brim_ears_max_angle": "125",
"brim_object_gap": "0", "brim_object_gap": "0.1",
"brim_type": "auto_brim", "brim_type": "auto_brim",
"brim_width": "5", "brim_width": "5",
"compatible_printers_condition": "", "compatible_printers_condition": "",
"default_acceleration": "8000", "default_acceleration": "10000",
"default_jerk": "0", "default_jerk": "0",
"detect_overhang_wall": "1", "detect_overhang_wall": "1",
"detect_thin_wall": "0", "detect_thin_wall": "0",
@@ -38,7 +38,7 @@
"enable_prime_tower": "0", "enable_prime_tower": "0",
"enable_support": "0", "enable_support": "0",
"enforce_support_layers": "0", "enforce_support_layers": "0",
"exclude_object": "1", "exclude_object": "0",
"extra_perimeters_on_overhangs": "0", "extra_perimeters_on_overhangs": "0",
"filename_format": "{input_filename_base}_{filament_type[0]}_{print_time}.gcode", "filename_format": "{input_filename_base}_{filament_type[0]}_{print_time}.gcode",
"filter_out_gap_fill": "0", "filter_out_gap_fill": "0",
@@ -104,12 +104,12 @@
"only_one_wall_first_layer": "0", "only_one_wall_first_layer": "0",
"only_one_wall_top": "1", "only_one_wall_top": "1",
"ooze_prevention": "0", "ooze_prevention": "0",
"outer_wall_acceleration": "5000", "outer_wall_acceleration": "4000",
"outer_wall_jerk": "9", "outer_wall_jerk": "9",
"outer_wall_line_width": "0.42", "outer_wall_line_width": "0.42",
"outer_wall_speed": "200", "outer_wall_speed": "200",
"overhang_1_4_speed": "0", "overhang_1_4_speed": "0",
"overhang_2_4_speed": "50", "overhang_2_4_speed": "45",
"overhang_3_4_speed": "30", "overhang_3_4_speed": "30",
"overhang_4_4_speed": "10", "overhang_4_4_speed": "10",
"overhang_reverse": "0", "overhang_reverse": "0",
@@ -149,7 +149,7 @@
"sparse_infill_acceleration": "100%", "sparse_infill_acceleration": "100%",
"sparse_infill_density": "15%", "sparse_infill_density": "15%",
"sparse_infill_filament": "1", "sparse_infill_filament": "1",
"sparse_infill_line_width": "0.45", "sparse_infill_line_width": "0.54",
"sparse_infill_pattern": "crosshatch", "sparse_infill_pattern": "crosshatch",
"sparse_infill_speed": "250", "sparse_infill_speed": "250",
"spiral_mode": "0", "spiral_mode": "0",
@@ -189,9 +189,9 @@
"top_surface_line_width": "0.42", "top_surface_line_width": "0.42",
"top_surface_pattern": "monotonic", "top_surface_pattern": "monotonic",
"top_surface_speed": "200", "top_surface_speed": "200",
"travel_acceleration": "5000", "travel_acceleration": "10000",
"travel_jerk": "12", "travel_jerk": "12",
"travel_speed": "350", "travel_speed": "400",
"travel_speed_z": "0", "travel_speed_z": "0",
"tree_support_adaptive_layer_height": "1", "tree_support_adaptive_layer_height": "1",
"tree_support_angle_slow": "25", "tree_support_angle_slow": "25",
@@ -208,7 +208,7 @@
"tree_support_tip_diameter": "0.8", "tree_support_tip_diameter": "0.8",
"tree_support_top_rate": "30%", "tree_support_top_rate": "30%",
"tree_support_wall_count": "2", "tree_support_wall_count": "2",
"version": "1.9.0.2", "version": "2.3.0.3",
"wall_distribution_count": "1", "wall_distribution_count": "1",
"wall_filament": "1", "wall_filament": "1",
"wall_generator": "classic", "wall_generator": "classic",
@@ -1,13 +1,13 @@
{ {
"brim_object_gap": "0", "brim_object_gap": "0",
"default_acceleration": "8000", "default_acceleration": "10000",
"elefant_foot_compensation": "0.12", "elefant_foot_compensation": "0.12",
"from": "User", "from": "User",
"gap_infill_speed": "220", "gap_infill_speed": "250",
"inherits": "0.20mm Standard @Thinker X400", "inherits": "0.20mm Standard @Thinker X400",
"inner_wall_acceleration": "8000", "inner_wall_acceleration": "8000",
"inner_wall_speed": "220", "inner_wall_speed": "250",
"internal_solid_infill_speed": "220", "internal_solid_infill_speed": "250",
"is_custom_defined": "0", "is_custom_defined": "0",
"layer_height": "0.24", "layer_height": "0.24",
"name": "0.24mm Standard @Thinker X400", "name": "0.24mm Standard @Thinker X400",
@@ -17,9 +17,9 @@
"print_settings_id": "0.24mm Standard @Thinker X400", "print_settings_id": "0.24mm Standard @Thinker X400",
"raft_first_layer_expansion": "10", "raft_first_layer_expansion": "10",
"sparse_infill_density": "15%", "sparse_infill_density": "15%",
"sparse_infill_speed": "220", "sparse_infill_speed": "250",
"top_shell_layers": "5", "top_shell_layers": "5",
"top_shell_thickness": "1", "top_shell_thickness": "1",
"version": "1.9.0.2", "version": "2.3.0.3",
"wall_generator": "classic" "wall_generator": "classic"
} }
+3
View File
@@ -178,6 +178,9 @@ void AppConfig::set_defaults()
if (get("camera_navigation_style").empty()) if (get("camera_navigation_style").empty())
set("camera_navigation_style", "0"); set("camera_navigation_style", "0");
if (get("swap_mouse_buttons").empty())
set_bool("swap_mouse_buttons", false);
if (get("reverse_mouse_wheel_zoom").empty()) if (get("reverse_mouse_wheel_zoom").empty())
set_bool("reverse_mouse_wheel_zoom", false); set_bool("reverse_mouse_wheel_zoom", false);
+7
View File
@@ -49,6 +49,13 @@ BoundingBox BoundingBox::rotated(double angle, const Point &center) const
return out; return out;
} }
BoundingBox BoundingBox::scaled(double factor) const
{
BoundingBox out(*this);
out.scale(factor);
return out;
}
template <class PointType, typename APointsType> void template <class PointType, typename APointsType> void
BoundingBoxBase<PointType, APointsType>::scale(double factor) BoundingBoxBase<PointType, APointsType>::scale(double factor)
{ {
+3 -1
View File
@@ -222,7 +222,9 @@ public:
BoundingBox(const Point &pmin, const Point &pmax) : BoundingBoxBase<Point, Points>(pmin, pmax) {} BoundingBox(const Point &pmin, const Point &pmax) : BoundingBoxBase<Point, Points>(pmin, pmax) {}
BoundingBox(const Points &points) : BoundingBoxBase<Point, Points>(points) {} BoundingBox(const Points &points) : BoundingBoxBase<Point, Points>(points) {}
BoundingBox inflated(coordf_t delta) const throw() { BoundingBox out(*this); out.offset(delta); return out; } BoundingBox inflated(coordf_t delta) const noexcept { BoundingBox out(*this); out.offset(delta); return out; }
BoundingBox scaled(double factor) const;
friend BoundingBox get_extents_rotated(const Points &points, double angle); friend BoundingBox get_extents_rotated(const Points &points, double angle);
}; };
+12
View File
@@ -657,6 +657,11 @@ public:
{ {
if (! append) if (! append)
this->values.clear(); this->values.clear();
if (str.empty()) {
this->values.push_back(0);
return true;
}
std::istringstream is(str); std::istringstream is(str);
std::string item_str; std::string item_str;
while (std::getline(is, item_str, ',')) { while (std::getline(is, item_str, ',')) {
@@ -675,6 +680,13 @@ public:
} }
return true; return true;
} }
static bool validate_string(const std::string &str)
{
// should only have number and commas
return std::all_of(str.begin(), str.end(), [](char c) {
return std::isdigit(c) || c == ','|| std::isspace(c);
});
}
ConfigOptionFloatsTempl& operator=(const ConfigOption *opt) ConfigOptionFloatsTempl& operator=(const ConfigOption *opt)
{ {
+7
View File
@@ -146,6 +146,13 @@ Point ExPolygon::point_projection(const Point &point) const
} }
} }
void ExPolygon::symmetric_y(const coord_t &y_axis)
{
this->contour.symmetric_y(y_axis);
for (Polygon &hole : holes)
hole.symmetric_y(y_axis);
}
bool ExPolygon::overlaps(const ExPolygon &other) const bool ExPolygon::overlaps(const ExPolygon &other) const
{ {
if (this->empty() || other.empty()) if (this->empty() || other.empty())
+1 -1
View File
@@ -56,7 +56,7 @@ public:
bool on_boundary(const Point &point, double eps) const; bool on_boundary(const Point &point, double eps) const;
// Projection of a point onto the polygon. // Projection of a point onto the polygon.
Point point_projection(const Point &point) const; Point point_projection(const Point &point) const;
void symmetric_y(const coord_t &y_axis);
// Does this expolygon overlap another expolygon? // Does this expolygon overlap another expolygon?
// Either the ExPolygons intersect, or one is fully inside the other, // Either the ExPolygons intersect, or one is fully inside the other,
// and it is not inside a hole of the other expolygon. // and it is not inside a hole of the other expolygon.
+120 -27
View File
@@ -34,7 +34,6 @@ struct SurfaceFillParams
coordf_t overlap = 0.; coordf_t overlap = 0.;
// Angle as provided by the region config, in radians. // Angle as provided by the region config, in radians.
float angle = 0.f; float angle = 0.f;
bool rotate_angle = true;
// Is bridging used for this fill? Bridging parameters may be used even if this->flow.bridge() is not set. // Is bridging used for this fill? Bridging parameters may be used even if this->flow.bridge() is not set.
bool bridge; bool bridge;
// Non-negative for a bridge. // Non-negative for a bridge.
@@ -68,6 +67,9 @@ struct SurfaceFillParams
// Params for lattice infill angles // Params for lattice infill angles
float lattice_angle_1 = 0.f; float lattice_angle_1 = 0.f;
float lattice_angle_2 = 0.f; float lattice_angle_2 = 0.f;
float infill_lock_depth = 0;
float skin_infill_depth = 0;
bool symmetric_infill_y_axis = false;
// Params for 2D honeycomb // Params for 2D honeycomb
float infill_overhang_angle = 60.f; float infill_overhang_angle = 60.f;
@@ -85,7 +87,6 @@ struct SurfaceFillParams
RETURN_COMPARE_NON_EQUAL(spacing); RETURN_COMPARE_NON_EQUAL(spacing);
RETURN_COMPARE_NON_EQUAL(overlap); RETURN_COMPARE_NON_EQUAL(overlap);
RETURN_COMPARE_NON_EQUAL(angle); RETURN_COMPARE_NON_EQUAL(angle);
RETURN_COMPARE_NON_EQUAL(rotate_angle);
RETURN_COMPARE_NON_EQUAL(density); RETURN_COMPARE_NON_EQUAL(density);
// RETURN_COMPARE_NON_EQUAL_TYPED(unsigned, dont_adjust); // RETURN_COMPARE_NON_EQUAL_TYPED(unsigned, dont_adjust);
RETURN_COMPARE_NON_EQUAL(anchor_length); RETURN_COMPARE_NON_EQUAL(anchor_length);
@@ -100,7 +101,9 @@ struct SurfaceFillParams
RETURN_COMPARE_NON_EQUAL(solid_infill_speed); RETURN_COMPARE_NON_EQUAL(solid_infill_speed);
RETURN_COMPARE_NON_EQUAL(lattice_angle_1); RETURN_COMPARE_NON_EQUAL(lattice_angle_1);
RETURN_COMPARE_NON_EQUAL(lattice_angle_2); RETURN_COMPARE_NON_EQUAL(lattice_angle_2);
RETURN_COMPARE_NON_EQUAL(infill_overhang_angle); RETURN_COMPARE_NON_EQUAL(symmetric_infill_y_axis);
RETURN_COMPARE_NON_EQUAL(infill_lock_depth);
RETURN_COMPARE_NON_EQUAL(skin_infill_depth); RETURN_COMPARE_NON_EQUAL(infill_overhang_angle);
return false; return false;
} }
@@ -111,7 +114,6 @@ struct SurfaceFillParams
this->spacing == rhs.spacing && this->spacing == rhs.spacing &&
this->overlap == rhs.overlap && this->overlap == rhs.overlap &&
this->angle == rhs.angle && this->angle == rhs.angle &&
this->rotate_angle == rhs.rotate_angle &&
this->bridge == rhs.bridge && this->bridge == rhs.bridge &&
this->bridge_angle == rhs.bridge_angle && this->bridge_angle == rhs.bridge_angle &&
this->density == rhs.density && this->density == rhs.density &&
@@ -125,6 +127,8 @@ struct SurfaceFillParams
this->solid_infill_speed == rhs.solid_infill_speed && this->solid_infill_speed == rhs.solid_infill_speed &&
this->lattice_angle_1 == rhs.lattice_angle_1 && this->lattice_angle_1 == rhs.lattice_angle_1 &&
this->lattice_angle_2 == rhs.lattice_angle_2 && this->lattice_angle_2 == rhs.lattice_angle_2 &&
this->infill_lock_depth == rhs.infill_lock_depth &&
this->skin_infill_depth == rhs.skin_infill_depth &&
this->infill_overhang_angle == rhs.infill_overhang_angle; this->infill_overhang_angle == rhs.infill_overhang_angle;
} }
}; };
@@ -602,16 +606,34 @@ void split_solid_surface(size_t layer_id, const SurfaceFill &fill, ExPolygons &n
#endif #endif
} }
std::vector<SurfaceFill> group_fills(const Layer &layer) std::vector<SurfaceFill> group_fills(const Layer &layer, LockRegionParam &lock_param)
{ {
std::vector<SurfaceFill> surface_fills; std::vector<SurfaceFill> surface_fills;
// Fill in a map of a region & surface to SurfaceFillParams. // Fill in a map of a region & surface to SurfaceFillParams.
std::set<SurfaceFillParams> set_surface_params; std::set<SurfaceFillParams> set_surface_params;
std::vector<std::vector<const SurfaceFillParams*>> region_to_surface_params(layer.regions().size(), std::vector<const SurfaceFillParams*>()); std::vector<std::vector<const SurfaceFillParams*>> region_to_surface_params(layer.regions().size(), std::vector<const SurfaceFillParams*>());
SurfaceFillParams params; SurfaceFillParams params;
bool has_internal_voids = false; bool has_internal_voids = false;
const PrintObjectConfig& object_config = layer.object()->config(); const PrintObjectConfig& object_config = layer.object()->config();
auto append_flow_param = [](std::map<Flow, ExPolygons> &flow_params, Flow flow, const ExPolygon &exp) {
auto it = flow_params.find(flow);
if (it == flow_params.end())
flow_params.insert({flow, {exp}});
else
it->second.push_back(exp);
it++;
};
auto append_density_param = [](std::map<float, ExPolygons> &density_params, float density, const ExPolygon &exp) {
auto it = density_params.find(density);
if (it == density_params.end())
density_params.insert({density, {exp}});
else
it->second.push_back(exp);
it++;
};
for (size_t region_id = 0; region_id < layer.regions().size(); ++ region_id) { for (size_t region_id = 0; region_id < layer.regions().size(); ++ region_id) {
const LayerRegion &layerm = *layer.regions()[region_id]; const LayerRegion &layerm = *layer.regions()[region_id];
region_to_surface_params[region_id].assign(layerm.fill_surfaces.size(), nullptr); region_to_surface_params[region_id].assign(layerm.fill_surfaces.size(), nullptr);
@@ -628,23 +650,34 @@ std::vector<SurfaceFill> group_fills(const Layer &layer)
params.lattice_angle_1 = region_config.lattice_angle_1; params.lattice_angle_1 = region_config.lattice_angle_1;
params.lattice_angle_2 = region_config.lattice_angle_2; params.lattice_angle_2 = region_config.lattice_angle_2;
params.infill_overhang_angle = region_config.infill_overhang_angle; params.infill_overhang_angle = region_config.infill_overhang_angle;
if (params.pattern == ipLockedZag) {
params.infill_lock_depth = scale_(region_config.infill_lock_depth);
params.skin_infill_depth = scale_(region_config.skin_infill_depth);
}
if (params.pattern == ipCrossZag || params.pattern == ipLockedZag) {
params.symmetric_infill_y_axis = region_config.symmetric_infill_y_axis;
} else if (params.pattern == ipZigZag) {
params.symmetric_infill_y_axis = region_config.symmetric_infill_y_axis;
}
if (surface.is_solid()) { if (surface.is_solid()) {
params.density = 100.f; if (surface.is_external() && !is_bridge) {
//FIXME for non-thick bridges, shall we allow a bottom surface pattern? if (surface.is_top()) {
if (surface.is_solid_infill())
params.pattern = region_config.internal_solid_infill_pattern.value;
else if (surface.is_external() && ! is_bridge) {
if(surface.is_top())
params.pattern = region_config.top_surface_pattern.value; params.pattern = region_config.top_surface_pattern.value;
else params.density = float(region_config.top_surface_density);
} else { // Surface is bottom
params.pattern = region_config.bottom_surface_pattern.value; params.pattern = region_config.bottom_surface_pattern.value;
params.density = float(region_config.bottom_surface_density);
} }
else { } else if (surface.is_solid_infill()) {
if(region_config.top_surface_pattern == ipMonotonic || region_config.top_surface_pattern == ipMonotonicLine) params.pattern = region_config.internal_solid_infill_pattern.value;
params.density = 100.f;
} else {
if (region_config.top_surface_pattern == ipMonotonic || region_config.top_surface_pattern == ipMonotonicLine)
params.pattern = ipMonotonic; params.pattern = ipMonotonic;
else else
params.pattern = ipRectilinear; params.pattern = ipRectilinear;
params.density = 100.f;
} }
} else if (params.density <= 0) } else if (params.density <= 0)
continue; continue;
@@ -667,10 +700,8 @@ std::vector<SurfaceFill> group_fills(const Layer &layer)
params.bridge_angle = float(surface.bridge_angle); params.bridge_angle = float(surface.bridge_angle);
if (params.extrusion_role == erInternalInfill) { if (params.extrusion_role == erInternalInfill) {
params.angle = float(Geometry::deg2rad(region_config.infill_direction.value)); params.angle = float(Geometry::deg2rad(region_config.infill_direction.value));
params.rotate_angle = (params.pattern == ipRectilinear || params.pattern == ipLine);
} else { } else {
params.angle = float(Geometry::deg2rad(region_config.solid_infill_direction.value)); params.angle = float(Geometry::deg2rad(region_config.solid_infill_direction.value));
params.rotate_angle = region_config.rotate_solid_infill_direction;
} }
// Calculate the actual flow we'll be using for this infill. // Calculate the actual flow we'll be using for this infill.
@@ -709,7 +740,28 @@ std::vector<SurfaceFill> group_fills(const Layer &layer)
params.anchor_length = std::min(params.anchor_length, params.anchor_length_max); params.anchor_length = std::min(params.anchor_length, params.anchor_length_max);
} }
//get locked region param
if (params.pattern == ipLockedZag){
const PrintObject *object = layerm.layer()->object();
auto nozzle_diameter = float(object->print()->config().nozzle_diameter.get_at(layerm.region().extruder(extrusion_role) - 1));
Flow skin_flow = params.bridge ? params.flow : Flow::new_from_config_width(extrusion_role, region_config.skin_infill_line_width, nozzle_diameter, float((surface.thickness == -1) ? layer.height : surface.thickness));
//add skin flow
append_flow_param(lock_param.skin_flow_params, skin_flow, surface.expolygon);
Flow skeleton_flow = params.bridge ? params.flow : Flow::new_from_config_width(extrusion_role, region_config.skeleton_infill_line_width, nozzle_diameter, float((surface.thickness == -1) ? layer.height : surface.thickness)) ;
// add skeleton flow
append_flow_param(lock_param.skeleton_flow_params, skeleton_flow, surface.expolygon);
// add skin density
append_density_param(lock_param.skin_density_params, float(0.01 * region_config.skin_infill_density), surface.expolygon);
// add skin density
append_density_param(lock_param.skeleton_density_params, float(0.01 * region_config.skeleton_infill_density), surface.expolygon);
}
auto it_params = set_surface_params.find(params); auto it_params = set_surface_params.find(params);
if (it_params == set_surface_params.end()) if (it_params == set_surface_params.end())
it_params = set_surface_params.insert(it_params, params); it_params = set_surface_params.insert(it_params, params);
region_to_surface_params[region_id][&surface - &layerm.fill_surfaces.surfaces.front()] = &(*it_params); region_to_surface_params[region_id][&surface - &layerm.fill_surfaces.surfaces.front()] = &(*it_params);
@@ -829,7 +881,6 @@ std::vector<SurfaceFill> group_fills(const Layer &layer)
params.density = 100.f; params.density = 100.f;
params.extrusion_role = erSolidInfill; params.extrusion_role = erSolidInfill;
params.angle = float(Geometry::deg2rad(layerm.region().config().solid_infill_direction.value)); params.angle = float(Geometry::deg2rad(layerm.region().config().solid_infill_direction.value));
params.rotate_angle = layerm.region().config().rotate_solid_infill_direction;
// calculate the actual flow we'll be using for this infill // calculate the actual flow we'll be using for this infill
params.flow = layerm.flow(frSolidInfill); params.flow = layerm.flow(frSolidInfill);
params.spacing = params.flow.spacing(); params.spacing = params.flow.spacing();
@@ -914,8 +965,8 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive:
#ifdef SLIC3R_DEBUG_SLICE_PROCESSING #ifdef SLIC3R_DEBUG_SLICE_PROCESSING
// this->export_region_fill_surfaces_to_svg_debug("10_fill-initial"); // this->export_region_fill_surfaces_to_svg_debug("10_fill-initial");
#endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */
LockRegionParam lock_param;
std::vector<SurfaceFill> surface_fills = group_fills(*this); std::vector<SurfaceFill> surface_fills = group_fills(*this, lock_param);
const Slic3r::BoundingBox bbox = this->object()->bounding_box(); const Slic3r::BoundingBox bbox = this->object()->bounding_box();
const auto resolution = this->object()->print()->config().resolution.value; const auto resolution = this->object()->print()->config().resolution.value;
@@ -933,14 +984,22 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive:
f->layer_id = this->id(); f->layer_id = this->id();
f->z = this->print_z; f->z = this->print_z;
f->angle = surface_fill.params.angle; f->angle = surface_fill.params.angle;
f->rotate_angle = surface_fill.params.rotate_angle;
f->adapt_fill_octree = (surface_fill.params.pattern == ipSupportCubic) ? support_fill_octree : adaptive_fill_octree; f->adapt_fill_octree = (surface_fill.params.pattern == ipSupportCubic) ? support_fill_octree : adaptive_fill_octree;
f->print_config = &this->object()->print()->config(); f->print_config = &this->object()->print()->config();
f->print_object_config = &this->object()->config(); f->print_object_config = &this->object()->config();
f->adapt_fill_octree = (surface_fill.params.pattern == ipSupportCubic) ? support_fill_octree : adaptive_fill_octree;
if (surface_fill.params.pattern == ipLightning) if (surface_fill.params.pattern == ipConcentricInternal) {
FillConcentricInternal *fill_concentric = dynamic_cast<FillConcentricInternal *>(f.get());
assert(fill_concentric != nullptr);
fill_concentric->print_config = &this->object()->print()->config();
fill_concentric->print_object_config = &this->object()->config();
} else if (surface_fill.params.pattern == ipConcentric) {
FillConcentric *fill_concentric = dynamic_cast<FillConcentric *>(f.get());
assert(fill_concentric != nullptr);
fill_concentric->print_config = &this->object()->print()->config();
fill_concentric->print_object_config = &this->object()->config();
} else if (surface_fill.params.pattern == ipLightning)
dynamic_cast<FillLightning::Filler*>(f.get())->generator = lightning_generator; dynamic_cast<FillLightning::Filler*>(f.get())->generator = lightning_generator;
// calculate flow spacing for infill pattern generation // calculate flow spacing for infill pattern generation
bool using_internal_flow = ! surface_fill.surface.is_solid() && ! surface_fill.params.bridge; bool using_internal_flow = ! surface_fill.surface.is_solid() && ! surface_fill.params.bridge;
double link_max_length = 0.; double link_max_length = 0.;
@@ -979,11 +1038,41 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive:
params.extrusion_role = surface_fill.params.extrusion_role; params.extrusion_role = surface_fill.params.extrusion_role;
params.using_internal_flow = using_internal_flow; params.using_internal_flow = using_internal_flow;
params.no_extrusion_overlap = surface_fill.params.overlap; params.no_extrusion_overlap = surface_fill.params.overlap;
params.config = &layerm->region().config(); auto &region_config = layerm->region().config();
ConfigOptionFloats rotate_angles;
rotate_angles.deserialize( surface_fill.params.extrusion_role == erInternalInfill ? region_config.sparse_infill_rotate_template.value : region_config.solid_infill_rotate_template.value);
auto rotate_angle_idx = f->layer_id % rotate_angles.size();
f->rotate_angle = Geometry::deg2rad(rotate_angles.values[rotate_angle_idx]);
params.config = &region_config;
params.pattern = surface_fill.params.pattern;
if( surface_fill.params.pattern == ipLockedZag ) {
params.locked_zag = true;
params.infill_lock_depth = surface_fill.params.infill_lock_depth;
params.skin_infill_depth = surface_fill.params.skin_infill_depth;
f->set_lock_region_param(lock_param);
}
if (surface_fill.params.pattern == ipCrossZag || surface_fill.params.pattern == ipLockedZag) {
if (f->layer_id % 2 == 0) {
params.horiz_move -= scale_(region_config.infill_shift_step) * (f->layer_id / 2);
} else {
params.horiz_move += scale_(region_config.infill_shift_step) * (f->layer_id / 2);
}
params.symmetric_infill_y_axis = surface_fill.params.symmetric_infill_y_axis;
}
if (surface_fill.params.pattern == ipGrid) if (surface_fill.params.pattern == ipGrid)
params.can_reverse = false; params.can_reverse = false;
for (ExPolygon& expoly : surface_fill.expolygons) { for (ExPolygon& expoly : surface_fill.expolygons) {
f->no_overlap_expolygons = intersection_ex(surface_fill.no_overlap_expolygons, ExPolygons() = {expoly}, ApplySafetyOffset::Yes); f->no_overlap_expolygons = intersection_ex(surface_fill.no_overlap_expolygons, ExPolygons() = {expoly}, ApplySafetyOffset::Yes);
if (params.symmetric_infill_y_axis) {
params.symmetric_y_axis = f->extended_object_bounding_box().center().x();
expoly.symmetric_y(params.symmetric_y_axis);
}
// Spacing is modified by the filler to indicate adjustments. Reset it for each expolygon. // Spacing is modified by the filler to indicate adjustments. Reset it for each expolygon.
f->spacing = surface_fill.params.spacing; f->spacing = surface_fill.params.spacing;
surface_fill.surface.expolygon = std::move(expoly); surface_fill.surface.expolygon = std::move(expoly);
@@ -1023,7 +1112,8 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive:
Polylines Layer::generate_sparse_infill_polylines_for_anchoring(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive::Octree* support_fill_octree, FillLightning::Generator* lightning_generator) const Polylines Layer::generate_sparse_infill_polylines_for_anchoring(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive::Octree* support_fill_octree, FillLightning::Generator* lightning_generator) const
{ {
std::vector<SurfaceFill> surface_fills = group_fills(*this); LockRegionParam skin_inner_param;
std::vector<SurfaceFill> surface_fills = group_fills(*this, skin_inner_param);
const Slic3r::BoundingBox bbox = this->object()->bounding_box(); const Slic3r::BoundingBox bbox = this->object()->bounding_box();
const auto resolution = this->object()->print()->config().resolution.value; const auto resolution = this->object()->print()->config().resolution.value;
@@ -1059,7 +1149,10 @@ Polylines Layer::generate_sparse_infill_polylines_for_anchoring(FillAdaptive::Oc
case ipTpmsD: case ipTpmsD:
case ipHilbertCurve: case ipHilbertCurve:
case ipArchimedeanChords: case ipArchimedeanChords:
case ipOctagramSpiral: break; case ipOctagramSpiral:
case ipZigZag:
case ipCrossZag:
case ipLockedZag: break;
} }
// Create the filler object. // Create the filler object.
+4
View File
@@ -15,6 +15,10 @@ public:
Fill* clone() const override { return new Fill3DHoneycomb(*this); }; Fill* clone() const override { return new Fill3DHoneycomb(*this); };
~Fill3DHoneycomb() override {} ~Fill3DHoneycomb() override {}
// require bridge flow since most of this pattern hangs in air
bool use_bridge_flow() const override { return true; }
bool is_self_crossing() override { return false; }
protected: protected:
void _fill_surface_single( void _fill_surface_single(
const FillParams &params, const FillParams &params,
+1
View File
@@ -71,6 +71,7 @@ protected:
// may not be optimal as the internal infill lines may get extruded before the long infill // may not be optimal as the internal infill lines may get extruded before the long infill
// lines to which the short infill lines are supposed to anchor. // lines to which the short infill lines are supposed to anchor.
bool no_sort() const override { return false; } bool no_sort() const override { return false; }
bool is_self_crossing() override { return true; }
}; };
} // namespace FillAdaptive } // namespace FillAdaptive
+15
View File
@@ -67,6 +67,9 @@ Fill* Fill::new_from_type(const InfillPattern type)
// BBS: for bottom and top surface only // BBS: for bottom and top surface only
// Orca: Replace BBS implementation with Prusa implementation // Orca: Replace BBS implementation with Prusa implementation
case ipMonotonicLine: return new FillMonotonicLines(); case ipMonotonicLine: return new FillMonotonicLines();
case ipZigZag: return new FillZigZag();
case ipCrossZag: return new FillCrossZag();
case ipLockedZag: return new FillLockedZag();
default: throw Slic3r::InvalidArgument("unknown type"); default: throw Slic3r::InvalidArgument("unknown type");
} }
} }
@@ -1556,6 +1559,18 @@ BoundaryInfillGraph create_boundary_infill_graph(const Polylines &infill_ordered
return out; return out;
} }
// The extended bounding box of the whole object that covers any rotation of every layer.
BoundingBox Fill::extended_object_bounding_box() const
{
BoundingBox out = bounding_box;
out.merge(Point(out.min.y(), out.min.x()));
out.merge(Point(out.max.y(), out.max.x()));
// The bounding box is scaled by sqrt(2.) to ensure that the bounding box
// covers any possible rotations.
return out.scaled(sqrt(2.));
}
void Fill::connect_infill(Polylines &&infill_ordered, const std::vector<const Polygon*> &boundary_src, const BoundingBox &bbox, Polylines &polylines_out, const double spacing, const FillParams &params) void Fill::connect_infill(Polylines &&infill_ordered, const std::vector<const Polygon*> &boundary_src, const BoundingBox &bbox, Polylines &polylines_out, const double spacing, const FillParams &params)
{ {
assert(! infill_ordered.empty()); assert(! infill_ordered.empty());
+29 -7
View File
@@ -36,6 +36,15 @@ public:
InfillFailedException() : Slic3r::RuntimeError("Infill failed") {} InfillFailedException() : Slic3r::RuntimeError("Infill failed") {}
}; };
struct LockRegionParam
{
LockRegionParam() {}
std::map<float, ExPolygons> skin_density_params;
std::map<float, ExPolygons> skeleton_density_params;
std::map<Flow, ExPolygons> skin_flow_params;
std::map<Flow, ExPolygons> skeleton_flow_params;
};
struct FillParams struct FillParams
{ {
bool full_infill() const { return density > 0.9999f; } bool full_infill() const { return density > 0.9999f; }
@@ -72,6 +81,7 @@ struct FillParams
// For 2D lattice // For 2D lattice
coordf_t lattice_angle_1 { 0.f }; coordf_t lattice_angle_1 { 0.f };
coordf_t lattice_angle_2 { 0.f }; coordf_t lattice_angle_2 { 0.f };
InfillPattern pattern{ ipRectilinear };
// For 2D Honeycomb // For 2D Honeycomb
float infill_overhang_angle { 60 }; float infill_overhang_angle { 60 };
@@ -85,6 +95,13 @@ struct FillParams
const PrintRegionConfig* config{ nullptr }; const PrintRegionConfig* config{ nullptr };
bool dont_sort{ false }; // do not sort the lines, just simply connect them bool dont_sort{ false }; // do not sort the lines, just simply connect them
bool can_reverse{true}; bool can_reverse{true};
float horiz_move{0.0}; //move infill to get cross zag pattern
bool symmetric_infill_y_axis{false};
coord_t symmetric_y_axis{0};
bool locked_zag{false};
float infill_lock_depth{0.0};
float skin_infill_depth{0.0};
}; };
static_assert(IsTriviallyCopyable<FillParams>::value, "FillParams class is not POD (and it should be - see constructor)."); static_assert(IsTriviallyCopyable<FillParams>::value, "FillParams class is not POD (and it should be - see constructor).");
@@ -102,7 +119,7 @@ public:
// in radians, ccw, 0 = East // in radians, ccw, 0 = East
float angle; float angle;
// Orca: enable angle shifting for layer change // Orca: enable angle shifting for layer change
bool rotate_angle{ true }; float rotate_angle{ M_PI/180.0 };
// In scaled coordinates. Maximum lenght of a perimeter segment connecting two infill lines. // In scaled coordinates. Maximum lenght of a perimeter segment connecting two infill lines.
// Used by the FillRectilinear2, FillGrid2, FillTriangles, FillStars and FillCubic. // Used by the FillRectilinear2, FillGrid2, FillTriangles, FillStars and FillCubic.
// If left to zero, the links will not be limited. // If left to zero, the links will not be limited.
@@ -135,20 +152,25 @@ public:
static bool use_bridge_flow(const InfillPattern type); static bool use_bridge_flow(const InfillPattern type);
void set_bounding_box(const Slic3r::BoundingBox &bbox) { bounding_box = bbox; } void set_bounding_box(const Slic3r::BoundingBox &bbox) { bounding_box = bbox; }
BoundingBox extended_object_bounding_box() const;
// Use bridge flow for the fill? // Use bridge flow for the fill?
virtual bool use_bridge_flow() const { return false; } virtual bool use_bridge_flow() const { return false; }
// Do not sort the fill lines to optimize the print head path? // Do not sort the fill lines to optimize the print head path?
virtual bool no_sort() const { return false; } virtual bool no_sort() const { return false; }
virtual bool is_self_crossing() = 0;
// Return true if infill has a consistent pattern between layers.
virtual bool has_consistent_pattern() const { return false; }
// Perform the fill. // Perform the fill.
virtual Polylines fill_surface(const Surface *surface, const FillParams &params); virtual Polylines fill_surface(const Surface *surface, const FillParams &params);
virtual ThickPolylines fill_surface_arachne(const Surface* surface, const FillParams& params); virtual ThickPolylines fill_surface_arachne(const Surface* surface, const FillParams& params);
virtual void set_lock_region_param(const LockRegionParam &lock_param){};
// BBS: this method is used to fill the ExtrusionEntityCollection. // BBS: this method is used to fill the ExtrusionEntityCollection.
// It call fill_surface by default // It call fill_surface by default
virtual void fill_surface_extrusion(const Surface* surface, const FillParams& params, ExtrusionEntitiesPtr& out); virtual void fill_surface_extrusion(const Surface *surface, const FillParams &params, ExtrusionEntitiesPtr &out);
protected: protected:
Fill() : Fill() :
@@ -159,7 +181,7 @@ protected:
overlap(0.), overlap(0.),
// Initial angle is undefined. // Initial angle is undefined.
angle(FLT_MAX), angle(FLT_MAX),
rotate_angle(true), rotate_angle(M_PI/180.0),
link_max_length(0), link_max_length(0),
loop_clipping(0), loop_clipping(0),
// The initial bounding box is empty, therefore undefined. // The initial bounding box is empty, therefore undefined.
@@ -172,7 +194,7 @@ protected:
unsigned int /* thickness_layers */, unsigned int /* thickness_layers */,
const std::pair<float, Point> & /* direction */, const std::pair<float, Point> & /* direction */,
ExPolygon /* expolygon */, ExPolygon /* expolygon */,
Polylines & /* polylines_out */) {}; Polylines & /* polylines_out */) {}
// Used for concentric infill to generate ThickPolylines using Arachne. // Used for concentric infill to generate ThickPolylines using Arachne.
virtual void _fill_surface_single(const FillParams& params, virtual void _fill_surface_single(const FillParams& params,
@@ -181,7 +203,7 @@ protected:
ExPolygon expolygon, ExPolygon expolygon,
ThickPolylines& thick_polylines_out) {} ThickPolylines& thick_polylines_out) {}
virtual float _layer_angle(size_t idx) const { return (rotate_angle && (idx & 1)) ? float(M_PI/2.) : 0; } virtual float _layer_angle(size_t idx) const { return rotate_angle; }
virtual std::pair<float, Point> _infill_direction(const Surface *surface) const; virtual std::pair<float, Point> _infill_direction(const Surface *surface) const;
+1
View File
@@ -9,6 +9,7 @@ class FillConcentric : public Fill
{ {
public: public:
~FillConcentric() override = default; ~FillConcentric() override = default;
bool is_self_crossing() override { return false; }
protected: protected:
Fill* clone() const override { return new FillConcentric(*this); }; Fill* clone() const override { return new FillConcentric(*this); };
@@ -10,6 +10,7 @@ class FillConcentricInternal : public Fill
public: public:
~FillConcentricInternal() override = default; ~FillConcentricInternal() override = default;
void fill_surface_extrusion(const Surface *surface, const FillParams &params, ExtrusionEntitiesPtr &out) override; void fill_surface_extrusion(const Surface *surface, const FillParams &params, ExtrusionEntitiesPtr &out) override;
bool is_self_crossing() override { return false; }
protected: protected:
Fill* clone() const override { return new FillConcentricInternal(*this); }; Fill* clone() const override { return new FillConcentricInternal(*this); };
+1
View File
@@ -14,6 +14,7 @@ class FillCrossHatch : public Fill
public: public:
Fill *clone() const override { return new FillCrossHatch(*this); }; Fill *clone() const override { return new FillCrossHatch(*this); };
~FillCrossHatch() override {} ~FillCrossHatch() override {}
bool is_self_crossing() override { return false; }
protected: protected:
void _fill_surface_single( void _fill_surface_single(
+4
View File
@@ -168,6 +168,10 @@ void FillGyroid::_fill_surface_single(
// align bounding box to a multiple of our grid module // align bounding box to a multiple of our grid module
bb.merge(align_to_grid(bb.min, Point(2*M_PI*distance, 2*M_PI*distance))); bb.merge(align_to_grid(bb.min, Point(2*M_PI*distance, 2*M_PI*distance)));
// Expand the bounding box to avoid artifacts at the edges
coord_t expand = 10 * (scale_(this->spacing));
bb.offset(expand);
// generate pattern // generate pattern
Polylines polylines = make_gyroid_waves( Polylines polylines = make_gyroid_waves(
scale_(this->z), scale_(this->z),
+1
View File
@@ -15,6 +15,7 @@ public:
// require bridge flow since most of this pattern hangs in air // require bridge flow since most of this pattern hangs in air
bool use_bridge_flow() const override { return false; } bool use_bridge_flow() const override { return false; }
bool is_self_crossing() override { return false; }
// Correction applied to regular infill angle to maximize printing // Correction applied to regular infill angle to maximize printing
// speed in default configuration (degrees) // speed in default configuration (degrees)
+1
View File
@@ -13,6 +13,7 @@ class FillHoneycomb : public Fill
{ {
public: public:
~FillHoneycomb() override {} ~FillHoneycomb() override {}
bool is_self_crossing() override { return false; }
protected: protected:
Fill* clone() const override { return new FillHoneycomb(*this); }; Fill* clone() const override { return new FillHoneycomb(*this); };
+1
View File
@@ -20,6 +20,7 @@ class Filler : public Slic3r::Fill
{ {
public: public:
~Filler() override = default; ~Filler() override = default;
bool is_self_crossing() override { return false; }
Generator *generator { nullptr }; Generator *generator { nullptr };
protected: protected:
+1
View File
@@ -14,6 +14,7 @@ class FillLine : public Fill
public: public:
Fill* clone() const override { return new FillLine(*this); }; Fill* clone() const override { return new FillLine(*this); };
~FillLine() override = default; ~FillLine() override = default;
bool is_self_crossing() override { return false; }
protected: protected:
void _fill_surface_single( void _fill_surface_single(
+1
View File
@@ -37,6 +37,7 @@ class FillPlanePath : public Fill
{ {
public: public:
~FillPlanePath() override = default; ~FillPlanePath() override = default;
bool is_self_crossing() override { return false; }
protected: protected:
void _fill_surface_single( void _fill_surface_single(
+175 -30
View File
@@ -987,7 +987,6 @@ static std::vector<SegmentedIntersectionLine> slice_region_by_vertical_lines(con
throw; throw;
} }
#endif //INFILL_DEBUG_OUTPUT #endif //INFILL_DEBUG_OUTPUT
return segs; return segs;
} }
@@ -1352,8 +1351,11 @@ static SegmentIntersection& end_of_vertical_run(SegmentedIntersectionLine &il, S
return const_cast<SegmentIntersection&>(end_of_vertical_run(std::as_const(il), std::as_const(start))); return const_cast<SegmentIntersection&>(end_of_vertical_run(std::as_const(il), std::as_const(start)));
} }
static void traverse_graph_generate_polylines( static void traverse_graph_generate_polylines(const ExPolygonWithOffset &poly_with_offset,
const ExPolygonWithOffset& poly_with_offset, const FillParams& params, const coord_t link_max_length, std::vector<SegmentedIntersectionLine>& segs, Polylines& polylines_out) const FillParams &params,
std::vector<SegmentedIntersectionLine> &segs,
const bool consistent_pattern,
Polylines &polylines_out)
{ {
// For each outer only chords, measure their maximum distance to the bow of the outer contour. // For each outer only chords, measure their maximum distance to the bow of the outer contour.
// Mark an outer only chord as consumed, if the distance is low. // Mark an outer only chord as consumed, if the distance is low.
@@ -1387,39 +1389,33 @@ static void traverse_graph_generate_polylines(
pointLast = polylines_out.back().points.back(); pointLast = polylines_out.back().points.back();
for (;;) { for (;;) {
if (i_intersection == -1) { if (i_intersection == -1) {
// The path has been interrupted. Find a next starting point, closest to the previous extruder position. // The path has been interrupted. Find a next starting point.
coordf_t dist2min = std::numeric_limits<coordf_t>().max(); for (int i_vline2 = 0; i_vline2 < int(segs.size()); ++i_vline2) {
for (int i_vline2 = 0; i_vline2 < int(segs.size()); ++ i_vline2) {
const SegmentedIntersectionLine &vline = segs[i_vline2]; const SegmentedIntersectionLine &vline = segs[i_vline2];
if (! vline.intersections.empty()) { if (!vline.intersections.empty()) {
assert(vline.intersections.size() > 1); assert(vline.intersections.size() > 1);
// Even number of intersections with the loops. // Even number of intersections with the loops.
assert((vline.intersections.size() & 1) == 0); assert((vline.intersections.size() & 1) == 0);
assert(vline.intersections.front().type == SegmentIntersection::OUTER_LOW); assert(vline.intersections.front().type == SegmentIntersection::OUTER_LOW);
for (int i = 0; i < int(vline.intersections.size()); ++ i) {
const SegmentIntersection& intrsctn = vline.intersections[i]; // For infill that needs to be consistent between layers (like Zig Zag),
// we are switching between forward and backward passes based on the line index.
const bool forward_pass = !consistent_pattern || (i_vline2 % 2 == 0);
for (int i = 0; i < int(vline.intersections.size()); ++i) {
const int intrsctn_idx = forward_pass ? i : int(vline.intersections.size()) - i - 1;
const SegmentIntersection &intrsctn = vline.intersections[intrsctn_idx];
if (intrsctn.is_outer()) { if (intrsctn.is_outer()) {
assert(intrsctn.is_low() || i > 0); assert(intrsctn.is_low() || intrsctn_idx > 0);
bool consumed = intrsctn.is_low() ? const bool consumed = intrsctn.is_low() ? intrsctn.consumed_vertical_up : vline.intersections[intrsctn_idx - 1].consumed_vertical_up;
intrsctn.consumed_vertical_up : if (!consumed) {
vline.intersections[i - 1].consumed_vertical_up;
if (! consumed) {
coordf_t dist2 = sqr(coordf_t(pointLast(0) - vline.pos)) + sqr(coordf_t(pointLast(1) - intrsctn.pos()));
if (dist2 < dist2min) {
dist2min = dist2;
i_vline = i_vline2; i_vline = i_vline2;
i_intersection = i; i_intersection = intrsctn_idx;
//FIXME We are taking the first left point always. Verify, that the caller chains the paths
// by a shortest distance, while reversing the paths if needed.
//if (polylines_out.empty())
// Initial state, take the first line, which is the first from the left.
goto found; goto found;
} }
} }
} }
} }
} }
}
if (i_intersection == -1) if (i_intersection == -1)
// We are finished. // We are finished.
break; break;
@@ -1487,9 +1483,13 @@ static void traverse_graph_generate_polylines(
// 1) Find possible connection points on the previous / next vertical line. // 1) Find possible connection points on the previous / next vertical line.
int i_prev = it->left_horizontal(); int i_prev = it->left_horizontal();
int i_next = it->right_horizontal(); int i_next = it->right_horizontal();
bool intersection_prev_valid = intersection_on_prev_vertical_line_valid(segs, i_vline, i_intersection);
// To ensure pattern consistency between layers for Zig Zag infill, we always
// try to connect to the next vertical line and never to the previous vertical line.
bool intersection_prev_valid = intersection_on_prev_vertical_line_valid(segs, i_vline, i_intersection) && !consistent_pattern;
bool intersection_next_valid = intersection_on_next_vertical_line_valid(segs, i_vline, i_intersection); bool intersection_next_valid = intersection_on_next_vertical_line_valid(segs, i_vline, i_intersection);
bool intersection_horizontal_valid = intersection_prev_valid || intersection_next_valid; bool intersection_horizontal_valid = intersection_prev_valid || intersection_next_valid;
// Mark both the left and right connecting segment as consumed, because one cannot go to this intersection point as it has been consumed. // Mark both the left and right connecting segment as consumed, because one cannot go to this intersection point as it has been consumed.
if (i_prev != -1) if (i_prev != -1)
segs[i_vline - 1].intersections[i_prev].consumed_perimeter_right = true; segs[i_vline - 1].intersections[i_prev].consumed_perimeter_right = true;
@@ -2737,6 +2737,17 @@ static void polylines_from_paths(const std::vector<MonotonicRegionLink> &path, c
} }
} }
// The extended bounding box of the whole object that covers any rotation of every layer.
BoundingBox FillRectilinear::extended_object_bounding_box() const {
BoundingBox out = this->bounding_box;
out.merge(Point(out.min.y(), out.min.x()));
out.merge(Point(out.max.y(), out.max.x()));
// The bounding box is scaled by sqrt(2.) to ensure that the bounding box
// covers any possible rotations.
return out.scaled(sqrt(2.));
}
bool FillRectilinear::fill_surface_by_lines(const Surface *surface, const FillParams &params, float angleBase, float pattern_shift, Polylines &polylines_out) bool FillRectilinear::fill_surface_by_lines(const Surface *surface, const FillParams &params, float angleBase, float pattern_shift, Polylines &polylines_out)
{ {
// At the end, only the new polylines will be rotated back. // At the end, only the new polylines will be rotated back.
@@ -2749,6 +2760,8 @@ bool FillRectilinear::fill_surface_by_lines(const Surface *surface, const FillPa
// Rotate polygons so that we can work with vertical lines here // Rotate polygons so that we can work with vertical lines here
std::pair<float, Point> rotate_vector = this->_infill_direction(surface); std::pair<float, Point> rotate_vector = this->_infill_direction(surface);
if (params.locked_zag)
rotate_vector.first += float(M_PI/2.);
rotate_vector.first += angleBase; rotate_vector.first += angleBase;
assert(params.density > 0.0001f && params.density <= 1.f); assert(params.density > 0.0001f && params.density <= 1.f);
@@ -2766,11 +2779,14 @@ bool FillRectilinear::fill_surface_by_lines(const Surface *surface, const FillPa
return true; return true;
} }
BoundingBox bounding_box = poly_with_offset.bounding_box_src(); // For infill that needs to be consistent between layers (like Zig Zag),
// we use bounding box of whole object to match vertical lines between layers.
BoundingBox bounding_box_src = poly_with_offset.bounding_box_src();
BoundingBox bounding_box = this->has_consistent_pattern() ? this->extended_object_bounding_box() : bounding_box_src;
// define flow spacing according to requested density // define flow spacing according to requested density
if (params.full_infill() && !params.dont_adjust) { if (params.full_infill() && !params.dont_adjust) {
line_spacing = this->_adjust_solid_spacing(bounding_box.size()(0), line_spacing); line_spacing = this->_adjust_solid_spacing(bounding_box_src.size().x(), line_spacing);
this->spacing = unscale<double>(line_spacing); this->spacing = unscale<double>(line_spacing);
} else { } else {
// extend bounding box so that our pattern will be aligned with other layers // extend bounding box so that our pattern will be aligned with other layers
@@ -2792,6 +2808,13 @@ bool FillRectilinear::fill_surface_by_lines(const Surface *surface, const FillPa
if (params.full_infill()) if (params.full_infill())
x0 += (line_spacing + coord_t(SCALED_EPSILON)) / 2; x0 += (line_spacing + coord_t(SCALED_EPSILON)) / 2;
int gap_line = params.horiz_move / line_spacing;
if (gap_line % 2 == 0) {
x0 += params.horiz_move - gap_line * line_spacing;
} else {
x0 += params.horiz_move - (gap_line - 1) * line_spacing;
n_vlines += 1;
}
#ifdef SLIC3R_DEBUG #ifdef SLIC3R_DEBUG
static int iRun = 0; static int iRun = 0;
BoundingBox bbox_svg = poly_with_offset.bounding_box_outer(); BoundingBox bbox_svg = poly_with_offset.bounding_box_outer();
@@ -2803,7 +2826,6 @@ bool FillRectilinear::fill_surface_by_lines(const Surface *surface, const FillPa
} }
iRun ++; iRun ++;
#endif /* SLIC3R_DEBUG */ #endif /* SLIC3R_DEBUG */
std::vector<SegmentedIntersectionLine> segs = slice_region_by_vertical_lines(poly_with_offset, n_vlines, x0, line_spacing); std::vector<SegmentedIntersectionLine> segs = slice_region_by_vertical_lines(poly_with_offset, n_vlines, x0, line_spacing);
// Connect by horizontal / vertical links, classify the links based on link_max_length as too long. // Connect by horizontal / vertical links, classify the links based on link_max_length as too long.
connect_segment_intersections_by_contours(poly_with_offset, segs, params, link_max_length); connect_segment_intersections_by_contours(poly_with_offset, segs, params, link_max_length);
@@ -2848,8 +2870,9 @@ bool FillRectilinear::fill_surface_by_lines(const Surface *surface, const FillPa
std::vector<MonotonicRegionLink> path = chain_monotonic_regions(regions, poly_with_offset, segs, rng); std::vector<MonotonicRegionLink> path = chain_monotonic_regions(regions, poly_with_offset, segs, rng);
polylines_from_paths(path, poly_with_offset, segs, polylines_out); polylines_from_paths(path, poly_with_offset, segs, polylines_out);
} }
} else } else {
traverse_graph_generate_polylines(poly_with_offset, params, this->link_max_length, segs, polylines_out); traverse_graph_generate_polylines(poly_with_offset, params, segs, this->has_consistent_pattern(), polylines_out);
}
#ifdef SLIC3R_DEBUG #ifdef SLIC3R_DEBUG
{ {
@@ -2876,6 +2899,11 @@ bool FillRectilinear::fill_surface_by_lines(const Surface *surface, const FillPa
//FIXME rather simplify the paths to avoid very short edges? //FIXME rather simplify the paths to avoid very short edges?
//assert(! it->has_duplicate_points()); //assert(! it->has_duplicate_points());
it->remove_duplicate_points(); it->remove_duplicate_points();
//get origin direction infill
if (params.symmetric_infill_y_axis) {
it->symmetric_y(params.symmetric_y_axis);
}
} }
#ifdef SLIC3R_DEBUG #ifdef SLIC3R_DEBUG
@@ -2884,6 +2912,8 @@ bool FillRectilinear::fill_surface_by_lines(const Surface *surface, const FillPa
assert(! polyline.has_duplicate_points()); assert(! polyline.has_duplicate_points());
#endif /* SLIC3R_DEBUG */ #endif /* SLIC3R_DEBUG */
return true; return true;
} }
@@ -2963,7 +2993,8 @@ bool FillRectilinear::fill_surface_by_multilines(const Surface *surface, FillPar
Polylines FillRectilinear::fill_surface(const Surface *surface, const FillParams &params) Polylines FillRectilinear::fill_surface(const Surface *surface, const FillParams &params)
{ {
Polylines polylines_out; Polylines polylines_out;
if (params.full_infill()) { // Orca Todo: fow now don't use fill_surface_by_multilines for zipzag infill
if (params.full_infill() || params.pattern == ipCrossZag || params.pattern == ipZigZag || params.pattern == ipLockedZag) {
if (!fill_surface_by_lines(surface, params, 0.f, 0.f, polylines_out)) if (!fill_surface_by_lines(surface, params, 0.f, 0.f, polylines_out))
BOOST_LOG_TRIVIAL(error) << "FillRectilinear::fill_surface() fill_surface_by_lines() failed to fill a region."; BOOST_LOG_TRIVIAL(error) << "FillRectilinear::fill_surface() fill_surface_by_lines() failed to fill a region.";
} else { } else {
@@ -3409,5 +3440,119 @@ void FillMonotonicLineWGapFill::fill_surface_by_lines(const Surface* surface, co
} }
}*/ }*/
void FillLockedZag::fill_surface_locked_zag (const Surface * surface,
const FillParams & params,
std::vector<std::pair<Polylines, Flow>> &multi_width_polyline)
{
// merge different part exps
// diff skin flow
Polylines skin_lines;
Polylines skeloton_lines;
double offset_threshold = params.skin_infill_depth;
double overlap_threshold = params.infill_lock_depth;
Surface cross_surface = *surface;
Surface zig_surface = *surface;
// inner exps
// inner union exps
ExPolygons zig_expas = offset_ex({surface->expolygon}, -offset_threshold);
ExPolygons cross_expas = diff_ex(surface->expolygon, zig_expas);
bool zig_get = false;
FillParams zig_params = params;
zig_params.horiz_move = 0;
// generate skeleton for diff density
auto generate_for_different_flow = [&multi_width_polyline](const std::map<Flow, ExPolygons> &flow_params, const Polylines &polylines) {
auto it = flow_params.begin();
while (it != flow_params.end()) {
ExPolygons region_exp = union_safety_offset_ex(it->second);
Polylines polys = intersection_pl(polylines, region_exp);
multi_width_polyline.emplace_back(polys, it->first);
it++;
}
};
auto it = this->lock_param.skeleton_density_params.begin();
while (it != this->lock_param.skeleton_density_params.end()) {
ExPolygons region_exp = union_safety_offset_ex(it->second);
ExPolygons exps = intersection_ex(region_exp, zig_expas);
zig_params.density = it->first;
exps = intersection_ex(offset_ex(exps, overlap_threshold), surface->expolygon);
for (ExPolygon &exp : exps) {
zig_surface.expolygon = exp;
Polylines zig_polylines_out = this->fill_surface(&zig_surface, zig_params);
skeloton_lines.insert(skeloton_lines.end(), zig_polylines_out.begin(), zig_polylines_out.end());
}
it++;
}
// set skeleton flow
generate_for_different_flow(this->lock_param.skeleton_flow_params, skeloton_lines);
// skin exps
bool cross_get = false;
FillParams cross_params = params;
cross_params.locked_zag = false;
auto skin_density = this->lock_param.skin_density_params.begin();
while (skin_density != this->lock_param.skin_density_params.end()) {
ExPolygons region_exp = union_safety_offset_ex(skin_density->second);
ExPolygons exps = intersection_ex(region_exp, cross_expas);
cross_params.density = skin_density->first;
for (ExPolygon &exp : exps) {
cross_surface.expolygon = exp;
Polylines cross_polylines_out = this->fill_surface(&cross_surface, cross_params);
skin_lines.insert(skin_lines.end(), cross_polylines_out.begin(), cross_polylines_out.end());
}
skin_density++;
}
generate_for_different_flow(this->lock_param.skin_flow_params, skin_lines);
}
void FillLockedZag::fill_surface_extrusion(const Surface *surface, const FillParams &params, ExtrusionEntitiesPtr &out)
{
Polylines polylines;
ThickPolylines thick_polylines;
std::vector<std::pair<Polylines, Flow>> multi_width_polyline;
try {
this->fill_surface_locked_zag(surface, params, multi_width_polyline);
}
catch (InfillFailedException&) {}
if (!thick_polylines.empty() || !multi_width_polyline.empty()) {
// Save into layer.
ExtrusionEntityCollection* eec = nullptr;
out.push_back(eec = new ExtrusionEntityCollection());
// Only concentric fills are not sorted.
eec->no_sort = this->no_sort();
size_t idx = eec->entities.size();
{
for (std::pair<Polylines, Flow> &poly_with_flow: multi_width_polyline) {
// calculate actual flow from spacing (which might have been adjusted by the infill
// pattern generator)
double flow_mm3_per_mm = poly_with_flow.second.mm3_per_mm();
double flow_width = poly_with_flow.second.width();
if (params.using_internal_flow) {
// if we used the internal flow we're not doing a solid infill
// so we can safely ignore the slight variation that might have
// been applied to f->spacing
} else {
Flow new_flow = poly_with_flow.second.with_spacing(this->spacing);
flow_mm3_per_mm = new_flow.mm3_per_mm();
flow_width = new_flow.width();
}
extrusion_entities_append_paths(
eec->entities, std::move(poly_with_flow.first),
params.extrusion_role,
flow_mm3_per_mm, float(flow_width), poly_with_flow.second.height());
}
}
if (!params.can_reverse) {
for (size_t i = idx; i < eec->entities.size(); i++)
eec->entities[i]->set_reverse();
}
}
}
} // namespace Slic3r } // namespace Slic3r
+46 -3
View File
@@ -16,6 +16,7 @@ public:
Fill* clone() const override { return new FillRectilinear(*this); } Fill* clone() const override { return new FillRectilinear(*this); }
~FillRectilinear() override = default; ~FillRectilinear() override = default;
Polylines fill_surface(const Surface *surface, const FillParams &params) override; Polylines fill_surface(const Surface *surface, const FillParams &params) override;
bool is_self_crossing() override { return false; }
protected: protected:
// Fill by single directional lines, interconnect the lines along perimeters. // Fill by single directional lines, interconnect the lines along perimeters.
@@ -28,6 +29,9 @@ protected:
float pattern_shift; float pattern_shift;
}; };
bool fill_surface_by_multilines(const Surface *surface, FillParams params, const std::initializer_list<SweepParams> &sweep_params, Polylines &polylines_out); bool fill_surface_by_multilines(const Surface *surface, FillParams params, const std::initializer_list<SweepParams> &sweep_params, Polylines &polylines_out);
// The extended bounding box of the whole object that covers any rotation of every layer.
BoundingBox extended_object_bounding_box() const;
}; };
class FillAlignedRectilinear : public FillRectilinear class FillAlignedRectilinear : public FillRectilinear
@@ -65,6 +69,7 @@ public:
Fill* clone() const override { return new FillGrid(*this); } Fill* clone() const override { return new FillGrid(*this); }
~FillGrid() override = default; ~FillGrid() override = default;
Polylines fill_surface(const Surface *surface, const FillParams &params) override; Polylines fill_surface(const Surface *surface, const FillParams &params) override;
bool is_self_crossing() override { return true; }
protected: protected:
// The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill. // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill.
@@ -89,6 +94,7 @@ public:
Fill* clone() const override { return new FillTriangles(*this); } Fill* clone() const override { return new FillTriangles(*this); }
~FillTriangles() override = default; ~FillTriangles() override = default;
Polylines fill_surface(const Surface *surface, const FillParams &params) override; Polylines fill_surface(const Surface *surface, const FillParams &params) override;
bool is_self_crossing() override { return true; }
protected: protected:
// The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill. // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill.
@@ -101,6 +107,7 @@ public:
Fill* clone() const override { return new FillStars(*this); } Fill* clone() const override { return new FillStars(*this); }
~FillStars() override = default; ~FillStars() override = default;
Polylines fill_surface(const Surface *surface, const FillParams &params) override; Polylines fill_surface(const Surface *surface, const FillParams &params) override;
bool is_self_crossing() override { return true; }
protected: protected:
// The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill. // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill.
@@ -113,6 +120,7 @@ public:
Fill* clone() const override { return new FillCubic(*this); } Fill* clone() const override { return new FillCubic(*this); }
~FillCubic() override = default; ~FillCubic() override = default;
Polylines fill_surface(const Surface *surface, const FillParams &params) override; Polylines fill_surface(const Surface *surface, const FillParams &params) override;
bool is_self_crossing() override { return true; }
protected: protected:
// The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill. // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill.
@@ -170,6 +178,7 @@ public:
public: public:
~FillMonotonicLineWGapFill() override = default; ~FillMonotonicLineWGapFill() override = default;
void fill_surface_extrusion(const Surface *surface, const FillParams &params, ExtrusionEntitiesPtr &out) override; void fill_surface_extrusion(const Surface *surface, const FillParams &params, ExtrusionEntitiesPtr &out) override;
bool is_self_crossing() override { return false; }
protected: protected:
Fill* clone() const override { return new FillMonotonicLineWGapFill(*this); }; Fill* clone() const override { return new FillMonotonicLineWGapFill(*this); };
@@ -179,9 +188,43 @@ private:
void fill_surface_by_lines(const Surface* surface, const FillParams& params, Polylines& polylines_out); void fill_surface_by_lines(const Surface* surface, const FillParams& params, Polylines& polylines_out);
};*/ };*/
Points sample_grid_pattern(const ExPolygon& expolygon, coord_t spacing, const BoundingBox& global_bounding_box); class FillZigZag : public FillRectilinear
Points sample_grid_pattern(const ExPolygons& expolygons, coord_t spacing, const BoundingBox& global_bounding_box); {
Points sample_grid_pattern(const Polygons& polygons, coord_t spacing, const BoundingBox& global_bounding_box); public:
Fill* clone() const override { return new FillZigZag(*this); }
~FillZigZag() override = default;
bool has_consistent_pattern() const override { return true; }
};
class FillCrossZag : public FillRectilinear
{
public:
Fill *clone() const override { return new FillCrossZag(*this); }
~FillCrossZag() override = default;
bool has_consistent_pattern() const override { return true; }
};
class FillLockedZag : public FillRectilinear
{
public:
Fill *clone() const override { return new FillLockedZag(*this); }
~FillLockedZag() override = default;
LockRegionParam lock_param;
void fill_surface_extrusion(const Surface *surface, const FillParams &params, ExtrusionEntitiesPtr &out) override;
bool has_consistent_pattern() const override { return true; }
void set_lock_region_param(const LockRegionParam &lock_param) override { this->lock_param = lock_param;};
void fill_surface_locked_zag(const Surface * surface,
const FillParams & params,
std::vector<std::pair<Polylines, Flow>> &multi_width_polyline);
};
Points sample_grid_pattern(const ExPolygon &expolygon, coord_t spacing, const BoundingBox &global_bounding_box);
Points sample_grid_pattern(const ExPolygons &expolygons, coord_t spacing, const BoundingBox &global_bounding_box);
Points sample_grid_pattern(const Polygons &polygons, coord_t spacing, const BoundingBox &global_bounding_box);
} // namespace Slic3r } // namespace Slic3r
+119 -405
View File
@@ -1,443 +1,157 @@
#include "../ClipperUtils.hpp"
#include "FillTpmsD.hpp"
#include <cmath> #include <cmath>
#include <algorithm> #include <algorithm>
#include <vector> #include <vector>
#include <unordered_map> //#include <cstddef>
#include <unordered_set>
#include <utility> #include "../ClipperUtils.hpp"
#include <tbb/parallel_for.h> #include "../ShortestPath.hpp"
// From Creality Print #include "libslic3r/BoundingBox.hpp"
#include "libslic3r/Fill/FillBase.hpp"
#include "libslic3r/Point.hpp"
#include "libslic3r/Polygon.hpp"
#include "libslic3r/libslic3r.h"
#include "FillTpmsD.hpp"
namespace Slic3r { namespace Slic3r {
using namespace std; static double scaled_floor(double x,double scale){
struct myPoint return std::floor(x/scale)*scale;
{
coord_t x, y;
};
class LineSegmentMerger
{
public:
void mergeSegments(const vector<pair<myPoint, myPoint>>& segments, vector<vector<myPoint>>& polylines2)
{
std::unordered_map<int, myPoint> point_id_xy;
std::set<std::pair<int, int>> segment_ids;
std::unordered_map<int64_t, int> map_keyxy_pointid;
auto get_itr = [&](coord_t x, coord_t y) {
for (auto i : {0}) //,-2,2
{
for (auto j : {0}) //,-2,2
{
int64_t combined_key1 = static_cast<int64_t>(x + i) << 32 | static_cast<uint32_t>(y + j);
auto itr1 = map_keyxy_pointid.find(combined_key1);
if (itr1 != map_keyxy_pointid.end()) {
return itr1;
}
}
}
return map_keyxy_pointid.end();
};
int pointid = 0;
for (const auto& segment : segments) {
coord_t x = segment.first.x;
coord_t y = segment.first.y;
auto itr = get_itr(x, y);
int segmentid0 = -1;
if (itr == map_keyxy_pointid.end()) {
int64_t combined_key = static_cast<int64_t>(x) << 32 | static_cast<uint32_t>(y);
segmentid0 = pointid;
point_id_xy[pointid] = segment.first;
map_keyxy_pointid[combined_key] = pointid++;
} else {
segmentid0 = itr->second;
}
int segmentid1 = -1;
x = segment.second.x;
y = segment.second.y;
itr = get_itr(x, y);
if (itr == map_keyxy_pointid.end()) {
int64_t combined_key = static_cast<int64_t>(x) << 32 | static_cast<uint32_t>(y);
segmentid1 = pointid;
point_id_xy[pointid] = segment.second;
map_keyxy_pointid[combined_key] = pointid++;
} else {
segmentid1 = itr->second;
}
if (segmentid0 != segmentid1) {
segment_ids.insert(segmentid0 < segmentid1 ? std::make_pair(segmentid0, segmentid1) :
std::make_pair(segmentid1, segmentid0));
}
}
unordered_map<int, vector<int>> graph;
unordered_set<int> visited;
vector<vector<int>> polylines;
// Build the graph
for (const auto& segment : segment_ids) {
graph[segment.first].push_back(segment.second);
graph[segment.second].push_back(segment.first);
}
vector<int> startnodes;
for (const auto& node : graph) {
if (node.second.size() == 1) {
startnodes.push_back(node.first);
}
}
// Find all connected components
for (const auto& point_first : startnodes) {
if (visited.find(point_first) == visited.end()) {
vector<int> polyline;
dfs(point_first, graph, visited, polyline);
polylines.push_back(std::move(polyline));
}
}
for (const auto& point : graph) {
if (visited.find(point.first) == visited.end()) {
vector<int> polyline;
dfs(point.first, graph, visited, polyline);
polylines.push_back(std::move(polyline));
}
}
for (auto& pl : polylines) {
vector<myPoint> tmpps;
for (auto& pid : pl) {
tmpps.push_back(point_id_xy[pid]);
}
polylines2.push_back(tmpps);
}
}
private:
void dfs(const int& start_node,
std::unordered_map<int, std::vector<int>>& graph,
std::unordered_set<int>& visited,
std::vector<int>& polyline)
{
std::vector<int> stack;
stack.reserve(graph.size());
stack.push_back(start_node);
while (!stack.empty()) {
int node = stack.back();
stack.pop_back();
if (!visited.insert(node).second) {
continue;
}
polyline.push_back(node);
auto& neighbors = graph[node];
for (const auto& neighbor : neighbors) {
if (visited.find(neighbor) == visited.end()) {
stack.push_back(neighbor);
}
}
}
}
};
namespace MarchingSquares {
struct Point
{
double x, y;
};
vector<double> getGridValues(int i, int j, vector<vector<double>>& data)
{
vector<double> values;
values.push_back(data[i][j + 1]);
values.push_back(data[i + 1][j + 1]);
values.push_back(data[i + 1][j]);
values.push_back(data[i][j]);
return values;
}
bool needContour(double value, double contourValue) { return value >= contourValue; }
Point interpolate(std::vector<std::vector<MarchingSquares::Point>>& posxy,
std::vector<int> p1ij,
std::vector<int> p2ij,
double v1,
double v2,
double contourValue)
{
Point p1;
p1.x = posxy[p1ij[0]][p1ij[1]].x;
p1.y = posxy[p1ij[0]][p1ij[1]].y;
Point p2;
p2.x = posxy[p2ij[0]][p2ij[1]].x;
p2.y = posxy[p2ij[0]][p2ij[1]].y;
double mu = (contourValue - v1) / (v2 - v1);
Point p;
p.x = p1.x + mu * (p2.x - p1.x);
p.y = p1.y + mu * (p2.y - p1.y);
return p;
} }
void process_block(int i, static Polylines make_waves(double gridZ, double density_adjusted, double line_spacing, double width, double height)
int j,
vector<vector<double>>& data,
double contourValue,
std::vector<std::vector<MarchingSquares::Point>>& posxy,
vector<Point>& contourPoints)
{ {
vector<double> values = getGridValues(i, j, data); const double scaleFactor = scale_(line_spacing) / density_adjusted;
vector<bool> isNeedContour;
for (double value : values) { // tolerance in scaled units. clamp the maximum tolerance as there's
isNeedContour.push_back(needContour(value, contourValue)); // no processing-speed benefit to do so beyond a certain point
const double tolerance = std::min(line_spacing / 2, FillTpmsD::PatternTolerance) / unscale<double>(scaleFactor);
//scale factor for 5% : 8 712 388
// 1z = 10^-6 mm ?
const double z = gridZ / scaleFactor;
Polylines result;
//sin(x)*sin(y)*sin(z)-cos(x)*cos(y)*cos(z)=0
//2*sin(x)*sin(y)*sin(z)-2*cos(x)*cos(y)*cos(z)=0
//(cos(x-y)-cos(x+y))*sin(z)-(cos(x-y)+cos(x+y))*cos(z)=0
//(sin(z)-cos(z))*cos(x-y)-(sin(z)+cos(z))*cos(x+y)=0
double a=sin(z)-cos(z);
double b=sin(z)+cos(z);
//a*cos(x-y)-b*cos(x+y)=0
//u=x-y, v=x+y
double minU=0-height;
double maxU=width-0;
double minV=0+0;
double maxV=width+height;
//a*cos(u)-b*cos(v)=0
//if abs(b)<abs(a), then u=acos(b/a*cos(v)) is a continuous line
//otherwise we swap u and v
const bool swapUV=(std::abs(a)>std::abs(b));
if(swapUV) {
std::swap(a,b);
std::swap(minU,minV);
std::swap(maxU,maxV);
} }
int index = 0; std::vector<std::pair<double,double>> wave;
if (isNeedContour[0]) {//fill one wave
index |= 1; const auto v=[&](double u){return acos(a/b*cos(u));};
if (isNeedContour[1]) for(int c=0;c<=4;++c){
index |= 2; const double u=minU+2*M_PI*c/4;
if (isNeedContour[2]) wave.emplace_back(u,v(u));
index |= 4;
if (isNeedContour[3])
index |= 8;
vector<Point> points;
switch (index) {
case 0:
case 15: break;
case 1:
points.push_back(interpolate(posxy, {i, j + 1}, {i + 1, j + 1}, values[0], values[1], contourValue));
points.push_back(interpolate(posxy, {i, j}, {i, j + 1}, values[3], values[0], contourValue));
break;
case 14:
points.push_back(interpolate(posxy, {i, j}, {i, j + 1}, values[3], values[0], contourValue));
points.push_back(interpolate(posxy, {i, j + 1}, {i + 1, j + 1}, values[0], values[1], contourValue));
break;
case 2:
points.push_back(interpolate(posxy, {i + 1, j + 1}, {i + 1, j}, values[1], values[2], contourValue));
points.push_back(interpolate(posxy, {i, j + 1}, {i + 1, j + 1}, values[0], values[1], contourValue));
break;
case 13:
points.push_back(interpolate(posxy, {i, j + 1}, {i + 1, j + 1}, values[0], values[1], contourValue));
points.push_back(interpolate(posxy, {i + 1, j + 1}, {i + 1, j}, values[1], values[2], contourValue));
break;
case 3:
points.push_back(interpolate(posxy, {i + 1, j + 1}, {i + 1, j}, values[1], values[2], contourValue));
points.push_back(interpolate(posxy, {i, j}, {i, j + 1}, values[3], values[0], contourValue));
break;
case 12:
points.push_back(interpolate(posxy, {i, j}, {i, j + 1}, values[3], values[0], contourValue));
points.push_back(interpolate(posxy, {i + 1, j + 1}, {i + 1, j}, values[1], values[2], contourValue));
break;
case 4:
points.push_back(interpolate(posxy, {i + 1, j}, {i, j}, values[2], values[3], contourValue));
points.push_back(interpolate(posxy, {i + 1, j + 1}, {i + 1, j}, values[1], values[2], contourValue));
break;
case 11:
points.push_back(interpolate(posxy, {i + 1, j + 1}, {i + 1, j}, values[1], values[2], contourValue));
points.push_back(interpolate(posxy, {i + 1, j}, {i, j}, values[2], values[3], contourValue));
break;
case 5:
points.push_back(interpolate(posxy, {i, j}, {i, j + 1}, values[3], values[0], contourValue));
points.push_back(interpolate(posxy, {i, j}, {i + 1, j}, values[3], values[2], contourValue));
points.push_back(interpolate(posxy, {i, j + 1}, {i + 1, j + 1}, values[0], values[1], contourValue));
points.push_back(interpolate(posxy, {i + 1, j + 1}, {i + 1, j}, values[1], values[2], contourValue));
break;
case 6:
points.push_back(interpolate(posxy, {i + 1, j}, {i, j}, values[2], values[3], contourValue));
points.push_back(interpolate(posxy, {i, j + 1}, {i + 1, j + 1}, values[0], values[1], contourValue));
break;
case 9:
points.push_back(interpolate(posxy, {i, j + 1}, {i + 1, j + 1}, values[0], values[1], contourValue));
points.push_back(interpolate(posxy, {i + 1, j}, {i, j}, values[2], values[3], contourValue));
break;
case 7:
points.push_back(interpolate(posxy, {i + 1, j}, {i, j}, values[2], values[3], contourValue));
points.push_back(interpolate(posxy, {i, j}, {i, j + 1}, values[3], values[0], contourValue));
break;
case 8:
points.push_back(interpolate(posxy, {i, j}, {i, j + 1}, values[3], values[0], contourValue));
points.push_back(interpolate(posxy, {i + 1, j}, {i, j}, values[2], values[3], contourValue));
break;
case 10:
points.push_back(interpolate(posxy, {i, j}, {i, j + 1}, values[3], values[0], contourValue));
points.push_back(interpolate(posxy, {i, j}, {i + 1, j}, values[3], values[2], contourValue));
points.push_back(interpolate(posxy, {i, j + 1}, {i + 1, j + 1}, values[0], values[1], contourValue));
points.push_back(interpolate(posxy, {i + 1, j + 1}, {i + 1, j}, values[1], values[2], contourValue));
break;
} }
for (Point& p : points) { {//refine
contourPoints.push_back(p); int current=0;
while(current+1<int(wave.size())){
const double u1=wave[current].first;
const double u2=wave[current+1].first;
const double middleU=(u1+u2)/2;
const double v1=wave[current].second;
const double v2=wave[current+1].second;
const double middleV=v((u1+u2)/2);
if(std::abs(middleV-(v1+v2)/2)>tolerance)
wave.emplace(wave.begin()+current+1,middleU,middleV);
else
++current;
} }
}
for(int c=1;c<int(wave.size()) && wave.back().first<maxU;++c)//we start from 1 because the 0-th one is already duplicated as the last one in a period
wave.emplace_back(wave[c].first+2*M_PI,wave[c].second);
}
for(double vShift=scaled_floor(minV,2*M_PI);vShift<maxV+2*M_PI;vShift+=2*M_PI) {
for(bool forwardRoot:{false,true}) {
result.emplace_back();
for(const auto &pair:wave) {
const double u=pair.first;
double v=pair.second;
v=(forwardRoot?v:-v)+vShift;
const double x=(u+v)/2;
const double y=(v-u)/2*(swapUV?-1:1);
result.back().points.emplace_back(x*scaleFactor,y*scaleFactor);
}
}
}
//todo: select the step better
return result;
} }
void drawContour(double contourValue, // FIXME: needed to fix build on Mac on buildserver
int gridSize_w, constexpr double FillTpmsD::PatternTolerance;
int gridSize_h,
vector<vector<double>>& data,
std::vector<std::vector<MarchingSquares::Point>>& posxy,
Polylines& repls)
{
vector<Point> contourPoints;
int total_size = (gridSize_h - 1) * (gridSize_w - 1);
vector<vector<Point>> contourPointss;
contourPointss.resize(total_size);
tbb::parallel_for(tbb::blocked_range<size_t>(0, total_size),
[&contourValue, &posxy, &contourPointss, &data, &gridSize_w](const tbb::blocked_range<size_t>& range) {
for (size_t k = range.begin(); k < range.end(); ++k) {
int i = k / (gridSize_w - 1); //
int j = k % (gridSize_w - 1); //
process_block(i, j, data, contourValue, posxy, contourPointss[k]);
}
});
vector<pair<myPoint, myPoint>> segments2; void FillTpmsD::_fill_surface_single(
myPoint p1, p2; const FillParams &params,
for (int k = 0; k < total_size; k++) {
for (int i = 0; i < contourPointss[k].size() / 2; i++) {
p1.x = scale_(contourPointss[k][i * 2].x);
p1.y = scale_(contourPointss[k][i * 2].y);
p2.x = scale_(contourPointss[k][i * 2 + 1].x);
p2.y = scale_(contourPointss[k][i * 2 + 1].y);
segments2.push_back({p1, p2});
}
}
LineSegmentMerger merger;
vector<vector<myPoint>> result;
merger.mergeSegments(segments2, result);
for (vector<myPoint>& p : result) {
Polyline repltmp;
for (myPoint& pt : p) {
repltmp.points.push_back(Slic3r::Point(pt.x, pt.y));
}
repltmp.simplify(scale_(0.05f));
repls.push_back(repltmp);
}
}
} // namespace MarchingSquares
static float sin_table[360];
static float cos_table[360];
static bool g_is_init = false;
#define PIratio 57.29577951308232 // 180/PI
static void initialize_lookup_tables()
{
for (int i = 0; i < 360; ++i) {
float angle = i * (M_PI / 180.0);
sin_table[i] = std::sin(angle);
cos_table[i] = std::cos(angle);
}
}
static float get_sin(float angle)
{
angle = angle * PIratio;
int index = static_cast<int>(std::fmod(angle, 360) + 360) % 360;
return sin_table[index];
}
static float get_cos(float angle)
{
angle = angle * PIratio;
int index = static_cast<int>(std::fmod(angle, 360) + 360) % 360;
return cos_table[index];
}
FillTpmsD::FillTpmsD()
{
if (!g_is_init) {
initialize_lookup_tables();
g_is_init = true;
}
}
void FillTpmsD::_fill_surface_single(const FillParams& params,
unsigned int thickness_layers, unsigned int thickness_layers,
const std::pair<float, Point>& direction, const std::pair<float, Point> &direction,
ExPolygon expolygon, ExPolygon expolygon,
Polylines& polylines_out) Polylines &polylines_out)
{ {
auto infill_angle = float(this->angle - (CorrectionAngle * 2 * M_PI) / 360.); auto infill_angle = float(this->angle + (CorrectionAngle * 2*M_PI) / 360.);
if (std::abs(infill_angle) >= EPSILON) if(std::abs(infill_angle) >= EPSILON)
expolygon.rotate(-infill_angle); expolygon.rotate(-infill_angle);
float vari_T = 2.98 * spacing / params.density; // Infill density adjustment factor for TPMS-D
BoundingBox bb = expolygon.contour.bounding_box(); BoundingBox bb = expolygon.contour.bounding_box();
auto cenpos = unscale(bb.center()); // Density adjusted to have a good %of weight.
auto boxsize = unscale(bb.size()); double density_adjusted = std::max(0., params.density * DensityAdjust);
float xlen = boxsize.x(); // Distance between the gyroid waves in scaled coordinates.
float ylen = boxsize.y(); coord_t distance = coord_t(scale_(this->spacing) / density_adjusted);
float delta = 0.25f; // align bounding box to a multiple of our grid module
float myperiod = 2 * PI / vari_T; bb.merge(align_to_grid(bb.min, Point(2*M_PI*distance, 2*M_PI*distance)));
float c_z = myperiod * this->z;
float cos_z = get_cos(c_z);
float sin_z = get_sin(c_z);
auto scalar_field = [&](float x, float y) { // generate pattern
// TPMS-D Polylines polylines = make_waves(
float a_x = myperiod * x; scale_(this->z),
float b_y = myperiod * y; density_adjusted,
float r = get_cos(a_x) * get_cos(b_y) * cos_z - get_sin(a_x) * get_sin(b_y) * sin_z; this->spacing,
return r; ceil(bb.size()(0) / distance) + 1.,
}; ceil(bb.size()(1) / distance) + 1.);
std::vector<std::vector<MarchingSquares::Point>> posxy; // shift the polyline to the grid origin
int i = 0, j = 0; for (Polyline &pl : polylines)
std::vector<MarchingSquares::Point> allptpos; pl.translate(bb.min);
for (float y = -(ylen) / 2.0f - 2; y < (ylen) / 2.0f + 2; y = y + delta, i++) {
j = 0;
std::vector<MarchingSquares::Point> colposxy;
for (float x = -(xlen) / 2.0f - 2; x < (xlen) / 2.0f + 2; x = x + delta, j++) {
MarchingSquares::Point pt;
pt.x = cenpos.x() + x;
pt.y = cenpos.y() + y;
colposxy.push_back(pt);
}
posxy.push_back(colposxy);
}
std::vector<std::vector<double>> data(posxy.size(), std::vector<double>(posxy[0].size()));
int width = posxy[0].size();
int height = posxy.size();
int total_size = (height) * (width);
tbb::parallel_for(tbb::blocked_range<size_t>(0, total_size),
[&width, &scalar_field, &data, &posxy](const tbb::blocked_range<size_t>& range) {
for (size_t k = range.begin(); k < range.end(); ++k) {
int i = k / (width);
int j = k % (width);
data[i][j] = scalar_field(posxy[i][j].x, posxy[i][j].y);
}
});
Polylines polylines;
MarchingSquares::drawContour(0, j, i, data, posxy, polylines);
polylines = intersection_pl(polylines, expolygon); polylines = intersection_pl(polylines, expolygon);
if (!polylines.empty()) { 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()) {
// connect lines // connect lines
size_t polylines_out_first_idx = polylines_out.size(); size_t polylines_out_first_idx = polylines_out.size();
if (params.dont_connect()) if (params.dont_connect())
append(polylines_out, chain_polylines(polylines)); append(polylines_out, chain_polylines(polylines));
else else
this->connect_infill(std::move(polylines), expolygon, polylines_out, this->spacing, params); this->connect_infill(std::move(polylines), expolygon, polylines_out, this->spacing, params);
// new paths must be rotated back // new paths must be rotated back
if (std::abs(infill_angle) >= EPSILON) { if (std::abs(infill_angle) >= EPSILON) {
for (auto it = polylines_out.begin() + polylines_out_first_idx; it != polylines_out.end(); ++it) for (auto it = polylines_out.begin() + polylines_out_first_idx; it != polylines_out.end(); ++ it)
it->rotate(infill_angle); it->rotate(infill_angle);
} }
} }
+17 -2
View File
@@ -1,20 +1,26 @@
#ifndef slic3r_FillTpmsD_hpp_ #ifndef slic3r_FillTpmsD_hpp_
#define slic3r_FillTpmsD_hpp_ #define slic3r_FillTpmsD_hpp_
#include "../libslic3r.h" #include <utility>
#include "libslic3r/libslic3r.h"
#include "FillBase.hpp" #include "FillBase.hpp"
#include "libslic3r/ExPolygon.hpp"
#include "libslic3r/Polyline.hpp"
namespace Slic3r { namespace Slic3r {
class Point;
class FillTpmsD : public Fill class FillTpmsD : public Fill
{ {
public: public:
FillTpmsD(); FillTpmsD() {}
Fill* clone() const override { return new FillTpmsD(*this); } Fill* clone() const override { return new FillTpmsD(*this); }
// require bridge flow since most of this pattern hangs in air // require bridge flow since most of this pattern hangs in air
bool use_bridge_flow() const override { return false; } bool use_bridge_flow() const override { return false; }
// Correction applied to regular infill angle to maximize printing // Correction applied to regular infill angle to maximize printing
// speed in default configuration (degrees) // speed in default configuration (degrees)
static constexpr float CorrectionAngle = -45.; static constexpr float CorrectionAngle = -45.;
@@ -24,6 +30,15 @@ public:
const std::pair<float, Point>& direction, const std::pair<float, Point>& direction,
ExPolygon expolygon, ExPolygon expolygon,
Polylines& polylines_out) override; Polylines& polylines_out) override;
bool is_self_crossing() override { return false; }
// Density adjustment to have a good %of weight.
static constexpr double DensityAdjust = 2.1;
// Gyroid upper resolution tolerance (mm^-2)
static constexpr double PatternTolerance = 0.1;
}; };
} // namespace Slic3r } // namespace Slic3r
+7
View File
@@ -82,6 +82,13 @@ public:
bool operator==(const Flow &rhs) const { return m_width == rhs.m_width && m_height == rhs.m_height && m_nozzle_diameter == rhs.m_nozzle_diameter && m_bridge == rhs.m_bridge; } bool operator==(const Flow &rhs) const { return m_width == rhs.m_width && m_height == rhs.m_height && m_nozzle_diameter == rhs.m_nozzle_diameter && m_bridge == rhs.m_bridge; }
bool operator!=(const Flow &rhs) const{
return m_width != rhs.m_width || m_height != rhs.m_height || m_nozzle_diameter != rhs.m_nozzle_diameter || m_bridge != rhs.m_bridge;
}
bool operator <(const Flow &rhs) const {
return this->mm3_per_mm() < rhs.mm3_per_mm();
}
Flow with_width (float width) const { Flow with_width (float width) const {
assert(! m_bridge); assert(! m_bridge);
return Flow(width, m_height, rounded_rectangle_extrusion_spacing(width, m_height), m_nozzle_diameter, m_bridge); return Flow(width, m_height, rounded_rectangle_extrusion_spacing(width, m_height), m_nozzle_diameter, m_bridge);
+7
View File
@@ -507,4 +507,11 @@ BoundingBox get_extents_rotated(const MultiPoint &mp, double angle)
return get_extents_rotated(mp.points, angle); return get_extents_rotated(mp.points, angle);
} }
void MultiPoint::symmetric_y(const coord_t &x_axis)
{
for (Point &pt : points) {
pt(0) = 2 * x_axis - pt(0);
}
}
} }
+1 -1
View File
@@ -94,7 +94,7 @@ public:
bool intersection(const Line& line, Point* intersection) const; bool intersection(const Line& line, Point* intersection) const;
bool first_intersection(const Line& line, Point* intersection) const; bool first_intersection(const Line& line, Point* intersection) const;
bool intersections(const Line &line, Points *intersections) const; bool intersections(const Line &line, Points *intersections) const;
void symmetric_y(const coord_t &y_axis);
static Points _douglas_peucker(const Points &points, const double tolerance); static Points _douglas_peucker(const Points &points, const double tolerance);
static Points visivalingam(const Points& pts, const double tolerance); static Points visivalingam(const Points& pts, const double tolerance);
static Points concave_hull_2d(const Points& pts, const double tolerence); static Points concave_hull_2d(const Points& pts, const double tolerence);
+5 -4
View File
@@ -783,10 +783,10 @@ bool Preset::has_cali_lines(PresetBundle* preset_bundle)
static std::vector<std::string> s_Preset_print_options { static std::vector<std::string> s_Preset_print_options {
"layer_height", "initial_layer_print_height", "wall_loops", "alternate_extra_wall", "slice_closing_radius", "spiral_mode", "spiral_mode_smooth", "spiral_mode_max_xy_smoothing", "spiral_starting_flow_ratio", "spiral_finishing_flow_ratio", "slicing_mode", "layer_height", "initial_layer_print_height", "wall_loops", "alternate_extra_wall", "slice_closing_radius", "spiral_mode", "spiral_mode_smooth", "spiral_mode_max_xy_smoothing", "spiral_starting_flow_ratio", "spiral_finishing_flow_ratio", "slicing_mode",
"top_shell_layers", "top_shell_thickness", "bottom_shell_layers", "bottom_shell_thickness", "top_shell_layers", "top_shell_thickness", "top_surface_density", "bottom_surface_density", "bottom_shell_layers", "bottom_shell_thickness",
"extra_perimeters_on_overhangs", "ensure_vertical_shell_thickness", "reduce_crossing_wall", "detect_thin_wall", "detect_overhang_wall", "overhang_reverse", "overhang_reverse_threshold","overhang_reverse_internal_only", "wall_direction", "extra_perimeters_on_overhangs", "ensure_vertical_shell_thickness", "reduce_crossing_wall", "detect_thin_wall", "detect_overhang_wall", "overhang_reverse", "overhang_reverse_threshold","overhang_reverse_internal_only", "wall_direction",
"seam_position", "staggered_inner_seams", "wall_sequence", "is_infill_first", "sparse_infill_density", "sparse_infill_pattern", "lattice_angle_1", "lattice_angle_2", "infill_overhang_angle", "top_surface_pattern", "bottom_surface_pattern", "seam_position", "staggered_inner_seams", "wall_sequence", "is_infill_first", "sparse_infill_density", "sparse_infill_pattern", "lattice_angle_1", "lattice_angle_2", "infill_overhang_angle", "top_surface_pattern", "bottom_surface_pattern",
"infill_direction", "solid_infill_direction", "rotate_solid_infill_direction", "counterbore_hole_bridging", "infill_direction", "solid_infill_direction", "counterbore_hole_bridging","infill_shift_step", "sparse_infill_rotate_template", "solid_infill_rotate_template", "symmetric_infill_y_axis","skeleton_infill_density", "infill_lock_depth", "skin_infill_depth", "skin_infill_density",
"minimum_sparse_infill_area", "reduce_infill_retraction","internal_solid_infill_pattern","gap_fill_target", "minimum_sparse_infill_area", "reduce_infill_retraction","internal_solid_infill_pattern","gap_fill_target",
"ironing_type", "ironing_pattern", "ironing_flow", "ironing_speed", "ironing_spacing", "ironing_angle", "ironing_inset", "ironing_type", "ironing_pattern", "ironing_flow", "ironing_speed", "ironing_spacing", "ironing_angle", "ironing_inset",
"support_ironing", "support_ironing_pattern", "support_ironing_flow", "support_ironing_spacing", "support_ironing", "support_ironing_pattern", "support_ironing_flow", "support_ironing_spacing",
@@ -806,8 +806,9 @@ static std::vector<std::string> s_Preset_print_options {
"support_top_z_distance", "support_on_build_plate_only","support_critical_regions_only", "bridge_no_support", "thick_bridges", "thick_internal_bridges","dont_filter_internal_bridges","enable_extra_bridge_layer", "max_bridge_length", "print_sequence", "print_order", "support_remove_small_overhang", "support_top_z_distance", "support_on_build_plate_only","support_critical_regions_only", "bridge_no_support", "thick_bridges", "thick_internal_bridges","dont_filter_internal_bridges","enable_extra_bridge_layer", "max_bridge_length", "print_sequence", "print_order", "support_remove_small_overhang",
"filename_format", "wall_filament", "support_bottom_z_distance", "filename_format", "wall_filament", "support_bottom_z_distance",
"sparse_infill_filament", "solid_infill_filament", "support_filament", "support_interface_filament","support_interface_not_for_body", "sparse_infill_filament", "solid_infill_filament", "support_filament", "support_interface_filament","support_interface_not_for_body",
"ooze_prevention", "standby_temperature_delta", "preheat_time","preheat_steps", "interface_shells", "line_width", "initial_layer_line_width", "ooze_prevention", "standby_temperature_delta", "preheat_time","preheat_steps", "interface_shells", "line_width", "initial_layer_line_width", "inner_wall_line_width",
"inner_wall_line_width", "outer_wall_line_width", "sparse_infill_line_width", "internal_solid_infill_line_width", "outer_wall_line_width", "sparse_infill_line_width", "internal_solid_infill_line_width",
"skin_infill_line_width","skeleton_infill_line_width",
"top_surface_line_width", "support_line_width", "infill_wall_overlap","top_bottom_infill_wall_overlap", "bridge_flow", "internal_bridge_flow", "top_surface_line_width", "support_line_width", "infill_wall_overlap","top_bottom_infill_wall_overlap", "bridge_flow", "internal_bridge_flow",
"elefant_foot_compensation", "elefant_foot_compensation_layers", "xy_contour_compensation", "xy_hole_compensation", "resolution", "enable_prime_tower", "elefant_foot_compensation", "elefant_foot_compensation_layers", "xy_contour_compensation", "xy_hole_compensation", "resolution", "enable_prime_tower",
"prime_tower_width", "prime_tower_brim_width", "prime_volume", "prime_tower_width", "prime_tower_brim_width", "prime_volume",
+1 -1
View File
@@ -1387,7 +1387,7 @@ StringObjectException Print::validate(StringObjectException *warning, Polygons*
if (!validate_extrusion_width(object->config(), "support_line_width", layer_height, err_msg)) if (!validate_extrusion_width(object->config(), "support_line_width", layer_height, err_msg))
return {err_msg, object, "support_line_width"}; return {err_msg, object, "support_line_width"};
} }
for (const char *opt_key : { "inner_wall_line_width", "outer_wall_line_width", "sparse_infill_line_width", "internal_solid_infill_line_width", "top_surface_line_width" }) for (const char *opt_key : { "inner_wall_line_width", "outer_wall_line_width", "sparse_infill_line_width", "internal_solid_infill_line_width", "top_surface_line_width","skin_infill_line_width" ,"skeleton_infill_line_width"})
for (const PrintRegion &region : object->all_regions()) for (const PrintRegion &region : object->all_regions())
if (!validate_extrusion_width(region.config(), opt_key, layer_height, err_msg)) if (!validate_extrusion_width(region.config(), opt_key, layer_height, err_msg))
return {err_msg, object, opt_key}; return {err_msg, object, opt_key};
File diff suppressed because it is too large Load Diff
+13 -3
View File
@@ -60,7 +60,7 @@ enum AuthorizationType {
enum InfillPattern : int { enum InfillPattern : int {
ipConcentric, ipRectilinear, ipGrid, ip2DLattice, ipLine, ipCubic, ipTriangles, ipStars, ipGyroid, ipTpmsD, ipHoneycomb, ipAdaptiveCubic, ipMonotonic, ipMonotonicLine, ipAlignedRectilinear, ip2DHoneycomb, ip3DHoneycomb, ipConcentric, ipRectilinear, ipGrid, ip2DLattice, ipLine, ipCubic, ipTriangles, ipStars, ipGyroid, ipTpmsD, ipHoneycomb, ipAdaptiveCubic, ipMonotonic, ipMonotonicLine, ipAlignedRectilinear, ip2DHoneycomb, ip3DHoneycomb,
ipHilbertCurve, ipArchimedeanChords, ipOctagramSpiral, ipSupportCubic, ipSupportBase, ipConcentricInternal, ipHilbertCurve, ipArchimedeanChords, ipOctagramSpiral, ipSupportCubic, ipSupportBase, ipConcentricInternal,
ipLightning, ipCrossHatch, ipQuarterCubic, ipLightning, ipCrossHatch, ipQuarterCubic, ipZigZag, ipCrossZag, ipLockedZag,
ipCount, ipCount,
}; };
@@ -952,6 +952,8 @@ PRINT_CONFIG_CLASS_DEFINE(
((ConfigOptionFloat, bridge_speed)) ((ConfigOptionFloat, bridge_speed))
((ConfigOptionFloatOrPercent, internal_bridge_speed)) ((ConfigOptionFloatOrPercent, internal_bridge_speed))
((ConfigOptionEnum<EnsureVerticalShellThickness>, ensure_vertical_shell_thickness)) ((ConfigOptionEnum<EnsureVerticalShellThickness>, ensure_vertical_shell_thickness))
((ConfigOptionPercent, top_surface_density))
((ConfigOptionPercent, bottom_surface_density))
((ConfigOptionEnum<InfillPattern>, top_surface_pattern)) ((ConfigOptionEnum<InfillPattern>, top_surface_pattern))
((ConfigOptionEnum<InfillPattern>, bottom_surface_pattern)) ((ConfigOptionEnum<InfillPattern>, bottom_surface_pattern))
((ConfigOptionEnum<InfillPattern>, internal_solid_infill_pattern)) ((ConfigOptionEnum<InfillPattern>, internal_solid_infill_pattern))
@@ -959,7 +961,10 @@ PRINT_CONFIG_CLASS_DEFINE(
((ConfigOptionFloat, outer_wall_speed)) ((ConfigOptionFloat, outer_wall_speed))
((ConfigOptionFloat, infill_direction)) ((ConfigOptionFloat, infill_direction))
((ConfigOptionFloat, solid_infill_direction)) ((ConfigOptionFloat, solid_infill_direction))
((ConfigOptionBool, rotate_solid_infill_direction)) ((ConfigOptionString, solid_infill_rotate_template))
((ConfigOptionBool, symmetric_infill_y_axis))
((ConfigOptionFloat, infill_shift_step))
((ConfigOptionString, sparse_infill_rotate_template))
((ConfigOptionPercent, sparse_infill_density)) ((ConfigOptionPercent, sparse_infill_density))
((ConfigOptionEnum<InfillPattern>, sparse_infill_pattern)) ((ConfigOptionEnum<InfillPattern>, sparse_infill_pattern))
((ConfigOptionFloat, lattice_angle_1)) ((ConfigOptionFloat, lattice_angle_1))
@@ -979,7 +984,12 @@ PRINT_CONFIG_CLASS_DEFINE(
((ConfigOptionPercent, infill_wall_overlap)) ((ConfigOptionPercent, infill_wall_overlap))
((ConfigOptionPercent, top_bottom_infill_wall_overlap)) ((ConfigOptionPercent, top_bottom_infill_wall_overlap))
((ConfigOptionFloat, sparse_infill_speed)) ((ConfigOptionFloat, sparse_infill_speed))
//BBS ((ConfigOptionPercent, skeleton_infill_density))
((ConfigOptionPercent, skin_infill_density))
((ConfigOptionFloat, infill_lock_depth))
((ConfigOptionFloat, skin_infill_depth))
((ConfigOptionFloatOrPercent, skin_infill_line_width))
((ConfigOptionFloatOrPercent, skeleton_infill_line_width))
((ConfigOptionBool, infill_combination)) ((ConfigOptionBool, infill_combination))
// Orca: // Orca:
((ConfigOptionFloatOrPercent, infill_combination_max_layer_height)) ((ConfigOptionFloatOrPercent, infill_combination_max_layer_height))
+13 -2
View File
@@ -1073,9 +1073,10 @@ bool PrintObject::invalidate_state_by_config_options(
|| opt_key == "sparse_infill_filament" || opt_key == "sparse_infill_filament"
|| opt_key == "solid_infill_filament" || opt_key == "solid_infill_filament"
|| opt_key == "sparse_infill_line_width" || opt_key == "sparse_infill_line_width"
|| opt_key == "skin_infill_line_width"
|| opt_key == "skeleton_infill_line_width"
|| opt_key == "infill_direction" || opt_key == "infill_direction"
|| opt_key == "solid_infill_direction" || opt_key == "solid_infill_direction"
|| opt_key == "rotate_solid_infill_direction"
|| opt_key == "ensure_vertical_shell_thickness" || opt_key == "ensure_vertical_shell_thickness"
|| opt_key == "bridge_angle" || opt_key == "bridge_angle"
|| opt_key == "internal_bridge_angle" // ORCA: Internal bridge angle override || opt_key == "internal_bridge_angle" // ORCA: Internal bridge angle override
@@ -1091,13 +1092,23 @@ bool PrintObject::invalidate_state_by_config_options(
|| opt_key == "infill_anchor" || opt_key == "infill_anchor"
|| opt_key == "infill_anchor_max" || opt_key == "infill_anchor_max"
|| opt_key == "top_surface_line_width" || opt_key == "top_surface_line_width"
|| opt_key == "top_surface_density"
|| opt_key == "bottom_surface_density"
|| opt_key == "initial_layer_line_width" || opt_key == "initial_layer_line_width"
|| opt_key == "small_area_infill_flow_compensation" || opt_key == "small_area_infill_flow_compensation"
|| opt_key == "lattice_angle_1" || opt_key == "lattice_angle_1"
|| opt_key == "lattice_angle_2" || opt_key == "lattice_angle_2"
|| opt_key == "infill_overhang_angle") { || opt_key == "infill_overhang_angle") {
steps.emplace_back(posInfill); steps.emplace_back(posInfill);
} else if (opt_key == "sparse_infill_pattern") { } else if (opt_key == "sparse_infill_pattern"
|| opt_key == "symmetric_infill_y_axis"
|| opt_key == "infill_shift_step"
|| opt_key == "sparse_infill_rotate_template"
|| opt_key == "solid_infill_rotate_template"
|| opt_key == "skeleton_infill_density"
|| opt_key == "skin_infill_density"
|| opt_key == "infill_lock_depth"
|| opt_key == "skin_infill_depth") {
steps.emplace_back(posPrepareInfill); steps.emplace_back(posPrepareInfill);
} else if (opt_key == "sparse_infill_density") { } else if (opt_key == "sparse_infill_density") {
// One likely wants to reslice only when switching between zero infill to simulate boolean difference (subtracting volumes), // One likely wants to reslice only when switching between zero infill to simulate boolean difference (subtracting volumes),
+2 -2
View File
@@ -665,8 +665,8 @@ if (SLIC3R_STATIC)
target_compile_definitions(libslic3r_gui PUBLIC -DwxDEBUG_LEVEL=0) target_compile_definitions(libslic3r_gui PUBLIC -DwxDEBUG_LEVEL=0)
endif() endif()
if (HAVE_SPNAV) if (SPNAV_LIB)
target_link_libraries(libslic3r_gui spnav) target_link_libraries(libslic3r_gui ${SPNAV_LIB})
endif() endif()
if (SLIC3R_STATIC AND NOT SLIC3R_STATIC_EXCLUDE_CURL AND UNIX AND NOT APPLE) if (SLIC3R_STATIC AND NOT SLIC3R_STATIC_EXCLUDE_CURL AND UNIX AND NOT APPLE)
+3 -3
View File
@@ -49,7 +49,7 @@ void BedShape::append_option_line(ConfigOptionsGroupShp optgroup, Parameter para
def.min = 0; def.min = 0;
def.max = 214700; def.max = 214700;
def.width = 10; // increase width for large scale printers with 4 digit values def.width = 10; // increase width for large scale printers with 4 digit values
def.sidetext = L("mm"); def.sidetext = "mm"; // milimeters, don't need translation
def.label = get_option_label(param); def.label = get_option_label(param);
def.tooltip = L("Size in X and Y of the rectangular plate."); def.tooltip = L("Size in X and Y of the rectangular plate.");
key = "rect_size"; key = "rect_size";
@@ -60,7 +60,7 @@ void BedShape::append_option_line(ConfigOptionsGroupShp optgroup, Parameter para
def.min = -107350; def.min = -107350;
def.max = 107350; def.max = 107350;
def.width = 10; // increase width for large scale printers with 4 digit values def.width = 10; // increase width for large scale printers with 4 digit values
def.sidetext = L("mm"); def.sidetext = "mm"; // milimeters, don't need translation
def.label = get_option_label(param); def.label = get_option_label(param);
def.tooltip = L("Distance of the 0,0 G-code coordinate from the front left corner of the rectangle."); def.tooltip = L("Distance of the 0,0 G-code coordinate from the front left corner of the rectangle.");
key = "rect_origin"; key = "rect_origin";
@@ -69,7 +69,7 @@ void BedShape::append_option_line(ConfigOptionsGroupShp optgroup, Parameter para
def.type = coFloat; def.type = coFloat;
def.set_default_value(new ConfigOptionFloat(200)); def.set_default_value(new ConfigOptionFloat(200));
def.width = 10; // match size def.width = 10; // match size
def.sidetext = L("mm"); def.sidetext = "mm"; // milimeters, don't need translation
def.label = get_option_label(param); def.label = get_option_label(param);
def.tooltip = L("Diameter of the print bed. It is assumed that origin (0,0) is located in the center."); def.tooltip = L("Diameter of the print bed. It is assumed that origin (0,0) is located in the center.");
key = "diameter"; key = "diameter";
@@ -313,7 +313,7 @@ void CaliPresetCustomRangePanel::create_panel(wxWindow* parent)
m_title_texts[i]->Wrap(-1); m_title_texts[i]->Wrap(-1);
m_title_texts[i]->SetFont(::Label::Body_14); m_title_texts[i]->SetFont(::Label::Body_14);
item_sizer->Add(m_title_texts[i], 0, wxALL, 0); item_sizer->Add(m_title_texts[i], 0, wxALL, 0);
m_value_inputs[i] = new TextInput(parent, wxEmptyString, wxString::FromUTF8("°C"), "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, 0); m_value_inputs[i] = new TextInput(parent, wxEmptyString, wxString::FromUTF8("\u2103" /* °C */), "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, 0);
m_value_inputs[i]->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); m_value_inputs[i]->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
m_value_inputs[i]->GetTextCtrl()->Bind(wxEVT_TEXT, [this, i](wxCommandEvent& event) { m_value_inputs[i]->GetTextCtrl()->Bind(wxEVT_TEXT, [this, i](wxCommandEvent& event) {
std::string number = m_value_inputs[i]->GetTextCtrl()->GetValue().ToStdString(); std::string number = m_value_inputs[i]->GetTextCtrl()->GetValue().ToStdString();
@@ -392,7 +392,7 @@ void CaliPresetTipsPanel::create_panel(wxWindow* parent)
auto nozzle_temp_sizer = new wxBoxSizer(wxVERTICAL); auto nozzle_temp_sizer = new wxBoxSizer(wxVERTICAL);
auto nozzle_temp_text = new Label(parent, _L("Nozzle temperature")); auto nozzle_temp_text = new Label(parent, _L("Nozzle temperature"));
nozzle_temp_text->SetFont(Label::Body_12); nozzle_temp_text->SetFont(Label::Body_12);
m_nozzle_temp = new TextInput(parent, wxEmptyString, wxString::FromUTF8("°C"), "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, wxTE_READONLY); m_nozzle_temp = new TextInput(parent, wxEmptyString, wxString::FromUTF8("\u2103" /* °C */), "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, wxTE_READONLY);
m_nozzle_temp->SetBorderWidth(0); m_nozzle_temp->SetBorderWidth(0);
nozzle_temp_sizer->Add(nozzle_temp_text, 0, wxALIGN_LEFT); nozzle_temp_sizer->Add(nozzle_temp_text, 0, wxALIGN_LEFT);
nozzle_temp_sizer->Add(m_nozzle_temp, 0, wxEXPAND); nozzle_temp_sizer->Add(m_nozzle_temp, 0, wxEXPAND);
@@ -439,7 +439,7 @@ void CaliPresetTipsPanel::set_params(int nozzle_temp, int bed_temp, float max_vo
m_nozzle_temp->GetTextCtrl()->SetValue(text_nozzle_temp); m_nozzle_temp->GetTextCtrl()->SetValue(text_nozzle_temp);
std::string bed_temp_text = bed_temp==0 ? "-": std::to_string(bed_temp); std::string bed_temp_text = bed_temp==0 ? "-": std::to_string(bed_temp);
m_bed_temp->SetLabel(wxString::FromUTF8(bed_temp_text + "°C")); m_bed_temp->SetLabel(wxString::FromUTF8(bed_temp_text + "\u2103" /* °C */));
wxString flow_val_text = wxString::Format("%0.2f", max_volumetric); wxString flow_val_text = wxString::Format("%0.2f", max_volumetric);
m_max_volumetric_speed->GetTextCtrl()->SetValue(flow_val_text); m_max_volumetric_speed->GetTextCtrl()->SetValue(flow_val_text);
+45 -2
View File
@@ -472,6 +472,20 @@ void ConfigManipulation::update_print_fff_config(DynamicPrintConfig* config, con
apply(config, &new_conf); apply(config, &new_conf);
is_msg_dlg_already_exist = false; is_msg_dlg_already_exist = false;
} }
// layer_height shouldn't be equal to zero
float skin_depth = config->opt_float("skin_infill_depth");
if (config->opt_float("infill_lock_depth") > skin_depth) {
const wxString msg_text = _(L("lock depth should smaller than skin depth.\nReset to 50% of skin depth"));
MessageDialog dialog(m_msg_dlg_parent, msg_text, "", wxICON_WARNING | wxOK);
DynamicPrintConfig new_conf = *config;
is_msg_dlg_already_exist = true;
dialog.ShowModal();
new_conf.set_key_value("infill_lock_depth", new ConfigOptionFloat(skin_depth / 2));
apply(config, &new_conf);
is_msg_dlg_already_exist = false;
}
} }
void ConfigManipulation::apply_null_fff_config(DynamicPrintConfig *config, std::vector<std::string> const &keys, std::map<ObjectBase *, ModelConfig *> const &configs) void ConfigManipulation::apply_null_fff_config(DynamicPrintConfig *config, std::vector<std::string> const &keys, std::map<ObjectBase *, ModelConfig *> const &configs)
@@ -526,7 +540,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, co
bool have_infill = config->option<ConfigOptionPercent>("sparse_infill_density")->value > 0; bool have_infill = config->option<ConfigOptionPercent>("sparse_infill_density")->value > 0;
// sparse_infill_filament uses the same logic as in Print::extruders() // sparse_infill_filament uses the same logic as in Print::extruders()
for (auto el : { "sparse_infill_pattern", "infill_combination", for (auto el : { "sparse_infill_pattern", "infill_combination",
"minimum_sparse_infill_area", "sparse_infill_filament", "infill_anchor_max"}) "minimum_sparse_infill_area", "sparse_infill_filament", "infill_anchor_max","infill_shift_step","sparse_infill_rotate_template","symmetric_infill_y_axis"})
toggle_line(el, have_infill); toggle_line(el, have_infill);
bool have_combined_infill = config->opt_bool("infill_combination") && have_infill; bool have_combined_infill = config->opt_bool("infill_combination") && have_infill;
@@ -539,6 +553,19 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, co
bool has_infill_anchors = have_infill && config->option<ConfigOptionFloatOrPercent>("infill_anchor_max")->value > 0 && infill_anchor; bool has_infill_anchors = have_infill && config->option<ConfigOptionFloatOrPercent>("infill_anchor_max")->value > 0 && infill_anchor;
toggle_field("infill_anchor", has_infill_anchors); toggle_field("infill_anchor", has_infill_anchors);
//cross zag
bool is_cross_zag = config->option<ConfigOptionEnum<InfillPattern>>("sparse_infill_pattern")->value == InfillPattern::ipCrossZag;
bool is_locked_zig = config->option<ConfigOptionEnum<InfillPattern>>("sparse_infill_pattern")->value == InfillPattern::ipLockedZag;
toggle_line("infill_shift_step", is_cross_zag || is_locked_zig);
for (auto el : { "skeleton_infill_density", "skin_infill_density", "infill_lock_depth", "skin_infill_depth","skin_infill_line_width", "skeleton_infill_line_width" })
toggle_line(el, is_locked_zig);
bool is_zig_zag = config->option<ConfigOptionEnum<InfillPattern>>("sparse_infill_pattern")->value == InfillPattern::ipZigZag;
toggle_line("symmetric_infill_y_axis", is_zig_zag || is_cross_zag || is_locked_zig);
bool has_spiral_vase = config->opt_bool("spiral_mode"); bool has_spiral_vase = config->opt_bool("spiral_mode");
toggle_line("spiral_mode_smooth", has_spiral_vase); toggle_line("spiral_mode_smooth", has_spiral_vase);
toggle_line("spiral_mode_max_xy_smoothing", has_spiral_vase && config->opt_bool("spiral_mode_smooth")); toggle_line("spiral_mode_max_xy_smoothing", has_spiral_vase && config->opt_bool("spiral_mode_smooth"));
@@ -552,7 +579,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, co
for (auto el : { "infill_direction", "sparse_infill_line_width", for (auto el : { "infill_direction", "sparse_infill_line_width",
"sparse_infill_speed", "bridge_speed", "internal_bridge_speed", "bridge_angle", "internal_bridge_angle", "sparse_infill_speed", "bridge_speed", "internal_bridge_speed", "bridge_angle", "internal_bridge_angle",
"solid_infill_direction", "rotate_solid_infill_direction", "internal_solid_infill_pattern", "solid_infill_filament", "solid_infill_direction", "solid_infill_rotate_template", "internal_solid_infill_pattern", "solid_infill_filament",
}) })
toggle_field(el, have_infill || has_solid_infill); toggle_field(el, have_infill || has_solid_infill);
@@ -823,6 +850,22 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, co
for (auto el : { "lattice_angle_1", "lattice_angle_2"}) for (auto el : { "lattice_angle_1", "lattice_angle_2"})
toggle_line(el, lattice_options); toggle_line(el, lattice_options);
//Orca: hide rotate template for solid infill if not support
const auto _sparse_infill_pattern = config->option<ConfigOptionEnum<InfillPattern>>("sparse_infill_pattern")->value;
bool show_sparse_infill_rotate_template = _sparse_infill_pattern == ipRectilinear || _sparse_infill_pattern == ipLine ||
_sparse_infill_pattern == ipZigZag || _sparse_infill_pattern == ipCrossZag ||
_sparse_infill_pattern == ipLockedZag;
toggle_line("sparse_infill_rotate_template", show_sparse_infill_rotate_template);
//Orca: hide rotate template for solid infill if not support
const auto _solid_infill_pattern = config->option<ConfigOptionEnum<InfillPattern>>("internal_solid_infill_pattern")->value;
bool show_solid_infill_rotate_template = _solid_infill_pattern == ipRectilinear || _solid_infill_pattern == ipMonotonic ||
_solid_infill_pattern == ipMonotonicLine || _solid_infill_pattern == ipAlignedRectilinear;
toggle_line("solid_infill_rotate_template", show_solid_infill_rotate_template);
toggle_line("infill_overhang_angle", config->opt_enum<InfillPattern>("sparse_infill_pattern") == InfillPattern::ip2DHoneycomb); toggle_line("infill_overhang_angle", config->opt_enum<InfillPattern>("sparse_infill_pattern") == InfillPattern::ip2DHoneycomb);
} }
+5 -5
View File
@@ -278,7 +278,7 @@ PrinterPicker::PrinterPicker(wxWindow *parent, const VendorProfile &vendor, wxSt
const auto &variant = model.variants[i]; const auto &variant = model.variants[i];
const auto label = model.technology == ptFFF const auto label = model.technology == ptFFF
? from_u8((boost::format("%1% %2% %3%") % variant.name % _utf8(L("mm")) % _utf8(L("nozzle"))).str()) ? from_u8((boost::format("%1% %2% %3%") % variant.name % _utf8("mm") % _utf8(L("nozzle"))).str())
: from_u8(model.name); : from_u8(model.name);
if (i == 1) { if (i == 1) {
@@ -1353,7 +1353,7 @@ PageDiameters::PageDiameters(ConfigWizard *parent)
auto *sizer_nozzle = new wxFlexGridSizer(3, 5, 5); auto *sizer_nozzle = new wxFlexGridSizer(3, 5, 5);
auto *text_nozzle = new wxStaticText(this, wxID_ANY, _L("Nozzle Diameter:")); auto *text_nozzle = new wxStaticText(this, wxID_ANY, _L("Nozzle Diameter:"));
auto *unit_nozzle = new wxStaticText(this, wxID_ANY, _L("mm")); auto *unit_nozzle = new wxStaticText(this, wxID_ANY, "mm");
sizer_nozzle->AddGrowableCol(0, 1); sizer_nozzle->AddGrowableCol(0, 1);
sizer_nozzle->Add(text_nozzle, 0, wxALIGN_CENTRE_VERTICAL); sizer_nozzle->Add(text_nozzle, 0, wxALIGN_CENTRE_VERTICAL);
sizer_nozzle->Add(diam_nozzle); sizer_nozzle->Add(diam_nozzle);
@@ -1367,7 +1367,7 @@ PageDiameters::PageDiameters(ConfigWizard *parent)
auto *sizer_filam = new wxFlexGridSizer(3, 5, 5); auto *sizer_filam = new wxFlexGridSizer(3, 5, 5);
auto *text_filam = new wxStaticText(this, wxID_ANY, _L("Filament Diameter:")); auto *text_filam = new wxStaticText(this, wxID_ANY, _L("Filament Diameter:"));
auto *unit_filam = new wxStaticText(this, wxID_ANY, _L("mm")); auto *unit_filam = new wxStaticText(this, wxID_ANY, "mm");
sizer_filam->AddGrowableCol(0, 1); sizer_filam->AddGrowableCol(0, 1);
sizer_filam->Add(text_filam, 0, wxALIGN_CENTRE_VERTICAL); sizer_filam->Add(text_filam, 0, wxALIGN_CENTRE_VERTICAL);
sizer_filam->Add(diam_filam); sizer_filam->Add(diam_filam);
@@ -1448,7 +1448,7 @@ PageTemperatures::PageTemperatures(ConfigWizard *parent)
auto *sizer_extr = new wxFlexGridSizer(3, 5, 5); auto *sizer_extr = new wxFlexGridSizer(3, 5, 5);
auto *text_extr = new wxStaticText(this, wxID_ANY, _L("Extrusion Temperature:")); auto *text_extr = new wxStaticText(this, wxID_ANY, _L("Extrusion Temperature:"));
auto *unit_extr = new wxStaticText(this, wxID_ANY, "°C"); auto *unit_extr = new wxStaticText(this, wxID_ANY, "\u2103" /* °C */);
sizer_extr->AddGrowableCol(0, 1); sizer_extr->AddGrowableCol(0, 1);
sizer_extr->Add(text_extr, 0, wxALIGN_CENTRE_VERTICAL); sizer_extr->Add(text_extr, 0, wxALIGN_CENTRE_VERTICAL);
sizer_extr->Add(spin_extr); sizer_extr->Add(spin_extr);
@@ -1462,7 +1462,7 @@ PageTemperatures::PageTemperatures(ConfigWizard *parent)
auto *sizer_bed = new wxFlexGridSizer(3, 5, 5); auto *sizer_bed = new wxFlexGridSizer(3, 5, 5);
auto *text_bed = new wxStaticText(this, wxID_ANY, _L("Bed Temperature:")); auto *text_bed = new wxStaticText(this, wxID_ANY, _L("Bed Temperature:"));
auto *unit_bed = new wxStaticText(this, wxID_ANY, "°C"); auto *unit_bed = new wxStaticText(this, wxID_ANY, "\u2103" /* °C */);
sizer_bed->AddGrowableCol(0, 1); sizer_bed->AddGrowableCol(0, 1);
sizer_bed->Add(text_bed, 0, wxALIGN_CENTRE_VERTICAL); sizer_bed->Add(text_bed, 0, wxALIGN_CENTRE_VERTICAL);
sizer_bed->Add(spin_bed); sizer_bed->Add(spin_bed);
+5 -5
View File
@@ -1870,7 +1870,7 @@ wxBoxSizer *CreatePrinterPresetDialog::create_bed_size_item(wxWindow *parent)
// ORCA use icon on input box to match style with other Point fields // ORCA use icon on input box to match style with other Point fields
horizontal_sizer->Add(length_sizer, 0, wxEXPAND | wxLEFT | wxTOP | wxALIGN_CENTER_VERTICAL, FromDIP(10)); horizontal_sizer->Add(length_sizer, 0, wxEXPAND | wxLEFT | wxTOP | wxALIGN_CENTER_VERTICAL, FromDIP(10));
wxBoxSizer *length_input_sizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer *length_input_sizer = new wxBoxSizer(wxVERTICAL);
m_bed_size_x_input = new TextInput(parent, "200", _L("mm"), "inputbox_x", wxDefaultPosition, PRINTER_SPACE_SIZE, wxTE_PROCESS_ENTER); m_bed_size_x_input = new TextInput(parent, "200", "mm", "inputbox_x", wxDefaultPosition, PRINTER_SPACE_SIZE, wxTE_PROCESS_ENTER);
wxTextValidator validator(wxFILTER_DIGITS); wxTextValidator validator(wxFILTER_DIGITS);
m_bed_size_x_input->GetTextCtrl()->SetValidator(validator); m_bed_size_x_input->GetTextCtrl()->SetValidator(validator);
length_input_sizer->Add(m_bed_size_x_input, 0, wxEXPAND | wxLEFT, FromDIP(5)); length_input_sizer->Add(m_bed_size_x_input, 0, wxEXPAND | wxLEFT, FromDIP(5));
@@ -1880,7 +1880,7 @@ wxBoxSizer *CreatePrinterPresetDialog::create_bed_size_item(wxWindow *parent)
// ORCA use icon on input box to match style with other Point fields // ORCA use icon on input box to match style with other Point fields
horizontal_sizer->Add(width_sizer, 0, wxEXPAND | wxLEFT | wxTOP | wxALIGN_CENTER_VERTICAL, FromDIP(10)); horizontal_sizer->Add(width_sizer, 0, wxEXPAND | wxLEFT | wxTOP | wxALIGN_CENTER_VERTICAL, FromDIP(10));
wxBoxSizer *width_input_sizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer *width_input_sizer = new wxBoxSizer(wxVERTICAL);
m_bed_size_y_input = new TextInput(parent, "200", _L("mm"), "inputbox_y", wxDefaultPosition, PRINTER_SPACE_SIZE, wxTE_PROCESS_ENTER); m_bed_size_y_input = new TextInput(parent, "200", "mm", "inputbox_y", wxDefaultPosition, PRINTER_SPACE_SIZE, wxTE_PROCESS_ENTER);
m_bed_size_y_input->GetTextCtrl()->SetValidator(validator); m_bed_size_y_input->GetTextCtrl()->SetValidator(validator);
width_input_sizer->Add(m_bed_size_y_input, 0, wxEXPAND | wxALL, 0); width_input_sizer->Add(m_bed_size_y_input, 0, wxEXPAND | wxALL, 0);
horizontal_sizer->Add(width_input_sizer, 0, wxEXPAND | wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(5)); horizontal_sizer->Add(width_input_sizer, 0, wxEXPAND | wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(5));
@@ -1903,7 +1903,7 @@ wxBoxSizer *CreatePrinterPresetDialog::create_origin_item(wxWindow *parent)
// ORCA use icon on input box to match style with other Point fields // ORCA use icon on input box to match style with other Point fields
horizontal_sizer->Add(length_sizer, 0, wxEXPAND | wxLEFT | wxTOP | wxALIGN_CENTER_VERTICAL, FromDIP(10)); horizontal_sizer->Add(length_sizer, 0, wxEXPAND | wxLEFT | wxTOP | wxALIGN_CENTER_VERTICAL, FromDIP(10));
wxBoxSizer *length_input_sizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer *length_input_sizer = new wxBoxSizer(wxVERTICAL);
m_bed_origin_x_input = new TextInput(parent, "0", _L("mm"), "inputbox_x", wxDefaultPosition, PRINTER_SPACE_SIZE, wxTE_PROCESS_ENTER); m_bed_origin_x_input = new TextInput(parent, "0", "mm", "inputbox_x", wxDefaultPosition, PRINTER_SPACE_SIZE, wxTE_PROCESS_ENTER);
wxTextValidator validator(wxFILTER_DIGITS); wxTextValidator validator(wxFILTER_DIGITS);
m_bed_origin_x_input->GetTextCtrl()->SetValidator(validator); m_bed_origin_x_input->GetTextCtrl()->SetValidator(validator);
length_input_sizer->Add(m_bed_origin_x_input, 0, wxEXPAND | wxLEFT, FromDIP(5)); // Align with other length_input_sizer->Add(m_bed_origin_x_input, 0, wxEXPAND | wxLEFT, FromDIP(5)); // Align with other
@@ -1913,7 +1913,7 @@ wxBoxSizer *CreatePrinterPresetDialog::create_origin_item(wxWindow *parent)
// ORCA use icon on input box to match style with other Point fields // ORCA use icon on input box to match style with other Point fields
horizontal_sizer->Add(width_sizer, 0, wxEXPAND | wxLEFT | wxTOP | wxALIGN_CENTER_VERTICAL, FromDIP(10)); horizontal_sizer->Add(width_sizer, 0, wxEXPAND | wxLEFT | wxTOP | wxALIGN_CENTER_VERTICAL, FromDIP(10));
wxBoxSizer *width_input_sizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer *width_input_sizer = new wxBoxSizer(wxVERTICAL);
m_bed_origin_y_input = new TextInput(parent, "0", _L("mm"), "inputbox_y", wxDefaultPosition, PRINTER_SPACE_SIZE, wxTE_PROCESS_ENTER); m_bed_origin_y_input = new TextInput(parent, "0", "mm", "inputbox_y", wxDefaultPosition, PRINTER_SPACE_SIZE, wxTE_PROCESS_ENTER);
m_bed_origin_y_input->GetTextCtrl()->SetValidator(validator); m_bed_origin_y_input->GetTextCtrl()->SetValidator(validator);
width_input_sizer->Add(m_bed_origin_y_input, 0, wxEXPAND | wxALL, 0); width_input_sizer->Add(m_bed_origin_y_input, 0, wxEXPAND | wxALL, 0);
horizontal_sizer->Add(width_input_sizer, 0, wxEXPAND | wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(5)); horizontal_sizer->Add(width_input_sizer, 0, wxEXPAND | wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(5));
@@ -2006,7 +2006,7 @@ wxBoxSizer *CreatePrinterPresetDialog::create_max_print_height_item(wxWindow *pa
horizontal_sizer->Add(optionSizer, 0, wxEXPAND | wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(10)); horizontal_sizer->Add(optionSizer, 0, wxEXPAND | wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(10));
wxBoxSizer *hight_input_sizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer *hight_input_sizer = new wxBoxSizer(wxVERTICAL);
m_print_height_input = new TextInput(parent, "200", _L("mm"), wxEmptyString, wxDefaultPosition, PRINTER_SPACE_SIZE, wxTE_PROCESS_ENTER); // Use same alignment with all other input boxes m_print_height_input = new TextInput(parent, "200", "mm", wxEmptyString, wxDefaultPosition, PRINTER_SPACE_SIZE, wxTE_PROCESS_ENTER); // Use same alignment with all other input boxes
wxTextValidator validator(wxFILTER_DIGITS); wxTextValidator validator(wxFILTER_DIGITS);
m_print_height_input->GetTextCtrl()->SetValidator(validator); m_print_height_input->GetTextCtrl()->SetValidator(validator);
hight_input_sizer->Add(m_print_height_input, 0, wxEXPAND | wxLEFT, FromDIP(5)); hight_input_sizer->Add(m_print_height_input, 0, wxEXPAND | wxLEFT, FromDIP(5));
+3 -3
View File
@@ -3316,7 +3316,7 @@ int MachineObject::parse_json(std::string payload, bool key_field_only)
if (jj.contains("errno")) { if (jj.contains("errno")) {
if (jj["errno"].is_number()) { if (jj["errno"].is_number()) {
if (jj["errno"].get<int>() == -2) { if (jj["errno"].get<int>() == -2) {
wxString text = _L("The current chamber temperature or the target chamber temperature exceeds 45\u2103. " wxString text = _L("The current chamber temperature or the target chamber temperature exceeds 45\u2103. " /* 45°C */
"In order to avoid extruder clogging, low temperature filament (PLA/PETG/TPU) is not allowed to be loaded."); "In order to avoid extruder clogging, low temperature filament (PLA/PETG/TPU) is not allowed to be loaded.");
GUI::wxGetApp().push_notification(text); GUI::wxGetApp().push_notification(text);
} }
@@ -3330,11 +3330,11 @@ int MachineObject::parse_json(std::string payload, bool key_field_only)
wxString text; wxString text;
if (jj["errno"].get<int>() == -2) { if (jj["errno"].get<int>() == -2) {
text = _L("Low temperature filament (PLA/PETG/TPU) is loaded in the extruder. " text = _L("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\u2103."); "In order to avoid extruder clogging, it is not allowed to set the chamber temperature above 45\u2103." /* 45°C */);
} }
else if (jj["errno"].get<int>() == -4) { else if (jj["errno"].get<int>() == -4) {
text = _L("When you set the chamber temperature below 40\u2103, the chamber temperature control will not be activated, " text = _L("When you set the chamber temperature below 40\u2103, the chamber temperature control will not be activated, "
"and the target chamber temperature will automatically be set to 0\u2103."); "and the target chamber temperature will automatically be set to 0\u2103." /* 0°C */);
} }
if(!text.empty()){ if(!text.empty()){
#if __WXOSX__ #if __WXOSX__
+3 -3
View File
@@ -127,21 +127,21 @@ void ExtrusionCalibration::create()
wxWindow::GetTextExtent(_L("Bed Temperature")).x), wxWindow::GetTextExtent(_L("Bed Temperature")).x),
wxWindow::GetTextExtent(_L("Max volumetric speed")).x), wxWindow::GetTextExtent(_L("Max volumetric speed")).x),
EXTRUSION_CALIBRATION_INPUT_SIZE.x); EXTRUSION_CALIBRATION_INPUT_SIZE.x);
m_nozzle_temp = new TextInput(m_step_1_panel, wxEmptyString, _L("\u2103"), "", wxDefaultPosition, { max_input_width, EXTRUSION_CALIBRATION_INPUT_SIZE.y }, wxTE_READONLY); m_nozzle_temp = new TextInput(m_step_1_panel, wxEmptyString, "\u2103" /* °C */, "", wxDefaultPosition, { max_input_width, EXTRUSION_CALIBRATION_INPUT_SIZE.y }, wxTE_READONLY);
nozzle_temp_sizer->Add(nozzle_temp_text, 0, wxALIGN_LEFT); nozzle_temp_sizer->Add(nozzle_temp_text, 0, wxALIGN_LEFT);
nozzle_temp_sizer->AddSpacer(FromDIP(4)); nozzle_temp_sizer->AddSpacer(FromDIP(4));
nozzle_temp_sizer->Add(m_nozzle_temp, 0, wxEXPAND); nozzle_temp_sizer->Add(m_nozzle_temp, 0, wxEXPAND);
auto bed_temp_sizer = new wxBoxSizer(wxVERTICAL); auto bed_temp_sizer = new wxBoxSizer(wxVERTICAL);
auto bed_temp_text = new wxStaticText(m_step_1_panel, wxID_ANY, _L("Bed temperature")); auto bed_temp_text = new wxStaticText(m_step_1_panel, wxID_ANY, _L("Bed temperature"));
m_bed_temp = new TextInput(m_step_1_panel, wxEmptyString, _L("\u2103"), "", wxDefaultPosition, { max_input_width, EXTRUSION_CALIBRATION_INPUT_SIZE.y }, wxTE_READONLY); m_bed_temp = new TextInput(m_step_1_panel, wxEmptyString, "\u2103" /* °C */, "", wxDefaultPosition, { max_input_width, EXTRUSION_CALIBRATION_INPUT_SIZE.y }, wxTE_READONLY);
bed_temp_sizer->Add(bed_temp_text, 0, wxALIGN_LEFT); bed_temp_sizer->Add(bed_temp_text, 0, wxALIGN_LEFT);
bed_temp_sizer->AddSpacer(FromDIP(4)); bed_temp_sizer->AddSpacer(FromDIP(4));
bed_temp_sizer->Add(m_bed_temp, 0, wxEXPAND); bed_temp_sizer->Add(m_bed_temp, 0, wxEXPAND);
auto max_flow_sizer = new wxBoxSizer(wxVERTICAL); auto max_flow_sizer = new wxBoxSizer(wxVERTICAL);
auto max_flow_text = new wxStaticText(m_step_1_panel, wxID_ANY, _L("Max volumetric speed")); auto max_flow_text = new wxStaticText(m_step_1_panel, wxID_ANY, _L("Max volumetric speed"));
m_max_flow_ratio = new TextInput(m_step_1_panel, wxEmptyString, _L("mm\u00B3"), "", wxDefaultPosition, { max_input_width, EXTRUSION_CALIBRATION_INPUT_SIZE.y }, wxTE_READONLY); m_max_flow_ratio = new TextInput(m_step_1_panel, wxEmptyString, "mm³", "", wxDefaultPosition, { max_input_width, EXTRUSION_CALIBRATION_INPUT_SIZE.y }, wxTE_READONLY);
max_flow_sizer->Add(max_flow_text, 0, wxALIGN_LEFT); max_flow_sizer->Add(max_flow_text, 0, wxALIGN_LEFT);
max_flow_sizer->AddSpacer(FromDIP(4)); max_flow_sizer->AddSpacer(FromDIP(4));
max_flow_sizer->Add(m_max_flow_ratio, 0, wxEXPAND); max_flow_sizer->Add(m_max_flow_ratio, 0, wxEXPAND);
+10
View File
@@ -430,6 +430,16 @@ void Field::get_value_by_opt_type(wxString& str, const bool check_value/* = true
str = str_out; str = str_out;
set_value(str, true); set_value(str, true);
} }
} else if (m_opt.opt_key == "sparse_infill_rotate_template" || m_opt.opt_key == "solid_infill_rotate_template") {
if (!ConfigOptionFloats::validate_string(str.utf8_string())) {
show_error(m_parent, format_wxstr(_L("This parameter expects a comma-delimited list of numbers. E.g, \"0,90\".")));
wxString old_value(boost::any_cast<std::string>(m_value));
this->set_value(old_value, true); // Revert to previous value
} else {
// Valid string, so update m_value with the new string from the control.
m_value = into_u8(str);
}
break;
} }
m_value = into_u8(str); m_value = into_u8(str);
+3 -3
View File
@@ -4606,13 +4606,13 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv
auto upto_label = [](double z) { auto upto_label = [](double z) {
char buf[64]; char buf[64];
::sprintf(buf, "%.2f", z); ::sprintf(buf, "%.2f", z);
return _u8L("up to") + " " + std::string(buf) + " " + _u8L("mm"); return _u8L("up to") + " " + std::string(buf) + " " + "mm";
}; };
auto above_label = [](double z) { auto above_label = [](double z) {
char buf[64]; char buf[64];
::sprintf(buf, "%.2f", z); ::sprintf(buf, "%.2f", z);
return _u8L("above") + " " + std::string(buf) + " " + _u8L("mm"); return _u8L("above") + " " + std::string(buf) + " " + "mm";
}; };
auto fromto_label = [](double z1, double z2) { auto fromto_label = [](double z1, double z2) {
@@ -4620,7 +4620,7 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv
::sprintf(buf1, "%.2f", z1); ::sprintf(buf1, "%.2f", z1);
char buf2[64]; char buf2[64];
::sprintf(buf2, "%.2f", z2); ::sprintf(buf2, "%.2f", z2);
return _u8L("from") + " " + std::string(buf1) + " " + _u8L("to") + " " + std::string(buf2) + " " + _u8L("mm"); return _u8L("from") + " " + std::string(buf1) + " " + _u8L("to") + " " + std::string(buf2) + " " + "mm";
}; };
auto role_time_and_percent = [time_mode](ExtrusionRole role) { auto role_time_and_percent = [time_mode](ExtrusionRole role) {
+17 -14
View File
@@ -4104,6 +4104,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
} }
bool any_gizmo_active = m_gizmos.get_current() != nullptr; bool any_gizmo_active = m_gizmos.get_current() != nullptr;
bool swapMouseButtons = wxGetApp().app_config->get_bool("swap_mouse_buttons");
if (m_mouse.drag.move_requires_threshold && m_mouse.is_move_start_threshold_position_2D_defined() && m_mouse.is_move_threshold_met(pos)) { if (m_mouse.drag.move_requires_threshold && m_mouse.is_move_start_threshold_position_2D_defined() && m_mouse.is_move_threshold_met(pos)) {
m_mouse.drag.move_requires_threshold = false; m_mouse.drag.move_requires_threshold = false;
@@ -4305,7 +4306,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
m_dirty = true; m_dirty = true;
} }
} }
else if (evt.Dragging() || is_camera_rotate(evt) || is_camera_pan(evt)) { else if (evt.Dragging() || is_camera_rotate(evt, swapMouseButtons) || is_camera_pan(evt, swapMouseButtons)) {
m_mouse.dragging = true; m_mouse.dragging = true;
if (m_layers_editing.state != LayersEditing::Unknown && layer_editing_object_idx != -1) { if (m_layers_editing.state != LayersEditing::Unknown && layer_editing_object_idx != -1) {
@@ -4315,10 +4316,10 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
} }
} }
// do not process the dragging if the left mouse was set down in another canvas // do not process the dragging if the left mouse was set down in another canvas
else if (is_camera_rotate(evt)) { else if (is_camera_rotate(evt, swapMouseButtons)) {
// Orca: Sphere rotation for painting view // Orca: Sphere rotation for painting view
// if dragging over blank area with left button, rotate // if dragging over blank area with left button or button functions swapped then rotate
if ((any_gizmo_active || m_hover_volume_idxs.empty()) && m_mouse.is_start_position_3D_defined()) { if ((any_gizmo_active || swapMouseButtons || m_hover_volume_idxs.empty()) && m_mouse.is_start_position_3D_defined()) {
Camera& camera = wxGetApp().plater()->get_camera(); Camera& camera = wxGetApp().plater()->get_camera();
auto mult_pref = wxGetApp().app_config->get("camera_orbit_mult"); auto mult_pref = wxGetApp().app_config->get("camera_orbit_mult");
const double mult = mult_pref.empty() ? 1.0 : std::stod(mult_pref); const double mult = mult_pref.empty() ? 1.0 : std::stod(mult_pref);
@@ -4381,15 +4382,17 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
} }
} }
} }
camera.auto_type(Camera::EType::Perspective);
camera.auto_type(Camera::EType::Perspective);
m_dirty = true; m_dirty = true;
m_mouse.ignore_right_up = true; // will be reset on button up event even if not right button is pressed
} }
m_camera_movement = true; m_camera_movement = true;
m_mouse.drag.start_position_3D = Vec3d((double)pos(0), (double)pos(1), 0.0); m_mouse.drag.start_position_3D = Vec3d((double)pos(0), (double)pos(1), 0.0);
} }
else if (is_camera_pan(evt)) { else if (is_camera_pan(evt, swapMouseButtons)) {
// If dragging over blank area with right button, pan. // if dragging with right button or if button functions swapped and dragging with left button over blank area then pan
if (m_mouse.is_start_position_2D_defined()) { if (m_mouse.is_start_position_2D_defined()) {
// get point in model space at Z = 0 // get point in model space at Z = 0
float z = 0.0f; float z = 0.0f;
@@ -4407,7 +4410,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
camera.set_target(camera.get_target() + orig - cur_pos); camera.set_target(camera.get_target() + orig - cur_pos);
m_dirty = true; m_dirty = true;
m_mouse.ignore_right_up = true; m_mouse.ignore_right_up = true; // will be reset on button up event even if not right button is pressed
} }
m_camera_movement = true; m_camera_movement = true;
@@ -4415,10 +4418,10 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
} }
} }
else if ((evt.LeftUp() || evt.MiddleUp() || evt.RightUp()) || else if ((evt.LeftUp() || evt.MiddleUp() || evt.RightUp()) ||
(m_camera_movement && !is_camera_rotate(evt) && !is_camera_pan(evt))) { (m_camera_movement && !is_camera_rotate(evt, swapMouseButtons) && !is_camera_pan(evt, swapMouseButtons))) {
m_mouse.position = pos.cast<double>(); m_mouse.position = pos.cast<double>();
if (evt.LeftUp()) { if (swapMouseButtons ? evt.RightUp() : evt.LeftUp()) {
m_rotation_center(0) = m_rotation_center(1) = m_rotation_center(2) = 0.f; m_rotation_center(0) = m_rotation_center(1) = m_rotation_center(2) = 0.f;
} }
@@ -4603,21 +4606,21 @@ void GLCanvas3D::on_set_focus(wxFocusEvent& evt)
m_is_touchpad_navigation = wxGetApp().app_config->get_bool("camera_navigation_style"); m_is_touchpad_navigation = wxGetApp().app_config->get_bool("camera_navigation_style");
} }
bool GLCanvas3D::is_camera_rotate(const wxMouseEvent& evt) const bool GLCanvas3D::is_camera_rotate(const wxMouseEvent& evt, const bool buttonsSwapped) const
{ {
if (m_is_touchpad_navigation) { if (m_is_touchpad_navigation) {
return evt.Moving() && evt.AltDown() && !evt.ShiftDown(); return evt.Moving() && evt.AltDown() && !evt.ShiftDown();
} else { } else {
return evt.Dragging() && evt.LeftIsDown(); return evt.Dragging() && (buttonsSwapped ? evt.RightIsDown() : evt.LeftIsDown());
} }
} }
bool GLCanvas3D::is_camera_pan(const wxMouseEvent& evt) const bool GLCanvas3D::is_camera_pan(const wxMouseEvent& evt, const bool buttonsSwapped) const
{ {
if (m_is_touchpad_navigation) { if (m_is_touchpad_navigation) {
return evt.Moving() && evt.ShiftDown() && !evt.AltDown(); return evt.Moving() && evt.ShiftDown() && !evt.AltDown();
} else { } else {
return evt.Dragging() && (evt.MiddleIsDown() || evt.RightIsDown()); return evt.Dragging() && (evt.MiddleIsDown() || (buttonsSwapped ? evt.LeftIsDown() : evt.RightIsDown()));
} }
} }
+2 -2
View File
@@ -968,8 +968,8 @@ public:
void on_set_focus(wxFocusEvent& evt); void on_set_focus(wxFocusEvent& evt);
void force_set_focus(); void force_set_focus();
bool is_camera_rotate(const wxMouseEvent& evt) const; bool is_camera_rotate(const wxMouseEvent& evt, const bool buttonsSwapped) const;
bool is_camera_pan(const wxMouseEvent& evt) const; bool is_camera_pan(const wxMouseEvent& evt, const bool buttonsSwapped) const;
Size get_canvas_size() const; Size get_canvas_size() const;
Vec2d get_local_mouse_position() const; Vec2d get_local_mouse_position() const;
+3 -3
View File
@@ -104,10 +104,10 @@ std::map<std::string, std::vector<SimpleSettingData>> SettingsFactory::PART_CAT
{ {
{ L("Quality"), {{"ironing_type", "",8},{"ironing_flow", "",9},{"ironing_spacing", "",10},{"ironing_inset", "", 11},{"bridge_flow", "",11},{"make_overhang_printable", "",11},{"bridge_density", "", 1} { L("Quality"), {{"ironing_type", "",8},{"ironing_flow", "",9},{"ironing_spacing", "",10},{"ironing_inset", "", 11},{"bridge_flow", "",11},{"make_overhang_printable", "",11},{"bridge_density", "", 1}
}}, }},
{ L("Strength"), {{"wall_loops", "",1},{"top_shell_layers", L("Top Solid Layers"),1},{"top_shell_thickness", L("Top Minimum Shell Thickness"),1}, { L("Strength"), {{"wall_loops", "",1},{"top_shell_layers", L("Top Solid Layers"),1},{"top_shell_thickness", L("Top Minimum Shell Thickness"),1},{"top_surface_density", L("Top Surface Density"),1},
{"bottom_shell_layers", L("Bottom Solid Layers"),1}, {"bottom_shell_thickness", L("Bottom Minimum Shell Thickness"),1}, {"bottom_shell_layers", L("Bottom Solid Layers"),1}, {"bottom_shell_thickness", L("Bottom Minimum Shell Thickness"),1},{"bottom_surface_density", L("Bottom Surface Density"),1},
{"sparse_infill_density", "",1},{"sparse_infill_pattern", "",1},{"lattice_angle_1", "",1},{"lattice_angle_2", "",1},{"infill_overhang_angle", "",1},{"infill_anchor", "",1},{"infill_anchor_max", "",1},{"top_surface_pattern", "",1},{"bottom_surface_pattern", "",1}, {"internal_solid_infill_pattern", "",1}, {"sparse_infill_density", "",1},{"sparse_infill_pattern", "",1},{"lattice_angle_1", "",1},{"lattice_angle_2", "",1},{"infill_overhang_angle", "",1},{"infill_anchor", "",1},{"infill_anchor_max", "",1},{"top_surface_pattern", "",1},{"bottom_surface_pattern", "",1}, {"internal_solid_infill_pattern", "",1},
{"infill_combination", "",1}, {"infill_combination_max_layer_height", "",1}, {"infill_wall_overlap", "",1},{"top_bottom_infill_wall_overlap", "",1}, {"solid_infill_direction", "",1}, {"rotate_solid_infill_direction", "",1}, {"infill_direction", "",1}, {"bridge_angle", "",1}, {"internal_bridge_angle", "",1}, {"minimum_sparse_infill_area", "",1} {"infill_combination", "",1}, {"infill_combination_max_layer_height", "",1}, {"infill_wall_overlap", "",1},{"top_bottom_infill_wall_overlap", "",1}, {"solid_infill_direction", "",1}, {"infill_direction", "",1}, {"bridge_angle", "",1}, {"internal_bridge_angle", "",1}, {"minimum_sparse_infill_area", "",1}
}}, }},
{ L("Speed"), {{"outer_wall_speed", "",1},{"inner_wall_speed", "",2},{"sparse_infill_speed", "",3},{"top_surface_speed", "",4}, {"internal_solid_infill_speed", "",5}, { L("Speed"), {{"outer_wall_speed", "",1},{"inner_wall_speed", "",2},{"sparse_infill_speed", "",3},{"top_surface_speed", "",4}, {"internal_solid_infill_speed", "",5},
{"enable_overhang_speed", "",6}, {"overhang_1_4_speed", "",7}, {"overhang_2_4_speed", "",8}, {"overhang_3_4_speed", "",9}, {"overhang_4_4_speed", "",10}, {"enable_overhang_speed", "",6}, {"overhang_1_4_speed", "",7}, {"overhang_2_4_speed", "",8}, {"overhang_3_4_speed", "",9}, {"overhang_4_4_speed", "",10},
+21 -11
View File
@@ -8,6 +8,8 @@
#include "GLCanvas3D.hpp" #include "GLCanvas3D.hpp"
#include "Plater.hpp" #include "Plater.hpp"
#include "Widgets/LabeledStaticBox.hpp"
#include <boost/algorithm/string.hpp> #include <boost/algorithm/string.hpp>
#include "I18N.hpp" #include "I18N.hpp"
@@ -29,7 +31,9 @@ ObjectLayers::ObjectLayers(wxWindow* parent) :
m_og->activate(); m_og->activate();
m_og->sizer->Clear(true); m_og->sizer->Clear(true);
m_og->sizer->Add(m_grid_sizer, 0, wxEXPAND | wxLEFT | wxRIGHT, wxOSX ? 0 : 5); m_og->sizer->Add(m_grid_sizer, 0, wxEXPAND | wxLEFT | wxRIGHT, 5);
if (auto stb = dynamic_cast<LabeledStaticBox*>(m_og->stb))
stb->SetCornerRadius(0);
m_bmp_delete = ScalableBitmap(parent, "delete"); m_bmp_delete = ScalableBitmap(parent, "delete");
m_bmp_add = ScalableBitmap(parent, "add"); m_bmp_add = ScalableBitmap(parent, "add");
@@ -74,7 +78,7 @@ wxSizer* ObjectLayers::create_layer(const t_layer_height_range& range, PlusMinus
}; };
// Add text // Add text
auto head_text = new wxStaticText(m_parent, wxID_ANY, _L("Height Range"), wxDefaultPosition, wxDefaultSize, wxST_ELLIPSIZE_END); auto head_text = new wxStaticText(m_og->ctrl_parent(), wxID_ANY, _L("Height Range"), wxDefaultPosition, wxDefaultSize, wxST_ELLIPSIZE_END);
head_text->SetBackgroundStyle(wxBG_STYLE_PAINT); head_text->SetBackgroundStyle(wxBG_STYLE_PAINT);
head_text->SetFont(wxGetApp().normal_font()); head_text->SetFont(wxGetApp().normal_font());
m_grid_sizer->Add(head_text, 0, wxALIGN_CENTER_VERTICAL); m_grid_sizer->Add(head_text, 0, wxALIGN_CENTER_VERTICAL);
@@ -105,7 +109,7 @@ wxSizer* ObjectLayers::create_layer(const t_layer_height_range& range, PlusMinus
m_grid_sizer->Add(editor, 1, wxEXPAND); m_grid_sizer->Add(editor, 1, wxEXPAND);
auto middle_text = new wxStaticText(m_parent, wxID_ANY, _L("to"), wxDefaultPosition, wxDefaultSize, wxST_ELLIPSIZE_END); auto middle_text = new wxStaticText(m_og->ctrl_parent(), wxID_ANY, _L("to"), wxDefaultPosition, wxDefaultSize, wxST_ELLIPSIZE_END);
middle_text->SetBackgroundStyle(wxBG_STYLE_PAINT); middle_text->SetBackgroundStyle(wxBG_STYLE_PAINT);
middle_text->SetFont(wxGetApp().normal_font()); middle_text->SetFont(wxGetApp().normal_font());
m_grid_sizer->Add(middle_text, 0, wxALIGN_CENTER_VERTICAL); m_grid_sizer->Add(middle_text, 0, wxALIGN_CENTER_VERTICAL);
@@ -135,12 +139,12 @@ wxSizer* ObjectLayers::create_layer(const t_layer_height_range& range, PlusMinus
m_grid_sizer->Add(editor, 1, wxEXPAND); m_grid_sizer->Add(editor, 1, wxEXPAND);
auto sizer2 = new wxBoxSizer(wxHORIZONTAL); auto sizer2 = new wxBoxSizer(wxHORIZONTAL);
auto unit_text = new wxStaticText(m_parent, wxID_ANY, _L("mm"), wxDefaultPosition, wxDefaultSize, wxST_ELLIPSIZE_END); auto unit_text = new wxStaticText(m_og->ctrl_parent(), wxID_ANY, "mm", wxDefaultPosition, wxDefaultSize, wxST_ELLIPSIZE_END);
unit_text->SetBackgroundStyle(wxBG_STYLE_PAINT); unit_text->SetBackgroundStyle(wxBG_STYLE_PAINT);
unit_text->SetFont(wxGetApp().normal_font()); unit_text->SetFont(wxGetApp().normal_font());
sizer2->Add(unit_text, 0, wxALIGN_CENTER_VERTICAL); sizer2->Add(unit_text, 0, wxALIGN_CENTER_VERTICAL);
m_grid_sizer->Add(sizer2); m_grid_sizer->Add(sizer2, 0, wxALIGN_CENTER_VERTICAL);
// BBS // BBS
// Add control for the "Layer height" // Add control for the "Layer height"
@@ -156,7 +160,7 @@ wxSizer* ObjectLayers::create_layer(const t_layer_height_range& range, PlusMinus
//auto sizer = new wxBoxSizer(wxHORIZONTAL); //auto sizer = new wxBoxSizer(wxHORIZONTAL);
//sizer->Add(editor); //sizer->Add(editor);
//auto temp = new wxStaticText(m_parent, wxID_ANY, _L("mm")); //auto temp = new wxStaticText(m_parent, wxID_ANY, "mm");
//temp->SetBackgroundStyle(wxBG_STYLE_PAINT); //temp->SetBackgroundStyle(wxBG_STYLE_PAINT);
//temp->SetFont(wxGetApp().normal_font()); //temp->SetFont(wxGetApp().normal_font());
//sizer->Add(temp, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, wxGetApp().em_unit()); //sizer->Add(temp, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, wxGetApp().em_unit());
@@ -170,12 +174,12 @@ void ObjectLayers::create_layers_list()
{ {
for (const auto &layer : m_object->layer_config_ranges) { for (const auto &layer : m_object->layer_config_ranges) {
const t_layer_height_range& range = layer.first; const t_layer_height_range& range = layer.first;
auto del_btn = new PlusMinusButton(m_parent, m_bmp_delete, range); auto del_btn = new PlusMinusButton(m_og->ctrl_parent(), m_bmp_delete, range);
del_btn->DisableFocusFromKeyboard(); del_btn->DisableFocusFromKeyboard();
del_btn->SetBackgroundColour(m_parent->GetBackgroundColour()); del_btn->SetBackgroundColour(m_parent->GetBackgroundColour());
del_btn->SetToolTip(_L("Remove height range")); del_btn->SetToolTip(_L("Remove height range"));
auto add_btn = new PlusMinusButton(m_parent, m_bmp_add, range); auto add_btn = new PlusMinusButton(m_og->ctrl_parent(), m_bmp_add, range);
add_btn->DisableFocusFromKeyboard(); add_btn->DisableFocusFromKeyboard();
add_btn->SetBackgroundColour(m_parent->GetBackgroundColour()); add_btn->SetBackgroundColour(m_parent->GetBackgroundColour());
wxString tooltip = wxGetApp().obj_list()->can_add_new_range_after_current(range); wxString tooltip = wxGetApp().obj_list()->can_add_new_range_after_current(range);
@@ -183,8 +187,10 @@ void ObjectLayers::create_layers_list()
add_btn->Enable(tooltip.IsEmpty()); add_btn->Enable(tooltip.IsEmpty());
auto sizer = create_layer(range, del_btn, add_btn); auto sizer = create_layer(range, del_btn, add_btn);
sizer->Add(del_btn, 0, wxRIGHT | wxLEFT, em_unit(m_parent)); auto b_sizer = new wxBoxSizer(wxHORIZONTAL);
sizer->Add(add_btn); b_sizer->Add(del_btn, 0, wxRIGHT | wxLEFT, em_unit(m_parent));
b_sizer->Add(add_btn);
sizer->Add(b_sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxTOP, m_parent->FromDIP(1)); // aligns +/- buttons vertically since we got 1px gap on bottom of icons
del_btn->Bind(wxEVT_BUTTON, [del_btn](wxEvent &) { del_btn->Bind(wxEVT_BUTTON, [del_btn](wxEvent &) {
wxGetApp().obj_list()->del_layer_range(del_btn->range); wxGetApp().obj_list()->del_layer_range(del_btn->range);
@@ -218,6 +224,8 @@ void ObjectLayers::update_layers_list()
// only call sizer->Clear(true) via CallAfter, otherwise crash happens in Linux when press enter in Height Range // only call sizer->Clear(true) via CallAfter, otherwise crash happens in Linux when press enter in Height Range
// because an element cannot be destroyed while there are pending events for this element.(https://github.com/wxWidgets/Phoenix/issues/1854) // because an element cannot be destroyed while there are pending events for this element.(https://github.com/wxWidgets/Phoenix/issues/1854)
wxGetApp().CallAfter([this, type, objects_ctrl, range]() { wxGetApp().CallAfter([this, type, objects_ctrl, range]() {
m_og->ctrl_parent()->Freeze();
// Delete all controls from options group // Delete all controls from options group
m_grid_sizer->Clear(true); m_grid_sizer->Clear(true);
@@ -228,6 +236,8 @@ void ObjectLayers::update_layers_list()
else else
create_layer(range, nullptr, nullptr); create_layer(range, nullptr, nullptr);
m_og->ctrl_parent()->Thaw();
m_parent->Layout(); m_parent->Layout();
}); });
} }
@@ -340,7 +350,7 @@ LayerRangeEditor::LayerRangeEditor( ObjectLayers* parent,
m_valid_value(value), m_valid_value(value),
m_type(type), m_type(type),
m_set_focus_data(set_focus_data_fn), m_set_focus_data(set_focus_data_fn),
wxTextCtrl(parent->m_parent, wxID_ANY, value, wxDefaultPosition, wxTextCtrl(parent->m_og->ctrl_parent(), wxID_ANY, value, wxDefaultPosition,
wxSize(em_unit(parent->m_parent), wxDefaultCoord), wxTE_PROCESS_ENTER wxSize(em_unit(parent->m_parent), wxDefaultCoord), wxTE_PROCESS_ENTER
#ifdef _WIN32 #ifdef _WIN32
| wxBORDER_SIMPLE | wxBORDER_SIMPLE
+35
View File
@@ -22,6 +22,7 @@
#include "MsgDialog.hpp" #include "MsgDialog.hpp"
#include "Widgets/ProgressDialog.hpp" #include "Widgets/ProgressDialog.hpp"
#include "SingleChoiceDialog.hpp" #include "SingleChoiceDialog.hpp"
#include "StepMeshDialog.hpp"
#include <boost/algorithm/string.hpp> #include <boost/algorithm/string.hpp>
#include <wx/progdlg.h> #include <wx/progdlg.h>
@@ -2032,14 +2033,48 @@ void ObjectList::load_modifier(const wxArrayString& input_files, ModelObject& mo
_L("Loading file") + ": " + from_path(boost::filesystem::path(input_file).filename())); _L("Loading file") + ": " + from_path(boost::filesystem::path(input_file).filename()));
dlg.Fit(); dlg.Fit();
bool is_user_cancel = false;
Model model; Model model;
try { try {
if (boost::iends_with(input_file, ".stp") ||
boost::iends_with(input_file, ".step")) {
double linear = string_to_double_decimal_point(wxGetApp().app_config->get("linear_defletion"));
if (linear <= 0) linear = 0.003;
double angle = string_to_double_decimal_point(wxGetApp().app_config->get("angle_defletion"));
if (angle <= 0) angle = 0.5;
bool split_compound = wxGetApp().app_config->get_bool("is_split_compound");
model = Model::read_from_step(
input_file, LoadStrategy::LoadModel, nullptr, nullptr,
[this, &is_user_cancel, &linear, &angle, &split_compound](Slic3r::Step& file, double& linear_value,
double& angle_value, bool& is_split) -> int {
if (wxGetApp().app_config->get_bool("enable_step_mesh_setting")) {
StepMeshDialog mesh_dlg(nullptr, file, linear, angle);
if (mesh_dlg.ShowModal() == wxID_OK) {
linear_value = mesh_dlg.get_linear_defletion();
angle_value = mesh_dlg.get_angle_defletion();
is_split = mesh_dlg.get_split_compound_value();
return 1;
}
} else {
linear_value = linear;
angle_value = angle;
is_split = split_compound;
return 1;
}
is_user_cancel = true;
return -1;
},
linear, angle, split_compound);
} else {
model = Model::read_from_file(input_file, nullptr, nullptr, LoadStrategy::LoadModel); model = Model::read_from_file(input_file, nullptr, nullptr, LoadStrategy::LoadModel);
} }
}
catch (std::exception&) { catch (std::exception&) {
if (!is_user_cancel) {
// auto msg = _L("Error!") + " " + input_file + " : " + e.what() + "."; // auto msg = _L("Error!") + " " + input_file + " : " + e.what() + ".";
auto msg = _L("Error!") + " " + _L("Failed to get the model data in the current file."); auto msg = _L("Error!") + " " + _L("Failed to get the model data in the current file.");
show_error(parent, msg); show_error(parent, msg);
}
return; return;
} }

Some files were not shown because too many files have changed in this diff Show More