mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-06-14 22:33:50 +03:00
Compare commits
1 Commits
release/v2
...
feature/ca
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
604f15e20d |
2
.github/workflows/build_all.yml
vendored
2
.github/workflows/build_all.yml
vendored
@@ -14,7 +14,6 @@ on:
|
||||
- 'resources/**'
|
||||
- ".github/workflows/build_*.yml"
|
||||
- 'scripts/flatpak/**'
|
||||
- 'scripts/msix/**'
|
||||
|
||||
pull_request:
|
||||
branches:
|
||||
@@ -31,7 +30,6 @@ on:
|
||||
- 'build_release_vs2022.bat'
|
||||
- 'build_release_macos.sh'
|
||||
- 'scripts/flatpak/**'
|
||||
- 'scripts/msix/**'
|
||||
|
||||
|
||||
schedule:
|
||||
|
||||
19
.github/workflows/build_orca.yml
vendored
19
.github/workflows/build_orca.yml
vendored
@@ -371,25 +371,6 @@ jobs:
|
||||
asset_content_type: application/x-msdownload
|
||||
max_releases: 1
|
||||
|
||||
- name: Build MSIX Store package Win
|
||||
if: runner.os == 'Windows' && !vars.SELF_HOSTED
|
||||
working-directory: ${{ github.workspace }}
|
||||
shell: pwsh
|
||||
run: |
|
||||
./scripts/msix/build_msix.ps1 `
|
||||
-InstallDir "${{ github.workspace }}/build/OrcaSlicer" `
|
||||
-OutputPath "${{ github.workspace }}/build/OrcaSlicer_Windows_MSIX_${{ env.ver }}.msix" `
|
||||
-IdentityName "${{ vars.ORCA_MSIX_IDENTITY_NAME || 'OrcaSlicer.OrcaSlicer' }}" `
|
||||
-Publisher "${{ vars.ORCA_MSIX_PUBLISHER || 'CN=38F7EA55-C73B-4072-B3B2-C8E0EA15BB82' }}" `
|
||||
-PublisherDisplayName "${{ vars.ORCA_MSIX_PUBLISHER_DISPLAY_NAME || 'OrcaSlicer' }}"
|
||||
|
||||
- name: Upload artifacts Win MSIX
|
||||
if: runner.os == 'Windows' && !vars.SELF_HOSTED
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: OrcaSlicer_Windows_MSIX_${{ env.ver }}
|
||||
path: ${{ github.workspace }}/build/OrcaSlicer_Windows_MSIX_${{ env.ver }}.msix
|
||||
|
||||
# Ubuntu
|
||||
- name: Apt-Install Dependencies
|
||||
if: runner.os == 'Linux' && !vars.SELF_HOSTED
|
||||
|
||||
3
.github/workflows/publish_release.yml
vendored
3
.github/workflows/publish_release.yml
vendored
@@ -73,9 +73,8 @@ jobs:
|
||||
|
||||
- name: Download release artifacts from build run
|
||||
run: |
|
||||
# Windows_V* (not Windows_*) keeps the MSIX Store artifact out: it goes to Partner Center, not GitHub releases.
|
||||
gh run download "$RUN_ID" --repo "$GITHUB_REPOSITORY" --dir artifacts \
|
||||
-p 'OrcaSlicer_Windows_V*' \
|
||||
-p 'OrcaSlicer_Windows_*' \
|
||||
-p 'OrcaSlicer_Mac_universal_*' \
|
||||
-p 'OrcaSlicer_Linux_ubuntu_*' \
|
||||
-p 'OrcaSlicer-Linux-flatpak_*' \
|
||||
|
||||
@@ -1873,14 +1873,12 @@ msgid ""
|
||||
"You are currently in Stealth Mode. To log into the Cloud, you need to "
|
||||
"disable Stealth Mode first."
|
||||
msgstr ""
|
||||
"Sie befinden sich derzeit im Stealth-Modus. Um sich in der Cloud anzumelden, "
|
||||
"müssen Sie zunächst den Stealth-Modus deaktivieren."
|
||||
|
||||
msgid "Stealth Mode"
|
||||
msgstr "Stealth-Modus"
|
||||
msgstr ""
|
||||
|
||||
msgid "Quit Stealth Mode"
|
||||
msgstr "Stealth-Modus verlassen"
|
||||
msgstr ""
|
||||
|
||||
msgid "new or open project file is not allowed during the slicing process!"
|
||||
msgstr ""
|
||||
@@ -1902,31 +1900,20 @@ msgid ""
|
||||
"Pull downloads the cloud copy. Force push overwrites it with your local "
|
||||
"preset."
|
||||
msgstr ""
|
||||
"Cloud-Synchronisationskonflikt: Dieses Profil hat eine neuere Version in "
|
||||
"OrcaCloud.\n"
|
||||
"Pull lädt die Cloud-Kopie herunter. Force Push überschreibt sie mit Ihrem "
|
||||
"lokalen Profil."
|
||||
|
||||
msgid ""
|
||||
"Cloud sync conflict: a preset with this name already exists in OrcaCloud.\n"
|
||||
"Pull downloads the cloud copy. Force push overwrites it with your local "
|
||||
"preset."
|
||||
msgstr ""
|
||||
"Cloud-Synchronisationskonflikt: Ein Profil mit diesem Namen existiert bereits "
|
||||
"in OrcaCloud.\n"
|
||||
"Pull lädt die Cloud-Kopie herunter. Force Push überschreibt sie mit Ihrem "
|
||||
"lokalen Profil."
|
||||
|
||||
msgid ""
|
||||
"Force push will overwrite the cloud copy with your local preset changes.\n"
|
||||
"Do you want to continue?"
|
||||
msgstr ""
|
||||
"Force Push überschreibt die Cloud-Kopie mit Ihren lokalen Profiländerungen.\n"
|
||||
"Möchten Sie fortfahren?"
|
||||
|
||||
msgid "Resolve cloud sync conflict"
|
||||
msgstr ""
|
||||
"Cloud-Synchronisationskonflikt lösen"
|
||||
|
||||
msgid "Retrieving printer information, please try again later."
|
||||
msgstr "Empfange Druckerinformationen, bitte später erneut versuchen."
|
||||
@@ -2244,7 +2231,7 @@ msgid "Orca Cube"
|
||||
msgstr "Orca Würfel"
|
||||
|
||||
msgid "OrcaSliced Combo"
|
||||
msgstr "OrcaSliced Kombination"
|
||||
msgstr ""
|
||||
|
||||
msgid "Orca Tolerance Test"
|
||||
msgstr "Orca Toleranz Test"
|
||||
@@ -5683,7 +5670,7 @@ msgid "Outline"
|
||||
msgstr "Umriss"
|
||||
|
||||
msgid "Realistic View"
|
||||
msgstr "Realistische Ansicht"
|
||||
msgstr ""
|
||||
|
||||
msgid "Perspective"
|
||||
msgstr "Perspektive"
|
||||
@@ -5993,7 +5980,7 @@ msgid "Show Configuration Folder"
|
||||
msgstr "Konfigurationsordner anzeigen"
|
||||
|
||||
msgid "Troubleshoot Center"
|
||||
msgstr "Fehlerbehebungszentrum"
|
||||
msgstr ""
|
||||
|
||||
msgid "Open Network Test"
|
||||
msgstr "Netzwerktest öffnen"
|
||||
@@ -6037,10 +6024,10 @@ msgid "Rear"
|
||||
msgstr "Hinten"
|
||||
|
||||
msgid "Rear View"
|
||||
msgstr "Ansicht von hinten"
|
||||
msgstr "Ansicht von Hinten"
|
||||
|
||||
msgid "Left View"
|
||||
msgstr "Ansicht von links"
|
||||
msgstr "Anicht von Links"
|
||||
|
||||
msgid "Right View"
|
||||
msgstr "Ansicht von rechts"
|
||||
@@ -7384,10 +7371,10 @@ msgid "Model file downloaded."
|
||||
msgstr "Modelldatei heruntergeladen."
|
||||
|
||||
msgid "Pull"
|
||||
msgstr "Herunterladen"
|
||||
msgstr ""
|
||||
|
||||
msgid "Force push"
|
||||
msgstr "Hochladen erzwingen"
|
||||
msgstr ""
|
||||
|
||||
msgid "Shared profiles may be available for this printer."
|
||||
msgstr "Für diesen Drucker sind möglicherweise freigegebene Profile verfügbar."
|
||||
@@ -8462,10 +8449,10 @@ msgstr ""
|
||||
"werden nur positive Teile exportiert."
|
||||
|
||||
msgid "Flashforge host is not available."
|
||||
msgstr "Flashforge-Host ist nicht verfügbar."
|
||||
msgstr ""
|
||||
|
||||
msgid "Unable to log in to the Flashforge printer."
|
||||
msgstr "Anmeldung am Flashforge-Drucker nicht möglich."
|
||||
msgstr ""
|
||||
|
||||
msgid "Is the printer ready? Is the print sheet in place, empty and clean?"
|
||||
msgstr ""
|
||||
@@ -9044,22 +9031,22 @@ msgid "Graphics"
|
||||
msgstr "Grafik"
|
||||
|
||||
msgid "Phong shading"
|
||||
msgstr "Phong-Shading"
|
||||
msgstr ""
|
||||
|
||||
msgid "Uses Phong shading inside realistic view."
|
||||
msgstr "Verwendet Phong-Shading in der realistischen Ansicht."
|
||||
msgstr ""
|
||||
|
||||
msgid "SSAO ambient occlusion"
|
||||
msgstr "SSAO-Umgebungsverdeckung"
|
||||
msgstr ""
|
||||
|
||||
msgid "Applies SSAO in realistic view."
|
||||
msgstr "Wendet SSAO in der realistischen Ansicht an."
|
||||
msgstr ""
|
||||
|
||||
msgid "Shadows"
|
||||
msgstr "Schatten"
|
||||
msgstr ""
|
||||
|
||||
msgid "Renders cast shadows on the plate in realistic view."
|
||||
msgstr "Zeigt geworfene Schatten auf der Platte in der realistischen Ansicht an."
|
||||
msgstr ""
|
||||
|
||||
msgid "Anti-aliasing"
|
||||
msgstr "Kantenglättung"
|
||||
@@ -9139,16 +9126,12 @@ msgid ""
|
||||
"Note: When Stealth Mode is enabled, your user profiles will not be backed up "
|
||||
"to Orca Cloud."
|
||||
msgstr ""
|
||||
"Dies deaktiviert alle Cloud-Funktionen, einschließlich der Profil-Synchronisierung "
|
||||
"mit Orca Cloud. Benutzer, die es vorziehen, vollständig offline zu arbeiten, "
|
||||
"können diese Option aktivieren.\n"
|
||||
"Hinweis: Wenn der Unsichtbare Modus aktiviert ist, werden Ihre Benutzerprofile nicht in Orca Cloud gesichert."
|
||||
|
||||
msgid "Hide login side panel"
|
||||
msgstr "Login-Seitenleiste ausblenden"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hide the login side panel on the home page."
|
||||
msgstr "Blendet die Login-Seitenleiste auf der Startseite aus."
|
||||
msgstr ""
|
||||
|
||||
msgid "Network test"
|
||||
msgstr "Netzwerktest"
|
||||
@@ -9316,14 +9299,12 @@ msgstr ""
|
||||
"Sehr experimentell! Langsam und kann Artefakte erzeugen."
|
||||
|
||||
msgid "Show unsupported presets"
|
||||
msgstr "Nicht unterstützte Profile anzeigen"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Show incompatible/unsupported presets in the printer and filament dropdown "
|
||||
"lists. These presets cannot be selected."
|
||||
msgstr ""
|
||||
"Zeigt inkompatible/nicht unterstützte Profile in den Dropdown-Listen für "
|
||||
"Drucker und Filament an. Diese Profile können nicht ausgewählt werden."
|
||||
|
||||
msgid "Allow Abnormal Storage"
|
||||
msgstr "Fehlerhaften Speicher zulassen"
|
||||
@@ -10985,11 +10966,6 @@ msgid ""
|
||||
"\n"
|
||||
"Shall I set it to 100% in order to enable Firmware Retraction?"
|
||||
msgstr ""
|
||||
"Die Option Rückzug vor Wischen kann nur 100% sein, wenn der Modus Filament "
|
||||
"Rückzug durch Firmware verwendet wird.\n"
|
||||
"\n"
|
||||
"Soll ich es auf 100% setzen, um den Filament Rückzug durch Firmware zu "
|
||||
"aktivieren?"
|
||||
|
||||
msgid "Firmware Retraction"
|
||||
msgstr "Filament Rückzug durch Firmware"
|
||||
@@ -12744,23 +12720,17 @@ msgid "Layer height cannot exceed nozzle diameter."
|
||||
msgstr "Schichthöhe darf den Düsendurchmesser nicht überschreiten."
|
||||
|
||||
msgid "Bridge line width must not exceed nozzle diameter"
|
||||
msgstr "Die Breite der Brückenlinie darf den Düsendurchmesser nicht überschreiten."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"\"G92 E0\" was found in before_layer_change_gcode, but the G or E are not "
|
||||
"uppercase. Please change them to the exact uppercase \"G92 E0\"."
|
||||
msgstr ""
|
||||
"\"G92 E0\" wurde in before_layer_change_gcode gefunden, aber G oder E sind "
|
||||
"nicht großgeschrieben. Bitte ändern Sie sie in das exakte Großgeschriebene "
|
||||
"\"G92 E0\"."
|
||||
|
||||
msgid ""
|
||||
"\"G92 E0\" was found in layer_change_gcode, but the G or E are not "
|
||||
"uppercase. Please change them to the exact uppercase \"G92 E0\"."
|
||||
msgstr ""
|
||||
"\"G92 E0\" wurde in layer_change_gcode gefunden, aber G oder E sind "
|
||||
"nicht großgeschrieben. Bitte ändern Sie sie in das exakte Großgeschriebene "
|
||||
"\"G92 E0\"."
|
||||
|
||||
msgid ""
|
||||
"Relative extruder addressing requires resetting the extruder position at "
|
||||
@@ -12775,8 +12745,6 @@ msgid ""
|
||||
"\"G92 E0\" was found in before_layer_change_gcode, which is incompatible "
|
||||
"with absolute extruder addressing."
|
||||
msgstr ""
|
||||
"\"G92 E0\" wurde in before_layer_change_gcode gefunden, was mit absoluter "
|
||||
"Extruderadressierung nicht kompatibel ist."
|
||||
|
||||
msgid ""
|
||||
"\"G92 E0\" was found in layer_change_gcode, which is incompatible with "
|
||||
@@ -12891,32 +12859,29 @@ msgid "Extruder printable area"
|
||||
msgstr "Druckbarer Bereich des Extruders"
|
||||
|
||||
msgid "Support parallel printheads"
|
||||
msgstr "Unterstützung paralleler Druckköpfe"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Enable printer settings for machines that can use multiple printheads in "
|
||||
"parallel."
|
||||
msgstr "Aktivieren Sie die Druckereinstellungen für Maschinen, die mehrere Druckköpfe parallel verwenden können."
|
||||
msgstr ""
|
||||
|
||||
msgid "Parallel printheads count"
|
||||
msgstr "Anzahl der parallelen Druckköpfe"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Set the number of parallel printheads for machines like OrangeStorm Giga "
|
||||
"printer."
|
||||
msgstr "Legen Sie die Anzahl der parallelen Druckköpfe für Maschinen wie den OrangeStorm Giga Drucker fest."
|
||||
msgstr ""
|
||||
|
||||
msgid "Parallel printheads bed exclude areas"
|
||||
msgstr "Druckbett-Ausschlussbereiche für parallele Druckköpfe"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Ordered list of bed exclude areas by parallel printhead count. Item 1 "
|
||||
"applies to one printhead, item 2 to two printheads, and so on. Leave an item "
|
||||
"empty for no excluded area."
|
||||
msgstr ""
|
||||
"Geordnete Liste der Druckbett-Ausschlussbereiche nach Anzahl der parallelen "
|
||||
"Druckköpfe. Punkt 1 gilt für einen Druckkopf, Punkt 2 für zwei Druckköpfe und so "
|
||||
"weiter. Lassen Sie einen Punkt leer, wenn keine Ausschlussbereiche vorhanden sind."
|
||||
|
||||
msgid "Bed exclude area"
|
||||
msgstr "ausgenommene Druckbettfläche"
|
||||
@@ -13064,10 +13029,10 @@ msgstr ""
|
||||
"erforderliche Passwort enthalten."
|
||||
|
||||
msgid "Serial Number"
|
||||
msgstr "Seriennummer"
|
||||
msgstr ""
|
||||
|
||||
msgid "Flashforge local API requires the printer serial number."
|
||||
msgstr "Die lokale Flashforge-API erfordert die Seriennummer des Druckers."
|
||||
msgstr ""
|
||||
|
||||
msgid "Name of the printer."
|
||||
msgstr "Name des Druckers"
|
||||
@@ -13440,17 +13405,6 @@ msgid ""
|
||||
"\n"
|
||||
"Use 180° for zero absolute angle."
|
||||
msgstr ""
|
||||
"Externe Brückenwinkelüberschreibung.\n"
|
||||
"Wenn auf Null gelassen, wird der Brückenwinkel automatisch für jede "
|
||||
"spezifische Brücke berechnet.\n"
|
||||
"Ansonsten wird der angegebene Winkel wie folgt verwendet:\n"
|
||||
" - Die absoluten Koordinaten\n"
|
||||
" - Die absoluten Koordinaten + Modellrotation: Wenn 'Füllrichtung an Modell "
|
||||
"ausrichten' aktiviert ist\n"
|
||||
" - Der optimale automatische Winkel + dieser Wert: Wenn 'Relativer "
|
||||
"Brückenwinkel' aktiviert ist\n"
|
||||
"\n"
|
||||
"Verwenden Sie 180° für einen absoluten Winkel von Null."
|
||||
|
||||
msgid "Internal bridge infill direction"
|
||||
msgstr "Interne Brücken Füllrichtung"
|
||||
@@ -13468,27 +13422,14 @@ msgid ""
|
||||
"\n"
|
||||
"Use 180° for zero absolute angle."
|
||||
msgstr ""
|
||||
"Interne Brückenwinkelüberschreibung.\n"
|
||||
"Wenn auf Null gelassen, wird der Brückenwinkel automatisch für jede "
|
||||
"spezifische Brücke berechnet.\n"
|
||||
"Ansonsten wird der angegebene Winkel wie folgt verwendet:\n"
|
||||
" - Die absoluten Koordinaten\n"
|
||||
" - Die absoluten Koordinaten + Modellrotation: Wenn 'Füllrichtung an Modell "
|
||||
"ausrichten' aktiviert ist\n"
|
||||
" - Der optimale automatische Winkel + dieser Wert: Wenn 'Relativer "
|
||||
"Brückenwinkel' aktiviert ist\n"
|
||||
"\n"
|
||||
"Verwenden Sie 180° für einen absoluten Winkel von Null."
|
||||
|
||||
msgid "Relative bridge angle"
|
||||
msgstr "Relativer Brückenwinkel"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"When enabled, the bridge angle values are added to the automatically "
|
||||
"calculated bridge direction instead of overriding it."
|
||||
msgstr ""
|
||||
"Wenn aktiviert, werden die Brückenwinkelwerte zur automatisch berechneten "
|
||||
"Brückenrichtung hinzugefügt, anstatt sie zu überschreiben."
|
||||
|
||||
msgid "External bridge density"
|
||||
msgstr "Externe Brücken Dichte"
|
||||
@@ -13512,19 +13453,6 @@ msgid ""
|
||||
"\n"
|
||||
"Recommended range: Minimum 10% - Maximum 125%."
|
||||
msgstr ""
|
||||
"Steuert die Dichte (Abstand) der Linien der externen Brücke. Standard ist 100%.\n"
|
||||
"Theoretisch bedeutet 100% eine solide Brücke, aber aufgrund der Neigung von "
|
||||
"Brückenextrusionen zum Durchhängen, ist 100% möglicherweise nicht ausreichend.\n"
|
||||
"\n"
|
||||
"- Höher als 100% Dichte (Empfohlen Max 125%):\n"
|
||||
" - Vorteile: Erzeugt glattere Brückenoberflächen, da sich überlappende Linien während des Druckens zusätzliche Unterstützung bieten.\n"
|
||||
" - Nachteile: Kann zu Überextrusion führen, was die Qualität der unteren und oberen Oberfläche verringern und das Risiko von Verzug erhöhen kann.\n"
|
||||
"\n"
|
||||
"- Niedriger als 100% Dichte (Min 10%):\n"
|
||||
" - Vorteile: Kann eine fadenartige erste Schicht erzeugen. Schneller und mit besserer Kühlung, da mehr Platz für die Luftzirkulation um die extrudierte Brücke vorhanden ist.\n"
|
||||
" - Nachteile: Kann zu Durchhängen und schlechterer Oberflächenqualität führen.\n"
|
||||
"\n"
|
||||
"Empfohlener Bereich: Minimum 10% - Maximum 125%."
|
||||
|
||||
msgid "Internal bridge density"
|
||||
msgstr "Interne Brücken Dichte"
|
||||
@@ -13552,28 +13480,6 @@ msgid ""
|
||||
"bridge over infill option to improve bridging further before solid infill is "
|
||||
"extruded."
|
||||
msgstr ""
|
||||
"Steuert die Dichte (Abstand) der Linien der internen Brücke. Standard ist 100%. "
|
||||
"100% bedeutet eine solide interne Brücke.\n"
|
||||
"\n"
|
||||
"Interne Brücken wirken als Zwischenstütze zwischen lockerer Füllung und "
|
||||
"oberer festen Füllung und können die Qualität der Oberseite stark beeinflussen.\n"
|
||||
"\n"
|
||||
"- Höher als 100% Dichte (Empfohlen Max 125%):\n"
|
||||
" - Vorteile: Verbessert die Stärke der internen Brücke und die Unterstützung "
|
||||
"unter den oberen Schichten, reduziert das Durchhängen und verbessert die "
|
||||
"Oberflächenqualität.\n"
|
||||
" - Nachteile: Erhöht den Materialverbrauch und die Druckzeit; eine zu hohe "
|
||||
"Dichte kann zu Überfüllung und inneren Spannungen führen.\n"
|
||||
"\n"
|
||||
"- Niedriger als 100% Dichte (Min 10%):\n"
|
||||
" - Vorteile: Kann das Pillowing reduzieren und die Kühlung verbessern (mehr "
|
||||
"Luftzirkulation durch die Brücke), und kann den Druck beschleunigen.\n"
|
||||
" - Nachteile: Kann die innere Unterstützung reduzieren und das Risiko von "
|
||||
"Durchhängen und Defekten auf der Oberseite erhöhen.\n"
|
||||
"\n"
|
||||
"Diese Option funktioniert besonders gut in Kombination mit der zweiten internen "
|
||||
"Brücke über Füllungsoption, um die Brückenbildung weiter zu verbessern, bevor "
|
||||
"die obere feste Füllung extrudiert wird."
|
||||
|
||||
msgid "Bridge flow ratio"
|
||||
msgstr "Brücken Flussrate"
|
||||
@@ -13599,15 +13505,6 @@ msgid ""
|
||||
"The maximum value is 100% or the nozzle diameter.\n"
|
||||
"If set to 0, the line width will match the Internal solid infill width."
|
||||
msgstr ""
|
||||
"Die Brückenlinienbreite wird entweder als absoluter Wert oder als Prozentsatz "
|
||||
"des aktiven Düsendurchmessers angegeben (Prozentsätze werden vom Düsendurch- "
|
||||
"messer berechnet).\n"
|
||||
"Wird empfohlen, in Verbindung mit einer höheren Brückendichte oder einer "
|
||||
"höheren Brückenflussrate zu verwenden.\n"
|
||||
"\n"
|
||||
"Der maximale Wert beträgt 100% oder der Düsendurchmesser.\n"
|
||||
"Wenn auf 0 gesetzt, entspricht die Linienbreite der Breite der inneren "
|
||||
"festen Füllung."
|
||||
|
||||
msgid "Internal bridge flow ratio"
|
||||
msgstr "Interne Brücken Flussrate"
|
||||
@@ -13624,15 +13521,6 @@ msgid ""
|
||||
"The actual bridge flow used is calculated by multiplying this value with the "
|
||||
"filament flow ratio, and if set, the object's flow ratio."
|
||||
msgstr ""
|
||||
"Dieser Wert steuert die Dicke der internen Brückenlage. Dies ist die erste "
|
||||
"Schicht über der lockeren Füllung, daher kann eine Erhöhung die Festigkeit und ""die Qualität der oberen Schicht verbessern.\n"
|
||||
"Werte über 1.0: Erhöhen die Materialmenge bei gleichbleibendem Linienabstand. Dies kann die "
|
||||
"Linienkontakt und Festigkeit verbessern.\n"
|
||||
"Werte unter 1.0: Reduzieren die Materialmenge bei Anpassung des Linienabstands, um den Kontakt aufrechtzuerhalten. Dies kann das Durchhängen verbessern.\n"
|
||||
"\n"
|
||||
"Der tatsächliche Brückenfluss wird berechnet, indem dieser Wert mit dem "
|
||||
"Filamentflussverhältnis und, falls festgelegt, dem Objektflussverhältnis "
|
||||
"multipliziert wird."
|
||||
|
||||
msgid "Top surface flow ratio"
|
||||
msgstr "Durchflussverhältnis obere Fläche"
|
||||
@@ -14021,30 +13909,6 @@ msgid ""
|
||||
"For example, when the perimeters are 100% overhanging, with no wall "
|
||||
"supporting them from underneath, the 100% overhang speed will be applied."
|
||||
msgstr ""
|
||||
"Aktivieren Sie diese Option, um den Druck in Bereichen zu verlangsamen, in "
|
||||
"denen sich die Umfänge möglicherweise nach oben gekrümmt haben.\n"
|
||||
"Zum Beispiel wird bei der Druckung von Überhängen an scharfen Ecken wie dem "
|
||||
"Vorderteil der Benchy-Hülle eine zusätzliche Verlangsamung angewendet, um "
|
||||
"das Krümmen zu reduzieren, das sich über mehrere Schichten hinweg "
|
||||
"verstärkt.\n"
|
||||
"\n"
|
||||
"Es wird in der Regel empfohlen, diese Option aktiviert zu lassen, es sei "
|
||||
"denn, Ihre Druckerkühlung ist stark genug oder die Druckgeschwindigkeit ist "
|
||||
"langsam genug, sodass sich Umfänge nicht krümmen. \n"
|
||||
"Wenn Sie mit einer hohen externen Umfangsgeschwindigkeit drucken, kann dieser "
|
||||
"Parameter bei der Verlangsamung Wandartefakte verursachen, da die "
|
||||
"potentiell große Varianz der Druckgeschwindigkeiten den Extruder daran "
|
||||
"hindert, dem geforderten Fließänderungsverlauf zu folgen.\n"
|
||||
"Die Ursache dieser Artefakte ist in der Regel eine leicht abweichende PA-"
|
||||
"Einstellung, insbesondere in Kombination mit einer hohen PA-Glättungszeit.\n"
|
||||
"\n"
|
||||
"Empfehlungen bei Aktivierung dieser Option:\n"
|
||||
"1. Reduzieren Sie die Glättungszeit des Druckvorschubs auf 0,015 - 0,02, damit der Extruder schnell auf Geschwindigkeitsänderungen reagieren kann.\n"
|
||||
"2. Erhöhen Sie die Mindestdruckgeschwindigkeiten, um die Schwankung zwischen den schnellen und langsamen Segmenten zu begrenzen.\n"
|
||||
"3. Wenn Artefakte weiterhin auftreten, aktivieren Sie die Glättung der Extrusionsrate (ERS), um die Übergänge der Fließrate weiter zu glätten.\n"
|
||||
"\n"
|
||||
"Hinweis: Wenn diese Option aktiviert ist, werden die Überhangumfänge wie Überhänge behandelt, was bedeutet, dass die Überhanggeschwindigkeit auch dann angewendet wird, wenn der überhängende Umfang Teil einer Brücke ist.\n"
|
||||
"Zum Beispiel wird bei den Umfängen, die zu 100 % überhängen, wobei keine Wand darunter liegt, die 100 % Überhanggeschwindigkeit angewendet."
|
||||
|
||||
msgid "mm/s or %"
|
||||
msgstr "mm/s o. %"
|
||||
@@ -14335,10 +14199,6 @@ msgid ""
|
||||
"If disabled, bridges may look better but are generally reliable only for "
|
||||
"shorter spans."
|
||||
msgstr ""
|
||||
"Wenn aktiviert, verwendet die Brückenextrusion eine Linienhöhe, die dem "
|
||||
"Düsendurchmesser entspricht.\n"
|
||||
"Dies erhöht die Brückenfestigkeit und Zuverlässigkeit, ermöglicht längere Spannweiten, kann aber das Aussehen verschlechtern.\n"
|
||||
"Wenn deaktiviert, können Brücken besser aussehen, sind aber im Allgemeinen nur für kürzere Spannweiten zuverlässig."
|
||||
|
||||
msgid "Thick internal bridges"
|
||||
msgstr "Dicke interne Brücken"
|
||||
@@ -14351,12 +14211,6 @@ msgid ""
|
||||
"If disabled, internal bridges may look better but can be less reliable over "
|
||||
"sparse infill."
|
||||
msgstr ""
|
||||
"Wenn aktiviert, verwendet die interne Brückenextrusion eine Linienhöhe, die "
|
||||
"dem Düsendurchmesser entspricht.\n"
|
||||
"Dies erhöht die interne Brückenfestigkeit und Zuverlässigkeit, wenn über "
|
||||
"seltenes Infill gedruckt wird, kann aber das Aussehen verschlechtern.\n"
|
||||
"Wenn deaktiviert, können interne Brücken besser aussehen, sind aber "
|
||||
"überdünnes Infill weniger zuverlässig."
|
||||
|
||||
msgid "Extra bridge layers (beta)"
|
||||
msgstr "Zusätzliche Brückenschichten (Beta)"
|
||||
@@ -15645,9 +15499,6 @@ msgid ""
|
||||
"When enabled, directions rotate with the model to maintain optimal strength "
|
||||
"characteristics."
|
||||
msgstr ""
|
||||
"Richtet die Richtungen von Füllung, Brücke, Glättung und Oberflächenfüllung so "
|
||||
"aus, dass sie der Orientierung des Modells auf der Bauplatte folgen.\n"
|
||||
"Wenn aktiviert, drehen sich die Richtungen mit dem Modell, um optimale Festigkeitseigenschaften zu erhalten."
|
||||
|
||||
msgid "Insert solid layers"
|
||||
msgstr "Massive Schichten einfügen"
|
||||
@@ -15783,28 +15634,25 @@ msgstr ""
|
||||
"Wabenstruktur."
|
||||
|
||||
msgid "Lightning overhang angle"
|
||||
msgstr "Überhangwinkel der Blitzfüllung"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum overhang angle for Lightning infill support propagation."
|
||||
msgstr "Maximaler Überhangwinkel für die Ausbreitung der Blitzfüllungsunterstützung."
|
||||
msgstr ""
|
||||
|
||||
msgid "Prune angle"
|
||||
msgstr "Beschneidungswinkel"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Controls how aggressively short or unsupported Lightning branches are "
|
||||
"pruned.\n"
|
||||
"This angle is converted internally to a per-layer distance."
|
||||
msgstr ""
|
||||
"Steuert, wie aggressiv kurze oder nicht unterstützte Blitzäste beschnitten "
|
||||
"werden.\n"
|
||||
"Dieser Winkel wird intern in eine pro-Schicht-Distanz umgewandelt."
|
||||
|
||||
msgid "Straightening angle"
|
||||
msgstr "Begradigungswinkel"
|
||||
msgstr ""
|
||||
|
||||
msgid "Maximum straightening angle used to simplify Lightning branches."
|
||||
msgstr "Maximaler Begradigungswinkel zur Vereinfachung von Blitzästen."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sparse infill anchor length"
|
||||
msgstr "Länge des Infill-Ankers"
|
||||
@@ -16913,8 +16761,6 @@ msgid ""
|
||||
"Filament to print internal sparse infill.\n"
|
||||
"\"Default\" uses the active object/part filament."
|
||||
msgstr ""
|
||||
"Filament zum Drucken der internen spärlichen Füllung.\n"
|
||||
"\"Standard\" verwendet das Filament des aktiven Objekts/Teils."
|
||||
|
||||
msgid ""
|
||||
"Line width of internal sparse infill. If expressed as a %, it will be "
|
||||
@@ -17803,24 +17649,20 @@ msgstr ""
|
||||
"100%% Überhang wird die Brückengeschwindigkeit verwendet."
|
||||
|
||||
msgid "Outer walls"
|
||||
msgstr "Äußere Wände"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Filament to print outer walls.\n"
|
||||
"\"Default\" uses the active object/part filament."
|
||||
msgstr ""
|
||||
"Filament zum Drucken der äußeren Wände.\n"
|
||||
"\"Standard\" verwendet das Filament des aktiven Objekts/Teils."
|
||||
|
||||
msgid "Inner walls"
|
||||
msgstr "Innere Wände"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Filament to print inner walls.\n"
|
||||
"\"Default\" uses the active object/part filament."
|
||||
msgstr ""
|
||||
"Filament zum Drucken der inneren Wände.\n"
|
||||
"\"Standard\" verwendet das Filament des aktiven Objekts/Teils."
|
||||
|
||||
msgid ""
|
||||
"Line width of inner wall. If expressed as a %, it will be computed over the "
|
||||
@@ -18540,22 +18382,16 @@ msgid ""
|
||||
"Filament to print internal solid infill.\n"
|
||||
"\"Default\" uses the active object/part filament."
|
||||
msgstr ""
|
||||
"Filament zum Drucken der internen massiven Füllung.\n"
|
||||
"\"Standard\" verwendet das Filament des aktiven Objekts/Teils."
|
||||
|
||||
msgid ""
|
||||
"Filament to print top surface.\n"
|
||||
"\"Default\" uses the active object/part filament."
|
||||
msgstr ""
|
||||
"Filament zum Drucken der oberen Oberfläche.\n"
|
||||
"\"Standard\" verwendet das Filament des aktiven Objekts/Teils."
|
||||
|
||||
msgid ""
|
||||
"Filament to print bottom surface.\n"
|
||||
"\"Default\" uses the active object/part filament."
|
||||
msgstr ""
|
||||
"Filament zum Drucken der unteren Oberfläche.\n"
|
||||
"\"Standard\" verwendet das Filament des aktiven Objekts/Teils."
|
||||
|
||||
msgid ""
|
||||
"Line width of internal solid infill. If expressed as a %, it will be "
|
||||
@@ -18959,9 +18795,6 @@ msgid ""
|
||||
"\"Default\" means no specific filament for support and current filament is "
|
||||
"used."
|
||||
msgstr ""
|
||||
"Filament zum Drucken der Stützstruktur-Basis und des Rafts.\n"
|
||||
"\"Standard\" bedeutet kein spezifisches Filament für die Stützstruktur und das "
|
||||
"aktuelle Filament wird verwendet."
|
||||
|
||||
msgid "Avoid interface filament for base"
|
||||
msgstr "Schnittstellenfilament für die Basis verringern"
|
||||
@@ -18995,9 +18828,6 @@ msgid ""
|
||||
"\"Default\" means no specific filament for support interface and current "
|
||||
"filament is used."
|
||||
msgstr ""
|
||||
"Filament zum Drucken der Stützstruktur-Schnittstelle.\n"
|
||||
"\"Standard\" bedeutet kein spezifisches Filament für die Stützstruktur-"
|
||||
"Schnittstelle und das aktuelle Filament wird verwendet."
|
||||
|
||||
msgid "Top interface layers"
|
||||
msgstr "Obere Schnittstellenschichten"
|
||||
@@ -20113,7 +19943,7 @@ msgid "Invalid value when spiral vase mode is enabled: "
|
||||
msgstr "Ungültiger Wert, wenn der Spiral-Vase-Modus aktiviert ist: "
|
||||
|
||||
msgid "Bridge line width must not exceed nozzle diameter: "
|
||||
msgstr "Die Brückenlinienbreite darf den Düsendurchmesser nicht überschreiten: "
|
||||
msgstr ""
|
||||
|
||||
msgid "too large line width "
|
||||
msgstr "Zu große Linienbreite"
|
||||
@@ -20380,10 +20210,10 @@ msgstr ""
|
||||
"3:info, 4:debug, 5:trace\n"
|
||||
|
||||
msgid "Log file"
|
||||
msgstr "Protokolldatei"
|
||||
msgstr ""
|
||||
|
||||
msgid "Redirects debug logging to file.\n"
|
||||
msgstr "Leitet die Fehlerprotokollierung in eine Datei um.\n"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable timelapse for print"
|
||||
msgstr "Zeitraffer für Druck aktivieren"
|
||||
@@ -21934,13 +21764,13 @@ msgid "Top Surface Pattern"
|
||||
msgstr "Oberflächenmuster"
|
||||
|
||||
msgid "Choose a slot for the selected color"
|
||||
msgstr "Wählen Sie einen Slot für die ausgewählte Farbe"
|
||||
msgstr ""
|
||||
|
||||
msgid "Material in the material station"
|
||||
msgstr "Material in der Materialstation"
|
||||
msgstr ""
|
||||
|
||||
msgid "Only materials of the same type can be selected."
|
||||
msgstr "Es können nur Materialien desselben Typs ausgewählt werden."
|
||||
msgstr ""
|
||||
|
||||
msgid "Send G-code to printer host"
|
||||
msgstr "Senden Sie G-Code an den Drucker-Host"
|
||||
@@ -21968,50 +21798,46 @@ msgid "Upload"
|
||||
msgstr "Hochladen"
|
||||
|
||||
msgid "Leveling before print"
|
||||
msgstr "Nivellierung vor dem Druck"
|
||||
msgstr ""
|
||||
|
||||
msgid "Time-lapse"
|
||||
msgstr "Zeitraffer"
|
||||
|
||||
msgid "Enable IFS"
|
||||
msgstr "IFS aktivieren"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Detected %d IFS slots on printer."
|
||||
msgstr "%d IFS-Slots auf dem Drucker erkannt."
|
||||
msgstr ""
|
||||
|
||||
msgid "This printer does not report a material station."
|
||||
msgstr "Dieser Drucker meldet keine Materialstation."
|
||||
msgstr ""
|
||||
|
||||
msgid "Unable to read IFS slots from printer."
|
||||
msgstr "Kann IFS-Slots vom Drucker nicht lesen."
|
||||
msgstr ""
|
||||
|
||||
msgid "Loading IFS slots from printer..."
|
||||
msgstr "Lade IFS-Slots vom Drucker..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Slice the plate first to get project material information."
|
||||
msgstr "Schneiden Sie die Platte zuerst, um Projektmaterialinformationen zu erhalten."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"This plate uses multiple materials. Enable IFS and assign each tool to a "
|
||||
"printer slot."
|
||||
msgstr ""
|
||||
"Diese Platte verwendet mehrere Materialien. Aktivieren Sie IFS und weisen Sie jedem Werkzeug einen Drucker-Slot zu."
|
||||
|
||||
|
||||
msgid "Each project material must be assigned to an IFS slot before printing."
|
||||
msgstr "Jedes Projektmaterial muss vor dem Drucken einem IFS-Slot zugewiesen werden."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Each project material must be assigned to a loaded IFS slot before printing."
|
||||
msgstr ""
|
||||
"Jedes Projektmaterial muss vor dem Drucken einem geladenen IFS-Slot zugewiesen werden."
|
||||
|
||||
msgid ""
|
||||
"Each project material must match the material loaded in the selected IFS "
|
||||
"slot."
|
||||
msgstr ""
|
||||
"Jedes Projektmaterial muss mit dem in dem ausgewählten IFS-Slot geladenen Material übereinstimmen."
|
||||
|
||||
msgid "Print host upload queue"
|
||||
msgstr "Druck-Host-Upload-Warteschlange"
|
||||
@@ -22068,13 +21894,13 @@ msgstr "Glatte Bauplatte (Seite B)"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Printer: %s"
|
||||
msgstr "Drucker: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Calibrate before printing"
|
||||
msgstr "Vor dem Drucken kalibrieren"
|
||||
msgstr ""
|
||||
|
||||
msgid "Filament Mapping:"
|
||||
msgstr "Filamentzuordnung:"
|
||||
msgstr ""
|
||||
|
||||
msgid "Unable to perform boolean operation on selected parts"
|
||||
msgstr ""
|
||||
@@ -22802,16 +22628,16 @@ msgstr ""
|
||||
"Druckerkommunikation. Verfügbare Agenten werden beim Start registriert."
|
||||
|
||||
msgid "Select a Flashforge printer"
|
||||
msgstr "Wählen Sie einen Flashforge-Drucker aus"
|
||||
msgstr ""
|
||||
|
||||
msgid "Discovered Printers"
|
||||
msgstr "Gefundene Drucker"
|
||||
msgstr ""
|
||||
|
||||
msgid "Could not get a valid Printer Host reference"
|
||||
msgstr "Konnte keine gültige Referenz zum Druck-Host erhalten"
|
||||
|
||||
msgid "Valid session not detected. Proceed with login to 3DPrinterOS?"
|
||||
msgstr "Keine gültige Sitzung erkannt. Mit dem Login bei 3DPrinterOS fortfahren?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Success!"
|
||||
msgstr "Erfolgreich!"
|
||||
@@ -22862,28 +22688,28 @@ msgstr ""
|
||||
"fehlgeschlagen."
|
||||
|
||||
msgid "3DPrinterOS Cloud upload options"
|
||||
msgstr "3DPrinterOS Cloud-Upload-Optionen"
|
||||
msgstr ""
|
||||
|
||||
msgid "Single file"
|
||||
msgstr "Einzelne Datei"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project File"
|
||||
msgstr "Projektdatei"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project:"
|
||||
msgstr "Projekt:"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printer type:"
|
||||
msgstr "Druckertyp:"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printer type not found, please select manually."
|
||||
msgstr "Druckertyp nicht gefunden, bitte manuell auswählen."
|
||||
msgstr ""
|
||||
|
||||
msgid "Authorizing..."
|
||||
msgstr "Autorisierung..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Error session check"
|
||||
msgstr "Fehler bei der Sitzungsüberprüfung"
|
||||
msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid "Mismatched type of print host: %s"
|
||||
@@ -23682,19 +23508,19 @@ msgstr ""
|
||||
"es einzurichten."
|
||||
|
||||
msgid "Flashforge returned an invalid JSON response."
|
||||
msgstr "Flashforge hat eine ungültige JSON-Antwort zurückgegeben."
|
||||
msgstr ""
|
||||
|
||||
msgid "No Flashforge printers were discovered on the local network."
|
||||
msgstr "Es wurden keine Flashforge-Drucker im lokalen Netzwerk gefunden."
|
||||
msgstr ""
|
||||
|
||||
msgid "Connected to Flashforge local API successfully."
|
||||
msgstr "Erfolgreich mit der lokalen Flashforge-API verbunden."
|
||||
msgstr ""
|
||||
|
||||
msgid "Serial connection to Flashforge is working correctly."
|
||||
msgstr "Die serielle Verbindung zu Flashforge funktioniert korrekt."
|
||||
|
||||
msgid "Could not connect to Flashforge local API"
|
||||
msgstr "Konnte keine Verbindung zur lokalen Flashforge-API herstellen."
|
||||
msgstr ""
|
||||
|
||||
msgid "Could not connect to Flashforge via serial"
|
||||
msgstr ""
|
||||
@@ -23703,8 +23529,6 @@ msgstr ""
|
||||
|
||||
msgid "Flashforge local API requires both serial number and access code."
|
||||
msgstr ""
|
||||
"Die lokale Flashforge-API erfordert sowohl die Seriennummer als auch den "
|
||||
"Zugriffscode."
|
||||
|
||||
msgid "The provided state is not correct."
|
||||
msgstr "Der bereitgestellte Status ist nicht korrekt."
|
||||
|
||||
Binary file not shown.
@@ -124,7 +124,7 @@
|
||||
"default_filament_profile": [
|
||||
"Creality HF Generic PLA"
|
||||
],
|
||||
"machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM104 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600",
|
||||
"machine_start_gcode": "; HEADER_BLOCK_START\n; generated by Creality_Print V7.0.1.4212 on [year]-[month]-[day] at [hour]:[minute]:[second]\n; total layer number: [total_layer_count]\n; creality_uuid: <random_uuid>\n; HEADER_BLOCK_END\n; SET PRINT AREA MIN AND MAX COORDINATES TO ENABLE ADAPTIVE PROBING\n; MINX = {first_layer_print_min[0]}\n; MINY = {first_layer_print_min[1]}\n; MAXX = {first_layer_print_max[0]}\n; MAXY = {first_layer_print_max[1]}\nM140 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": [
|
||||
|
||||
@@ -124,7 +124,7 @@
|
||||
"default_filament_profile": [
|
||||
"Creality HF Generic PLA"
|
||||
],
|
||||
"machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM104 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600",
|
||||
"machine_start_gcode": "; HEADER_BLOCK_START\n; generated by Creality_Print V7.0.1.4212 on [year]-[month]-[day] at [hour]:[minute]:[second]\n; total layer number: [total_layer_count]\n; creality_uuid: <random_uuid>\n; HEADER_BLOCK_END\n; SET PRINT AREA MIN AND MAX COORDINATES TO ENABLE ADAPTIVE PROBING\n; MINX = {first_layer_print_min[0]}\n; MINY = {first_layer_print_min[1]}\n; MAXX = {first_layer_print_max[0]}\n; MAXY = {first_layer_print_max[1]}\nM140 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": [
|
||||
|
||||
@@ -124,7 +124,7 @@
|
||||
"default_filament_profile": [
|
||||
"Creality HF Generic PLA"
|
||||
],
|
||||
"machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM104 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600",
|
||||
"machine_start_gcode": "; HEADER_BLOCK_START\n; generated by Creality_Print V7.0.1.4212 on [year]-[month]-[day] at [hour]:[minute]:[second]\n; total layer number: [total_layer_count]\n; creality_uuid: <random_uuid>\n; HEADER_BLOCK_END\n; SET PRINT AREA MIN AND MAX COORDINATES TO ENABLE ADAPTIVE PROBING\n; MINX = {first_layer_print_min[0]}\n; MINY = {first_layer_print_min[1]}\n; MAXX = {first_layer_print_max[0]}\n; MAXY = {first_layer_print_max[1]}\nM140 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": [
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
"machine_pause_gcode": "PAUSE",
|
||||
"machine_platform_motion_enable": "1",
|
||||
"machine_ptc_exist": "1",
|
||||
"machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM104 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600",
|
||||
"machine_start_gcode": "; HEADER_BLOCK_START\n; generated by Creality_Print V7.0.1.4212 on [year]-[month]-[day] at [hour]:[minute]:[second]\n; total layer number: [total_layer_count]\n; creality_uuid: <random_uuid>\n; HEADER_BLOCK_END\n; SET PRINT AREA MIN AND MAX COORDINATES TO ENABLE ADAPTIVE PROBING\n; MINX = {first_layer_print_min[0]}\n; MINY = {first_layer_print_min[1]}\n; MAXX = {first_layer_print_max[0]}\n; MAXY = {first_layer_print_max[1]}\nM140 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_unload_filament_time": "0",
|
||||
"manual_filament_change": "0",
|
||||
"nozzle_hrc": "0",
|
||||
|
||||
@@ -123,7 +123,7 @@
|
||||
"default_filament_profile": [
|
||||
"Creality Generic PLA @K1-all"
|
||||
],
|
||||
"machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM104 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600",
|
||||
"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]\nM204 S2000\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600",
|
||||
"machine_end_gcode": "END_PRINT",
|
||||
"scan_first_layer": "0",
|
||||
"thumbnails_format": "PNG",
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
"machine_min_travel_rate": "0,0",
|
||||
"machine_pause_gcode": "PAUSE",
|
||||
"machine_platform_motion_enable": "1",
|
||||
"machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM104 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600",
|
||||
"machine_start_gcode": "; HEADER_BLOCK_START\n; generated by Creality_Print V7.0.1.4212 on [year]-[month]-[day] at [hour]:[minute]:[second]\n; total layer number: [total_layer_count]\n; creality_uuid: <random_uuid>\n; HEADER_BLOCK_END\n; SET PRINT AREA MIN AND MAX COORDINATES TO ENABLE ADAPTIVE PROBING\n; MINX = {first_layer_print_min[0]}\n; MINY = {first_layer_print_min[1]}\n; MAXX = {first_layer_print_max[0]}\n; MAXY = {first_layer_print_max[1]}\nM140 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_unload_filament_time": "0",
|
||||
"manual_filament_change": "0",
|
||||
"nozzle_hrc": "0",
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
"machine_pause_gcode": "PAUSE",
|
||||
"machine_platform_motion_enable": "1",
|
||||
"machine_ptc_exist": "1",
|
||||
"machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM104 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600",
|
||||
"machine_start_gcode": "; HEADER_BLOCK_START\n; generated by Creality_Print V7.0.1.4212 on [year]-[month]-[day] at [hour]:[minute]:[second]\n; total layer number: [total_layer_count]\n; creality_uuid: <random_uuid>\n; HEADER_BLOCK_END\n; SET PRINT AREA MIN AND MAX COORDINATES TO ENABLE ADAPTIVE PROBING\n; MINX = {first_layer_print_min[0]}\n; MINY = {first_layer_print_min[1]}\n; MAXX = {first_layer_print_max[0]}\n; MAXY = {first_layer_print_max[1]}\nM140 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_unload_filament_time": "0",
|
||||
"manual_filament_change": "0",
|
||||
"nozzle_hrc": "0",
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
"machine_pause_gcode": "PAUSE",
|
||||
"machine_platform_motion_enable": "1",
|
||||
"machine_ptc_exist": "1",
|
||||
"machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM204 S2000\nM104 S[nozzle_temperature_initial_layer]\nG1 Z3 F600\nM83\nG92 E0\nG1 Z1 F600",
|
||||
"machine_start_gcode": "; HEADER_BLOCK_START\n; generated by Creality_Print V7.0.1.4212 on [year]-[month]-[day] at [hour]:[minute]:[second]\n; total layer number: [total_layer_count]\n; creality_uuid: <random_uuid>\n; HEADER_BLOCK_END\n; SET PRINT AREA MIN AND MAX COORDINATES TO ENABLE ADAPTIVE PROBING\n; MINX = {first_layer_print_min[0]}\n; MINY = {first_layer_print_min[1]}\n; MAXX = {first_layer_print_max[0]}\n; MAXY = {first_layer_print_max[1]}\nM140 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_unload_filament_time": "0",
|
||||
"manual_filament_change": "0",
|
||||
"nozzle_hrc": "0",
|
||||
|
||||
@@ -88,8 +88,7 @@
|
||||
"5"
|
||||
],
|
||||
"machine_pause_gcode": "PAUSE",
|
||||
"_comment": "the generated by Creality_Print start gcode removes a warning/error message when printing with Orca because it thinks its sliced with CrealityPrint ",
|
||||
"machine_start_gcode": "; HEADER_BLOCK_START\n; generated by Creality_Print V7.0.1.4212 on [year]-[month]-[day] at [hour]:[minute]:[second]\n; total layer number: [total_layer_count]\n; HEADER_BLOCK_END\n; SET PRINT AREA MIN AND MAX COORDINATES TO ENABLE ADAPTIVE PROBING\n; MINX = {first_layer_print_min[0]}\n; MINY = {first_layer_print_min[1]}\n; MAXX = {first_layer_print_max[0]}\n; MAXY = {first_layer_print_max[1]}\nM140 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_start_gcode": ";SET PRINT AREA MIN AND MAX COORDINATES TO ENABLE ADAPTIVE PROBING\n; MINX = {first_layer_print_min[0]}\n; MINY = {first_layer_print_min[1]}\n; MAXX = {first_layer_print_max[0]}\n; MAXY = {first_layer_print_max[1]}\nM140 S0\nM104 S0 \nSTART_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM104 S[nozzle_temperature_initial_layer]\nM204 S2000\nG1 Z3 F600\nM83\nG1 Y130 F12000\nG1 X0 F12000\nG1 Z0.2 F600\nG1 X0 Y130 F6000\nG1 E0.8 F300\nG1 X0 Y0 E9 F{filament_max_volumetric_speed[initial_extruder]/0.3*60}\nG1 X130 Y0 E9 F{filament_max_volumetric_speed[initial_extruder]/0.3*60}\nG92 E0\nG1 Z1 F600",
|
||||
"machine_unload_filament_time": "0",
|
||||
"manual_filament_change": "0",
|
||||
"nozzle_type": "hardened_steel",
|
||||
|
||||
@@ -86,8 +86,8 @@
|
||||
"5"
|
||||
],
|
||||
"machine_pause_gcode": "PAUSE",
|
||||
"_comment": "the generated by Creality_Print start gcode removes a warning/error message when printing with Orca because it thinks its sliced with CrealityPrint ",
|
||||
"machine_start_gcode": "; HEADER_BLOCK_START\n; generated by Creality_Print V7.0.1.4212 on [year]-[month]-[day] at [hour]:[minute]:[second]\n; total layer number: [total_layer_count]\n; HEADER_BLOCK_END\n; SET PRINT AREA MIN AND MAX COORDINATES TO ENABLE ADAPTIVE PROBING\n; MINX = {first_layer_print_min[0]}\n; MINY = {first_layer_print_min[1]}\n; MAXX = {first_layer_print_max[0]}\n; MAXY = {first_layer_print_max[1]}\nM140 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_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]\nM104 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 E0.8 F300\nG1 X0 Y0 E9 F{filament_max_volumetric_speed[initial_extruder]/0.3*60}\nG1 X150 Y0 E9 F{filament_max_volumetric_speed[initial_extruder]/0.3*60}\nG92 E0\nG1 Z1 F600",
|
||||
"machine_unload_filament_time": "0",
|
||||
"manual_filament_change": "0",
|
||||
"nozzle_type": "hardened_steel",
|
||||
"nozzle_volume": "183",
|
||||
|
||||
@@ -86,8 +86,7 @@
|
||||
"5"
|
||||
],
|
||||
"machine_pause_gcode": "PAUSE",
|
||||
"_comment": "the generated by Creality_Print start gcode removes a warning/error message when printing with Orca because it thinks its sliced with CrealityPrint ",
|
||||
"machine_start_gcode": "; HEADER_BLOCK_START\n; generated by Creality_Print V7.0.1.4212 on [year]-[month]-[day] at [hour]:[minute]:[second]\n; total layer number: [total_layer_count]\n; HEADER_BLOCK_END\n; SET PRINT AREA MIN AND MAX COORDINATES TO ENABLE ADAPTIVE PROBING\n; MINX = {first_layer_print_min[0]}\n; MINY = {first_layer_print_min[1]}\n; MAXX = {first_layer_print_max[0]}\n; MAXY = {first_layer_print_max[1]}\nM140 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_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]\nM104 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 E0.8 F300\nG1 X0 Y0 E9 F{filament_max_volumetric_speed[initial_extruder]/0.3*60}\nG1 X150 Y0 E9 F{filament_max_volumetric_speed[initial_extruder]/0.3*60}\nG92 E0\nG1 Z1 F600",
|
||||
"machine_unload_filament_time": "0",
|
||||
"manual_filament_change": "0",
|
||||
"nozzle_type": "hardened_steel",
|
||||
|
||||
@@ -86,8 +86,7 @@
|
||||
"5"
|
||||
],
|
||||
"machine_pause_gcode": "PAUSE",
|
||||
"_comment": "the generated by Creality_Print start gcode removes a warning/error message when printing with Orca because it thinks its sliced with CrealityPrint ",
|
||||
"machine_start_gcode": "; HEADER_BLOCK_START\n; generated by Creality_Print V7.0.1.4212 on [year]-[month]-[day] at [hour]:[minute]:[second]\n; total layer number: [total_layer_count]\n; HEADER_BLOCK_END\n; SET PRINT AREA MIN AND MAX COORDINATES TO ENABLE ADAPTIVE PROBING\n; MINX = {first_layer_print_min[0]}\n; MINY = {first_layer_print_min[1]}\n; MAXX = {first_layer_print_max[0]}\n; MAXY = {first_layer_print_max[1]}\nM140 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_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]\nM104 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 E0.8 F300\nG1 X0 Y0 E9 F{filament_max_volumetric_speed[initial_extruder]/0.3*60}\nG1 X150 Y0 E9 F{filament_max_volumetric_speed[initial_extruder]/0.3*60}\nG92 E0\nG1 Z1 F600",
|
||||
"machine_unload_filament_time": "0",
|
||||
"manual_filament_change": "0",
|
||||
"nozzle_type": "hardened_steel",
|
||||
|
||||
@@ -138,8 +138,7 @@
|
||||
"default_filament_profile": [
|
||||
"Creality Generic PLA @K2-all"
|
||||
],
|
||||
"_comment": "the generated by Creality_Print start gcode removes a warning/error message when printing with Orca because it thinks its sliced with CrealityPrint ",
|
||||
"machine_start_gcode": "; HEADER_BLOCK_START\n; generated by Creality_Print V7.0.1.4212 on [year]-[month]-[day] at [hour]:[minute]:[second]\n; total layer number: [total_layer_count]\n; HEADER_BLOCK_END\n; SET PRINT AREA MIN AND MAX COORDINATES TO ENABLE ADAPTIVE PROBING\n; MINX = {first_layer_print_min[0]}\n; MINY = {first_layer_print_min[1]}\n; MAXX = {first_layer_print_max[0]}\n; MAXY = {first_layer_print_max[1]}\nM140 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_start_gcode": "; HEADER_BLOCK_START\n; generated by Creality_Print V7.0.1.4212 on [year]-[month]-[day] at [hour]:[minute]:[second]\n; total layer number: [total_layer_count]\n; creality_uuid: <random_uuid>\n; HEADER_BLOCK_END\n; SET PRINT AREA MIN AND MAX COORDINATES TO ENABLE ADAPTIVE PROBING\n; MINX = {first_layer_print_min[0]}\n; MINY = {first_layer_print_min[1]}\n; MAXX = {first_layer_print_max[0]}\n; MAXY = {first_layer_print_max[1]}\nM140 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",
|
||||
"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 X0 Y245 F30000\nG1 Z{z_after_toolchange} F600",
|
||||
|
||||
@@ -138,8 +138,7 @@
|
||||
"default_filament_profile": [
|
||||
"Creality Generic PLA @K2-all"
|
||||
],
|
||||
"_comment": "the generated by Creality_Print start gcode removes a warning/error message when printing with Orca because it thinks its sliced with CrealityPrint ",
|
||||
"machine_start_gcode": "; HEADER_BLOCK_START\n; generated by Creality_Print V7.0.1.4212 on [year]-[month]-[day] at [hour]:[minute]:[second]\n; total layer number: [total_layer_count]\n; HEADER_BLOCK_END\n; SET PRINT AREA MIN AND MAX COORDINATES TO ENABLE ADAPTIVE PROBING\n; MINX = {first_layer_print_min[0]}\n; MINY = {first_layer_print_min[1]}\n; MAXX = {first_layer_print_max[0]}\n; MAXY = {first_layer_print_max[1]}\nM140 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_start_gcode": "; HEADER_BLOCK_START\n; generated by Creality_Print V7.0.1.4212 on [year]-[month]-[day] at [hour]:[minute]:[second]\n; total layer number: [total_layer_count]\n; creality_uuid: <random_uuid>\n; HEADER_BLOCK_END\n; SET PRINT AREA MIN AND MAX COORDINATES TO ENABLE ADAPTIVE PROBING\n; MINX = {first_layer_print_min[0]}\n; MINY = {first_layer_print_min[1]}\n; MAXX = {first_layer_print_max[0]}\n; MAXY = {first_layer_print_max[1]}\nM140 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",
|
||||
"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 X0 Y245 F30000\nG1 Z{z_after_toolchange} F600",
|
||||
|
||||
@@ -138,8 +138,7 @@
|
||||
"default_filament_profile": [
|
||||
"Creality Generic PLA @K2-all"
|
||||
],
|
||||
"_comment": "the generated by Creality_Print start gcode removes a warning/error message when printing with Orca because it thinks its sliced with CrealityPrint ",
|
||||
"machine_start_gcode": "; HEADER_BLOCK_START\n; generated by Creality_Print V7.0.1.4212 on [year]-[month]-[day] at [hour]:[minute]:[second]\n; total layer number: [total_layer_count]\n; HEADER_BLOCK_END\n; SET PRINT AREA MIN AND MAX COORDINATES TO ENABLE ADAPTIVE PROBING\n; MINX = {first_layer_print_min[0]}\n; MINY = {first_layer_print_min[1]}\n; MAXX = {first_layer_print_max[0]}\n; MAXY = {first_layer_print_max[1]}\nM140 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_start_gcode": "; HEADER_BLOCK_START\n; generated by Creality_Print V7.0.1.4212 on [year]-[month]-[day] at [hour]:[minute]:[second]\n; total layer number: [total_layer_count]\n; creality_uuid: <random_uuid>\n; HEADER_BLOCK_END\n; SET PRINT AREA MIN AND MAX COORDINATES TO ENABLE ADAPTIVE PROBING\n; MINX = {first_layer_print_min[0]}\n; MINY = {first_layer_print_min[1]}\n; MAXX = {first_layer_print_max[0]}\n; MAXY = {first_layer_print_max[1]}\nM140 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",
|
||||
"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 X0 Y245 F30000\nG1 Z{z_after_toolchange} F600",
|
||||
|
||||
@@ -138,8 +138,7 @@
|
||||
"default_filament_profile": [
|
||||
"Creality Generic PLA @K2-all"
|
||||
],
|
||||
"_comment": "the generated by Creality_Print start gcode removes a warning/error message when printing with Orca because it thinks its sliced with CrealityPrint ",
|
||||
"machine_start_gcode": "; HEADER_BLOCK_START\n; generated by Creality_Print V7.0.1.4212 on [year]-[month]-[day] at [hour]:[minute]:[second]\n; total layer number: [total_layer_count]\n; HEADER_BLOCK_END\n; SET PRINT AREA MIN AND MAX COORDINATES TO ENABLE ADAPTIVE PROBING\n; MINX = {first_layer_print_min[0]}\n; MINY = {first_layer_print_min[1]}\n; MAXX = {first_layer_print_max[0]}\n; MAXY = {first_layer_print_max[1]}\nM140 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_start_gcode": "; HEADER_BLOCK_START\n; generated by Creality_Print V7.0.1.4212 on [year]-[month]-[day] at [hour]:[minute]:[second]\n; total layer number: [total_layer_count]\n; creality_uuid: <random_uuid>\n; HEADER_BLOCK_END\n; SET PRINT AREA MIN AND MAX COORDINATES TO ENABLE ADAPTIVE PROBING\n; MINX = {first_layer_print_min[0]}\n; MINY = {first_layer_print_min[1]}\n; MAXX = {first_layer_print_max[0]}\n; MAXY = {first_layer_print_max[1]}\nM140 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",
|
||||
"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 X0 Y245 F30000\nG1 Z{z_after_toolchange} F600",
|
||||
|
||||
@@ -138,8 +138,8 @@
|
||||
"default_filament_profile": [
|
||||
"Creality Generic PLA @K2-all"
|
||||
],
|
||||
"_comment": "the generated by Creality_Print start gcode removes a warning/error message when printing with Orca because it thinks its sliced with CrealityPrint ",
|
||||
"machine_start_gcode": "; HEADER_BLOCK_START\n; generated by Creality_Print V7.0.1.4212 on [year]-[month]-[day] at [hour]:[minute]:[second]\n; total layer number: [total_layer_count]\n; HEADER_BLOCK_END\n; SET PRINT AREA MIN AND MAX COORDINATES TO ENABLE ADAPTIVE PROBING\n; MINX = {first_layer_print_min[0]}\n; MINY = {first_layer_print_min[1]}\n; MAXX = {first_layer_print_max[0]}\n; MAXY = {first_layer_print_max[1]}\nM140 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_start_gcode": ";SET PRINT AREA MIN AND MAX COORDINATES TO ENABLE ADAPTIVE PROBING\n; MINX = {first_layer_print_min[0]}\n; MINY = {first_layer_print_min[1]}\n; MAXX = {first_layer_print_max[0]}\n; MAXY = {first_layer_print_max[1]}\n\nM140 S0\nM104 S0 \nSTART_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]\nT[initial_no_support_extruder]\nM104 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 E0.8 F300\nG1 X0 Y0 E9 F{filament_max_volumetric_speed[initial_extruder]/0.3*60}\nG1 X150 Y0 E9 F{filament_max_volumetric_speed[initial_extruder]/0.3*60}\nG92 E0\nG1 Z1 F600",
|
||||
"machine_end_gcode": "END_PRINT",
|
||||
"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 X0 Y245 F30000\nG1 Z{z_after_toolchange} F600",
|
||||
"before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\nG92 E0\n",
|
||||
|
||||
@@ -136,8 +136,7 @@
|
||||
"default_filament_profile": [
|
||||
"Creality Generic PLA @K2-all"
|
||||
],
|
||||
"_comment": "the generated by Creality_Print start gcode removes a warning/error message when printing with Orca because it thinks its sliced with CrealityPrint ",
|
||||
"machine_start_gcode": "; HEADER_BLOCK_START\n; generated by Creality_Print V7.0.1.4212 on [year]-[month]-[day] at [hour]:[minute]:[second]\n; total layer number: [total_layer_count]\n; HEADER_BLOCK_END\n; SET PRINT AREA MIN AND MAX COORDINATES TO ENABLE ADAPTIVE PROBING\n; MINX = {first_layer_print_min[0]}\n; MINY = {first_layer_print_min[1]}\n; MAXX = {first_layer_print_max[0]}\n; MAXY = {first_layer_print_max[1]}\nM140 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_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]\nM104 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 E0.8 F300\nG1 X0 Y0 E9 F{filament_max_volumetric_speed[initial_extruder]/0.3*60}\nG1 X150 Y0 E9 F{filament_max_volumetric_speed[initial_extruder]/0.3*60}\nG92 E0\nG1 Z1 F600",
|
||||
"machine_end_gcode": "{if print_sequence == \"by object\"}\nG91\nG1 X2 Y2 Z1 F24000\nG90\nG1 Z{max_layer_z+2} F600\n{endif}\nEND_PRINT",
|
||||
"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\n{if print_sequence == \"by object\"}\nG0 Z{max_layer_z + 0.8} F900\n{endif}\nG1 X0 Y160 F30000\nG1 Z{z_after_toolchange} F600",
|
||||
|
||||
@@ -136,8 +136,7 @@
|
||||
"default_filament_profile": [
|
||||
"Creality Generic PLA @K2-all"
|
||||
],
|
||||
"_comment": "the generated by Creality_Print start gcode removes a warning/error message when printing with Orca because it thinks its sliced with CrealityPrint ",
|
||||
"machine_start_gcode": "; HEADER_BLOCK_START\n; generated by Creality_Print V7.0.1.4212 on [year]-[month]-[day] at [hour]:[minute]:[second]\n; total layer number: [total_layer_count]\n; HEADER_BLOCK_END\n; SET PRINT AREA MIN AND MAX COORDINATES TO ENABLE ADAPTIVE PROBING\n; MINX = {first_layer_print_min[0]}\n; MINY = {first_layer_print_min[1]}\n; MAXX = {first_layer_print_max[0]}\n; MAXY = {first_layer_print_max[1]}\nM140 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_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]\nM104 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 E0.8 F300\nG1 X0 Y0 E9 F{filament_max_volumetric_speed[initial_extruder]/0.3*60}\nG1 X150 Y0 E9 F{filament_max_volumetric_speed[initial_extruder]/0.3*60}\nG92 E0\nG1 Z1 F600",
|
||||
"machine_end_gcode": "{if print_sequence == \"by object\"}\nG91\nG1 X2 Y2 Z1 F24000\nG90\nG1 Z{max_layer_z+2} F600\n{endif}\nEND_PRINT",
|
||||
"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\n{if print_sequence == \"by object\"}\nG0 Z{max_layer_z + 0.8} F900\n{endif}\nG1 X0 Y160 F30000\nG1 Z{z_after_toolchange} F600",
|
||||
|
||||
@@ -136,8 +136,7 @@
|
||||
"default_filament_profile": [
|
||||
"Creality Generic PLA @K2-all"
|
||||
],
|
||||
"_comment": "the generated by Creality_Print start gcode removes a warning/error message when printing with Orca because it thinks its sliced with CrealityPrint ",
|
||||
"machine_start_gcode": "; HEADER_BLOCK_START\n; generated by Creality_Print V7.0.1.4212 on [year]-[month]-[day] at [hour]:[minute]:[second]\n; total layer number: [total_layer_count]\n; HEADER_BLOCK_END\n; SET PRINT AREA MIN AND MAX COORDINATES TO ENABLE ADAPTIVE PROBING\n; MINX = {first_layer_print_min[0]}\n; MINY = {first_layer_print_min[1]}\n; MAXX = {first_layer_print_max[0]}\n; MAXY = {first_layer_print_max[1]}\nM140 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_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]\nM104 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 E0.8 F300\nG1 X0 Y0 E9 F{filament_max_volumetric_speed[initial_extruder]/0.3*60}\nG1 X150 Y0 E9 F{filament_max_volumetric_speed[initial_extruder]/0.3*60}\nG92 E0\nG1 Z1 F600",
|
||||
"machine_end_gcode": "{if print_sequence == \"by object\"}\nG91\nG1 X2 Y2 Z1 F24000\nG90\nG1 Z{max_layer_z+2} F600\n{endif}\nEND_PRINT",
|
||||
"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\n{if print_sequence == \"by object\"}\nG0 Z{max_layer_z + 0.8} F900\n{endif}\nG1 X0 Y160 F30000\nG1 Z{z_after_toolchange} F600",
|
||||
|
||||
@@ -53,8 +53,7 @@
|
||||
"machine_min_travel_rate": "0,0",
|
||||
"machine_pause_gcode": "PAUSE",
|
||||
"machine_platform_motion_enable": "1",
|
||||
"_comment": "the generated by Creality_Print start gcode removes a warning/error message when printing with Orca because it thinks its sliced with CrealityPrint ",
|
||||
"machine_start_gcode": "; HEADER_BLOCK_START\n; generated by Creality_Print V7.0.1.4212 on [year]-[month]-[day] at [hour]:[minute]:[second]\n; total layer number: [total_layer_count]\n; HEADER_BLOCK_END\n; SET PRINT AREA MIN AND MAX COORDINATES TO ENABLE ADAPTIVE PROBING\n; MINX = {first_layer_print_min[0]}\n; MINY = {first_layer_print_min[1]}\n; MAXX = {first_layer_print_max[0]}\n; MAXY = {first_layer_print_max[1]}\nM140 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_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]\nM104 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 E0.8 F300\nG1 X0 Y0 E9 F{filament_max_volumetric_speed[initial_extruder]/0.3*60}\nG1 X150 Y0 E9 F{filament_max_volumetric_speed[initial_extruder]/0.3*60}\nG92 E0\nG1 Z1 F600",
|
||||
"machine_unload_filament_time": "0",
|
||||
"manual_filament_change": "0",
|
||||
"nozzle_hrc": "0",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Elegoo",
|
||||
"version": "02.04.00.04",
|
||||
"version": "02.04.00.02",
|
||||
"force_update": "0",
|
||||
"description": "Elegoo configurations",
|
||||
"machine_model_list": [
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
"change_filament_gcode": "",
|
||||
"machine_pause_gcode": "M600",
|
||||
"support_multi_filament": "0",
|
||||
"layer_change_gcode": "SET_PRINT_STATS_INFO TOTAL_LAYER=[total_layer_count] CURRENT_LAYER={layer_num+1}",
|
||||
"machine_start_gcode": ";;===== date: 20251011 =====================\n;printer_model:[printer_model]\n;initial_filament:{filament_type[initial_extruder]}\n;curr_bed_type:{curr_bed_type}\n;bed_level_temp:[bed_temperature_initial_layer_single]\nM400 ; wait for buffer to clear\nM220 S100 ;Set the feed speed to 100%\nM221 S100 ;Set the flow rate to 100%\nM104 S140\nM140 S[bed_temperature_initial_layer_single]\nG90\nG28 ;home\nM729 ;Clean Nozzle\nM190 S[bed_temperature_initial_layer_single]\n\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {elsif (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {endif};Prevent PLA from jamming\n{endif}\n\n;enable_pressure_advance:{enable_pressure_advance[initial_extruder]}\n;This value is called if pressure advance is enabled\n{if enable_pressure_advance[initial_extruder] == \"true\"}\nSET_PRESSURE_ADVANCE ADVANCE=[pressure_advance] ;\nM400\n{endif}\nM204 S{min(20000,max(1000,outer_wall_acceleration))} ;Call exterior wall print acceleration\n\n\nG1 X{print_bed_max[0]*0.5} Y-1.2 F20000\nG1 Z0.3 F900\nM109 S[nozzle_temperature_initial_layer]\nM83\nG92 E0 ;Reset Extruder\nG1 F{min(6000, max(900, filament_max_volumetric_speed[initial_no_support_extruder]/0.5/0.3*60))} \nG1 X-1.2 E10.156 ;Draw the first line\nG1 Y98.8 E7.934\nG1 X-0.5 Y100 E0.1\nG1 Y-0.3 E7.934\nG1 X{print_bed_max[0]*0.5-50} E6.284\nG1 F{0.2*min(12000, max(1200, filament_max_volumetric_speed[initial_no_support_extruder]/0.5/0.3*60))} \nG1 X{print_bed_max[0]*0.5-30} E2\nG1 F{min(12000, max(1200, filament_max_volumetric_speed[initial_no_support_extruder]/0.5/0.3*60))} \nG1 X{print_bed_max[0]*0.5-10} E2\nG1 F{0.2*min(12000, max(1200, filament_max_volumetric_speed[initial_no_support_extruder]/0.5/0.3*60))} \nG1 X{print_bed_max[0]*0.5+10} E2\nG1 F{min(12000, max(1200, filament_max_volumetric_speed[initial_no_support_extruder]/0.5/0.3*60))} \nG1 X{print_bed_max[0]*0.5+30} E2\nG1 F{min(12000, max(1200, filament_max_volumetric_speed[initial_no_support_extruder]/0.5/0.3*60))} \nG1 X{print_bed_max[0]*0.5+50} E2\n;End PA test.\n\n\nG3 I-1 J0 Z0.6 F1200.0 ;Move to side a little\nG1 F20000\nG92 E0 ;Reset Extruder\nSET_PRINT_STATS_INFO TOTAL_LAYER=[total_layer_count] CURRENT_LAYER=0\n;LAYER_COUNT:[total_layer_count]\n;LAYER:0",
|
||||
"layer_change_gcode": "SET_PRINT_STATS_INFO CURRENT_LAYER={layer_num + 1}",
|
||||
"machine_start_gcode": ";;===== date: 20251011 =====================\n;printer_model:[printer_model]\n;initial_filament:{filament_type[initial_extruder]}\n;curr_bed_type:{curr_bed_type}\n;bed_level_temp:[bed_temperature_initial_layer_single]\nM400 ; wait for buffer to clear\nM220 S100 ;Set the feed speed to 100%\nM221 S100 ;Set the flow rate to 100%\nM104 S140\nM140 S[bed_temperature_initial_layer_single]\nG90\nG28 ;home\nM729 ;Clean Nozzle\nM190 S[bed_temperature_initial_layer_single]\n\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {elsif (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {endif};Prevent PLA from jamming\n{endif}\n\n;enable_pressure_advance:{enable_pressure_advance[initial_extruder]}\n;This value is called if pressure advance is enabled\n{if enable_pressure_advance[initial_extruder] == \"true\"}\nSET_PRESSURE_ADVANCE ADVANCE=[pressure_advance] ;\nM400\n{endif}\nM204 S{min(20000,max(1000,outer_wall_acceleration))} ;Call exterior wall print acceleration\n\n\nG1 X{print_bed_max[0]*0.5} Y-1.2 F20000\nG1 Z0.3 F900\nM109 S[nozzle_temperature_initial_layer]\nM83\nG92 E0 ;Reset Extruder\nG1 F{min(6000, max(900, filament_max_volumetric_speed[initial_no_support_extruder]/0.5/0.3*60))} \nG1 X-1.2 E10.156 ;Draw the first line\nG1 Y98.8 E7.934\nG1 X-0.5 Y100 E0.1\nG1 Y-0.3 E7.934\nG1 X{print_bed_max[0]*0.5-50} E6.284\nG1 F{0.2*min(12000, max(1200, filament_max_volumetric_speed[initial_no_support_extruder]/0.5/0.3*60))} \nG1 X{print_bed_max[0]*0.5-30} E2\nG1 F{min(12000, max(1200, filament_max_volumetric_speed[initial_no_support_extruder]/0.5/0.3*60))} \nG1 X{print_bed_max[0]*0.5-10} E2\nG1 F{0.2*min(12000, max(1200, filament_max_volumetric_speed[initial_no_support_extruder]/0.5/0.3*60))} \nG1 X{print_bed_max[0]*0.5+10} E2\nG1 F{min(12000, max(1200, filament_max_volumetric_speed[initial_no_support_extruder]/0.5/0.3*60))} \nG1 X{print_bed_max[0]*0.5+30} E2\nG1 F{min(12000, max(1200, filament_max_volumetric_speed[initial_no_support_extruder]/0.5/0.3*60))} \nG1 X{print_bed_max[0]*0.5+50} E2\n;End PA test.\n\n\nG3 I-1 J0 Z0.6 F1200.0 ;Move to side a little\nG1 F20000\nG92 E0 ;Reset Extruder\nSET_PRINT_STATS_INFO TOTAL_LAYER=[total_layer_count]\n;LAYER_COUNT:[total_layer_count]\n;LAYER:0",
|
||||
"machine_end_gcode": ";===== date: 20250603 =====================\nM400 ; wait for buffer to clear\nM140 S0 ;Turn-off bed\nM106 S255 ;Cooling nozzle\nM83\nG92 E0 ; zero the extruder\nG1 E-0.8 F1800\nG2 I1 J0 Z{max_layer_z+0.5} F3000 ; lower z a little\nG90\n{if max_layer_z > 100}G1 Z{min(max_layer_z+50, printable_height+0.5)} F20000{else}G1 Z100 F20000 {endif}; Move print head up \nM204 S5000\nM400\nM83\nG1 X202 F20000\nM400\nG1 Y250 F20000\nG1 Y264.5 F1200\nM400\nG92 E0\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off remote part cooling fan\nM106 P3 S0 ; turn off chamber cooling fan\nM84 ;Disable all steppers"
|
||||
}
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
"change_filament_gcode": "\n;==========CC_CHANGE_FILAMENT_GCODE_CCB==========\n;===== date: 2025-12-04-001 =====================\nM106 S0\nM106 P2 S0\nG1 Z{min(max_layer_z+3, printable_height+0.5)} F1200\nM6211 T[next_extruder] L[flush_length] M{old_filament_e_feedrate} N{new_filament_e_feedrate} Q[old_filament_temp] R[nozzle_temperature_range_high] S[new_filament_temp]\nT[next_extruder]\n;==========CC_CHANGE_FILAMENT_GCODE_CCE==========",
|
||||
"machine_pause_gcode": "M600",
|
||||
"support_multi_filament": "1",
|
||||
"layer_change_gcode": "SET_PRINT_STATS_INFO TOTAL_LAYER=[total_layer_count] CURRENT_LAYER={layer_num+1}",
|
||||
"machine_start_gcode": ";===== CC_START_GCODE ================\n;===== date: 2026-04-28-001 =====================\n;printer_model:[printer_model]\n;initial_filament:{filament_type[initial_extruder]}\n;curr_bed_type:{curr_bed_type}\n;bed_level_temp:[bed_temperature_initial_layer_single]\nM400 ; wait for buffer to clear\nM220 S100 ;Set the feed speed to 100%\nM221 S100 ;Set the flow rate to 100%\nM104 S140\nM140 S[bed_temperature_initial_layer_single]\nG90\nM83\nG28 ;home\nM729 ;Clean Nozzle\nM190 S[bed_temperature_initial_layer_single]\n\nM109 S[nozzle_temperature_initial_layer]\nM6211 A1 L200 T[initial_no_support_extruder] Q[nozzle_temperature_initial_layer] R[nozzle_temperature_initial_layer] S[nozzle_temperature_initial_layer]\nT[initial_no_support_extruder]\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {elsif (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {endif};Prevent PLA from jamming\n{endif}\n\n;enable_pressure_advance:{enable_pressure_advance[initial_extruder]}\n;This value is called if pressure advance is enabled\n{if enable_pressure_advance[initial_extruder] == \"true\"}\nSET_PRESSURE_ADVANCE ADVANCE=[pressure_advance] ;\nM400\n{endif}\nM204 S{min(20000,max(1000,outer_wall_acceleration))} ;Call exterior wall print acceleration\n\n\nG1 X{print_bed_max[0]*0.5} Y-1.2 F20000\nG1 Z0.3 F900\n\n\nG90\nM83\nG92 E0 ;Reset Extruder\nG1 F{min(6000, max(900, filament_max_volumetric_speed[initial_no_support_extruder]/0.5/0.3*60))} \nG1 X0 E10.156 ;Draw the first line\nG1 Y98.8 E7.934\nG1 X0.9 Y100 E0.1\nG1 Y-0.3 E7.934\nG1 X{print_bed_max[0]*0.5-50} E6.284\nG1 F{0.2*min(12000, max(1200, filament_max_volumetric_speed[initial_no_support_extruder]/0.5/0.3*60))} \nG1 X{print_bed_max[0]*0.5-30} E2\nG1 F{min(12000, max(1200, filament_max_volumetric_speed[initial_no_support_extruder]/0.5/0.3*60))} \nG1 X{print_bed_max[0]*0.5-10} E2\nG1 F{0.2*min(12000, max(1200, filament_max_volumetric_speed[initial_no_support_extruder]/0.5/0.3*60))} \nG1 X{print_bed_max[0]*0.5+10} E2\nG1 F{min(12000, max(1200, filament_max_volumetric_speed[initial_no_support_extruder]/0.5/0.3*60))} \nG1 X{print_bed_max[0]*0.5+30} E2\nG1 F{min(12000, max(1200, filament_max_volumetric_speed[initial_no_support_extruder]/0.5/0.3*60))} \nG1 X{print_bed_max[0]*0.5+50} E2\n;End PA test.\n\n\nG3 I-1 J0 Z0.6 F1200.0 ;Move to side a little\nG1 F20000\nG92 E0 ;Reset Extruder\nSET_PRINT_STATS_INFO TOTAL_LAYER=[total_layer_count] CURRENT_LAYER=0\n;LAYER_COUNT:[total_layer_count]\n;LAYER:0",
|
||||
"layer_change_gcode": "SET_PRINT_STATS_INFO CURRENT_LAYER={layer_num + 1}",
|
||||
"machine_start_gcode": ";===== CC_START_GCODE ================\n;===== date: 2026-04-28-001 =====================\n;printer_model:[printer_model]\n;initial_filament:{filament_type[initial_extruder]}\n;curr_bed_type:{curr_bed_type}\n;bed_level_temp:[bed_temperature_initial_layer_single]\nM400 ; wait for buffer to clear\nM220 S100 ;Set the feed speed to 100%\nM221 S100 ;Set the flow rate to 100%\nM104 S140\nM140 S[bed_temperature_initial_layer_single]\nG90\nM83\nG28 ;home\nM729 ;Clean Nozzle\nM190 S[bed_temperature_initial_layer_single]\n\nM109 S[nozzle_temperature_initial_layer]\nM6211 A1 L200 T[initial_no_support_extruder] Q[nozzle_temperature_initial_layer] R[nozzle_temperature_initial_layer] S[nozzle_temperature_initial_layer]\nT[initial_no_support_extruder]\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {elsif (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {endif};Prevent PLA from jamming\n{endif}\n\n;enable_pressure_advance:{enable_pressure_advance[initial_extruder]}\n;This value is called if pressure advance is enabled\n{if enable_pressure_advance[initial_extruder] == \"true\"}\nSET_PRESSURE_ADVANCE ADVANCE=[pressure_advance] ;\nM400\n{endif}\nM204 S{min(20000,max(1000,outer_wall_acceleration))} ;Call exterior wall print acceleration\n\n\nG1 X{print_bed_max[0]*0.5} Y-1.2 F20000\nG1 Z0.3 F900\n\n\nG90\nM83\nG92 E0 ;Reset Extruder\nG1 F{min(6000, max(900, filament_max_volumetric_speed[initial_no_support_extruder]/0.5/0.3*60))} \nG1 X0 E10.156 ;Draw the first line\nG1 Y98.8 E7.934\nG1 X0.9 Y100 E0.1\nG1 Y-0.3 E7.934\nG1 X{print_bed_max[0]*0.5-50} E6.284\nG1 F{0.2*min(12000, max(1200, filament_max_volumetric_speed[initial_no_support_extruder]/0.5/0.3*60))} \nG1 X{print_bed_max[0]*0.5-30} E2\nG1 F{min(12000, max(1200, filament_max_volumetric_speed[initial_no_support_extruder]/0.5/0.3*60))} \nG1 X{print_bed_max[0]*0.5-10} E2\nG1 F{0.2*min(12000, max(1200, filament_max_volumetric_speed[initial_no_support_extruder]/0.5/0.3*60))} \nG1 X{print_bed_max[0]*0.5+10} E2\nG1 F{min(12000, max(1200, filament_max_volumetric_speed[initial_no_support_extruder]/0.5/0.3*60))} \nG1 X{print_bed_max[0]*0.5+30} E2\nG1 F{min(12000, max(1200, filament_max_volumetric_speed[initial_no_support_extruder]/0.5/0.3*60))} \nG1 X{print_bed_max[0]*0.5+50} E2\n;End PA test.\n\n\nG3 I-1 J0 Z0.6 F1200.0 ;Move to side a little\nG1 F20000\nG92 E0 ;Reset Extruder\nSET_PRINT_STATS_INFO TOTAL_LAYER=[total_layer_count]\n;LAYER_COUNT:[total_layer_count]\n;LAYER:0",
|
||||
"machine_end_gcode": ";===== CC_END_GCODE ================\n;===== date: 2025-12-04-001 =====================\nM400 ; wait for buffer to clear\nM140 S0 ;Turn-off bed\nM106 S255 ;Cooling nozzle\nM83\nG92 E0 ; zero the extruder\nG1 E-0.8 F1800\nG2 I1 J0 Z{max_layer_z+0.5} F3000 ; lower z a little\nG90\n{if max_layer_z > 100}G1 Z{min(max_layer_z+50, printable_height+0.5)} F20000{else}G1 Z100 F20000 {endif}; Move print head up \nM204 S5000\nM749\nM204 S5000\nM400\nM83\nG1 X202 F20000\nM400\nG1 Y250 F20000\nG1 Y264.5 F1200\nM400\nG92 E0\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off remote part cooling fan\nM106 P3 S0 ; turn off chamber cooling fan\nM84 ;Disable all steppers"
|
||||
}
|
||||
|
||||
@@ -86,9 +86,9 @@
|
||||
"9"
|
||||
],
|
||||
"change_filament_gcode": "\n;==========CC2_CHANGE_FILAMENT_GCODE==========\n;===== date: 2026-01-16-001 =====================\nM106 S0\nM106 P2 S0\nG1 Z{min(max_layer_z+3, printable_height+0.5)} F1200\nM6211 T[next_extruder] L[flush_length] M{old_filament_e_feedrate} N{new_filament_e_feedrate} Q[old_filament_temp] R[nozzle_temperature_range_high] S[new_filament_temp]\nT[next_extruder]\n",
|
||||
"layer_change_gcode": "M73 L{layer_num+1}\n;LAYER:{layer_num+1}\nSET_PRINT_STATS_INFO TOTAL_LAYER=[total_layer_count] CURRENT_LAYER={layer_num+1}",
|
||||
"layer_change_gcode": "M73 L{layer_num+1}\n;LAYER:{layer_num+1}\nSET_PRINT_STATS_INFO CURRENT_LAYER={layer_num + 1}",
|
||||
"machine_end_gcode": ";===== CC2_END_GCODE ================\n;===== date: 2026-01-16-001 =====================\n\n\nM140 S0 ;Turn-off bed\nM83\nG92 E0 ; zero the extruder\nG1 E-1.5 F1800\nG2 I0 J1 Z{max_layer_z+0.5} F3000 ; lower z a little\nM106 S0\nM106 P2 S0\nG90\n{if max_layer_z > 75}G1 Z{min(max_layer_z+5, printable_height+0.5)} F20000{else}G1 Z80 F20000 {endif}; Move print head up \nG180 S9\nM104 S0\nM84\n",
|
||||
"machine_start_gcode": ";===== CC2_START_GCODE ================\n;===== date: 2026-01-16-001 =====================\n\nG90\nM104 S140\nM140 S[bed_temperature_initial_layer_single]\nM190 S[bed_temperature_initial_layer_single] A\nM106 S0\nBED_MESH_CALIBRATE mesh_min={adaptive_bed_mesh_min[0]},{adaptive_bed_mesh_min[1]} mesh_max={adaptive_bed_mesh_max[0]},{adaptive_bed_mesh_max[1]} ALGORITHM=[bed_mesh_algo] PROBE_COUNT={bed_mesh_probe_count[0]},{bed_mesh_probe_count[1]} ADAPTIVE=0 ADAPTIVE_MARGIN=0 FROM_SLICER=1\nM204 S{min(20000,max(1000,outer_wall_acceleration))} ;Call exterior wall print acceleration\nG28\nM109 S[nozzle_temperature_initial_layer]\nM6211 A1 L200 T[initial_no_support_extruder] Q[nozzle_temperature_initial_layer] R[nozzle_temperature_initial_layer] S[nozzle_temperature_initial_layer]\nT[initial_no_support_extruder]\n\n{if first_layer_print_min[1] > 0.5}\nG180 S7\nG1 X{print_bed_max[0]*0.5-1} Y-1.2 F20000\nG1 Z0.5 F900\nM109 S[nozzle_temperature_initial_layer]\nM83\nG92 E0 ;Reset Extruder\nG1 E6 F{min(1200, max(120, filament_max_volumetric_speed[initial_no_support_extruder]*60/2/2.5043))} \nM106 S200\nG1 X{print_bed_max[0]*0.5-41} E20 F{min(12000, max(1200, filament_max_volumetric_speed[initial_no_support_extruder]*60/2/2.5043))} \nG1 F6000\nG1 X{print_bed_max[0]*0.5-46} E0.8\n{else}\nG1 E30 F{min(1200, max(120, filament_max_volumetric_speed[initial_no_support_extruder]*60/2/2.5043))}\n{endif}\nM106 S0\nG180 S8\nG1 F20000\nG92 E0 ;Reset Extruder\nSET_PRINT_STATS_INFO TOTAL_LAYER=[total_layer_count] CURRENT_LAYER=0\n;LAYER_COUNT:[total_layer_count]\n;LAYER:0",
|
||||
"machine_start_gcode": ";===== CC2_START_GCODE ================\n;===== date: 2026-01-16-001 =====================\n\nG90\nM104 S140\nM140 S[bed_temperature_initial_layer_single]\nM190 S[bed_temperature_initial_layer_single] A\nM106 S0\nBED_MESH_CALIBRATE mesh_min={adaptive_bed_mesh_min[0]},{adaptive_bed_mesh_min[1]} mesh_max={adaptive_bed_mesh_max[0]},{adaptive_bed_mesh_max[1]} ALGORITHM=[bed_mesh_algo] PROBE_COUNT={bed_mesh_probe_count[0]},{bed_mesh_probe_count[1]} ADAPTIVE=0 ADAPTIVE_MARGIN=0 FROM_SLICER=1\nM204 S{min(20000,max(1000,outer_wall_acceleration))} ;Call exterior wall print acceleration\nG28\nM109 S[nozzle_temperature_initial_layer]\nM6211 A1 L200 T[initial_no_support_extruder] Q[nozzle_temperature_initial_layer] R[nozzle_temperature_initial_layer] S[nozzle_temperature_initial_layer]\nT[initial_no_support_extruder]\n\n{if first_layer_print_min[1] > 0.5}\nG180 S7\nG1 X{print_bed_max[0]*0.5-1} Y-1.2 F20000\nG1 Z0.5 F900\nM109 S[nozzle_temperature_initial_layer]\nM83\nG92 E0 ;Reset Extruder\nG1 E6 F{min(1200, max(120, filament_max_volumetric_speed[initial_no_support_extruder]*60/2/2.5043))} \nM106 S200\nG1 X{print_bed_max[0]*0.5-41} E20 F{min(12000, max(1200, filament_max_volumetric_speed[initial_no_support_extruder]*60/2/2.5043))} \nG1 F6000\nG1 X{print_bed_max[0]*0.5-46} E0.8\n{else}\nG1 E30 F{min(1200, max(120, filament_max_volumetric_speed[initial_no_support_extruder]*60/2/2.5043))}\n{endif}\nM106 S0\nG180 S8\nG1 F20000\nG92 E0 ;Reset Extruder\nSET_PRINT_STATS_INFO TOTAL_LAYER=[total_layer_count]\n;LAYER_COUNT:[total_layer_count]\n;LAYER:0",
|
||||
"retract_restart_extra_toolchange": [
|
||||
"0.5"
|
||||
]
|
||||
|
||||
@@ -2,6 +2,5 @@
|
||||
"inherits": "0.20mm Standard @Elegoo Giga 0.4 nozzle",
|
||||
"layer_height": "0.16",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "0.16mm Optimal @EOS Giga 0.4 nozzle",
|
||||
"name": "0.16mm Optimal @Elegoo Giga 0.4 nozzle"
|
||||
}
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
"inherits": "0.30mm Standard @Elegoo Giga 0.6 nozzle",
|
||||
"layer_height": "0.18",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "0.18mm Fine @EOS Giga 0.6 nozzle",
|
||||
"name": "0.18mm Fine @Elegoo Giga 0.6 nozzle",
|
||||
"compatible_printers": [
|
||||
"Elegoo OrangeStorm Giga 0.6 nozzle"
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
"from": "system",
|
||||
"setting_id": "PEOSG04020",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "0.20mm Standard @EOS Giga 0.4 nozzle",
|
||||
"default_acceleration": "3000",
|
||||
"filename_format": "EOGiga1_{nozzle_diameter[0]}_{input_filename_base}_{filament_name}_{layer_height}_{print_time}.gcode",
|
||||
"initial_layer_print_height": "0.25",
|
||||
|
||||
@@ -4,6 +4,5 @@
|
||||
"wall_sequence": "inner-outer-inner wall",
|
||||
"reduce_crossing_wall": "1",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "0.20mm Strength @EOS Giga 0.4 nozzle",
|
||||
"wall_loops": "6"
|
||||
}
|
||||
|
||||
@@ -2,6 +2,5 @@
|
||||
"inherits": "0.20mm Standard @Elegoo Giga 0.4 nozzle",
|
||||
"layer_height": "0.24",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "0.24mm Draft @EOS Giga 0.4 nozzle",
|
||||
"name": "0.24mm Draft @Elegoo Giga 0.4 nozzle"
|
||||
}
|
||||
|
||||
@@ -2,6 +2,5 @@
|
||||
"inherits": "0.40mm Standard @Elegoo Giga 0.8 nozzle",
|
||||
"layer_height": "0.24",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "0.24mm Fine @EOS Giga 0.8 nozzle",
|
||||
"name": "0.24mm Fine @Elegoo Giga 0.8 nozzle"
|
||||
}
|
||||
|
||||
@@ -2,6 +2,5 @@
|
||||
"inherits": "0.30mm Standard @Elegoo Giga 0.6 nozzle",
|
||||
"layer_height": "0.24",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "0.24mm Optimal @EOS Giga 0.6 nozzle",
|
||||
"name": "0.24mm Optimal @Elegoo Giga 0.6 nozzle"
|
||||
}
|
||||
|
||||
@@ -2,6 +2,5 @@
|
||||
"inherits": "0.20mm Standard @Elegoo Giga 0.4 nozzle",
|
||||
"layer_height": "0.28",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "0.28mm Extra Draft @EOS Giga 0.4 nozzle",
|
||||
"name": "0.28mm Extra Draft @Elegoo Giga 0.4 nozzle"
|
||||
}
|
||||
|
||||
@@ -2,6 +2,5 @@
|
||||
"inherits": "0.50mm Standard @Elegoo Giga 1.0 nozzle",
|
||||
"layer_height": "0.3",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "0.30mm Fine @EOS Giga 1.0 nozzle",
|
||||
"name": "0.30mm Fine @Elegoo Giga 1.0 nozzle"
|
||||
}
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
"from": "system",
|
||||
"setting_id": "PEOSG06030",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "0.30mm Standard @EOS Giga 0.6 nozzle",
|
||||
"default_acceleration": "3000",
|
||||
"filename_format": "EOGiga1_{nozzle_diameter[0]}_{input_filename_base}_{filament_name}_{layer_height}_{print_time}.gcode",
|
||||
"initial_layer_acceleration": "1000",
|
||||
|
||||
@@ -4,6 +4,5 @@
|
||||
"wall_sequence": "inner-outer-inner wall",
|
||||
"reduce_crossing_wall": "1",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "0.30mm Strength @EOS Giga 0.6 nozzle",
|
||||
"wall_loops": "5"
|
||||
}
|
||||
|
||||
@@ -2,6 +2,5 @@
|
||||
"inherits": "0.40mm Standard @Elegoo Giga 0.8 nozzle",
|
||||
"layer_height": "0.32",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "0.32mm Optimal @EOS Giga 0.8 nozzle",
|
||||
"name": "0.32mm Optimal @Elegoo Giga 0.8 nozzle"
|
||||
}
|
||||
|
||||
@@ -2,6 +2,5 @@
|
||||
"inherits": "0.30mm Standard @Elegoo Giga 0.6 nozzle",
|
||||
"layer_height": "0.36",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "0.36mm Draft @EOS Giga 0.6 nozzle",
|
||||
"name": "0.36mm Draft @Elegoo Giga 0.6 nozzle"
|
||||
}
|
||||
|
||||
@@ -2,6 +2,5 @@
|
||||
"inherits": "0.50mm Standard @Elegoo Giga 1.0 nozzle",
|
||||
"layer_height": "0.4",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "0.40mm Optimal @EOS Giga 1.0 nozzle",
|
||||
"name": "0.40mm Optimal @Elegoo Giga 1.0 nozzle"
|
||||
}
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
"from": "system",
|
||||
"setting_id": "PEOSG08040",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "0.40mm Standard @EOS Giga 0.8 nozzle",
|
||||
"default_acceleration": "3000",
|
||||
"filename_format": "EOGiga1_{nozzle_diameter[0]}_{input_filename_base}_{filament_name}_{layer_height}_{print_time}.gcode",
|
||||
"initial_layer_acceleration": "1000",
|
||||
|
||||
@@ -2,6 +2,5 @@
|
||||
"inherits": "0.30mm Standard @Elegoo Giga 0.6 nozzle",
|
||||
"layer_height": "0.42",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "0.42mm Extra Draft @EOS Giga 0.6 nozzle",
|
||||
"name": "0.42mm Extra Draft @Elegoo Giga 0.6 nozzle"
|
||||
}
|
||||
|
||||
@@ -2,6 +2,5 @@
|
||||
"inherits": "0.40mm Standard @Elegoo Giga 0.8 nozzle",
|
||||
"layer_height": "0.48",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "0.48mm Draft @EOS Giga 0.8 nozzle",
|
||||
"name": "0.48mm Draft @Elegoo Giga 0.8 nozzle"
|
||||
}
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
"from": "system",
|
||||
"setting_id": "PEOSG10050",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "0.50mm Standard @EOS Giga 1.0 nozzle",
|
||||
"default_acceleration": "3000",
|
||||
"filename_format": "EOGiga1_{nozzle_diameter[0]}_{input_filename_base}_{filament_name}_{layer_height}_{print_time}.gcode",
|
||||
"initial_layer_acceleration": "1000",
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
{
|
||||
"inherits": "0.40mm Standard @Elegoo Giga 0.8 nozzle",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "0.56mm Extra Draft @EOS Giga 0.8 nozzle",
|
||||
"name": "0.56mm Extra Draft @Elegoo Giga 0.8 nozzle"
|
||||
}
|
||||
|
||||
@@ -2,6 +2,5 @@
|
||||
"inherits": "0.50mm Standard @Elegoo Giga 1.0 nozzle",
|
||||
"layer_height": "0.6",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "0.60mm Draft @EOS Giga 1.0 nozzle",
|
||||
"name": "0.60mm Draft @Elegoo Giga 1.0 nozzle"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "OrcaFilamentLibrary",
|
||||
"version": "02.04.00.02",
|
||||
"version": "02.04.00.01",
|
||||
"force_update": "0",
|
||||
"description": "Orca Filament Library",
|
||||
"filament_list": [
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
"from": "system",
|
||||
"setting_id": "OEABSS00",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "Elegoo ABS",
|
||||
"fan_max_speed": [
|
||||
"40"
|
||||
],
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
"from": "system",
|
||||
"setting_id": "OEASACFS00",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "Elegoo ASA-CF",
|
||||
"pressure_advance": [
|
||||
"0.04"
|
||||
],
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
"from": "system",
|
||||
"setting_id": "OEPAHTCFS00",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "Elegoo PAHT-CF",
|
||||
"close_fan_the_first_x_layers": [
|
||||
"3"
|
||||
],
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
"from": "system",
|
||||
"setting_id": "OEPCS00",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "Elegoo PC",
|
||||
"pressure_advance": [
|
||||
"0.052"
|
||||
],
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
"from": "system",
|
||||
"setting_id": "OEPCFRS00",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "Elegoo PC-FR",
|
||||
"pressure_advance": [
|
||||
"0.05"
|
||||
],
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
"from": "system",
|
||||
"setting_id": "OEPETCFS00",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "Elegoo PET-CF",
|
||||
"pressure_advance": [
|
||||
"0.05"
|
||||
],
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
"from": "system",
|
||||
"setting_id": "OEPETGS00",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "Elegoo PETG",
|
||||
"pressure_advance": [
|
||||
"0.05"
|
||||
],
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
"from": "system",
|
||||
"setting_id": "OERPETGHFS00",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "Elegoo PETG HF",
|
||||
"pressure_advance": [
|
||||
"0.052"
|
||||
],
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
"from": "system",
|
||||
"setting_id": "OEPETGTRANSS00",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "Elegoo PETG Translucent",
|
||||
"pressure_advance": [
|
||||
"0.052"
|
||||
],
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
"from": "system",
|
||||
"setting_id": "OEPETGCFS00",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "Elegoo PETG-CF",
|
||||
"pressure_advance": [
|
||||
"0.052"
|
||||
],
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
"from": "system",
|
||||
"setting_id": "OEPETGFS00",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "Elegoo PETG-GF",
|
||||
"pressure_advance": [
|
||||
"0.052"
|
||||
],
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
"from": "system",
|
||||
"setting_id": "OEPLABASICS00",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "Elegoo PLA Basic",
|
||||
"nozzle_temperature": [
|
||||
"220"
|
||||
],
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
"from": "system",
|
||||
"setting_id": "OEPLAGALAXYS00",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "Elegoo PLA Galaxy",
|
||||
"fan_min_speed": [
|
||||
"80"
|
||||
],
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
"from": "system",
|
||||
"setting_id": "OEPLAGLOWS00",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "Elegoo PLA Glow",
|
||||
"pressure_advance": [
|
||||
"0.04"
|
||||
],
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
"from": "system",
|
||||
"setting_id": "OEPLAMARBLES00",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "Elegoo PLA Marble",
|
||||
"fan_min_speed": [
|
||||
"80"
|
||||
],
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
"from": "system",
|
||||
"setting_id": "OEPLASPARKLES00",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "Elegoo PLA Sparkle",
|
||||
"fan_min_speed": [
|
||||
"80"
|
||||
],
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
"from": "system",
|
||||
"setting_id": "OEPLATRA2S00",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "Elegoo PLA Translucent2",
|
||||
"pressure_advance": [
|
||||
"0.04"
|
||||
],
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
"from": "system",
|
||||
"setting_id": "OEPLAWOODS00",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "Elegoo PLA Wood",
|
||||
"fan_min_speed": [
|
||||
"80"
|
||||
],
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
"from": "system",
|
||||
"setting_id": "OERTPU95AS00",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "Elegoo Rapid TPU 95A",
|
||||
"pressure_advance": [
|
||||
"0.1"
|
||||
],
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
"from": "system",
|
||||
"setting_id": "OETPU95AS00",
|
||||
"instantiation": "true",
|
||||
"renamed_from": "Elegoo TPU 95A",
|
||||
"filament_max_volumetric_speed": [
|
||||
"3.2"
|
||||
],
|
||||
|
||||
@@ -45,8 +45,8 @@
|
||||
<color type="primary" scheme_preference="dark">#00695C</color>
|
||||
</branding>
|
||||
<releases>
|
||||
<release version="2.4.0-beta" date="2026-06-08" type="development">
|
||||
<url type="details">https://github.com/OrcaSlicer/OrcaSlicer/releases/tag/2.4.0-beta</url>
|
||||
<release version="2.4.0-dev" date="2026-05-22" type="development">
|
||||
<url type="details">https://github.com/OrcaSlicer/OrcaSlicer/releases/tag/nightly-builds</url>
|
||||
<description>
|
||||
<p>See the release page for detailed changelog.</p>
|
||||
</description>
|
||||
|
||||
@@ -1,75 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Package
|
||||
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
|
||||
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
|
||||
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
|
||||
xmlns:rescap3="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities/3"
|
||||
xmlns:desktop6="http://schemas.microsoft.com/appx/manifest/desktop/windows10/6"
|
||||
xmlns:virtualization="http://schemas.microsoft.com/appx/manifest/virtualization/windows10"
|
||||
IgnorableNamespaces="uap rescap rescap3 desktop6 virtualization">
|
||||
|
||||
<Identity Name="@MSIX_IDENTITY_NAME@"
|
||||
Publisher="@MSIX_PUBLISHER@"
|
||||
Version="@MSIX_VERSION@"
|
||||
ProcessorArchitecture="x64" />
|
||||
|
||||
<Properties>
|
||||
<DisplayName>OrcaSlicer</DisplayName>
|
||||
<PublisherDisplayName>@MSIX_PUBLISHER_DISPLAY_NAME@</PublisherDisplayName>
|
||||
<Logo>Assets\StoreLogo.png</Logo>
|
||||
<!-- Keep config in the real %APPDATA%\OrcaSlicer so it survives uninstall and
|
||||
is shared with the classic (NSIS/portable) install.
|
||||
Win10 1903+: coarse switch disables AppData write virtualization entirely.
|
||||
Win11+: fine-grained exclusion below takes precedence over the coarse switch. -->
|
||||
<desktop6:FileSystemWriteVirtualization>disabled</desktop6:FileSystemWriteVirtualization>
|
||||
<virtualization:FileSystemWriteVirtualization>
|
||||
<virtualization:ExcludedDirectories>
|
||||
<virtualization:ExcludedDirectory>$(KnownFolder:RoamingAppData)\OrcaSlicer</virtualization:ExcludedDirectory>
|
||||
</virtualization:ExcludedDirectories>
|
||||
</virtualization:FileSystemWriteVirtualization>
|
||||
</Properties>
|
||||
|
||||
<Dependencies>
|
||||
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.18362.0" MaxVersionTested="10.0.26100.0" />
|
||||
</Dependencies>
|
||||
|
||||
<Resources>
|
||||
<Resource Language="en-us" />
|
||||
</Resources>
|
||||
|
||||
<Applications>
|
||||
<Application Id="OrcaSlicer" Executable="orca-slicer.exe" EntryPoint="Windows.FullTrustApplication">
|
||||
<uap:VisualElements
|
||||
DisplayName="OrcaSlicer"
|
||||
Description="Open-source slicer for FDM 3D printers"
|
||||
BackgroundColor="transparent"
|
||||
Square150x150Logo="Assets\Square150x150Logo.png"
|
||||
Square44x44Logo="Assets\Square44x44Logo.png" />
|
||||
<Extensions>
|
||||
<uap:Extension Category="windows.fileTypeAssociation">
|
||||
<uap:FileTypeAssociation Name="orcaslicer-models">
|
||||
<uap:SupportedFileTypes>
|
||||
<uap:FileType>.3mf</uap:FileType>
|
||||
<uap:FileType>.stl</uap:FileType>
|
||||
<uap:FileType>.step</uap:FileType>
|
||||
<uap:FileType>.stp</uap:FileType>
|
||||
<uap:FileType>.gcode</uap:FileType>
|
||||
<uap:FileType>.drc</uap:FileType>
|
||||
</uap:SupportedFileTypes>
|
||||
<rescap3:MigrationProgIds>
|
||||
<rescap3:MigrationProgId>Orca.Slicer.1</rescap3:MigrationProgId>
|
||||
</rescap3:MigrationProgIds>
|
||||
</uap:FileTypeAssociation>
|
||||
</uap:Extension>
|
||||
<uap:Extension Category="windows.protocol">
|
||||
<uap:Protocol Name="orcaslicer" />
|
||||
</uap:Extension>
|
||||
</Extensions>
|
||||
</Application>
|
||||
</Applications>
|
||||
|
||||
<Capabilities>
|
||||
<rescap:Capability Name="runFullTrust" />
|
||||
<rescap:Capability Name="unvirtualizedResources" />
|
||||
</Capabilities>
|
||||
</Package>
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 20 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 3.5 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 3.5 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 4.2 KiB |
@@ -1,67 +0,0 @@
|
||||
<#
|
||||
Builds the unsigned MSIX Store package from an existing install tree.
|
||||
The package is intentionally NOT signed: the Microsoft Store strips and
|
||||
re-signs uploads with Microsoft's certificate. For local installs use
|
||||
Developer Mode loose-layout registration instead:
|
||||
./scripts/msix/build_msix.ps1 -StageOnly
|
||||
Add-AppxPackage -Register <staging>\AppxManifest.xml
|
||||
Requires the Windows SDK (makeappx.exe) unless -StageOnly is used.
|
||||
#>
|
||||
param(
|
||||
[string]$InstallDir = "build/OrcaSlicer",
|
||||
[string]$OutputPath = "build/OrcaSlicer_Windows_MSIX.msix",
|
||||
[string]$StagingDir = "",
|
||||
[switch]$StageOnly,
|
||||
[string]$IdentityName = "OrcaSlicer.OrcaSlicer",
|
||||
[string]$Publisher = "CN=38F7EA55-C73B-4072-B3B2-C8E0EA15BB82",
|
||||
[string]$PublisherDisplayName = "OrcaSlicer"
|
||||
)
|
||||
$ErrorActionPreference = 'Stop'
|
||||
|
||||
$repoRoot = Split-Path (Split-Path $PSScriptRoot -Parent) -Parent
|
||||
|
||||
# MSIX version = MAJOR.MINOR.PATCH.0 from the SoftFever_VERSION semver triplet
|
||||
# (Store requires the revision field to be 0).
|
||||
$versionContent = Get-Content (Join-Path $repoRoot 'version.inc') -Raw
|
||||
if ($versionContent -notmatch 'set\(SoftFever_VERSION "(\d+)\.(\d+)\.(\d+)') {
|
||||
throw "Could not parse SoftFever_VERSION from version.inc"
|
||||
}
|
||||
$msixVersion = "$($Matches[1]).$($Matches[2]).$($Matches[3]).0"
|
||||
Write-Output "MSIX version: $msixVersion"
|
||||
|
||||
if (-not (Test-Path (Join-Path $InstallDir 'orca-slicer.exe'))) {
|
||||
throw "orca-slicer.exe not found in '$InstallDir' - build the install tree first"
|
||||
}
|
||||
|
||||
if ([string]::IsNullOrEmpty($StagingDir)) {
|
||||
$StagingDir = Join-Path ([System.IO.Path]::GetTempPath()) 'orca-msix-staging'
|
||||
}
|
||||
if (Test-Path $StagingDir) { Remove-Item $StagingDir -Recurse -Force }
|
||||
New-Item -ItemType Directory -Force $StagingDir | Out-Null
|
||||
|
||||
Copy-Item -Path (Join-Path $InstallDir '*') -Destination $StagingDir -Recurse
|
||||
Copy-Item -Path (Join-Path $PSScriptRoot 'assets') -Destination (Join-Path $StagingDir 'Assets') -Recurse
|
||||
|
||||
$manifest = Get-Content (Join-Path $PSScriptRoot 'AppxManifest.xml') -Raw
|
||||
$manifest = $manifest.Replace('@MSIX_VERSION@', $msixVersion)
|
||||
$manifest = $manifest.Replace('@MSIX_IDENTITY_NAME@', $IdentityName)
|
||||
$manifest = $manifest.Replace('@MSIX_PUBLISHER@', $Publisher)
|
||||
$manifest = $manifest.Replace('@MSIX_PUBLISHER_DISPLAY_NAME@', $PublisherDisplayName)
|
||||
Set-Content -Path (Join-Path $StagingDir 'AppxManifest.xml') -Value $manifest -Encoding utf8
|
||||
|
||||
if ($StageOnly) {
|
||||
Write-Output "Staged loose layout at: $StagingDir"
|
||||
return
|
||||
}
|
||||
|
||||
$makeappx = Get-ChildItem "${env:ProgramFiles(x86)}\Windows Kits\10\bin\10.*\x64\makeappx.exe" -ErrorAction SilentlyContinue |
|
||||
Sort-Object { [version]$_.Directory.Parent.Name } -Descending |
|
||||
Select-Object -First 1 -ExpandProperty FullName
|
||||
if (-not $makeappx) {
|
||||
throw "makeappx.exe not found under '${env:ProgramFiles(x86)}\Windows Kits\10\bin' - install the Windows SDK"
|
||||
}
|
||||
Write-Output "Using makeappx: $makeappx"
|
||||
|
||||
& $makeappx pack /d $StagingDir /p $OutputPath /o
|
||||
if ($LASTEXITCODE -ne 0) { throw "makeappx pack failed with exit code $LASTEXITCODE" }
|
||||
Write-Output "Packed: $OutputPath"
|
||||
@@ -1,56 +0,0 @@
|
||||
# Generates the MSIX package logo assets from the master vector logo
|
||||
# (resources\images\OrcaSlicer_gradient_circle.svg). Each PNG is rendered from
|
||||
# the SVG at its exact target size (true per-size vector rasterization, not
|
||||
# downscaled from one bitmap), preserving alpha transparency in the corners
|
||||
# outside the circle (the manifest uses BackgroundColor="transparent").
|
||||
#
|
||||
# Run once locally on Windows (re-run only if the logo changes), then commit
|
||||
# the PNGs in assets/. CI never runs this script.
|
||||
#
|
||||
# Prerequisite: Python 3 with the resvg-py package (pip install resvg-py).
|
||||
# It bundles the resvg SVG renderer, needed because the master SVG uses
|
||||
# gradients with alpha-fade stops that System.Drawing cannot rasterize.
|
||||
param(
|
||||
[string]$Python = 'python'
|
||||
)
|
||||
$ErrorActionPreference = 'Stop'
|
||||
|
||||
$repoRoot = Split-Path (Split-Path $PSScriptRoot -Parent) -Parent
|
||||
$source = Join-Path $repoRoot 'resources\images\OrcaSlicer_gradient_circle.svg'
|
||||
$outDir = Join-Path $PSScriptRoot 'assets'
|
||||
New-Item -ItemType Directory -Force $outDir | Out-Null
|
||||
|
||||
$sizes = [ordered]@{
|
||||
'Square150x150Logo.png' = 150
|
||||
'Square44x44Logo.png' = 44
|
||||
'Square44x44Logo.targetsize-44_altform-unplated.png' = 44
|
||||
'StoreLogo.png' = 50
|
||||
}
|
||||
|
||||
$py = @'
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
import resvg_py
|
||||
|
||||
svg, out_dir = sys.argv[1], Path(sys.argv[2])
|
||||
for spec in sys.argv[3:]:
|
||||
name, px = spec.rsplit('=', 1)
|
||||
px = int(px)
|
||||
data = resvg_py.svg_to_bytes(svg_path=svg, width=px, height=px)
|
||||
(out_dir / name).write_bytes(bytes(data))
|
||||
print(f'Wrote {name} ({px}x{px})')
|
||||
'@
|
||||
|
||||
$renderScript = Join-Path $env:TEMP 'orca_msix_render.py'
|
||||
Set-Content -Path $renderScript -Value $py -Encoding utf8
|
||||
try {
|
||||
$specs = foreach ($name in $sizes.Keys) { "$name=$($sizes[$name])" }
|
||||
& $Python $renderScript $source $outDir @specs
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
throw 'resvg render failed. Is resvg-py installed? (pip install resvg-py)'
|
||||
}
|
||||
}
|
||||
finally {
|
||||
Remove-Item $renderScript -ErrorAction SilentlyContinue
|
||||
}
|
||||
@@ -344,6 +344,8 @@ set(lisbslic3r_sources
|
||||
Polyline.hpp
|
||||
PresetBundle.cpp
|
||||
PresetBundle.hpp
|
||||
PresetBundleCache.cpp
|
||||
PresetBundleCache.hpp
|
||||
Preset.cpp
|
||||
Preset.hpp
|
||||
PrincipalComponents2D.cpp
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "Exception.hpp"
|
||||
#include "Preset.hpp"
|
||||
#include "PresetBundle.hpp"
|
||||
#include "PresetBundleCache.hpp"
|
||||
#include "AppConfig.hpp"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
@@ -707,6 +708,9 @@ void Preset::save(DynamicPrintConfig* parent_config)
|
||||
idx_file.replace_extension(".info");
|
||||
this->save_info(idx_file.string());
|
||||
}
|
||||
|
||||
// Update the per-file binary cache so the next startup skips JSON parsing.
|
||||
PresetBundleCache::write_file_cache(*this);
|
||||
}
|
||||
|
||||
void Preset::reload(Preset const &parent)
|
||||
@@ -2362,10 +2366,6 @@ bool PresetCollection::validate_preset(const std::string &preset_name, std::stri
|
||||
const std::string canonical_inherit_name = this->canonical_preset_name(inherit_name);
|
||||
it = this->find_preset_internal(canonical_inherit_name);
|
||||
found = it != m_presets.end() && it->name == canonical_inherit_name && is_trusted(*it);
|
||||
if (!found) {
|
||||
it = this->find_preset_renamed(canonical_inherit_name);
|
||||
found = it != m_presets.end() && is_trusted(*it);
|
||||
}
|
||||
if (found)
|
||||
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": preset_name %1%, inherit_name %2%, found inherit in list")%preset_name %inherit_name;
|
||||
else
|
||||
@@ -2457,9 +2457,7 @@ std::pair<Preset*, bool> PresetCollection::load_external_preset(
|
||||
|
||||
if (!inherits.empty() && (different_settings_list.size() > 0)) {
|
||||
auto iter = this->find_preset_internal(inherits);
|
||||
if (iter == m_presets.end() || iter->name != inherits)
|
||||
iter = this->find_preset_renamed(inherits);
|
||||
if (iter != m_presets.end()) {
|
||||
if (iter != m_presets.end() && iter->name == inherits) {
|
||||
//std::vector<std::string> dirty_options = cfg.diff(iter->config);
|
||||
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": change preset %1% inherit %2% 's value to %3% 's values")%original_name %inherits %path;
|
||||
cfg.update_non_diff_values_to_base_config(iter->config, keys, different_settings_list, extruder_id_name, extruder_variant_name, *key_set1, *key_set2);
|
||||
@@ -2511,9 +2509,7 @@ std::pair<Preset*, bool> PresetCollection::load_external_preset(
|
||||
// and override its settings with the loaded ones.
|
||||
assert(it == m_presets.end());
|
||||
it = this->find_preset_internal(inherits);
|
||||
if (it == m_presets.end() || it->name != inherits)
|
||||
it = this->find_preset_renamed(inherits);
|
||||
found = it != m_presets.end();
|
||||
found = it != m_presets.end() && it->name == inherits;
|
||||
if (found && profile_print_params_same(it->config, cfg)) {
|
||||
// The system preset exists and it matches the values stored inside config.
|
||||
if (select == LoadAndSelect::Always)
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
#include <cassert>
|
||||
#include <chrono>
|
||||
#include <ctime>
|
||||
|
||||
#include "PresetBundle.hpp"
|
||||
#include "PresetBundleCache.hpp"
|
||||
#include "PrintConfig.hpp"
|
||||
#include "libslic3r.h"
|
||||
#include "I18N.hpp"
|
||||
@@ -520,6 +522,8 @@ PresetsConfigSubstitutions PresetBundle::load_presets(AppConfig &config, Forward
|
||||
|
||||
//BBS: add config related logs
|
||||
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(" enter, substitution_rule %1%, preferred printer_model_id %2%")%substitution_rule%preferred_selection.printer_model_id;
|
||||
const auto startup_t0 = std::chrono::steady_clock::now();
|
||||
|
||||
//BBS: change system config to json
|
||||
std::tie(substitutions, errors_cummulative) = this->load_system_presets_from_json(substitution_rule);
|
||||
|
||||
@@ -539,6 +543,12 @@ PresetsConfigSubstitutions PresetBundle::load_presets(AppConfig &config, Forward
|
||||
|
||||
set_calibrate_printer("");
|
||||
|
||||
{
|
||||
const auto total_ms = std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||
std::chrono::steady_clock::now() - startup_t0).count();
|
||||
BOOST_LOG_TRIVIAL(info) << "PresetBundle: all presets loaded in " << total_ms << " ms";
|
||||
}
|
||||
|
||||
//BBS: add config related logs
|
||||
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(" finished, returned substitutions %1%")%substitutions.size();
|
||||
return substitutions;
|
||||
@@ -947,6 +957,18 @@ PresetsConfigSubstitutions PresetBundle::load_user_presets(std::string user, For
|
||||
bundles.m_bundles.clear();
|
||||
bundles.WriteUnlock();
|
||||
|
||||
const auto user_load_t0 = std::chrono::steady_clock::now();
|
||||
|
||||
// Helper: collect canonical names of presets in a collection that belong to a bundle.
|
||||
auto collect_bundle_preset_names = [](const PresetCollection& coll,
|
||||
const std::string& bundle_id,
|
||||
std::vector<std::string>& out) {
|
||||
for (const Preset& p : coll()) {
|
||||
if (p.bundle_id == bundle_id)
|
||||
out.push_back(p.name);
|
||||
}
|
||||
};
|
||||
|
||||
// Load bundle metadata from _local directory first
|
||||
fs::path local_dir(folder / PRESET_LOCAL_DIR);
|
||||
if (fs::exists(local_dir)) {
|
||||
@@ -965,16 +987,34 @@ PresetsConfigSubstitutions PresetBundle::load_user_presets(std::string user, For
|
||||
metadata.filament_presets.clear();
|
||||
metadata.printer_presets.clear();
|
||||
|
||||
// Add the profiles
|
||||
const PresetOrigin origin(PresetOrigin::Kind::LocalBundle, metadata.id);
|
||||
|
||||
// Pre-load from per-file caches; load_presets will skip these.
|
||||
PresetBundleCache::preload_file_caches(prints, (fs::path(bundle_dir) / PRESET_PRINT_NAME).string(), origin);
|
||||
PresetBundleCache::preload_file_caches(filaments, (fs::path(bundle_dir) / PRESET_FILAMENT_NAME).string(), origin);
|
||||
PresetBundleCache::preload_file_caches(printers, (fs::path(bundle_dir) / PRESET_PRINTER_NAME).string(), origin);
|
||||
|
||||
// Record names of preloaded presets in metadata.
|
||||
collect_bundle_preset_names(prints, metadata.id, metadata.print_presets);
|
||||
collect_bundle_preset_names(filaments, metadata.id, metadata.filament_presets);
|
||||
collect_bundle_preset_names(printers, metadata.id, metadata.printer_presets);
|
||||
|
||||
// Load any presets not covered by the cache (callback adds to metadata).
|
||||
this->prints.load_presets(bundle_dir, PRESET_PRINT_NAME, substitutions, substitution_rule, [&](Preset& preset) {
|
||||
metadata.print_presets.push_back(preset.name);
|
||||
}, PresetOrigin(PresetOrigin::Kind::LocalBundle, metadata.id));
|
||||
}, origin);
|
||||
this->filaments.load_presets(bundle_dir, PRESET_FILAMENT_NAME, substitutions, substitution_rule, [&](Preset& preset) {
|
||||
metadata.filament_presets.push_back(preset.name);
|
||||
}, PresetOrigin(PresetOrigin::Kind::LocalBundle, metadata.id));
|
||||
}, origin);
|
||||
this->printers.load_presets(bundle_dir, PRESET_PRINTER_NAME, substitutions, substitution_rule, [&](Preset& preset) {
|
||||
metadata.printer_presets.push_back(preset.name);
|
||||
}, PresetOrigin(PresetOrigin::Kind::LocalBundle, metadata.id));
|
||||
}, origin);
|
||||
|
||||
// Persist any newly-loaded presets back to per-file caches.
|
||||
PresetBundleCache::update_file_caches(prints, (fs::path(bundle_dir) / PRESET_PRINT_NAME).string());
|
||||
PresetBundleCache::update_file_caches(filaments, (fs::path(bundle_dir) / PRESET_FILAMENT_NAME).string());
|
||||
PresetBundleCache::update_file_caches(printers, (fs::path(bundle_dir) / PRESET_PRINTER_NAME).string());
|
||||
|
||||
metadata.bundle_type = BundleType::Local;
|
||||
metadata.path = metadata_file.string();
|
||||
|
||||
@@ -1002,16 +1042,33 @@ PresetsConfigSubstitutions PresetBundle::load_user_presets(std::string user, For
|
||||
metadata.printer_presets.clear();
|
||||
metadata.is_subscribed = true;
|
||||
|
||||
// Load presets from bundle (same logic as __local__)
|
||||
const PresetOrigin origin(PresetOrigin::Kind::SubscribedBundle, metadata.id);
|
||||
|
||||
// Pre-load from per-file caches; load_presets will skip these.
|
||||
PresetBundleCache::preload_file_caches(prints, (fs::path(bundle_dir) / PRESET_PRINT_NAME).string(), origin);
|
||||
PresetBundleCache::preload_file_caches(filaments, (fs::path(bundle_dir) / PRESET_FILAMENT_NAME).string(), origin);
|
||||
PresetBundleCache::preload_file_caches(printers, (fs::path(bundle_dir) / PRESET_PRINTER_NAME).string(), origin);
|
||||
|
||||
// Record names of preloaded presets in metadata.
|
||||
collect_bundle_preset_names(prints, metadata.id, metadata.print_presets);
|
||||
collect_bundle_preset_names(filaments, metadata.id, metadata.filament_presets);
|
||||
collect_bundle_preset_names(printers, metadata.id, metadata.printer_presets);
|
||||
|
||||
// Load any presets not covered by the cache (callback adds to metadata).
|
||||
this->prints.load_presets(bundle_dir, PRESET_PRINT_NAME, substitutions, substitution_rule, [&](Preset& preset) {
|
||||
metadata.print_presets.push_back(preset.name);
|
||||
}, PresetOrigin(PresetOrigin::Kind::SubscribedBundle, metadata.id));
|
||||
}, origin);
|
||||
this->filaments.load_presets(bundle_dir, PRESET_FILAMENT_NAME, substitutions, substitution_rule, [&](Preset& preset) {
|
||||
metadata.filament_presets.push_back(preset.name);
|
||||
}, PresetOrigin(PresetOrigin::Kind::SubscribedBundle, metadata.id));
|
||||
}, origin);
|
||||
this->printers.load_presets(bundle_dir, PRESET_PRINTER_NAME, substitutions, substitution_rule, [&](Preset& preset) {
|
||||
metadata.printer_presets.push_back(preset.name);
|
||||
}, PresetOrigin(PresetOrigin::Kind::SubscribedBundle, metadata.id));
|
||||
}, origin);
|
||||
|
||||
// Persist any newly-loaded presets back to per-file caches.
|
||||
PresetBundleCache::update_file_caches(prints, (fs::path(bundle_dir) / PRESET_PRINT_NAME).string());
|
||||
PresetBundleCache::update_file_caches(filaments, (fs::path(bundle_dir) / PRESET_FILAMENT_NAME).string());
|
||||
PresetBundleCache::update_file_caches(printers, (fs::path(bundle_dir) / PRESET_PRINTER_NAME).string());
|
||||
|
||||
metadata.bundle_type = BundleType::Subscribed;
|
||||
metadata.path = metadata_file.string();
|
||||
@@ -1023,34 +1080,59 @@ PresetsConfigSubstitutions PresetBundle::load_user_presets(std::string user, For
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// BBS do not load sla_print
|
||||
// BBS: change directoties by design
|
||||
try {
|
||||
std::string print_selected_preset_name = prints.get_selected_preset().name;
|
||||
this->prints.load_presets(dir_user_presets, PRESET_PRINT_NAME, substitutions, substitution_rule);
|
||||
prints.select_preset_by_name(print_selected_preset_name, false);
|
||||
} catch (const std::runtime_error &err) {
|
||||
errors_cummulative += err.what();
|
||||
// BBS: change directories by design
|
||||
|
||||
// Regular user presets (process/filament/machine) — per-file cache approach.
|
||||
{
|
||||
const PresetOrigin user_origin; // Kind::Auto → resolved to User by detect_origin_from_path
|
||||
|
||||
// Pre-load from per-file .cache siblings; load_presets will skip pre-loaded names.
|
||||
int cached_prints = PresetBundleCache::preload_file_caches(prints, (fs::path(dir_user_presets) / PRESET_PRINT_NAME).string(), user_origin);
|
||||
int cached_filaments = PresetBundleCache::preload_file_caches(filaments, (fs::path(dir_user_presets) / PRESET_FILAMENT_NAME).string(), user_origin);
|
||||
int cached_printers = PresetBundleCache::preload_file_caches(printers, (fs::path(dir_user_presets) / PRESET_PRINTER_NAME).string(), user_origin);
|
||||
BOOST_LOG_TRIVIAL(info) << "PresetBundle: user presets from cache: "
|
||||
<< cached_prints << " process, "
|
||||
<< cached_filaments << " filament, "
|
||||
<< cached_printers << " machine";
|
||||
|
||||
try {
|
||||
std::string print_selected_preset_name = prints.get_selected_preset().name;
|
||||
this->prints.load_presets(dir_user_presets, PRESET_PRINT_NAME, substitutions, substitution_rule);
|
||||
prints.select_preset_by_name(print_selected_preset_name, false);
|
||||
} catch (const std::runtime_error &err) {
|
||||
errors_cummulative += err.what();
|
||||
}
|
||||
try {
|
||||
std::string filament_selected_preset_name = filaments.get_selected_preset().name;
|
||||
this->filaments.load_presets(dir_user_presets, PRESET_FILAMENT_NAME, substitutions, substitution_rule);
|
||||
filaments.select_preset_by_name(filament_selected_preset_name, false);
|
||||
} catch (const std::runtime_error &err) {
|
||||
errors_cummulative += err.what();
|
||||
}
|
||||
try {
|
||||
std::string printer_selected_preset_name = printers.get_selected_preset().name;
|
||||
this->printers.load_presets(dir_user_presets, PRESET_PRINTER_NAME, substitutions, substitution_rule);
|
||||
printers.select_preset_by_name(printer_selected_preset_name, false);
|
||||
} catch (const std::runtime_error &err) {
|
||||
errors_cummulative += err.what();
|
||||
}
|
||||
if (!errors_cummulative.empty()) throw Slic3r::RuntimeError(errors_cummulative);
|
||||
|
||||
// Persist any newly-loaded presets back to per-file caches.
|
||||
PresetBundleCache::update_file_caches(prints, (fs::path(dir_user_presets) / PRESET_PRINT_NAME).string());
|
||||
PresetBundleCache::update_file_caches(filaments, (fs::path(dir_user_presets) / PRESET_FILAMENT_NAME).string());
|
||||
PresetBundleCache::update_file_caches(printers, (fs::path(dir_user_presets) / PRESET_PRINTER_NAME).string());
|
||||
}
|
||||
try {
|
||||
std::string filament_selected_preset_name = filaments.get_selected_preset().name;
|
||||
this->filaments.load_presets(dir_user_presets, PRESET_FILAMENT_NAME, substitutions, substitution_rule);
|
||||
filaments.select_preset_by_name(filament_selected_preset_name, false);
|
||||
} catch (const std::runtime_error &err) {
|
||||
errors_cummulative += err.what();
|
||||
|
||||
{
|
||||
const auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||
std::chrono::steady_clock::now() - user_load_t0).count();
|
||||
BOOST_LOG_TRIVIAL(info) << "PresetBundle: user + bundle presets loaded in " << ms << " ms";
|
||||
}
|
||||
try {
|
||||
std::string printer_selected_preset_name = printers.get_selected_preset().name;
|
||||
this->printers.load_presets(dir_user_presets, PRESET_PRINTER_NAME, substitutions, substitution_rule);
|
||||
printers.select_preset_by_name(printer_selected_preset_name, false);
|
||||
} catch (const std::runtime_error &err) {
|
||||
errors_cummulative += err.what();
|
||||
}
|
||||
if (!errors_cummulative.empty()) throw Slic3r::RuntimeError(errors_cummulative);
|
||||
|
||||
this->update_multi_material_filament_presets();
|
||||
this->update_compatible(PresetSelectCompatibleType::Never);
|
||||
|
||||
set_calibrate_printer("");
|
||||
|
||||
return PresetsConfigSubstitutions();
|
||||
@@ -2178,6 +2260,23 @@ std::pair<PresetsConfigSubstitutions, std::string> PresetBundle::load_system_pre
|
||||
if (validation_mode)
|
||||
dir = (boost::filesystem::path(data_dir())).make_preferred();
|
||||
|
||||
// Try loading from binary cache first (skips JSON parsing on cache hit).
|
||||
if (!validation_mode) {
|
||||
const auto t0 = std::chrono::steady_clock::now();
|
||||
PresetBundleCache::SystemPresetsCache cache;
|
||||
const std::string cache_file = PresetBundleCache::SystemPresetsCache::cache_path();
|
||||
if (cache.load(cache_file) && cache.is_valid(dir.string())) {
|
||||
cache.apply(*this);
|
||||
update_system_maps();
|
||||
const auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||
std::chrono::steady_clock::now() - t0).count();
|
||||
BOOST_LOG_TRIVIAL(info) << "PresetBundle: system presets loaded from cache in " << ms << " ms";
|
||||
return {PresetsConfigSubstitutions{}, ""};
|
||||
}
|
||||
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " cache miss, falling back to JSON load";
|
||||
}
|
||||
|
||||
const auto json_load_t0 = std::chrono::steady_clock::now();
|
||||
PresetsConfigSubstitutions substitutions;
|
||||
std::string errors_cummulative;
|
||||
bool first = true;
|
||||
@@ -2281,6 +2380,24 @@ std::pair<PresetsConfigSubstitutions, std::string> PresetBundle::load_system_pre
|
||||
}
|
||||
|
||||
this->update_system_maps();
|
||||
|
||||
{
|
||||
const auto json_ms = std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||
std::chrono::steady_clock::now() - json_load_t0).count();
|
||||
BOOST_LOG_TRIVIAL(info) << "PresetBundle: system presets loaded from JSON in " << json_ms << " ms";
|
||||
}
|
||||
|
||||
// Persist a binary cache so the next startup can skip JSON parsing.
|
||||
if (!validation_mode && errors_cummulative.empty()) {
|
||||
const auto save_t0 = std::chrono::steady_clock::now();
|
||||
PresetBundleCache::SystemPresetsCache cache;
|
||||
cache.capture(*this, dir.string());
|
||||
cache.save(PresetBundleCache::SystemPresetsCache::cache_path());
|
||||
const auto save_ms = std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||
std::chrono::steady_clock::now() - save_t0).count();
|
||||
BOOST_LOG_TRIVIAL(info) << "PresetBundle: system presets cache saved in " << save_ms << " ms";
|
||||
}
|
||||
|
||||
//BBS: add config related logs
|
||||
BOOST_LOG_TRIVIAL(debug) << __FUNCTION__ << boost::format(" finished, errors_cummulative %1%")%errors_cummulative;
|
||||
return std::make_pair(std::move(substitutions), errors_cummulative);
|
||||
|
||||
595
src/libslic3r/PresetBundleCache.cpp
Normal file
595
src/libslic3r/PresetBundleCache.cpp
Normal file
@@ -0,0 +1,595 @@
|
||||
#include "PresetBundleCache.hpp"
|
||||
|
||||
#include <chrono>
|
||||
#include <sstream>
|
||||
|
||||
#include <boost/crc.hpp>
|
||||
#include <boost/filesystem.hpp>
|
||||
#include <boost/log/trivial.hpp>
|
||||
#include <boost/nowide/fstream.hpp>
|
||||
|
||||
#include <tbb/blocked_range.h>
|
||||
#include <tbb/parallel_for.h>
|
||||
|
||||
#include <cereal/archives/binary.hpp>
|
||||
#include <cereal/types/map.hpp>
|
||||
#include <cereal/types/polymorphic.hpp>
|
||||
#include <cereal/types/string.hpp>
|
||||
#include <cereal/types/vector.hpp>
|
||||
|
||||
#include "Preset.hpp"
|
||||
#include "PresetBundle.hpp"
|
||||
#include "PrintConfig.hpp"
|
||||
#include "Semver.hpp"
|
||||
#include "Utils.hpp"
|
||||
|
||||
namespace Slic3r {
|
||||
namespace PresetBundleCache {
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// Binary cache file format: raw 20-byte header followed by cereal blob.
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
static constexpr uint32_t CACHE_MAGIC = 0x4F52435A; // "ORCZ"
|
||||
static constexpr uint32_t CACHE_FILE_VERSION = 1;
|
||||
|
||||
#pragma pack(push, 1)
|
||||
struct CacheFileHeader {
|
||||
uint32_t magic;
|
||||
uint32_t file_version;
|
||||
uint64_t data_size;
|
||||
uint32_t crc32;
|
||||
};
|
||||
#pragma pack(pop)
|
||||
static_assert(sizeof(CacheFileHeader) == 20, "CacheFileHeader must be 20 bytes");
|
||||
|
||||
template<class T>
|
||||
static void save_blob(const std::string& path, const T& obj)
|
||||
{
|
||||
std::ostringstream oss(std::ios::out | std::ios::binary);
|
||||
{
|
||||
cereal::BinaryOutputArchive ar(oss);
|
||||
ar(obj);
|
||||
}
|
||||
const std::string blob = oss.str();
|
||||
|
||||
boost::crc_32_type crc;
|
||||
crc.process_bytes(blob.data(), blob.size());
|
||||
|
||||
try {
|
||||
boost::filesystem::create_directories(boost::filesystem::path(path).parent_path());
|
||||
boost::nowide::ofstream ofs(path, std::ios::binary | std::ios::trunc);
|
||||
if (!ofs.is_open()) {
|
||||
BOOST_LOG_TRIVIAL(warning) << "PresetBundleCache: cannot open for writing: " << path;
|
||||
return;
|
||||
}
|
||||
CacheFileHeader hdr;
|
||||
hdr.magic = CACHE_MAGIC;
|
||||
hdr.file_version = CACHE_FILE_VERSION;
|
||||
hdr.data_size = static_cast<uint64_t>(blob.size());
|
||||
hdr.crc32 = crc.checksum();
|
||||
ofs.write(reinterpret_cast<const char*>(&hdr), sizeof(hdr));
|
||||
ofs.write(blob.data(), static_cast<std::streamsize>(blob.size()));
|
||||
} catch (const std::exception& e) {
|
||||
BOOST_LOG_TRIVIAL(warning) << "PresetBundleCache: write failed (" << path << "): " << e.what();
|
||||
}
|
||||
}
|
||||
|
||||
template<class T>
|
||||
static bool load_blob(const std::string& path, T& obj)
|
||||
{
|
||||
try {
|
||||
boost::nowide::ifstream ifs(path, std::ios::binary);
|
||||
if (!ifs.is_open())
|
||||
return false;
|
||||
|
||||
CacheFileHeader hdr;
|
||||
if (!ifs.read(reinterpret_cast<char*>(&hdr), sizeof(hdr)))
|
||||
return false;
|
||||
if (hdr.magic != CACHE_MAGIC || hdr.file_version != CACHE_FILE_VERSION)
|
||||
return false;
|
||||
if (hdr.data_size == 0 || hdr.data_size > 512u * 1024u * 1024u)
|
||||
return false;
|
||||
|
||||
std::string blob(hdr.data_size, '\0');
|
||||
if (!ifs.read(&blob[0], static_cast<std::streamsize>(hdr.data_size)))
|
||||
return false;
|
||||
|
||||
boost::crc_32_type crc;
|
||||
crc.process_bytes(blob.data(), blob.size());
|
||||
if (crc.checksum() != hdr.crc32) {
|
||||
BOOST_LOG_TRIVIAL(warning) << "PresetBundleCache: CRC32 mismatch: " << path;
|
||||
return false;
|
||||
}
|
||||
|
||||
std::istringstream iss(blob, std::ios::in | std::ios::binary);
|
||||
cereal::BinaryInputArchive ar(iss);
|
||||
ar(obj);
|
||||
return true;
|
||||
} catch (const std::exception& e) {
|
||||
BOOST_LOG_TRIVIAL(warning) << "PresetBundleCache: load failed (" << path << "): " << e.what();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// Helpers
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
static std::string vendor_root_json(const std::string& system_dir, const std::string& vendor_id)
|
||||
{
|
||||
return (boost::filesystem::path(system_dir) / (vendor_id + ".json")).make_preferred().string();
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// SystemPresetsCache
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
std::string SystemPresetsCache::cache_path()
|
||||
{
|
||||
return (boost::filesystem::path(data_dir()) / PRESET_SYSTEM_DIR / "system_presets_cache.cache")
|
||||
.make_preferred().string();
|
||||
}
|
||||
|
||||
bool SystemPresetsCache::is_valid(const std::string& system_dir) const
|
||||
{
|
||||
if (format_version != FORMAT_VERSION)
|
||||
return false;
|
||||
if (config_options_count != print_config_def.options.size())
|
||||
return false;
|
||||
|
||||
std::map<std::string, std::string> current;
|
||||
try {
|
||||
for (const auto& entry : boost::filesystem::directory_iterator(system_dir)) {
|
||||
const std::string path = entry.path().string();
|
||||
if (!Slic3r::is_json_file(path))
|
||||
continue;
|
||||
const std::string vendor_name = entry.path().stem().string();
|
||||
Semver ver = get_version_from_json(path);
|
||||
if (ver.valid())
|
||||
current[vendor_name] = ver.to_string();
|
||||
}
|
||||
} catch (const std::exception& e) {
|
||||
BOOST_LOG_TRIVIAL(warning) << "PresetBundleCache: directory scan failed: " << e.what();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (current.size() != vendor_versions.size())
|
||||
return false;
|
||||
for (const auto& [name, ver] : current) {
|
||||
auto it = vendor_versions.find(name);
|
||||
if (it == vendor_versions.end() || it->second != ver)
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void SystemPresetsCache::capture(const PresetBundle& bundle, const std::string& system_dir)
|
||||
{
|
||||
format_version = FORMAT_VERSION;
|
||||
config_options_count = print_config_def.options.size();
|
||||
vendor_versions.clear();
|
||||
vendor_profiles.clear();
|
||||
print_presets.clear();
|
||||
filament_presets.clear();
|
||||
printer_presets.clear();
|
||||
sla_print_presets.clear();
|
||||
sla_material_presets.clear();
|
||||
config_maps = bundle.m_config_maps;
|
||||
filament_id_maps = bundle.m_filament_id_maps;
|
||||
|
||||
for (const auto& [id, vp] : bundle.vendors) {
|
||||
CachedVendorProfile cvp;
|
||||
cvp.id = vp.id;
|
||||
cvp.name = vp.name;
|
||||
cvp.config_version = vp.config_version.valid() ? vp.config_version.to_string() : "";
|
||||
cvp.config_update_url = vp.config_update_url;
|
||||
cvp.changelog_url = vp.changelog_url;
|
||||
|
||||
for (const auto& model : vp.models) {
|
||||
CachedPrinterModel cm;
|
||||
cm.id = model.id;
|
||||
cm.name = model.name;
|
||||
cm.model_id = model.model_id;
|
||||
cm.family = model.family;
|
||||
cm.technology = static_cast<int>(model.technology);
|
||||
for (const auto& v : model.variants)
|
||||
cm.variants.push_back({v.name});
|
||||
cm.default_materials = model.default_materials;
|
||||
cm.not_support_bed_types = model.not_support_bed_types;
|
||||
cm.bed_model = model.bed_model;
|
||||
cm.bed_texture = model.bed_texture;
|
||||
cm.image_bed_type = model.image_bed_type;
|
||||
cm.bottom_texture_end_name = model.bottom_texture_end_name;
|
||||
cm.use_double_extruder_default_texture = model.use_double_extruder_default_texture;
|
||||
cm.bottom_texture_rect = model.bottom_texture_rect;
|
||||
cm.middle_texture_rect = model.middle_texture_rect;
|
||||
cm.hotend_model = model.hotend_model;
|
||||
cvp.models.push_back(std::move(cm));
|
||||
}
|
||||
|
||||
for (const auto& f : vp.default_filaments)
|
||||
cvp.default_filaments.push_back(f);
|
||||
for (const auto& m : vp.default_sla_materials)
|
||||
cvp.default_sla_materials.push_back(m);
|
||||
|
||||
vendor_profiles.push_back(std::move(cvp));
|
||||
|
||||
Semver ver = get_version_from_json(vendor_root_json(system_dir, id));
|
||||
vendor_versions[id] = ver.valid() ? ver.to_string() : "";
|
||||
}
|
||||
|
||||
auto capture_col = [](const PresetCollection& coll, std::vector<CachedPreset>& out) {
|
||||
for (const Preset& p : coll()) {
|
||||
if (!p.is_system)
|
||||
continue;
|
||||
CachedPreset cp;
|
||||
cp.type = static_cast<int>(p.type);
|
||||
cp.name = p.name;
|
||||
cp.alias = p.alias;
|
||||
cp.file = p.file;
|
||||
cp.version = p.version.valid() ? p.version.to_string() : "";
|
||||
cp.vendor_id = (p.vendor != nullptr) ? p.vendor->id : "";
|
||||
cp.filament_id = p.filament_id;
|
||||
cp.setting_id = p.setting_id;
|
||||
cp.description = p.description;
|
||||
cp.renamed_from = p.renamed_from;
|
||||
cp.is_system = p.is_system;
|
||||
cp.is_visible = p.is_visible;
|
||||
cp.m_from_orca_filament_lib = p.m_from_orca_filament_lib;
|
||||
cp.config = p.config;
|
||||
out.push_back(std::move(cp));
|
||||
}
|
||||
};
|
||||
|
||||
capture_col(bundle.prints, print_presets);
|
||||
capture_col(bundle.filaments, filament_presets);
|
||||
capture_col(bundle.printers, printer_presets);
|
||||
capture_col(bundle.sla_prints, sla_print_presets);
|
||||
capture_col(bundle.sla_materials, sla_material_presets);
|
||||
}
|
||||
|
||||
void SystemPresetsCache::apply(PresetBundle& bundle) const
|
||||
{
|
||||
bundle.reset(false);
|
||||
|
||||
for (const auto& cvp : vendor_profiles) {
|
||||
VendorProfile vp(cvp.id);
|
||||
vp.name = cvp.name;
|
||||
vp.config_update_url = cvp.config_update_url;
|
||||
vp.changelog_url = cvp.changelog_url;
|
||||
if (!cvp.config_version.empty()) {
|
||||
auto v = Semver::parse(cvp.config_version);
|
||||
if (v) vp.config_version = *v;
|
||||
}
|
||||
|
||||
for (const auto& cm : cvp.models) {
|
||||
VendorProfile::PrinterModel model;
|
||||
model.id = cm.id;
|
||||
model.name = cm.name;
|
||||
model.model_id = cm.model_id;
|
||||
model.family = cm.family;
|
||||
model.technology = static_cast<PrinterTechnology>(cm.technology);
|
||||
for (const auto& v : cm.variants)
|
||||
model.variants.emplace_back(v.name);
|
||||
model.default_materials = cm.default_materials;
|
||||
model.not_support_bed_types = cm.not_support_bed_types;
|
||||
model.bed_model = cm.bed_model;
|
||||
model.bed_texture = cm.bed_texture;
|
||||
model.image_bed_type = cm.image_bed_type;
|
||||
model.bottom_texture_end_name = cm.bottom_texture_end_name;
|
||||
model.use_double_extruder_default_texture = cm.use_double_extruder_default_texture;
|
||||
model.bottom_texture_rect = cm.bottom_texture_rect;
|
||||
model.middle_texture_rect = cm.middle_texture_rect;
|
||||
model.hotend_model = cm.hotend_model;
|
||||
vp.models.push_back(std::move(model));
|
||||
}
|
||||
|
||||
for (const auto& f : cvp.default_filaments)
|
||||
vp.default_filaments.insert(f);
|
||||
for (const auto& m : cvp.default_sla_materials)
|
||||
vp.default_sla_materials.insert(m);
|
||||
|
||||
bundle.vendors.emplace(cvp.id, std::move(vp));
|
||||
}
|
||||
|
||||
auto apply_col = [&bundle](const std::vector<CachedPreset>& cached,
|
||||
PresetCollection& coll,
|
||||
bool is_filaments) {
|
||||
for (const auto& cp : cached) {
|
||||
Semver version;
|
||||
if (!cp.version.empty()) {
|
||||
auto v = Semver::parse(cp.version);
|
||||
if (v) version = *v;
|
||||
}
|
||||
DynamicPrintConfig config = cp.config;
|
||||
Preset& p = coll.load_preset(cp.file, cp.name, std::move(config), /*select=*/false, version);
|
||||
p.is_system = true;
|
||||
p.is_visible = cp.is_visible;
|
||||
p.alias = cp.alias;
|
||||
p.renamed_from = cp.renamed_from;
|
||||
p.filament_id = cp.filament_id;
|
||||
p.setting_id = cp.setting_id;
|
||||
p.description = cp.description;
|
||||
p.m_from_orca_filament_lib = cp.m_from_orca_filament_lib;
|
||||
|
||||
if (!cp.vendor_id.empty()) {
|
||||
auto it = bundle.vendors.find(cp.vendor_id);
|
||||
if (it != bundle.vendors.end())
|
||||
p.vendor = &it->second;
|
||||
}
|
||||
|
||||
if (is_filaments)
|
||||
coll.set_printer_hold_alias(p.alias, p);
|
||||
}
|
||||
};
|
||||
|
||||
apply_col(print_presets, bundle.prints, false);
|
||||
apply_col(filament_presets, bundle.filaments, true);
|
||||
apply_col(printer_presets, bundle.printers, false);
|
||||
apply_col(sla_print_presets, bundle.sla_prints, false);
|
||||
apply_col(sla_material_presets, bundle.sla_materials, false);
|
||||
|
||||
bundle.m_config_maps = config_maps;
|
||||
bundle.m_filament_id_maps = filament_id_maps;
|
||||
// Caller must invoke bundle.update_system_maps() after this (it is private to PresetBundle).
|
||||
}
|
||||
|
||||
bool SystemPresetsCache::load(const std::string& path)
|
||||
{
|
||||
return load_blob(path, *this);
|
||||
}
|
||||
|
||||
void SystemPresetsCache::save(const std::string& path) const
|
||||
{
|
||||
save_blob(path, *this);
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// PresetFileCache
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
std::string PresetFileCache::cache_path_for(const std::string& json_path)
|
||||
{
|
||||
boost::filesystem::path p(json_path);
|
||||
p.replace_extension(".cache");
|
||||
return p.string();
|
||||
}
|
||||
|
||||
bool PresetFileCache::is_valid(const std::string& json_path) const
|
||||
{
|
||||
if (format_version != FORMAT_VERSION)
|
||||
return false;
|
||||
if (config_options_count != print_config_def.options.size())
|
||||
return false;
|
||||
|
||||
namespace fs = boost::filesystem;
|
||||
const fs::path json(json_path);
|
||||
if (!fs::exists(json))
|
||||
return false;
|
||||
|
||||
int64_t cur_json_mtime = 0;
|
||||
try {
|
||||
cur_json_mtime = static_cast<int64_t>(fs::last_write_time(json));
|
||||
} catch (...) { return false; }
|
||||
if (json_mtime != cur_json_mtime)
|
||||
return false;
|
||||
|
||||
fs::path info = json;
|
||||
info.replace_extension(".info");
|
||||
int64_t cur_info_mtime = 0;
|
||||
if (fs::exists(info)) {
|
||||
try {
|
||||
cur_info_mtime = static_cast<int64_t>(fs::last_write_time(info));
|
||||
} catch (...) { return false; }
|
||||
}
|
||||
return info_mtime == cur_info_mtime;
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// preload_file_caches / update_file_caches
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
int preload_file_caches(PresetCollection& coll, const std::string& dir_path,
|
||||
const PresetOrigin& origin)
|
||||
{
|
||||
namespace fs = boost::filesystem;
|
||||
const fs::path dir(dir_path);
|
||||
if (!fs::exists(dir))
|
||||
return 0;
|
||||
|
||||
// Step 1: collect .json paths (fast, sequential).
|
||||
std::vector<std::string> json_paths;
|
||||
try {
|
||||
for (const auto& entry : fs::directory_iterator(dir)) {
|
||||
if (fs::is_regular_file(entry.path()) &&
|
||||
entry.path().extension().string() == ".json")
|
||||
json_paths.push_back(entry.path().string());
|
||||
}
|
||||
} catch (const std::exception& e) {
|
||||
BOOST_LOG_TRIVIAL(warning) << "PresetBundleCache: dir scan failed ("
|
||||
<< dir_path << "): " << e.what();
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Step 2: load + deserialize each .cache file in parallel.
|
||||
// Each slot is independent - no shared state touched here.
|
||||
struct LoadResult {
|
||||
std::string json_path;
|
||||
std::string canonical_name;
|
||||
PresetFileCache pfc;
|
||||
bool valid = false;
|
||||
};
|
||||
std::vector<LoadResult> results(json_paths.size());
|
||||
|
||||
tbb::parallel_for(tbb::blocked_range<size_t>(0, json_paths.size()),
|
||||
[&](const tbb::blocked_range<size_t>& range) {
|
||||
for (size_t i = range.begin(); i < range.end(); ++i) {
|
||||
const std::string& json_path = json_paths[i];
|
||||
const std::string cache_path = PresetFileCache::cache_path_for(json_path);
|
||||
|
||||
PresetFileCache pfc;
|
||||
if (!load_blob(cache_path, pfc) || !pfc.is_valid(json_path))
|
||||
continue;
|
||||
|
||||
const std::string stem = fs::path(json_path).stem().string();
|
||||
results[i].json_path = json_path;
|
||||
results[i].canonical_name = get_preset_canonical_name(stem, origin);
|
||||
results[i].pfc = std::move(pfc);
|
||||
results[i].valid = true;
|
||||
}
|
||||
});
|
||||
|
||||
// Step 3: sequential merge into the collection (load_preset uses a lock).
|
||||
const bool is_filaments = (coll.type() == Preset::TYPE_FILAMENT);
|
||||
int loaded = 0;
|
||||
for (auto& r : results) {
|
||||
if (!r.valid)
|
||||
continue;
|
||||
|
||||
Semver version;
|
||||
if (!r.pfc.preset.version.empty()) {
|
||||
auto v = Semver::parse(r.pfc.preset.version);
|
||||
if (v) version = *v;
|
||||
}
|
||||
|
||||
DynamicPrintConfig config = r.pfc.preset.config;
|
||||
Preset& p = coll.load_preset(r.json_path, r.canonical_name,
|
||||
std::move(config), /*select=*/false, version);
|
||||
p.is_system = false;
|
||||
p.is_visible = r.pfc.preset.is_visible;
|
||||
p.alias = r.pfc.preset.alias;
|
||||
p.filament_id = r.pfc.preset.filament_id;
|
||||
p.setting_id = r.pfc.preset.setting_id;
|
||||
p.description = r.pfc.preset.description;
|
||||
p.base_id = r.pfc.preset.base_id;
|
||||
p.user_id = r.pfc.preset.user_id;
|
||||
p.sync_info = r.pfc.preset.sync_info;
|
||||
p.updated_time = r.pfc.preset.updated_time;
|
||||
p.renamed_from = r.pfc.preset.renamed_from;
|
||||
p.bundle_id = origin.bundle_id;
|
||||
|
||||
if (is_filaments)
|
||||
coll.set_printer_hold_alias(p.alias, p);
|
||||
|
||||
++loaded;
|
||||
}
|
||||
return loaded;
|
||||
}
|
||||
|
||||
void update_file_caches(const PresetCollection& coll, const std::string& dir_path)
|
||||
{
|
||||
namespace fs = boost::filesystem;
|
||||
const std::string norm_dir = fs::path(dir_path).make_preferred().string();
|
||||
|
||||
// Step 1: collect candidate presets (sequential, fast).
|
||||
std::vector<const Preset*> candidates;
|
||||
for (const Preset& p : coll()) {
|
||||
if (p.is_system || p.is_default || p.file.empty())
|
||||
continue;
|
||||
const std::string norm_file = fs::path(p.file).make_preferred().string();
|
||||
if (norm_file.rfind(norm_dir, 0) != 0)
|
||||
continue;
|
||||
candidates.push_back(&p);
|
||||
}
|
||||
|
||||
// Step 2: check + write each .cache file in parallel.
|
||||
// Each write targets an independent file path - no shared state.
|
||||
tbb::parallel_for(tbb::blocked_range<size_t>(0, candidates.size()),
|
||||
[&](const tbb::blocked_range<size_t>& range) {
|
||||
for (size_t i = range.begin(); i < range.end(); ++i) {
|
||||
const Preset& p = *candidates[i];
|
||||
const std::string cache_path = PresetFileCache::cache_path_for(p.file);
|
||||
|
||||
PresetFileCache existing;
|
||||
if (load_blob(cache_path, existing) && existing.is_valid(p.file))
|
||||
continue;
|
||||
|
||||
PresetFileCache pfc;
|
||||
pfc.format_version = PresetFileCache::FORMAT_VERSION;
|
||||
pfc.config_options_count = print_config_def.options.size();
|
||||
|
||||
try {
|
||||
pfc.json_mtime = static_cast<int64_t>(
|
||||
fs::last_write_time(fs::path(p.file)));
|
||||
} catch (...) {}
|
||||
|
||||
fs::path info_path = fs::path(p.file);
|
||||
info_path.replace_extension(".info");
|
||||
if (fs::exists(info_path)) {
|
||||
try {
|
||||
pfc.info_mtime = static_cast<int64_t>(
|
||||
fs::last_write_time(info_path));
|
||||
} catch (...) {}
|
||||
}
|
||||
|
||||
CachedPreset& cp = pfc.preset;
|
||||
cp.type = static_cast<int>(p.type);
|
||||
cp.name = p.name;
|
||||
cp.alias = p.alias;
|
||||
cp.file = p.file;
|
||||
cp.version = p.version.valid() ? p.version.to_string() : "";
|
||||
cp.filament_id = p.filament_id;
|
||||
cp.setting_id = p.setting_id;
|
||||
cp.description = p.description;
|
||||
cp.base_id = p.base_id;
|
||||
cp.user_id = p.user_id;
|
||||
cp.sync_info = p.sync_info;
|
||||
cp.updated_time = p.updated_time;
|
||||
cp.renamed_from = p.renamed_from;
|
||||
cp.is_system = false;
|
||||
cp.is_visible = p.is_visible;
|
||||
cp.config = p.config;
|
||||
|
||||
save_blob(cache_path, pfc);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void write_file_cache(const Preset& preset)
|
||||
{
|
||||
if (preset.is_system || preset.is_default || preset.is_project_embedded || preset.file.empty())
|
||||
return;
|
||||
|
||||
namespace fs = boost::filesystem;
|
||||
const std::string cache_path = PresetFileCache::cache_path_for(preset.file);
|
||||
|
||||
PresetFileCache pfc;
|
||||
pfc.format_version = PresetFileCache::FORMAT_VERSION;
|
||||
pfc.config_options_count = print_config_def.options.size();
|
||||
|
||||
try {
|
||||
pfc.json_mtime = static_cast<int64_t>(fs::last_write_time(fs::path(preset.file)));
|
||||
} catch (...) {}
|
||||
|
||||
fs::path info_path = fs::path(preset.file);
|
||||
info_path.replace_extension(".info");
|
||||
if (fs::exists(info_path)) {
|
||||
try {
|
||||
pfc.info_mtime = static_cast<int64_t>(fs::last_write_time(info_path));
|
||||
} catch (...) {}
|
||||
}
|
||||
|
||||
CachedPreset& cp = pfc.preset;
|
||||
cp.type = static_cast<int>(preset.type);
|
||||
cp.name = preset.name;
|
||||
cp.alias = preset.alias;
|
||||
cp.file = preset.file;
|
||||
cp.version = preset.version.valid() ? preset.version.to_string() : "";
|
||||
cp.filament_id = preset.filament_id;
|
||||
cp.setting_id = preset.setting_id;
|
||||
cp.description = preset.description;
|
||||
cp.base_id = preset.base_id;
|
||||
cp.user_id = preset.user_id;
|
||||
cp.sync_info = preset.sync_info;
|
||||
cp.updated_time = preset.updated_time;
|
||||
cp.renamed_from = preset.renamed_from;
|
||||
cp.is_system = false;
|
||||
cp.is_visible = preset.is_visible;
|
||||
cp.config = preset.config;
|
||||
|
||||
save_blob(cache_path, pfc);
|
||||
}
|
||||
|
||||
} // namespace PresetBundleCache
|
||||
} // namespace Slic3r
|
||||
170
src/libslic3r/PresetBundleCache.hpp
Normal file
170
src/libslic3r/PresetBundleCache.hpp
Normal file
@@ -0,0 +1,170 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include <cereal/archives/binary.hpp>
|
||||
#include <cereal/cereal.hpp>
|
||||
#include <cereal/types/map.hpp>
|
||||
#include <cereal/types/polymorphic.hpp>
|
||||
#include <cereal/types/string.hpp>
|
||||
#include <cereal/types/vector.hpp>
|
||||
|
||||
#include "Preset.hpp"
|
||||
#include "PrintConfig.hpp"
|
||||
|
||||
namespace Slic3r {
|
||||
|
||||
class PresetBundle;
|
||||
|
||||
namespace PresetBundleCache {
|
||||
|
||||
// ---- Vendor profile structures ----
|
||||
|
||||
struct CachedPrinterVariant {
|
||||
std::string name;
|
||||
template<class Archive> void serialize(Archive& ar) { ar(name); }
|
||||
};
|
||||
|
||||
struct CachedPrinterModel {
|
||||
std::string id, name, model_id, family;
|
||||
int technology = 0; // PrinterTechnology enum
|
||||
std::vector<CachedPrinterVariant> variants;
|
||||
std::vector<std::string> default_materials;
|
||||
std::vector<std::string> not_support_bed_types;
|
||||
std::string bed_model, bed_texture, image_bed_type;
|
||||
std::string bottom_texture_end_name, use_double_extruder_default_texture;
|
||||
std::string bottom_texture_rect, middle_texture_rect, hotend_model;
|
||||
|
||||
template<class Archive>
|
||||
void serialize(Archive& ar)
|
||||
{
|
||||
ar(id, name, model_id, family, technology, variants, default_materials,
|
||||
not_support_bed_types, bed_model, bed_texture, image_bed_type,
|
||||
bottom_texture_end_name, use_double_extruder_default_texture,
|
||||
bottom_texture_rect, middle_texture_rect, hotend_model);
|
||||
}
|
||||
};
|
||||
|
||||
struct CachedVendorProfile {
|
||||
std::string id, name, config_version, config_update_url, changelog_url;
|
||||
std::vector<CachedPrinterModel> models;
|
||||
std::vector<std::string> default_filaments;
|
||||
std::vector<std::string> default_sla_materials;
|
||||
|
||||
template<class Archive>
|
||||
void serialize(Archive& ar)
|
||||
{
|
||||
ar(id, name, config_version, config_update_url, changelog_url,
|
||||
models, default_filaments, default_sla_materials);
|
||||
}
|
||||
};
|
||||
|
||||
// ---- Per-preset cache entry (shared by system and per-file caches) ----
|
||||
|
||||
struct CachedPreset {
|
||||
int type = 0; // Preset::Type
|
||||
std::string name, alias, file, version;
|
||||
std::string vendor_id; // reconstruct Preset::vendor pointer (system only)
|
||||
std::string filament_id, setting_id, description;
|
||||
std::string base_id, user_id, sync_info;
|
||||
long long updated_time = 0;
|
||||
std::vector<std::string> renamed_from;
|
||||
bool is_system = true;
|
||||
bool is_visible = true;
|
||||
bool m_from_orca_filament_lib = false;
|
||||
DynamicPrintConfig config;
|
||||
|
||||
template<class Archive>
|
||||
void serialize(Archive& ar)
|
||||
{
|
||||
ar(type, name, alias, file, version, vendor_id, filament_id, setting_id,
|
||||
description, base_id, user_id, sync_info, updated_time, renamed_from,
|
||||
is_system, is_visible, m_from_orca_filament_lib, config);
|
||||
}
|
||||
};
|
||||
|
||||
// ---- System preset cache ----
|
||||
// Stored next to vendor JSONs: <data_dir>/system/system_presets_cache.bin
|
||||
|
||||
struct SystemPresetsCache {
|
||||
static constexpr uint32_t FORMAT_VERSION = 2;
|
||||
|
||||
uint32_t format_version = FORMAT_VERSION;
|
||||
size_t config_options_count = 0;
|
||||
|
||||
std::map<std::string, std::string> vendor_versions;
|
||||
std::vector<CachedVendorProfile> vendor_profiles;
|
||||
|
||||
std::vector<CachedPreset> print_presets;
|
||||
std::vector<CachedPreset> filament_presets;
|
||||
std::vector<CachedPreset> printer_presets;
|
||||
std::vector<CachedPreset> sla_print_presets;
|
||||
std::vector<CachedPreset> sla_material_presets;
|
||||
|
||||
std::map<std::string, DynamicPrintConfig> config_maps;
|
||||
std::map<std::string, std::string> filament_id_maps;
|
||||
|
||||
template<class Archive>
|
||||
void serialize(Archive& ar)
|
||||
{
|
||||
ar(format_version, config_options_count, vendor_versions,
|
||||
vendor_profiles,
|
||||
print_presets, filament_presets, printer_presets,
|
||||
sla_print_presets, sla_material_presets,
|
||||
config_maps, filament_id_maps);
|
||||
}
|
||||
|
||||
static std::string cache_path();
|
||||
bool is_valid(const std::string& system_dir) const;
|
||||
void capture(const PresetBundle& bundle, const std::string& system_dir);
|
||||
void apply(PresetBundle& bundle) const;
|
||||
bool load(const std::string& path);
|
||||
void save(const std::string& path) const;
|
||||
};
|
||||
|
||||
// ---- Per-file preset cache ----
|
||||
// Each <name>.json gets a sibling <name>.cache file.
|
||||
// Invalidated when json or info mtime changes, or when the app binary changes.
|
||||
|
||||
struct PresetFileCache {
|
||||
static constexpr uint32_t FORMAT_VERSION = 1;
|
||||
|
||||
uint32_t format_version = FORMAT_VERSION;
|
||||
size_t config_options_count = 0;
|
||||
int64_t json_mtime = 0; // last_write_time of .json file
|
||||
int64_t info_mtime = 0; // last_write_time of .info file (0 = doesn't exist)
|
||||
CachedPreset preset;
|
||||
|
||||
template<class Archive>
|
||||
void serialize(Archive& ar)
|
||||
{
|
||||
ar(format_version, config_options_count, json_mtime, info_mtime, preset);
|
||||
}
|
||||
|
||||
// Returns the path of the .cache file sibling to json_path.
|
||||
static std::string cache_path_for(const std::string& json_path);
|
||||
|
||||
// Returns true when the stored mtimes still match the current filesystem state.
|
||||
bool is_valid(const std::string& json_path) const;
|
||||
};
|
||||
|
||||
// Pre-load cached presets from all valid .cache files found in dir_path.
|
||||
// Presets are inserted into coll via load_preset() so that a subsequent
|
||||
// load_presets() call will skip them. Returns the count of presets loaded.
|
||||
int preload_file_caches(PresetCollection& coll, const std::string& dir_path,
|
||||
const PresetOrigin& origin);
|
||||
|
||||
// Write (or overwrite) .cache files for presets in coll whose json .file is
|
||||
// inside dir_path and whose existing .cache (if any) is stale or missing.
|
||||
void update_file_caches(const PresetCollection& coll, const std::string& dir_path);
|
||||
|
||||
// Write (or overwrite) the .cache file for a single preset immediately after
|
||||
// its .json has been written to disk. Safe to call from Preset::save().
|
||||
// Does nothing for system, default, or project-embedded presets.
|
||||
void write_file_cache(const Preset& preset);
|
||||
|
||||
} // namespace PresetBundleCache
|
||||
} // namespace Slic3r
|
||||
@@ -807,8 +807,6 @@ wxAuiToolBarItem* BBLTopbar::FindToolByCurrentPosition()
|
||||
}
|
||||
|
||||
#ifdef __WXMSW__
|
||||
#include <windowsx.h>
|
||||
|
||||
WXLRESULT CenteredTitle::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
|
||||
{
|
||||
switch (nMsg) {
|
||||
@@ -825,8 +823,6 @@ WXLRESULT BBLTopbar::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam
|
||||
{
|
||||
switch (nMsg) {
|
||||
case WM_NCHITTEST: {
|
||||
m_last_mouse_position = ScreenToClient({GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)});
|
||||
|
||||
wxAuiToolBarItem* item = this->FindToolByCurrentPosition();
|
||||
if (item != NULL && item->GetWindow() != m_title_ctrl) {
|
||||
break;
|
||||
|
||||
@@ -2859,11 +2859,7 @@ bool GUI_App::on_init_inner()
|
||||
switch (dialog.ShowModal())
|
||||
{
|
||||
case wxID_YES:
|
||||
// Store builds get updates from the Microsoft Store, not the GitHub release page.
|
||||
if (is_running_in_msix())
|
||||
open_ms_store_product_page();
|
||||
else
|
||||
wxLaunchDefaultBrowser(version_info.url);
|
||||
wxLaunchDefaultBrowser(version_info.url);
|
||||
break;
|
||||
case wxID_NO:
|
||||
break;
|
||||
@@ -4944,7 +4940,6 @@ void GUI_App::on_http_error(wxCommandEvent &evt)
|
||||
// Parse the conflict body to extract the error code and server profile id
|
||||
int conflict_code = 0;
|
||||
std::string conflict_setting_id;
|
||||
std::string conflict_preset_name;
|
||||
try {
|
||||
json conflict_body = json::parse(body_str);
|
||||
if (conflict_body.contains("code"))
|
||||
@@ -4952,40 +4947,21 @@ void GUI_App::on_http_error(wxCommandEvent &evt)
|
||||
if (conflict_body.contains("server_profile") && conflict_body["server_profile"].contains("id")
|
||||
&& conflict_body["server_profile"]["id"].is_string())
|
||||
conflict_setting_id = conflict_body["server_profile"]["id"].get<std::string>();
|
||||
// The local preset name is injected into the conflict body by the agent (sync_push),
|
||||
// since the server response itself omits it for tombstone (-3) conflicts.
|
||||
if (conflict_body.contains("name") && conflict_body["name"].is_string())
|
||||
conflict_preset_name = conflict_body["name"].get<std::string>();
|
||||
} catch (...) {
|
||||
BOOST_LOG_TRIVIAL(warning) << "Failed to parse 409 conflict body.";
|
||||
}
|
||||
// Capture the user id up front so the force-push closure does not have to touch m_agent.
|
||||
std::string conflict_user_id = m_agent ? m_agent->get_user_id() : std::string();
|
||||
auto* plater = wxGetApp().plater();
|
||||
if (plater != nullptr && wxGetApp().imgui()->display_initialized()) {
|
||||
std::string text;
|
||||
|
||||
switch (conflict_code) {
|
||||
case -1:
|
||||
if (conflict_code == -1) {
|
||||
text = _u8L("Cloud sync conflict: this preset has a newer version in OrcaCloud.\n"
|
||||
"Pull downloads the cloud copy. Force push overwrites it with your local preset.");
|
||||
break;
|
||||
case -2:
|
||||
} else {
|
||||
text = _u8L("Cloud sync conflict: a preset with this name already exists in OrcaCloud.\n"
|
||||
"Pull downloads the cloud copy. Force push overwrites it with your local preset.");
|
||||
break;
|
||||
case -3:
|
||||
text = _u8L("Cloud sync conflict: a preset with the same name was previously deleted from the cloud.\n"
|
||||
"Delete will delete your local preset. Force push overwrites it with your local preset.");
|
||||
break;
|
||||
default:
|
||||
text = _u8L("Cloud sync conflict: there was an unexpected or unidentified preset conflict.\n"
|
||||
"Pull downloads the cloud copy. Force push overwrites it with your local preset.");
|
||||
break;
|
||||
};
|
||||
|
||||
}
|
||||
plater->get_notification_manager()->push_orca_sync_conflict_notification(
|
||||
text, conflict_code,
|
||||
text,
|
||||
[this](wxEvtHandler*) {
|
||||
// Runs on the GUI thread (on_http_error is a queued wx event); restart_sync_user_preset()
|
||||
// already joins the old sync thread off the UI thread, so no extra thread is needed here.
|
||||
@@ -4995,7 +4971,7 @@ void GUI_App::on_http_error(wxCommandEvent &evt)
|
||||
restart_sync_user_preset();
|
||||
return true;
|
||||
},
|
||||
[this, conflict_setting_id, conflict_preset_name, conflict_user_id](wxEvtHandler*) {
|
||||
[this, conflict_setting_id](wxEvtHandler*) {
|
||||
if (mainframe == nullptr)
|
||||
return false;
|
||||
MessageDialog
|
||||
@@ -5005,13 +4981,7 @@ void GUI_App::on_http_error(wxCommandEvent &evt)
|
||||
if (dlg.ShowModal() != wxID_YES)
|
||||
return false;
|
||||
|
||||
std::string setting_id = conflict_setting_id;
|
||||
if (setting_id.empty()) {
|
||||
setting_id = OrcaCloudServiceAgent::generate_uuid_for_setting_id(conflict_preset_name, conflict_user_id);
|
||||
BOOST_LOG_TRIVIAL(info) << "conflict setting id empty, generated one: " << setting_id;
|
||||
}
|
||||
|
||||
force_push_conflicting_preset(setting_id);
|
||||
force_push_conflicting_preset(conflict_setting_id);
|
||||
return true;
|
||||
});
|
||||
}
|
||||
@@ -7085,26 +7055,15 @@ void GUI_App::force_push_conflicting_preset(const std::string& setting_id)
|
||||
m_pending_conflict_setting_ids.push_back(setting_id);
|
||||
}
|
||||
|
||||
const std::string user_id = m_agent ? m_agent->get_user_id() : std::string();
|
||||
|
||||
// The 409 left this preset on "hold", which get_user_presets() skips. Restore it to
|
||||
// "update" so the next push-sync re-includes it and consumes the queued force flag.
|
||||
// (We must NOT pull from the cloud here as the Pull path does — that would overwrite
|
||||
// the local changes the user is trying to force-push.)
|
||||
// For a -3 tombstone on a newly created preset the on-disk setting_id is EMPTY (it only
|
||||
// gets assigned after a successful first push), so derive it on the fly from the preset
|
||||
// name and stamp it onto the preset — otherwise sync_with_lock's `id == preset.setting_id`
|
||||
// check never fires and the force-push silently no-ops.
|
||||
PresetCollection* collections[] = {&preset_bundle->prints, &preset_bundle->filaments, &preset_bundle->printers};
|
||||
for (PresetCollection* coll : collections) {
|
||||
for (const Preset& preset : coll->get_presets()) {
|
||||
if (preset.sync_info != "hold")
|
||||
continue;
|
||||
const std::string preset_id = preset.setting_id.empty()
|
||||
? OrcaCloudServiceAgent::generate_uuid_for_setting_id(preset.name, user_id)
|
||||
: preset.setting_id;
|
||||
if (preset_id == setting_id) {
|
||||
coll->set_sync_info_and_save(preset.name, setting_id, "update", 0);
|
||||
if (preset.setting_id == setting_id && preset.sync_info == "hold") {
|
||||
coll->set_sync_info_and_save(preset.name, preset.setting_id, "update", 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -9116,10 +9075,6 @@ static bool del_win_registry(HKEY hkeyHive, const wchar_t *pszVar, const wchar_t
|
||||
void GUI_App::associate_files(std::wstring extend)
|
||||
{
|
||||
#ifdef WIN32
|
||||
// MSIX: shell integration is declared in the package manifest; registry
|
||||
// writes from a packaged process are virtualized and invisible to the shell.
|
||||
if (is_running_in_msix())
|
||||
return;
|
||||
wchar_t app_path[MAX_PATH];
|
||||
::GetModuleFileNameW(nullptr, app_path, sizeof(app_path));
|
||||
|
||||
@@ -9145,8 +9100,6 @@ void GUI_App::associate_files(std::wstring extend)
|
||||
void GUI_App::disassociate_files(std::wstring extend)
|
||||
{
|
||||
#ifdef WIN32
|
||||
if (is_running_in_msix())
|
||||
return;
|
||||
wchar_t app_path[MAX_PATH];
|
||||
::GetModuleFileNameW(nullptr, app_path, sizeof(app_path));
|
||||
|
||||
@@ -9198,8 +9151,6 @@ bool GUI_App::check_url_association(std::wstring url_prefix, std::wstring& reg_b
|
||||
void GUI_App::associate_url(std::wstring url_prefix)
|
||||
{
|
||||
#ifdef WIN32
|
||||
if (is_running_in_msix())
|
||||
return;
|
||||
boost::filesystem::path binary_path(boost::filesystem::canonical(boost::dll::program_location()));
|
||||
wxString wbinary = from_path(binary_path);
|
||||
BOOST_LOG_TRIVIAL(info) << "Downloader registration: Path of binary: " << wbinary.ToUTF8().data();
|
||||
@@ -9225,8 +9176,6 @@ void GUI_App::associate_url(std::wstring url_prefix)
|
||||
void GUI_App::disassociate_url(std::wstring url_prefix)
|
||||
{
|
||||
#ifdef WIN32
|
||||
if (is_running_in_msix())
|
||||
return;
|
||||
wxRegKey key_full(wxRegKey::HKCU, "Software\\Classes\\" + url_prefix + "\\shell\\open\\command");
|
||||
if (!key_full.Exists()) {
|
||||
return;
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
#include <wx/font.h>
|
||||
#include <wx/fontutil.h>
|
||||
#include <wx/display.h>
|
||||
#include <wx/utils.h>
|
||||
|
||||
#include "libslic3r/Config.hpp"
|
||||
|
||||
@@ -172,42 +171,6 @@ template<class F> typename F::FN winapi_get_function(const wchar_t *dll, const c
|
||||
}
|
||||
#endif
|
||||
|
||||
bool is_running_in_msix()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
// The package identity APIs are Win8+ - resolved dynamically so the exe still loads on Win7
|
||||
// (same treatment as the DPI APIs below). Null-buffer probe: returns ERROR_INSUFFICIENT_BUFFER
|
||||
// when packaged, APPMODEL_ERROR_NO_PACKAGE when running unpackaged.
|
||||
struct GetCurrentPackageFullName_t { typedef LONG (WINAPI *FN)(UINT32 *length, PWSTR full_name); };
|
||||
static const bool packaged = []() {
|
||||
auto fn = winapi_get_function<GetCurrentPackageFullName_t>(L"Kernel32.dll", "GetCurrentPackageFullName");
|
||||
UINT32 length = 0;
|
||||
return fn != nullptr && fn(&length, nullptr) != APPMODEL_ERROR_NO_PACKAGE;
|
||||
}();
|
||||
return packaged;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
void open_ms_store_product_page()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
struct GetCurrentPackageFamilyName_t { typedef LONG (WINAPI *FN)(UINT32 *length, PWSTR family_name); };
|
||||
static auto fn = winapi_get_function<GetCurrentPackageFamilyName_t>(L"Kernel32.dll", "GetCurrentPackageFamilyName");
|
||||
if (fn == nullptr)
|
||||
return;
|
||||
UINT32 length = 0;
|
||||
if (fn(&length, nullptr) != ERROR_INSUFFICIENT_BUFFER)
|
||||
return;
|
||||
std::wstring family_name(length, L'\0');
|
||||
if (fn(&length, family_name.data()) != ERROR_SUCCESS)
|
||||
return;
|
||||
family_name.resize(length > 0 ? length - 1 : 0); // drop the terminating null
|
||||
wxLaunchDefaultBrowser(wxString(L"ms-windows-store://pdp/?PFN=") + family_name.c_str());
|
||||
#endif
|
||||
}
|
||||
|
||||
// If called with nullptr, a DPI for the primary monitor is returned.
|
||||
int get_dpi_for_window(const wxWindow *window)
|
||||
{
|
||||
|
||||
@@ -67,10 +67,6 @@ wxDECLARE_EVENT(EVT_VOLUME_DETACHED, VolumeDetachedEvent);
|
||||
|
||||
wxTopLevelWindow* find_toplevel_parent(wxWindow *window);
|
||||
wxString format_nozzle_diameter(float diameter);
|
||||
// True when running inside an MSIX package (Microsoft Store build); always false on non-Windows.
|
||||
bool is_running_in_msix();
|
||||
// Opens the Microsoft Store product page for the current package. No-op when not packaged.
|
||||
void open_ms_store_product_page();
|
||||
|
||||
void on_window_geometry(wxTopLevelWindow *tlw, std::function<void()> callback);
|
||||
|
||||
|
||||
@@ -2416,7 +2416,7 @@ void NotificationManager::OrcaSyncConflictNotification::render_text(ImGuiWrapper
|
||||
}
|
||||
|
||||
const float action_y = starting_y + m_endlines.size() * shift_y;
|
||||
const std::string pull_text = conflict_code == -3 ? _u8L("Delete") : _u8L("Pull");
|
||||
const std::string pull_text = _u8L("Pull");
|
||||
render_hyperlink_action(imgui, x_offset, action_y, pull_text, "##orca_sync_pull",
|
||||
[this] { if (m_pull_callback && m_pull_callback(m_evt_handler)) close(); });
|
||||
if (m_force_push_callback) {
|
||||
@@ -2437,14 +2437,13 @@ void NotificationManager::push_shared_profiles_notification(const std::string& e
|
||||
}
|
||||
|
||||
void NotificationManager::push_orca_sync_conflict_notification(const std::string& text,
|
||||
int conflict_code,
|
||||
std::function<bool(wxEvtHandler*)> pull_callback,
|
||||
std::function<bool(wxEvtHandler*)> force_push_callback)
|
||||
{
|
||||
close_notification_of_type(NotificationType::OrcaSyncConflict);
|
||||
NotificationData data{ NotificationType::OrcaSyncConflict, NotificationLevel::WarningNotificationLevel, 0, text };
|
||||
push_notification_data(std::make_unique<NotificationManager::OrcaSyncConflictNotification>(
|
||||
data, m_id_provider, m_evt_handler, std::move(pull_callback), std::move(force_push_callback), conflict_code), 0);
|
||||
data, m_id_provider, m_evt_handler, std::move(pull_callback), std::move(force_push_callback)), 0);
|
||||
}
|
||||
|
||||
void NotificationManager::push_download_URL_progress_notification(size_t id, const std::string& text, std::function<bool(DownloaderUserAction, int)> user_action_callback)
|
||||
|
||||
@@ -279,7 +279,6 @@ public:
|
||||
// Shared profiles available for selected printer
|
||||
void push_shared_profiles_notification(const std::string& explore_url);
|
||||
void push_orca_sync_conflict_notification(const std::string& text,
|
||||
int conflict_code,
|
||||
std::function<bool(wxEvtHandler*)> pull_callback,
|
||||
std::function<bool(wxEvtHandler*)> force_push_callback);
|
||||
|
||||
@@ -906,12 +905,10 @@ private:
|
||||
public:
|
||||
OrcaSyncConflictNotification(const NotificationData& n, NotificationIDProvider& id_provider, wxEvtHandler* evt_handler,
|
||||
std::function<bool(wxEvtHandler*)> pull_callback,
|
||||
std::function<bool(wxEvtHandler*)> force_push_callback,
|
||||
int conflict_code)
|
||||
std::function<bool(wxEvtHandler*)> force_push_callback)
|
||||
: PopNotification(n, id_provider, evt_handler)
|
||||
, m_pull_callback(std::move(pull_callback))
|
||||
, m_force_push_callback(std::move(force_push_callback))
|
||||
, conflict_code(conflict_code)
|
||||
{
|
||||
m_multiline = true;
|
||||
}
|
||||
@@ -923,7 +920,6 @@ private:
|
||||
|
||||
std::function<bool(wxEvtHandler*)> m_pull_callback;
|
||||
std::function<bool(wxEvtHandler*)> m_force_push_callback;
|
||||
int conflict_code;
|
||||
};
|
||||
class SlicingProgressNotification;
|
||||
|
||||
|
||||
@@ -1846,26 +1846,6 @@ void PreferencesDialog::create_items()
|
||||
//// ASSOCIATE TAB
|
||||
/////////////////////////////////////
|
||||
#ifdef _WIN32
|
||||
// MSIX: associations are declared in the package manifest and defaults are
|
||||
// managed by Windows Settings; the runtime registry toggles below cannot work.
|
||||
// Show a minimal page that sends the user to Windows' Default Apps settings instead.
|
||||
if (is_running_in_msix()) {
|
||||
m_pref_tabs->AppendItem(_L("Associate"));
|
||||
f_sizers.push_back(new wxFlexGridSizer(1, 1, v_gap, 0));
|
||||
g_sizer = f_sizers.back();
|
||||
g_sizer->AddGrowableCol(0, 1);
|
||||
|
||||
g_sizer->Add(create_item_title(_L("Associate files to OrcaSlicer")), 1, wxEXPAND);
|
||||
|
||||
auto item_open_default_apps = create_item_button(
|
||||
_L("File associations for the Microsoft Store version are managed by Windows Settings."),
|
||||
_L("Open Windows Default Apps Settings"), "", "",
|
||||
[]() { wxLaunchDefaultBrowser("ms-settings:defaultapps"); });
|
||||
g_sizer->Add(item_open_default_apps);
|
||||
|
||||
g_sizer->AddSpacer(FromDIP(10));
|
||||
sizer_page->Add(g_sizer, 0, wxEXPAND);
|
||||
} else {
|
||||
m_pref_tabs->AppendItem(_L("Associate"));
|
||||
f_sizers.push_back(new wxFlexGridSizer(1, 1, v_gap, 0));
|
||||
g_sizer = f_sizers.back();
|
||||
@@ -1900,7 +1880,6 @@ void PreferencesDialog::create_items()
|
||||
|
||||
g_sizer->AddSpacer(FromDIP(10));
|
||||
sizer_page->Add(g_sizer, 0, wxEXPAND);
|
||||
}
|
||||
#endif // _WIN32
|
||||
|
||||
//////////////////////////
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
#include "libslic3r/Thread.hpp"
|
||||
#include "GUI.hpp"
|
||||
#include "GUI_App.hpp"
|
||||
#include "GUI_Utils.hpp"
|
||||
#include "GUI_Preview.hpp"
|
||||
#include "MainFrame.hpp"
|
||||
#include "format.hpp"
|
||||
@@ -253,9 +252,7 @@ UpdateVersionDialog::UpdateVersionDialog(wxWindow *parent)
|
||||
m_text_up_info = new Label(this, Label::Head_14, wxEmptyString, LB_AUTO_WRAP);
|
||||
m_text_up_info->SetForegroundColour(wxColour(0x26, 0x2E, 0x30));
|
||||
|
||||
// Store builds get updates from the Microsoft Store: wxID_YES opens the Store
|
||||
// product page there (see the EVT_SLIC3R_VERSION_ONLINE handler) instead of GitHub.
|
||||
auto github_link = new HyperLink(this, is_running_in_msix() ? _L("Check on Microsoft Store") : _L("Check on Github"), "", LB_AUTO_WRAP);
|
||||
auto github_link = new HyperLink(this, _L("Check on Github"), "", LB_AUTO_WRAP);
|
||||
github_link->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent &e) {
|
||||
EndModal(wxID_YES);
|
||||
});
|
||||
@@ -305,7 +302,7 @@ UpdateVersionDialog::UpdateVersionDialog(wxWindow *parent)
|
||||
|
||||
auto sizer_button = new wxBoxSizer(wxHORIZONTAL);
|
||||
|
||||
m_button_download = new Button(this, is_running_in_msix() ? _L("Open Microsoft Store") : _L("Download"));
|
||||
m_button_download = new Button(this, _L("Download"));
|
||||
m_button_download->SetStyle(ButtonStyle::Confirm, ButtonType::Choice);
|
||||
|
||||
m_button_download->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent &e) {
|
||||
@@ -482,10 +479,7 @@ void UpdateVersionDialog::update_version_info(wxString release_note, wxString ve
|
||||
// else {
|
||||
//m_simplebook_release_note->SetMaxSize(wxSize(FromDIP(560), FromDIP(430)));
|
||||
m_simplebook_release_note->SetSelection(1);
|
||||
if (is_running_in_msix())
|
||||
m_text_up_info->SetLabel(wxString::Format(_L("New version available: %s. Please update OrcaSlicer from the Microsoft Store."), version));
|
||||
else
|
||||
m_text_up_info->SetLabel(wxString::Format(_L("Click to download new version in default browser: %s"), version));
|
||||
m_text_up_info->SetLabel(wxString::Format(_L("Click to download new version in default browser: %s"), version));
|
||||
auto data_buf_in = release_note.utf8_str();
|
||||
auto bg_color = StateColor::darkModeColorFor(wxColour("#FFFFFF")).GetAsString();
|
||||
auto fg_color = StateColor::darkModeColorFor(wxColour("#262E30")).GetAsString();
|
||||
|
||||
@@ -101,6 +101,24 @@ std::string resolve_display_name(
|
||||
return username;
|
||||
}
|
||||
|
||||
std::string generate_uuid_for_setting_id(const std::string& name, const std::string& user_id = "")
|
||||
{
|
||||
if (name.empty()) {
|
||||
return "";
|
||||
}
|
||||
|
||||
// Mix user_id into the hashed input so two different users generating a setting_id
|
||||
// for an identically-named preset get distinct UUIDs. Without this, the cloud's ID
|
||||
// space collides across accounts and the second user's create gets HTTP 409 with
|
||||
// server_profile=null on every sync (the foreign owner's record is not exposed).
|
||||
static const boost::uuids::uuid orca_namespace =
|
||||
boost::uuids::string_generator()("f47ac10b-58cc-4372-a567-0e02b2c3d479");
|
||||
|
||||
boost::uuids::name_generator_sha1 gen(orca_namespace);
|
||||
boost::uuids::uuid id = user_id.empty() ? gen(name) : gen(user_id + "/" + name);
|
||||
return boost::uuids::to_string(id);
|
||||
}
|
||||
|
||||
std::string base64url_encode(const std::vector<unsigned char>& data)
|
||||
{
|
||||
std::string out;
|
||||
@@ -394,24 +412,6 @@ OrcaCloudServiceAgent::~OrcaCloudServiceAgent()
|
||||
}
|
||||
}
|
||||
|
||||
std::string OrcaCloudServiceAgent::generate_uuid_for_setting_id(const std::string& name, const std::string& user_id)
|
||||
{
|
||||
if (name.empty()) {
|
||||
return "";
|
||||
}
|
||||
|
||||
// Mix user_id into the hashed input so two different users generating a setting_id
|
||||
// for an identically-named preset get distinct UUIDs. Without this, the cloud's ID
|
||||
// space collides across accounts and the second user's create gets HTTP 409 with
|
||||
// server_profile=null on every sync (the foreign owner's record is not exposed).
|
||||
static const boost::uuids::uuid orca_namespace =
|
||||
boost::uuids::string_generator()("f47ac10b-58cc-4372-a567-0e02b2c3d479");
|
||||
|
||||
boost::uuids::name_generator_sha1 gen(orca_namespace);
|
||||
boost::uuids::uuid id = user_id.empty() ? gen(name) : gen(user_id + "/" + name);
|
||||
return boost::uuids::to_string(id);
|
||||
}
|
||||
|
||||
void OrcaCloudServiceAgent::configure_urls(AppConfig* app_config)
|
||||
{
|
||||
if (!app_config) return;
|
||||
@@ -1250,10 +1250,8 @@ SyncPushResult OrcaCloudServiceAgent::sync_push(const std::string& profile_id,
|
||||
|
||||
if (http_code == 409) {
|
||||
// Conflict - parse server version
|
||||
nlohmann::json err_body;
|
||||
try {
|
||||
auto json = nlohmann::json::parse(response);
|
||||
err_body = json;
|
||||
if (json.is_null()) {
|
||||
result.server_deleted = true;
|
||||
} else {
|
||||
@@ -1263,13 +1261,6 @@ SyncPushResult OrcaCloudServiceAgent::sync_push(const std::string& profile_id,
|
||||
result.server_version.updated_time = profile_data.value(ORCA_JSON_KEY_UPDATE_TIME, 0);
|
||||
}
|
||||
} catch (...) {}
|
||||
// Surface the conflict via the http-error callback with the local preset name injected.
|
||||
// The raw server body omits the name for tombstone (-3) conflicts (server_profile is null),
|
||||
// but the GUI needs it to regenerate the deterministic setting_id for a force push.
|
||||
if (!err_body.is_object())
|
||||
err_body = nlohmann::json::object();
|
||||
err_body["name"] = name;
|
||||
invoke_http_error_callback(409, err_body.dump());
|
||||
result.error_message = response;
|
||||
return result;
|
||||
}
|
||||
@@ -1946,10 +1937,7 @@ int OrcaCloudServiceAgent::http_post(const std::string& path, const std::string&
|
||||
if (response_body) *response_body = res.body;
|
||||
if (http_code) *http_code = res.status;
|
||||
|
||||
// 409 is a push-only domain conflict; sync_push re-fires the error callback with the
|
||||
// local preset name injected (the raw server body omits it for tombstone conflicts),
|
||||
// so skip the generic nameless auto-fire here to avoid a duplicate, nameless event.
|
||||
if (!suppress && (!res.success || res.status >= 400) && res.status != 409) {
|
||||
if (!suppress && (!res.success || res.status >= 400)) {
|
||||
invoke_http_error_callback(res.status, res.body);
|
||||
}
|
||||
|
||||
|
||||
@@ -300,8 +300,6 @@ public:
|
||||
bool set_user_session(const nlohmann::json& session_json, bool notify_login = true);
|
||||
void clear_session();
|
||||
|
||||
static std::string generate_uuid_for_setting_id(const std::string& name, const std::string& user_id = "");
|
||||
|
||||
private:
|
||||
// Sync protocol helpers
|
||||
int sync_pull(
|
||||
|
||||
@@ -7,7 +7,7 @@ set(SLIC3R_APP_KEY "OrcaSlicer")
|
||||
if(NOT DEFINED BBL_INTERNAL_TESTING)
|
||||
set(BBL_INTERNAL_TESTING "0")
|
||||
endif()
|
||||
set(SoftFever_VERSION "2.4.0-beta")
|
||||
set(SoftFever_VERSION "2.4.0-dev")
|
||||
string(REGEX MATCH "^([0-9]+)\\.([0-9]+)\\.([0-9]+)"
|
||||
SoftFever_VERSION_MATCH ${SoftFever_VERSION})
|
||||
set(ORCA_VERSION_MAJOR ${CMAKE_MATCH_1})
|
||||
|
||||
Reference in New Issue
Block a user