Compare commits

..

1 Commits

Author SHA1 Message Date
ExPikaPaka
604f15e20d Add caching system for presets 2026-06-11 08:52:44 +02:00
95 changed files with 1058 additions and 767 deletions

View File

@@ -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:

View File

@@ -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

View File

@@ -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_*' \

View File

@@ -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."

View File

@@ -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": [

View File

@@ -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": [

View File

@@ -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": [

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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": [

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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",

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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",

View File

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

View File

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

View File

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

View File

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

View File

@@ -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",

View File

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

View File

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

View File

@@ -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",

View File

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

View File

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

View File

@@ -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": [

View File

@@ -5,7 +5,6 @@
"from": "system",
"setting_id": "OEABSS00",
"instantiation": "true",
"renamed_from": "Elegoo ABS",
"fan_max_speed": [
"40"
],

View File

@@ -5,7 +5,6 @@
"from": "system",
"setting_id": "OEASACFS00",
"instantiation": "true",
"renamed_from": "Elegoo ASA-CF",
"pressure_advance": [
"0.04"
],

View File

@@ -5,7 +5,6 @@
"from": "system",
"setting_id": "OEPAHTCFS00",
"instantiation": "true",
"renamed_from": "Elegoo PAHT-CF",
"close_fan_the_first_x_layers": [
"3"
],

View File

@@ -5,7 +5,6 @@
"from": "system",
"setting_id": "OEPCS00",
"instantiation": "true",
"renamed_from": "Elegoo PC",
"pressure_advance": [
"0.052"
],

View File

@@ -5,7 +5,6 @@
"from": "system",
"setting_id": "OEPCFRS00",
"instantiation": "true",
"renamed_from": "Elegoo PC-FR",
"pressure_advance": [
"0.05"
],

View File

@@ -5,7 +5,6 @@
"from": "system",
"setting_id": "OEPETCFS00",
"instantiation": "true",
"renamed_from": "Elegoo PET-CF",
"pressure_advance": [
"0.05"
],

View File

@@ -5,7 +5,6 @@
"from": "system",
"setting_id": "OEPETGS00",
"instantiation": "true",
"renamed_from": "Elegoo PETG",
"pressure_advance": [
"0.05"
],

View File

@@ -5,7 +5,6 @@
"from": "system",
"setting_id": "OERPETGHFS00",
"instantiation": "true",
"renamed_from": "Elegoo PETG HF",
"pressure_advance": [
"0.052"
],

View File

@@ -5,7 +5,6 @@
"from": "system",
"setting_id": "OEPETGTRANSS00",
"instantiation": "true",
"renamed_from": "Elegoo PETG Translucent",
"pressure_advance": [
"0.052"
],

View File

@@ -5,7 +5,6 @@
"from": "system",
"setting_id": "OEPETGCFS00",
"instantiation": "true",
"renamed_from": "Elegoo PETG-CF",
"pressure_advance": [
"0.052"
],

View File

@@ -5,7 +5,6 @@
"from": "system",
"setting_id": "OEPETGFS00",
"instantiation": "true",
"renamed_from": "Elegoo PETG-GF",
"pressure_advance": [
"0.052"
],

View File

@@ -5,7 +5,6 @@
"from": "system",
"setting_id": "OEPLABASICS00",
"instantiation": "true",
"renamed_from": "Elegoo PLA Basic",
"nozzle_temperature": [
"220"
],

View File

@@ -5,7 +5,6 @@
"from": "system",
"setting_id": "OEPLAGALAXYS00",
"instantiation": "true",
"renamed_from": "Elegoo PLA Galaxy",
"fan_min_speed": [
"80"
],

View File

@@ -5,7 +5,6 @@
"from": "system",
"setting_id": "OEPLAGLOWS00",
"instantiation": "true",
"renamed_from": "Elegoo PLA Glow",
"pressure_advance": [
"0.04"
],

View File

@@ -5,7 +5,6 @@
"from": "system",
"setting_id": "OEPLAMARBLES00",
"instantiation": "true",
"renamed_from": "Elegoo PLA Marble",
"fan_min_speed": [
"80"
],

View File

@@ -5,7 +5,6 @@
"from": "system",
"setting_id": "OEPLASPARKLES00",
"instantiation": "true",
"renamed_from": "Elegoo PLA Sparkle",
"fan_min_speed": [
"80"
],

View File

@@ -5,7 +5,6 @@
"from": "system",
"setting_id": "OEPLATRA2S00",
"instantiation": "true",
"renamed_from": "Elegoo PLA Translucent2",
"pressure_advance": [
"0.04"
],

View File

@@ -5,7 +5,6 @@
"from": "system",
"setting_id": "OEPLAWOODS00",
"instantiation": "true",
"renamed_from": "Elegoo PLA Wood",
"fan_min_speed": [
"80"
],

View File

@@ -5,7 +5,6 @@
"from": "system",
"setting_id": "OERTPU95AS00",
"instantiation": "true",
"renamed_from": "Elegoo Rapid TPU 95A",
"pressure_advance": [
"0.1"
],

View File

@@ -5,7 +5,6 @@
"from": "system",
"setting_id": "OETPU95AS00",
"instantiation": "true",
"renamed_from": "Elegoo TPU 95A",
"filament_max_volumetric_speed": [
"3.2"
],

View File

@@ -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>

View File

@@ -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

View File

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

View File

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

View File

@@ -344,6 +344,8 @@ set(lisbslic3r_sources
Polyline.hpp
PresetBundle.cpp
PresetBundle.hpp
PresetBundleCache.cpp
PresetBundleCache.hpp
Preset.cpp
Preset.hpp
PrincipalComponents2D.cpp

View File

@@ -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)

View File

@@ -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);

View 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

View 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

View File

@@ -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;

View File

@@ -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;

View File

@@ -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)
{

View File

@@ -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);

View File

@@ -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)

View File

@@ -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;

View File

@@ -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
//////////////////////////

View File

@@ -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();

View File

@@ -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);
}

View File

@@ -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(

View File

@@ -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})