Merge branch 'main' into feature/OrcaFilamentLibrary

This commit is contained in:
SoftFever 2025-01-22 21:42:13 +08:00 committed by GitHub
commit 1df52936f2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
75 changed files with 6670 additions and 6405 deletions

View file

@ -99,7 +99,7 @@ jobs:
cache: true cache: true
- name: Deploy Flatpak to nightly release - name: Deploy Flatpak to nightly release
if: ${{github.ref == 'refs/heads/main'}} if: ${{github.ref == 'refs/heads/main'}}
uses: WebFreak001/deploy-nightly@v3.1.0 uses: WebFreak001/deploy-nightly@v3.2.0
with: with:
upload_url: https://uploads.github.com/repos/SoftFever/OrcaSlicer/releases/137995723/assets{?name,label} upload_url: https://uploads.github.com/repos/SoftFever/OrcaSlicer/releases/137995723/assets{?name,label}
release_id: 137995723 release_id: 137995723

View file

@ -66,8 +66,11 @@ jobs:
working-directory: ${{ github.workspace }} working-directory: ${{ github.workspace }}
run: | run: |
choco install strawberryperl choco install strawberryperl
mkdir ${{ github.workspace }}/deps/build $Folder = ${{ github.workspace }}/deps/build
mkdir ${{ github.workspace }}/deps/build/OrcaSlicer_dep if (!(Test-Path -Path $Folder)) {
mkdir ${{ github.workspace }}/deps/build
mkdir ${{ github.workspace }}/deps/build/OrcaSlicer_dep
}
.\build_release_vs2022.bat deps .\build_release_vs2022.bat deps
.\build_release_vs2022.bat pack .\build_release_vs2022.bat pack
cd ${{ github.workspace }}/deps/build cd ${{ github.workspace }}/deps/build

View file

@ -143,7 +143,7 @@ jobs:
- name: Deploy Mac release - name: Deploy Mac release
if: github.ref == 'refs/heads/main' && inputs.os == 'macos-14' if: github.ref == 'refs/heads/main' && inputs.os == 'macos-14'
uses: WebFreak001/deploy-nightly@v3.1.0 uses: WebFreak001/deploy-nightly@v3.2.0
with: with:
upload_url: https://uploads.github.com/repos/SoftFever/OrcaSlicer/releases/137995723/assets{?name,label} upload_url: https://uploads.github.com/repos/SoftFever/OrcaSlicer/releases/137995723/assets{?name,label}
release_id: 137995723 release_id: 137995723
@ -212,7 +212,7 @@ jobs:
- name: Deploy Windows release portable - name: Deploy Windows release portable
if: github.ref == 'refs/heads/main' && inputs.os == 'windows-latest' if: github.ref == 'refs/heads/main' && inputs.os == 'windows-latest'
uses: WebFreak001/deploy-nightly@v3.1.0 uses: WebFreak001/deploy-nightly@v3.2.0
with: with:
upload_url: https://uploads.github.com/repos/SoftFever/OrcaSlicer/releases/137995723/assets{?name,label} upload_url: https://uploads.github.com/repos/SoftFever/OrcaSlicer/releases/137995723/assets{?name,label}
release_id: 137995723 release_id: 137995723
@ -223,7 +223,7 @@ jobs:
- name: Deploy Windows release installer - name: Deploy Windows release installer
if: github.ref == 'refs/heads/main' && inputs.os == 'windows-latest' if: github.ref == 'refs/heads/main' && inputs.os == 'windows-latest'
uses: WebFreak001/deploy-nightly@v3.1.0 uses: WebFreak001/deploy-nightly@v3.2.0
with: with:
upload_url: https://uploads.github.com/repos/SoftFever/OrcaSlicer/releases/137995723/assets{?name,label} upload_url: https://uploads.github.com/repos/SoftFever/OrcaSlicer/releases/137995723/assets{?name,label}
release_id: 137995723 release_id: 137995723
@ -290,7 +290,7 @@ jobs:
if: ${{ ! env.ACT && github.ref == 'refs/heads/main' && (inputs.os == 'ubuntu-20.04' || inputs.os == 'ubuntu-24.04') }} if: ${{ ! env.ACT && github.ref == 'refs/heads/main' && (inputs.os == 'ubuntu-20.04' || inputs.os == 'ubuntu-24.04') }}
env: env:
ubuntu-ver-str: ${{ (inputs.os == 'ubuntu-24.04' && '_Ubuntu2404') || '' }} ubuntu-ver-str: ${{ (inputs.os == 'ubuntu-24.04' && '_Ubuntu2404') || '' }}
uses: WebFreak001/deploy-nightly@v3.1.0 uses: WebFreak001/deploy-nightly@v3.2.0
with: with:
upload_url: https://uploads.github.com/repos/SoftFever/OrcaSlicer/releases/137995723/assets{?name,label} upload_url: https://uploads.github.com/repos/SoftFever/OrcaSlicer/releases/137995723/assets{?name,label}
release_id: 137995723 release_id: 137995723
@ -301,7 +301,7 @@ jobs:
- name: Deploy orca_custom_preset_tests - name: Deploy orca_custom_preset_tests
if: ${{ ! env.ACT && github.ref == 'refs/heads/main' && inputs.os == 'ubuntu-20.04' }} if: ${{ ! env.ACT && github.ref == 'refs/heads/main' && inputs.os == 'ubuntu-20.04' }}
uses: WebFreak001/deploy-nightly@v3.1.0 uses: WebFreak001/deploy-nightly@v3.2.0
with: with:
upload_url: https://uploads.github.com/repos/SoftFever/OrcaSlicer/releases/137995723/assets{?name,label} upload_url: https://uploads.github.com/repos/SoftFever/OrcaSlicer/releases/137995723/assets{?name,label}
release_id: 137995723 release_id: 137995723

View file

@ -1,5 +1,5 @@
<h1> <p "font-size:200px;"><img align="left" src="https://github.com/KDW06/OrcaSlicer/blob/main/resources/images/OrcaSlicer.ico" width="100"> Orca Slicer</p> </h1> <h1> <p "font-size:200px;"><img align="left" src="https://github.com/SoftFever/OrcaSlicer/blob/main/resources/images/OrcaSlicer.ico" width="100"> Orca Slicer</p> </h1>
[![Build all](https://github.com/SoftFever/OrcaSlicer/actions/workflows/build_all.yml/badge.svg?branch=main)](https://github.com/SoftFever/OrcaSlicer/actions/workflows/build_all.yml) [![Build all](https://github.com/SoftFever/OrcaSlicer/actions/workflows/build_all.yml/badge.svg?branch=main)](https://github.com/SoftFever/OrcaSlicer/actions/workflows/build_all.yml)
<br>Orca Slicer is an open source slicer for FDM printers. <br>Orca Slicer is an open source slicer for FDM printers.
@ -10,12 +10,16 @@ Join our Discord community here:<br>
<h3>🚨🚨🚨Important Security Alert🚨🚨🚨</h3> <h3>🚨🚨🚨Important Security Alert🚨🚨🚨</h3>
Please be aware that "**orcaslicer.net**" or "**orcaslicer.info**" are NOT an official website for OrcaSlicer and may be potentially malicious. This site appears to use AI-generated content, lacking genuine context, and seems to exist solely to profit from advertisements. Worse, it may redirect download links to harmful sources. For your safety, avoid downloading OrcaSlicer from this site as the links may be compromised. Please be aware that "**orcaslicer.net**" or "**orcaslicer.info**" are NOT an official website for OrcaSlicer and may be potentially malicious. These sites appear to use AI-generated content, lacking genuine context and seems to exist solely to profit from advertisements. Worse, it may redirect download links to harmful sources. For your safety, avoid downloading OrcaSlicer from this site as the links may be compromised.
If you see the above sites in your searches, report them as spam or unsafe to the search engine. This small action will assist everyone.
The only official platforms for OrcaSlicer are our GitHub project page and the <a href="https://discord.gg/P4VE9UY9gJ">official Discord channel</a> . The only official platforms for OrcaSlicer are our GitHub project page and the <a href="https://discord.gg/P4VE9UY9gJ">official Discord channel</a> .
We deeply value our OrcaSlicer community and appreciate all the social groups that support us. However, it is crucial to address the risk posed by any group that falsely claims to be official or misleads its members. If you encounter such a group or are part of one, please assist by encouraging the group owner to add a clear disclaimer or by alerting its members. We deeply value our OrcaSlicer community and appreciate all the social groups that support us. However, it is crucial to address the risk posed by any group that falsely claims to be official or misleads its members. If you encounter such a group or are part of one, please assist by encouraging the group owner to add a clear disclaimer or by alerting its members.
Thank you for your vigilance and support in keeping our community safe! Thank you for your vigilance and support in keeping our community safe!
# Main features # Main features
@ -129,7 +133,7 @@ resolution: 0.1
``` ```
# Supports # Supports
**Orca Slicer** is an open-source project, and I'm deeply grateful to all my sponsors and backers. **Orca Slicer** is an open-source project and I'm deeply grateful to all my sponsors and backers.
Their generous support enables me to purchase filaments and other essential 3D printing materials for the project. Their generous support enables me to purchase filaments and other essential 3D printing materials for the project.
Thank you! :) Thank you! :)

View file

@ -1318,7 +1318,7 @@ msgid "Esc"
msgstr "Esc" msgstr "Esc"
msgid "Cancel a feature until exit" msgid "Cancel a feature until exit"
msgstr "" msgstr "Cancelar una característica hasta salir"
msgid "Measure" msgid "Measure"
msgstr "Medir" msgstr "Medir"
@ -1326,16 +1326,18 @@ msgstr "Medir"
msgid "" msgid ""
"Please confirm explosion ratio = 1,and please select at least one object" "Please confirm explosion ratio = 1,and please select at least one object"
msgstr "" msgstr ""
"Por favor, confirma que el ratio de explosión = 1, por favor seleccione al "
"menos un objeto"
msgid "Please select at least one object." msgid "Please select at least one object."
msgstr "" msgstr "Por favor seleccione al menos un objeto."
msgid "Edit to scale" msgid "Edit to scale"
msgstr "Editar a escala" msgstr "Editar a escala"
msgctxt "Verb" msgctxt "Verb"
msgid "Scale all" msgid "Scale all"
msgstr "" msgstr "Escalar todo"
msgid "None" msgid "None"
msgstr "Ninguno" msgstr "Ninguno"
@ -1350,40 +1352,47 @@ msgid "Selection"
msgstr "Selección" msgstr "Selección"
msgid " (Moving)" msgid " (Moving)"
msgstr "" msgstr "(Moviendo)"
msgid "" msgid ""
"Select 2 faces on objects and \n" "Select 2 faces on objects and \n"
" make objects assemble together." " make objects assemble together."
msgstr "" msgstr ""
"Selecciona 2 caras en un objeto y \n"
"haz que los objetos se ensamblen juntos."
msgid "" msgid ""
"Select 2 points or circles on objects and \n" "Select 2 points or circles on objects and \n"
" specify distance between them." " specify distance between them."
msgstr "" msgstr ""
"Selecciona 2 puntos o círculos en un objeto y \n"
"especifica la distancia entre ellos."
msgid "Face" msgid "Face"
msgstr "" msgstr "Cara"
msgid " (Fixed)" msgid " (Fixed)"
msgstr "" msgstr "(Solucionado)"
msgid "Point" msgid "Point"
msgstr "" msgstr "Punto"
msgid "" msgid ""
"Feature 1 has been reset, \n" "Feature 1 has been reset, \n"
"feature 2 has been feature 1" "feature 2 has been feature 1"
msgstr "" msgstr ""
"Característica 1 se ha reiniciado.\n"
"característica 2 ha sido característica 1"
msgid "Warning:please select Plane's feature." msgid "Warning:please select Plane's feature."
msgstr "" msgstr "Advertencia: por favor selecciona la característica del Plano."
msgid "Warning:please select Point's or Circle's feature." msgid "Warning:please select Point's or Circle's feature."
msgstr "" msgstr ""
"Advertencia: por favor selecciona la característica del Punto o Círculo"
msgid "Warning:please select two different mesh." msgid "Warning:please select two different mesh."
msgstr "" msgstr "Advertencia: por favor selecciona dos malla distintas"
msgid "Copy to clipboard" msgid "Copy to clipboard"
msgstr "Copiar al portapapeles" msgstr "Copiar al portapapeles"
@ -1401,25 +1410,25 @@ msgid "Distance XYZ"
msgstr "Distancia XYZ" msgstr "Distancia XYZ"
msgid "Parallel" msgid "Parallel"
msgstr "" msgstr "Paralelo"
msgid "Center coincidence" msgid "Center coincidence"
msgstr "" msgstr "Centrar coincidencía"
msgid "Featue 1" msgid "Featue 1"
msgstr "" msgstr "Característica 1"
msgid "Reverse rotation" msgid "Reverse rotation"
msgstr "" msgstr "Revertir Rotación"
msgid "Rotate around center:" msgid "Rotate around center:"
msgstr "" msgstr "Rotar alrededor del centro:"
msgid "Parallel distance:" msgid "Parallel distance:"
msgstr "" msgstr "Distancia paralela:"
msgid "Flip by Face 2" msgid "Flip by Face 2"
msgstr "" msgstr "Voltear por la cara 2"
msgid "Ctrl+" msgid "Ctrl+"
msgstr "Ctrl+" msgstr "Ctrl+"
@ -3720,9 +3729,9 @@ msgstr ""
#, c-format, boost-format #, c-format, boost-format
msgid "" msgid ""
"Current chamber temperature is higher than the material's safe " "Current chamber temperature is higher than the material's safe temperature,"
"temperature,it may result in material softening and clogging.The maximum " "it may result in material softening and clogging.The maximum safe "
"safe temperature for the material is %d" "temperature for the material is %d"
msgstr "" msgstr ""
"La temperatura actual de la cámara es superior a la temperatura de seguridad " "La temperatura actual de la cámara es superior a la temperatura de seguridad "
"del material, puede provocar que el material se ablande y se atasque. La " "del material, puede provocar que el material se ablande y se atasque. La "
@ -8007,12 +8016,14 @@ msgid "Nozzle temperature when printing"
msgstr "Temperatura de la boquilla al imprimir" msgstr "Temperatura de la boquilla al imprimir"
msgid "Cool Plate (SuperTack)" msgid "Cool Plate (SuperTack)"
msgstr "" msgstr "Bandeja Fría (SuperTack)"
msgid "" msgid ""
"Bed temperature when cool plate is installed. Value 0 means the filament " "Bed temperature when cool plate is installed. Value 0 means the filament "
"does not support to print on the Cool Plate SuperTack" "does not support to print on the Cool Plate SuperTack"
msgstr "" msgstr ""
"Temperatura de cama cuando la bandeja fría está instalada. Valor 0 significa "
"que el filamento no es compatible para imprimir en la bandeja fría SuperTack"
msgid "Cool Plate" msgid "Cool Plate"
msgstr "Bandeja Fría" msgstr "Bandeja Fría"
@ -8250,7 +8261,7 @@ msgid "Layer height limits"
msgstr "Límites de altura de la capa" msgstr "Límites de altura de la capa"
msgid "Z-Hop" msgid "Z-Hop"
msgstr "" msgstr "Salto en Z"
msgid "Retraction when switching material" msgid "Retraction when switching material"
msgstr "Retracción al cambiar de material" msgstr "Retracción al cambiar de material"
@ -9834,8 +9845,8 @@ msgstr ""
"contener el nombre de host, la dirección IP o la URL de la instancia de la " "contener el nombre de host, la dirección IP o la URL de la instancia de la "
"impresora. Se puede acceder a la impresora detrás de un proxy con la " "impresora. Se puede acceder a la impresora detrás de un proxy con la "
"autenticación básica activada por un nombre de usuario y contraseña en la " "autenticación básica activada por un nombre de usuario y contraseña en la "
"URL en el siguiente formato: https://" "URL en el siguiente formato: https://nombredeusuario:"
"nombredeusuario:contraseña@tudirecciondeoctopi/" "contraseña@tudirecciondeoctopi/"
msgid "Device UI" msgid "Device UI"
msgstr "IU de dispositivo" msgstr "IU de dispositivo"
@ -9982,6 +9993,8 @@ msgid ""
"Bed temperature of the initial layer. Value 0 means the filament does not " "Bed temperature of the initial layer. Value 0 means the filament does not "
"support to print on the Cool Plate SuperTack" "support to print on the Cool Plate SuperTack"
msgstr "" msgstr ""
"Temperatura de cama de la capa inicial. Valor 0 significa que el filamento "
"no es compatible para imprimir en la Bandeja Fría SuperTack"
msgid "" msgid ""
"Bed temperature of the initial layer. Value 0 means the filament does not " "Bed temperature of the initial layer. Value 0 means the filament does not "
@ -11930,8 +11943,8 @@ msgid "mm/s² or %"
msgstr "mm/s² o %" msgstr "mm/s² o %"
msgid "" msgid ""
"Acceleration of sparse infill. If the value is expressed as a percentage " "Acceleration of sparse infill. If the value is expressed as a percentage (e."
"(e.g. 100%), it will be calculated based on the default acceleration." "g. 100%), it will be calculated based on the default acceleration."
msgstr "" msgstr ""
"Aceleración del relleno de baja densidad. Si el valor se expresa en " "Aceleración del relleno de baja densidad. Si el valor se expresa en "
"porcentaje (por ejemplo 100%), se calculará basándose en la aceleración por " "porcentaje (por ejemplo 100%), se calculará basándose en la aceleración por "
@ -12065,8 +12078,8 @@ msgid ""
"Can only be overridden by disable_fan_first_layers." "Can only be overridden by disable_fan_first_layers."
msgstr "" msgstr ""
"Esta velocidad de ventilador se fuerza cuando se imprimen todas las " "Esta velocidad de ventilador se fuerza cuando se imprimen todas las "
"interfaces de soporte, con el objetivo de debilitar la unión con la " "interfaces de soporte, con el objetivo de debilitar la unión con la pieza."
"pieza.Sólo puede ser anulado por disable_fan_first_layers." "Sólo puede ser anulado por disable_fan_first_layers."
msgid "" msgid ""
"Randomly jitter while printing the wall, so that the surface has a rough " "Randomly jitter while printing the wall, so that the surface has a rough "
@ -13279,7 +13292,7 @@ msgstr ""
"cambio de filamento" "cambio de filamento"
msgid "Z-hop height" msgid "Z-hop height"
msgstr "" msgstr "Altura de Salto en Z"
msgid "" msgid ""
"Whenever the retraction is done, the nozzle is lifted a little to create " "Whenever the retraction is done, the nozzle is lifted a little to create "
@ -13312,7 +13325,7 @@ msgstr ""
"parámetro \"Límite inferior de salto Z\" y por debajo de este valor" "parámetro \"Límite inferior de salto Z\" y por debajo de este valor"
msgid "Z-hop type" msgid "Z-hop type"
msgstr "" msgstr "Tipo de Salto en Z"
msgid "Z hop type" msgid "Z hop type"
msgstr "Tipo de salto Z" msgstr "Tipo de salto Z"
@ -14742,9 +14755,9 @@ msgid "Idle temperature"
msgstr "Temperatura de Espera" msgstr "Temperatura de Espera"
msgid "" msgid ""
"Nozzle temperature when the tool is currently not used in multi-tool " "Nozzle temperature when the tool is currently not used in multi-tool setups."
"setups.This is only used when 'Ooze prevention' is active in Print Settings. " "This is only used when 'Ooze prevention' is active in Print Settings. Set to "
"Set to 0 to disable." "0 to disable."
msgstr "" msgstr ""
"Temperatura de la boquilla cuando el cabezal no se está utilizando en " "Temperatura de la boquilla cuando el cabezal no se está utilizando en "
"configuraciones multicabezal. Este parámetro sólo es utilizado cuando la " "configuraciones multicabezal. Este parámetro sólo es utilizado cuando la "
@ -14823,8 +14836,8 @@ msgid ""
"Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the " "Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the "
"following format: \"XxY, XxY, ...\"" "following format: \"XxY, XxY, ...\""
msgstr "" msgstr ""
"Los tamaños de las imágenes para almacenar en archivos .gcode " "Los tamaños de las imágenes para almacenar en archivos .gcode y .sl1 / ."
"y .sl1 / .sl1s, en el siguiente formato: \"XxY, XxY, ...\"" "sl1s, en el siguiente formato: \"XxY, XxY, ...\""
msgid "Format of G-code thumbnails" msgid "Format of G-code thumbnails"
msgstr "Formato de las miniaturas de G-Code" msgstr "Formato de las miniaturas de G-Code"
@ -15473,8 +15486,8 @@ msgstr "Soporte: propagando ramas en la capa %d"
msgid "" msgid ""
"Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension." "Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension."
msgstr "" msgstr ""
"Formato de archivo desconocido: el archivo de entrada debe tener " "Formato de archivo desconocido: el archivo de entrada debe tener extensión ."
"extensión .stl, .obj o .amf (.xml)." "stl, .obj o .amf (.xml)."
msgid "Loading of a model file failed." msgid "Loading of a model file failed."
msgstr "Error en la carga del fichero de modelo." msgstr "Error en la carga del fichero de modelo."
@ -15484,8 +15497,8 @@ msgstr "El archivo proporcionado no puede ser leído debido a que está vacío"
msgid "Unknown file format. Input file must have .3mf or .zip.amf extension." msgid "Unknown file format. Input file must have .3mf or .zip.amf extension."
msgstr "" msgstr ""
"Formato de archivo desconocido: el archivo de entrada debe tener extensión " "Formato de archivo desconocido: el archivo de entrada debe tener "
".3mf o .zip.amf." "extensión .3mf o .zip.amf."
msgid "Canceled" msgid "Canceled"
msgstr "Cancelado" msgstr "Cancelado"
@ -18782,10 +18795,10 @@ msgstr ""
#~ "geometría." #~ "geometría."
#~ msgid "" #~ msgid ""
#~ "Relative extrusion is recommended when using \"label_objects\" " #~ "Relative extrusion is recommended when using \"label_objects\" option."
#~ "option.Some extruders work better with this option unchecked (absolute " #~ "Some extruders work better with this option unchecked (absolute extrusion "
#~ "extrusion mode). Wipe tower is only compatible with relative mode. It is " #~ "mode). Wipe tower is only compatible with relative mode. It is always "
#~ "always enabled on BambuLab printers. Default is checked" #~ "enabled on BambuLab printers. Default is checked"
#~ msgstr "" #~ msgstr ""
#~ "Se recomienda la extrusión relativa cuando se utiliza la opción " #~ "Se recomienda la extrusión relativa cuando se utiliza la opción "
#~ "\"label_objects\". Algunos extrusores funcionan mejor con esta opción " #~ "\"label_objects\". Algunos extrusores funcionan mejor con esta opción "
@ -19242,11 +19255,11 @@ msgstr ""
#~ msgstr "Nivel de depuración" #~ msgstr "Nivel de depuración"
#~ msgid "" #~ msgid ""
#~ "Sets debug logging level. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, " #~ "Sets debug logging level. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:"
#~ "5:trace\n" #~ "trace\n"
#~ msgstr "" #~ msgstr ""
#~ "Ajusta el nivel de registro de depuración. 0:fatal, 1:error, " #~ "Ajusta el nivel de registro de depuración. 0:fatal, 1:error, 2:"
#~ "2:advertencia, 3:información, 4:depuración, 5:rastreo\n" #~ "advertencia, 3:información, 4:depuración, 5:rastreo\n"
#, boost-format #, boost-format
#~ msgid "The selected preset: %1% is not found." #~ msgid "The selected preset: %1% is not found."

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,108 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="24"
height="24"
viewBox="0 0 6.3499998 6.3499998"
version="1.1"
id="svg8"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="param_quartercubic.svg">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="31.678384"
inkscape:cx="9.2016388"
inkscape:cy="13.550773"
inkscape:document-units="mm"
inkscape:current-layer="g3735"
showgrid="false"
inkscape:window-width="3440"
inkscape:window-height="1361"
inkscape:window-x="-9"
inkscape:window-y="-9"
inkscape:window-maximized="1"
units="px" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(471.60224,-51.657005)">
<g
id="g3735"
transform="matrix(0.26458333,0,0,0.26458333,-471.86548,51.920238)">
<path
style="fill:#949494;fill-opacity:1;stroke:#949494;stroke-width:0.65595609;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 2.6869721,2.7931307 21.370006,21.252951"
id="path4983"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
id="path3713"
d="M 17.436421,21.426712 2.6364216,6.6267129 m 4.8,14.7999991 -4.8,-4.8 M 16.436421,0.4267129 l 7.2,7.2 m -17.1999994,-7.2 17.1999994,17.1999991"
inkscape:connector-curvature="0"
style="fill:none;stroke:#009688;stroke-width:0.7937008;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none" />
<path
id="path3715"
d="M 14.752492,21.394569 2.6364216,9.2776059 M 23.48285,19.879391 4.1739216,0.66957 m 9.6232134,-0.086607 3.037826,2.9618941 6.823781,6.6997119"
inkscape:connector-curvature="0"
style="fill:none;stroke:#009688;stroke-width:0.7937008;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
sodipodi:nodetypes="ccccccc" />
<path
style="fill:#949494;fill-opacity:1;stroke:#949494;stroke-width:0.65595609;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 9.7429205,0.43681 23.684533,13.798665"
id="path4983-8"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
id="path3715-1"
d="M 2.6374683,7.77313 9.7429205,0.43681 M 2.8040351,18.864878 20.992951,0.52555773 M 23.629234,9.7763932 12.204235,21.423716"
inkscape:connector-curvature="0"
style="fill:none;stroke:#009688;stroke-width:0.7937008;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
sodipodi:nodetypes="cccccc" />
<path
id="path3713-0"
d="M 2.6042413,10.559661 12.242993,0.67821811 M 23.658129,12.52874 15.20813,21.405022 M 23.332474,1.1732923 3.4398186,20.95627"
inkscape:connector-curvature="0"
style="fill:none;stroke:#009688;stroke-width:0.7937008;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
sodipodi:nodetypes="cccccc" />
<path
id="path3721"
d="M 4.6364216,0.4267129 H 21.636421 c 1.1,0 2,0.9 2,2 V 19.426712 c 0,1.1 -0.9,2 -2,2 H 4.6364216 c -1.1,0 -2,-0.9 -2,-2 V 2.4267129 c 0,-1.1 0.9,-2 2,-2 z"
inkscape:connector-curvature="0"
style="fill:none;stroke:#949494;stroke-width:0.89461362;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none" />
<path
style="fill:#949494;fill-opacity:1;stroke:#949494;stroke-width:0.65595609;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 2.5685844,13.016265 8.7276766,8.61607"
id="path4983-2"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

View file

@ -1,7 +1,7 @@
{ {
"type": "process", "type": "process",
"setting_id": "GP017", "setting_id": "GP017",
"name": "0.20mm Optimal 0.6 nozzle @Anker.json", "name": "0.20mm Optimal 0.6 nozzle @Anker",
"from": "system", "from": "system",
"inherits": "fdm_process_anker_common_0_6", "inherits": "fdm_process_anker_common_0_6",
"instantiation": "true", "instantiation": "true",

View file

@ -119,6 +119,10 @@
{ {
"name": "Creality K2 Plus", "name": "Creality K2 Plus",
"sub_path": "machine/Creality K2 Plus.json" "sub_path": "machine/Creality K2 Plus.json"
},
{
"name": "Creality Hi",
"sub_path": "machine/Creality Hi.json"
} }
], ],
"process_list": [ "process_list": [
@ -266,6 +270,10 @@
"name": "0.08mm SuperDetail @Creality K2 Plus 0.4 nozzle", "name": "0.08mm SuperDetail @Creality K2 Plus 0.4 nozzle",
"sub_path": "process/0.08mm SuperDetail @Creality K2 Plus 0.4 nozzle.json" "sub_path": "process/0.08mm SuperDetail @Creality K2 Plus 0.4 nozzle.json"
}, },
{
"name": "0.08mm SuperDetail @Creality Hi",
"sub_path": "process/0.08mm SuperDetail @Creality Hi 0.4 nozzle.json"
},
{ {
"name": "0.10mm HighDetail @Creality CR-6 0.4.json", "name": "0.10mm HighDetail @Creality CR-6 0.4.json",
"sub_path": "process/0.10mm HighDetail @Creality CR-6 0.4.json" "sub_path": "process/0.10mm HighDetail @Creality CR-6 0.4.json"
@ -422,6 +430,10 @@
"name": "0.24mm Detail @Creality K2 Plus 0.8 nozzle", "name": "0.24mm Detail @Creality K2 Plus 0.8 nozzle",
"sub_path": "process/0.24mm Detail @Creality K2 Plus 0.8 nozzle.json" "sub_path": "process/0.24mm Detail @Creality K2 Plus 0.8 nozzle.json"
}, },
{
"name": "0.12mm Fine @Creality Hi",
"sub_path": "process/0.12mm Fine @Creality Hi 0.4 nozzle.json"
},
{ {
"name": "0.16mm Optimal @Creality CR10V2", "name": "0.16mm Optimal @Creality CR10V2",
"sub_path": "process/0.16mm Optimal @Creality CR10V2.json" "sub_path": "process/0.16mm Optimal @Creality CR10V2.json"
@ -586,6 +598,10 @@
"name": "0.16mm Optimal @Creality K2 Plus 0.4 nozzle", "name": "0.16mm Optimal @Creality K2 Plus 0.4 nozzle",
"sub_path": "process/0.16mm Optimal @Creality K2 Plus 0.4 nozzle.json" "sub_path": "process/0.16mm Optimal @Creality K2 Plus 0.4 nozzle.json"
}, },
{
"name": "0.16mm Optimal @Creality Hi",
"sub_path": "process/0.16mm Optimal @Creality Hi 0.4 nozzle.json"
},
{ {
"name": "0.24mm Optimal @Creality K2 Plus 0.6 nozzle", "name": "0.24mm Optimal @Creality K2 Plus 0.6 nozzle",
"sub_path": "process/0.24mm Optimal @Creality K2 Plus 0.6 nozzle.json" "sub_path": "process/0.24mm Optimal @Creality K2 Plus 0.6 nozzle.json"
@ -782,6 +798,10 @@
"name": "0.20mm Fast @Creality K1 SE 0.4", "name": "0.20mm Fast @Creality K1 SE 0.4",
"sub_path": "process/0.20mm Fast @Creality K1 SE 0.4.json" "sub_path": "process/0.20mm Fast @Creality K1 SE 0.4.json"
}, },
{
"name": "0.20mm Standard @Creality Hi",
"sub_path": "process/0.20mm Standard @Creality Hi 0.4 nozzle.json"
},
{ {
"name": "0.24mm Draft @Creality Ender3 0.2", "name": "0.24mm Draft @Creality Ender3 0.2",
"sub_path": "process/0.24mm Draft @Creality Ender3 0.2.json" "sub_path": "process/0.24mm Draft @Creality Ender3 0.2.json"
@ -914,6 +934,14 @@
"name": "0.24mm Draft @Creality K2 Plus 0.4 nozzle", "name": "0.24mm Draft @Creality K2 Plus 0.4 nozzle",
"sub_path": "process/0.24mm Draft @Creality K2 Plus 0.4 nozzle.json" "sub_path": "process/0.24mm Draft @Creality K2 Plus 0.4 nozzle.json"
}, },
{
"name": "0.24mm Draft @Creality Hi",
"sub_path": "process/0.24mm Draft @Creality Hi 0.4 nozzle.json"
},
{
"name": "0.24mm Optimal @Creality Hi",
"sub_path": "process/0.24mm Optimal @Creality Hi 0.6 nozzle.json"
},
{ {
"name": "0.36mm Draft @Creality K2 Plus 0.6 nozzle", "name": "0.36mm Draft @Creality K2 Plus 0.6 nozzle",
"sub_path": "process/0.36mm Draft @Creality K2 Plus 0.6 nozzle.json" "sub_path": "process/0.36mm Draft @Creality K2 Plus 0.6 nozzle.json"
@ -1082,6 +1110,10 @@
"name": "0.30mm Standard @Creality K1C", "name": "0.30mm Standard @Creality K1C",
"sub_path": "process/0.30mm Standard @Creality K1C 0.6 nozzle.json" "sub_path": "process/0.30mm Standard @Creality K1C 0.6 nozzle.json"
}, },
{
"name": "0.30mm Standard @Creality Hi",
"sub_path": "process/0.30mm Standard @Creality Hi 0.6 nozzle.json"
},
{ {
"name": "0.30mm Standard @Creality K1Max (0.6 nozzle)", "name": "0.30mm Standard @Creality K1Max (0.6 nozzle)",
"sub_path": "process/0.30mm Standard @Creality K1Max (0.6 nozzle).json" "sub_path": "process/0.30mm Standard @Creality K1Max (0.6 nozzle).json"
@ -1106,6 +1138,10 @@
"name": "0.36mm Draft @Creality K1C", "name": "0.36mm Draft @Creality K1C",
"sub_path": "process/0.36mm Draft @Creality K1C 0.6 nozzle.json" "sub_path": "process/0.36mm Draft @Creality K1C 0.6 nozzle.json"
}, },
{
"name": "0.36mm Draft @Creality Hi",
"sub_path": "process/0.36mm Draft @Creality Hi 0.6 nozzle.json"
},
{ {
"name": "0.36mm Draft @Creality K1Max (0.6 nozzle)", "name": "0.36mm Draft @Creality K1Max (0.6 nozzle)",
"sub_path": "process/0.36mm Draft @Creality K1Max (0.6 nozzle).json" "sub_path": "process/0.36mm Draft @Creality K1Max (0.6 nozzle).json"
@ -1327,6 +1363,50 @@
{ {
"name": "Creality Generic PA-CF @K2-all", "name": "Creality Generic PA-CF @K2-all",
"sub_path": "filament/Creality Generic PA-CF @K2-all.json" "sub_path": "filament/Creality Generic PA-CF @K2-all.json"
},
{
"name": "Creality Generic ABS @Hi-all",
"sub_path": "filament/Creality Generic ABS @Hi-all.json"
},
{
"name": "Creality Generic ASA @Hi-all",
"sub_path": "filament/Creality Generic ASA @Hi-all.json"
},
{
"name": "Creality Generic ASA-CF @Hi-all",
"sub_path": "filament/Creality Generic ASA-CF @Hi-all.json"
},
{
"name": "Creality Generic PETG @Hi-all",
"sub_path": "filament/Creality Generic PETG @Hi-all.json"
},
{
"name": "Creality Generic PETG-CF @Hi-all",
"sub_path": "filament/Creality Generic PETG-CF @Hi-all.json"
},
{
"name": "Creality Generic PLA @Hi-all",
"sub_path": "filament/Creality Generic PLA @Hi-all.json"
},
{
"name": "Creality Generic PLA High Speed @Hi-all",
"sub_path": "filament/Creality Generic PLA High Speed @Hi-all.json"
},
{
"name": "Creality Generic PLA Matte @Hi-all",
"sub_path": "filament/Creality Generic PLA Matte @Hi-all.json"
},
{
"name": "Creality Generic PLA Silk @Hi-all",
"sub_path": "filament/Creality Generic PLA Silk @Hi-all.json"
},
{
"name": "Creality Generic PLA-CF @Hi-all",
"sub_path": "filament/Creality Generic PLA-CF @Hi-all.json"
},
{
"name": "Creality Generic TPU @Hi-all",
"sub_path": "filament/Creality Generic TPU @Hi-all.json"
} }
], ],
"machine_list": [ "machine_list": [
@ -1609,6 +1689,14 @@
{ {
"name": "Creality K2 Plus 0.8 nozzle", "name": "Creality K2 Plus 0.8 nozzle",
"sub_path": "machine/Creality K2 Plus 0.8 nozzle.json" "sub_path": "machine/Creality K2 Plus 0.8 nozzle.json"
},
{
"name": "Creality Hi 0.4 nozzle",
"sub_path": "machine/Creality Hi 0.4 nozzle.json"
},
{
"name": "Creality Hi 0.6 nozzle",
"sub_path": "machine/Creality Hi 0.6 nozzle.json"
} }
] ]
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View file

@ -0,0 +1,14 @@
{
"type": "filament",
"setting_id": "GFSA04_CREALITY_00",
"name": "Creality Generic ABS @Hi",
"from": "system",
"instantiation": "true",
"inherits": "Creality Generic ABS",
"filament_max_volumetric_speed": ["9"],
"slow_down_layer_time": ["5"],
"compatible_printers": [
"Creality Hi 0.4 nozzle",
"Creality Hi 0.6 nozzle"
]
}

View file

@ -0,0 +1,14 @@
{
"type": "filament",
"setting_id": "GFSA04_00",
"name": "Creality Generic ASA @Hi-all",
"from": "system",
"instantiation": "true",
"inherits": "Creality Generic ASA",
"filament_max_volumetric_speed": ["9"],
"slow_down_layer_time": ["5"],
"compatible_printers": [
"Creality Hi 0.4 nozzle",
"Creality Hi 0.6 nozzle"
]
}

View file

@ -0,0 +1,14 @@
{
"type": "filament",
"setting_id": "GFSA04_00",
"name": "Creality Generic ASA-CF @Hi-all",
"from": "system",
"instantiation": "true",
"inherits": "Creality Generic ASA @Hi-all",
"filament_max_volumetric_speed": ["9"],
"slow_down_layer_time": ["5"],
"compatible_printers": [
"Creality Hi 0.4 nozzle",
"Creality Hi 0.6 nozzle"
]
}

View file

@ -0,0 +1,24 @@
{
"type": "filament",
"setting_id": "GFSG99_00",
"name": "Creality Generic PETG @Hi-all",
"from": "system",
"instantiation": "true",
"inherits": "Creality Generic PETG",
"filament_max_volumetric_speed": ["9"],
"slow_down_layer_time": ["5"],
"cool_plate_temp" : ["70"],
"eng_plate_temp" : ["70"],
"hot_plate_temp" : ["70"],
"textured_plate_temp" : ["70"],
"cool_plate_temp_initial_layer" : ["70"],
"eng_plate_temp_initial_layer" : ["70"],
"hot_plate_temp_initial_layer" : ["70"],
"textured_plate_temp_initial_layer" : ["70"],
"nozzle_temperature_initial_layer": ["250"],
"nozzle_temperature": ["250"],
"compatible_printers": [
"Creality Hi 0.4 nozzle",
"Creality Hi 0.6 nozzle"
]
}

View file

@ -0,0 +1,14 @@
{
"type": "filament",
"setting_id": "GFSG99_00",
"name": "Creality Generic PETG-CF @Hi-all",
"from": "system",
"instantiation": "true",
"inherits": "Creality Generic PETG @Hi-all",
"filament_max_volumetric_speed": ["9"],
"filament_flow_ratio": ["0.95"],
"compatible_printers": [
"Creality Hi 0.4 nozzle",
"Creality Hi 0.6 nozzle"
]
}

View file

@ -0,0 +1,93 @@
{
"type": "filament",
"setting_id": "GFSL99_00",
"name": "Creality Generic PLA @Hi-all",
"from": "system",
"instantiation": "true",
"inherits": "Creality Generic PLA",
"filament_max_volumetric_speed": [
"18"
],
"slow_down_min_speed": [
"20"
],
"cool_plate_temp": [
"55"
],
"eng_plate_temp": [
"55"
],
"hot_plate_temp": [
"55"
],
"textured_plate_temp": [
"55"
],
"cool_plate_temp_initial_layer": [
"55"
],
"eng_plate_temp_initial_layer": [
"55"
],
"hot_plate_temp_initial_layer": [
"55"
],
"textured_plate_temp_initial_layer": [
"55"
],
"filament_cooling_final_speed": [
"3.4"
],
"filament_cooling_initial_speed": [
"2.2"
],
"filament_cooling_moves": [
"4"
],
"filament_load_time": [
"0"
],
"filament_loading_speed": [
"28"
],
"filament_loading_speed_start": [
"3"
],
"filament_toolchange_delay": [
"0"
],
"filament_unload_time": [
"0"
],
"filament_unloading_speed": [
"90"
],
"filament_unloading_speed_start": [
"100"
],
"filament_long_retractions_when_cut": [
"nil"
],
"filament_minimal_purge_on_wipe_tower": [
"15"
],
"filament_multitool_ramming": [
"0"
],
"filament_multitool_ramming_flow": [
"0"
],
"filament_multitool_ramming_volume": [
"0"
],
"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"
],
"compatible_printers": [
"Creality Hi 0.4 nozzle",
"Creality Hi 0.6 nozzle"
]
}

View file

@ -0,0 +1,18 @@
{
"type": "filament",
"setting_id": "GFSL95_00",
"name": "Creality Generic PLA High Speed @Hi-all",
"from": "system",
"instantiation": "true",
"inherits": "Creality Generic PLA @Hi-all",
"filament_flow_ratio": [
"0.95"
],
"filament_max_volumetric_speed": [
"23"
],
"compatible_printers": [
"Creality Hi 0.4 nozzle",
"Creality Hi 0.6 nozzle"
]
}

View file

@ -0,0 +1,15 @@
{
"type": "filament",
"setting_id": "GFSL05_00",
"name": "Creality Generic PLA Matte @Hi-all",
"from": "system",
"instantiation": "true",
"inherits": "Creality Generic PLA @Hi-all",
"filament_max_volumetric_speed": [
"18"
],
"compatible_printers": [
"Creality Hi 0.4 nozzle",
"Creality Hi 0.6 nozzle"
]
}

View file

@ -0,0 +1,18 @@
{
"type": "filament",
"setting_id": "GFSL96_00",
"name": "Creality Generic PLA Silk @Hi-all",
"from": "system",
"instantiation": "true",
"inherits": "Creality Generic PLA @Hi-all",
"filament_flow_ratio": [
"0.97"
],
"filament_max_volumetric_speed": [
"7.5"
],
"compatible_printers": [
"Creality Hi 0.4 nozzle",
"Creality Hi 0.6 nozzle"
]
}

View file

@ -0,0 +1,15 @@
{
"type": "filament",
"setting_id": "GFSL96_00",
"name": "Creality Generic PLA-CF @Hi-all",
"from": "system",
"instantiation": "true",
"inherits": "Creality Generic PLA-CF",
"filament_max_volumetric_speed": [
"18"
],
"compatible_printers": [
"Creality Hi 0.4 nozzle",
"Creality Hi 0.6 nozzle"
]
}

View file

@ -0,0 +1,36 @@
{
"type": "filament",
"setting_id": "GFU99_CREALITY_00",
"name": "Creality Generic TPU @Hi-all",
"from": "system",
"instantiation": "true",
"inherits": "Creality Generic TPU",
"hot_plate_temp": [
"30"
],
"hot_plate_temp_initial_layer": [
"30"
],
"textured_plate_temp": [
"30"
],
"textured_plate_temp_initial_layer": [
"30"
],
"nozzle_temperature_initial_layer": [
"230"
],
"nozzle_temperature": [
"230"
],
"filament_max_volumetric_speed": [
"3.5"
],
"slow_down_layer_time": [
"5"
],
"compatible_printers": [
"Creality Hi 0.4 nozzle",
"Creality Hi 0.6 nozzle"
]
}

View file

@ -0,0 +1,145 @@
{
"type": "machine",
"setting_id": "GM001",
"name": "Creality Hi 0.4 nozzle",
"from": "system",
"instantiation": "true",
"inherits": "fdm_creality_common",
"printer_model": "Creality Hi",
"gcode_flavor": "klipper",
"printer_structure": "i3",
"default_print_profile": "0.20mm Standard @Creality Hi",
"nozzle_diameter": [
"0.4"
],
"nozzle_type": "hardened_steel",
"nozzle_volume": "183",
"printer_variant": "0.4",
"printable_area": [
"0x0",
"260x0",
"260x260",
"0x260"
],
"printable_height": "300",
"auxiliary_fan": "0",
"support_air_filtration": "0",
"support_multi_bed_types": "1",
"machine_max_acceleration_e": [
"5000",
"5000"
],
"machine_max_acceleration_extruding": [
"12000",
"12000"
],
"machine_max_acceleration_retracting": [
"5000",
"5000"
],
"machine_max_acceleration_travel": [
"12000",
"12000"
],
"machine_max_acceleration_x": [
"12000",
"12000"
],
"machine_max_acceleration_y": [
"12000",
"12000"
],
"machine_max_acceleration_z": [
"1000",
"1000"
],
"machine_max_speed_e": [
"50",
"50"
],
"machine_max_speed_x": [
"500",
"500"
],
"machine_max_speed_y": [
"500",
"500"
],
"machine_max_speed_z": [
"30",
"30"
],
"machine_max_jerk_e": [
"2.5",
"2.5"
],
"machine_max_jerk_x": [
"12",
"12"
],
"machine_max_jerk_y": [
"12",
"12"
],
"machine_max_jerk_z": [
"2",
"2"
],
"max_layer_height": [
"0.32"
],
"min_layer_height": [
"0.08"
],
"printer_settings_id": "Creality",
"purge_in_prime_tower": "0",
"retraction_minimum_travel": [
"0.5"
],
"retract_before_wipe": [
"70%"
],
"retraction_length": [
"0.8"
],
"retract_length_toolchange": [
"0"
],
"retraction_speed": [
"40"
],
"deretraction_speed": [
"40"
],
"retract_lift_below": [
"299"
],
"retract_when_changing_layer": [
"1"
],
"enable_filament_ramming": "0",
"extruder_clearance_height_to_lid": "27",
"extruder_clearance_height_to_rod": "27",
"extruder_clearance_radius": "55",
"z_hop": [
"0.4"
],
"z_hop_types": [
"Auto Lift"
],
"wipe_distance": [
"2"
],
"single_extruder_multi_material": "1",
"machine_pause_gcode": "PAUSE",
"change_filament_gcode": "G2 Z{z_after_toolchange + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\nG1 X260 Y180 F30000\nG1 Z{z_after_toolchange} F600",
"default_filament_profile": [
"Creality Generic PLA @Hi-all"
],
"machine_start_gcode": "M140 S0\nM104 S0 \nSTART_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM109 S[nozzle_temperature_initial_layer]\nM204 S2000\nG1 Z3 F600\nM83\nG1 Y150 F12000\nG1 X0 F12000\nG1 Z0.2 F600\nG1 X0 Y150 F6000\nG1 X0 Y0 E15 F6000\nG1 X150 Y0 E15 F6000\nG92 E0\nG1 Z1 F600",
"machine_end_gcode": "END_PRINT",
"scan_first_layer": "0",
"thumbnails": [
"96x96/PNG, 300x300/PNG"
]
}

View file

@ -0,0 +1,145 @@
{
"type": "machine",
"setting_id": "GM001",
"name": "Creality Hi 0.6 nozzle",
"from": "system",
"instantiation": "true",
"inherits": "fdm_creality_common",
"printer_model": "Creality Hi",
"gcode_flavor": "klipper",
"printer_structure": "i3",
"default_print_profile": "0.30mm Standard @Creality Hi",
"nozzle_diameter": [
"0.6"
],
"nozzle_type": "hardened_steel",
"nozzle_volume": "183",
"printer_variant": "0.6",
"printable_area": [
"0x0",
"260x0",
"260x260",
"0x260"
],
"printable_height": "300",
"auxiliary_fan": "0",
"support_air_filtration": "0",
"support_multi_bed_types": "1",
"machine_max_acceleration_e": [
"5000",
"5000"
],
"machine_max_acceleration_extruding": [
"12000",
"12000"
],
"machine_max_acceleration_retracting": [
"5000",
"5000"
],
"machine_max_acceleration_travel": [
"12000",
"12000"
],
"machine_max_acceleration_x": [
"12000",
"12000"
],
"machine_max_acceleration_y": [
"12000",
"12000"
],
"machine_max_acceleration_z": [
"1000",
"1000"
],
"machine_max_speed_e": [
"50",
"50"
],
"machine_max_speed_x": [
"500",
"500"
],
"machine_max_speed_y": [
"500",
"500"
],
"machine_max_speed_z": [
"30",
"30"
],
"machine_max_jerk_e": [
"2.5",
"2.5"
],
"machine_max_jerk_x": [
"12",
"12"
],
"machine_max_jerk_y": [
"12",
"12"
],
"machine_max_jerk_z": [
"2",
"2"
],
"max_layer_height": [
"0.35"
],
"min_layer_height": [
"0.1"
],
"printer_settings_id": "Creality",
"purge_in_prime_tower": "0",
"retraction_minimum_travel": [
"0.5"
],
"retract_before_wipe": [
"70%"
],
"retraction_length": [
"0.8"
],
"retract_length_toolchange": [
"0"
],
"retraction_speed": [
"40"
],
"deretraction_speed": [
"40"
],
"retract_lift_below": [
"299"
],
"retract_when_changing_layer": [
"1"
],
"enable_filament_ramming": "0",
"extruder_clearance_height_to_lid": "27",
"extruder_clearance_height_to_rod": "27",
"extruder_clearance_radius": "55",
"z_hop": [
"0.4"
],
"z_hop_types": [
"Auto Lift"
],
"wipe_distance": [
"2"
],
"single_extruder_multi_material": "1",
"machine_pause_gcode": "PAUSE",
"change_filament_gcode": "G2 Z{z_after_toolchange + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\nG1 X260 Y180 F30000\nG1 Z{z_after_toolchange} F600",
"default_filament_profile": [
"Creality Generic PLA @Hi-all"
],
"machine_start_gcode": "M140 S0\nM104 S0 \nSTART_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM109 S[nozzle_temperature_initial_layer]\nM204 S2000\nG1 Z3 F600\nM83\nG1 Y150 F12000\nG1 X0 F12000\nG1 Z0.2 F600\nG1 X0 Y150 F6000\nG1 X0 Y0 E15 F6000\nG1 X150 Y0 E15 F6000\nG92 E0\nG1 Z1 F600",
"machine_end_gcode": "END_PRINT",
"scan_first_layer": "0",
"thumbnails": [
"96x96/PNG, 300x300/PNG"
]
}

View file

@ -0,0 +1,13 @@
{
"type": "machine_model",
"name": "Creality Hi",
"model_id": "Creality-Hi",
"nozzle_diameter": "0.4;0.6",
"machine_tech": "FFF",
"family": "Creality",
"bed_model": "creality_hi_buildplate_model.stl",
"bed_texture": "creality_hi_buildplate_texture.png",
"default_bed_type": "Textured PEI Plate",
"hotend_model": "",
"default_materials": "Creality Generic ABS @Hi-all;Creality Generic ASA @Hi-all;Creality Generic ASA-CF @Hi-all;Creality Generic PETG @Hi-all;Creality Generic PETG-CF @Hi-all;Creality Generic PLA @Hi-all;Creality Generic PLA High Speed @Hi-all;Creality Generic PLA Matte @Hi-all;Creality Generic PLA Silk @Hi-all;Creality Generic PLA-CF @Hi-all;Creality Generic TPU @Hi-all"
}

View file

@ -0,0 +1,117 @@
{
"type": "process",
"setting_id": "GP004",
"name": "0.08mm SuperDetail @Creality Hi",
"from": "system",
"inherits": "fdm_process_common_klipper",
"instantiation": "true",
"max_travel_detour_distance": "0",
"bottom_surface_pattern": "monotonic",
"bottom_shell_layers": "7",
"bottom_shell_thickness": "0",
"bridge_flow": "1",
"bridge_speed": "50",
"internal_bridge_speed": "150%",
"brim_width": "5",
"brim_object_gap": "0.1",
"compatible_printers": [
"Creality Hi 0.4 nozzle"
],
"default_acceleration": "12000",
"bridge_no_support": "0",
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"outer_wall_line_width": "0.42",
"outer_wall_speed": "200",
"outer_wall_acceleration": "5000",
"inner_wall_acceleration": "5000",
"wall_infill_order": "inner wall/outer wall/infill",
"line_width": "0.42",
"infill_direction": "45",
"sparse_infill_density": "15%",
"sparse_infill_pattern": "crosshatch",
"internal_bridge_support_thickness": "0.8",
"initial_layer_acceleration": "2000",
"initial_layer_line_width": "0.5",
"initial_layer_print_height": "0.2",
"initial_layer_speed": "60",
"gap_infill_speed": "250",
"infill_combination": "0",
"sparse_infill_line_width": "0.45",
"infill_wall_overlap": "30%",
"sparse_infill_speed": "270",
"interface_shells": "0",
"ironing_flow": "8%",
"ironing_spacing": "0.15",
"ironing_speed": "30",
"ironing_type": "no ironing",
"layer_height": "0.08",
"reduce_infill_retraction": "1",
"filename_format": "{input_filename_base}_{filament_type[initial_tool]}_{print_time}.gcode",
"detect_overhang_wall": "1",
"overhang_1_4_speed": "0",
"overhang_2_4_speed": "50",
"overhang_3_4_speed": "30",
"overhang_4_4_speed": "10",
"only_one_wall_top": "1",
"precise_outer_wall": "1",
"inner_wall_line_width": "0.45",
"inner_wall_speed": "300",
"wall_loops": "2",
"raft_layers": "0",
"seam_position": "aligned",
"skirt_distance": "2",
"skirt_height": "1",
"skirt_loops": "0",
"minimum_sparse_infill_area": "15",
"internal_solid_infill_line_width": "0.42",
"internal_solid_infill_speed": "250",
"initial_layer_infill_speed": "105",
"standby_temperature_delta": "-5",
"enable_support": "0",
"resolution": "0.012",
"support_type": "tree(auto)",
"support_style": "default",
"support_on_build_plate_only": "0",
"support_top_z_distance": "0.2",
"support_bottom_z_distance": "0.2",
"support_filament": "0",
"support_line_width": "0.4",
"support_interface_loop_pattern": "0",
"support_interface_filament": "0",
"support_interface_top_layers": "2",
"support_interface_bottom_layers": "2",
"support_interface_spacing": "0.5",
"support_expansion": "0",
"support_interface_speed": "80",
"support_base_pattern": "default",
"support_base_pattern_spacing": "2.5",
"support_speed": "150",
"support_threshold_angle": "30",
"support_object_xy_distance": "0.35",
"tree_support_branch_diameter": "2",
"tree_support_branch_angle": "45",
"tree_support_wall_count": "1",
"detect_thin_wall": "0",
"top_surface_pattern": "monotonicline",
"top_surface_line_width": "0.42",
"top_surface_acceleration": "5000",
"top_surface_speed": "200",
"top_shell_layers": "9",
"top_shell_thickness": "0.8",
"travel_acceleration": "12000",
"travel_speed": "500",
"enable_prime_tower": "1",
"wipe_tower_no_sparse_layers": "0",
"prime_tower_width": "35",
"xy_hole_compensation": "0",
"xy_contour_compensation": "0",
"gcode_label_objects": "0",
"default_jerk": "12",
"outer_wall_jerk": "8",
"inner_wall_jerk": "8",
"infill_jerk": "12",
"top_surface_jerk": "8",
"initial_layer_jerk": "8",
"travel_jerk": "12"
}

View file

@ -0,0 +1,126 @@
{
"type": "process",
"setting_id": "GP004",
"name": "0.12mm Fine @Creality Hi",
"from": "system",
"inherits": "fdm_process_common_klipper",
"instantiation": "true",
"adaptive_layer_height": "0",
"reduce_crossing_wall": "0",
"max_travel_detour_distance": "0",
"bottom_surface_pattern": "monotonic",
"bottom_shell_layers": "3",
"bottom_shell_thickness": "0",
"bridge_flow": "1",
"bridge_speed": "50",
"internal_bridge_speed": "150%",
"brim_width": "5",
"brim_object_gap": "0.1",
"compatible_printers": [
"Creality Hi 0.4 nozzle"
],
"compatible_printers_condition": "",
"print_sequence": "by layer",
"default_acceleration": "12000",
"bridge_no_support": "0",
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"outer_wall_line_width": "0.42",
"outer_wall_speed": "200",
"outer_wall_acceleration": "5000",
"inner_wall_acceleration": "5000",
"wall_infill_order": "inner wall/outer wall/infill",
"line_width": "0.42",
"infill_direction": "45",
"sparse_infill_density": "15%",
"sparse_infill_pattern": "crosshatch",
"internal_bridge_support_thickness": "0.8",
"initial_layer_acceleration": "500",
"initial_layer_line_width": "0.5",
"initial_layer_print_height": "0.12",
"initial_layer_speed": "60",
"gap_infill_speed": "250",
"infill_combination": "0",
"sparse_infill_line_width": "0.45",
"infill_wall_overlap": "30%",
"sparse_infill_speed": "270",
"interface_shells": "0",
"ironing_flow": "10%",
"ironing_spacing": "0.15",
"ironing_speed": "100",
"ironing_type": "no ironing",
"layer_height": "0.12",
"reduce_infill_retraction": "1",
"filename_format": "{input_filename_base}_{filament_type[initial_tool]}_{print_time}.gcode",
"detect_overhang_wall": "1",
"overhang_1_4_speed": "60",
"overhang_2_4_speed": "30",
"overhang_3_4_speed": "10",
"overhang_4_4_speed": "10",
"only_one_wall_top": "1",
"precise_outer_wall": "1",
"inner_wall_line_width": "0.45",
"inner_wall_speed": "300",
"wall_loops": "2",
"print_settings_id": "",
"raft_layers": "0",
"seam_position": "aligned",
"seam_slope_conditional": "1",
"seam_slope_inner_walls": "1",
"seam_slope_entire_loop": "1",
"skirt_distance": "2",
"skirt_height": "1",
"skirt_loops": "0",
"minimum_sparse_infill_area": "15",
"internal_solid_infill_line_width": "0.42",
"internal_solid_infill_speed": "250",
"spiral_mode": "0",
"initial_layer_infill_speed": "105",
"standby_temperature_delta": "-5",
"enable_support": "0",
"resolution": "0.012",
"support_type": "tree(auto)",
"support_style": "default",
"support_on_build_plate_only": "0",
"support_top_z_distance": "0.22",
"support_bottom_z_distance": "0.24",
"support_filament": "0",
"support_line_width": "0.42",
"support_interface_loop_pattern": "0",
"support_interface_filament": "0",
"support_interface_top_layers": "2",
"support_interface_bottom_layers": "2",
"support_interface_spacing": "0.5",
"support_expansion": "0",
"support_interface_speed": "80",
"support_base_pattern": "default",
"support_base_pattern_spacing": "2.5",
"support_speed": "150",
"support_threshold_angle": "30",
"support_object_xy_distance": "0.35",
"tree_support_branch_diameter": "2",
"tree_support_branch_angle": "45",
"tree_support_wall_count": "1",
"detect_thin_wall": "0",
"top_surface_pattern": "monotonicline",
"top_surface_line_width": "0.42",
"top_surface_acceleration": "5000",
"top_surface_speed": "200",
"top_shell_layers": "5",
"top_shell_thickness": "0.6",
"travel_acceleration": "12000",
"travel_speed": "500",
"enable_prime_tower": "1",
"wipe_tower_no_sparse_layers": "0",
"prime_tower_width": "35",
"xy_hole_compensation": "0",
"xy_contour_compensation": "0",
"gcode_label_objects": "0",
"default_jerk": "12",
"outer_wall_jerk": "8",
"inner_wall_jerk": "8",
"infill_jerk": "12",
"top_surface_jerk": "8",
"initial_layer_jerk": "8",
"travel_jerk": "12"
}

View file

@ -0,0 +1,119 @@
{
"type": "process",
"setting_id": "GP004",
"name": "0.16mm Optimal @Creality Hi",
"from": "system",
"inherits": "fdm_process_common_klipper",
"instantiation": "true",
"adaptive_layer_height": "0",
"reduce_crossing_wall": "0",
"max_travel_detour_distance": "0",
"bottom_surface_pattern": "monotonic",
"bottom_shell_layers": "3",
"bottom_shell_thickness": "0",
"bridge_flow": "1",
"bridge_speed": "50",
"internal_bridge_speed": "150%",
"brim_width": "5",
"brim_object_gap": "0.1",
"compatible_printers": [
"Creality Hi 0.4 nozzle"
],
"compatible_printers_condition": "",
"print_sequence": "by layer",
"default_acceleration": "12000",
"bridge_no_support": "0",
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"outer_wall_line_width": "0.42",
"outer_wall_speed": "200",
"outer_wall_acceleration": "5000",
"inner_wall_acceleration": "5000",
"wall_infill_order": "inner wall/outer wall/infill",
"line_width": "0.42",
"infill_direction": "45",
"sparse_infill_density": "15%",
"sparse_infill_pattern": "crosshatch",
"internal_bridge_support_thickness": "0.8",
"initial_layer_acceleration": "500",
"initial_layer_line_width": "0.5",
"initial_layer_print_height": "0.16",
"initial_layer_speed": "60",
"gap_infill_speed": "300",
"infill_combination": "0",
"sparse_infill_line_width": "0.45",
"infill_wall_overlap": "15%",
"sparse_infill_speed": "500",
"interface_shells": "0",
"ironing_flow": "10%",
"ironing_spacing": "0.15",
"ironing_speed": "100",
"ironing_type": "no ironing",
"layer_height": "0.16",
"reduce_infill_retraction": "1",
"filename_format": "{input_filename_base}_{filament_type[initial_tool]}_{print_time}.gcode",
"detect_overhang_wall": "1",
"overhang_1_4_speed": "60",
"overhang_2_4_speed": "30",
"overhang_3_4_speed": "10",
"overhang_4_4_speed": "10",
"only_one_wall_top": "1",
"precise_outer_wall": "1",
"inner_wall_line_width": "0.45",
"inner_wall_speed": "300",
"wall_loops": "2",
"print_settings_id": "",
"raft_layers": "0",
"seam_position": "aligned",
"seam_slope_conditional": "1",
"seam_slope_inner_walls": "1",
"seam_slope_entire_loop": "1",
"skirt_distance": "2",
"skirt_height": "1",
"skirt_loops": "0",
"minimum_sparse_infill_area": "15",
"internal_solid_infill_line_width": "0.42",
"internal_solid_infill_speed": "300",
"spiral_mode": "0",
"initial_layer_infill_speed": "105",
"standby_temperature_delta": "-5",
"enable_support": "0",
"resolution": "0.012",
"support_type": "tree(auto)",
"support_style": "default",
"support_on_build_plate_only": "0",
"support_top_z_distance": "0.2",
"support_bottom_z_distance": "0.2",
"support_filament": "0",
"support_line_width": "0.42",
"support_interface_loop_pattern": "0",
"support_interface_filament": "0",
"support_interface_top_layers": "2",
"support_interface_bottom_layers": "2",
"support_interface_spacing": "0.5",
"support_expansion": "0",
"support_interface_speed": "80",
"support_base_pattern": "default",
"support_base_pattern_spacing": "2.5",
"support_speed": "150",
"support_threshold_angle": "30",
"support_object_xy_distance": "0.35",
"tree_support_branch_diameter": "2",
"tree_support_branch_angle": "45",
"tree_support_wall_count": "1",
"detect_thin_wall": "0",
"top_surface_pattern": "monotonicline",
"top_surface_line_width": "0.42",
"top_surface_acceleration": "5000",
"top_surface_speed": "200",
"top_shell_layers": "3",
"top_shell_thickness": "0.6",
"travel_acceleration": "12000",
"travel_speed": "500",
"enable_prime_tower": "1",
"wipe_tower_no_sparse_layers": "0",
"prime_tower_width": "35",
"xy_hole_compensation": "0",
"xy_contour_compensation": "0",
"gcode_label_objects": "0"
}

View file

@ -0,0 +1,126 @@
{
"type": "process",
"setting_id": "GP004",
"name": "0.20mm Standard @Creality Hi",
"from": "system",
"inherits": "fdm_process_common_klipper",
"instantiation": "true",
"adaptive_layer_height": "0",
"reduce_crossing_wall": "0",
"max_travel_detour_distance": "0",
"bottom_surface_pattern": "monotonic",
"bottom_shell_layers": "3",
"bottom_shell_thickness": "0",
"bridge_flow": "1",
"bridge_speed": "50",
"internal_bridge_speed": "150%",
"brim_width": "5",
"brim_object_gap": "0.1",
"compatible_printers": [
"Creality Hi 0.4 nozzle"
],
"compatible_printers_condition": "",
"print_sequence": "by layer",
"default_acceleration": "12000",
"bridge_no_support": "0",
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"outer_wall_line_width": "0.42",
"outer_wall_speed": "230",
"outer_wall_acceleration": "5000",
"inner_wall_acceleration": "5000",
"wall_infill_order": "inner wall/outer wall/infill",
"line_width": "0.42",
"infill_direction": "45",
"sparse_infill_density": "15%",
"sparse_infill_pattern": "crosshatch",
"internal_bridge_support_thickness": "0.8",
"initial_layer_acceleration": "2000",
"initial_layer_line_width": "0.5",
"initial_layer_print_height": "0.2",
"initial_layer_speed": "60",
"gap_infill_speed": "250",
"infill_combination": "0",
"sparse_infill_line_width": "0.45",
"infill_wall_overlap": "30%",
"sparse_infill_speed": "270",
"interface_shells": "0",
"ironing_flow": "10%",
"ironing_spacing": "0.15",
"ironing_speed": "100",
"ironing_type": "no ironing",
"layer_height": "0.2",
"reduce_infill_retraction": "1",
"filename_format": "{input_filename_base}_{filament_type[initial_tool]}_{print_time}.gcode",
"detect_overhang_wall": "1",
"overhang_1_4_speed": "0",
"overhang_2_4_speed": "50",
"overhang_3_4_speed": "30",
"overhang_4_4_speed": "10",
"only_one_wall_top": "1",
"precise_outer_wall": "1",
"inner_wall_line_width": "0.45",
"inner_wall_speed": "300",
"wall_loops": "2",
"print_settings_id": "",
"raft_layers": "0",
"seam_position": "aligned",
"seam_slope_conditional": "1",
"seam_slope_inner_walls": "1",
"seam_slope_entire_loop": "1",
"skirt_distance": "2",
"skirt_height": "1",
"skirt_loops": "0",
"minimum_sparse_infill_area": "15",
"internal_solid_infill_line_width": "0.42",
"internal_solid_infill_speed": "250",
"spiral_mode": "0",
"initial_layer_infill_speed": "105",
"standby_temperature_delta": "-5",
"enable_support": "0",
"resolution": "0.012",
"support_type": "tree(auto)",
"support_style": "default",
"support_on_build_plate_only": "0",
"support_top_z_distance": "0.2",
"support_bottom_z_distance": "0.2",
"support_filament": "0",
"support_line_width": "0.4",
"support_interface_loop_pattern": "0",
"support_interface_filament": "0",
"support_interface_top_layers": "2",
"support_interface_bottom_layers": "2",
"support_interface_spacing": "0.5",
"support_expansion": "0",
"support_interface_speed": "80",
"support_base_pattern": "default",
"support_base_pattern_spacing": "2.5",
"support_speed": "150",
"support_threshold_angle": "30",
"support_object_xy_distance": "0.35",
"tree_support_branch_diameter": "2",
"tree_support_branch_angle": "45",
"tree_support_wall_count": "1",
"detect_thin_wall": "0",
"top_surface_pattern": "monotonicline",
"top_surface_line_width": "0.42",
"top_surface_acceleration": "5000",
"top_surface_speed": "200",
"top_shell_layers": "5",
"top_shell_thickness": "0.8",
"travel_acceleration": "12000",
"travel_speed": "500",
"enable_prime_tower": "1",
"wipe_tower_no_sparse_layers": "0",
"prime_tower_width": "35",
"xy_hole_compensation": "0",
"xy_contour_compensation": "0",
"gcode_label_objects": "0",
"default_jerk": "12",
"outer_wall_jerk": "8",
"inner_wall_jerk": "8",
"infill_jerk": "12",
"top_surface_jerk": "8",
"initial_layer_jerk": "8",
"travel_jerk": "12"
}

View file

@ -0,0 +1,126 @@
{
"type": "process",
"setting_id": "GP004",
"name": "0.24mm Draft @Creality Hi",
"from": "system",
"inherits": "fdm_process_common_klipper",
"instantiation": "true",
"adaptive_layer_height": "0",
"reduce_crossing_wall": "0",
"max_travel_detour_distance": "0",
"bottom_surface_pattern": "monotonic",
"bottom_shell_layers": "3",
"bottom_shell_thickness": "0",
"bridge_flow": "1",
"bridge_speed": "50",
"internal_bridge_speed": "150%",
"brim_width": "5",
"brim_object_gap": "0.1",
"compatible_printers": [
"Creality Hi 0.4 nozzle"
],
"compatible_printers_condition": "",
"print_sequence": "by layer",
"default_acceleration": "12000",
"bridge_no_support": "0",
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"outer_wall_line_width": "0.42",
"outer_wall_speed": "230",
"outer_wall_acceleration": "5000",
"inner_wall_acceleration": "5000",
"wall_infill_order": "inner wall/outer wall/infill",
"line_width": "0.42",
"infill_direction": "45",
"sparse_infill_density": "15%",
"sparse_infill_pattern": "crosshatch",
"internal_bridge_support_thickness": "0.8",
"initial_layer_acceleration": "500",
"initial_layer_line_width": "0.5",
"initial_layer_print_height": "0.2",
"initial_layer_speed": "60",
"gap_infill_speed": "250",
"infill_combination": "0",
"sparse_infill_line_width": "0.45",
"infill_wall_overlap": "30%",
"sparse_infill_speed": "270",
"interface_shells": "0",
"ironing_flow": "10%",
"ironing_spacing": "0.15",
"ironing_speed": "100",
"ironing_type": "no ironing",
"layer_height": "0.24",
"reduce_infill_retraction": "1",
"filename_format": "{input_filename_base}_{filament_type[initial_tool]}_{print_time}.gcode",
"detect_overhang_wall": "1",
"overhang_1_4_speed": "0",
"overhang_2_4_speed": "50",
"overhang_3_4_speed": "30",
"overhang_4_4_speed": "10",
"only_one_wall_top": "1",
"precise_outer_wall": "1",
"inner_wall_line_width": "0.45",
"inner_wall_speed": "300",
"wall_loops": "2",
"print_settings_id": "",
"raft_layers": "0",
"seam_position": "aligned",
"seam_slope_conditional": "1",
"seam_slope_inner_walls": "1",
"seam_slope_entire_loop": "1",
"skirt_distance": "2",
"skirt_height": "1",
"skirt_loops": "0",
"minimum_sparse_infill_area": "15",
"internal_solid_infill_line_width": "0.42",
"internal_solid_infill_speed": "250",
"spiral_mode": "0",
"initial_layer_infill_speed": "105",
"standby_temperature_delta": "-5",
"enable_support": "0",
"resolution": "0.012",
"support_type": "tree(auto)",
"support_style": "default",
"support_on_build_plate_only": "0",
"support_top_z_distance": "0.2",
"support_bottom_z_distance": "0.2",
"support_filament": "0",
"support_line_width": "0.42",
"support_interface_loop_pattern": "0",
"support_interface_filament": "0",
"support_interface_top_layers": "2",
"support_interface_bottom_layers": "2",
"support_interface_spacing": "0.5",
"support_expansion": "0",
"support_interface_speed": "80",
"support_base_pattern": "default",
"support_base_pattern_spacing": "2.5",
"support_speed": "150",
"support_threshold_angle": "30",
"support_object_xy_distance": "0.35",
"tree_support_branch_diameter": "2",
"tree_support_branch_angle": "45",
"tree_support_wall_count": "1",
"detect_thin_wall": "0",
"top_surface_pattern": "monotonicline",
"top_surface_line_width": "0.42",
"top_surface_acceleration": "5000",
"top_surface_speed": "200",
"top_shell_layers": "3",
"top_shell_thickness": "0.6",
"travel_acceleration": "12000",
"travel_speed": "500",
"enable_prime_tower": "1",
"wipe_tower_no_sparse_layers": "0",
"prime_tower_width": "35",
"xy_hole_compensation": "0",
"xy_contour_compensation": "0",
"gcode_label_objects": "0",
"default_jerk": "12",
"outer_wall_jerk": "8",
"inner_wall_jerk": "8",
"infill_jerk": "12",
"top_surface_jerk": "8",
"initial_layer_jerk": "8",
"travel_jerk": "12"
}

View file

@ -0,0 +1,125 @@
{
"type": "process",
"setting_id": "GP004",
"name": "0.24mm Optimal @Creality Hi",
"from": "system",
"inherits": "fdm_process_common_klipper",
"instantiation": "true",
"adaptive_layer_height": "0",
"reduce_crossing_wall": "0",
"max_travel_detour_distance": "0",
"bottom_surface_pattern": "monotonic",
"bottom_shell_layers": "3",
"bottom_shell_thickness": "0",
"bridge_flow": "1",
"bridge_speed": "30",
"brim_width": "5",
"brim_object_gap": "0.1",
"compatible_printers": [
"Creality Hi 0.6 nozzle"
],
"compatible_printers_condition": "",
"print_sequence": "by layer",
"default_acceleration": "12000",
"bridge_no_support": "0",
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"outer_wall_line_width": "0.62",
"outer_wall_speed": "120",
"outer_wall_acceleration": "5000",
"inner_wall_acceleration": "5000",
"wall_infill_order": "inner wall/outer wall/infill",
"line_width": "0.62",
"infill_direction": "45",
"sparse_infill_density": "15%",
"sparse_infill_pattern": "crosshatch",
"internal_bridge_support_thickness": "0.8",
"initial_layer_acceleration": "500",
"initial_layer_line_width": "0.5",
"initial_layer_print_height": "0.24",
"initial_layer_speed": "50",
"gap_infill_speed": "50",
"infill_combination": "0",
"sparse_infill_line_width": "0.65",
"infill_wall_overlap": "15%",
"sparse_infill_speed": "150",
"interface_shells": "0",
"ironing_flow": "10%",
"ironing_spacing": "0.15",
"ironing_speed": "30",
"ironing_type": "no ironing",
"layer_height": "0.24",
"reduce_infill_retraction": "1",
"filename_format": "{input_filename_base}_{filament_type[initial_tool]}_{print_time}.gcode",
"detect_overhang_wall": "1",
"overhang_1_4_speed": "0",
"overhang_2_4_speed": "50",
"overhang_3_4_speed": "15",
"overhang_4_4_speed": "10",
"only_one_wall_top": "1",
"precise_outer_wall": "1",
"inner_wall_line_width": "0.65",
"inner_wall_speed": "150",
"wall_loops": "2",
"print_settings_id": "",
"raft_layers": "0",
"seam_position": "aligned",
"seam_slope_conditional": "1",
"seam_slope_inner_walls": "1",
"seam_slope_entire_loop": "1",
"skirt_distance": "2",
"skirt_height": "1",
"skirt_loops": "0",
"minimum_sparse_infill_area": "15",
"internal_solid_infill_line_width": "0.62",
"internal_solid_infill_speed": "150",
"spiral_mode": "0",
"initial_layer_infill_speed": "105",
"standby_temperature_delta": "-5",
"enable_support": "0",
"resolution": "0.012",
"support_type": "normal(auto)",
"support_style": "default",
"support_on_build_plate_only": "0",
"support_top_z_distance": "0.2",
"support_bottom_z_distance": "0.2",
"support_filament": "0",
"support_line_width": "0.62",
"support_interface_loop_pattern": "0",
"support_interface_filament": "0",
"support_interface_top_layers": "2",
"support_interface_bottom_layers": "2",
"support_interface_spacing": "0.5",
"support_expansion": "0",
"support_interface_speed": "80",
"support_base_pattern": "default",
"support_base_pattern_spacing": "2.5",
"support_speed": "150",
"support_threshold_angle": "30",
"support_object_xy_distance": "0.35",
"tree_support_branch_diameter": "2",
"tree_support_branch_angle": "45",
"tree_support_wall_count": "1",
"detect_thin_wall": "0",
"top_surface_pattern": "monotonicline",
"top_surface_line_width": "0.62",
"top_surface_acceleration": "5000",
"top_surface_speed": "150",
"top_shell_layers": "3",
"top_shell_thickness": "0.6",
"travel_acceleration": "12000",
"travel_speed": "500",
"enable_prime_tower": "0",
"wipe_tower_no_sparse_layers": "0",
"prime_tower_width": "60",
"xy_hole_compensation": "0",
"xy_contour_compensation": "0",
"gcode_label_objects": "0",
"default_jerk": "12",
"outer_wall_jerk": "8",
"inner_wall_jerk": "8",
"infill_jerk": "12",
"top_surface_jerk": "8",
"initial_layer_jerk": "8",
"travel_jerk": "12"
}

View file

@ -0,0 +1,125 @@
{
"type": "process",
"setting_id": "GP004",
"name": "0.30mm Standard @Creality Hi",
"from": "system",
"inherits": "fdm_process_common_klipper",
"instantiation": "true",
"adaptive_layer_height": "0",
"reduce_crossing_wall": "0",
"max_travel_detour_distance": "0",
"bottom_surface_pattern": "monotonic",
"bottom_shell_layers": "3",
"bottom_shell_thickness": "0",
"bridge_flow": "1",
"bridge_speed": "30",
"brim_width": "5",
"brim_object_gap": "0.1",
"compatible_printers": [
"Creality Hi 0.6 nozzle"
],
"compatible_printers_condition": "",
"print_sequence": "by layer",
"default_acceleration": "12000",
"bridge_no_support": "0",
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"outer_wall_line_width": "0.62",
"outer_wall_speed": "120",
"outer_wall_acceleration": "5000",
"inner_wall_acceleration": "5000",
"wall_infill_order": "inner wall/outer wall/infill",
"line_width": "0.62",
"infill_direction": "45",
"sparse_infill_density": "15%",
"sparse_infill_pattern": "crosshatch",
"internal_bridge_support_thickness": "0.8",
"initial_layer_acceleration": "500",
"initial_layer_line_width": "0.5",
"initial_layer_print_height": "0.3",
"initial_layer_speed": "50",
"gap_infill_speed": "50",
"infill_combination": "0",
"sparse_infill_line_width": "0.65",
"infill_wall_overlap": "15%",
"sparse_infill_speed": "150",
"interface_shells": "0",
"ironing_flow": "10%",
"ironing_spacing": "0.15",
"ironing_speed": "30",
"ironing_type": "no ironing",
"layer_height": "0.3",
"reduce_infill_retraction": "1",
"filename_format": "{input_filename_base}_{filament_type[initial_tool]}_{print_time}.gcode",
"detect_overhang_wall": "1",
"overhang_1_4_speed": "0",
"overhang_2_4_speed": "50",
"overhang_3_4_speed": "15",
"overhang_4_4_speed": "10",
"only_one_wall_top": "1",
"precise_outer_wall": "1",
"inner_wall_line_width": "0.65",
"inner_wall_speed": "150",
"wall_loops": "2",
"print_settings_id": "",
"raft_layers": "0",
"seam_position": "aligned",
"seam_slope_conditional": "1",
"seam_slope_inner_walls": "1",
"seam_slope_entire_loop": "1",
"skirt_distance": "2",
"skirt_height": "1",
"skirt_loops": "0",
"minimum_sparse_infill_area": "15",
"internal_solid_infill_line_width": "0.62",
"internal_solid_infill_speed": "150",
"spiral_mode": "0",
"initial_layer_infill_speed": "105",
"standby_temperature_delta": "-5",
"enable_support": "0",
"resolution": "0.012",
"support_type": "tree(auto)",
"support_style": "default",
"support_on_build_plate_only": "0",
"support_top_z_distance": "0.2",
"support_bottom_z_distance": "0.2",
"support_filament": "0",
"support_line_width": "0.62",
"support_interface_loop_pattern": "0",
"support_interface_filament": "0",
"support_interface_top_layers": "2",
"support_interface_bottom_layers": "2",
"support_interface_spacing": "0.5",
"support_expansion": "0",
"support_interface_speed": "80",
"support_base_pattern": "default",
"support_base_pattern_spacing": "2.5",
"support_speed": "150",
"support_threshold_angle": "30",
"support_object_xy_distance": "0.35",
"tree_support_branch_diameter": "2",
"tree_support_branch_angle": "45",
"tree_support_wall_count": "1",
"detect_thin_wall": "0",
"top_surface_pattern": "monotonicline",
"top_surface_line_width": "0.62",
"top_surface_acceleration": "5000",
"top_surface_speed": "150",
"top_shell_layers": "3",
"top_shell_thickness": "0.6",
"travel_acceleration": "12000",
"travel_speed": "500",
"enable_prime_tower": "1",
"wipe_tower_no_sparse_layers": "0",
"prime_tower_width": "35",
"xy_hole_compensation": "0",
"xy_contour_compensation": "0",
"gcode_label_objects": "0",
"default_jerk": "12",
"outer_wall_jerk": "8",
"inner_wall_jerk": "8",
"infill_jerk": "12",
"top_surface_jerk": "8",
"initial_layer_jerk": "8",
"travel_jerk": "12"
}

View file

@ -0,0 +1,125 @@
{
"type": "process",
"setting_id": "GP004",
"name": "0.36mm Draft @Creality Hi",
"from": "system",
"inherits": "fdm_process_common_klipper",
"instantiation": "true",
"adaptive_layer_height": "0",
"reduce_crossing_wall": "0",
"max_travel_detour_distance": "0",
"bottom_surface_pattern": "monotonic",
"bottom_shell_layers": "3",
"bottom_shell_thickness": "0",
"bridge_flow": "1",
"bridge_speed": "30",
"brim_width": "5",
"brim_object_gap": "0.1",
"compatible_printers": [
"Creality Hi 0.6 nozzle"
],
"compatible_printers_condition": "",
"print_sequence": "by layer",
"default_acceleration": "12000",
"bridge_no_support": "0",
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"outer_wall_line_width": "0.62",
"outer_wall_speed": "120",
"outer_wall_acceleration": "5000",
"inner_wall_acceleration": "5000",
"wall_infill_order": "inner wall/outer wall/infill",
"line_width": "0.62",
"infill_direction": "45",
"sparse_infill_density": "15%",
"sparse_infill_pattern": "crosshatch",
"internal_bridge_support_thickness": "0.8",
"initial_layer_acceleration": "500",
"initial_layer_line_width": "0.5",
"initial_layer_print_height": "0.36",
"initial_layer_speed": "50",
"gap_infill_speed": "50",
"infill_combination": "0",
"sparse_infill_line_width": "0.65",
"infill_wall_overlap": "15%",
"sparse_infill_speed": "150",
"interface_shells": "0",
"ironing_flow": "10%",
"ironing_spacing": "0.15",
"ironing_speed": "30",
"ironing_type": "no ironing",
"layer_height": "0.36",
"reduce_infill_retraction": "1",
"filename_format": "{input_filename_base}_{filament_type[initial_tool]}_{print_time}.gcode",
"detect_overhang_wall": "1",
"overhang_1_4_speed": "0",
"overhang_2_4_speed": "50",
"overhang_3_4_speed": "15",
"overhang_4_4_speed": "10",
"only_one_wall_top": "1",
"precise_outer_wall": "1",
"inner_wall_line_width": "0.65",
"inner_wall_speed": "150",
"wall_loops": "2",
"print_settings_id": "",
"raft_layers": "0",
"seam_position": "aligned",
"seam_slope_conditional": "1",
"seam_slope_inner_walls": "1",
"seam_slope_entire_loop": "1",
"skirt_distance": "2",
"skirt_height": "1",
"skirt_loops": "0",
"minimum_sparse_infill_area": "15",
"internal_solid_infill_line_width": "0.62",
"internal_solid_infill_speed": "150",
"spiral_mode": "0",
"initial_layer_infill_speed": "105",
"standby_temperature_delta": "-5",
"enable_support": "0",
"resolution": "0.012",
"support_type": "tree(auto)",
"support_style": "default",
"support_on_build_plate_only": "0",
"support_top_z_distance": "0.2",
"support_bottom_z_distance": "0.2",
"support_filament": "0",
"support_line_width": "0.62",
"support_interface_loop_pattern": "0",
"support_interface_filament": "0",
"support_interface_top_layers": "2",
"support_interface_bottom_layers": "2",
"support_interface_spacing": "0.5",
"support_expansion": "0",
"support_interface_speed": "80",
"support_base_pattern": "default",
"support_base_pattern_spacing": "2.5",
"support_speed": "150",
"support_threshold_angle": "30",
"support_object_xy_distance": "0.35",
"tree_support_branch_diameter": "2",
"tree_support_branch_angle": "45",
"tree_support_wall_count": "1",
"detect_thin_wall": "0",
"top_surface_pattern": "monotonicline",
"top_surface_line_width": "0.62",
"top_surface_acceleration": "5000",
"top_surface_speed": "150",
"top_shell_layers": "3",
"top_shell_thickness": "0.6",
"travel_acceleration": "12000",
"travel_speed": "500",
"enable_prime_tower": "1",
"wipe_tower_no_sparse_layers": "0",
"prime_tower_width": "35",
"xy_hole_compensation": "0",
"xy_contour_compensation": "0",
"gcode_label_objects": "0",
"default_jerk": "12",
"outer_wall_jerk": "8",
"inner_wall_jerk": "8",
"infill_jerk": "12",
"top_surface_jerk": "8",
"initial_layer_jerk": "8",
"travel_jerk": "12"
}

View file

@ -1,280 +0,0 @@
#include <stack>
#include <algorithm>
#include <cmath>
#include "PerimeterOrder.hpp"
#include "libslic3r/Arachne/utils/ExtrusionJunction.hpp"
#include "libslic3r/Point.hpp"
namespace Slic3r::Arachne::PerimeterOrder {
using namespace Arachne;
static size_t get_extrusion_lines_count(const Perimeters &perimeters) {
size_t extrusion_lines_count = 0;
for (const Perimeter &perimeter : perimeters)
extrusion_lines_count += perimeter.size();
return extrusion_lines_count;
}
static PerimeterExtrusions get_sorted_perimeter_extrusions_by_area(const Perimeters &perimeters) {
PerimeterExtrusions sorted_perimeter_extrusions;
sorted_perimeter_extrusions.reserve(get_extrusion_lines_count(perimeters));
for (const Perimeter &perimeter : perimeters) {
for (const ExtrusionLine &extrusion_line : perimeter) {
if (extrusion_line.empty())
continue; // This shouldn't ever happen.
const BoundingBox bbox = get_extents(extrusion_line);
// Be aware that Arachne produces contours with clockwise orientation and holes with counterclockwise orientation.
const double area = std::abs(extrusion_line.area());
const Polygon polygon = extrusion_line.is_closed ? to_polygon(extrusion_line) : Polygon{};
sorted_perimeter_extrusions.emplace_back(extrusion_line, area, polygon, bbox);
}
}
// Open extrusions have an area equal to zero, so sorting based on the area ensures that open extrusions will always be before closed ones.
std::sort(sorted_perimeter_extrusions.begin(), sorted_perimeter_extrusions.end(),
[](const PerimeterExtrusion &l, const PerimeterExtrusion &r) { return l.area < r.area; });
return sorted_perimeter_extrusions;
}
// Functions fill adjacent_perimeter_extrusions field for every PerimeterExtrusion by pointers to PerimeterExtrusions that contain or are inside this PerimeterExtrusion.
static void construct_perimeter_extrusions_adjacency_graph(PerimeterExtrusions &sorted_perimeter_extrusions) {
// Construct a graph (defined using adjacent_perimeter_extrusions field) where two PerimeterExtrusion are adjacent when one is inside the other.
std::vector<bool> root_candidates(sorted_perimeter_extrusions.size(), false);
for (PerimeterExtrusion &perimeter_extrusion : sorted_perimeter_extrusions) {
const size_t perimeter_extrusion_idx = &perimeter_extrusion - sorted_perimeter_extrusions.data();
if (!perimeter_extrusion.is_closed()) {
root_candidates[perimeter_extrusion_idx] = true;
continue;
}
for (PerimeterExtrusion &root_candidate : sorted_perimeter_extrusions) {
const size_t root_candidate_idx = &root_candidate - sorted_perimeter_extrusions.data();
if (!root_candidates[root_candidate_idx])
continue;
if (perimeter_extrusion.bbox.contains(root_candidate.bbox) && perimeter_extrusion.polygon.contains(root_candidate.extrusion.junctions.front().p)) {
perimeter_extrusion.adjacent_perimeter_extrusions.emplace_back(&root_candidate);
root_candidate.adjacent_perimeter_extrusions.emplace_back(&perimeter_extrusion);
root_candidates[root_candidate_idx] = false;
}
}
root_candidates[perimeter_extrusion_idx] = true;
}
}
// Perform the depth-first search to assign the nearest external perimeter for every PerimeterExtrusion.
// When some PerimeterExtrusion is achievable from more than one external perimeter, then we choose the
// one that comes from a contour.
static void assign_nearest_external_perimeter(PerimeterExtrusions &sorted_perimeter_extrusions) {
std::stack<PerimeterExtrusion *> stack;
for (PerimeterExtrusion &perimeter_extrusion : sorted_perimeter_extrusions) {
if (perimeter_extrusion.is_external_perimeter()) {
perimeter_extrusion.depth = 0;
perimeter_extrusion.nearest_external_perimeter = &perimeter_extrusion;
stack.push(&perimeter_extrusion);
}
}
while (!stack.empty()) {
PerimeterExtrusion *current_extrusion = stack.top();
stack.pop();
for (PerimeterExtrusion *adjacent_extrusion : current_extrusion->adjacent_perimeter_extrusions) {
const size_t adjacent_extrusion_depth = current_extrusion->depth + 1;
// Update depth when the new depth is smaller or when we can achieve the same depth from a contour.
// This will ensure that the internal perimeter will be extruded before the outer external perimeter
// when there are two external perimeters and one internal.
if (adjacent_extrusion_depth < adjacent_extrusion->depth) {
adjacent_extrusion->nearest_external_perimeter = current_extrusion->nearest_external_perimeter;
adjacent_extrusion->depth = adjacent_extrusion_depth;
stack.push(adjacent_extrusion);
} else if (adjacent_extrusion_depth == adjacent_extrusion->depth && !adjacent_extrusion->nearest_external_perimeter->is_contour() && current_extrusion->is_contour()) {
adjacent_extrusion->nearest_external_perimeter = current_extrusion->nearest_external_perimeter;
stack.push(adjacent_extrusion);
}
}
}
}
inline Point get_end_position(const ExtrusionLine &extrusion) {
if (extrusion.is_closed)
return extrusion.junctions[0].p; // We ended where we started.
else
return extrusion.junctions.back().p; // Pick the other end from where we started.
}
// Returns ordered extrusions.
static std::vector<const PerimeterExtrusion *> ordered_perimeter_extrusions_to_minimize_distances(Point current_position, std::vector<const PerimeterExtrusion *> extrusions) {
// Ensure that open extrusions will be placed before the closed one.
std::sort(extrusions.begin(), extrusions.end(),
[](const PerimeterExtrusion *l, const PerimeterExtrusion *r) -> bool { return l->is_closed() < r->is_closed(); });
std::vector<const PerimeterExtrusion *> ordered_extrusions;
std::vector<bool> already_selected(extrusions.size(), false);
while (ordered_extrusions.size() < extrusions.size()) {
double nearest_distance_sqr = std::numeric_limits<double>::max();
size_t nearest_extrusion_idx = 0;
bool is_nearest_closed = false;
for (size_t extrusion_idx = 0; extrusion_idx < extrusions.size(); ++extrusion_idx) {
if (already_selected[extrusion_idx])
continue;
const ExtrusionLine &extrusion_line = extrusions[extrusion_idx]->extrusion;
const Point &extrusion_start_position = extrusion_line.junctions.front().p;
const double distance_sqr = (current_position - extrusion_start_position).cast<double>().squaredNorm();
if (distance_sqr < nearest_distance_sqr) {
if (extrusion_line.is_closed || (!extrusion_line.is_closed && nearest_distance_sqr == std::numeric_limits<double>::max()) || (!extrusion_line.is_closed && !is_nearest_closed)) {
nearest_extrusion_idx = extrusion_idx;
nearest_distance_sqr = distance_sqr;
is_nearest_closed = extrusion_line.is_closed;
}
}
}
already_selected[nearest_extrusion_idx] = true;
const PerimeterExtrusion *nearest_extrusion = extrusions[nearest_extrusion_idx];
current_position = get_end_position(nearest_extrusion->extrusion);
ordered_extrusions.emplace_back(nearest_extrusion);
}
return ordered_extrusions;
}
struct GroupedPerimeterExtrusions
{
GroupedPerimeterExtrusions() = delete;
explicit GroupedPerimeterExtrusions(const PerimeterExtrusion *external_perimeter_extrusion)
: external_perimeter_extrusion(external_perimeter_extrusion) {}
std::vector<const PerimeterExtrusion *> extrusions;
const PerimeterExtrusion *external_perimeter_extrusion = nullptr;
};
// Returns vector of indexes that represent the order of grouped extrusions in grouped_extrusions.
static std::vector<size_t> order_of_grouped_perimeter_extrusions_to_minimize_distances(Point current_position, std::vector<GroupedPerimeterExtrusions> grouped_extrusions) {
// Ensure that holes will be placed before contour and open extrusions before the closed one.
std::sort(grouped_extrusions.begin(), grouped_extrusions.end(), [](const GroupedPerimeterExtrusions &l, const GroupedPerimeterExtrusions &r) -> bool {
return (l.external_perimeter_extrusion->is_contour() < r.external_perimeter_extrusion->is_contour()) ||
(l.external_perimeter_extrusion->is_contour() == r.external_perimeter_extrusion->is_contour() && l.external_perimeter_extrusion->is_closed() < r.external_perimeter_extrusion->is_closed());
});
const size_t holes_cnt = std::count_if(grouped_extrusions.begin(), grouped_extrusions.end(), [](const GroupedPerimeterExtrusions &grouped_extrusions) {
return !grouped_extrusions.external_perimeter_extrusion->is_contour();
});
std::vector<size_t> grouped_extrusions_order;
std::vector<bool> already_selected(grouped_extrusions.size(), false);
while (grouped_extrusions_order.size() < grouped_extrusions.size()) {
double nearest_distance_sqr = std::numeric_limits<double>::max();
size_t nearest_grouped_extrusions_idx = 0;
bool is_nearest_closed = false;
// First we order all holes and then we start ordering contours.
const size_t grouped_extrusion_end = grouped_extrusions_order.size() < holes_cnt ? holes_cnt: grouped_extrusions.size();
for (size_t grouped_extrusion_idx = 0; grouped_extrusion_idx < grouped_extrusion_end; ++grouped_extrusion_idx) {
if (already_selected[grouped_extrusion_idx])
continue;
const ExtrusionLine &external_perimeter_extrusion_line = grouped_extrusions[grouped_extrusion_idx].external_perimeter_extrusion->extrusion;
const Point &extrusion_start_position = external_perimeter_extrusion_line.junctions.front().p;
const double distance_sqr = (current_position - extrusion_start_position).cast<double>().squaredNorm();
if (distance_sqr < nearest_distance_sqr) {
if (external_perimeter_extrusion_line.is_closed || (!external_perimeter_extrusion_line.is_closed && nearest_distance_sqr == std::numeric_limits<double>::max()) || (!external_perimeter_extrusion_line.is_closed && !is_nearest_closed)) {
nearest_grouped_extrusions_idx = grouped_extrusion_idx;
nearest_distance_sqr = distance_sqr;
is_nearest_closed = external_perimeter_extrusion_line.is_closed;
}
}
}
grouped_extrusions_order.emplace_back(nearest_grouped_extrusions_idx);
already_selected[nearest_grouped_extrusions_idx] = true;
const GroupedPerimeterExtrusions &nearest_grouped_extrusions = grouped_extrusions[nearest_grouped_extrusions_idx];
const ExtrusionLine &last_extrusion_line = nearest_grouped_extrusions.extrusions.back()->extrusion;
current_position = get_end_position(last_extrusion_line);
}
return grouped_extrusions_order;
}
static PerimeterExtrusions extract_ordered_perimeter_extrusions(const PerimeterExtrusions &sorted_perimeter_extrusions, const bool external_perimeters_first) {
// Extrusions are ordered inside each group.
std::vector<GroupedPerimeterExtrusions> grouped_extrusions;
std::stack<const PerimeterExtrusion *> stack;
std::vector<bool> visited(sorted_perimeter_extrusions.size(), false);
for (const PerimeterExtrusion &perimeter_extrusion : sorted_perimeter_extrusions) {
if (!perimeter_extrusion.is_external_perimeter())
continue;
stack.push(&perimeter_extrusion);
visited.assign(sorted_perimeter_extrusions.size(), false);
grouped_extrusions.emplace_back(&perimeter_extrusion);
while (!stack.empty()) {
const PerimeterExtrusion *current_extrusion = stack.top();
const size_t current_extrusion_idx = current_extrusion - sorted_perimeter_extrusions.data();
stack.pop();
visited[current_extrusion_idx] = true;
if (current_extrusion->nearest_external_perimeter == &perimeter_extrusion) {
grouped_extrusions.back().extrusions.emplace_back(current_extrusion);
}
std::vector<const PerimeterExtrusion *> available_candidates;
for (const PerimeterExtrusion *adjacent_extrusion : current_extrusion->adjacent_perimeter_extrusions) {
const size_t adjacent_extrusion_idx = adjacent_extrusion - sorted_perimeter_extrusions.data();
if (!visited[adjacent_extrusion_idx] && !adjacent_extrusion->is_external_perimeter() && adjacent_extrusion->nearest_external_perimeter == &perimeter_extrusion) {
available_candidates.emplace_back(adjacent_extrusion);
}
}
if (available_candidates.size() == 1) {
stack.push(available_candidates.front());
} else if (available_candidates.size() > 1) {
// When there is more than one available candidate, then order candidates to minimize distances between
// candidates and also to minimize the distance from the current_position.
std::vector<const PerimeterExtrusion *> adjacent_extrusions = ordered_perimeter_extrusions_to_minimize_distances(Point::Zero(), available_candidates);
for (auto extrusion_it = adjacent_extrusions.rbegin(); extrusion_it != adjacent_extrusions.rend(); ++extrusion_it) {
stack.push(*extrusion_it);
}
}
}
if (!external_perimeters_first)
std::reverse(grouped_extrusions.back().extrusions.begin(), grouped_extrusions.back().extrusions.end());
}
const std::vector<size_t> grouped_extrusion_order = order_of_grouped_perimeter_extrusions_to_minimize_distances(Point::Zero(), grouped_extrusions);
PerimeterExtrusions ordered_extrusions;
for (size_t order_idx : grouped_extrusion_order) {
for (const PerimeterExtrusion *perimeter_extrusion : grouped_extrusions[order_idx].extrusions)
ordered_extrusions.emplace_back(*perimeter_extrusion);
}
return ordered_extrusions;
}
// FIXME: From the point of better patch planning, it should be better to do ordering when we have generated all extrusions (for now, when G-Code is exported).
// FIXME: It would be better to extract the adjacency graph of extrusions from the SkeletalTrapezoidation graph.
PerimeterExtrusions ordered_perimeter_extrusions(const Perimeters &perimeters, const bool external_perimeters_first) {
PerimeterExtrusions sorted_perimeter_extrusions = get_sorted_perimeter_extrusions_by_area(perimeters);
construct_perimeter_extrusions_adjacency_graph(sorted_perimeter_extrusions);
assign_nearest_external_perimeter(sorted_perimeter_extrusions);
return extract_ordered_perimeter_extrusions(sorted_perimeter_extrusions, external_perimeters_first);
}
} // namespace Slic3r::Arachne::PerimeterOrder

View file

@ -1,51 +0,0 @@
#ifndef slic3r_GCode_PerimeterOrder_hpp_
#define slic3r_GCode_PerimeterOrder_hpp_
#include <stddef.h>
#include <limits>
#include <vector>
#include <cstddef>
#include "libslic3r/Arachne/utils/ExtrusionLine.hpp"
#include "libslic3r/BoundingBox.hpp"
#include "libslic3r/Polygon.hpp"
namespace Slic3r::Arachne::PerimeterOrder {
// Data structure stores ExtrusionLine (closed and open) together with additional data.
struct PerimeterExtrusion
{
explicit PerimeterExtrusion(const Arachne::ExtrusionLine &extrusion, const double area, const Polygon &polygon, const BoundingBox &bbox)
: extrusion(extrusion), area(area), polygon(polygon), bbox(bbox) {}
Arachne::ExtrusionLine extrusion;
// Absolute value of the area of the polygon. The value is always non-negative, even for holes.
double area = 0;
// Polygon is non-empty only for closed extrusions.
Polygon polygon;
BoundingBox bbox;
std::vector<PerimeterExtrusion *> adjacent_perimeter_extrusions;
// How far is this perimeter from the nearest external perimeter. Contour is always preferred over holes.
size_t depth = std::numeric_limits<size_t>::max();
PerimeterExtrusion *nearest_external_perimeter = nullptr;
// Returns if ExtrusionLine is a contour or a hole.
bool is_contour() const { return extrusion.is_contour(); }
// Returns if ExtrusionLine is closed or opened.
bool is_closed() const { return extrusion.is_closed; }
// Returns if ExtrusionLine is an external or an internal perimeter.
bool is_external_perimeter() const { return extrusion.is_external_perimeter(); }
};
using PerimeterExtrusions = std::vector<PerimeterExtrusion>;
PerimeterExtrusions ordered_perimeter_extrusions(const Perimeters &perimeters, bool external_perimeters_first);
} // namespace Slic3r::Arachne::PerimeterOrder
#endif // slic3r_GCode_Travels_hpp_

View file

@ -782,4 +782,98 @@ bool WallToolPaths::removeEmptyToolPaths(std::vector<VariableWidthLines> &toolpa
return toolpaths.empty(); return toolpaths.empty();
} }
/*!
* Get the order constraints of the insets when printing walls per region / hole.
* Each returned pair consists of adjacent wall lines where the left has an inset_idx one lower than the right.
*
* Odd walls should always go after their enclosing wall polygons.
*
* \param outer_to_inner Whether the wall polygons with a lower inset_idx should go before those with a higher one.
*/
WallToolPaths::ExtrusionLineSet WallToolPaths::getRegionOrder(const std::vector<ExtrusionLine *> &input, const bool outer_to_inner)
{
ExtrusionLineSet order_requirements;
// We build a grid where we map toolpath vertex locations to toolpaths,
// so that we can easily find which two toolpaths are next to each other,
// which is the requirement for there to be an order constraint.
//
// We use a PointGrid rather than a LineGrid to save on computation time.
// In very rare cases two insets might lie next to each other without having neighboring vertices, e.g.
// \ .
// | / .
// | / .
// || .
// | \ .
// | \ .
// / .
// However, because of how Arachne works this will likely never be the case for two consecutive insets.
// On the other hand one could imagine that two consecutive insets of a very large circle
// could be simplify()ed such that the remaining vertices of the two insets don't align.
// In those cases the order requirement is not captured,
// which means that the PathOrderOptimizer *might* result in a violation of the user set path order.
// This problem is expected to be not so severe and happen very sparsely.
coord_t max_line_w = 0u;
for (const ExtrusionLine *line : input) // compute max_line_w
for (const ExtrusionJunction &junction : *line)
max_line_w = std::max(max_line_w, junction.w);
if (max_line_w == 0u)
return order_requirements;
struct LineLoc
{
ExtrusionJunction j;
const ExtrusionLine *line;
};
struct Locator
{
Point operator()(const LineLoc &elem) { return elem.j.p; }
};
// How much farther two verts may be apart due to corners.
// This distance must be smaller than 2, because otherwise
// we could create an order requirement between e.g.
// wall 2 of one region and wall 3 of another region,
// while another wall 3 of the first region would lie in between those two walls.
// However, higher values are better against the limitations of using a PointGrid rather than a LineGrid.
constexpr float diagonal_extension = 1.9f;
const auto searching_radius = coord_t(max_line_w * diagonal_extension);
using GridT = SparsePointGrid<LineLoc, Locator>;
GridT grid(searching_radius);
for (const ExtrusionLine *line : input)
for (const ExtrusionJunction &junction : *line) grid.insert(LineLoc{junction, line});
for (const std::pair<const SquareGrid::GridPoint, LineLoc> &pair : grid) {
const LineLoc &lineloc_here = pair.second;
const ExtrusionLine *here = lineloc_here.line;
Point loc_here = pair.second.j.p;
std::vector<LineLoc> nearby_verts = grid.getNearby(loc_here, searching_radius);
for (const LineLoc &lineloc_nearby : nearby_verts) {
const ExtrusionLine *nearby = lineloc_nearby.line;
if (nearby == here)
continue;
if (nearby->inset_idx == here->inset_idx)
continue;
if (nearby->inset_idx > here->inset_idx + 1)
continue; // not directly adjacent
if (here->inset_idx > nearby->inset_idx + 1)
continue; // not directly adjacent
if (!shorter_then(loc_here - lineloc_nearby.j.p, (lineloc_here.j.w + lineloc_nearby.j.w) / 2 * diagonal_extension))
continue; // points are too far away from each other
if (here->is_odd || nearby->is_odd) {
if (here->is_odd && !nearby->is_odd && nearby->inset_idx < here->inset_idx)
order_requirements.emplace(std::make_pair(nearby, here));
if (nearby->is_odd && !here->is_odd && here->inset_idx < nearby->inset_idx)
order_requirements.emplace(std::make_pair(here, nearby));
} else if ((nearby->inset_idx < here->inset_idx) == outer_to_inner) {
order_requirements.emplace(std::make_pair(nearby, here));
} else {
assert((nearby->inset_idx > here->inset_idx) == outer_to_inner);
order_requirements.emplace(std::make_pair(here, nearby));
}
}
}
return order_requirements;
}
} // namespace Slic3r::Arachne } // namespace Slic3r::Arachne

View file

@ -90,6 +90,16 @@ public:
using ExtrusionLineSet = ankerl::unordered_dense::set<std::pair<const ExtrusionLine *, const ExtrusionLine *>, boost::hash<std::pair<const ExtrusionLine *, const ExtrusionLine *>>>; using ExtrusionLineSet = ankerl::unordered_dense::set<std::pair<const ExtrusionLine *, const ExtrusionLine *>, boost::hash<std::pair<const ExtrusionLine *, const ExtrusionLine *>>>;
/*!
* Get the order constraints of the insets when printing walls per region / hole.
* Each returned pair consists of adjacent wall lines where the left has an inset_idx one lower than the right.
*
* Odd walls should always go after their enclosing wall polygons.
*
* \param outer_to_inner Whether the wall polygons with a lower inset_idx should go before those with a higher one.
*/
static ExtrusionLineSet getRegionOrder(const std::vector<ExtrusionLine *> &input, bool outer_to_inner);
protected: protected:
/*! /*!
* Stitch the polylines together and form closed polygons. * Stitch the polylines together and form closed polygons.

View file

@ -264,10 +264,9 @@ bool ExtrusionLine::is_contour() const
return poly.is_clockwise(); return poly.is_clockwise();
} }
double ExtrusionLine::area() const { double ExtrusionLine::area() const
if (!this->is_closed) {
return 0.; assert(this->is_closed);
double a = 0.; double a = 0.;
if (this->junctions.size() >= 3) { if (this->junctions.size() >= 3) {
Vec2d p1 = this->junctions.back().p.cast<double>(); Vec2d p1 = this->junctions.back().p.cast<double>();
@ -277,25 +276,9 @@ double ExtrusionLine::area() const {
p1 = p2; p1 = p2;
} }
} }
return 0.5 * a; return 0.5 * a;
} }
Points to_points(const ExtrusionLine &extrusion_line) {
Points points;
points.reserve(extrusion_line.junctions.size());
for (const ExtrusionJunction &junction : extrusion_line.junctions)
points.emplace_back(junction.p);
return points;
}
BoundingBox get_extents(const ExtrusionLine &extrusion_line) {
BoundingBox bbox;
for (const ExtrusionJunction &junction : extrusion_line.junctions)
bbox.merge(junction.p);
return bbox;
}
} // namespace Slic3r::Arachne } // namespace Slic3r::Arachne
namespace Slic3r { namespace Slic3r {

View file

@ -199,8 +199,6 @@ struct ExtrusionLine
bool is_contour() const; bool is_contour() const;
double area() const; double area() const;
bool is_external_perimeter() const { return this->inset_idx == 0; }
}; };
template<class PathType> template<class PathType>
@ -227,7 +225,6 @@ static inline Slic3r::ThickPolyline to_thick_polyline(const PathType &path)
static inline Polygon to_polygon(const ExtrusionLine &line) static inline Polygon to_polygon(const ExtrusionLine &line)
{ {
Polygon out; Polygon out;
assert(line.is_closed);
assert(line.junctions.size() >= 3); assert(line.junctions.size() >= 3);
assert(line.junctions.front().p == line.junctions.back().p); assert(line.junctions.front().p == line.junctions.back().p);
out.points.reserve(line.junctions.size() - 1); out.points.reserve(line.junctions.size() - 1);
@ -236,11 +233,24 @@ static inline Polygon to_polygon(const ExtrusionLine &line)
return out; return out;
} }
Points to_points(const ExtrusionLine &extrusion_line); static Points to_points(const ExtrusionLine &extrusion_line)
{
BoundingBox get_extents(const ExtrusionLine &extrusion_line); Points points;
points.reserve(extrusion_line.junctions.size());
for (const ExtrusionJunction &junction : extrusion_line.junctions)
points.emplace_back(junction.p);
return points;
}
#if 0 #if 0
static BoundingBox get_extents(const ExtrusionLine &extrusion_line)
{
BoundingBox bbox;
for (const ExtrusionJunction &junction : extrusion_line.junctions)
bbox.merge(junction.p);
return bbox;
}
static BoundingBox get_extents(const std::vector<ExtrusionLine> &extrusion_lines) static BoundingBox get_extents(const std::vector<ExtrusionLine> &extrusion_lines)
{ {
BoundingBox bbox; BoundingBox bbox;
@ -271,8 +281,6 @@ static std::vector<Points> to_points(const std::vector<const ExtrusionLine *> &e
#endif #endif
using VariableWidthLines = std::vector<ExtrusionLine>; //<! The ExtrusionLines generated by libArachne using VariableWidthLines = std::vector<ExtrusionLine>; //<! The ExtrusionLines generated by libArachne
using Perimeter = VariableWidthLines;
using Perimeters = std::vector<Perimeter>;
} // namespace Slic3r::Arachne } // namespace Slic3r::Arachne

View file

@ -103,8 +103,10 @@ void update_selected_items_inflation(ArrangePolygons& selected, const DynamicPri
BoundingBox bedbb = Polygon(bedpts).bounding_box(); BoundingBox bedbb = Polygon(bedpts).bounding_box();
// set obj distance for auto seq_print // set obj distance for auto seq_print
if (params.is_seq_print) { if (params.is_seq_print) {
if (params.all_objects_are_short) bool all_objects_are_short = std::all_of(selected.begin(), selected.end(), [&](ArrangePolygon& ap) { return ap.height < params.nozzle_height; });
if (all_objects_are_short) {
params.min_obj_distance = std::max(params.min_obj_distance, scaled(std::max(MAX_OUTER_NOZZLE_DIAMETER/2.f, params.object_skirt_offset*2)+0.001)); params.min_obj_distance = std::max(params.min_obj_distance, scaled(std::max(MAX_OUTER_NOZZLE_DIAMETER/2.f, params.object_skirt_offset*2)+0.001));
}
else else
params.min_obj_distance = std::max(params.min_obj_distance, scaled(params.clearance_radius + 0.001)); // +0.001mm to avoid clearance check fail due to rounding error params.min_obj_distance = std::max(params.min_obj_distance, scaled(params.clearance_radius + 0.001)); // +0.001mm to avoid clearance check fail due to rounding error
} }

View file

@ -135,7 +135,6 @@ struct ArrangeParams {
float clearance_radius = 0; float clearance_radius = 0;
float object_skirt_offset = 0; float object_skirt_offset = 0;
float nozzle_height = 0; float nozzle_height = 0;
bool all_objects_are_short = false;
float printable_height = 256.0; float printable_height = 256.0;
Vec2d align_center{ 0.5,0.5 }; Vec2d align_center{ 0.5,0.5 };

View file

@ -433,8 +433,6 @@ set(lisbslic3r_sources
Arachne/utils/PolygonsSegmentIndex.hpp Arachne/utils/PolygonsSegmentIndex.hpp
Arachne/utils/PolylineStitcher.hpp Arachne/utils/PolylineStitcher.hpp
Arachne/utils/PolylineStitcher.cpp Arachne/utils/PolylineStitcher.cpp
Arachne/PerimeterOrder.hpp
Arachne/PerimeterOrder.cpp
Arachne/SkeletalTrapezoidation.hpp Arachne/SkeletalTrapezoidation.hpp
Arachne/SkeletalTrapezoidation.cpp Arachne/SkeletalTrapezoidation.cpp
Arachne/SkeletalTrapezoidationEdge.hpp Arachne/SkeletalTrapezoidationEdge.hpp

View file

@ -50,6 +50,7 @@ Fill* Fill::new_from_type(const InfillPattern type)
case ipTriangles: return new FillTriangles(); case ipTriangles: return new FillTriangles();
case ipStars: return new FillStars(); case ipStars: return new FillStars();
case ipCubic: return new FillCubic(); case ipCubic: return new FillCubic();
case ipQuarterCubic: return new FillQuarterCubic();
case ipArchimedeanChords: return new FillArchimedeanChords(); case ipArchimedeanChords: return new FillArchimedeanChords();
case ipHilbertCurve: return new FillHilbertCurve(); case ipHilbertCurve: return new FillHilbertCurve();
case ipOctagramSpiral: return new FillOctagramSpiral(); case ipOctagramSpiral: return new FillOctagramSpiral();

View file

@ -9,6 +9,7 @@
#include <boost/container/small_vector.hpp> #include <boost/container/small_vector.hpp>
#include <boost/log/trivial.hpp> #include <boost/log/trivial.hpp>
#include <boost/static_assert.hpp> #include <boost/static_assert.hpp>
#include <boost/math/constants/constants.hpp>
#include "../ClipperUtils.hpp" #include "../ClipperUtils.hpp"
#include "../ExPolygon.hpp" #include "../ExPolygon.hpp"
@ -3035,6 +3036,39 @@ Polylines FillCubic::fill_surface(const Surface *surface, const FillParams &para
return polylines_out; return polylines_out;
} }
Polylines FillQuarterCubic::fill_surface(const Surface* surface, const FillParams& params)
{
using namespace boost::math::float_constants;
Polylines polylines_out;
coord_t line_width = coord_t(scale_(this->spacing));
coord_t period = coord_t(scale_(this->spacing) / params.density) * 4;
// First half tetrahedral fill
double pattern_z_shift = 0.0;
coord_t shift = coord_t(one_div_root_two * (scale_(z) + pattern_z_shift * period * 2)) % period;
shift = std::min(shift, period - shift); // symmetry due to the fact that we are applying the shift in both directions
shift = std::min(shift, period / 2 - line_width / 2); // don't put lines too close to each other
shift = std::max(shift, line_width / 2); // don't put lines too close to each other
float dx1 = unscale_(shift);
// Second half tetrahedral fill
pattern_z_shift = 0.5;
shift = coord_t(one_div_root_two * (scale_(z) + pattern_z_shift * period * 2)) % period;
shift = std::min(shift, period - shift); // symmetry due to the fact that we are applying the shift in both directions
shift = std::min(shift, period / 2 - line_width / 2); // don't put lines too close to each other
shift = std::max(shift, line_width / 2); // don't put lines too close to each other
float dx2 = unscale_(shift);
if (!this->fill_surface_by_multilines(
surface, params,
{{0.f, dx1}, {0.f, -dx1}, {float(M_PI / 2.), dx2}, {float(M_PI / 2.), -dx2}},
polylines_out))
BOOST_LOG_TRIVIAL(error) << "FillQuarterCubic::fill_surface() failed to fill a region.";
return polylines_out;
}
Polylines FillSupportBase::fill_surface(const Surface *surface, const FillParams &params) Polylines FillSupportBase::fill_surface(const Surface *surface, const FillParams &params)
{ {
assert(! params.full_infill()); assert(! params.full_infill());

View file

@ -107,6 +107,20 @@ protected:
float _layer_angle(size_t idx) const override { return 0.f; } float _layer_angle(size_t idx) const override { return 0.f; }
}; };
// Added QuarterCubic pattern from Cura
class FillQuarterCubic : public FillRectilinear
{
public:
Fill* clone() const override { return new FillQuarterCubic(*this); }
~FillQuarterCubic() override = default;
Polylines fill_surface(const Surface *surface, const FillParams &params) override;
protected:
// The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill.
float _layer_angle(size_t idx) const override { return 0.f; }
};
class FillSupportBase : public FillRectilinear class FillSupportBase : public FillRectilinear
{ {
public: public:

View file

@ -197,15 +197,19 @@ static void getNamedSolids(const TopLoc_Location& location, const std::string& p
} }
} else { } else {
TopoDS_Shape shape; TopoDS_Shape shape;
TopExp_Explorer explorer;
shapeTool->GetShape(referredLabel, shape); shapeTool->GetShape(referredLabel, shape);
TopAbs_ShapeEnum shape_type = shape.ShapeType(); TopAbs_ShapeEnum shape_type = shape.ShapeType();
BRepBuilderAPI_Transform transform(shape, localLocation, Standard_True); BRepBuilderAPI_Transform transform(shape, localLocation, Standard_True);
int i = 0;
switch (shape_type) { switch (shape_type) {
case TopAbs_COMPOUND: case TopAbs_COMPOUND:
namedSolids.emplace_back(TopoDS::Compound(transform.Shape()), fullName);
break;
case TopAbs_COMPSOLID: case TopAbs_COMPSOLID:
namedSolids.emplace_back(TopoDS::CompSolid(transform.Shape()), fullName); for (explorer.Init(transform.Shape(), TopAbs_SOLID); explorer.More(); explorer.Next()) {
i++;
const TopoDS_Shape& currentShape = explorer.Current();
namedSolids.emplace_back(TopoDS::Solid(currentShape), fullName + "-SOLID-" + std::to_string(i));
}
break; break;
case TopAbs_SOLID: case TopAbs_SOLID:
namedSolids.emplace_back(TopoDS::Solid(transform.Shape()), fullName); namedSolids.emplace_back(TopoDS::Solid(transform.Shape()), fullName);

View file

@ -741,6 +741,7 @@ static std::vector<Vec2d> get_path_of_change_filament(const Print& print)
gcodegen.config().filament_multitool_ramming.get_at(tcr.initial_tool)); gcodegen.config().filament_multitool_ramming.get_at(tcr.initial_tool));
const bool should_travel_to_tower = !tcr.priming && (tcr.force_travel // wipe tower says so const bool should_travel_to_tower = !tcr.priming && (tcr.force_travel // wipe tower says so
|| !needs_toolchange // this is just finishing the tower with no toolchange || !needs_toolchange // this is just finishing the tower with no toolchange
|| will_go_down // Make sure to move to prime tower before moving down
|| is_ramming); || is_ramming);
if (should_travel_to_tower || gcodegen.m_need_change_layer_lift_z) { if (should_travel_to_tower || gcodegen.m_need_change_layer_lift_z) {
@ -3823,10 +3824,16 @@ LayerResult GCode::process_layer(
return next_extruder; return next_extruder;
}; };
if (m_config.enable_overhang_speed && !m_config.overhang_speed_classic) { for (const auto &layer_to_print : layers) {
for (const auto &layer_to_print : layers) { if (layer_to_print.object_layer) {
m_extrusion_quality_estimator.prepare_for_new_layer(layer_to_print.original_object, const auto& regions = layer_to_print.object_layer->regions();
layer_to_print.object_layer); const bool enable_overhang_speed = std::any_of(regions.begin(), regions.end(), [](const LayerRegion* r) {
return r->has_extrusions() && r->region().config().enable_overhang_speed && !r->region().config().overhang_speed_classic;
});
if (enable_overhang_speed) {
m_extrusion_quality_estimator.prepare_for_new_layer(layer_to_print.original_object,
layer_to_print.object_layer);
}
} }
} }
@ -4190,8 +4197,11 @@ LayerResult GCode::process_layer(
} }
} }
if (m_config.enable_overhang_speed && !m_config.overhang_speed_classic) // Orca(#7946): set current obj regardless of the `enable_overhang_speed` value, because
m_extrusion_quality_estimator.set_current_object(&instance_to_print.print_object); // `enable_overhang_speed` is a PrintRegionConfig and here we don't have a region yet.
// And no side effect doing this even if `enable_overhang_speed` is off, so don't bother
// checking anything here.
m_extrusion_quality_estimator.set_current_object(&instance_to_print.print_object);
// When starting a new object, use the external motion planner for the first travel move. // When starting a new object, use the external motion planner for the first travel move.
const Point &offset = instance_to_print.print_object.instances()[instance_to_print.instance_id].shift; const Point &offset = instance_to_print.print_object.instances()[instance_to_print.instance_id].shift;
@ -4264,7 +4274,6 @@ LayerResult GCode::process_layer(
m_last_obj_copy = this_object_copy; m_last_obj_copy = this_object_copy;
this->set_origin(unscale(offset)); this->set_origin(unscale(offset));
//FIXME the following code prints regions in the order they are defined, the path is not optimized in any way. //FIXME the following code prints regions in the order they are defined, the path is not optimized in any way.
bool is_infill_first =m_config.is_infill_first;
auto has_infill = [](const std::vector<ObjectByExtruder::Island::Region> &by_region) { auto has_infill = [](const std::vector<ObjectByExtruder::Island::Region> &by_region) {
for (auto region : by_region) { for (auto region : by_region) {
@ -4273,10 +4282,9 @@ LayerResult GCode::process_layer(
} }
return false; return false;
}; };
{
//BBS: for first layer, we always print wall firstly to get better bed adhesive force // Print perimeters of regions that has is_infill_first == false
//This behaviour is same with cura gcode += this->extrude_perimeters(print, by_region_specific, first_layer, false);
if (is_infill_first && !first_layer) {
if (!has_wipe_tower && need_insert_timelapse_gcode_for_traditional && !has_insert_timelapse_gcode && has_infill(by_region_specific)) { if (!has_wipe_tower && need_insert_timelapse_gcode_for_traditional && !has_insert_timelapse_gcode && has_infill(by_region_specific)) {
gcode += this->retract(false, false, LiftType::NormalLift); gcode += this->retract(false, false, LiftType::NormalLift);
@ -4293,27 +4301,10 @@ LayerResult GCode::process_layer(
has_insert_timelapse_gcode = true; has_insert_timelapse_gcode = true;
} }
// Then print infill
gcode += this->extrude_infill(print, by_region_specific, false); gcode += this->extrude_infill(print, by_region_specific, false);
gcode += this->extrude_perimeters(print, by_region_specific); // Then print perimeters of regions that has is_infill_first == true
} else { gcode += this->extrude_perimeters(print, by_region_specific, first_layer, true);
gcode += this->extrude_perimeters(print, by_region_specific);
if (!has_wipe_tower && need_insert_timelapse_gcode_for_traditional && !has_insert_timelapse_gcode && has_infill(by_region_specific)) {
gcode += this->retract(false, false, LiftType::NormalLift);
std::string timepals_gcode = insert_timelapse_gcode();
gcode += timepals_gcode;
m_writer.set_current_position_clear(false);
//BBS: check whether custom gcode changes the z position. Update if changed
double temp_z_after_timepals_gcode;
if (GCodeProcessor::get_last_z_from_gcode(timepals_gcode, temp_z_after_timepals_gcode)) {
Vec3d pos = m_writer.get_position();
pos(2) = temp_z_after_timepals_gcode;
m_writer.set_position(pos);
}
has_insert_timelapse_gcode = true;
}
gcode += this->extrude_infill(print,by_region_specific, false);
} }
// ironing // ironing
gcode += this->extrude_infill(print,by_region_specific, true); gcode += this->extrude_infill(print,by_region_specific, true);
@ -4911,12 +4902,17 @@ std::string GCode::extrude_path(ExtrusionPath path, std::string description, dou
} }
// Extrude perimeters: Decide where to put seams (hide or align seams). // Extrude perimeters: Decide where to put seams (hide or align seams).
std::string GCode::extrude_perimeters(const Print &print, const std::vector<ObjectByExtruder::Island::Region> &by_region) std::string GCode::extrude_perimeters(const Print &print, const std::vector<ObjectByExtruder::Island::Region> &by_region, bool is_first_layer, bool is_infill_first)
{ {
std::string gcode; std::string gcode;
for (const ObjectByExtruder::Island::Region &region : by_region) for (const ObjectByExtruder::Island::Region &region : by_region)
if (! region.perimeters.empty()) { if (! region.perimeters.empty()) {
m_config.apply(print.get_print_region(&region - &by_region.front()).config()); m_config.apply(print.get_print_region(&region - &by_region.front()).config());
// BBS: for first layer, we always print wall firstly to get better bed adhesive force
// This behaviour is same with cura
const bool should_print = is_first_layer ? !is_infill_first
: (m_config.is_infill_first == is_infill_first);
if (!should_print) continue;
for (const ExtrusionEntity* ee : region.perimeters) for (const ExtrusionEntity* ee : region.perimeters)
gcode += this->extrude_entity(*ee, "perimeter", -1., region.perimeters); gcode += this->extrude_entity(*ee, "perimeter", -1., region.perimeters);

View file

@ -445,7 +445,7 @@ private:
// For sequential print, the instance of the object to be printing has to be defined. // For sequential print, the instance of the object to be printing has to be defined.
const size_t single_object_instance_idx); const size_t single_object_instance_idx);
std::string extrude_perimeters(const Print& print, const std::vector<ObjectByExtruder::Island::Region>& by_region); std::string extrude_perimeters(const Print& print, const std::vector<ObjectByExtruder::Island::Region>& by_region, bool is_first_layer, bool is_infill_first);
std::string extrude_infill(const Print& print, const std::vector<ObjectByExtruder::Island::Region>& by_region, bool ironing); std::string extrude_infill(const Print& print, const std::vector<ObjectByExtruder::Island::Region>& by_region, bool ironing);
std::string extrude_support(const ExtrusionEntityCollection& support_fills); std::string extrude_support(const ExtrusionEntityCollection& support_fills);

View file

@ -4918,10 +4918,13 @@ void GCodeProcessor::run_post_process()
// add lines M104 to exported gcode // add lines M104 to exported gcode
auto process_line_T = [this, &export_lines](const std::string& gcode_line, const size_t g1_lines_counter, const ExportLines::Backtrace& backtrace) { auto process_line_T = [this, &export_lines](const std::string& gcode_line, const size_t g1_lines_counter, const ExportLines::Backtrace& backtrace) {
const std::string cmd = GCodeReader::GCodeLine::extract_cmd(gcode_line); const std::string cmd = GCodeReader::GCodeLine::extract_cmd(gcode_line);
int tool_number = -1;
if (!parse_number(std::string_view(cmd).substr(1), tool_number)){
// invalid T<n> command, such as the "TIMELAPSE_TAKE_FRAME" gcode, just ignore
return;
}
if (cmd.size() >= 2) { if (cmd.size() >= 2) {
std::stringstream ss(cmd.substr(1));
int tool_number = -1;
ss >> tool_number;
if (tool_number != -1) { if (tool_number != -1) {
if (tool_number < 0 || (int)m_extruder_temps_config.size() <= tool_number) { if (tool_number < 0 || (int)m_extruder_temps_config.size() <= tool_number) {
// found an invalid value, clamp it to a valid one // found an invalid value, clamp it to a valid one
@ -5018,9 +5021,18 @@ void GCodeProcessor::run_post_process()
// End of line is indicated also if end of file was reached. // End of line is indicated also if end of file was reached.
eol |= eof && it_end == it_bufend; eol |= eof && it_end == it_bufend;
gcode_line.insert(gcode_line.end(), it, it_end); gcode_line.insert(gcode_line.end(), it, it_end);
it = it_end;
// append EOL.
if (it != it_bufend && *it == '\r') {
gcode_line += *it++;
}
if (it != it_bufend && *it == '\n') {
gcode_line += *it++;
}
if (eol) { if (eol) {
++line_id; ++line_id;
gcode_line += "\n";
const unsigned int internal_g1_lines_counter = export_lines.update(gcode_line, line_id, g1_lines_counter); const unsigned int internal_g1_lines_counter = export_lines.update(gcode_line, line_id, g1_lines_counter);
// replace placeholder lines // replace placeholder lines
bool processed = process_placeholders(gcode_line); bool processed = process_placeholders(gcode_line);
@ -5057,12 +5069,6 @@ void GCodeProcessor::run_post_process()
export_lines.write(out, 1.1f * max_backtrace_time, m_result, out_path); export_lines.write(out, 1.1f * max_backtrace_time, m_result, out_path);
gcode_line.clear(); gcode_line.clear();
} }
// Skip EOL.
it = it_end;
if (it != it_bufend && *it == '\r')
++it;
if (it != it_bufend && *it == '\n')
++it;
} }
if (eof) if (eof)
break; break;

View file

@ -206,6 +206,7 @@ static double calc_max_layer_height(const PrintConfig &config, double max_object
ToolOrdering::ToolOrdering(const PrintObject &object, unsigned int first_extruder, bool prime_multi_material) ToolOrdering::ToolOrdering(const PrintObject &object, unsigned int first_extruder, bool prime_multi_material)
{ {
m_is_BBL_printer = object.print()->is_BBL_printer(); m_is_BBL_printer = object.print()->is_BBL_printer();
m_print_full_config = &object.print()->full_print_config();
m_print_object_ptr = &object; m_print_object_ptr = &object;
if (object.layers().empty()) if (object.layers().empty())
return; return;
@ -250,6 +251,7 @@ ToolOrdering::ToolOrdering(const PrintObject &object, unsigned int first_extrude
ToolOrdering::ToolOrdering(const Print &print, unsigned int first_extruder, bool prime_multi_material) ToolOrdering::ToolOrdering(const Print &print, unsigned int first_extruder, bool prime_multi_material)
{ {
m_is_BBL_printer = print.is_BBL_printer(); m_is_BBL_printer = print.is_BBL_printer();
m_print_full_config = &print.full_print_config();
m_print_config_ptr = &print.config(); m_print_config_ptr = &print.config();
// Initialize the print layers for all objects and all layers. // Initialize the print layers for all objects and all layers.
@ -315,6 +317,24 @@ ToolOrdering::ToolOrdering(const Print &print, unsigned int first_extruder, bool
this->mark_skirt_layers(print.config(), max_layer_height); this->mark_skirt_layers(print.config(), max_layer_height);
} }
static void apply_first_layer_order(const DynamicPrintConfig* config, std::vector<unsigned int>& tool_order) {
const ConfigOptionInts* first_layer_print_sequence_op = config->option<ConfigOptionInts>("first_layer_print_sequence");
if (first_layer_print_sequence_op) {
const std::vector<int>& print_sequence_1st = first_layer_print_sequence_op->values;
if (print_sequence_1st.size() >= tool_order.size()) {
std::sort(tool_order.begin(), tool_order.end(), [&print_sequence_1st](int lh, int rh) {
auto lh_it = std::find(print_sequence_1st.begin(), print_sequence_1st.end(), lh);
auto rh_it = std::find(print_sequence_1st.begin(), print_sequence_1st.end(), rh);
if (lh_it == print_sequence_1st.end() || rh_it == print_sequence_1st.end())
return false;
return lh_it < rh_it;
});
}
}
}
// BBS // BBS
std::vector<unsigned int> ToolOrdering::generate_first_layer_tool_order(const Print& print) std::vector<unsigned int> ToolOrdering::generate_first_layer_tool_order(const Print& print)
{ {
@ -359,21 +379,7 @@ std::vector<unsigned int> ToolOrdering::generate_first_layer_tool_order(const Pr
tool_order.insert(iter, ape.first); tool_order.insert(iter, ape.first);
} }
const ConfigOptionInts* first_layer_print_sequence_op = print.full_print_config().option<ConfigOptionInts>("first_layer_print_sequence"); apply_first_layer_order(m_print_full_config, tool_order);
if (first_layer_print_sequence_op) {
const std::vector<int>& print_sequence_1st = first_layer_print_sequence_op->values;
if (print_sequence_1st.size() >= tool_order.size()) {
std::sort(tool_order.begin(), tool_order.end(), [&print_sequence_1st](int lh, int rh) {
auto lh_it = std::find(print_sequence_1st.begin(), print_sequence_1st.end(), lh);
auto rh_it = std::find(print_sequence_1st.begin(), print_sequence_1st.end(), rh);
if (lh_it == print_sequence_1st.end() || rh_it == print_sequence_1st.end())
return false;
return lh_it < rh_it;
});
}
}
return tool_order; return tool_order;
} }
@ -417,21 +423,7 @@ std::vector<unsigned int> ToolOrdering::generate_first_layer_tool_order(const Pr
tool_order.insert(iter, ape.first); tool_order.insert(iter, ape.first);
} }
const ConfigOptionInts* first_layer_print_sequence_op = object.print()->full_print_config().option<ConfigOptionInts>("first_layer_print_sequence"); apply_first_layer_order(m_print_full_config, tool_order);
if (first_layer_print_sequence_op) {
const std::vector<int>& print_sequence_1st = first_layer_print_sequence_op->values;
if (print_sequence_1st.size() >= tool_order.size()) {
std::sort(tool_order.begin(), tool_order.end(), [&print_sequence_1st](int lh, int rh) {
auto lh_it = std::find(print_sequence_1st.begin(), print_sequence_1st.end(), lh);
auto rh_it = std::find(print_sequence_1st.begin(), print_sequence_1st.end(), rh);
if (lh_it == print_sequence_1st.end() || rh_it == print_sequence_1st.end())
return false;
return lh_it < rh_it;
});
}
}
return tool_order; return tool_order;
} }
@ -606,14 +598,19 @@ void ToolOrdering::reorder_extruders(unsigned int last_extruder_id)
break; break;
} }
// On first layer with wipe tower, prefer a soluble extruder if (lt == m_layer_tools[0]) {
// at the beginning, so it is not wiped on the first layer. // On first layer with wipe tower, prefer a soluble extruder
if (lt == m_layer_tools[0] && m_print_config_ptr && m_print_config_ptr->enable_prime_tower) { // at the beginning, so it is not wiped on the first layer.
for (size_t i = 0; i<lt.extruders.size(); ++i) if (m_print_config_ptr && m_print_config_ptr->enable_prime_tower) {
if (m_print_config_ptr->filament_soluble.get_at(lt.extruders[i]-1)) { // 1-based... for (size_t i = 0; i<lt.extruders.size(); ++i)
std::swap(lt.extruders[i], lt.extruders.front()); if (m_print_config_ptr->filament_soluble.get_at(lt.extruders[i]-1)) { // 1-based...
break; std::swap(lt.extruders[i], lt.extruders.front());
} break;
}
}
// Then, if we specified the tool order, apply it now
apply_first_layer_order(m_print_full_config, lt.extruders);
} }
} }
last_extruder_id = lt.extruders.back(); last_extruder_id = lt.extruders.back();
@ -1005,13 +1002,17 @@ void ToolOrdering::assign_custom_gcodes(const Print &print)
bool tool_changes_as_color_changes = mode == CustomGCode::SingleExtruder && model_mode == CustomGCode::MultiAsSingle; bool tool_changes_as_color_changes = mode == CustomGCode::SingleExtruder && model_mode == CustomGCode::MultiAsSingle;
// From the last layer to the first one: // From the last layer to the first one:
coordf_t print_z_above = std::numeric_limits<coordf_t>::lowest();
for (auto it_lt = m_layer_tools.rbegin(); it_lt != m_layer_tools.rend(); ++ it_lt) { for (auto it_lt = m_layer_tools.rbegin(); it_lt != m_layer_tools.rend(); ++ it_lt) {
LayerTools &lt = *it_lt; LayerTools &lt = *it_lt;
// Add the extruders of the current layer to the set of extruders printing at and above this print_z. // Add the extruders of the current layer to the set of extruders printing at and above this print_z.
for (unsigned int i : lt.extruders) for (unsigned int i : lt.extruders)
extruder_printing_above[i] = true; extruder_printing_above[i] = true;
// Skip all custom G-codes above this layer and skip all extruder switches. // Skip all custom G-codes above this layer and skip all extruder switches.
for (; custom_gcode_it != custom_gcode_per_print_z.gcodes.rend() && (custom_gcode_it->print_z > lt.print_z + EPSILON || custom_gcode_it->type == CustomGCode::ToolChange); ++ custom_gcode_it); for (; custom_gcode_it != custom_gcode_per_print_z.gcodes.rend() && (
(print_z_above > lt.print_z && custom_gcode_it->print_z > 0.5 * (lt.print_z + print_z_above))
|| custom_gcode_it->type == CustomGCode::ToolChange); ++ custom_gcode_it);
print_z_above = lt.print_z;
if (custom_gcode_it == custom_gcode_per_print_z.gcodes.rend()) if (custom_gcode_it == custom_gcode_per_print_z.gcodes.rend())
// Custom G-codes were processed. // Custom G-codes were processed.
break; break;
@ -1021,7 +1022,7 @@ void ToolOrdering::assign_custom_gcodes(const Print &print)
coordf_t print_z_below = 0.; coordf_t print_z_below = 0.;
if (auto it_lt_below = it_lt; ++ it_lt_below != m_layer_tools.rend()) if (auto it_lt_below = it_lt; ++ it_lt_below != m_layer_tools.rend())
print_z_below = it_lt_below->print_z; print_z_below = it_lt_below->print_z;
if (custom_gcode.print_z > print_z_below + 0.5 * EPSILON) { if (custom_gcode.print_z > 0.5 * (print_z_below + lt.print_z)) {
// The custom G-code applies to the current layer. // The custom G-code applies to the current layer.
bool color_change = custom_gcode.type == CustomGCode::ColorChange; bool color_change = custom_gcode.type == CustomGCode::ColorChange;
bool tool_change = custom_gcode.type == CustomGCode::ToolChange; bool tool_change = custom_gcode.type == CustomGCode::ToolChange;

View file

@ -210,6 +210,7 @@ private:
// All extruders, which extrude some material over m_layer_tools. // All extruders, which extrude some material over m_layer_tools.
std::vector<unsigned int> m_all_printing_extruders; std::vector<unsigned int> m_all_printing_extruders;
std::unordered_map<uint32_t, std::vector<uint8_t>> m_tool_order_cache; std::unordered_map<uint32_t, std::vector<uint8_t>> m_tool_order_cache;
const DynamicPrintConfig* m_print_full_config = nullptr;
const PrintConfig* m_print_config_ptr = nullptr; const PrintConfig* m_print_config_ptr = nullptr;
const PrintObject* m_print_object_ptr = nullptr; const PrintObject* m_print_object_ptr = nullptr;
bool m_is_BBL_printer = false; bool m_is_BBL_printer = false;

View file

@ -168,6 +168,8 @@ void Layer::make_perimeters()
const PrintRegionConfig &other_config = other_layerm->region().config(); const PrintRegionConfig &other_config = other_layerm->region().config();
if (config.wall_filament == other_config.wall_filament if (config.wall_filament == other_config.wall_filament
&& config.wall_loops == other_config.wall_loops && config.wall_loops == other_config.wall_loops
&& config.wall_sequence == other_config.wall_sequence
&& config.is_infill_first == other_config.is_infill_first
&& config.inner_wall_speed == other_config.inner_wall_speed && config.inner_wall_speed == other_config.inner_wall_speed
&& config.outer_wall_speed == other_config.outer_wall_speed && config.outer_wall_speed == other_config.outer_wall_speed
&& config.small_perimeter_speed == other_config.small_perimeter_speed && config.small_perimeter_speed == other_config.small_perimeter_speed

File diff suppressed because it is too large Load diff

View file

@ -318,17 +318,27 @@ std::string Preset::remove_suffix_modified(const std::string &name)
// Update new extruder fields at the printer profile. // Update new extruder fields at the printer profile.
void Preset::normalize(DynamicPrintConfig &config) void Preset::normalize(DynamicPrintConfig &config)
{ {
// BBS size_t n = 1;
auto* filament_diameter = dynamic_cast<const ConfigOptionFloats*>(config.option("filament_diameter")); if (config.option("single_extruder_multi_material") == nullptr || config.opt_bool("single_extruder_multi_material")) {
if (filament_diameter != nullptr) // BBS
// Loaded the FFF Printer settings. Verify, that all extruder dependent values have enough values. auto* filament_diameter = dynamic_cast<const ConfigOptionFloats*>(config.option("filament_diameter"));
config.set_num_filaments((unsigned int)filament_diameter->values.size()); if (filament_diameter != nullptr) {
n = filament_diameter->values.size();
// Loaded the FFF Printer settings. Verify, that all extruder dependent values have enough values.
config.set_num_filaments((unsigned int) n);
}
} else {
auto* nozzle_diameter = dynamic_cast<const ConfigOptionFloats*>(config.option("nozzle_diameter"));
if (nozzle_diameter != nullptr) {
n = nozzle_diameter->values.size();
// Loaded the FFF Printer settings. Verify, that all extruder dependent values have enough values.
config.set_num_extruders((unsigned int) n);
}
}
if (config.option("filament_diameter") != nullptr) { if (config.option("filament_diameter") != nullptr) {
// This config contains single or multiple filament presets. // This config contains single or multiple filament presets.
// Ensure that the filament preset vector options contain the correct number of values. // Ensure that the filament preset vector options contain the correct number of values.
// BBS
size_t n = (filament_diameter == nullptr) ? 1 : filament_diameter->values.size();
const auto &defaults = FullPrintConfig::defaults(); const auto &defaults = FullPrintConfig::defaults();
for (const std::string &key : Preset::filament_options()) { for (const std::string &key : Preset::filament_options()) {
if (key == "compatible_prints" || key == "compatible_printers") if (key == "compatible_prints" || key == "compatible_printers")

View file

@ -143,7 +143,8 @@ static t_config_enum_values s_keys_map_InfillPattern {
{ "octagramspiral", ipOctagramSpiral }, { "octagramspiral", ipOctagramSpiral },
{ "supportcubic", ipSupportCubic }, { "supportcubic", ipSupportCubic },
{ "lightning", ipLightning }, { "lightning", ipLightning },
{ "crosshatch", ipCrossHatch} { "crosshatch", ipCrossHatch},
{ "quartercubic", ipQuarterCubic}
}; };
CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(InfillPattern) CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(InfillPattern)
@ -362,7 +363,7 @@ CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(BedType)
// BBS // BBS
static const t_config_enum_values s_keys_map_LayerSeq = { static const t_config_enum_values s_keys_map_LayerSeq = {
{ "Auto", flsAuto }, { "Auto", flsAuto },
{ "Customize", flsCutomize }, { "Customize", flsCustomize },
}; };
CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(LayerSeq) CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(LayerSeq)
@ -2272,6 +2273,7 @@ void PrintConfigDef::init_fff_params()
def->enum_values.push_back("supportcubic"); def->enum_values.push_back("supportcubic");
def->enum_values.push_back("lightning"); def->enum_values.push_back("lightning");
def->enum_values.push_back("crosshatch"); def->enum_values.push_back("crosshatch");
def->enum_values.push_back("quartercubic");
def->enum_labels.push_back(L("Concentric")); def->enum_labels.push_back(L("Concentric"));
def->enum_labels.push_back(L("Rectilinear")); def->enum_labels.push_back(L("Rectilinear"));
def->enum_labels.push_back(L("Grid")); def->enum_labels.push_back(L("Grid"));
@ -2290,6 +2292,7 @@ void PrintConfigDef::init_fff_params()
def->enum_labels.push_back(L("Support Cubic")); def->enum_labels.push_back(L("Support Cubic"));
def->enum_labels.push_back(L("Lightning")); def->enum_labels.push_back(L("Lightning"));
def->enum_labels.push_back(L("Cross Hatch")); def->enum_labels.push_back(L("Cross Hatch"));
def->enum_labels.push_back(L("Quarter Cubic"));
def->set_default_value(new ConfigOptionEnum<InfillPattern>(ipCrossHatch)); def->set_default_value(new ConfigOptionEnum<InfillPattern>(ipCrossHatch));
auto def_infill_anchor_min = def = this->add("infill_anchor", coFloatOrPercent); auto def_infill_anchor_min = def = this->add("infill_anchor", coFloatOrPercent);
@ -4406,17 +4409,17 @@ void PrintConfigDef::init_fff_params()
def = this->add("support_type", coEnum); def = this->add("support_type", coEnum);
def->label = L("Type"); def->label = L("Type");
def->category = L("Support"); def->category = L("Support");
def->tooltip = L("normal(auto) and tree(auto) is used to generate support automatically. " def->tooltip = L("Normal (auto) and Tree (auto) is used to generate support automatically. "
"If normal(manual) or tree(manual) is selected, only support enforcers are generated"); "If Normal (manual) or Tree (manual) is selected, only support enforcers are generated");
def->enum_keys_map = &ConfigOptionEnum<SupportType>::get_enum_values(); def->enum_keys_map = &ConfigOptionEnum<SupportType>::get_enum_values();
def->enum_values.push_back("normal(auto)"); def->enum_values.push_back("normal(auto)");
def->enum_values.push_back("tree(auto)"); def->enum_values.push_back("tree(auto)");
def->enum_values.push_back("normal(manual)"); def->enum_values.push_back("normal(manual)");
def->enum_values.push_back("tree(manual)"); def->enum_values.push_back("tree(manual)");
def->enum_labels.push_back(L("normal(auto)")); def->enum_labels.push_back(L("Normal (auto)"));
def->enum_labels.push_back(L("tree(auto)")); def->enum_labels.push_back(L("Tree (auto)"));
def->enum_labels.push_back(L("normal(manual)")); def->enum_labels.push_back(L("Normal (manual)"));
def->enum_labels.push_back(L("tree(manual)")); def->enum_labels.push_back(L("Tree (manual)"));
def->mode = comSimple; def->mode = comSimple;
def->set_default_value(new ConfigOptionEnum<SupportType>(stNormalAuto)); def->set_default_value(new ConfigOptionEnum<SupportType>(stNormalAuto));

View file

@ -52,7 +52,7 @@ enum AuthorizationType {
enum InfillPattern : int { enum InfillPattern : int {
ipConcentric, ipRectilinear, ipGrid, ipLine, ipCubic, ipTriangles, ipStars, ipGyroid, ipHoneycomb, ipAdaptiveCubic, ipMonotonic, ipMonotonicLine, ipAlignedRectilinear, ip3DHoneycomb, ipConcentric, ipRectilinear, ipGrid, ipLine, ipCubic, ipTriangles, ipStars, ipGyroid, ipHoneycomb, ipAdaptiveCubic, ipMonotonic, ipMonotonicLine, ipAlignedRectilinear, ip3DHoneycomb,
ipHilbertCurve, ipArchimedeanChords, ipOctagramSpiral, ipSupportCubic, ipSupportBase, ipConcentricInternal, ipHilbertCurve, ipArchimedeanChords, ipOctagramSpiral, ipSupportCubic, ipSupportBase, ipConcentricInternal,
ipLightning, ipCrossHatch, ipLightning, ipCrossHatch, ipQuarterCubic,
ipCount, ipCount,
}; };
@ -266,7 +266,7 @@ enum BedType {
// BBS // BBS
enum LayerSeq { enum LayerSeq {
flsAuto, flsAuto,
flsCutomize flsCustomize
}; };
// BBS // BBS

File diff suppressed because it is too large Load diff

View file

@ -4,7 +4,8 @@
#include "Flow.hpp" #include "Flow.hpp"
#include "PrintConfig.hpp" #include "PrintConfig.hpp"
#include "Slicing.hpp" #include "Slicing.hpp"
#include "Fill/FillBase.hpp"
#include "SupportLayer.hpp"
namespace Slic3r { namespace Slic3r {
class PrintObject; class PrintObject;
@ -18,107 +19,6 @@ class PrintObjectConfig;
class PrintObjectSupportMaterial class PrintObjectSupportMaterial
{ {
public: public:
// Support layer type to be used by MyLayer. This type carries a much more detailed information
// about the support layer type than the final support layers stored in a PrintObject.
enum SupporLayerType {
sltUnknown = 0,
// Ratft base layer, to be printed with the support material.
sltRaftBase,
// Raft interface layer, to be printed with the support interface material.
sltRaftInterface,
// Bottom contact layer placed over a top surface of an object. To be printed with a support interface material.
sltBottomContact,
// Dense interface layer, to be printed with the support interface material.
// This layer is separated from an object by an sltBottomContact layer.
sltBottomInterface,
// Sparse base support layer, to be printed with a support material.
sltBase,
// Dense interface layer, to be printed with the support interface material.
// This layer is separated from an object with sltTopContact layer.
sltTopInterface,
// Top contact layer directly supporting an overhang. To be printed with a support interface material.
sltTopContact,
// Some undecided type yet. It will turn into sltBase first, then it may turn into sltBottomInterface or sltTopInterface.
sltIntermediate,
};
// A support layer type used internally by the SupportMaterial class. This class carries a much more detailed
// information about the support layer than the layers stored in the PrintObject, mainly
// the MyLayer is aware of the bridging flow and the interface gaps between the object and the support.
class MyLayer
{
public:
void reset() {
*this = MyLayer();
}
bool operator==(const MyLayer &layer2) const {
return print_z == layer2.print_z && height == layer2.height && bridging == layer2.bridging;
}
// Order the layers by lexicographically by an increasing print_z and a decreasing layer height.
bool operator<(const MyLayer &layer2) const {
if (print_z < layer2.print_z) {
return true;
} else if (print_z == layer2.print_z) {
if (height > layer2.height)
return true;
else if (height == layer2.height) {
// Bridging layers first.
return bridging && ! layer2.bridging;
} else
return false;
} else
return false;
}
void merge(MyLayer &&rhs) {
// The union_() does not support move semantic yet, but maybe one day it will.
this->polygons = union_(this->polygons, std::move(rhs.polygons));
auto merge = [](std::unique_ptr<Polygons> &dst, std::unique_ptr<Polygons> &src) {
if (! dst || dst->empty())
dst = std::move(src);
else if (src && ! src->empty())
*dst = union_(*dst, std::move(*src));
};
merge(this->contact_polygons, rhs.contact_polygons);
merge(this->overhang_polygons, rhs.overhang_polygons);
merge(this->enforcer_polygons, rhs.enforcer_polygons);
rhs.reset();
}
// For the bridging flow, bottom_print_z will be above bottom_z to account for the vertical separation.
// For the non-bridging flow, bottom_print_z will be equal to bottom_z.
coordf_t bottom_print_z() const { return print_z - height; }
// To sort the extremes of top / bottom interface layers.
coordf_t extreme_z() const { return (this->layer_type == sltTopContact) ? this->bottom_z : this->print_z; }
SupporLayerType layer_type { sltUnknown };
// Z used for printing, in unscaled coordinates.
coordf_t print_z { 0 };
// Bottom Z of this layer. For soluble layers, bottom_z + height = print_z,
// otherwise bottom_z + gap + height = print_z.
coordf_t bottom_z { 0 };
// Layer height in unscaled coordinates.
coordf_t height { 0 };
// Index of a PrintObject layer_id supported by this layer. This will be set for top contact layers.
// If this is not a contact layer, it will be set to size_t(-1).
size_t idx_object_layer_above { size_t(-1) };
// Index of a PrintObject layer_id, which supports this layer. This will be set for bottom contact layers.
// If this is not a contact layer, it will be set to size_t(-1).
size_t idx_object_layer_below { size_t(-1) };
// Use a bridging flow when printing this support layer.
bool bridging { false };
// Polygons to be filled by the support pattern.
Polygons polygons;
// Currently for the contact layers only.
std::unique_ptr<Polygons> contact_polygons;
std::unique_ptr<Polygons> overhang_polygons;
// Enforcers need to be propagated independently in case the "support on build plate only" option is enabled.
std::unique_ptr<Polygons> enforcer_polygons;
};
struct SupportParams { struct SupportParams {
Flow first_layer_flow; Flow first_layer_flow;
@ -147,12 +47,6 @@ public:
bool with_sheath; bool with_sheath;
}; };
// Layers are allocated and owned by a deque. Once a layer is allocated, it is maintained
// up to the end of a generate() method. The layer storage may be replaced by an allocator class in the future,
// which would allocate layers by multiple chunks.
typedef std::deque<MyLayer> MyLayerStorage;
typedef std::vector<MyLayer*> MyLayersPtr;
public: public:
PrintObjectSupportMaterial(const PrintObject *object, const SlicingParameters &slicing_params); PrintObjectSupportMaterial(const PrintObject *object, const SlicingParameters &slicing_params);
@ -176,58 +70,58 @@ private:
// Generate top contact layers supporting overhangs. // Generate top contact layers supporting overhangs.
// For a soluble interface material synchronize the layer heights with the object, otherwise leave the layer height undefined. // For a soluble interface material synchronize the layer heights with the object, otherwise leave the layer height undefined.
// If supports over bed surface only are requested, don't generate contact layers over an object. // If supports over bed surface only are requested, don't generate contact layers over an object.
MyLayersPtr top_contact_layers(const PrintObject &object, const std::vector<Polygons> &buildplate_covered, MyLayerStorage &layer_storage) const; SupportGeneratorLayersPtr top_contact_layers(const PrintObject &object, const std::vector<Polygons> &buildplate_covered, SupportGeneratorLayerStorage &layer_storage) const;
// Generate bottom contact layers supporting the top contact layers. // Generate bottom contact layers supporting the top contact layers.
// For a soluble interface material synchronize the layer heights with the object, // For a soluble interface material synchronize the layer heights with the object,
// otherwise set the layer height to a bridging flow of a support interface nozzle. // otherwise set the layer height to a bridging flow of a support interface nozzle.
MyLayersPtr bottom_contact_layers_and_layer_support_areas( SupportGeneratorLayersPtr bottom_contact_layers_and_layer_support_areas(
const PrintObject &object, const MyLayersPtr &top_contacts, std::vector<Polygons> &buildplate_covered, const PrintObject &object, const SupportGeneratorLayersPtr &top_contacts, std::vector<Polygons> &buildplate_covered,
MyLayerStorage &layer_storage, std::vector<Polygons> &layer_support_areas) const; SupportGeneratorLayerStorage &layer_storage, std::vector<Polygons> &layer_support_areas) const;
// Trim the top_contacts layers with the bottom_contacts layers if they overlap, so there would not be enough vertical space for both of them. // Trim the top_contacts layers with the bottom_contacts layers if they overlap, so there would not be enough vertical space for both of them.
void trim_top_contacts_by_bottom_contacts(const PrintObject &object, const MyLayersPtr &bottom_contacts, MyLayersPtr &top_contacts) const; void trim_top_contacts_by_bottom_contacts(const PrintObject &object, const SupportGeneratorLayersPtr &bottom_contacts, SupportGeneratorLayersPtr &top_contacts) const;
// Generate raft layers and the intermediate support layers between the bottom contact and top contact surfaces. // Generate raft layers and the intermediate support layers between the bottom contact and top contact surfaces.
MyLayersPtr raft_and_intermediate_support_layers( SupportGeneratorLayersPtr raft_and_intermediate_support_layers(
const PrintObject &object, const PrintObject &object,
const MyLayersPtr &bottom_contacts, const SupportGeneratorLayersPtr &bottom_contacts,
const MyLayersPtr &top_contacts, const SupportGeneratorLayersPtr &top_contacts,
MyLayerStorage &layer_storage) const; SupportGeneratorLayerStorage &layer_storage) const;
// Fill in the base layers with polygons. // Fill in the base layers with polygons.
void generate_base_layers( void generate_base_layers(
const PrintObject &object, const PrintObject &object,
const MyLayersPtr &bottom_contacts, const SupportGeneratorLayersPtr &bottom_contacts,
const MyLayersPtr &top_contacts, const SupportGeneratorLayersPtr &top_contacts,
MyLayersPtr &intermediate_layers, SupportGeneratorLayersPtr &intermediate_layers,
const std::vector<Polygons> &layer_support_areas) const; const std::vector<Polygons> &layer_support_areas) const;
// Generate raft layers, also expand the 1st support layer // Generate raft layers, also expand the 1st support layer
// in case there is no raft layer to improve support adhesion. // in case there is no raft layer to improve support adhesion.
MyLayersPtr generate_raft_base( SupportGeneratorLayersPtr generate_raft_base(
const PrintObject &object, const PrintObject &object,
const MyLayersPtr &top_contacts, const SupportGeneratorLayersPtr &top_contacts,
const MyLayersPtr &interface_layers, const SupportGeneratorLayersPtr &interface_layers,
const MyLayersPtr &base_interface_layers, const SupportGeneratorLayersPtr &base_interface_layers,
const MyLayersPtr &base_layers, const SupportGeneratorLayersPtr &base_layers,
MyLayerStorage &layer_storage) const; SupportGeneratorLayerStorage &layer_storage) const;
// Turn some of the base layers into base interface layers. // Turn some of the base layers into base interface layers.
// For soluble interfaces with non-soluble bases, print maximum two first interface layers with the base // For soluble interfaces with non-soluble bases, print maximum two first interface layers with the base
// extruder to improve adhesion of the soluble filament to the base. // extruder to improve adhesion of the soluble filament to the base.
std::pair<MyLayersPtr, MyLayersPtr> generate_interface_layers( std::pair<SupportGeneratorLayersPtr, SupportGeneratorLayersPtr> generate_interface_layers(
const MyLayersPtr &bottom_contacts, const SupportGeneratorLayersPtr &bottom_contacts,
const MyLayersPtr &top_contacts, const SupportGeneratorLayersPtr &top_contacts,
MyLayersPtr &intermediate_layers, SupportGeneratorLayersPtr &intermediate_layers,
MyLayerStorage &layer_storage) const; SupportGeneratorLayerStorage &layer_storage) const;
// Trim support layers by an object to leave a defined gap between // Trim support layers by an object to leave a defined gap between
// the support volume and the object. // the support volume and the object.
void trim_support_layers_by_object( void trim_support_layers_by_object(
const PrintObject &object, const PrintObject &object,
MyLayersPtr &support_layers, SupportGeneratorLayersPtr &support_layers,
const coordf_t gap_extra_above, const coordf_t gap_extra_above,
const coordf_t gap_extra_below, const coordf_t gap_extra_below,
const coordf_t gap_xy) const; const coordf_t gap_xy) const;
@ -240,12 +134,12 @@ private:
// Produce the actual G-code. // Produce the actual G-code.
void generate_toolpaths( void generate_toolpaths(
SupportLayerPtrs &support_layers, SupportLayerPtrs &support_layers,
const MyLayersPtr &raft_layers, const SupportGeneratorLayersPtr &raft_layers,
const MyLayersPtr &bottom_contacts, const SupportGeneratorLayersPtr &bottom_contacts,
const MyLayersPtr &top_contacts, const SupportGeneratorLayersPtr &top_contacts,
const MyLayersPtr &intermediate_layers, const SupportGeneratorLayersPtr &intermediate_layers,
const MyLayersPtr &interface_layers, const SupportGeneratorLayersPtr &interface_layers,
const MyLayersPtr &base_interface_layers) const; const SupportGeneratorLayersPtr &base_interface_layers) const;
// Following objects are not owned by SupportMaterial class. // Following objects are not owned by SupportMaterial class.
const PrintObject *m_object; const PrintObject *m_object;

View file

@ -1064,16 +1064,7 @@ void SpinCtrl::BUILD() {
break; break;
} }
const int min_val = m_opt.min == INT_MIN const int min_val = m_opt.min == INT_MIN ? 0 : m_opt.min;
#ifdef __WXOSX__
// We will forcibly set the input value for SpinControl, since the value
// inserted from the keyboard is not updated under OSX.
// So, we can't set min control value bigger then 0.
// Otherwise, it couldn't be possible to input from keyboard value
// less then min_val.
|| m_opt.min > 0
#endif
? 0 : m_opt.min;
const int max_val = m_opt.max < 2147483647 ? m_opt.max : 2147483647; const int max_val = m_opt.max < 2147483647 ? m_opt.max : 2147483647;
static Builder<SpinInput> builder; static Builder<SpinInput> builder;
@ -1170,14 +1161,6 @@ void SpinCtrl::propagate_value()
if (!m_value.empty()) // BBS: null value if (!m_value.empty()) // BBS: null value
on_kill_focus(); on_kill_focus();
} else { } else {
#ifdef __WXOSX__
// check input value for minimum
if (m_opt.min > 0 && tmp_value < m_opt.min) {
SpinInput* spin = static_cast<SpinInput*>(window);
spin->SetValue(m_opt.min);
// spin->GetText()->SetInsertionPointEnd(); // BBS
}
#endif
auto ctrl = dynamic_cast<SpinInput *>(window); auto ctrl = dynamic_cast<SpinInput *>(window);
if (m_value.empty() if (m_value.empty()
? !ctrl->GetTextCtrl()->GetLabel().IsEmpty() ? !ctrl->GetTextCtrl()->GetLabel().IsEmpty()

View file

@ -6767,7 +6767,7 @@ void GLCanvas3D::_picking_pass()
case SceneRaycaster::EType::Bed: case SceneRaycaster::EType::Bed:
{ {
// BBS: add plate picking logic // BBS: add plate picking logic
int plate_hover_id = PartPlate::PLATE_BASE_ID - hit.raycaster_id; int plate_hover_id = hit.raycaster_id;
if (plate_hover_id >= 0 && plate_hover_id < PartPlateList::MAX_PLATES_COUNT * PartPlate::GRABBER_COUNT) { if (plate_hover_id >= 0 && plate_hover_id < PartPlateList::MAX_PLATES_COUNT * PartPlate::GRABBER_COUNT) {
wxGetApp().plater()->get_partplate_list().set_hover_id(plate_hover_id); wxGetApp().plater()->get_partplate_list().set_hover_id(plate_hover_id);
m_hover_plate_idxs.emplace_back(plate_hover_id); m_hover_plate_idxs.emplace_back(plate_hover_id);

View file

@ -3598,7 +3598,7 @@ GuiCfg create_gui_configuration()
float space = line_height_with_spacing - line_height; float space = line_height_with_spacing - line_height;
const ImGuiStyle &style = ImGui::GetStyle(); const ImGuiStyle &style = ImGui::GetStyle();
cfg.max_style_name_width = ImGui::CalcTextSize("Maximal font name, extended").x; cfg.max_style_name_width = ImGui::CalcTextSize("Maximal style name..").x;
cfg.icon_width = static_cast<unsigned int>(std::ceil(line_height)); cfg.icon_width = static_cast<unsigned int>(std::ceil(line_height));
// make size pair number // make size pair number
@ -3692,11 +3692,11 @@ GuiCfg create_gui_configuration()
// "Text is to object" + radio buttons // "Text is to object" + radio buttons
cfg.height_of_volume_type_selector = separator_height + line_height_with_spacing + input_height; cfg.height_of_volume_type_selector = separator_height + line_height_with_spacing + input_height;
int max_style_image_width = static_cast<int>(std::round(cfg.max_style_name_width/2 - 2 * style.FramePadding.x)); int max_style_image_width = static_cast<int>(std::round(cfg.max_style_name_width - 2 * style.FramePadding.x));
int max_style_image_height = static_cast<int>(std::round(input_height)); int max_style_image_height = static_cast<int>(std::round(input_height));
cfg.max_style_image_size = Vec2i32(max_style_image_width, line_height); cfg.max_style_image_size = Vec2i32(max_style_image_width, line_height);
cfg.face_name_size = Vec2i32(cfg.input_width, line_height_with_spacing); cfg.face_name_size = Vec2i32(cfg.input_width, line_height_with_spacing);
cfg.face_name_texture_offset_x = cfg.face_name_size.x() + space; cfg.face_name_texture_offset_x = cfg.face_name_size.x() + style.WindowPadding.x + space;
cfg.max_tooltip_width = ImGui::GetFontSize() * 20.0f; cfg.max_tooltip_width = ImGui::GetFontSize() * 20.0f;

View file

@ -375,6 +375,9 @@ void GLGizmosManager::update_data()
: CommonGizmosDataID(0)); : CommonGizmosDataID(0));
if (m_current != Undefined) m_gizmos[m_current]->data_changed(m_serializing); if (m_current != Undefined) m_gizmos[m_current]->data_changed(m_serializing);
// Orca: hack: Fix issue that flatten gizmo faces not updated after reload from disk
if (m_current != Flatten && !m_gizmos.empty()) m_gizmos[Flatten]->data_changed(m_serializing);
//BBS: GUI refactor: add object manipulation in gizmo //BBS: GUI refactor: add object manipulation in gizmo
m_object_manipulation.update_ui_from_settings(); m_object_manipulation.update_ui_from_settings();
m_object_manipulation.UpdateAndShow(true); m_object_manipulation.UpdateAndShow(true);

View file

@ -775,7 +775,6 @@ arrangement::ArrangeParams init_arrange_params(Plater *p)
params.printable_height = print_config.printable_height.value; params.printable_height = print_config.printable_height.value;
params.allow_rotations = settings.enable_rotation; params.allow_rotations = settings.enable_rotation;
params.nozzle_height = print_config.nozzle_height.value; params.nozzle_height = print_config.nozzle_height.value;
params.all_objects_are_short = print.is_all_objects_are_short();
params.align_center = print_config.best_object_pos.value; params.align_center = print_config.best_object_pos.value;
params.allow_multi_materials_on_same_plate = settings.allow_multi_materials_on_same_plate; params.allow_multi_materials_on_same_plate = settings.allow_multi_materials_on_same_plate;
params.avoid_extrusion_cali_region = settings.avoid_extrusion_cali_region; params.avoid_extrusion_cali_region = settings.avoid_extrusion_cali_region;

View file

@ -142,8 +142,9 @@ void CreateFontImageJob::finalize(bool canceled, std::exception_ptr &)
glsafe(::glBindTexture(target, m_input.texture_id)); glsafe(::glBindTexture(target, m_input.texture_id));
GLsizei w = m_tex_size.x(), h = m_tex_size.y(); GLsizei w = m_tex_size.x(), h = m_tex_size.y();
GLint xoffset = m_input.size.x() - m_tex_size.x(), // arrange right GLint xoffset = 0; // align to left
yoffset = m_input.size.y() * m_input.index; // GLint xoffset = m_input.size.x() - m_tex_size.x(); // align right
GLint yoffset = m_input.size.y() * m_input.index;
glsafe(::glTexSubImage2D(target, m_input.level, xoffset, yoffset, w, h, glsafe(::glTexSubImage2D(target, m_input.level, xoffset, yoffset, w, h,
m_input.format, m_input.type, m_result.data())); m_input.format, m_input.type, m_result.data()));

View file

@ -42,12 +42,12 @@ void CreateFontStyleImagesJob::process(Ctl &ctl)
// create image description // create image description
StyleManager::StyleImage &image = m_images[index]; StyleManager::StyleImage &image = m_images[index];
BoundingBox &bounding_box = image.bounding_box; BoundingBox &bounding_box = image.bounding_box;
for (ExPolygon &shape : shapes) for (const ExPolygon &shape : shapes)
bounding_box.merge(BoundingBox(shape.contour.points)); bounding_box.merge(BoundingBox(shape.contour.points));
for (ExPolygon &shape : shapes) shape.translate(-bounding_box.min); for (ExPolygon &shape : shapes) shape.translate(-bounding_box.min);
// calculate conversion from FontPoint to screen pixels by size of font // calculate conversion from FontPoint to screen pixels by size of font
double scale = get_text_shape_scale(item.prop, *item.font.font_file); double scale = get_text_shape_scale(item.prop, *item.font.font_file) * m_input.ppm;
scales[index] = scale; scales[index] = scale;
//double scale = font_prop.size_in_mm * SCALING_FACTOR; //double scale = font_prop.size_in_mm * SCALING_FACTOR;

View file

@ -56,7 +56,6 @@ void FillBedJob::prepare()
ArrangePolygon ap = get_instance_arrange_poly(mo->instances[inst_idx], global_config); ArrangePolygon ap = get_instance_arrange_poly(mo->instances[inst_idx], global_config);
BoundingBox ap_bb = ap.transformed_poly().contour.bounding_box(); BoundingBox ap_bb = ap.transformed_poly().contour.bounding_box();
ap.height = 1;
ap.name = mo->name; ap.name = mo->name;
if (selected) if (selected)
@ -173,7 +172,6 @@ void FillBedJob::prepare()
ArrangePolygon ap = template_ap; ArrangePolygon ap = template_ap;
ap.poly = m_selected.front().poly; ap.poly = m_selected.front().poly;
ap.bed_idx = PartPlateList::MAX_PLATES_COUNT; ap.bed_idx = PartPlateList::MAX_PLATES_COUNT;
ap.height = 1;
ap.itemid = -1; ap.itemid = -1;
ap.setter = [this, mi](const ArrangePolygon &p) { ap.setter = [this, mi](const ArrangePolygon &p) {
ModelObject *mo = m_plater->model().objects[m_object_idx]; ModelObject *mo = m_plater->model().objects[m_object_idx];

View file

@ -66,6 +66,7 @@
#ifdef _WIN32 #ifdef _WIN32
#include <dbt.h> #include <dbt.h>
#include <shlobj.h> #include <shlobj.h>
#include <shellapi.h>
#endif // _WIN32 #endif // _WIN32
#include <slic3r/GUI/CreatePresetsDialog.hpp> #include <slic3r/GUI/CreatePresetsDialog.hpp>
@ -634,8 +635,64 @@ void MainFrame::bind_diff_dialog()
#ifdef __WIN32__ #ifdef __WIN32__
// Orca: Fix maximized window overlaps taskbar when taskbar auto hide is enabled (#8085)
// Adopted from https://gist.github.com/MortenChristiansen/6463580
static void AdjustWorkingAreaForAutoHide(const HWND hWnd, MINMAXINFO* mmi)
{
const auto taskbarHwnd = FindWindowA("Shell_TrayWnd", nullptr);
if (!taskbarHwnd) {
return;
}
const auto monitorContainingApplication = MonitorFromWindow(hWnd, MONITOR_DEFAULTTONULL);
const auto monitorWithTaskbarOnIt = MonitorFromWindow(taskbarHwnd, MONITOR_DEFAULTTONULL);
if (monitorContainingApplication != monitorWithTaskbarOnIt) {
return;
}
APPBARDATA abd;
abd.cbSize = sizeof(APPBARDATA);
abd.hWnd = taskbarHwnd;
// Find if task bar has auto-hide enabled
const auto uState = (UINT) SHAppBarMessage(ABM_GETSTATE, &abd);
if ((uState & ABS_AUTOHIDE) != ABS_AUTOHIDE) {
return;
}
RECT borderThickness;
SetRectEmpty(&borderThickness);
AdjustWindowRectEx(&borderThickness, GetWindowLongPtr(hWnd, GWL_STYLE) & ~WS_CAPTION, FALSE, 0);
// Determine taskbar position
SHAppBarMessage(ABM_GETTASKBARPOS, &abd);
const auto& rc = abd.rc;
if (rc.top == rc.left && rc.bottom > rc.right) {
// Left
const auto offset = borderThickness.left + 2;
mmi->ptMaxPosition.x += offset;
mmi->ptMaxTrackSize.x -= offset;
mmi->ptMaxSize.x -= offset;
} else if (rc.top == rc.left && rc.bottom < rc.right) {
// Top
const auto offset = borderThickness.top + 2;
mmi->ptMaxPosition.y += offset;
mmi->ptMaxTrackSize.y -= offset;
mmi->ptMaxSize.y -= offset;
} else if (rc.top > rc.left) {
// Bottom
const auto offset = borderThickness.bottom + 2;
mmi->ptMaxSize.y -= offset;
mmi->ptMaxTrackSize.y -= offset;
} else {
// Right
const auto offset = borderThickness.right + 2;
mmi->ptMaxSize.x -= offset;
mmi->ptMaxTrackSize.x -= offset;
}
}
WXLRESULT MainFrame::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) WXLRESULT MainFrame::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
{ {
HWND hWnd = GetHandle();
/* When we have a custom titlebar in the window, we don't need the non-client area of a normal window /* When we have a custom titlebar in the window, we don't need the non-client area of a normal window
* to be painted. In order to achieve this, we handle the "WM_NCCALCSIZE" which is responsible for the * to be painted. In order to achieve this, we handle the "WM_NCCALCSIZE" which is responsible for the
* size of non-client area of a window and set the return value to 0. Also we have to tell the * size of non-client area of a window and set the return value to 0. Also we have to tell the
@ -654,7 +711,6 @@ WXLRESULT MainFrame::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam
its wParam value is TRUE and the return value is 0 */ its wParam value is TRUE and the return value is 0 */
case WM_NCCALCSIZE: case WM_NCCALCSIZE:
if (wParam) { if (wParam) {
HWND hWnd = GetHandle();
/* Detect whether window is maximized or not. We don't need to change the resize border when win is /* Detect whether window is maximized or not. We don't need to change the resize border when win is
* maximized because all resize borders are gone automatically */ * maximized because all resize borders are gone automatically */
WINDOWPLACEMENT wPos; WINDOWPLACEMENT wPos;
@ -677,6 +733,13 @@ WXLRESULT MainFrame::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam
} }
} }
break; break;
case WM_GETMINMAXINFO: {
auto mmi = (MINMAXINFO*) lParam;
HandleGetMinMaxInfo(mmi);
AdjustWorkingAreaForAutoHide(hWnd, mmi);
return 0;
}
} }
return wxFrame::MSWWindowProc(nMsg, wParam, lParam); return wxFrame::MSWWindowProc(nMsg, wParam, lParam);
} }

View file

@ -1348,8 +1348,7 @@ void PartPlate::register_raycasters_for_picking(GLCanvas3D &canvas)
int PartPlate::picking_id_component(int idx) const int PartPlate::picking_id_component(int idx) const
{ {
unsigned int id = PLATE_BASE_ID - this->m_plate_index * GRABBER_COUNT - idx; return this->m_plate_index * GRABBER_COUNT + idx;
return id;
} }
std::vector<int> PartPlate::get_extruders(bool conside_custom_gcode) const std::vector<int> PartPlate::get_extruders(bool conside_custom_gcode) const

View file

@ -198,7 +198,6 @@ private:
int picking_id_component(int idx) const; int picking_id_component(int idx) const;
public: public:
static const unsigned int PLATE_BASE_ID = 255 * 255 * 253;
static const unsigned int PLATE_NAME_HOVER_ID = 6; static const unsigned int PLATE_NAME_HOVER_ID = 6;
static const unsigned int GRABBER_COUNT = 8; static const unsigned int GRABBER_COUNT = 8;

View file

@ -4396,7 +4396,9 @@ std::vector<size_t> Plater::priv::load_files(const std::vector<fs::path>& input_
cur_plate->translate_all_instance(new_origin - cur_origin); cur_plate->translate_all_instance(new_origin - cur_origin);
} }
view3D->get_canvas3d()->remove_raycasters_for_picking(SceneRaycaster::EType::Bed);
partplate_list.reset_size(current_width, current_depth, current_height, true, true); partplate_list.reset_size(current_width, current_depth, current_height, true, true);
partplate_list.register_raycasters_for_picking(*view3D->get_canvas3d());
} }
//BBS: add gcode loading logic in the end //BBS: add gcode loading logic in the end
@ -5972,6 +5974,11 @@ void Plater::priv::reload_from_disk()
} }
} }
if (found) break; if (found) break;
// BBS: step model,object loaded as a volume. GUI_ObfectList.cpp load_modifier()
if (obj->name == old_volume->name) {
new_object_idx = (int) o;
break;
}
} }
} }
@ -5980,22 +5987,30 @@ void Plater::priv::reload_from_disk()
continue; continue;
} }
ModelObject *new_model_object = new_model.objects[new_object_idx]; ModelObject *new_model_object = new_model.objects[new_object_idx];
if (new_volume_idx < 0 || int(new_model_object->volumes.size()) <= new_volume_idx) { if (int(new_model_object->volumes.size()) <= new_volume_idx) {
fail_list.push_back(from_u8(has_source ? old_volume->source.input_file : old_volume->name)); fail_list.push_back(from_u8(has_source ? old_volume->source.input_file : old_volume->name));
continue; continue;
} }
old_model_object->add_volume(*new_model_object->volumes[new_volume_idx]); ModelVolume *new_volume = nullptr;
ModelVolume *new_volume = old_model_object->volumes.back(); // BBS: step model
if (new_volume_idx < 0 && new_object_idx >= 0) {
TriangleMesh mesh = new_model_object->mesh();
new_volume = old_model_object->add_volume(std::move(mesh));
new_volume->name = new_model_object->name;
new_volume->source.input_file = new_model_object->input_file;
}else {
new_volume = old_model_object->add_volume(*new_model_object->volumes[new_volume_idx]);
// new_volume = old_model_object->volumes.back();
}
new_volume->set_new_unique_id(); new_volume->set_new_unique_id();
new_volume->config.apply(old_volume->config); new_volume->config.apply(old_volume->config);
new_volume->set_type(old_volume->type()); new_volume->set_type(old_volume->type());
new_volume->set_material_id(old_volume->material_id()); new_volume->set_material_id(old_volume->material_id());
Transform3d transform = Transform3d::Identity(); new_volume->source.mesh_offset = old_volume->source.mesh_offset;
transform.translate(new_volume->source.mesh_offset - old_volume->source.mesh_offset); new_volume->set_transformation(old_volume->get_transformation());
new_volume->set_transformation(old_volume->get_transformation().get_matrix() * old_volume->source.transform.get_matrix_no_offset() *
transform * new_volume->source.transform.get_matrix_no_offset().inverse());
new_volume->source.object_idx = old_volume->source.object_idx; new_volume->source.object_idx = old_volume->source.object_idx;
new_volume->source.volume_idx = old_volume->source.volume_idx; new_volume->source.volume_idx = old_volume->source.volume_idx;

View file

@ -52,7 +52,7 @@ public:
enum class EIdBase enum class EIdBase
{ {
Bed = 0, Bed = 0,
Volume = 1000, Volume = 1000, // Must be smaller than PartPlateList::MAX_PLATES_COUNT * PartPlate::GRABBER_COUNT
Gizmo = 1000000, Gizmo = 1000000,
FallbackGizmo = 2000000 FallbackGizmo = 2000000
}; };

View file

@ -2636,14 +2636,14 @@ void TabPrintModel::update_model_config()
} }
else { else {
replace(m_all_keys.begin(), m_all_keys.end(), std::string("first_layer_print_sequence"), std::string("first_layer_sequence_choice")); replace(m_all_keys.begin(), m_all_keys.end(), std::string("first_layer_print_sequence"), std::string("first_layer_sequence_choice"));
m_config->set_key_value("first_layer_sequence_choice", new ConfigOptionEnum<LayerSeq>(flsCutomize)); m_config->set_key_value("first_layer_sequence_choice", new ConfigOptionEnum<LayerSeq>(flsCustomize));
} }
if (!plate_config.has("other_layers_print_sequence")) { if (!plate_config.has("other_layers_print_sequence")) {
m_config->set_key_value("other_layers_sequence_choice", new ConfigOptionEnum<LayerSeq>(flsAuto)); m_config->set_key_value("other_layers_sequence_choice", new ConfigOptionEnum<LayerSeq>(flsAuto));
} }
else { else {
replace(m_all_keys.begin(), m_all_keys.end(), std::string("other_layers_print_sequence"), std::string("other_layers_sequence_choice")); replace(m_all_keys.begin(), m_all_keys.end(), std::string("other_layers_print_sequence"), std::string("other_layers_sequence_choice"));
m_config->set_key_value("other_layers_sequence_choice", new ConfigOptionEnum<LayerSeq>(flsCutomize)); m_config->set_key_value("other_layers_sequence_choice", new ConfigOptionEnum<LayerSeq>(flsCustomize));
} }
notify_changed(plate_item.first); notify_changed(plate_item.first);
} }
@ -2883,7 +2883,7 @@ void TabPrintPlate::on_value_change(const std::string& opt_key, const boost::any
if (first_layer_seq_choice == LayerSeq::flsAuto) { if (first_layer_seq_choice == LayerSeq::flsAuto) {
plate->set_first_layer_print_sequence({}); plate->set_first_layer_print_sequence({});
} }
else if (first_layer_seq_choice == LayerSeq::flsCutomize) { else if (first_layer_seq_choice == LayerSeq::flsCustomize) {
const DynamicPrintConfig& plate_config = plate_item.second->get(); const DynamicPrintConfig& plate_config = plate_item.second->get();
if (!plate_config.has("first_layer_print_sequence")) { if (!plate_config.has("first_layer_print_sequence")) {
std::vector<int> initial_sequence; std::vector<int> initial_sequence;
@ -2904,7 +2904,7 @@ void TabPrintPlate::on_value_change(const std::string& opt_key, const boost::any
if (other_layer_seq_choice == LayerSeq::flsAuto) { if (other_layer_seq_choice == LayerSeq::flsAuto) {
plate->set_other_layers_print_sequence({}); plate->set_other_layers_print_sequence({});
} }
else if (other_layer_seq_choice == LayerSeq::flsCutomize) { else if (other_layer_seq_choice == LayerSeq::flsCustomize) {
const DynamicPrintConfig& plate_config = plate_item.second->get(); const DynamicPrintConfig& plate_config = plate_item.second->get();
if (!plate_config.has("other_layers_print_sequence")) { if (!plate_config.has("other_layers_print_sequence")) {
std::vector<int> initial_sequence; std::vector<int> initial_sequence;
@ -5115,13 +5115,12 @@ bool Tab::select_preset(std::string preset_name, bool delete_current /*=false*/,
apply_config_from_cache(); apply_config_from_cache();
// Orca: update presets for the selected printer // Orca: update presets for the selected printer
load_current_preset();
if (m_type == Preset::TYPE_PRINTER && wxGetApp().app_config->get_bool("remember_printer_config")) { if (m_type == Preset::TYPE_PRINTER && wxGetApp().app_config->get_bool("remember_printer_config")) {
m_preset_bundle->update_selections(*wxGetApp().app_config); m_preset_bundle->update_selections(*wxGetApp().app_config);
wxGetApp().plater()->sidebar().on_filaments_change(m_preset_bundle->filament_presets.size()); wxGetApp().plater()->sidebar().on_filaments_change(m_preset_bundle->filament_presets.size());
} }
load_current_preset();
if (delete_third_printer) { if (delete_third_printer) {
wxGetApp().CallAfter([filament_presets, process_presets]() { wxGetApp().CallAfter([filament_presets, process_presets]() {

View file

@ -24,12 +24,14 @@ static const std::string temp_gcode_path = temp_dir + "/temp.gcode";
static const std::string path = temp_dir + "/test.3mf"; static const std::string path = temp_dir + "/test.3mf";
static const std::string config_3mf_path = temp_dir + "/test_config.3mf"; static const std::string config_3mf_path = temp_dir + "/test_config.3mf";
static std::string MachineBedTypeString[5] = { static std::string MachineBedTypeString[7] = {
"auto", "auto",
"suprtack",
"pc", "pc",
"ep", "ep",
"pei", "pei",
"pte" "pte",
"pct",
}; };