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
commit 9988d0a1f8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
110 changed files with 4133 additions and 1751 deletions

View file

@ -686,11 +686,9 @@ endif ()
find_path(SPNAV_INCLUDE_DIR spnav.h)
if (SPNAV_INCLUDE_DIR)
find_library(HAVE_SPNAV spnav)
if (HAVE_SPNAV)
find_library(SPNAV_LIB NAMES libspnav.a) # Force linking libspnav statically
if (SPNAV_LIB)
add_definitions(-DHAVE_SPNAV)
add_library(libspnav SHARED IMPORTED)
target_link_libraries(libspnav INTERFACE spnav)
message(STATUS "SPNAV library found")
else()
message(STATUS "SPNAV library NOT found, Spacenavd not supported")

View file

@ -6342,6 +6342,12 @@ msgstr ""
msgid "If enabled, use free camera. If not enabled, use constrained camera."
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"
msgstr ""
@ -11517,7 +11523,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n"
"\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec "
"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 "
"allowed, resulting in faster speed transitions.\n"
"\n"
@ -11527,13 +11533,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these "
"cases a high value of around 300-350mm3/s2 is recommended as this allows for "
"just enough smoothing to assist pressure advance achieve a smoother flow "
"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 "
"transition.\n"
"\n"
"For slower printers without pressure advance, the value should be set much "
"lower. A value of 10-15mm3/s2 is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n"
"lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10 mm³/s² for Bowden style.\n"
"\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n"
@ -12952,7 +12958,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\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 "
"tool changing is well controlled.\n"
"\n"

View file

@ -6872,6 +6872,12 @@ msgstr ""
"Si està activat, fa servir la càmera lliure. Si no està activat, fa servir "
"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"
msgstr "Zoom invers del ratolí"
@ -13264,7 +13270,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n"
"\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec "
"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 "
"allowed, resulting in faster speed transitions.\n"
"\n"
@ -13274,13 +13280,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these "
"cases a high value of around 300-350mm3/s2 is recommended as this allows for "
"just enough smoothing to assist pressure advance achieve a smoother flow "
"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 "
"transition.\n"
"\n"
"For slower printers without pressure advance, the value should be set much "
"lower. A value of 10-15mm3/s2 is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n"
"lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10 mm³/s² for Bowden style.\n"
"\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n"
@ -13303,13 +13309,13 @@ msgstr ""
"això, pot proporcionar algun benefici marginal en certs casos en què les "
"velocitats de les característiques varien molt. Per exemple, quan hi ha "
"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 "
"transició de flux més suau.\n"
"\n"
"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 "
"per als extrusors d'extrusió directa i 5-10mm3/s2 per al tipus Bowden.\n"
"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-10 mm³/s² per al tipus Bowden.\n"
"\n"
"Aquesta característica es coneix com a Equalitzador de Pressió a Prusa "
"slicer.\n"
@ -15126,6 +15132,7 @@ msgstr ""
msgid "Maximum wipe tower print speed"
msgstr "Velocitat màxima d'impressió de la torre de purga"
#, fuzzy
msgid ""
"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 "
@ -15140,7 +15147,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\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 "
"tool changing is well controlled.\n"
"\n"

View file

@ -6698,17 +6698,23 @@ msgstr ""
"Pokud je povoleno, použijte volnou kameru. Pokud není povoleno, použijte "
"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"
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."
msgstr ""
msgstr "Pokud je povoleno, obrací směr přiblížení kolečkem myši."
msgid "Show splash screen"
msgstr "Zobrazovat úvodní obrazovku"
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"
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 "
"versa.\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 "
"allowed, resulting in faster speed transitions.\n"
"\n"
@ -12385,13 +12391,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these "
"cases a high value of around 300-350mm3/s2 is recommended as this allows for "
"just enough smoothing to assist pressure advance achieve a smoother flow "
"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 "
"transition.\n"
"\n"
"For slower printers without pressure advance, the value should be set much "
"lower. A value of 10-15mm3/s2 is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n"
"lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10 mm³/s² for Bowden style.\n"
"\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n"
@ -12411,13 +12417,13 @@ msgstr ""
"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ří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 "
"tlaku při extruzi.\n"
"\n"
"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 "
"bodem, a pro styl Bowden 5-10 mm3/s2.\n"
"mnohem nižší. Pro přímé pohony je hodnota 10-15 mm³/s² dobrým výchozím "
"bodem, a pro styl Bowden 5-10 mm³/s².\n"
"\n"
"Tato funkce je známa jako Pressure Equalizer v programu Prusa Slicer.\n"
"\n"
@ -14031,7 +14037,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\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 "
"tool changing is well controlled.\n"
"\n"

View file

@ -6939,6 +6939,12 @@ msgstr "Freie Kamera verwenden"
msgid "If enabled, use free camera. If not enabled, use constrained camera."
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"
msgstr "Maus-Zoom umkehren"
@ -13372,7 +13378,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n"
"\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec "
"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 "
"allowed, resulting in faster speed transitions.\n"
"\n"
@ -13382,13 +13388,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these "
"cases a high value of around 300-350mm3/s2 is recommended as this allows for "
"just enough smoothing to assist pressure advance achieve a smoother flow "
"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 "
"transition.\n"
"\n"
"For slower printers without pressure advance, the value should be set much "
"lower. A value of 10-15mm3/s2 is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n"
"lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10 mm³/s² for Bowden style.\n"
"\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n"
@ -13411,7 +13417,7 @@ msgstr ""
"erforderlich. Er kann jedoch in bestimmten Fällen einen geringfügigen "
"Vorteil bieten, in denen sich die Funktionen stark unterscheiden. Zum "
"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²"
msgstr ""
@ -15244,7 +15250,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\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 "
"tool changing is well controlled.\n"
"\n"
@ -19600,7 +19606,7 @@ msgstr ""
#~ "is lower, the lowest speed will be used instead.\n"
#~ "Increasing this speed may affect the tower's stability, as purging can be "
#~ "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."
#~ msgstr ""
#~ "Die maximale Druckgeschwindigkeit beim Reinigen im Reinigungsturm. Wenn "

View file

@ -6454,6 +6454,12 @@ msgstr ""
msgid "If enabled, use free camera. If not enabled, use constrained camera."
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"
msgstr ""
@ -11851,7 +11857,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n"
"\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec "
"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 "
"allowed, resulting in faster speed transitions.\n"
"\n"
@ -11861,13 +11867,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these "
"cases a high value of around 300-350mm3/s2 is recommended as this allows "
"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 "
"transition.\n"
"\n"
"For slower printers without pressure advance, the value should be set much "
"lower. A value of 10-15mm3/s2 is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n"
"lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10 mm³/s² for Bowden style.\n"
"\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n"
@ -13356,7 +13362,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\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 "
"tool changing is well controlled.\n"
"\n"

View file

@ -6893,6 +6893,12 @@ msgstr ""
"Si está activada, utiliza la cámara libre. Si no está activada, utiliza la "
"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"
msgstr "Invertir el zoom del ratón"
@ -13141,7 +13147,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n"
"\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec "
"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 "
"allowed, resulting in faster speed transitions.\n"
"\n"
@ -13151,13 +13157,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these "
"cases a high value of around 300-350mm3/s2 is recommended as this allows for "
"just enough smoothing to assist pressure advance achieve a smoother flow "
"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 "
"transition.\n"
"\n"
"For slower printers without pressure advance, the value should be set much "
"lower. A value of 10-15mm3/s2 is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n"
"lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10 mm³/s² for Bowden style.\n"
"\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n"
@ -13168,7 +13174,7 @@ msgstr ""
"(alta velocidad/ancho mayor) a una extrusión de menor flujo (menor velocidad/"
"ancho menor) y viceversa.\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 "
"cambios de velocidad de extrusión más altos, lo que resulta en transiciones "
"de velocidad más rápidas.\n"
@ -13180,13 +13186,13 @@ msgstr ""
"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 "
"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 "
"transición de flujo más suave.\n"
"\n"
"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 "
"extrusoras de accionamiento directo y de 5-10mm3/s2 para las de estilo "
"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-10 mm³/s² para las de estilo "
"Bowden.\n"
"\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 "
"on the wipe tower.\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 "
"tool changing is well controlled.\n"
"\n"
@ -15016,7 +15022,7 @@ msgstr ""
"aumentar la fuerza con la que la boquilla colisiona con las acummulaciones "
"que se hayan podido formar en la torre de purga.\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 "
"velocidades aumentadas y que el rezume al cambiar de cabezal está bien "
"controlado.\n"

View file

@ -6935,6 +6935,12 @@ msgstr ""
"Si activée, utilise la caméra libre. Si désactivée, utilise la caméra "
"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"
msgstr "Inverser le zoom de la souris"
@ -13441,7 +13447,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n"
"\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec "
"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 "
"allowed, resulting in faster speed transitions.\n"
"\n"
@ -13451,13 +13457,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these "
"cases a high value of around 300-350mm3/s2 is recommended as this allows for "
"just enough smoothing to assist pressure advance achieve a smoother flow "
"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 "
"transition.\n"
"\n"
"For slower printers without pressure advance, the value should be set much "
"lower. A value of 10-15mm3/s2 is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n"
"lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10 mm³/s² for Bowden style.\n"
"\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n"
@ -13468,7 +13474,7 @@ msgstr ""
"é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"
"\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 "
"changements du taux dextrusion plus élevés sont autorisés, ce qui entraîne "
"des transitions de vitesse plus rapides.\n"
@ -13480,13 +13486,13 @@ msgstr ""
"Cependant, cela peut apporter un avantage marginal dans certains cas où les "
"vitesses varient considérablement. Par exemple, en cas de ralentissements "
"agressifs dus à des surplombs. Dans ces cas, une valeur élevée denviron "
"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 laugmentation de la pression pour obtenir une transition de "
"débit plus douce.\n"
"\n"
"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 "
"bon point de départ en direct drive et de 5-10 mm3/s2 en Bowden.\n"
"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 mm³/s² en Bowden.\n"
"\n"
"Cette fonctionnalité est connue sous le nom de Pressure Equalizer dans Prusa "
"Slicer.\n"
@ -15323,6 +15329,7 @@ msgstr ""
msgid "Maximum wipe tower print speed"
msgstr "Vitesse maximale dimpression de la tour dessuyage"
#, fuzzy
msgid ""
"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 "
@ -15337,7 +15344,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\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 "
"tool changing is well controlled.\n"
"\n"
@ -15358,7 +15365,7 @@ msgstr ""
"augmenter la force avec laquelle la buse entre en collision avec les blobs "
"qui peuvent sêtre formés sur la tour dessuyage.\n"
"\n"
"Avant daugmenter ce paramètre au-delà de la valeur par défaut de 90 mm/sec, "
"Avant daugmenter 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 "
"vitesses élevées et que le suintement lors du changement doutil est bien "
"contrôlé.\n"
@ -19841,7 +19848,7 @@ msgstr ""
#~ "is lower, the lowest speed will be used instead.\n"
#~ "Increasing this speed may affect the tower's stability, as purging can be "
#~ "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."
#~ msgstr ""
#~ "Vitesse dimpression maximale lors de la purge dans la tour dessuyage. "
@ -19850,7 +19857,7 @@ msgstr ""
#~ "vitesse la plus basse qui sera utilisée.\n"
#~ "Laugmentation de cette vitesse peut affecter la stabilité de la tour, "
#~ "car la purge peut être effectuée sur des couches peu épaisses. Avant "
#~ "daugmenter ce paramètre au-delà de la valeur par défaut de 90 mm/sec, "
#~ "daugmenter 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 "
#~ "vitesses accrues."

View file

@ -6614,6 +6614,12 @@ msgstr ""
"Ha engedélyezve van, szabad kamerát használ. Ha nincs engedélyezve, akkor "
"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"
msgstr ""
@ -12170,7 +12176,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n"
"\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec "
"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 "
"allowed, resulting in faster speed transitions.\n"
"\n"
@ -12180,13 +12186,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these "
"cases a high value of around 300-350mm3/s2 is recommended as this allows for "
"just enough smoothing to assist pressure advance achieve a smoother flow "
"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 "
"transition.\n"
"\n"
"For slower printers without pressure advance, the value should be set much "
"lower. A value of 10-15mm3/s2 is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n"
"lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10 mm³/s² for Bowden style.\n"
"\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n"
@ -13760,7 +13766,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\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 "
"tool changing is well controlled.\n"
"\n"

View file

@ -6894,13 +6894,17 @@ msgid "If enabled, use free camera. If not enabled, use constrained camera."
msgstr ""
"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"
msgstr "Inverti zoom del mouse"
msgid "If enabled, reverses the direction of zoom with mouse wheel."
msgstr ""
"Se abilitato, inverte la direzione dell'ingrandimento con la rotellina del "
"mouse."
msgstr "Se abilitato, inverte la direzione dell'ingrandimento con la rotellina del mouse."
msgid "Show splash screen"
msgstr "Mostra schermata iniziale"
@ -13355,7 +13359,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n"
"\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec "
"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 "
"allowed, resulting in faster speed transitions.\n"
"\n"
@ -13365,13 +13369,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these "
"cases a high value of around 300-350mm3/s2 is recommended as this allows for "
"just enough smoothing to assist pressure advance achieve a smoother flow "
"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 "
"transition.\n"
"\n"
"For slower printers without pressure advance, the value should be set much "
"lower. A value of 10-15mm3/s2 is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n"
"lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10 mm³/s² for Bowden style.\n"
"\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n"
@ -13383,8 +13387,8 @@ msgstr ""
"un'estrusione a basso flusso (bassa velocità/larghezza inferiore) e "
"viceversa.\n"
"\n"
"Definisce la velocità massima con cui la portata volumetrica estrusa in mm3/"
"sec può variare nel tempo. Valori più alti significano che sono consentite "
"Definisce la velocità massima con cui la portata volumetrica estrusa in mm³/"
"s² può variare nel tempo. Valori più alti significano che sono consentite "
"variazioni più elevate della velocità di estrusione, con conseguenti "
"transizioni di velocità più rapide.\n"
"\n"
@ -13395,14 +13399,14 @@ msgstr ""
"può fornire alcuni vantaggi marginali in alcuni casi in cui le velocità di "
"stampa di alcuni elementi variano notevolmente, ad esempio quando ci sono "
"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 "
"transizione di flusso più graduale.\n"
"\n"
"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 "
"mm3/s2 per quelli Bowden.\n"
"mm³/s² per quelli Bowden.\n"
"\n"
"Questa funzione è nota come Equalizzatore di Pressione in Prusa slicer.\n"
"\n"
@ -15256,7 +15260,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\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 "
"tool changing is well controlled.\n"
"\n"
@ -15276,9 +15280,9 @@ msgstr ""
"aumentare la forza con cui l'ugello entra in collisione con eventuali grumi "
"che si sono formati sulla torre di spurgo.\n"
"\n"
"Prima di aumentare questo parametro oltre il valore predefinito di 90 mm/"
"sec, accertati che la stampante sia in grado di gestire in modo affidabile "
"le maggiori velocità, e che il trasudo del materiale durante il cambio di "
"Prima di aumentare questo parametro oltre il valore predefinito di 90 mm/s, "
"accertati che la stampante sia in grado di gestire in modo affidabile le "
"maggiori velocità, e che il trasudo del materiale durante il cambio di "
"testina sia ben controllato.\n"
"\n"
"Per i perimetri esterni della torre di spurgo viene utilizzata la velocità "

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"
msgstr ""
msgstr "マウスの逆ズーム"
msgid "If enabled, reverses the direction of zoom with mouse wheel."
msgstr ""
msgstr "有効にすると、マウス ホイールによるズームの方向が反転します。"
msgid "Show splash screen"
msgstr "スプラッシュ画面を表示する"
@ -11895,7 +11901,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n"
"\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec "
"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 "
"allowed, resulting in faster speed transitions.\n"
"\n"
@ -11905,13 +11911,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these "
"cases a high value of around 300-350mm3/s2 is recommended as this allows for "
"just enough smoothing to assist pressure advance achieve a smoother flow "
"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 "
"transition.\n"
"\n"
"For slower printers without pressure advance, the value should be set much "
"lower. A value of 10-15mm3/s2 is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n"
"lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10 mm³/s² for Bowden style.\n"
"\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n"
@ -13427,7 +13433,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\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 "
"tool changing is well controlled.\n"
"\n"

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"
msgstr "역방향 마우스 줌"
@ -12686,7 +12692,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n"
"\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec "
"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 "
"allowed, resulting in faster speed transitions.\n"
"\n"
@ -12696,12 +12702,12 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some marginal "
"benefit in certain cases where feature speeds vary greatly. For example, when "
"there are aggressive slowdowns due to overhangs. In these cases a high value "
"of around 300-350mm3/s2 is recommended as this allows for just enough "
"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"
"\n"
"For slower printers without pressure advance, the value should be set much "
"lower. A value of 10-15mm3/s2 is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n"
"lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10 mm³/s² for Bowden style.\n"
"\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n"
@ -12720,13 +12726,13 @@ msgstr ""
"고속, 고압출량 직접 구동 프린터(예: 뱀부랩 또는 보론)의 경우 일반적으로 이 값"
"이 필요하지 않습니다. 그러나 기능 속도가 크게 달라지는 특정 경우에는 약간의 이"
"점을 제공할 수 있습니다. 예를 들어 오버행로 인해 급격하게 감속이 발생하는 경우"
"입니다. 이러한 경우 약 300-350mm3/s2의 높은 값이 권장됩니다. 이렇게 하면 프레"
"입니다. 이러한 경우 약 300-350 mm³/s²의 높은 값이 권장됩니다. 이렇게 하면 프레"
"셔 어드밴스가 더 부드러운 압출량 전환을 달성하는 데 도움이 될 만큼 충분히 매끄"
"러워질 수 있기 때문입니다.\n"
"\n"
"프레셔 어드밴스 기능이 없는 느린 프린터의 경우 값을 훨씬 낮게 설정해야 합니"
"다. 10-15mm3/s2 값은 직접 구동 압출기의 좋은 시작점이고 보우덴 스타일의 경우 "
"5-10mm3/s2입니다.\n"
"다. 10-15 mm³/s² 값은 직접 구동 압출기의 좋은 시작점이고 보우덴 스타일의 경우 "
"5-10 mm³/s²입니다.\n"
"\n"
"이 기능은 Prusa 슬라이서에서는 프레셔 이퀄라이저(Pressure Equalizer)로 알려져 "
"있습니다.\n"
@ -14419,7 +14425,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\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 "
"tool changing is well controlled.\n"
"\n"

View file

@ -6835,6 +6835,12 @@ msgstr ""
"Jei įjungta, naudoti laisvą kamerą. Jei neįjungta, naudoti stacionarią "
"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"
msgstr "Apversti pelės didinimą"
@ -13160,7 +13166,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n"
"\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec "
"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 "
"allowed, resulting in faster speed transitions.\n"
"\n"
@ -13170,13 +13176,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these "
"cases a high value of around 300-350mm3/s2 is recommended as this allows for "
"just enough smoothing to assist pressure advance achieve a smoother flow "
"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 "
"transition.\n"
"\n"
"For slower printers without pressure advance, the value should be set much "
"lower. A value of 10-15mm3/s2 is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n"
"lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10 mm³/s² for Bowden style.\n"
"\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n"
@ -13197,13 +13203,13 @@ msgstr ""
"\"Bambu lab\" arba \"Voron\") ši vertė paprastai nereikalinga. Tačiau tam "
"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 "
"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 "
"sklandesnis srauto perėjimas.\n"
"\n"
"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ė "
"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"
"Ši funkcija \"Prusa\" programoje \"Prusa slicer\" vadinama slėgio išlyginimo "
"funkcija.\n"
@ -14997,7 +15003,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\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 "
"tool changing is well controlled.\n"
"\n"

View file

@ -6707,6 +6707,12 @@ msgstr ""
"Als dit is ingeschakeld wordt de vrij beweegbare camera gebruikt, anders een "
"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"
msgstr "Omgekeerde muiszoom"
@ -12362,7 +12368,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n"
"\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec "
"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 "
"allowed, resulting in faster speed transitions.\n"
"\n"
@ -12372,13 +12378,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these "
"cases a high value of around 300-350mm3/s2 is recommended as this allows for "
"just enough smoothing to assist pressure advance achieve a smoother flow "
"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 "
"transition.\n"
"\n"
"For slower printers without pressure advance, the value should be set much "
"lower. A value of 10-15mm3/s2 is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n"
"lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10 mm³/s² for Bowden style.\n"
"\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n"
@ -13974,7 +13980,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\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 "
"tool changing is well controlled.\n"
"\n"

View file

@ -6848,6 +6848,12 @@ msgstr "Używanie wolnego widoku kamery"
msgid "If enabled, use free camera. If not enabled, use constrained camera."
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"
msgstr "Odwrócone przybliżanie myszką"
@ -13193,7 +13199,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n"
"\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec "
"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 "
"allowed, resulting in faster speed transitions.\n"
"\n"
@ -13203,13 +13209,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these "
"cases a high value of around 300-350mm3/s2 is recommended as this allows for "
"just enough smoothing to assist pressure advance achieve a smoother flow "
"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 "
"transition.\n"
"\n"
"For slower printers without pressure advance, the value should be set much "
"lower. A value of 10-15mm3/s2 is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n"
"lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10 mm³/s² for Bowden style.\n"
"\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n"
@ -13232,13 +13238,13 @@ msgstr ""
"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 "
"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 "
"płynniejszego przejścia przepływu.\n"
"\n"
"W przypadku wolniejszych drukarek bez przyspieszenia ciśnienia wartość ta "
"powinna być znacznie niższa. Wartość 10-15 mm3/s2 jest dobrym punktem "
"wyjścia dla extruderów z napędem bezpośrednim i 5-10 mm3/s2 dla extruderów "
"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 mm³/s² dla extruderów "
"typu Bowden.\n"
"\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 "
"on the wipe tower.\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 "
"tool changing is well controlled.\n"
"\n"
@ -19260,7 +19266,7 @@ msgstr ""
#~ "is lower, the lowest speed will be used instead.\n"
#~ "Increasing this speed may affect the tower's stability, as purging can be "
#~ "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."
#~ msgstr ""
#~ "Maksymalna prędkość drukowania podczas oczyszczania w wieży czyszczącej. "

View file

@ -6854,6 +6854,12 @@ msgstr "Usar câmera livre"
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."
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"
msgstr "Inverter zoom do mouse"
@ -13226,7 +13232,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n"
"\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec "
"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 "
"allowed, resulting in faster speed transitions.\n"
"\n"
@ -13236,13 +13242,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these "
"cases a high value of around 300-350mm3/s2 is recommended as this allows for "
"just enough smoothing to assist pressure advance achieve a smoother flow "
"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 "
"transition.\n"
"\n"
"For slower printers without pressure advance, the value should be set much "
"lower. A value of 10-15mm3/s2 is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n"
"lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10 mm³/s² for Bowden style.\n"
"\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n"
@ -13253,7 +13259,7 @@ msgstr ""
"velocidade/maior largura) para uma extrusão de baixo fluxo (baixa velocidade/"
"menor largura) e vice-versa.\n"
"\n"
"Define a taxa máxima pela qual o fluxo volumétrico extrudado em mm3/seg pode "
"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 "
"de extrusão mais altas são permitidas, resultando em transições de "
"velocidade mais rápidas.\n"
@ -13265,20 +13271,20 @@ msgstr ""
"entanto, pode fornecer alguns benefícios marginais em certos casos em que as "
"velocidades das características variam muito. Por exemplo, quando há "
"desacelerações agressivas devido a 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 "
"mais suave.\n"
"\n"
"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 "
"para extrusoras de acionamento direto e 5-10mm3/s2 para estilo Bowden.\n"
"definido muito mais baixo. Um valor de 10-15 mm³/s² é um bom ponto de partida "
"para extrusoras de acionamento direto e 5-10 mm³/s² para estilo Bowden.\n"
"\n"
"Este recurso é conhecido como Equalizador de Pressão no slicer Prusa.\n"
"\n"
"Nota: este parâmetro desativa o ajuste de arco."
msgid "mm³/s²"
msgstr "mm3/s2"
msgstr ""
msgid "Smoothing segment length"
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 "
"on the wipe tower.\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 "
"tool changing is well controlled.\n"
"\n"
@ -15105,7 +15111,7 @@ msgstr ""
"aumentar a força com que o bico colide com quaisquer bolhas que possam ter "
"se formado na torre de limpeza.\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 "
"aumentadas e que o vazamento ao trocar a ferramenta está bem controlado.\n"
"\n"

View file

@ -6931,17 +6931,20 @@ msgid "Use free camera"
msgstr "Использовать свободную камеру"
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"
msgstr "Инвертировать управление масштабом"
msgid "If enabled, reverses the direction of zoom with mouse wheel."
msgstr ""
"Если включено, направление масштабирования с помощью колесика мыши будет "
"инвертировано."
msgstr "Если включено, направление масштабирования с помощью колесика мыши будет инвертировано."
msgid "Show splash screen"
msgstr "Показывать заставку при запуске программы"
@ -6953,46 +6956,37 @@ msgid "Show \"Tip of the day\" notification after start"
msgstr "Показывать уведомление с полезным советом при запуске приложения"
msgid "If enabled, useful hints are displayed at startup."
msgstr ""
"Если включено, будут показываться уведомления с полезном советом при запуске "
"приложения."
msgstr "Если включено, будут показываться уведомления с полезном советом при запуске приложения."
msgid "Flushing volumes: Auto-calculate every time the color changed."
msgstr "Объём очистки: автопересчёт при каждом изменении цвета"
msgid "If enabled, auto-calculate every time the color changed."
msgstr ""
"Если включено, выполняется автоматический перерасчёт объёма очистки при "
msgstr "Если включено, выполняется автоматический перерасчёт объёма очистки при "
"каждом изменении цвета."
msgid ""
"Flushing volumes: Auto-calculate every time when the filament is changed."
msgid "Flushing volumes: Auto-calculate every time when the filament is changed."
msgstr "Объём очистки: автопересчёт при каждой смене прутка"
msgid "If enabled, auto-calculate every time when filament is changed"
msgstr ""
"Если включено, выполняется автоматический перерасчёт объёма очистки при "
msgstr "Если включено, выполняется автоматический перерасчёт объёма очистки при "
"каждой смене прутка."
msgid "Remember printer configuration"
msgstr "Запоминать конфигурацию принтера"
msgid ""
"If enabled, Orca will remember and switch filament/process configuration for "
msgid "If enabled, Orca will remember and switch filament/process configuration for "
"each printer automatically."
msgstr ""
"Если включено, программа будет запоминать связь выбранного профиля принтера "
msgstr "Если включено, программа будет запоминать связь выбранного профиля принтера "
"с профилем пластиковой нити и процессом печати, выставленными вами в "
"последний раз."
msgid "Multi-device Management (Take effect after restarting Orca Slicer)."
msgstr "Управление несколькими принтерами (требуется перезапуск программы)"
msgid ""
"With this option enabled, you can send a task to multiple devices at the "
msgid "With this option enabled, you can send a task to multiple devices at the "
"same time and manage multiple devices."
msgstr ""
"Если включено, вы сможете управлять несколькими устройствами и отправлять "
msgstr "Если включено, вы сможете управлять несколькими устройствами и отправлять "
"задания на печать на несколько устройств одновременно."
msgid "Auto arrange plate after cloning"
@ -13420,7 +13414,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n"
"\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec "
"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 "
"allowed, resulting in faster speed transitions.\n"
"\n"
@ -13430,13 +13424,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these "
"cases a high value of around 300-350mm3/s2 is recommended as this allows for "
"just enough smoothing to assist pressure advance achieve a smoother flow "
"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 "
"transition.\n"
"\n"
"For slower printers without pressure advance, the value should be set much "
"lower. A value of 10-15mm3/s2 is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n"
"lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10 mm³/s² for Bowden style.\n"
"\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n"
@ -15353,7 +15347,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\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 "
"tool changing is well controlled.\n"
"\n"

View file

@ -6598,30 +6598,34 @@ msgstr ""
msgid "Zoom to mouse position"
msgstr "Zooma till musens position"
msgid ""
"Zoom in towards the mouse pointer's position in the 3D view, rather than the "
msgid "Zoom in towards the mouse pointer's position in the 3D view, rather than the "
"2D window center."
msgstr ""
"Zooma in mot muspekarens position i 3D-vyn, istället för mot 2D-fönstrets "
msgstr "Zooma in mot muspekarens position i 3D-vyn, istället för mot 2D-fönstrets "
"mitt."
msgid "Use free camera"
msgstr ""
msgstr "Använd fri kamera"
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"
msgstr ""
msgstr "Omvänd muszoomning"
msgid "If enabled, reverses the direction of zoom with mouse wheel."
msgstr ""
msgstr "Om aktiverad, vänder zoomriktningen med mushjulet."
msgid "Show splash screen"
msgstr ""
msgstr "Visa välkomstskärm"
msgid "Show the splash screen during startup."
msgstr ""
msgstr "Visa välkomstskärmen under uppstart."
msgid "Show \"Tip of the day\" notification after start"
msgstr "Visa \"Dagens tips\" efter start"
@ -12113,7 +12117,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n"
"\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec "
"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 "
"allowed, resulting in faster speed transitions.\n"
"\n"
@ -12123,13 +12127,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these "
"cases a high value of around 300-350mm3/s2 is recommended as this allows for "
"just enough smoothing to assist pressure advance achieve a smoother flow "
"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 "
"transition.\n"
"\n"
"For slower printers without pressure advance, the value should be set much "
"lower. A value of 10-15mm3/s2 is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n"
"lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10 mm³/s² for Bowden style.\n"
"\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n"
@ -13660,7 +13664,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\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 "
"tool changing is well controlled.\n"
"\n"

View file

@ -6799,12 +6799,17 @@ msgstr ""
"Etkinleştirilirse serbest kamerayı kullanın. Etkin değilse kısıtlı kamerayı "
"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"
msgstr "Mouse yakınlaştırmasını tersine çevir"
msgid "If enabled, reverses the direction of zoom with mouse wheel."
msgstr ""
"Etkinleştirilirse, mouse tekerleğiyle yakınlaştırmanın yönü tersine çevrilir."
msgstr "Etkinleştirilirse, mouse tekerleğiyle yakınlaştırmanın yönü tersine çevrilir."
msgid "Show splash screen"
msgstr "Açılış ekranını göster"
@ -13061,7 +13066,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n"
"\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec "
"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 "
"allowed, resulting in faster speed transitions.\n"
"\n"
@ -13071,13 +13076,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these "
"cases a high value of around 300-350mm3/s2 is recommended as this allows for "
"just enough smoothing to assist pressure advance achieve a smoother flow "
"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 "
"transition.\n"
"\n"
"For slower printers without pressure advance, the value should be set much "
"lower. A value of 10-15mm3/s2 is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n"
"lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10 mm³/s² for Bowden style.\n"
"\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n"
@ -13099,13 +13104,13 @@ msgstr ""
"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 "
"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ı "
"olmak için yeterli yumuşatmaya izin verir.\n"
"\n"
"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 "
"tarzı için 5-10mm3/s2 değeri iyi bir başlangıç noktasıdır.\n"
"ayarlanmalıdır. Doğrudan tahrikli ekstruderler için 10-15 mm³/s² ve Bowden "
"tarzı için 5-10 mm³/s² değeri iyi bir başlangıç noktasıdır.\n"
"\n"
"Bu özellik Prusa slicer'da Basınç Dengeleyici olarak bilinir.\n"
"\n"
@ -14898,7 +14903,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\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 "
"tool changing is well controlled.\n"
"\n"

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"
msgstr "Зворотне масштабування мишкою"
@ -13192,7 +13198,7 @@ msgid ""
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n"
"\n"
"It defines the maximum rate by which the extruded volumetric flow in mm3/sec "
"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 "
"allowed, resulting in faster speed transitions.\n"
"\n"
@ -13202,13 +13208,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these "
"cases a high value of around 300-350mm3/s2 is recommended as this allows for "
"just enough smoothing to assist pressure advance achieve a smoother flow "
"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 "
"transition.\n"
"\n"
"For slower printers without pressure advance, the value should be set much "
"lower. A value of 10-15mm3/s2 is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n"
"lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10 mm³/s² for Bowden style.\n"
"\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n"
@ -15024,7 +15030,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\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 "
"tool changing is well controlled.\n"
"\n"

View file

@ -6519,6 +6519,12 @@ msgstr "使用自由视角"
msgid "If enabled, use free camera. If not enabled, use constrained camera."
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"
msgstr "反转鼠标缩放"
@ -12033,13 +12039,14 @@ msgstr "挤出头最大可打印的层高。用于限制开启自适应层高时
msgid "Extrusion rate smoothing"
msgstr "平滑挤出率"
#, fuzzy
msgid ""
"This parameter smooths out sudden extrusion rate changes that happen when "
"the printer transitions from printing a high flow (high speed/larger width) "
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n"
"\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 "
"allowed, resulting in faster speed transitions.\n"
"\n"
@ -12049,13 +12056,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these "
"cases a high value of around 300-350mm3/s2 is recommended as this allows for "
"just enough smoothing to assist pressure advance achieve a smoother flow "
"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 "
"transition.\n"
"\n"
"For slower printers without pressure advance, the value should be set much "
"lower. A value of 10-15mm3/s2 is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n"
"lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10 mm³/s² for Bowden style.\n"
"\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n"
@ -12074,7 +12081,7 @@ msgstr ""
"够的平滑,以帮助压力提前实现更平滑的流量过渡。\n"
"\n"
"对于没有压力提前的较慢打印机该值应该设置得非常低。对于近程挤出机来说10-15 "
"mm3/s2是一个很好值的起点而对于远程挤出机来说是5-10 mm3/s2。\n"
"mm³/s²是一个很好值的起点而对于远程挤出机来说是5-10 mm³/s²。\n"
"\n"
"这个功能在Prusa切片机中被称为压力均衡器。\n"
"\n"
@ -13624,7 +13631,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\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 "
"tool changing is well controlled.\n"
"\n"

View file

@ -6540,6 +6540,12 @@ msgstr "使用自由鏡頭"
msgid "If enabled, use free camera. If not enabled, use constrained camera."
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"
msgstr "反轉滑鼠滾輪縮放方向"
@ -12272,13 +12278,14 @@ msgstr "擠出頭最大可列印的層高。用於限制開啟自適應層高時
msgid "Extrusion rate smoothing"
msgstr "平滑擠出率"
#, fuzzy
msgid ""
"This parameter smooths out sudden extrusion rate changes that happen when "
"the printer transitions from printing a high flow (high speed/larger width) "
"extrusion to a lower flow (lower speed/smaller width) extrusion and vice "
"versa.\n"
"\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 "
"allowed, resulting in faster speed transitions.\n"
"\n"
@ -12288,13 +12295,13 @@ msgid ""
"Voron) this value is usually not needed. However it can provide some "
"marginal benefit in certain cases where feature speeds vary greatly. For "
"example, when there are aggressive slowdowns due to overhangs. In these "
"cases a high value of around 300-350mm3/s2 is recommended as this allows for "
"just enough smoothing to assist pressure advance achieve a smoother flow "
"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 "
"transition.\n"
"\n"
"For slower printers without pressure advance, the value should be set much "
"lower. A value of 10-15mm3/s2 is a good starting point for direct drive "
"extruders and 5-10mm3/s2 for Bowden style.\n"
"lower. A value of 10-15 mm³/s² is a good starting point for direct drive "
"extruders and 5-10 mm³/s² for Bowden style.\n"
"\n"
"This feature is known as Pressure Equalizer in Prusa slicer.\n"
"\n"
@ -13880,6 +13887,7 @@ msgstr "圓錐體頂點處的角度,用於穩定換料塔。 更大的角度
msgid "Maximum wipe tower print speed"
msgstr "換料塔最快列印速度"
#, fuzzy
msgid ""
"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 "
@ -13894,7 +13902,7 @@ msgid ""
"the force with which the nozzle collides with any blobs that may have formed "
"on the wipe tower.\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 "
"tool changing is well controlled.\n"
"\n"
@ -13909,7 +13917,7 @@ msgstr ""
"\n"
"提高此速度可能會影響塔的穩定性,並增加噴嘴與換料塔上斑點的碰撞力。\n"
"\n"
"在將此參數提高於預設值 90mm/sec 以上之前,請確保您的印表設備能夠可靠地在更高"
"在將此參數提高於預設值 90mm/s 以上之前,請確保您的印表設備能夠可靠地在更高"
"的速度下橋接,並且工具更換時的溢出能良好的被控制。\n"
"\n"
"對於換料塔外部周邊,無論此設定如何,都使用內部周邊速度。"

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

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

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

View file

@ -6,8 +6,8 @@
"instantiation": "false",
"gcode_flavor": "marlin2",
"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",
"change_filament_gcode": "M600",
"machine_pause_gcode": "M601"
}
}

View file

@ -1,7 +1,7 @@
{
"name": "Bambulab",
"url": "http://www.bambulab.com/Parameters/vendor/BBL.json",
"version": "01.10.00.36",
"version": "02.00.00.53",
"force_update": "0",
"description": "the initial version of BBL configurations",
"machine_model_list": [

View file

@ -103,5 +103,11 @@
"wipe_tower_no_sparse_layers": "0",
"xy_contour_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"
}

View file

@ -31,7 +31,80 @@
"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": [
{
"name": "fdm_machine_common",

View file

@ -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"
]
}

View file

@ -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"
]
}

View file

@ -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"
]
}

View file

@ -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"
]
}

View file

@ -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"
]
}

View file

@ -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"
]
}

View file

@ -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"
]
}

View file

@ -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"
]
}

View file

@ -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"
]
}

View file

@ -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"
]
}

View file

@ -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"
]
}

View file

@ -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"
]
}

View file

@ -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"
]
}

View file

@ -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"
]
}

View file

@ -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"
]
}

View file

@ -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"
]
}

View file

@ -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"
]
}

View file

@ -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"
]
}

View file

@ -6,7 +6,7 @@
"instantiation": "true",
"printer_model": "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",
"bed_custom_model": "",
"bed_custom_texture": "",
@ -42,11 +42,11 @@
"machine_end_gcode": "PRINT_END",
"machine_load_filament_time": "0",
"machine_max_acceleration_e": [
"10000",
"5000",
"5000"
],
"machine_max_acceleration_extruding": [
"5000",
"10000",
"20000"
],
"machine_max_acceleration_retracting": [
@ -110,7 +110,7 @@
"0"
],
"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",
"manual_filament_change": "0",
"max_layer_height": [
@ -126,7 +126,7 @@
"nozzle_type": "hardened_steel",
"nozzle_volume": "0",
"parking_pos_retraction": "92",
"print_host": "192.168.2.8",
"print_host": "192.168.2.2",
"print_host_webui": "",
"printable_area": [
"0x0",

View file

@ -8,5 +8,5 @@
"bed_model": "X400_bed.stl",
"bed_texture": "Thinker_texture.png",
"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"
}

View file

@ -1,13 +1,13 @@
{
"brim_object_gap": "0",
"default_acceleration": "8000",
"default_acceleration": "10000",
"elefant_foot_compensation": "0.12",
"from": "User",
"gap_infill_speed": "300",
"gap_infill_speed": "250",
"inherits": "0.20mm Standard @Thinker X400",
"inner_wall_acceleration": "8000",
"inner_wall_speed": "300",
"internal_solid_infill_speed": "300",
"inner_wall_speed": "250",
"internal_solid_infill_speed": "250",
"is_custom_defined": "0",
"layer_height": "0.12",
"name": "0.12mm Standard @Thinker X400",
@ -20,9 +20,9 @@
"print_settings_id": "0.12mm Standard @Thinker X400",
"raft_first_layer_expansion": "10",
"sparse_infill_density": "15%",
"sparse_infill_speed": "300",
"sparse_infill_speed": "250",
"top_shell_layers": "5",
"top_shell_thickness": "1",
"version": "1.9.0.2",
"version": "2.3.0.3",
"wall_generator": "classic"
}

View file

@ -1,13 +1,13 @@
{
"brim_object_gap": "0",
"default_acceleration": "8000",
"default_acceleration": "10000",
"elefant_foot_compensation": "0.12",
"from": "User",
"gap_infill_speed": "300",
"gap_infill_speed": "250",
"inherits": "0.20mm Standard @Thinker X400",
"inner_wall_acceleration": "8000",
"inner_wall_speed": "300",
"internal_solid_infill_speed": "300",
"inner_wall_speed": "250",
"internal_solid_infill_speed": "250",
"is_custom_defined": "0",
"layer_height": "0.16",
"name": "0.16mm Standard @Thinker X400",
@ -20,9 +20,9 @@
"print_settings_id": "0.16mm Standard @Thinker X400",
"raft_first_layer_expansion": "10",
"sparse_infill_density": "15%",
"sparse_infill_speed": "300",
"sparse_infill_speed": "250",
"top_shell_layers": "5",
"top_shell_thickness": "1",
"version": "1.9.0.2",
"version": "2.3.0.3",
"wall_generator": "classic"
}

View file

@ -19,14 +19,14 @@
"bridge_density": "100%",
"bridge_flow": "0.95",
"bridge_no_support": "0",
"bridge_speed": "50",
"bridge_speed": "45",
"brim_ears_detection_length": "1",
"brim_ears_max_angle": "125",
"brim_object_gap": "0",
"brim_object_gap": "0.1",
"brim_type": "auto_brim",
"brim_width": "5",
"compatible_printers_condition": "",
"default_acceleration": "8000",
"default_acceleration": "10000",
"default_jerk": "0",
"detect_overhang_wall": "1",
"detect_thin_wall": "0",
@ -38,7 +38,7 @@
"enable_prime_tower": "0",
"enable_support": "0",
"enforce_support_layers": "0",
"exclude_object": "1",
"exclude_object": "0",
"extra_perimeters_on_overhangs": "0",
"filename_format": "{input_filename_base}_{filament_type[0]}_{print_time}.gcode",
"filter_out_gap_fill": "0",
@ -104,12 +104,12 @@
"only_one_wall_first_layer": "0",
"only_one_wall_top": "1",
"ooze_prevention": "0",
"outer_wall_acceleration": "5000",
"outer_wall_acceleration": "4000",
"outer_wall_jerk": "9",
"outer_wall_line_width": "0.42",
"outer_wall_speed": "200",
"overhang_1_4_speed": "0",
"overhang_2_4_speed": "50",
"overhang_2_4_speed": "45",
"overhang_3_4_speed": "30",
"overhang_4_4_speed": "10",
"overhang_reverse": "0",
@ -149,7 +149,7 @@
"sparse_infill_acceleration": "100%",
"sparse_infill_density": "15%",
"sparse_infill_filament": "1",
"sparse_infill_line_width": "0.45",
"sparse_infill_line_width": "0.54",
"sparse_infill_pattern": "crosshatch",
"sparse_infill_speed": "250",
"spiral_mode": "0",
@ -189,9 +189,9 @@
"top_surface_line_width": "0.42",
"top_surface_pattern": "monotonic",
"top_surface_speed": "200",
"travel_acceleration": "5000",
"travel_acceleration": "10000",
"travel_jerk": "12",
"travel_speed": "350",
"travel_speed": "400",
"travel_speed_z": "0",
"tree_support_adaptive_layer_height": "1",
"tree_support_angle_slow": "25",
@ -208,7 +208,7 @@
"tree_support_tip_diameter": "0.8",
"tree_support_top_rate": "30%",
"tree_support_wall_count": "2",
"version": "1.9.0.2",
"version": "2.3.0.3",
"wall_distribution_count": "1",
"wall_filament": "1",
"wall_generator": "classic",

View file

@ -1,13 +1,13 @@
{
"brim_object_gap": "0",
"default_acceleration": "8000",
"default_acceleration": "10000",
"elefant_foot_compensation": "0.12",
"from": "User",
"gap_infill_speed": "220",
"gap_infill_speed": "250",
"inherits": "0.20mm Standard @Thinker X400",
"inner_wall_acceleration": "8000",
"inner_wall_speed": "220",
"internal_solid_infill_speed": "220",
"inner_wall_speed": "250",
"internal_solid_infill_speed": "250",
"is_custom_defined": "0",
"layer_height": "0.24",
"name": "0.24mm Standard @Thinker X400",
@ -17,9 +17,9 @@
"print_settings_id": "0.24mm Standard @Thinker X400",
"raft_first_layer_expansion": "10",
"sparse_infill_density": "15%",
"sparse_infill_speed": "220",
"sparse_infill_speed": "250",
"top_shell_layers": "5",
"top_shell_thickness": "1",
"version": "1.9.0.2",
"version": "2.3.0.3",
"wall_generator": "classic"
}

View file

@ -178,6 +178,9 @@ void AppConfig::set_defaults()
if (get("camera_navigation_style").empty())
set("camera_navigation_style", "0");
if (get("swap_mouse_buttons").empty())
set_bool("swap_mouse_buttons", false);
if (get("reverse_mouse_wheel_zoom").empty())
set_bool("reverse_mouse_wheel_zoom", false);

View file

@ -49,6 +49,13 @@ BoundingBox BoundingBox::rotated(double angle, const Point &center) const
return out;
}
BoundingBox BoundingBox::scaled(double factor) const
{
BoundingBox out(*this);
out.scale(factor);
return out;
}
template <class PointType, typename APointsType> void
BoundingBoxBase<PointType, APointsType>::scale(double factor)
{

View file

@ -222,7 +222,9 @@ public:
BoundingBox(const Point &pmin, const Point &pmax) : BoundingBoxBase<Point, Points>(pmin, pmax) {}
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);
};

View file

@ -657,6 +657,11 @@ public:
{
if (! append)
this->values.clear();
if (str.empty()) {
this->values.push_back(0);
return true;
}
std::istringstream is(str);
std::string item_str;
while (std::getline(is, item_str, ',')) {
@ -675,6 +680,13 @@ public:
}
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)
{

File diff suppressed because it is too large Load diff

View file

@ -56,7 +56,7 @@ public:
bool on_boundary(const Point &point, double eps) const;
// Projection of a point onto the polygon.
Point point_projection(const Point &point) const;
void symmetric_y(const coord_t &y_axis);
// Does this expolygon overlap another expolygon?
// Either the ExPolygons intersect, or one is fully inside the other,
// and it is not inside a hole of the other expolygon.

View file

@ -34,7 +34,6 @@ struct SurfaceFillParams
coordf_t overlap = 0.;
// Angle as provided by the region config, in radians.
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.
bool bridge;
// Non-negative for a bridge.
@ -68,6 +67,9 @@ struct SurfaceFillParams
// Params for lattice infill angles
float lattice_angle_1 = 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
float infill_overhang_angle = 60.f;
@ -85,7 +87,6 @@ struct SurfaceFillParams
RETURN_COMPARE_NON_EQUAL(spacing);
RETURN_COMPARE_NON_EQUAL(overlap);
RETURN_COMPARE_NON_EQUAL(angle);
RETURN_COMPARE_NON_EQUAL(rotate_angle);
RETURN_COMPARE_NON_EQUAL(density);
// RETURN_COMPARE_NON_EQUAL_TYPED(unsigned, dont_adjust);
RETURN_COMPARE_NON_EQUAL(anchor_length);
@ -100,33 +101,36 @@ struct SurfaceFillParams
RETURN_COMPARE_NON_EQUAL(solid_infill_speed);
RETURN_COMPARE_NON_EQUAL(lattice_angle_1);
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;
}
bool operator==(const SurfaceFillParams &rhs) const {
return this->extruder == rhs.extruder &&
this->pattern == rhs.pattern &&
this->spacing == rhs.spacing &&
this->overlap == rhs.overlap &&
this->angle == rhs.angle &&
this->rotate_angle == rhs.rotate_angle &&
this->bridge == rhs.bridge &&
this->bridge_angle == rhs.bridge_angle &&
this->density == rhs.density &&
// this->dont_adjust == rhs.dont_adjust &&
this->anchor_length == rhs.anchor_length &&
this->anchor_length_max == rhs.anchor_length_max &&
this->flow == rhs.flow &&
this->extrusion_role == rhs.extrusion_role &&
this->sparse_infill_speed == rhs.sparse_infill_speed &&
this->top_surface_speed == rhs.top_surface_speed &&
this->solid_infill_speed == rhs.solid_infill_speed &&
this->lattice_angle_1 == rhs.lattice_angle_1 &&
this->lattice_angle_2 == rhs.lattice_angle_2 &&
bool operator==(const SurfaceFillParams &rhs) const {
return this->extruder == rhs.extruder &&
this->pattern == rhs.pattern &&
this->spacing == rhs.spacing &&
this->overlap == rhs.overlap &&
this->angle == rhs.angle &&
this->bridge == rhs.bridge &&
this->bridge_angle == rhs.bridge_angle &&
this->density == rhs.density &&
// this->dont_adjust == rhs.dont_adjust &&
this->anchor_length == rhs.anchor_length &&
this->anchor_length_max == rhs.anchor_length_max &&
this->flow == rhs.flow &&
this->extrusion_role == rhs.extrusion_role &&
this->sparse_infill_speed == rhs.sparse_infill_speed &&
this->top_surface_speed == rhs.top_surface_speed &&
this->solid_infill_speed == rhs.solid_infill_speed &&
this->lattice_angle_1 == rhs.lattice_angle_1 &&
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;
}
}
};
struct SurfaceFill {
@ -602,16 +606,34 @@ void split_solid_surface(size_t layer_id, const SurfaceFill &fill, ExPolygons &n
#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;
// Fill in a map of a region & surface to SurfaceFillParams.
std::set<SurfaceFillParams> set_surface_params;
std::vector<std::vector<const SurfaceFillParams*>> region_to_surface_params(layer.regions().size(), std::vector<const SurfaceFillParams*>());
SurfaceFillParams params;
bool has_internal_voids = false;
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) {
const LayerRegion &layerm = *layer.regions()[region_id];
region_to_surface_params[region_id].assign(layerm.fill_surfaces.size(), nullptr);
@ -628,26 +650,37 @@ std::vector<SurfaceFill> group_fills(const Layer &layer)
params.lattice_angle_1 = region_config.lattice_angle_1;
params.lattice_angle_2 = region_config.lattice_angle_2;
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()) {
params.density = 100.f;
//FIXME for non-thick bridges, shall we allow a bottom surface pattern?
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())
if (surface.is_solid()) {
if (surface.is_external() && !is_bridge) {
if (surface.is_top()) {
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;
}
else {
if(region_config.top_surface_pattern == ipMonotonic || region_config.top_surface_pattern == ipMonotonicLine)
params.density = float(region_config.bottom_surface_density);
}
} else if (surface.is_solid_infill()) {
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;
else
params.pattern = ipRectilinear;
params.density = 100.f;
}
} else if (params.density <= 0)
continue;
} else if (params.density <= 0)
continue;
params.extrusion_role = erInternalInfill;
if (is_bridge) {
@ -667,10 +700,8 @@ std::vector<SurfaceFill> group_fills(const Layer &layer)
params.bridge_angle = float(surface.bridge_angle);
if (params.extrusion_role == erInternalInfill) {
params.angle = float(Geometry::deg2rad(region_config.infill_direction.value));
params.rotate_angle = (params.pattern == ipRectilinear || params.pattern == ipLine);
} else {
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.
@ -709,7 +740,28 @@ std::vector<SurfaceFill> group_fills(const Layer &layer)
params.anchor_length = std::min(params.anchor_length, params.anchor_length_max);
}
auto it_params = set_surface_params.find(params);
//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);
if (it_params == set_surface_params.end())
it_params = set_surface_params.insert(it_params, 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.extrusion_role = erSolidInfill;
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
params.flow = layerm.flow(frSolidInfill);
params.spacing = params.flow.spacing();
@ -914,8 +965,8 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive:
#ifdef SLIC3R_DEBUG_SLICE_PROCESSING
// this->export_region_fill_surfaces_to_svg_debug("10_fill-initial");
#endif /* SLIC3R_DEBUG_SLICE_PROCESSING */
std::vector<SurfaceFill> surface_fills = group_fills(*this);
LockRegionParam lock_param;
std::vector<SurfaceFill> surface_fills = group_fills(*this, lock_param);
const Slic3r::BoundingBox bbox = this->object()->bounding_box();
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->z = this->print_z;
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->print_config = &this->object()->print()->config();
f->print_object_config = &this->object()->config();
if (surface_fill.params.pattern == ipLightning)
f->adapt_fill_octree = (surface_fill.params.pattern == ipSupportCubic) ? support_fill_octree : adaptive_fill_octree;
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;
// calculate flow spacing for infill pattern generation
bool using_internal_flow = ! surface_fill.surface.is_solid() && ! surface_fill.params.bridge;
double link_max_length = 0.;
@ -970,7 +1029,7 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive:
params.resolution = resolution;
params.use_arachne = surface_fill.params.pattern == ipConcentric || surface_fill.params.pattern == ipConcentricInternal;
params.layer_height = layerm->layer()->height;
params.lattice_angle_1 = surface_fill.params.lattice_angle_1;
params.lattice_angle_1 = surface_fill.params.lattice_angle_1;
params.lattice_angle_2 = surface_fill.params.lattice_angle_2;
params.infill_overhang_angle = surface_fill.params.infill_overhang_angle;
@ -979,11 +1038,41 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive:
params.extrusion_role = surface_fill.params.extrusion_role;
params.using_internal_flow = using_internal_flow;
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)
params.can_reverse = false;
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.
f->spacing = surface_fill.params.spacing;
surface_fill.surface.expolygon = std::move(expoly);
@ -1023,9 +1112,10 @@ 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
{
std::vector<SurfaceFill> surface_fills = group_fills(*this);
const Slic3r::BoundingBox bbox = this->object()->bounding_box();
const auto resolution = this->object()->print()->config().resolution.value;
LockRegionParam skin_inner_param;
std::vector<SurfaceFill> surface_fills = group_fills(*this, skin_inner_param);
const Slic3r::BoundingBox bbox = this->object()->bounding_box();
const auto resolution = this->object()->print()->config().resolution.value;
Polylines sparse_infill_polylines{};
@ -1059,7 +1149,10 @@ Polylines Layer::generate_sparse_infill_polylines_for_anchoring(FillAdaptive::Oc
case ipTpmsD:
case ipHilbertCurve:
case ipArchimedeanChords:
case ipOctagramSpiral: break;
case ipOctagramSpiral:
case ipZigZag:
case ipCrossZag:
case ipLockedZag: break;
}
// Create the filler object.
@ -1103,8 +1196,8 @@ Polylines Layer::generate_sparse_infill_polylines_for_anchoring(FillAdaptive::Oc
params.resolution = resolution;
params.use_arachne = false;
params.layer_height = layerm.layer()->height;
params.lattice_angle_1 = surface_fill.params.lattice_angle_1;
params.lattice_angle_2 = surface_fill.params.lattice_angle_2;
params.lattice_angle_1 = surface_fill.params.lattice_angle_1;
params.lattice_angle_2 = surface_fill.params.lattice_angle_2;
params.infill_overhang_angle = surface_fill.params.infill_overhang_angle;
for (ExPolygon &expoly : surface_fill.expolygons) {

View file

@ -15,6 +15,10 @@ public:
Fill* clone() const override { return new Fill3DHoneycomb(*this); };
~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:
void _fill_surface_single(
const FillParams &params,

View file

@ -71,6 +71,7 @@ protected:
// 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.
bool no_sort() const override { return false; }
bool is_self_crossing() override { return true; }
};
} // namespace FillAdaptive

View file

@ -67,6 +67,9 @@ Fill* Fill::new_from_type(const InfillPattern type)
// BBS: for bottom and top surface only
// Orca: Replace BBS implementation with Prusa implementation
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");
}
}
@ -243,7 +246,7 @@ void Fill::_create_gap_fill(const Surface* surface, const FillParams& params, Ex
// Calculate a new spacing to fill width with possibly integer number of lines,
// the first and last line being centered at the interval ends.
// This function possibly increases the spacing, never decreases,
// This function possibly increases the spacing, never decreases,
// and for a narrow width the increase in spacing may become severe,
// therefore the adjustment is limited to 20% increase.
coord_t Fill::_adjust_solid_spacing(const coord_t width, const coord_t distance)
@ -252,8 +255,8 @@ coord_t Fill::_adjust_solid_spacing(const coord_t width, const coord_t distance)
assert(distance > 0);
// floor(width / distance)
const auto number_of_intervals = coord_t((width - EPSILON) / distance);
coord_t distance_new = (number_of_intervals == 0) ?
distance :
coord_t distance_new = (number_of_intervals == 0) ?
distance :
coord_t((width - EPSILON) / number_of_intervals);
const coordf_t factor = coordf_t(distance_new) / coordf_t(distance);
assert(factor > 1. - 1e-5);
@ -279,8 +282,8 @@ std::pair<float, Point> Fill::_infill_direction(const Surface *surface) const
// Bounding box is the bounding box of a perl object Slic3r::Print::Object (c++ object Slic3r::PrintObject)
// The bounding box is only undefined in unit tests.
Point out_shift = empty(this->bounding_box) ?
surface->expolygon.contour.bounding_box().center() :
Point out_shift = empty(this->bounding_box) ?
surface->expolygon.contour.bounding_box().center() :
this->bounding_box.center();
#if 0
@ -354,10 +357,10 @@ struct ContourIntersectionPoint {
bool could_take_next() const throw() { return ! this->consumed && this->contour_not_taken_length_next > SCALED_EPSILON; }
// Could extrude a complete segment from this to this->prev_on_contour.
bool could_connect_prev() const throw()
bool could_connect_prev() const throw()
{ return ! this->consumed && this->prev_on_contour != this && ! this->prev_on_contour->consumed && ! this->prev_trimmed && ! this->prev_on_contour->next_trimmed; }
// Could extrude a complete segment from this to this->next_on_contour.
bool could_connect_next() const throw()
bool could_connect_next() const throw()
{ return ! this->consumed && this->next_on_contour != this && ! this->next_on_contour->consumed && ! this->next_trimmed && ! this->next_on_contour->prev_trimmed; }
};
@ -566,7 +569,7 @@ static void take(Polyline &pl1, const Polyline &pl2, const Points &contour, Cont
}
static void take_limited(
Polyline &pl1, const Points &contour, const std::vector<double> &params,
Polyline &pl1, const Points &contour, const std::vector<double> &params,
ContourIntersectionPoint *cp_start, ContourIntersectionPoint *cp_end, bool clockwise, double take_max_length, double line_half_width)
{
#ifndef NDEBUG
@ -730,8 +733,8 @@ static inline SegmentPoint clip_end_segment_and_point(const Points &polyline, do
// Calculate intersection of a line with a thick segment.
// Returns Eucledian parameters of the line / thick segment overlap.
static inline bool line_rounded_thick_segment_collision(
const Vec2d &line_a, const Vec2d &line_b,
const Vec2d &segment_a, const Vec2d &segment_b, const double offset,
const Vec2d &line_a, const Vec2d &line_b,
const Vec2d &segment_a, const Vec2d &segment_b, const double offset,
std::pair<double, double> &out_interval)
{
const Vec2d line_v0 = line_b - line_a;
@ -794,8 +797,8 @@ static inline bool line_rounded_thick_segment_collision(
std::pair<double, double> interval;
if (Geometry::liang_barsky_line_clipping_interval(
Vec2d(line_p0.dot(dir_x), line_p0.dot(dir_y)),
Vec2d(line_v0.dot(dir_x), line_v0.dot(dir_y)),
BoundingBoxf(Vec2d(0., - offset), Vec2d(segment_l, offset)),
Vec2d(line_v0.dot(dir_x), line_v0.dot(dir_y)),
BoundingBoxf(Vec2d(0., - offset), Vec2d(segment_l, offset)),
interval))
extend_interval(interval.first, interval.second);
} else
@ -1155,7 +1158,7 @@ void mark_boundary_segments_touching_infill(
// Clip the infill polyline by the Eucledian distance along the polyline.
SegmentPoint start_point = clip_start_segment_and_point(polyline.points, clip_distance);
SegmentPoint end_point = clip_end_segment_and_point(polyline.points, clip_distance);
if (start_point.valid() && end_point.valid() &&
if (start_point.valid() && end_point.valid() &&
(start_point.idx_segment < end_point.idx_segment || (start_point.idx_segment == end_point.idx_segment && start_point.t < end_point.t))) {
// The clipped polyline is non-empty.
#ifdef INFILL_DEBUG_OUTPUT
@ -1295,21 +1298,21 @@ struct BoundaryInfillGraph
};
static Direction dir(const Point &p1, const Point &p2) {
return p1.x() == p2.x() ?
return p1.x() == p2.x() ?
(p1.y() < p2.y() ? Up : Down) :
(p1.x() < p2.x() ? Right : Left);
}
const Direction dir_prev(const ContourIntersectionPoint &cp) const {
assert(cp.prev_on_contour);
return cp.could_take_prev() ?
return cp.could_take_prev() ?
dir(this->point(cp), this->point(*cp.prev_on_contour)) :
Taken;
}
const Direction dir_next(const ContourIntersectionPoint &cp) const {
assert(cp.next_on_contour);
return cp.could_take_next() ?
return cp.could_take_next() ?
dir(this->point(cp), this->point(*cp.next_on_contour)) :
Taken;
}
@ -1367,7 +1370,7 @@ static inline void mark_boundary_segments_overlapping_infill(
assert(interval.first == 0.);
double len_out = closed_contour_distance_ccw(contour_params[cp.point_idx], contour_params[i], contour_params.back()) + interval.second;
if (len_out < cp.contour_not_taken_length_next) {
// Leaving the infill line region before exiting cp.contour_not_taken_length_next,
// Leaving the infill line region before exiting cp.contour_not_taken_length_next,
// thus at least some of the contour is outside and we will extrude this segment.
inside = false;
break;
@ -1399,7 +1402,7 @@ static inline void mark_boundary_segments_overlapping_infill(
assert(interval.first == 0.);
double len_out = closed_contour_distance_cw(contour_params[cp.point_idx], contour_params[i], contour_params.back()) + interval.second;
if (len_out < cp.contour_not_taken_length_prev) {
// Leaving the infill line region before exiting cp.contour_not_taken_length_next,
// Leaving the infill line region before exiting cp.contour_not_taken_length_next,
// thus at least some of the contour is outside and we will extrude this segment.
inside = false;
break;
@ -1496,7 +1499,7 @@ BoundaryInfillGraph create_boundary_infill_graph(const Polylines &infill_ordered
ContourIntersectionPoint *pthis = &out.map_infill_end_point_to_boundary[it->second];
if (pprev) {
pprev->next_on_contour = pthis;
pthis->prev_on_contour = pprev;
pthis->prev_on_contour = pprev;
} else
pfirst = pthis;
contour_intersection_points.emplace_back(pthis);
@ -1521,7 +1524,7 @@ BoundaryInfillGraph create_boundary_infill_graph(const Polylines &infill_ordered
ip->param = contour_params[ip->point_idx];
// and measure distance to the previous and next intersection point.
const double contour_length = contour_params.back();
for (ContourIntersectionPoint *ip : contour_intersection_points)
for (ContourIntersectionPoint *ip : contour_intersection_points)
if (ip->next_on_contour == ip) {
assert(ip->prev_on_contour == ip);
ip->contour_not_taken_length_prev = ip->contour_not_taken_length_next = contour_length;
@ -1556,6 +1559,18 @@ BoundaryInfillGraph create_boundary_infill_graph(const Polylines &infill_ordered
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)
{
assert(! infill_ordered.empty());
@ -1927,14 +1942,14 @@ static inline void base_support_extend_infill_lines(Polylines &infill, BoundaryI
// The contour is supposed to enter the "forbidden" zone outside of the (left, right) band at tbegin and also at tend.
static inline void emit_loops_in_band(
// Vertical band, which will trim the contour between tbegin and tend.
coord_t left,
coord_t left,
coord_t right,
// Contour and its parametrization.
const Points &contour,
const std::vector<double> &contour_params,
// Span of the parameters of an arch to trim with the vertical band.
double tbegin,
double tend,
double tend,
// Minimum arch length to put into polylines_out. Shorter arches are not necessary to support a dense support infill.
double min_length,
Polylines &polylines_out)
@ -1990,13 +2005,13 @@ static inline void emit_loops_in_band(
};
enum InOutBand {
Entering,
Entering,
Leaving,
};
class State {
public:
State(coord_t left, coord_t right, double min_length, Polylines &polylines_out) :
State(coord_t left, coord_t right, double min_length, Polylines &polylines_out) :
m_left(left), m_right(right), m_min_length(min_length), m_polylines_out(polylines_out) {}
void add_inner_point(const Point* p)
@ -2297,7 +2312,7 @@ void Fill::connect_base_support(Polylines &&infill_ordered, const std::vector<co
#endif // INFILL_DEBUG_OUTPUT
base_support_extend_infill_lines(infill_ordered, graph, spacing, params);
#ifdef INFILL_DEBUG_OUTPUT
export_partial_infill_to_svg(debug_out_path("connect_base_support-extended-%03d.svg", iRun), graph, infill_ordered, polylines_out);
#endif // INFILL_DEBUG_OUTPUT
@ -2332,7 +2347,7 @@ void Fill::connect_base_support(Polylines &&infill_ordered, const std::vector<co
};
// Connect infill lines at cp and cpo_next_on_contour.
// If the complete arch cannot be taken, then
// If the complete arch cannot be taken, then
// if (take_first)
// take the infill line at cp and an arc from cp towards cp.next_on_contour.
// else
@ -2626,7 +2641,7 @@ void Fill::connect_base_support(Polylines &&infill_ordered, const std::vector<co
for (ContourIntersectionPoint &cp : graph.map_infill_end_point_to_boundary) {
const SupportArcCost &cost_prev = arches[(&cp - graph.map_infill_end_point_to_boundary.data()) * 2];
const SupportArcCost &cost_next = *(&cost_prev + 1);
if (cp.contour_not_taken_length_prev > SCALED_EPSILON &&
if (cp.contour_not_taken_length_prev > SCALED_EPSILON &&
(cost_prev.self_loop ?
cost_prev.cost > cap_cost :
cost_prev.cost > cost_veryhigh)) {
@ -2643,7 +2658,7 @@ void Fill::connect_base_support(Polylines &&infill_ordered, const std::vector<co
polylines_out.emplace_back(std::move(pl));
}
}
if (cp.contour_not_taken_length_next > SCALED_EPSILON &&
if (cp.contour_not_taken_length_next > SCALED_EPSILON &&
(cost_next.self_loop ?
cost_next.cost > cap_cost :
cost_next.cost > cost_veryhigh)) {

View file

@ -36,6 +36,15 @@ public:
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
{
bool full_infill() const { return density > 0.9999f; }
@ -72,6 +81,7 @@ struct FillParams
// For 2D lattice
coordf_t lattice_angle_1 { 0.f };
coordf_t lattice_angle_2 { 0.f };
InfillPattern pattern{ ipRectilinear };
// For 2D Honeycomb
float infill_overhang_angle { 60 };
@ -85,6 +95,13 @@ struct FillParams
const PrintRegionConfig* config{ nullptr };
bool dont_sort{ false }; // do not sort the lines, just simply connect them
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).");
@ -102,7 +119,7 @@ public:
// in radians, ccw, 0 = East
float angle;
// 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.
// Used by the FillRectilinear2, FillGrid2, FillTriangles, FillStars and FillCubic.
// If left to zero, the links will not be limited.
@ -135,20 +152,25 @@ public:
static bool use_bridge_flow(const InfillPattern type);
void set_bounding_box(const Slic3r::BoundingBox &bbox) { bounding_box = bbox; }
BoundingBox extended_object_bounding_box() const;
// Use bridge flow for the fill?
virtual bool use_bridge_flow() const { return false; }
// Do not sort the fill lines to optimize the print head path?
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.
virtual Polylines fill_surface(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.
// 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:
Fill() :
@ -159,7 +181,7 @@ protected:
overlap(0.),
// Initial angle is undefined.
angle(FLT_MAX),
rotate_angle(true),
rotate_angle(M_PI/180.0),
link_max_length(0),
loop_clipping(0),
// The initial bounding box is empty, therefore undefined.
@ -168,11 +190,11 @@ protected:
// The expolygon may be modified by the method to avoid a copy.
virtual void _fill_surface_single(
const FillParams & /* params */,
const FillParams & /* params */,
unsigned int /* thickness_layers */,
const std::pair<float, Point> & /* direction */,
const std::pair<float, Point> & /* direction */,
ExPolygon /* expolygon */,
Polylines & /* polylines_out */) {};
Polylines & /* polylines_out */) {}
// Used for concentric infill to generate ThickPolylines using Arachne.
virtual void _fill_surface_single(const FillParams& params,
@ -181,7 +203,7 @@ protected:
ExPolygon expolygon,
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;

View file

@ -9,6 +9,7 @@ class FillConcentric : public Fill
{
public:
~FillConcentric() override = default;
bool is_self_crossing() override { return false; }
protected:
Fill* clone() const override { return new FillConcentric(*this); };

View file

@ -10,6 +10,7 @@ class FillConcentricInternal : public Fill
public:
~FillConcentricInternal() override = default;
void fill_surface_extrusion(const Surface *surface, const FillParams &params, ExtrusionEntitiesPtr &out) override;
bool is_self_crossing() override { return false; }
protected:
Fill* clone() const override { return new FillConcentricInternal(*this); };

View file

@ -14,6 +14,7 @@ class FillCrossHatch : public Fill
public:
Fill *clone() const override { return new FillCrossHatch(*this); };
~FillCrossHatch() override {}
bool is_self_crossing() override { return false; }
protected:
void _fill_surface_single(

View file

@ -168,6 +168,10 @@ void FillGyroid::_fill_surface_single(
// 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)));
// Expand the bounding box to avoid artifacts at the edges
coord_t expand = 10 * (scale_(this->spacing));
bb.offset(expand);
// generate pattern
Polylines polylines = make_gyroid_waves(
scale_(this->z),

View file

@ -15,6 +15,7 @@ public:
// require bridge flow since most of this pattern hangs in air
bool use_bridge_flow() const override { return false; }
bool is_self_crossing() override { return false; }
// Correction applied to regular infill angle to maximize printing
// speed in default configuration (degrees)

View file

@ -13,6 +13,7 @@ class FillHoneycomb : public Fill
{
public:
~FillHoneycomb() override {}
bool is_self_crossing() override { return false; }
protected:
Fill* clone() const override { return new FillHoneycomb(*this); };

View file

@ -20,6 +20,7 @@ class Filler : public Slic3r::Fill
{
public:
~Filler() override = default;
bool is_self_crossing() override { return false; }
Generator *generator { nullptr };
protected:

View file

@ -14,6 +14,7 @@ class FillLine : public Fill
public:
Fill* clone() const override { return new FillLine(*this); };
~FillLine() override = default;
bool is_self_crossing() override { return false; }
protected:
void _fill_surface_single(

View file

@ -37,6 +37,7 @@ class FillPlanePath : public Fill
{
public:
~FillPlanePath() override = default;
bool is_self_crossing() override { return false; }
protected:
void _fill_surface_single(

View file

@ -987,7 +987,6 @@ static std::vector<SegmentedIntersectionLine> slice_region_by_vertical_lines(con
throw;
}
#endif //INFILL_DEBUG_OUTPUT
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)));
}
static void traverse_graph_generate_polylines(
const ExPolygonWithOffset& poly_with_offset, const FillParams& params, const coord_t link_max_length, std::vector<SegmentedIntersectionLine>& segs, Polylines& polylines_out)
static void traverse_graph_generate_polylines(const ExPolygonWithOffset &poly_with_offset,
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.
// Mark an outer only chord as consumed, if the distance is low.
@ -1387,34 +1389,28 @@ static void traverse_graph_generate_polylines(
pointLast = polylines_out.back().points.back();
for (;;) {
if (i_intersection == -1) {
// The path has been interrupted. Find a next starting point, closest to the previous extruder position.
coordf_t dist2min = std::numeric_limits<coordf_t>().max();
for (int i_vline2 = 0; i_vline2 < int(segs.size()); ++ i_vline2) {
// The path has been interrupted. Find a next starting point.
for (int i_vline2 = 0; i_vline2 < int(segs.size()); ++i_vline2) {
const SegmentedIntersectionLine &vline = segs[i_vline2];
if (! vline.intersections.empty()) {
if (!vline.intersections.empty()) {
assert(vline.intersections.size() > 1);
// Even number of intersections with the loops.
assert((vline.intersections.size() & 1) == 0);
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()) {
assert(intrsctn.is_low() || i > 0);
bool consumed = intrsctn.is_low() ?
intrsctn.consumed_vertical_up :
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_intersection = i;
//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;
}
assert(intrsctn.is_low() || intrsctn_idx > 0);
const bool consumed = intrsctn.is_low() ? intrsctn.consumed_vertical_up : vline.intersections[intrsctn_idx - 1].consumed_vertical_up;
if (!consumed) {
i_vline = i_vline2;
i_intersection = intrsctn_idx;
goto found;
}
}
}
@ -1487,9 +1483,13 @@ static void traverse_graph_generate_polylines(
// 1) Find possible connection points on the previous / next vertical line.
int i_prev = it->left_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_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.
if (i_prev != -1)
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)
{
// 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
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;
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;
}
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
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);
} else {
// 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())
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
static int iRun = 0;
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 ++;
#endif /* SLIC3R_DEBUG */
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_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);
polylines_from_paths(path, poly_with_offset, segs, polylines_out);
}
} else
traverse_graph_generate_polylines(poly_with_offset, params, this->link_max_length, segs, polylines_out);
} else {
traverse_graph_generate_polylines(poly_with_offset, params, segs, this->has_consistent_pattern(), polylines_out);
}
#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?
//assert(! it->has_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
@ -2884,6 +2912,8 @@ bool FillRectilinear::fill_surface_by_lines(const Surface *surface, const FillPa
assert(! polyline.has_duplicate_points());
#endif /* SLIC3R_DEBUG */
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 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))
BOOST_LOG_TRIVIAL(error) << "FillRectilinear::fill_surface() fill_surface_by_lines() failed to fill a region.";
} 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

View file

@ -16,6 +16,7 @@ public:
Fill* clone() const override { return new FillRectilinear(*this); }
~FillRectilinear() override = default;
Polylines fill_surface(const Surface *surface, const FillParams &params) override;
bool is_self_crossing() override { return false; }
protected:
// Fill by single directional lines, interconnect the lines along perimeters.
@ -28,6 +29,9 @@ protected:
float pattern_shift;
};
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
@ -65,6 +69,7 @@ public:
Fill* clone() const override { return new FillGrid(*this); }
~FillGrid() override = default;
Polylines fill_surface(const Surface *surface, const FillParams &params) override;
bool is_self_crossing() override { return true; }
protected:
// 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); }
~FillTriangles() override = default;
Polylines fill_surface(const Surface *surface, const FillParams &params) override;
bool is_self_crossing() override { return true; }
protected:
// 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); }
~FillStars() override = default;
Polylines fill_surface(const Surface *surface, const FillParams &params) override;
bool is_self_crossing() override { return true; }
protected:
// 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); }
~FillCubic() override = default;
Polylines fill_surface(const Surface *surface, const FillParams &params) override;
bool is_self_crossing() override { return true; }
protected:
// The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill.
@ -170,6 +178,7 @@ public:
public:
~FillMonotonicLineWGapFill() override = default;
void fill_surface_extrusion(const Surface *surface, const FillParams &params, ExtrusionEntitiesPtr &out) override;
bool is_self_crossing() override { return false; }
protected:
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);
};*/
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);
class FillZigZag : public FillRectilinear
{
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

View file

@ -1,445 +1,159 @@
#include "../ClipperUtils.hpp"
#include "FillTpmsD.hpp"
#include <cmath>
#include <algorithm>
#include <vector>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <tbb/parallel_for.h>
// From Creality Print
//#include <cstddef>
#include "../ClipperUtils.hpp"
#include "../ShortestPath.hpp"
#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 {
using namespace std;
struct myPoint
{
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;
static double scaled_floor(double x,double scale){
return std::floor(x/scale)*scale;
}
void process_block(int i,
int j,
vector<vector<double>>& data,
double contourValue,
std::vector<std::vector<MarchingSquares::Point>>& posxy,
vector<Point>& contourPoints)
static Polylines make_waves(double gridZ, double density_adjusted, double line_spacing, double width, double height)
{
vector<double> values = getGridValues(i, j, data);
vector<bool> isNeedContour;
for (double value : values) {
isNeedContour.push_back(needContour(value, contourValue));
}
int index = 0;
if (isNeedContour[0])
index |= 1;
if (isNeedContour[1])
index |= 2;
if (isNeedContour[2])
index |= 4;
if (isNeedContour[3])
index |= 8;
vector<Point> points;
switch (index) {
case 0:
case 15: break;
const double scaleFactor = scale_(line_spacing) / density_adjusted;
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));
// tolerance in scaled units. clamp the maximum tolerance as there's
// no processing-speed benefit to do so beyond a certain point
const double tolerance = std::min(line_spacing / 2, FillTpmsD::PatternTolerance) / unscale<double>(scaleFactor);
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;
//scale factor for 5% : 8 712 388
// 1z = 10^-6 mm ?
const double z = gridZ / scaleFactor;
Polylines result;
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) {
contourPoints.push_back(p);
}
//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);
}
std::vector<std::pair<double,double>> wave;
{//fill one wave
const auto v=[&](double u){return acos(a/b*cos(u));};
for(int c=0;c<=4;++c){
const double u=minU+2*M_PI*c/4;
wave.emplace_back(u,v(u));
}
{//refine
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,
int gridSize_w,
int gridSize_h,
vector<vector<double>>& data,
std::vector<std::vector<MarchingSquares::Point>>& posxy,
Polylines& repls)
// FIXME: needed to fix build on Mac on buildserver
constexpr double FillTpmsD::PatternTolerance;
void FillTpmsD::_fill_surface_single(
const FillParams &params,
unsigned int thickness_layers,
const std::pair<float, Point> &direction,
ExPolygon expolygon,
Polylines &polylines_out)
{
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;
myPoint p1, p2;
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,
const std::pair<float, Point>& direction,
ExPolygon expolygon,
Polylines& polylines_out)
{
auto infill_angle = float(this->angle - (CorrectionAngle * 2 * M_PI) / 360.);
if (std::abs(infill_angle) >= EPSILON)
auto infill_angle = float(this->angle + (CorrectionAngle * 2*M_PI) / 360.);
if(std::abs(infill_angle) >= EPSILON)
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();
// Density adjusted to have a good %of weight.
double density_adjusted = std::max(0., params.density * DensityAdjust);
// Distance between the gyroid waves in scaled coordinates.
coord_t distance = coord_t(scale_(this->spacing) / density_adjusted);
BoundingBox bb = expolygon.contour.bounding_box();
auto cenpos = unscale(bb.center());
auto boxsize = unscale(bb.size());
float xlen = boxsize.x();
float ylen = boxsize.y();
// 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)));
float delta = 0.25f;
float myperiod = 2 * PI / vari_T;
float c_z = myperiod * this->z;
float cos_z = get_cos(c_z);
float sin_z = get_sin(c_z);
// generate pattern
Polylines polylines = make_waves(
scale_(this->z),
density_adjusted,
this->spacing,
ceil(bb.size()(0) / distance) + 1.,
ceil(bb.size()(1) / distance) + 1.);
auto scalar_field = [&](float x, float y) {
// TPMS-D
float a_x = myperiod * x;
float b_y = myperiod * y;
float r = get_cos(a_x) * get_cos(b_y) * cos_z - get_sin(a_x) * get_sin(b_y) * sin_z;
return r;
};
// shift the polyline to the grid origin
for (Polyline &pl : polylines)
pl.translate(bb.min);
std::vector<std::vector<MarchingSquares::Point>> posxy;
int i = 0, j = 0;
std::vector<MarchingSquares::Point> allptpos;
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);
polylines = intersection_pl(polylines, expolygon);
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());
}
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);
if (!polylines.empty()) {
// connect lines
size_t polylines_out_first_idx = polylines_out.size();
if (params.dont_connect())
append(polylines_out, chain_polylines(polylines));
if (! polylines.empty()) {
// connect lines
size_t polylines_out_first_idx = polylines_out.size();
if (params.dont_connect())
append(polylines_out, chain_polylines(polylines));
else
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) {
for (auto it = polylines_out.begin() + polylines_out_first_idx; it != polylines_out.end(); ++it)
it->rotate(infill_angle);
}
for (auto it = polylines_out.begin() + polylines_out_first_idx; it != polylines_out.end(); ++ it)
it->rotate(infill_angle);
}
}
}

View file

@ -1,19 +1,25 @@
#ifndef slic3r_FillTpmsD_hpp_
#define slic3r_FillTpmsD_hpp_
#include "../libslic3r.h"
#include <utility>
#include "libslic3r/libslic3r.h"
#include "FillBase.hpp"
#include "libslic3r/ExPolygon.hpp"
#include "libslic3r/Polyline.hpp"
namespace Slic3r {
class Point;
class FillTpmsD : public Fill
{
public:
FillTpmsD();
FillTpmsD() {}
Fill* clone() const override { return new FillTpmsD(*this); }
// require bridge flow since most of this pattern hangs in air
bool use_bridge_flow() const override { return false; }
// Correction applied to regular infill angle to maximize printing
// speed in default configuration (degrees)
@ -24,8 +30,17 @@ public:
const std::pair<float, Point>& direction,
ExPolygon expolygon,
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
#endif // slic3r_FillTpmsD_hpp_
#endif // slic3r_FillTpmsD_hpp_

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 this->mm3_per_mm() < rhs.mm3_per_mm();
}
Flow with_width (float width) const {
assert(! m_bridge);
return Flow(width, m_height, rounded_rectangle_extrusion_spacing(width, m_height), m_nozzle_diameter, m_bridge);

View file

@ -507,4 +507,11 @@ BoundingBox get_extents_rotated(const MultiPoint &mp, double 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);
}
}
}

View file

@ -94,7 +94,7 @@ public:
bool intersection(const Line& line, Point* intersection) const;
bool first_intersection(const Line& line, Point* intersection) 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 visivalingam(const Points& pts, const double tolerance);
static Points concave_hull_2d(const Points& pts, const double tolerence);

View file

@ -783,10 +783,10 @@ bool Preset::has_cali_lines(PresetBundle* preset_bundle)
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",
"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",
"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",
"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",
@ -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",
"filename_format", "wall_filament", "support_bottom_z_distance",
"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",
"inner_wall_line_width", "outer_wall_line_width", "sparse_infill_line_width", "internal_solid_infill_line_width",
"ooze_prevention", "standby_temperature_delta", "preheat_time","preheat_steps", "interface_shells", "line_width", "initial_layer_line_width", "inner_wall_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",
"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",

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))
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())
if (!validate_extrusion_width(region.config(), opt_key, layer_height, err_msg))
return {err_msg, object, opt_key};

File diff suppressed because it is too large Load diff

View file

@ -60,7 +60,7 @@ enum AuthorizationType {
enum InfillPattern : int {
ipConcentric, ipRectilinear, ipGrid, ip2DLattice, ipLine, ipCubic, ipTriangles, ipStars, ipGyroid, ipTpmsD, ipHoneycomb, ipAdaptiveCubic, ipMonotonic, ipMonotonicLine, ipAlignedRectilinear, ip2DHoneycomb, ip3DHoneycomb,
ipHilbertCurve, ipArchimedeanChords, ipOctagramSpiral, ipSupportCubic, ipSupportBase, ipConcentricInternal,
ipLightning, ipCrossHatch, ipQuarterCubic,
ipLightning, ipCrossHatch, ipQuarterCubic, ipZigZag, ipCrossZag, ipLockedZag,
ipCount,
};
@ -952,6 +952,8 @@ PRINT_CONFIG_CLASS_DEFINE(
((ConfigOptionFloat, bridge_speed))
((ConfigOptionFloatOrPercent, internal_bridge_speed))
((ConfigOptionEnum<EnsureVerticalShellThickness>, ensure_vertical_shell_thickness))
((ConfigOptionPercent, top_surface_density))
((ConfigOptionPercent, bottom_surface_density))
((ConfigOptionEnum<InfillPattern>, top_surface_pattern))
((ConfigOptionEnum<InfillPattern>, bottom_surface_pattern))
((ConfigOptionEnum<InfillPattern>, internal_solid_infill_pattern))
@ -959,7 +961,10 @@ PRINT_CONFIG_CLASS_DEFINE(
((ConfigOptionFloat, outer_wall_speed))
((ConfigOptionFloat, 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))
((ConfigOptionEnum<InfillPattern>, sparse_infill_pattern))
((ConfigOptionFloat, lattice_angle_1))
@ -979,7 +984,12 @@ PRINT_CONFIG_CLASS_DEFINE(
((ConfigOptionPercent, infill_wall_overlap))
((ConfigOptionPercent, top_bottom_infill_wall_overlap))
((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))
// Orca:
((ConfigOptionFloatOrPercent, infill_combination_max_layer_height))

View file

@ -1073,9 +1073,10 @@ bool PrintObject::invalidate_state_by_config_options(
|| opt_key == "sparse_infill_filament"
|| opt_key == "solid_infill_filament"
|| opt_key == "sparse_infill_line_width"
|| opt_key == "skin_infill_line_width"
|| opt_key == "skeleton_infill_line_width"
|| opt_key == "infill_direction"
|| opt_key == "solid_infill_direction"
|| opt_key == "rotate_solid_infill_direction"
|| opt_key == "ensure_vertical_shell_thickness"
|| opt_key == "bridge_angle"
|| 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_max"
|| opt_key == "top_surface_line_width"
|| opt_key == "top_surface_density"
|| opt_key == "bottom_surface_density"
|| opt_key == "initial_layer_line_width"
|| opt_key == "small_area_infill_flow_compensation"
|| opt_key == "lattice_angle_1"
|| opt_key == "lattice_angle_2"
|| opt_key == "infill_overhang_angle") {
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);
} else if (opt_key == "sparse_infill_density") {
// One likely wants to reslice only when switching between zero infill to simulate boolean difference (subtracting volumes),

View file

@ -665,8 +665,8 @@ if (SLIC3R_STATIC)
target_compile_definitions(libslic3r_gui PUBLIC -DwxDEBUG_LEVEL=0)
endif()
if (HAVE_SPNAV)
target_link_libraries(libslic3r_gui spnav)
if (SPNAV_LIB)
target_link_libraries(libslic3r_gui ${SPNAV_LIB})
endif()
if (SLIC3R_STATIC AND NOT SLIC3R_STATIC_EXCLUDE_CURL AND UNIX AND NOT APPLE)

View file

@ -49,7 +49,7 @@ void BedShape::append_option_line(ConfigOptionsGroupShp optgroup, Parameter para
def.min = 0;
def.max = 214700;
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.tooltip = L("Size in X and Y of the rectangular plate.");
key = "rect_size";
@ -60,7 +60,7 @@ void BedShape::append_option_line(ConfigOptionsGroupShp optgroup, Parameter para
def.min = -107350;
def.max = 107350;
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.tooltip = L("Distance of the 0,0 G-code coordinate from the front left corner of the rectangle.");
key = "rect_origin";
@ -69,7 +69,7 @@ void BedShape::append_option_line(ConfigOptionsGroupShp optgroup, Parameter para
def.type = coFloat;
def.set_default_value(new ConfigOptionFloat(200));
def.width = 10; // match size
def.sidetext = L("mm");
def.sidetext = "mm"; // milimeters, don't need translation
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.");
key = "diameter";

View file

@ -313,7 +313,7 @@ void CaliPresetCustomRangePanel::create_panel(wxWindow* parent)
m_title_texts[i]->Wrap(-1);
m_title_texts[i]->SetFont(::Label::Body_14);
item_sizer->Add(m_title_texts[i], 0, wxALL, 0);
m_value_inputs[i] = new TextInput(parent, wxEmptyString, 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()->Bind(wxEVT_TEXT, [this, i](wxCommandEvent& event) {
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_text = new Label(parent, _L("Nozzle temperature"));
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);
nozzle_temp_sizer->Add(nozzle_temp_text, 0, wxALIGN_LEFT);
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);
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);
m_max_volumetric_speed->GetTextCtrl()->SetValue(flow_val_text);

View file

@ -472,6 +472,20 @@ void ConfigManipulation::update_print_fff_config(DynamicPrintConfig* config, con
apply(config, &new_conf);
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)
@ -526,7 +540,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, co
bool have_infill = config->option<ConfigOptionPercent>("sparse_infill_density")->value > 0;
// sparse_infill_filament uses the same logic as in Print::extruders()
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);
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;
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");
toggle_line("spiral_mode_smooth", has_spiral_vase);
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",
"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);
@ -823,6 +850,22 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, co
for (auto el : { "lattice_angle_1", "lattice_angle_2"})
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);
}

View file

@ -278,7 +278,7 @@ PrinterPicker::PrinterPicker(wxWindow *parent, const VendorProfile &vendor, wxSt
const auto &variant = model.variants[i];
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);
if (i == 1) {
@ -1353,7 +1353,7 @@ PageDiameters::PageDiameters(ConfigWizard *parent)
auto *sizer_nozzle = new wxFlexGridSizer(3, 5, 5);
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->Add(text_nozzle, 0, wxALIGN_CENTRE_VERTICAL);
sizer_nozzle->Add(diam_nozzle);
@ -1367,7 +1367,7 @@ PageDiameters::PageDiameters(ConfigWizard *parent)
auto *sizer_filam = new wxFlexGridSizer(3, 5, 5);
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->Add(text_filam, 0, wxALIGN_CENTRE_VERTICAL);
sizer_filam->Add(diam_filam);
@ -1448,7 +1448,7 @@ PageTemperatures::PageTemperatures(ConfigWizard *parent)
auto *sizer_extr = new wxFlexGridSizer(3, 5, 5);
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->Add(text_extr, 0, wxALIGN_CENTRE_VERTICAL);
sizer_extr->Add(spin_extr);
@ -1462,7 +1462,7 @@ PageTemperatures::PageTemperatures(ConfigWizard *parent)
auto *sizer_bed = new wxFlexGridSizer(3, 5, 5);
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->Add(text_bed, 0, wxALIGN_CENTRE_VERTICAL);
sizer_bed->Add(spin_bed);

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
horizontal_sizer->Add(length_sizer, 0, wxEXPAND | wxLEFT | wxTOP | wxALIGN_CENTER_VERTICAL, FromDIP(10));
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);
m_bed_size_x_input->GetTextCtrl()->SetValidator(validator);
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
horizontal_sizer->Add(width_sizer, 0, wxEXPAND | wxLEFT | wxTOP | wxALIGN_CENTER_VERTICAL, FromDIP(10));
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);
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));
@ -1903,7 +1903,7 @@ wxBoxSizer *CreatePrinterPresetDialog::create_origin_item(wxWindow *parent)
// 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));
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);
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
@ -1913,7 +1913,7 @@ wxBoxSizer *CreatePrinterPresetDialog::create_origin_item(wxWindow *parent)
// 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));
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);
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));
@ -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));
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);
m_print_height_input->GetTextCtrl()->SetValidator(validator);
hight_input_sizer->Add(m_print_height_input, 0, wxEXPAND | wxLEFT, FromDIP(5));

View file

@ -3316,7 +3316,7 @@ int MachineObject::parse_json(std::string payload, bool key_field_only)
if (jj.contains("errno")) {
if (jj["errno"].is_number()) {
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.");
GUI::wxGetApp().push_notification(text);
}
@ -3330,11 +3330,11 @@ int MachineObject::parse_json(std::string payload, bool key_field_only)
wxString text;
if (jj["errno"].get<int>() == -2) {
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) {
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 __WXOSX__

View file

@ -127,21 +127,21 @@ void ExtrusionCalibration::create()
wxWindow::GetTextExtent(_L("Bed Temperature")).x),
wxWindow::GetTextExtent(_L("Max volumetric speed")).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->AddSpacer(FromDIP(4));
nozzle_temp_sizer->Add(m_nozzle_temp, 0, wxEXPAND);
auto bed_temp_sizer = new wxBoxSizer(wxVERTICAL);
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->AddSpacer(FromDIP(4));
bed_temp_sizer->Add(m_bed_temp, 0, wxEXPAND);
auto max_flow_sizer = new wxBoxSizer(wxVERTICAL);
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->AddSpacer(FromDIP(4));
max_flow_sizer->Add(m_max_flow_ratio, 0, wxEXPAND);

View file

@ -430,6 +430,16 @@ void Field::get_value_by_opt_type(wxString& str, const bool check_value/* = true
str = str_out;
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);

View file

@ -4606,13 +4606,13 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv
auto upto_label = [](double z) {
char buf[64];
::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) {
char buf[64];
::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) {
@ -4620,7 +4620,7 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv
::sprintf(buf1, "%.2f", z1);
char buf2[64];
::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) {

View file

@ -4104,6 +4104,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
}
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)) {
m_mouse.drag.move_requires_threshold = false;
@ -4305,7 +4306,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
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;
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
else if (is_camera_rotate(evt)) {
else if (is_camera_rotate(evt, swapMouseButtons)) {
// Orca: Sphere rotation for painting view
// if dragging over blank area with left button, rotate
if ((any_gizmo_active || m_hover_volume_idxs.empty()) && m_mouse.is_start_position_3D_defined()) {
// if dragging over blank area with left button or button functions swapped then rotate
if ((any_gizmo_active || swapMouseButtons || m_hover_volume_idxs.empty()) && m_mouse.is_start_position_3D_defined()) {
Camera& camera = wxGetApp().plater()->get_camera();
auto mult_pref = wxGetApp().app_config->get("camera_orbit_mult");
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_mouse.ignore_right_up = true; // will be reset on button up event even if not right button is pressed
}
m_camera_movement = true;
m_mouse.drag.start_position_3D = Vec3d((double)pos(0), (double)pos(1), 0.0);
}
else if (is_camera_pan(evt)) {
// If dragging over blank area with right button, pan.
else if (is_camera_pan(evt, swapMouseButtons)) {
// 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()) {
// get point in model space at Z = 0
float z = 0.0f;
@ -4407,7 +4410,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
camera.set_target(camera.get_target() + orig - cur_pos);
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;
@ -4415,10 +4418,10 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
}
}
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>();
if (evt.LeftUp()) {
if (swapMouseButtons ? evt.RightUp() : evt.LeftUp()) {
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");
}
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) {
return evt.Moving() && evt.AltDown() && !evt.ShiftDown();
} 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) {
return evt.Moving() && evt.ShiftDown() && !evt.AltDown();
} else {
return evt.Dragging() && (evt.MiddleIsDown() || evt.RightIsDown());
return evt.Dragging() && (evt.MiddleIsDown() || (buttonsSwapped ? evt.LeftIsDown() : evt.RightIsDown()));
}
}

View file

@ -216,7 +216,7 @@ class GLCanvas3D
};
static const float THICKNESS_BAR_WIDTH;
// Orca: Shrinkage compensation
void set_shrinkage_compensation(const Vec3d &shrinkage_compensation) { m_shrinkage_compensation = shrinkage_compensation; };
@ -232,7 +232,7 @@ class GLCanvas3D
// Owned by LayersEditing.
SlicingParameters* m_slicing_parameters{ nullptr };
std::vector<double> m_layer_height_profile;
// Orca: Shrinkage compensation to apply when we need to use object_max_z with Z compensation.
Vec3d m_shrinkage_compensation{ Vec3d::Ones() };
@ -968,8 +968,8 @@ public:
void on_set_focus(wxFocusEvent& evt);
void force_set_focus();
bool is_camera_rotate(const wxMouseEvent& evt) const;
bool is_camera_pan(const wxMouseEvent& evt) const;
bool is_camera_rotate(const wxMouseEvent& evt, const bool buttonsSwapped) const;
bool is_camera_pan(const wxMouseEvent& evt, const bool buttonsSwapped) const;
Size get_canvas_size() const;
Vec2d get_local_mouse_position() const;
@ -1063,7 +1063,7 @@ public:
bool is_overhang_shown() const { return m_slope.is_GlobalUsed(); }
void show_overhang(bool show) { m_slope.globalUse(show); }
bool is_using_slope() const { return m_slope.is_used(); }
void use_slope(bool use) { m_slope.use(use); }
void set_slope_normal_angle(float angle_in_deg) { m_slope.set_normal_angle(angle_in_deg); }

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("Strength"), {{"wall_loops", "",1},{"top_shell_layers", L("Top Solid Layers"),1},{"top_shell_thickness", L("Top Minimum Shell Thickness"),1},
{"bottom_shell_layers", L("Bottom Solid Layers"),1}, {"bottom_shell_thickness", L("Bottom 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_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},
{"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},
{"enable_overhang_speed", "",6}, {"overhang_1_4_speed", "",7}, {"overhang_2_4_speed", "",8}, {"overhang_3_4_speed", "",9}, {"overhang_4_4_speed", "",10},
@ -523,7 +523,7 @@ wxMenu* MenuFactory::append_submenu_add_generic(wxMenu* menu, ModelVolumeType ty
append_menu_item_add_text(sub_menu, type);
append_menu_item_add_svg(sub_menu, type);
return sub_menu;
}
@ -619,7 +619,7 @@ static void append_menu_itemm_add_(const wxString& name, GLGizmosManager::EType
} else {
svg->create_volume(volume_type);
}
}
}
};
if (type == ModelVolumeType::MODEL_PART || type == ModelVolumeType::NEGATIVE_VOLUME || type == ModelVolumeType::PARAMETER_MODIFIER ||
@ -1131,7 +1131,7 @@ void MenuFactory::append_menu_item_edit_text(wxMenu *menu)
auto can_edit_text = []() {
if (plater() == nullptr)
return false;
return false;
const Selection& selection = plater()->get_selection();
if (selection.volumes_count() != 1)
return false;
@ -1141,7 +1141,7 @@ void MenuFactory::append_menu_item_edit_text(wxMenu *menu)
const ModelVolume *volume = get_model_volume(*gl_volume, selection.get_model()->objects);
if (volume == nullptr)
return false;
return volume->is_text();
return volume->is_text();
};
if (menu != &m_text_part_menu) {
@ -1168,7 +1168,7 @@ void MenuFactory::append_menu_item_edit_svg(wxMenu *menu)
wxString name = _L("Edit SVG");
auto can_edit_svg = []() {
if (plater() == nullptr)
return false;
return false;
const Selection& selection = plater()->get_selection();
if (selection.volumes_count() != 1)
return false;
@ -1178,7 +1178,7 @@ void MenuFactory::append_menu_item_edit_svg(wxMenu *menu)
const ModelVolume *volume = get_model_volume(*gl_volume, selection.get_model()->objects);
if (volume == nullptr)
return false;
return volume->is_svg();
return volume->is_svg();
};
if (menu != &m_svg_part_menu) {

View file

@ -8,6 +8,8 @@
#include "GLCanvas3D.hpp"
#include "Plater.hpp"
#include "Widgets/LabeledStaticBox.hpp"
#include <boost/algorithm/string.hpp>
#include "I18N.hpp"
@ -29,7 +31,9 @@ ObjectLayers::ObjectLayers(wxWindow* parent) :
m_og->activate();
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_add = ScalableBitmap(parent, "add");
@ -74,7 +78,7 @@ wxSizer* ObjectLayers::create_layer(const t_layer_height_range& range, PlusMinus
};
// 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->SetFont(wxGetApp().normal_font());
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);
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->SetFont(wxGetApp().normal_font());
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);
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->SetFont(wxGetApp().normal_font());
sizer2->Add(unit_text, 0, wxALIGN_CENTER_VERTICAL);
m_grid_sizer->Add(sizer2);
m_grid_sizer->Add(sizer2, 0, wxALIGN_CENTER_VERTICAL);
// BBS
// 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);
//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->SetFont(wxGetApp().normal_font());
//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) {
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->SetBackgroundColour(m_parent->GetBackgroundColour());
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->SetBackgroundColour(m_parent->GetBackgroundColour());
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());
auto sizer = create_layer(range, del_btn, add_btn);
sizer->Add(del_btn, 0, wxRIGHT | wxLEFT, em_unit(m_parent));
sizer->Add(add_btn);
auto b_sizer = new wxBoxSizer(wxHORIZONTAL);
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 &) {
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
// 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]() {
m_og->ctrl_parent()->Freeze();
// Delete all controls from options group
m_grid_sizer->Clear(true);
@ -228,8 +236,10 @@ void ObjectLayers::update_layers_list()
else
create_layer(range, nullptr, nullptr);
m_og->ctrl_parent()->Thaw();
m_parent->Layout();
});
});
}
void ObjectLayers::update_scene_from_editor_selection() const
@ -340,7 +350,7 @@ LayerRangeEditor::LayerRangeEditor( ObjectLayers* parent,
m_valid_value(value),
m_type(type),
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
#ifdef _WIN32
| wxBORDER_SIMPLE

View file

@ -22,6 +22,7 @@
#include "MsgDialog.hpp"
#include "Widgets/ProgressDialog.hpp"
#include "SingleChoiceDialog.hpp"
#include "StepMeshDialog.hpp"
#include <boost/algorithm/string.hpp>
#include <wx/progdlg.h>
@ -2031,15 +2032,49 @@ void ObjectList::load_modifier(const wxArrayString& input_files, ModelObject& mo
dlg.Update(static_cast<int>(100.0f * static_cast<float>(i) / static_cast<float>(input_files.size())),
_L("Loading file") + ": " + from_path(boost::filesystem::path(input_file).filename()));
dlg.Fit();
bool is_user_cancel = false;
Model model;
try {
model = Model::read_from_file(input_file, nullptr, nullptr, LoadStrategy::LoadModel);
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);
}
}
catch (std::exception&) {
// auto msg = _L("Error!") + " " + input_file + " : " + e.what() + ".";
auto msg = _L("Error!") + " " + _L("Failed to get the model data in the current file.");
show_error(parent, msg);
if (!is_user_cancel) {
// auto msg = _L("Error!") + " " + input_file + " : " + e.what() + ".";
auto msg = _L("Error!") + " " + _L("Failed to get the model data in the current file.");
show_error(parent, msg);
}
return;
}

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