Compare commits

...

222 Commits

Author SHA1 Message Date
Erwan MATHIEU
c726d61086 Disable nightly builds
They don't properly work since the conan2 migration, and it seems nobody is actually using them anymore, so deactivating them for now, and will reactivate when we have fixed the conan packages versions issues.
2025-05-23 10:07:02 +02:00
HellAholic
43a055cfd5
Merge pull request #20482 from GregValiant/PurgeLinesUpdate
Update PurgeLinesAndUnload.py
2025-05-07 20:33:34 +02:00
HellAholic
e3605dbb34
Merge pull request #20556 from Ultimaker/CURA-12465_UpdateSlicingCrash
Updated Slicing Crash issue
2025-05-07 11:13:02 +02:00
HellAholic
50a852a373
Merge pull request #20563 from Ultimaker/CURA-12074_introduce-bambu-printers
CURA-12074 introduce bambu printers
2025-05-02 13:08:46 +02:00
HellAholic
9a8b33b609
Merge pull request #20562 from Ultimaker/CURA-12512_more_aux_fan_ctrl
[CURA-12512] Add speed settings for auxilary ('build volume') fan.
2025-05-02 13:04:04 +02:00
HellAholic
ba5795eb74 Limit extruders for MVP 2025-05-02 10:09:02 +02:00
Mariska
4e1a11c729
Update SlicingCrash.yaml
Add reference to meshtools plugin
2025-05-01 13:25:11 +02:00
Remco Burema
3fecc27720 Update build-volume fan-speed descriptions.
part of CURA-12512
2025-04-30 08:09:17 +02:00
wawanbreton
aefa40d386 Apply printer-linter format 2025-04-29 13:51:29 +00:00
Erwan MATHIEU
d1a31b4e5b Move printer specific settings to global definition
CURA-12101
There is a specific unit test that disallows custom settings in printer definitions, so this looks like the proper way of doing it. New settings are disabled by default so should be visible only for the printer that explicitly sets them enabled.
2025-04-29 15:45:10 +02:00
Erwan MATHIEU
8a2cbb6752 Fix wrong used settings
CURA-12057
2025-04-29 15:21:47 +02:00
Erwan MATHIEU
80a48e2677 Merge branch 'CURA-12101_introduce-x1' into CURA-12074_introduce-bambu-printers 2025-04-29 14:04:59 +02:00
Erwan MATHIEU
7491ea0f44 Merge branch 'CURA-12346_introduce-a1-and-a1mini' into CURA-12074_introduce-bambu-printers 2025-04-29 14:04:48 +02:00
Remco Burema
22971f984b Update description Build _Volume_ Fan.
'Build Fan' doesn't make that much sense.

done as part of CURA-12512
2025-04-29 13:58:56 +02:00
Remco Burema
eeaadbc071 Add speed settings for auxilary ('build volume') fan.
Previously you could only set on/off starting on a certain layer.

CURA-12512
2025-04-29 13:57:06 +02:00
Erwan MATHIEU
b482f127e3 Merge remote-tracking branch 'origin/CURA-12074_introduce-bambu-printers' into CURA-12099_export-and-import-to-bambu-3mf 2025-04-29 13:39:40 +02:00
Erwan MATHIEU
01c048b55a
Merge branch 'CURA-12074_introduce-bambu-printers' into CURA-12346_introduce-a1-and-a1mini 2025-04-29 13:38:23 +02:00
Erwan MATHIEU
83d8c9f108 Merge remote-tracking branch 'origin/CURA-12074_introduce-bambu-printers' into CURA-12101_introduce-x1 2025-04-29 13:36:51 +02:00
Erwan MATHIEU
5c51be4d3a Merge remote-tracking branch 'origin/main' into CURA-12074_introduce-bambu-printers 2025-04-29 13:35:46 +02:00
Erwan MATHIEU
6d4377e056 Add disallowed area and reduce printable area
CURA-12101
The disallowed area is the place where the print head goes to cut the filament, so it must really be avoided. On other models this place is outside the build area.
I also reduced the printable size, otherwise the head would sometimes bump into the borders and gets shifted.
2025-04-29 13:19:12 +02:00
Erwan MATHIEU
d2e625edb3 Export project settings into BambuLab 3MF
CURA-12101
The printer parses the machine_start_gcode to allow selecting the filaments mapping at start time, without it the user has to set the filaments in fixed order. This is probably a security to ensure the proper filament is loaded at start.
2025-04-29 11:28:56 +02:00
Erwan MATHIEU
52be6f3d2d Merge remote-tracking branch 'origin/CURA-12099_export-and-import-to-bambu-3mf' into CURA-12101_introduce-x1 2025-04-29 10:22:57 +02:00
Erwan MATHIEU
74f8a2da6e Basically working X1 profile
CURA-12101
2025-04-29 10:18:13 +02:00
Remco Burema
3e25b4ff9a Merge remote-tracking branch 'origin/main' into CURA-12099_export-and-import-to-bambu-3mf 2025-04-29 09:59:16 +02:00
Remco Burema
46216e1282 Renamed confusing 'Default' variant class to 'Cura3mf'.
result of code review of CURA-12099
2025-04-29 09:25:19 +02:00
MariMakes
4f36f980e1 Updated Slicing Crash issue
Contributes to CURA-12465, this should help with getting more focus in the input we are receiving from the slicing crashes. The old one was a bit outdated.
2025-04-28 16:08:26 +02:00
HellAholic
a90b7fb59b
Merge pull request #20467 from Ultimaker/CURA-12156_dont_zip_downloadable_plugins
[CURA-12156] Don't zip re-downloadable plugins.
2025-04-28 13:55:45 +02:00
Erwan MATHIEU
603df28c2a Fix all exporters being broken
CURA-12099
2025-04-28 13:37:14 +02:00
Erwan MATHIEU
9b4816f937 Custom start music
CURA-12346
2025-04-28 13:05:52 +02:00
Erwan MATHIEU
312407e9b8 Adjustments for A1 and start working on X1
CURA-12346
2025-04-28 10:16:57 +02:00
Remco Burema
371f280ab8 Add newlines to the end of new files.
done as part of CURA-12099
2025-04-24 15:13:24 +02:00
Remco Burema
254087cb45 Split-out bambu-specific elements to their own 3MF 'variant'.
part of CURA-12099
2025-04-24 15:10:19 +02:00
Erwan MATHIEU
17ab7a4890 Bump pySavitar version
CURA-12099
2025-04-24 09:55:23 +02:00
Erwan MATHIEU
4ff70ac46f Fix exporting Bambu 3mf format to removable drive
CURA-12099
2025-04-24 09:23:27 +02:00
Remco Burema
9b10467f3e Probably 'open as model' should not apply if the 3mf isn't a project file.
This would cause the 3MF projects from other vendors, which isn't a 'project' to us in the sense that it isn't a Cura project, to have their models 'arranged', unless the file was opened via 'recent files', in which case the open mode was set to always ask instead.

done as part of CURA-12099
2025-04-23 16:22:32 +02:00
HellAholic
8bc9f1cbfa
Merge pull request #20446 from Ultimaker/CURA-12502_unfolderize_win_startmenu
[CURA-12502] Unfolderize Windows Start-Menu
2025-04-23 11:30:26 +02:00
Remco Burema
de8bf1a5df Fix 3MF export imports.
done as part of CURA-12099
2025-04-23 11:06:31 +02:00
wawanbreton
89a83c0440 Apply printer-linter format 2025-04-22 14:16:19 +00:00
Erwan MATHIEU
7731ee4b24 Basically working import from BambuStudio/OrcaSlicer 3MF
CURA-12099
2025-04-22 16:01:32 +02:00
Erwan MATHIEU
204258f7e3 Set default gyroid infill pattern for BambuLab printers
CURA-12346
Grid infill prints very ugly at high speeds, this one is much cleaner and provides a proper surface for roofs
2025-04-22 12:54:58 +02:00
Erwan MATHIEU
a6e324b748 Fix extruder stack corruption
CURA-12346
For some dark reason, importing the ExtruderStack class in the ThreeMFWriter somehow corrupts the loading of the extruders stacks. As it is imported only for typing, do the import only for type-checking.
2025-04-22 12:52:05 +02:00
Erwan MATHIEU
38e1140454 Add base profile for A1
CURA-12346
2025-04-22 10:53:40 +02:00
Remco Burema
2db896e80f win/pacakging -- Start menu-macro is only needed for when in folder?
Also it fails now since it seems like this macro _expects_ a folder to be set.

CURA-12502
2025-04-22 10:24:06 +02:00
wawanbreton
14375b171d Apply printer-linter format 2025-04-17 11:27:50 +00:00
Erwan MATHIEU
a4cf0a1162 Enable prime tower by default and set proper overhang speeds
CURA-12099
2025-04-17 13:25:48 +02:00
Erwan MATHIEU
c28ab219a0 Fix possibly wrong returned initial extruder
CURA-12099
2025-04-17 13:25:24 +02:00
Erwan MATHIEU
afc22638ba Use original (refined) build plate setting
CURA-12099
2025-04-17 11:34:13 +02:00
Erwan MATHIEU
f69d80f6a0 Allow selecting material mapping on printer
CURA-12099
2025-04-16 15:08:58 +02:00
Remco Burema
f45cbeb5f4 Remove spurious (and maybe erroneous?) empty line.
CURA-12502
2025-04-16 13:18:40 +02:00
Erwan MATHIEU
09af18ec8f Export proper thumbnail and gcode into BambuLab 3mf format
CURA-12099
2025-04-16 09:09:22 +02:00
Remco Burema
2b748a98fe
Merge branch 'main' into CURA-12502_unfolderize_win_startmenu 2025-04-16 08:31:20 +02:00
Remco Burema
14bf34d96a Adjust code to review comments.
- Use delete-on-close instead.
- Prevent infinite loops.

part of CURA-12156
2025-04-15 21:08:33 +02:00
Erwan MATHIEU
a5e1bee334 Merge remote-tracking branch 'origin/5.10' 2025-04-14 08:51:58 +02:00
Erwan MATHIEU
9f4324fe92 Fine-tune multi color printing, and allow prime tower
CURA-12074
When prime tower is enabled, use it as a flush so that we don't have to use the usual flushing sequence of the printer, which is much slower
2025-04-14 08:33:16 +02:00
Mariska
5113dca671
Merge pull request #20455 from Ultimaker/CURA-12486_use-single-instance-needs-restart-desc
Indicates that changing option requires a restart
2025-04-10 12:51:22 +02:00
Erwan MATHIEU
ce5ce649c9
Merge pull request #20480 from Ultimaker/PP-602-New-S-line-configurations
[PP-602] New configurations for the S line printers
2025-04-09 15:53:53 +02:00
Erwan MATHIEU
5f67a3d2e3
Merge branch '5.10' into PP-602-New-S-line-configurations 2025-04-09 15:53:42 +02:00
Erwan MATHIEU
363e97426f
Merge pull request #20496 from Ultimaker/PP-607-Improve-S8-CPE-and-PC-profiles
[PP-607] Improve CPE and PC surface quality
2025-04-09 15:53:04 +02:00
Erwan MATHIEU
0db457b9f0
Merge branch '5.10' into PP-607-Improve-S8-CPE-and-PC-profiles 2025-04-09 15:52:42 +02:00
Erwan MATHIEU
fc1404139c Set A1 mini proper nozzle name
CURA-12074
2025-04-09 15:37:16 +02:00
wawanbreton
6601dcebd2 Apply printer-linter format 2025-04-09 13:35:11 +00:00
Erwan MATHIEU
b0460cee25 Set A1 mini proper name
CURA-12074
2025-04-09 15:33:29 +02:00
Erwan MATHIEU
7789c86c52 Improved A1 mini multi-color printing
CURA-12074
2025-04-09 15:32:29 +02:00
Paul Kuiper
3990fd5d2a Remove the BB0.8 for the S6 machine (for now).
PP-602
2025-04-09 14:10:38 +02:00
Paul Kuiper
a39033bc1f Capital M in the Ultimaker name of the S7 and S8 to be consistent with machines names released after the merger.
PP-602
2025-04-09 14:05:37 +02:00
Remco Burema
7007d6f9b9
Merge pull request #20481 from Ultimaker/PP-606-Improve-PVA-support
[PP-606] Improve PVA support for S8
2025-04-09 13:08:32 +02:00
wawanbreton
931dc13432 Apply printer-linter format 2025-04-09 10:05:05 +00:00
Erwan MATHIEU
014ed05e73 Basically working A1 mini (multi-color)
CURA-12074
2025-04-09 12:03:27 +02:00
Paul Kuiper
1b80649e21 Corrected review comment of Erwan.
PP-602
2025-04-09 11:32:19 +02:00
Paul Kuiper
93d9c084d7 Add new configuration files for AA+ and CC+ 0.6 nozzles
PP-602
2025-04-08 15:44:20 +02:00
Paul Kuiper
e76e843274 PC: Prevent holes in outside wall of PC prints due to air capture during unretracts:
- reduce retract length, inner wall before outer wall, inner wall speed equal to outer wall.
We also lowered the flow rate to 95% for PC because we noticed that it was over extruding.

CPE: CPE is VERY fragile to printer over itself or bumps. Lower all speeds to 40mm/s, goto 'lines' infill type to prevent crossing over lines, 3 walls to prevent issues with infill to reach the outer wall.

PP-607
2025-04-08 14:32:15 +02:00
GregValiant
d78d19820b Update PurgeLinesAndUnload.py
Missed a newline in line 499.
2025-04-04 08:27:10 -04:00
Paul Kuiper
90848b90e4 Improve PVA support for S8
PP-602
2025-04-04 12:11:37 +02:00
Paul Kuiper
0ec825b1ac New configurations for the S line printers.
PP-602
2025-04-04 12:02:58 +02:00
Erwan MATHIEU
db72527b6b Basically working A1 mini (single color)
CURA-12074
2025-04-04 11:07:32 +02:00
Erwan MATHIEU
36422bb949 Merge remote-tracking branch 'origin/main' into CURA-12074_introduce-bambu-printers 2025-04-04 09:41:23 +02:00
Erwan MATHIEU
f31daee257 Rename brand (without final S) and add A1 mini
CURA-12074
2025-04-03 11:53:42 +02:00
Casper Lamboo
d04360c1c3
Merge pull request #20411 from Ultimaker/CURA-12485_fix_name_confusion
[CURA-12485] This name wasn't the same as in the complete settings list.
2025-04-02 17:08:56 +02:00
Remco Burema
1fb89e0e7d Restore Backups: Correctly handle requests to redownload plugins.
- Fix: Need to fill the package's API version into the (template) URL, instead of using latest.
- Fix: Loop was closing over the package ID, which caused the recieving function to always only get the last handled package ID instead of the one it needed to handle.

part of CURA-12156
2025-04-02 13:19:01 +02:00
Remco Burema
43d9e1d522 Restore Backups: Fix handling the (re)downloaded tempfile.
Was opening the tempfile for handling when it was still open for writing. Also the wrong net-reply got used (reply instead of msg).

part of CURA-12156
2025-04-02 13:15:35 +02:00
Remco Burema
1f4f432d49 Restore Backups: Fix reading which packages need to be reinstalled.
Also save the version, so we can get the correct url when redownloading the package (see next commits).

part of CURA-12156
2025-04-02 13:13:25 +02:00
Remco Burema
6458c17de5 Save 'pluginless' bakcup correctly.
- Fix: Save the tempfile to the archive under the 'original' name (it is a rewrite of) instead of saving it to the archive under it's own name, which skipped the original file completely in a sense (the info was there, but as a tempfile).
- Fix: Also make sure the correct folders where ignored, as reinstall paths where the complete path, not the basename.

part of CURA-12156
2025-04-02 13:09:21 +02:00
Remco Burema
c857dab0f7 Logging (mostly on errors).
CURA-12156
2025-04-01 16:47:17 +02:00
Erwan MATHIEU
86edf25403 Fix initial bed leveling position
CURA-12074
2025-04-01 15:35:30 +02:00
wawanbreton
e1e86f393d Apply printer-linter format 2025-04-01 13:13:53 +00:00
Erwan MATHIEU
1e00176cac Add basic definition for BambuLab X1
CURA-12074
2025-04-01 15:12:14 +02:00
Remco Burema
35ff3e40e6 Merge branch 'main' into CURA-12156_dont_zip_downloadable_plugins 2025-04-01 15:10:39 +02:00
Remco Burema
b295ca7d04 Workaround for process-events during multiple http requests.
Would not work otherwise, but that should have been true in the old situation then as well?

CURA-12156
2025-04-01 15:10:27 +02:00
Erwan MATHIEU
0fd7766db3 Fix color-switching code which only worked until 27/03 2025-03-28 14:14:27 +01:00
Remco Burema
a50fa29a0f Merge remote-tracking branch 'origin/main' into CURA-12156_dont_zip_downloadable_plugins 2025-03-27 14:17:59 +01:00
Erwan MATHIEU
460df87d1d Indicates that changing option requires a restart
CURA-12486
Also move the note at the bottom of the page, because now labels from different categories use it, and this is where people should look for it.
2025-03-27 10:47:18 +01:00
Remco Burema
fbb15db9e9
Merge pull request #20414 from Ultimaker/CURA-12469_colors_for_dev_builds
[CURA-12469] Have developer/tester/etc. builds be distinct per biweekly day.
2025-03-27 07:47:35 +01:00
Remco Burema
c33a322093 Also remove website link.
Would otherwise be hanging loose in the start-menu somehwere.

done as part of CURA-12502
2025-03-26 08:57:43 +01:00
HellAholic
fa1ead3064 Merge remote-tracking branch 'origin/5.10' 2025-03-25 11:00:26 +01:00
Remco Burema
fa8e4b26cf Delete test-colors path in any case + small refactors.
Less indents and more logging.

part of CURA-12469
2025-03-25 08:46:12 +01:00
HellAholic
6251a816f0
Merge pull request #20431 from Ultimaker/CURA-12481_ChangelogUpdate
CURA-12481 changelog update
2025-03-24 10:47:49 +01:00
HellAholic
1f62c1f944
Merge pull request #20430 from Ultimaker/CURA-11911_recommended-view-translations
CURA-11911 Recommended view translations
2025-03-24 10:14:29 +01:00
HellAholic
6186bf53ba
Merge pull request #20437 from Patola/5.10
Updated pt_BR strings for Cura
2025-03-24 10:11:28 +01:00
HellAholic
efd681b28e update the changelog 2025-03-24 09:45:50 +01:00
HellAholic
9a378d771f Update interlocking
Clarity
2025-03-24 09:20:16 +01:00
HellAholic
3e305372f3
Merge branch '5.10' into CURA-11911_recommended-view-translations 2025-03-24 09:00:10 +01:00
Cláudio 'Patola' Sampaio
d23e2b915e Updated pt_BR strings for Cura 2025-03-23 23:58:30 +01:00
HellAholic
fd13ee10e3 Optional changes - Add padding to the textArea
Adds 15 padding to the right side of the what's new text items (text will not go under scrollbar)

Adds 15 padding to left and right of the changelog
2025-03-21 23:01:16 +01:00
MariMakes
7cfcf09ec0 Update Changelog for stable
Update changelog for stable release
2025-03-21 19:14:39 +01:00
HellAholic
ec130064d7
Merge pull request #20427 from Ultimaker/PP-601-Method-temperatures
PP-601 Method Temperatures
2025-03-21 16:31:55 +01:00
HellAholic
0d851b91bb
Merge pull request #20426 from Ultimaker/CURA-12495_revert-Method-High-Speed-printing
CURA-12495 revert method high speed printing
2025-03-21 16:00:22 +01:00
HellAholic
cb577833db
Merge pull request #20417 from Ultimaker/PP-599-Extrusion-issues-with-Nylon-CF-Slide-on-CCplus04-S8
PP-599 slower unretracts to reduce extrusion issues
2025-03-21 15:58:00 +01:00
Erwan MATHIEU
6596edb941 Fix ugly translation
CURA-11911
Trust me, this really means nothing in this context :D
2025-03-21 15:27:22 +01:00
Erwan MATHIEU
c71148321a Translate settings values in recommended screen
CURA-11911
For settings inside the screen, they are translated through the SettingDefinitionModel, but we don't use one here, so we have to translate it explicitely
2025-03-21 15:26:43 +01:00
Alan Bjorklund
fa0624784b machine_min_cool_heat_time_window=0 for Method
PP-601
2025-03-21 12:32:01 +01:00
Erwan MATHIEU
ed7372b380 Revert "Merge pull request #20129 from Ultimaker/PP-544-HS-Method"
This reverts commit 53f4046a513ea3e341bde572d237409cd0e9bf8f, reversing
changes made to f2ebf160a5770a8ed9a2e32153f4380011eb51cd.
2025-03-21 10:24:55 +01:00
Erwan MATHIEU
bf2eef3537 Revert "Merge pull request #20128 from Ultimaker/CURA-12371"
This reverts commit f2ebf160a5770a8ed9a2e32153f4380011eb51cd, reversing
changes made to 97deb2f15ea4f2b904d14270d0d2a8b0fff19009.
2025-03-21 10:13:46 +01:00
HellAholic
404daa2d0b
Merge pull request #20416 from Ultimaker/PP-600_reduce_s8_travel_speed
PP-600: Reduce S8 travel speed
2025-03-20 12:00:39 +01:00
HellAholic
7e64d1ab30
Merge pull request #20384 from Ultimaker/CURA-12439_unable-to-resize-columns
CURA-12439 Improve TableView manual column resizing
2025-03-20 10:44:55 +01:00
THeijmans
7ba07d0236 PP-599 slower unretracts to reduce extrusion issues 2025-03-20 10:18:13 +01:00
Frederic98
b01b3be245 [PP-600] Reduce S8 travel speed to 300 2025-03-20 10:05:53 +01:00
RedBlackAka
82939b2644 Clean up Windows Start Menu 2025-03-19 23:32:58 +02:00
Remco Burema
2b032af13c Broaden the 'internal' condition a bit.
Should help with testing as well.

CURA-12469
2025-03-19 16:39:37 +01:00
Remco Burema
bc4d57348c Version has been bumped a while ago.
Needed to test CURA-12469 (and I suppose it doesn't hurt for anything else that needs the internal data).
2025-03-19 16:27:31 +01:00
HellAholic
de0254517a
Merge pull request #20410 from Ultimaker/CURA-12491-name_capitalization
capitalization
2025-03-19 15:43:00 +01:00
Remco Burema
a9018a06c4 Have developer/tester/etc. builds be distinct per biweekly day.
Less cause for confusion when sending out internal builds to test/develop on.

CURA-12469
2025-03-19 15:39:00 +01:00
HellAholic
0bee559626
Merge pull request #20389 from Ultimaker/CURA-12458_security-fixes-that-came-in-via-the-inbox
CURA-12458 security fixes that came in via the inbox
2025-03-19 15:27:50 +01:00
Remco Burema
ce4c18a60c This name wasn't the same as in the complete settings list.
Even worse, support type there already means something else. Done in main for supposedly 5.11 instead of 5.10 since the translations might not work since they have a different context/label here.

resolution of CURA-12485
2025-03-19 11:40:21 +01:00
HellAholic
65e3a3666e Apply printer-linter format 2025-03-19 10:29:28 +00:00
HellAholic
e1baa171c3
capitalization 2025-03-19 11:28:03 +01:00
HellAholic
79dfb7bd23
Merge branch '5.10' into CURA-12458_security-fixes-that-came-in-via-the-inbox 2025-03-19 11:11:31 +01:00
Erwan MATHIEU
2bfb2fd6ad Merge remote-tracking branch 'origin/5.10' 2025-03-19 10:14:09 +01:00
Remco Burema
3fbfca48d8 Fix fallback setting error. 2025-03-18 16:14:50 +01:00
Erwan MATHIEU
b8358a81e9
Merge branch '5.10' into CURA-12439_unable-to-resize-columns 2025-03-18 14:13:00 +01:00
Erwan MATHIEU
3348c29278 Apply review suggestions
CURA-12439
2025-03-18 14:12:34 +01:00
HellAholic
2f2b6a03ab
Merge pull request #20368 from Ultimaker/purgelineMinZ_and_fix
Purgeline min z and fix
2025-03-17 17:58:45 +01:00
HellAholic
05e8b4283b Set conan package version 5.10.0 2025-03-17 16:37:46 +00:00
HellAholic
b665e46814
Merge pull request #20403 from Ultimaker/PP-593_mark_PACF_CC04_experimental
[PP-593] Mark Nylon CF Slide as experimental on CC 0.4 cores
2025-03-17 17:35:20 +01:00
HellAholic
26b1fb55db
Merge pull request #20386 from Ultimaker/CURA-12466_Experimental_setting_visibility
Cura 12466 experimental setting visibility
2025-03-17 17:21:00 +01:00
HellAholic
b363752f55
Merge pull request #20402 from Ultimaker/PP-595-Cura-5.10-stable-update
PP-595 Cura 5.10 stable profile updates
2025-03-17 17:15:53 +01:00
Paul Kuiper
24c749c64b Reduce the warning limits such that they do not overlap the max limits.
PP-595
2025-03-17 17:08:15 +01:00
Frederic Meeuwissen
09c49126a8 [PP-593] Mark Nylon CF Slide as experimental on CC 0.4 cores 2025-03-17 16:42:54 +01:00
HellAholic
7204cdfa96 Revert onTextChange 2025-03-17 16:35:18 +01:00
Erwan MATHIEU
3b5432912c Standardize QML code
CURA-12466
2025-03-17 16:22:11 +01:00
HellAholic
e8b1677a56
Merge pull request #20401 from Ultimaker/CURA-12472_bottom-surface-settings-visible-when-active
CURA-12472 bottom surface settings visible when active
2025-03-17 15:52:34 +01:00
Paul Kuiper
d1b0a59565 Update S8 profiles:
- Adjust warning levels to reflect the new motion limits
- Enable floor layers (0 to 1) to improve bottom quality
- Use normal prime tower (iso interleaving) for improved robustness
- Increase skirt/brim length to ensure a good start of extrusion
- Increase support line width from 0.4mm to 0.5mm for sturdier tree supports
- Reduce support speed to wall_speed to improve tree support robustness

PP-595
2025-03-17 15:19:59 +01:00
Erwan MATHIEU
7a2cb6480c Enable roofing settings when roofing is actually active
CURA-12472
2025-03-17 14:52:51 +01:00
Erwan MATHIEU
5a9b776d2b Enable flooring settings when flooring is actually active
CURA-12472
2025-03-17 14:48:45 +01:00
HellAholic
e18e0649d6
Merge branch '5.10' into purgelineMinZ_and_fix 2025-03-16 12:02:18 +01:00
HellAholic
b549542f18
lint 2025-03-15 22:31:25 +01:00
HellAholic
6567017512
set QtQuick and QtQuick.Controls to 2.15 2025-03-15 22:25:23 +01:00
HellAholic
858ffee545
Merge branch '5.10' into CURA-12466_Experimental_setting_visibility 2025-03-15 22:10:26 +01:00
HellAholic
0e5f282238 Replace for loop with map() and remove redundant else
- map().join is a better fit that replaces the for loop and a if/else since there is no complex logic involved.
- there is a return inside the if statement for requires.length ===0, so no need for else statement as the code execution stops with return
2025-03-15 22:07:57 +01:00
HellAholic
368094bb5f
Merge pull request #20377 from Ultimaker/CURA-12403_project-names-revert-to-previous-name
CURA-12403 Project names revert to previous name
2025-03-14 16:12:37 +01:00
Erwan MATHIEU
67d4afb97e Use HSTS for local OAuth2 callback server
CURA-12458
This prevents possible man-in-the-middle attacks from within the user PC. Not very likely, but still a good practice.
2025-03-14 12:00:24 +01:00
Erwan MATHIEU
90115808ee Use yaml.safe_load instead of yaml.load
CURA-12548
Note that this is not technically required, because external contributors can change it anyway. However, making this change will silent a security warning raised by an automatic analysis tool, and it doesn't hurt.
2025-03-14 11:38:45 +01:00
HellAholic
e1430c76fd
fix indent 2025-03-13 22:35:05 +01:00
HellAholic
48b449b32e Rewrite experiment
- Removed the version 2.x
- Rewrite onTextChanged -> add logic to not execute if text is unchanged
- Rewrite currentIndex & onActivated -> use findIndex instead of for loop
- Add reuseItems: true -> recycle items instead of instantiating from the delegate
- Remove cacheBuffer -> memory overhead (2GB for the entire list to load in one go)
- Rewrite delegate -> wrap loader as a component (based on documentation), remove switch case and replace with condition check, set asynchronous to false (introduces a bit of stutter but items are loaded when viewed).
2025-03-13 22:32:10 +01:00
Erwan MATHIEU
85eb90afbf Improve TableView manual column resizing
CURA-12439
2025-03-13 15:10:29 +01:00
Erwan MATHIEU
c4dd7b304b Fix wrongly switching project name
CURA-12403
2025-03-12 12:03:20 +01:00
HellAholic
da9bcd0239
Merge pull request #20370 from Ultimaker/CURA-12428_Changelog510
CURA-12428_Update Changelog
2025-03-10 17:24:48 +01:00
HellAholic
df855c48ae
Merge branch '5.10' into CURA-12428_Changelog510 2025-03-10 17:24:35 +01:00
HellAholic
7b23511e32
update preview change
Not limited to infill, also includes helpers and shell
2025-03-10 17:23:59 +01:00
MariMakes
9be6cee8cd Mention last minute bug fixes
Mention last minute bug fixes
2025-03-10 17:04:25 +01:00
Mariska
782bfd01c5
Update MacOSx to MaxOS
Update MacOSx to MaxOS

Co-authored-by: HellAholic <alireza.doustdar@gmail.com>
2025-03-10 16:59:03 +01:00
Mariska
7440af206e
Apply suggestions from code review
Minor clarifications

Co-authored-by: HellAholic <alireza.doustdar@gmail.com>
2025-03-10 16:58:11 +01:00
HellAholic
3227f68611
Merge pull request #20372 from Ultimaker/CURA-12272_fnfill-visible-in-preview-layer-but-disabled
Fix visibility settings not being applied for lower layers
2025-03-10 16:13:53 +01:00
Erwan MATHIEU
bc8ee22681
Merge branch '5.10' into CURA-12428_Changelog510 2025-03-10 16:00:56 +01:00
Erwan MATHIEU
69eb50eb6a
Minor adjustments 2025-03-10 15:58:33 +01:00
HellAholic
d8b9b7e441
Merge pull request #20371 from Ultimaker/CURA-12453_fix-auto-arrange-overlapping-models
CURA-12453 fix auto arrange overlapping models
2025-03-10 15:51:58 +01:00
Erwan MATHIEU
397fc2b161
Add missing 5.9.1. changelog 2025-03-10 15:23:14 +01:00
HellAholic
042b455316
Merge branch '5.10' into CURA-12453_fix-auto-arrange-overlapping-models 2025-03-10 15:20:27 +01:00
HellAholic
650e7994cc
Merge pull request #20352 from Ultimaker/CURA-12169_fix-autoarrange-for-disallowed-areas
CURA-12169 fix autoarrange for disallowed areas
2025-03-10 15:20:07 +01:00
HellAholic
02a6da914b
Merge branch '5.10' into CURA-12169_fix-autoarrange-for-disallowed-areas 2025-03-10 15:18:11 +01:00
Erwan MATHIEU
a6ee53c944 Fix visibility settings not being applied for lower layers
CURA-12272
2025-03-10 14:55:46 +01:00
Erwan MATHIEU
a4a35ba485 Fix overlapping objects after auto-arrange
CURA-12453
* Use DONT_ALIGN alignment, otherwise all the transforms get re-centered, including the ones of the fixed objects
* Remove DONT_ALIGN strategy for starting point, which is a non-handled case in the inner library
2025-03-10 13:46:31 +01:00
MariMakes
9c18763f69 Update Changelog for Cura 5.10 Beta
Update Changelog for Cura 5.10 Beta
Contributes to CURA-12428
2025-03-10 13:46:27 +01:00
HellAholic
34c04568f4
Merge pull request #20358 from Ultimaker/PP-592-Fix-issues-from-beta-test
PP-592 fix issues from beta test
2025-03-10 11:44:31 +01:00
HellAholic
d2cd3df88d
Merge branch '5.10' into PP-592-Fix-issues-from-beta-test 2025-03-10 10:38:35 +01:00
HellAholic
378ce44e9f
Merge pull request #20359 from Ultimaker/CURA-12451_z_seam_sketch_sprint
Remove redundant overrides
2025-03-10 10:24:59 +01:00
HellAholic
2cf13c5e94 Remove extra empty line 2025-03-09 19:30:55 +01:00
HellAholic
b25620826f use helper function
Since the added lines are identical, it can be replaced with a helper function
2025-03-09 19:30:55 +01:00
GregValiant
253d11f84d Update PurgeLinesAndUnload.py
This change adds a setting for "minimum Z height" for the "nail down the string" moves.

Update PurgeLinesAndUnload.py

Bug fix.  The prime blob code didn't account for the retraction at the end.  This adds an 'unretract' to compensate.
2025-03-09 19:30:55 +01:00
Frederic98
41cd893e09 PP-592 2025-03-07 16:51:52 +01:00
HellAholic
5d2856c195 backleft can stay 2025-03-07 16:32:15 +01:00
HellAholic
78e62635dd Remove redundant overrides
This will unlock the z seam x and z seam y, otherwise the z seam would not update from x 150 and y 180 position
2025-03-07 16:03:07 +01:00
Erwan MATHIEU
22d1d170dc Improve arrangement calculation
CURA-12169
1. Do not recalculate transformed polygons for each strategy.
2. Try all possible strategies, but only once. This seems to give the best results.
2025-03-06 12:54:39 +01:00
Erwan MATHIEU
01d03f7e21 Fix testing multiple arrange strategies
CURA-12169
Some items were still set from previous tryes, giving a final result that could have inconsistencies (e.g. objects over disallowed ares)
2025-03-06 10:59:55 +01:00
Erwan MATHIEU
e19f5ee330 Do not move objects if auto-arrange fails
CURA-12169
When doing an explicit auto-arrange that can not find a complete solution, it is better not to move the objects because they will probably end up in a weird position
2025-03-06 10:58:54 +01:00
Simon Edwards
0273ef49f1
Merge pull request #20350 from Ultimaker/trigger_curator
Trigger Curator build after resource build
2025-03-05 13:32:16 +01:00
Simon Edwards
e39f5ca7ae Trigger Curator build after resource build 2025-03-05 12:31:29 +00:00
HellAholic
36b5a40563
Merge pull request #20345 from Ultimaker/CURA-12442_no_slow_on_scroll
[CURA-12442] Same cache as other setting-lists to reduce slowness on scroll.
2025-03-05 12:45:29 +01:00
HellAholic
b9d9e93e93
Merge pull request #20346 from Ultimaker/CURA-12443_units_updater
[CURA-12443] Fix value-units can now change visually/immediately on printer switch.
2025-03-05 12:09:22 +01:00
HellAholic
b25ad27599
Merge pull request #20342 from Ultimaker/CURA-12433_minimum-layer-without-overhang
CURA-12433 minimum layer without overhang
2025-03-05 11:53:32 +01:00
HellAholic
27d0b9a250
Merge pull request #20344 from Ultimaker/CURA-12441_wide_margin
[CURA-12441] Margin wasn't wide enough to see that it's a tree.
2025-03-05 11:47:29 +01:00
HellAholic
9b90c7909d
Merge pull request #20325 from Ultimaker/PP-580-Improve-self-support
Improved self-support settings for the S8
2025-03-05 11:18:51 +01:00
Remco Burema
6a4890ecd7
nocase -> camelCase
done as part of CURA-12443

Co-authored-by: Erwan MATHIEU <erwan.mathieu@ultimaker.com>
2025-03-05 09:10:52 +01:00
HellAholic
7727590fb8
Merge branch '5.10' into CURA-12433_minimum-layer-without-overhang 2025-03-05 09:06:38 +01:00
HellAholic
ab968b4114
Merge branch '5.10' into PP-580-Improve-self-support 2025-03-05 09:00:11 +01:00
Remco Burema
cf419c3025 Fix value-units can now change visually/immediately on printer switch.
CURA-12443
2025-03-04 16:08:50 +01:00
Remco Burema
cb0d69d9f2 Same cache as other setting-lists to reduce slowness on scroll.
This does incur a cost on the first load of the list though.

CURA-12442
2025-03-04 15:03:59 +01:00
Remco Burema
c21ddd99ce Margin wasn't wide enough to see that it's a tree.
CURA-12441
2025-03-04 14:54:12 +01:00
Erwan MATHIEU
1198746870
Merge pull request #20339 from h1data/5.10
Updated ja translation for 5.10
2025-03-04 14:03:46 +01:00
h1data
26f07257dd
Merge branch '5.10' into 5.10 2025-03-04 20:35:22 +09:00
Erwan MATHIEU
4e7684de99
Merge branch '5.10' into PP-580-Improve-self-support 2025-03-04 10:16:11 +01:00
Erwan MATHIEU
857d26307d Hide setting from expert set
CURA-12433
Those settings highly depend on wall_overhang_angle, which is not visible in expert, so they should also not be visible
2025-03-03 15:41:07 +01:00
Erwan MATHIEU
8722fb5e6f Move settings to experimental
CURA-12433
Those settings highly depend on wall_overhang_angle, which is an experimental setting, so they should also be experimental
2025-03-03 15:40:30 +01:00
Erwan MATHIEU
bf1ccd772b Do not display settings that are useless when overhang is "disabled"
CURA-12433
2025-03-03 15:34:49 +01:00
HellAholic
c86c08bd90
Merge pull request #20318 from Ultimaker/CURA-12386_G-Code-replacement-fails-with-single-line-code
CURA-12386 G-Code replacement fails with single line code
2025-03-03 14:14:19 +01:00
h1data
0608ec5cf6
Merge branch '5.10' into 5.10 2025-03-02 14:34:42 +09:00
h1data
361af17212 Updated ja translation for 5.10 2025-03-02 13:53:29 +09:00
Paul Kuiper
f2098b570f Moved flooring settings from ultimaker.def.json to the S8 only to reduce risk. Added support_wall_count is 2 (forgot this in the original commit).
PP-580
2025-02-28 10:28:01 +01:00
HellAholic
884983c34f
Merge branch '5.10' into CURA-12386_G-Code-replacement-fails-with-single-line-code 2025-02-28 09:43:36 +01:00
HellAholic
ec4a19c0e4
Merge branch '5.10' into PP-580-Improve-self-support 2025-02-28 09:31:43 +01:00
Remco Burema
d167e3f28e Work in progress on pulling plugins out of the backups.
It's now in a state where it can actually upload ... something (that should work). Not tested the restore yet.

I did run into trouble with the max concurrent requests, which I had to up to [more than 4, now on 8] to get it to work -- I'm not sure if I'm just working around a bug here, or if that's expected behaviour.

part of CURA-12156
2025-02-27 16:52:27 +01:00
Paul Kuiper
8aacf63f4a Improved self-support settings for the S8. Better release due to the horizontal expansion. More robustness due to brims, and larger build plate trunks and avoid travel over support. Faster printing due to higher support speeds and less tree branches.Improved part strength due to higher infill flow rates. Added 1 flooring layer to all Ultimaker machines to improve bottom part quality. Small bug fixes to the sketch/replicator profiles. Updated settings version def files.
PP-580
PP-581
2025-02-27 11:50:57 +01:00
Remco Burema
74420ee57b Merge branch 'main' into CURA-12156_dont_zip_downloadable_plugins 2025-02-27 11:26:58 +01:00
Erwan MATHIEU
a666116119
Merge branch '5.10' into CURA-12386_G-Code-replacement-fails-with-single-line-code 2025-02-27 09:23:03 +01:00
Erwan MATHIEU
b67769b238 Fix dependency version 2025-02-26 16:29:16 +01:00
Erwan MATHIEU
f468cd5150 Bump version to 5.11 2025-02-26 16:25:04 +01:00
Erwan MATHIEU
0f8fe06059 Bump version to 5.11 2025-02-26 16:11:21 +01:00
Erwan MATHIEU
f13bdeae42 Merge remote-tracking branch 'origin/5.10' 2025-02-26 16:03:14 +01:00
Erwan MATHIEU
e810c4becd
Merge branch '5.10' into CURA-12386_G-Code-replacement-fails-with-single-line-code 2025-02-26 15:05:04 +01:00
Erwan MATHIEU
2f2a93b9d0 Add unit test for single-line statement
CURA-12386
2025-02-26 15:02:22 +01:00
Erwan MATHIEU
f9b8bc20c2 Fix single-line statement processing
CURA-12386
The regex was not specific enough and would catch the rest of the line, now we force stopping as soon as we see a { or }
2025-02-26 15:02:06 +01:00
Erwan MATHIEU
78ba8d834d Set proper version for nightly stable build 2025-02-24 09:21:13 +01:00
Remco Burema
d92196da53 Exclude plugins available in Marketplace from backups.
part of CURA-12156
2025-02-12 17:22:27 +01:00
184 changed files with 6986 additions and 2727 deletions

View File

@ -5,38 +5,25 @@ body:
- type: markdown
attributes:
value: |
### ✨Try our improved Cura 5.7
Before filling out the report below, we want you to try the latest Cura 5.7.
This version of Cura has become significantly more reliable and has an updated slicing engine that will automatically send a report to the Cura Team for analysis.
#### [You can find the downloads here](https://github.com/Ultimaker/Cura/releases/latest) ####
If you still encounter a crash you are still welcome to report the issue so we can use your model as a test case, you can find instructions on how to do that below.
### ✨Are you stuck? Have you tried these two things?
1- Are you on a Cura version lower than Cura 5.7? We really recommend updating because it resolves a lot of slicing crashes!
2- Have you tried fixing the model with software that repairs 3d files and makes them watertight?
Are you seeing spots and dots on your model? That is Cura indicating that your model is not watertight.
You can try doing a quick [Mesh Fix with the Meshtools Plugin](https://marketplace.ultimaker.com/app/cura/plugins/fieldofview/MeshTools) or other mesh editing software.
### Project File
**⚠️ Before you continue, we need your project file to troubleshoot a slicing crash.**
It contains the printer and settings we need for troubleshooting.
If you still encounter a crash you are welcome to report the issue so we can use your model as a test case.
You can find instructions on how to share your model in a Package for Technical Support below.
![Alt Text](https://user-images.githubusercontent.com/40423138/240616958-5a9751f2-bd34-4808-9752-6fde2e27516e.gif)
To save a project file go to File -> Save project.
Please make sure to .zip your project file.
For big files, you may need to use [WeTransfer](https://wetransfer.com/) or similar file-sharing sites.
🤔 Before you share, please think to yourself. Is this a model that can be shared?
Unfortunately we cannot help if this file is missing.
Do you have the project file? Than let's continue ⬇️
### Questions
🤔 Before you share, please think to yourself. Is this a model that can be shared on the internet?
**Unfortunately, we cannot help if this file is missing.**
### Questions
- type: input
attributes:
label: Cura Version
placeholder: 5.6.0
description: We work hard on improving our slicing crashes. If you are not on the latest version of Cura, [you can download it here](https://github.com/Ultimaker/Cura/releases/latest)
validations:
required: true
- type: markdown
attributes:
value: |
We work hard on improving our slicing crashes. Our most recent release is 5.7.1.
If you are not on the latest version of Cura, [you can download it here](https://github.com/Ultimaker/Cura/releases/latest)
- type: input
attributes:
label: Operating System
@ -50,27 +37,13 @@ body:
description: Which printer was selected in Cura?
validations:
required: true
- type: input
attributes:
label: Name abnormal settings
description: Are there any settings that you might have changed that caused the crash? Does your model slice when you select the default profiles?
placeholder:
validations:
- type: input
attributes:
label: Describe model location
description: Does your model slice if you rotate the model 90 degrees or if you move it away from the center of the buildplate?
placeholder:
validations:
- type: input
attributes:
label: Describe your model
description: Have you sliced your model succesfully before? Is it watertight? Have you tried doing a quick [Mesh Fix with the Meshtools Plugin](https://marketplace.ultimaker.com/app/cura/plugins/fieldofview/MeshTools)?
validations:
required: true
- type: textarea
attributes:
label: Add your .zip here ⬇️
description: You can add the zip file and additional information that is relevant to the issue in the comments below.
label: Describe your problem and add the package for technical support as a .zip here ⬇️
description: |
If you still have Cura open with your crash > Click on Help on top bar > Click on Export Package For Technical Support > Compress the file into a zip > Add the file here to your GitHub issue 🔗
If you closed Cura, please open Cura to recreate the crash> Select your printer > Load your model > Select your print settings > Click on Help on top bar > Click on Export Package For Technical Support > Compress the file into a zip > Add the file here to your GitHub issue 🔗
validations:
required: true

View File

@ -30,3 +30,13 @@ jobs:
platform_mac: false
install_system_dependencies: false
secrets: inherit
signal-curator:
needs: conan-package
runs-on: ubuntu-latest
steps:
- name: Trigger Curator Workflow
run: |
gh workflow run --repo ultimaker/curator -r main package.yml
env:
GITHUB_TOKEN: ${{ secrets.CURATOR_TRIGGER_PAT_C3PO }}

View File

@ -1,10 +1,10 @@
name: Nightly build - stable release
run-name: Nightly build - stable release
on:
schedule:
# Daily at 5:15 CET
- cron: '15 4 * * *'
# on:
# schedule:
# # Daily at 5:15 CET
# - cron: '15 4 * * *'
jobs:
build-nightly:

View File

@ -1,10 +1,10 @@
name: Nightly build - dev release
run-name: Nightly build - dev release
on:
schedule:
# Daily at 4:15 CET
- cron: '15 3 * * *'
# on:
# schedule:
# # Daily at 4:15 CET
# - cron: '15 3 * * *'
jobs:
build-nightly:

View File

@ -1,16 +1,16 @@
version: "5.10.0-beta.1"
version: "5.11.0-alpha.0"
requirements:
- "cura_resources/5.10.0-beta.1"
- "uranium/5.10.0-beta.1"
- "curaengine/5.10.0-beta.1"
- "cura_binary_data/5.10.0-beta.1"
- "fdm_materials/5.10.0-beta.1"
- "cura_resources/5.11.0-alpha.0@ultimaker/testing"
- "uranium/5.11.0-alpha.0@ultimaker/testing"
- "curaengine/5.11.0-alpha.0@ultimaker/testing"
- "cura_binary_data/5.11.0-alpha.0@ultimaker/testing"
- "fdm_materials/5.11.0-alpha.0@ultimaker/testing"
- "dulcificum/5.10.0"
- "pysavitar/5.10.0"
- "pysavitar/5.11.0-alpha.0"
- "pynest2d/5.10.0"
requirements_internal:
- "fdm_materials/5.10.0-beta.1"
- "cura_private_data/5.10.0-alpha.0@internal/testing"
- "fdm_materials/5.11.0-alpha.0@ultimaker/testing"
- "cura_private_data/5.11.0-alpha.0@internal/testing"
requirements_enterprise:
- "native_cad_plugin/2.0.0"
urls:
@ -265,6 +265,10 @@ pycharm_targets:
module_name: Cura
name: pytest in TestSettingVisibilityPresets.py
script_name: tests/Settings/TestSettingVisibilityPresets.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestStartEndGCode.py
script_name: tests/Machines/TestStartEndGCode.py
pip_requirements_core:
any_os:

View File

@ -1,8 +1,10 @@
import json
import os
import requests
import yaml
import tempfile
import tarfile
from datetime import datetime
from io import StringIO
from pathlib import Path
from git import Repo
@ -562,6 +564,30 @@ class CuraConan(ConanFile):
self.cpp.package.bindirs = ["bin"]
self.cpp.package.resdirs = ["resources", "plugins", "packaging"]
def _make_internal_distinct(self):
test_colors_path = Path(self.source_folder, "resources", "themes", "daily_test_colors.json")
if not test_colors_path.exists():
print(f"Could not find '{str(test_colors_path)}'. Won't generate rotating colors for alpha builds.")
return
if "alpha" in self.version:
with test_colors_path.open("r") as test_colors_file:
test_colors = json.load(test_colors_file)
biweekly_day = (datetime.now() - datetime(2025, 3, 14)).days % len(test_colors)
for theme_dir in Path(self.source_folder, "resources", "themes").iterdir():
if not theme_dir.is_dir():
continue
theme_path = Path(theme_dir, "theme.json")
if not theme_path.exists():
print(f"('Colorize-by-day' alpha builds): Skipping {str(theme_path)}, could not find file.")
continue
with theme_path.open("r") as theme_file:
theme = json.load(theme_file)
if theme["colors"]:
theme["colors"]["main_window_header_background"] = test_colors[biweekly_day]
with theme_path.open("w") as theme_file:
json.dump(theme, theme_file)
test_colors_path.unlink()
def generate(self):
copy(self, "cura_app.py", self.source_folder, str(self._script_dir))
@ -581,6 +607,9 @@ class CuraConan(ConanFile):
copy(self, "bundled_*.json", native_cad_plugin.resdirs[1],
str(Path(self.source_folder, "resources", "bundled_packages")), keep_path = False)
# Make internal versions built on different days distinct, so people don't get confused while testing.
self._make_internal_distinct()
# Copy resources of cura_binary_data
cura_binary_data = self.dependencies["cura_binary_data"].cpp_info
copy(self, "*", cura_binary_data.resdirs[0], str(self._share_dir.joinpath("cura")), keep_path = True)

View File

@ -1,4 +1,4 @@
# Copyright (c) 2018 Ultimaker B.V.
# Copyright (c) 2025 UltiMaker
# Cura is released under the terms of the LGPLv3 or higher.
from typing import Tuple, Optional, TYPE_CHECKING, Dict, Any
@ -9,14 +9,10 @@ if TYPE_CHECKING:
class Backups:
"""The back-ups API provides a version-proof bridge between Cura's
BackupManager and plug-ins that hook into it.
"""The back-ups API provides a version-proof bridge between Cura's BackupManager and plug-ins that hook into it.
Usage:
.. code-block:: python
from cura.API import CuraAPI
api = CuraAPI()
api.backups.createBackup()
@ -26,19 +22,22 @@ class Backups:
def __init__(self, application: "CuraApplication") -> None:
self.manager = BackupsManager(application)
def createBackup(self) -> Tuple[Optional[bytes], Optional[Dict[str, Any]]]:
def createBackup(self, available_remote_plugins: frozenset[str] = frozenset()) -> Tuple[Optional[bytes], Optional[Dict[str, Any]]]:
"""Create a new back-up using the BackupsManager.
:return: Tuple containing a ZIP file with the back-up data and a dict with metadata about the back-up.
"""
return self.manager.createBackup()
return self.manager.createBackup(available_remote_plugins)
def restoreBackup(self, zip_file: bytes, meta_data: Dict[str, Any]) -> None:
def restoreBackup(self, zip_file: bytes, meta_data: Dict[str, Any], auto_close: bool = True) -> None:
"""Restore a back-up using the BackupsManager.
:param zip_file: A ZIP file containing the actual back-up data.
:param meta_data: Some metadata needed for restoring a back-up, like the Cura version number.
"""
return self.manager.restoreBackup(zip_file, meta_data)
return self.manager.restoreBackup(zip_file, meta_data, auto_close=auto_close)
def shouldReinstallDownloadablePlugins(self) -> bool:
return self.manager.shouldReinstallDownloadablePlugins()

View File

@ -3,7 +3,7 @@
from dataclasses import asdict
from typing import cast, Dict, TYPE_CHECKING
from typing import cast, Dict, TYPE_CHECKING, Any
from UM.Settings.InstanceContainer import InstanceContainer
from UM.Settings.SettingFunction import SettingFunction
@ -54,6 +54,15 @@ class Settings:
return self.application.getSidebarCustomMenuItems()
def getAllGlobalSettings(self) -> Dict[str, Any]:
global_stack = cast(GlobalStack, self.application.getGlobalContainerStack())
all_settings = {}
for setting in global_stack.getAllKeys():
all_settings[setting] = self._retrieveValue(global_stack, setting)
return all_settings
def getSliceMetadata(self) -> Dict[str, Dict[str, Dict[str, str]]]:
"""Get all changed settings and all settings. For each extruder and the global stack"""
print_information = self.application.getPrintInformation()
@ -71,24 +80,16 @@ class Settings:
"quality": asdict(machine_manager.activeQualityDisplayNameMap()),
}
def _retrieveValue(container: InstanceContainer, setting_: str):
value_ = container.getProperty(setting_, "value")
for _ in range(0, 1024): # Prevent possibly endless loop by not using a limit.
if not isinstance(value_, SettingFunction):
return value_ # Success!
value_ = value_(container)
return 0 # Fallback value after breaking possibly endless loop.
global_stack = cast(GlobalStack, self.application.getGlobalContainerStack())
# Add global user or quality changes
global_flattened_changes = InstanceContainer.createMergedInstanceContainer(global_stack.userChanges, global_stack.qualityChanges)
for setting in global_flattened_changes.getAllKeys():
settings["global"]["changes"][setting] = _retrieveValue(global_flattened_changes, setting)
settings["global"]["changes"][setting] = self._retrieveValue(global_flattened_changes, setting)
# Get global all settings values without user or quality changes
for setting in global_stack.getAllKeys():
settings["global"]["all_settings"][setting] = _retrieveValue(global_stack, setting)
settings["global"]["all_settings"][setting] = self._retrieveValue(global_stack, setting)
for i, extruder in enumerate(global_stack.extruderList):
# Add extruder fields to settings dictionary
@ -100,10 +101,19 @@ class Settings:
# Add extruder user or quality changes
extruder_flattened_changes = InstanceContainer.createMergedInstanceContainer(extruder.userChanges, extruder.qualityChanges)
for setting in extruder_flattened_changes.getAllKeys():
settings[f"extruder_{i}"]["changes"][setting] = _retrieveValue(extruder_flattened_changes, setting)
settings[f"extruder_{i}"]["changes"][setting] = self._retrieveValue(extruder_flattened_changes, setting)
# Get extruder all settings values without user or quality changes
for setting in extruder.getAllKeys():
settings[f"extruder_{i}"]["all_settings"][setting] = _retrieveValue(extruder, setting)
settings[f"extruder_{i}"]["all_settings"][setting] = self._retrieveValue(extruder, setting)
return settings
@staticmethod
def _retrieveValue(container: InstanceContainer, setting_: str):
value_ = container.getProperty(setting_, "value")
for _ in range(0, 1024): # Prevent possibly endless loop by not using a limit.
if not isinstance(value_, SettingFunction):
return value_ # Success!
value_ = value_(container)
return 0 # Fallback value after breaking possibly endless loop.

View File

@ -40,7 +40,7 @@ class ArrangeObjectsJob(Job):
found_solution_for_all = False
try:
found_solution_for_all = arranger.arrange()
found_solution_for_all = arranger.arrange(only_if_full_success = True)
except: # If the thread crashes, the message should still close
Logger.logException("e",
"Unable to arrange the objects on the buildplate. The arrange algorithm has crashed.")

View File

@ -16,12 +16,16 @@ class Arranger:
"""
raise NotImplementedError
def arrange(self, add_new_nodes_in_scene: bool = False) -> bool:
def arrange(self, add_new_nodes_in_scene: bool = False, only_if_full_success: bool = False) -> bool:
"""
Find placement for a set of scene nodes, and move them by using a single grouped operation.
:param add_new_nodes_in_scene: Whether to create new scene nodes before applying the transformations and rotations
:return: found_solution_for_all: Whether the algorithm found a place on the buildplate for all the objects
"""
grouped_operation, not_fit_count = self.createGroupOperationForArrange(add_new_nodes_in_scene)
grouped_operation.push()
return not_fit_count == 0
full_success = not_fit_count == 0
if full_success or not only_if_full_success:
grouped_operation.push()
return full_success

View File

@ -54,22 +54,6 @@ class Nest2DArrange(Arranger):
machine_depth = self._build_volume.getDepth() - (edge_disallowed_size * 2)
build_plate_bounding_box = Box(int(machine_width * self._factor), int(machine_depth * self._factor))
if self._fixed_nodes is None:
self._fixed_nodes = []
# Add all the items we want to arrange
node_items = []
for node in self._nodes_to_arrange:
hull_polygon = node.callDecoration("getConvexHull")
if not hull_polygon or hull_polygon.getPoints is None:
Logger.log("w", "Object {} cannot be arranged because it has no convex hull.".format(node.getName()))
continue
converted_points = []
for point in hull_polygon.getPoints():
converted_points.append(Point(int(point[0] * self._factor), int(point[1] * self._factor)))
item = Item(converted_points)
node_items.append(item)
# Use a tiny margin for the build_plate_polygon (the nesting doesn't like overlapping disallowed areas)
half_machine_width = 0.5 * machine_width - 1
half_machine_depth = 0.5 * machine_depth - 1
@ -80,40 +64,66 @@ class Nest2DArrange(Arranger):
[half_machine_width, half_machine_depth]
], numpy.float32))
disallowed_areas = self._build_volume.getDisallowedAreas()
for area in disallowed_areas:
converted_points = []
def _convert_points(points):
if points is not None and len(points) > 2: # numpy array has to be explicitly checked against None
converted_points = []
for point in points:
converted_points.append(Point(int(point[0] * self._factor), int(point[1] * self._factor)))
return [converted_points]
else:
return []
polygons_nodes_to_arrange = []
for node in self._nodes_to_arrange:
hull_polygon = node.callDecoration("getConvexHull")
if not hull_polygon or hull_polygon.getPoints is None:
Logger.log("w", "Object {} cannot be arranged because it has no convex hull.".format(node.getName()))
continue
polygons_nodes_to_arrange += _convert_points(hull_polygon.getPoints())
polygons_disallowed_areas = []
for area in self._build_volume.getDisallowedAreas():
# Clip the disallowed areas so that they don't overlap the bounding box (The arranger chokes otherwise)
clipped_area = area.intersectionConvexHulls(build_plate_polygon)
if clipped_area.getPoints() is not None and len(
clipped_area.getPoints()) > 2: # numpy array has to be explicitly checked against None
for point in clipped_area.getPoints():
converted_points.append(Point(int(point[0] * self._factor), int(point[1] * self._factor)))
polygons_disallowed_areas += _convert_points(clipped_area.getPoints())
disallowed_area = Item(converted_points)
polygons_fixed_nodes = []
if self._fixed_nodes is None:
self._fixed_nodes = []
for node in self._fixed_nodes:
hull_polygon = node.callDecoration("getConvexHull")
if hull_polygon is not None:
polygons_fixed_nodes += _convert_points(hull_polygon.getPoints())
strategies = [NfpConfig.Alignment.CENTER,
NfpConfig.Alignment.BOTTOM_LEFT,
NfpConfig.Alignment.BOTTOM_RIGHT,
NfpConfig.Alignment.TOP_LEFT,
NfpConfig.Alignment.TOP_RIGHT]
found_solution_for_all = False
while not found_solution_for_all and len(strategies) > 0:
# Add all the items we want to arrange
node_items = []
for polygon in polygons_nodes_to_arrange:
node_items.append(Item(polygon))
for polygon in polygons_disallowed_areas:
disallowed_area = Item(polygon)
disallowed_area.markAsDisallowedAreaInBin(0)
node_items.append(disallowed_area)
for node in self._fixed_nodes:
converted_points = []
hull_polygon = node.callDecoration("getConvexHull")
if hull_polygon is not None and hull_polygon.getPoints() is not None and len(
hull_polygon.getPoints()) > 2: # numpy array has to be explicitly checked against None
for point in hull_polygon.getPoints():
converted_points.append(Point(int(point[0] * self._factor), int(point[1] * self._factor)))
item = Item(converted_points)
for polygon in polygons_fixed_nodes:
item = Item(polygon)
item.markAsFixedInBin(0)
node_items.append(item)
strategies = [NfpConfig.Alignment.CENTER] * 3 + [NfpConfig.Alignment.BOTTOM_LEFT] * 3
found_solution_for_all = False
while not found_solution_for_all and len(strategies) > 0:
config = NfpConfig()
config.accuracy = 1.0
config.alignment = NfpConfig.Alignment.CENTER
config.alignment = NfpConfig.Alignment.DONT_ALIGN
config.starting_point = strategies[0]
strategies = strategies[1:]

View File

@ -1,5 +1,8 @@
# Copyright (c) 2021 Ultimaker B.V.
# Copyright (c) 2025 UltiMaker
# Cura is released under the terms of the LGPLv3 or higher.
import tempfile
import json
import io
import os
@ -7,12 +10,13 @@ import re
import shutil
from copy import deepcopy
from zipfile import ZipFile, ZIP_DEFLATED, BadZipfile
from typing import Dict, Optional, TYPE_CHECKING, List
from typing import Callable, Dict, Optional, TYPE_CHECKING, List
from UM import i18nCatalog
from UM.Logger import Logger
from UM.Message import Message
from UM.Platform import Platform
from UM.PluginRegistry import PluginRegistry
from UM.Resources import Resources
from UM.Version import Version
@ -30,6 +34,7 @@ class Backup:
"""These files should be ignored when making a backup."""
IGNORED_FOLDERS = [] # type: List[str]
"""These folders should be ignored when making a backup."""
SECRETS_SETTINGS = ["general/ultimaker_auth_data"]
"""Secret preferences that need to obfuscated when making a backup of Cura"""
@ -42,7 +47,7 @@ class Backup:
self.zip_file = zip_file # type: Optional[bytes]
self.meta_data = meta_data # type: Optional[Dict[str, str]]
def makeFromCurrent(self) -> None:
def makeFromCurrent(self, available_remote_plugins: frozenset[str] = frozenset()) -> None:
"""Create a back-up from the current user config folder."""
cura_release = self._application.getVersion()
@ -68,7 +73,7 @@ class Backup:
# Create an empty buffer and write the archive to it.
buffer = io.BytesIO()
archive = self._makeArchive(buffer, version_data_dir)
archive = self._makeArchive(buffer, version_data_dir, available_remote_plugins)
if archive is None:
return
files = archive.namelist()
@ -77,9 +82,7 @@ class Backup:
machine_count = max(len([s for s in files if "machine_instances/" in s]) - 1, 0) # If people delete their profiles but not their preferences, it can still make a backup, and report -1 profiles. Server crashes on this.
material_count = max(len([s for s in files if "materials/" in s]) - 1, 0)
profile_count = max(len([s for s in files if "quality_changes/" in s]) - 1, 0)
# We don't store plugins anymore, since if you can make backups, you have an account (and the plugins are
# on the marketplace anyway)
plugin_count = 0
plugin_count = len([s for s in files if "plugin.json" in s])
# Store the archive and metadata so the BackupManager can fetch them when needed.
self.zip_file = buffer.getvalue()
self.meta_data = {
@ -92,22 +95,72 @@ class Backup:
# Restore the obfuscated settings
self._illuminate(**secrets)
def _makeArchive(self, buffer: "io.BytesIO", root_path: str) -> Optional[ZipFile]:
def _fillToInstallsJson(self, file_path: str, reinstall_on_restore: frozenset[str], add_to_archive: Callable[[str, str], None]) -> Optional[str]:
""" Moves all plugin-data (in a config-file) for plugins that could be (re)installed from the Marketplace from
'installed' to 'to_installs' before adding that file to the archive.
Note that the 'filename'-entry in the package-data (of the plugins) might not be valid anymore on restore.
We'll replace it on restore instead, as that's the time when the new package is downloaded.
:param file_path: Absolute path to the packages-file.
:param reinstall_on_restore: A set of plugins that _can_ be reinstalled from the Marketplace.
:param add_to_archive: A function/lambda that takes a filename and adds it to the archive (as the 2nd name).
"""
with open(file_path, "r") as file:
data = json.load(file)
reinstall, keep_in = {}, {}
for install_id, install_info in data["installed"].items():
(reinstall if install_id in reinstall_on_restore else keep_in)[install_id] = install_info
data["installed"] = keep_in
data["to_install"].update(reinstall)
if data is not None:
tmpfile = tempfile.NamedTemporaryFile(delete_on_close=False)
with open(tmpfile.name, "w") as outfile:
json.dump(data, outfile)
add_to_archive(tmpfile.name, file_path)
return tmpfile.name
return None
def _findRedownloadablePlugins(self, available_remote_plugins: frozenset) -> (frozenset[str], frozenset[str]):
""" Find all plugins that should be able to be reinstalled from the Marketplace.
:param plugins_path: Path to all plugins in the user-space.
:return: Tuple of a set of plugin-ids and a set of plugin-paths.
"""
plugin_reg = PluginRegistry.getInstance()
id = "id"
plugins = [v for v in plugin_reg.getAllMetaData()
if v[id] in available_remote_plugins and not plugin_reg.isBundledPlugin(v[id])]
return frozenset([v[id] for v in plugins]), frozenset([v["location"] for v in plugins])
def _makeArchive(self, buffer: "io.BytesIO", root_path: str, available_remote_plugins: frozenset) -> Optional[ZipFile]:
"""Make a full archive from the given root path with the given name.
:param root_path: The root directory to archive recursively.
:return: The archive as bytes.
"""
ignore_string = re.compile("|".join(self.IGNORED_FILES + self.IGNORED_FOLDERS))
reinstall_instead_ids, reinstall_instead_paths = self._findRedownloadablePlugins(available_remote_plugins)
tmpfiles = []
try:
archive = ZipFile(buffer, "w", ZIP_DEFLATED)
for root, folders, files in os.walk(root_path):
add_path_to_archive = lambda path, alt_path: archive.write(path, alt_path[len(root_path) + len(os.sep):])
for root, folders, files in os.walk(root_path, topdown=True):
for item_name in folders + files:
absolute_path = os.path.join(root, item_name)
if ignore_string.search(absolute_path):
if ignore_string.search(absolute_path) or any([absolute_path.startswith(x) for x in reinstall_instead_paths]):
continue
archive.write(absolute_path, absolute_path[len(root_path) + len(os.sep):])
if item_name == "packages.json":
tmpfiles.append(
self._fillToInstallsJson(absolute_path, reinstall_instead_ids, add_path_to_archive))
else:
add_path_to_archive(absolute_path, absolute_path)
archive.close()
for tmpfile_path in tmpfiles:
try:
os.remove(tmpfile_path)
except IOError as ex:
Logger.warning(f"Couldn't remove temporary file '{tmpfile_path}' because '{ex}'.")
return archive
except (IOError, OSError, BadZipfile) as error:
Logger.log("e", "Could not create archive from user data directory: %s", error)

View File

@ -1,4 +1,4 @@
# Copyright (c) 2018 Ultimaker B.V.
# Copyright (c) 2025 UltiMaker
# Cura is released under the terms of the LGPLv3 or higher.
from typing import Dict, Optional, Tuple, TYPE_CHECKING
@ -22,7 +22,10 @@ class BackupsManager:
def __init__(self, application: "CuraApplication") -> None:
self._application = application
def createBackup(self) -> Tuple[Optional[bytes], Optional[Dict[str, str]]]:
def shouldReinstallDownloadablePlugins(self) -> bool:
return True
def createBackup(self, available_remote_plugins: frozenset[str] = frozenset()) -> Tuple[Optional[bytes], Optional[Dict[str, str]]]:
"""
Get a back-up of the current configuration.
@ -31,17 +34,18 @@ class BackupsManager:
self._disableAutoSave()
backup = Backup(self._application)
backup.makeFromCurrent()
backup.makeFromCurrent(available_remote_plugins if self.shouldReinstallDownloadablePlugins() else frozenset())
self._enableAutoSave()
# We don't return a Backup here because we want plugins only to interact with our API and not full objects.
return backup.zip_file, backup.meta_data
def restoreBackup(self, zip_file: bytes, meta_data: Dict[str, str]) -> None:
def restoreBackup(self, zip_file: bytes, meta_data: Dict[str, str], auto_close: bool = True) -> None:
"""
Restore a back-up from a given ZipFile.
:param zip_file: A bytes object containing the actual back-up.
:param meta_data: A dict containing some metadata that is needed to restore the back-up correctly.
:param auto_close: Normally, Cura will need to close immediately after restoring the back-up.
"""
if not meta_data.get("cura_release", None):
@ -54,7 +58,7 @@ class BackupsManager:
backup = Backup(self._application, zip_file = zip_file, meta_data = meta_data)
restored = backup.restore()
if restored:
if restored and auto_close:
# At this point, Cura will need to restart for the changes to take effect.
# We don't want to store the data at this point as that would override the just-restored backup.
self._application.windowClosed(save_data = False)

View File

@ -188,6 +188,7 @@ class CuraApplication(QtApplication):
self._single_instance = None
self._open_project_mode: Optional[str] = None
self._read_operation_is_project_file: Optional[bool] = None
self._cura_formula_functions = None # type: Optional[CuraFormulaFunctions]
@ -2015,18 +2016,18 @@ class CuraApplication(QtApplication):
self.deleteAll()
break
is_project_file = self.checkIsValidProjectFile(file)
self._read_operation_is_project_file = self.checkIsValidProjectFile(file)
if self._open_project_mode is None:
self._open_project_mode = self.getPreferences().getValue("cura/choice_on_open_project")
if is_project_file and self._open_project_mode == "open_as_project":
if self._read_operation_is_project_file and self._open_project_mode == "open_as_project":
# open as project immediately without presenting a dialog
workspace_handler = self.getWorkspaceFileHandler()
workspace_handler.readLocalFile(file, add_to_recent_files_hint = add_to_recent_files)
return
if is_project_file and self._open_project_mode == "always_ask":
if self._read_operation_is_project_file and self._open_project_mode == "always_ask":
# present a dialog asking to open as project or import models
self.callLater(self.openProjectFile.emit, file, add_to_recent_files)
return
@ -2164,7 +2165,7 @@ class CuraApplication(QtApplication):
nodes_to_arrange.append(node)
# If the file is a project,and models are to be loaded from a that project,
# models inside file should be arranged in buildplate.
elif self._open_project_mode == "open_as_model":
elif self._read_operation_is_project_file and self._open_project_mode == "open_as_model":
nodes_to_arrange.append(node)
# This node is deep copied from some other node which already has a BuildPlateDecorator, but the deepcopy

View File

@ -84,6 +84,7 @@ class MultiplyObjectsJob(Job):
arranger = Nest2DArrange(nodes, Application.getInstance().getBuildVolume(), fixed_nodes, factor=1000)
group_operation, not_fit_count = arranger.createGroupOperationForArrange(add_new_nodes_in_scene=True)
found_solution_for_all = not_fit_count == 0
if nodes_to_add_without_arrange:
for nested_node in nodes_to_add_without_arrange:

View File

@ -127,6 +127,7 @@ class AuthorizationRequestHandler(BaseHTTPRequestHandler):
def _sendHeaders(self, status: "ResponseStatus", content_type: str, redirect_uri: str = None) -> None:
self.send_response(status.code, status.message)
self.send_header("Content-type", content_type)
self.send_header("Strict-Transport-Security", "max-age=900")
if redirect_uri:
self.send_header("Location", redirect_uri)
self.end_headers()

View File

@ -402,6 +402,9 @@ class CuraContainerStack(ContainerStack):
return super().getProperty(key, property_name, context)
def getValue(self, key: str, context = None) -> Any:
return self.getProperty(key, "value", context)
class _ContainerIndexes:
"""Private helper class to keep track of container positions and their types."""

View File

@ -15,6 +15,7 @@ from UM.Scene.Selection import Selection
from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator
from UM.Settings.ContainerRegistry import ContainerRegistry # Finding containers by ID.
from cura.Machines.ContainerTree import ContainerTree
from cura.Settings.ExtruderStack import ExtruderStack
from typing import Any, cast, Dict, List, Optional, TYPE_CHECKING, Union
@ -304,6 +305,11 @@ class ExtruderManager(QObject):
Logger.log("e", "Unable to find one or more of the extruders in %s", used_extruder_stack_ids)
return []
def getFirstUsedExtruderStack(self)-> ExtruderStack:
used_extruders = self.getUsedExtruderStacks()
sorted_extruders = sorted(used_extruders, key=lambda extruder: extruder.getValue("extruder_nr"))
return sorted_extruders[0]
def getInitialExtruderNr(self) -> int:
"""Get the extruder that the print will start with.
@ -320,8 +326,7 @@ class ExtruderManager(QObject):
skirt_brim_extruder_nr = global_stack.getProperty("skirt_brim_extruder_nr", "value")
# if the skirt_brim_extruder_nr is -1, then we use the first used extruder
if skirt_brim_extruder_nr == -1:
used_extruders = self.getUsedExtruderStacks()
return used_extruders[0].position
return self.getFirstUsedExtruderStack().getValue("extruder_nr")
else:
return skirt_brim_extruder_nr
if adhesion_type == "raft":
@ -332,7 +337,7 @@ class ExtruderManager(QObject):
return global_stack.getProperty("support_infill_extruder_nr", "value")
# REALLY no adhesion? Use the first used extruder.
return self.getUsedExtruderStacks()[0].getProperty("extruder_nr", "value")
return self.getFirstUsedExtruderStack().getValue("extruder_nr")
def removeMachineExtruders(self, machine_id: str) -> None:
"""Removes the container stack and user profile for the extruders for a specific machine.

View File

@ -449,6 +449,6 @@ class PrintInformation(QObject):
"""If this is a sort of output 'device' (like local or online file storage, rather than a printer),
the user could have altered the file-name, and thus the project name should be altered as well."""
if isinstance(output_device, ProjectOutputDevice):
new_name = output_device.getLastOutputName()
new_name = output_device.popLastOutputName()
if new_name is not None:
self.setJobName(os.path.splitext(os.path.basename(new_name))[0])

View File

@ -1,9 +1,8 @@
# Copyright (c) 2022 UltiMaker B.V.
# Copyright (c) 2025 UltiMaker
# Cura's build system is released under the terms of the AGPLv3 or higher.
!define APP_NAME "{{ app_name }}"
!define COMP_NAME "{{ company }}"
!define WEB_SITE "{{ web_site }}"
!define VERSION "{{ version }}"
!define VIVERSION "{{ version_major }}.{{ version_minor }}.{{ version_patch }}.0"
!define COPYRIGHT "Copyright (c) {{ year }} {{ company }}"
@ -16,13 +15,11 @@
!define REG_APP_PATH "Software\Microsoft\Windows\CurrentVersion\App Paths\${APP_NAME}-${VERSION}"
!define UNINSTALL_PATH "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}-${VERSION}"
!define REG_START_MENU "Start Menu Folder"
!define REG_START_MENU "Start Menu Shortcut"
;Require administrator access
RequestExecutionLevel admin
var SM_Folder
######################################################################
VIProductVersion "${VIVERSION}"
@ -64,11 +61,9 @@ InstallDir "$PROGRAMFILES64\${APP_NAME}"
!ifdef REG_START_MENU
!define MUI_STARTMENUPAGE_NODISABLE
!define MUI_STARTMENUPAGE_DEFAULTFOLDER "UltiMaker Cura"
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "${REG_ROOT}"
!define MUI_STARTMENUPAGE_REGISTRY_KEY "${UNINSTALL_PATH}"
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "${REG_START_MENU}"
!insertmacro MUI_PAGE_STARTMENU Application $SM_Folder
!endif
!insertmacro MUI_PAGE_INSTFILES
@ -107,27 +102,11 @@ SetOutPath "$INSTDIR"
WriteUninstaller "$INSTDIR\uninstall.exe"
!ifdef REG_START_MENU
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
CreateDirectory "$SMPROGRAMS\$SM_Folder"
CreateShortCut "$SMPROGRAMS\$SM_Folder\${APP_NAME}.lnk" "$INSTDIR\${MAIN_APP_EXE}"
CreateShortCut "$SMPROGRAMS\$SM_Folder\Uninstall ${APP_NAME}.lnk" "$INSTDIR\uninstall.exe"
!ifdef WEB_SITE
WriteIniStr "$INSTDIR\UltiMaker Cura website.url" "InternetShortcut" "URL" "${WEB_SITE}"
CreateShortCut "$SMPROGRAMS\$SM_Folder\UltiMaker Cura website.lnk" "$INSTDIR\UltiMaker Cura website.url"
!endif
!insertmacro MUI_STARTMENU_WRITE_END
CreateShortCut "$SMPROGRAMS\${APP_NAME}.lnk" "$INSTDIR\${MAIN_APP_EXE}"
!endif
!ifndef REG_START_MENU
CreateDirectory "$SMPROGRAMS\{{ app_name }}"
CreateShortCut "$SMPROGRAMS\{{ app_name }}\${APP_NAME}.lnk" "$INSTDIR\${MAIN_APP_EXE}"
CreateShortCut "$SMPROGRAMS\{{ app_name }}\Uninstall ${APP_NAME}.lnk" "$INSTDIR\uninstall.exe"
!ifdef WEB_SITE
WriteIniStr "$INSTDIR\UltiMaker Cura website.url" "InternetShortcut" "URL" "${WEB_SITE}"
CreateShortCut "$SMPROGRAMS\{{ app_name }}\UltiMaker Cura website.lnk" "$INSTDIR\UltiMaker Cura website.url"
!endif
CreateShortCut "$SMPROGRAMS\${APP_NAME}.lnk" "$INSTDIR\${MAIN_APP_EXE}"
!endif
WriteRegStr ${REG_ROOT} "${REG_APP_PATH}" "" "$INSTDIR\${MAIN_APP_EXE}"
@ -138,9 +117,6 @@ WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "DisplayIcon" "$INSTDIR\${MAIN_APP_
WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "DisplayVersion" "${VERSION}"
WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "Publisher" "${COMP_NAME}"
!ifdef WEB_SITE
WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "URLInfoAbout" "${WEB_SITE}"
!endif
SectionEnd
######################################################################
@ -177,29 +153,17 @@ RmDir "$INSTDIR\share\uranium"
RmDir "$INSTDIR\share"
Delete "$INSTDIR\uninstall.exe"
!ifdef WEB_SITE
Delete "$INSTDIR\${APP_NAME} website.url"
!endif
RmDir /r /REBOOTOK "$INSTDIR"
!ifdef REG_START_MENU
!insertmacro MUI_STARTMENU_GETFOLDER "Application" $SM_Folder
Delete "$SMPROGRAMS\$SM_Folder\${APP_NAME}.lnk"
Delete "$SMPROGRAMS\$SM_Folder\Uninstall ${APP_NAME}.lnk"
!ifdef WEB_SITE
Delete "$SMPROGRAMS\$SM_Folder\UltiMaker Cura website.lnk"
!endif
RmDir "$SMPROGRAMS\$SM_Folder"
Delete "$SMPROGRAMS\${APP_NAME}.lnk"
Delete "$SMPROGRAMS\Uninstall ${APP_NAME}.lnk"
!endif
!ifndef REG_START_MENU
Delete "$SMPROGRAMS\{{ app_name }}\${APP_NAME}.lnk"
Delete "$SMPROGRAMS\{{ app_name }}\Uninstall ${APP_NAME}.lnk"
!ifdef WEB_SITE
Delete "$SMPROGRAMS\{{ app_name }}\UltiMaker Cura website.lnk"
!endif
RmDir "$SMPROGRAMS\{{ app_name }}"
Delete "$SMPROGRAMS\${APP_NAME}.lnk"
Delete "$SMPROGRAMS\Uninstall ${APP_NAME}.lnk"
!endif
!insertmacro APP_UNASSOCIATE "stl" "Cura.model"

View File

@ -1,4 +1,4 @@
# Copyright (c) 2022 UltiMaker
# Copyright (c) 2025 UltiMaker
# Cura is released under the terms of the LGPLv3 or higher.
@ -51,7 +51,6 @@ def generate_nsi(source_path: str, dist_path: str, filename: str, version: str):
version_minor = str(parsed_version.minor),
version_patch = str(parsed_version.patch),
company = "UltiMaker",
web_site = "https://ultimaker.com",
year = datetime.now().year,
cura_license_file = str(source_loc.joinpath("packaging", "cura_license.txt")),
compression_method = "LZMA", # ZLIB, BZIP2 or LZMA

View File

@ -1,4 +1,4 @@
# Copyright (c) 2022 UltiMaker
# Copyright (c) 2025 UltiMaker
# Cura is released under the terms of the LGPLv3 or higher.
@ -40,7 +40,6 @@ def generate_wxs(source_path: Path, dist_path: Path, filename: Path, app_name: s
version_minor=str(parsed_version.minor),
version_patch=str(parsed_version.patch),
company="UltiMaker",
web_site="https://ultimaker.com",
year=datetime.now().year,
upgrade_code=str(uuid.uuid5(uuid.NAMESPACE_DNS, app_name)),
cura_license_file=str(source_loc.joinpath("packaging", "msi", "cura_license.rtf")),

View File

@ -94,7 +94,7 @@ class ThreeMFReader(MeshReader):
return temp_mat
@staticmethod
def _convertSavitarNodeToUMNode(savitar_node: Savitar.SceneNode, file_name: str = "") -> Optional[SceneNode]:
def _convertSavitarNodeToUMNode(savitar_node: Savitar.SceneNode, file_name: str = "", archive: zipfile.ZipFile = None) -> Optional[SceneNode]:
"""Convenience function that converts a SceneNode object (as obtained from libSavitar) to a scene node.
:returns: Scene node.
@ -115,6 +115,10 @@ class ThreeMFReader(MeshReader):
active_build_plate = CuraApplication.getInstance().getMultiBuildPlateModel().activeBuildPlate
component_path = savitar_node.getComponentPath()
if component_path != "" and archive is not None:
savitar_node.parseComponentData(archive.open(component_path.lstrip("/")).read())
um_node = CuraSceneNode() # This adds a SettingOverrideDecorator
um_node.addDecorator(BuildPlateDecorator(active_build_plate))
try:
@ -143,7 +147,7 @@ class ThreeMFReader(MeshReader):
um_node.setMeshData(mesh_data)
for child in savitar_node.getChildren():
child_node = ThreeMFReader._convertSavitarNodeToUMNode(child)
child_node = ThreeMFReader._convertSavitarNodeToUMNode(child, archive=archive)
if child_node:
um_node.addChild(child_node)
@ -232,7 +236,7 @@ class ThreeMFReader(MeshReader):
CuraApplication.getInstance().getController().getScene().setMetaDataEntry(key, value)
for node in scene_3mf.getSceneNodes():
um_node = ThreeMFReader._convertSavitarNodeToUMNode(node, file_name)
um_node = ThreeMFReader._convertSavitarNodeToUMNode(node, file_name, archive)
if um_node is None:
continue

View File

@ -23,7 +23,7 @@ def getMetaData() -> Dict:
if "3MFReader.ThreeMFReader" in sys.modules:
metaData["mesh_reader"] = [
{
"extension": "3mf",
"extension": workspace_extension,
"description": catalog.i18nc("@item:inlistbox", "3MF File")
}
]

View File

@ -0,0 +1,176 @@
# Copyright (c) 2025 UltiMaker
# Cura is released under the terms of the LGPLv3 or higher.
import hashlib
import json
from io import StringIO
import xml.etree.ElementTree as ET
import zipfile
from PyQt6.QtCore import Qt, QBuffer
from PyQt6.QtGui import QImage
from UM.Application import Application
from UM.Logger import Logger
from UM.Mesh.MeshWriter import MeshWriter
from UM.PluginRegistry import PluginRegistry
from typing import cast
from cura.CuraApplication import CuraApplication
from .ThreeMFVariant import ThreeMFVariant
from UM.i18n import i18nCatalog
catalog = i18nCatalog("cura")
# Path constants
METADATA_PATH = "Metadata"
THUMBNAIL_PATH_MULTIPLATE = f"{METADATA_PATH}/plate_1.png"
THUMBNAIL_PATH_MULTIPLATE_SMALL = f"{METADATA_PATH}/plate_1_small.png"
GCODE_PATH = f"{METADATA_PATH}/plate_1.gcode"
GCODE_MD5_PATH = f"{GCODE_PATH}.md5"
MODEL_SETTINGS_PATH = f"{METADATA_PATH}/model_settings.config"
PLATE_DESC_PATH = f"{METADATA_PATH}/plate_1.json"
SLICE_INFO_PATH = f"{METADATA_PATH}/slice_info.config"
PROJECT_SETTINGS_PATH = f"{METADATA_PATH}/project_settings.config"
class BambuLabVariant(ThreeMFVariant):
"""BambuLab specific implementation of the 3MF format."""
@property
def mime_type(self) -> str:
return "application/vnd.bambulab-package.3dmanufacturing-3dmodel+xml"
def process_thumbnail(self, snapshot: QImage, thumbnail_buffer: QBuffer,
archive: zipfile.ZipFile, relations_element: ET.Element) -> None:
"""Process the thumbnail for BambuLab variant."""
# Write thumbnail
archive.writestr(zipfile.ZipInfo(THUMBNAIL_PATH_MULTIPLATE), thumbnail_buffer.data())
# Add relations elements for thumbnails
ET.SubElement(relations_element, "Relationship",
Target="/" + THUMBNAIL_PATH_MULTIPLATE, Id="rel-2",
pe="http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail")
ET.SubElement(relations_element, "Relationship",
Target="/" + THUMBNAIL_PATH_MULTIPLATE, Id="rel-4",
Type="http://schemas.bambulab.com/package/2021/cover-thumbnail-middle")
# Create and save small thumbnail
small_snapshot = snapshot.scaled(128, 128, transformMode=Qt.TransformationMode.SmoothTransformation)
small_thumbnail_buffer = QBuffer()
small_thumbnail_buffer.open(QBuffer.OpenModeFlag.ReadWrite)
small_snapshot.save(small_thumbnail_buffer, "PNG")
# Write small thumbnail
archive.writestr(zipfile.ZipInfo(THUMBNAIL_PATH_MULTIPLATE_SMALL), small_thumbnail_buffer.data())
# Add relation for small thumbnail
ET.SubElement(relations_element, "Relationship",
Target="/" + THUMBNAIL_PATH_MULTIPLATE_SMALL, Id="rel-5",
Type="http://schemas.bambulab.com/package/2021/cover-thumbnail-small")
def add_extra_files(self, archive: zipfile.ZipFile, metadata_relations_element: ET.Element) -> None:
"""Add BambuLab specific files to the archive."""
self._storeGCode(archive, metadata_relations_element)
self._storeModelSettings(archive)
self._storePlateDesc(archive)
self._storeSliceInfo(archive)
self._storeProjectSettings(archive)
def _storeGCode(self, archive: zipfile.ZipFile, metadata_relations_element: ET.Element):
"""Store GCode data in the archive."""
gcode_textio = StringIO()
gcode_writer = cast(MeshWriter, PluginRegistry.getInstance().getPluginObject("GCodeWriter"))
success = gcode_writer.write(gcode_textio, None)
if not success:
error_msg = catalog.i18nc("@info:error", "Can't write GCode to 3MF file")
self._writer.setInformation(error_msg)
Logger.error(error_msg)
raise Exception(error_msg)
gcode_data = gcode_textio.getvalue().encode("UTF-8")
archive.writestr(zipfile.ZipInfo(GCODE_PATH), gcode_data)
gcode_relation_element = ET.SubElement(metadata_relations_element, "Relationship",
Target=f"/{GCODE_PATH}", Id="rel-1",
Type="http://schemas.bambulab.com/package/2021/gcode")
# Calculate and store the MD5 sum of the gcode data
md5_hash = hashlib.md5(gcode_data).hexdigest()
archive.writestr(zipfile.ZipInfo(GCODE_MD5_PATH), md5_hash.encode("UTF-8"))
def _storeModelSettings(self, archive: zipfile.ZipFile):
"""Store model settings in the archive."""
config = ET.Element("config")
plate = ET.SubElement(config, "plate")
ET.SubElement(plate, "metadata", key="plater_id", value="1")
ET.SubElement(plate, "metadata", key="plater_name", value="")
ET.SubElement(plate, "metadata", key="locked", value="false")
ET.SubElement(plate, "metadata", key="filament_map_mode", value="Auto For Flush")
extruders_count = len(CuraApplication.getInstance().getExtruderManager().extruderIds)
ET.SubElement(plate, "metadata", key="filament_maps", value=" ".join("1" for _ in range(extruders_count)))
ET.SubElement(plate, "metadata", key="gcode_file", value=GCODE_PATH)
ET.SubElement(plate, "metadata", key="thumbnail_file", value=THUMBNAIL_PATH_MULTIPLATE)
ET.SubElement(plate, "metadata", key="pattern_bbox_file", value=PLATE_DESC_PATH)
self._writer._storeElementTree(archive, MODEL_SETTINGS_PATH, config)
def _storePlateDesc(self, archive: zipfile.ZipFile):
"""Store plate description in the archive."""
plate_desc = {}
filament_ids = []
filament_colors = []
for extruder in CuraApplication.getInstance().getExtruderManager().getUsedExtruderStacks():
filament_ids.append(extruder.getValue("extruder_nr"))
filament_colors.append(self._writer._getMaterialColor(extruder))
plate_desc["filament_ids"] = filament_ids
plate_desc["filament_colors"] = filament_colors
plate_desc["first_extruder"] = CuraApplication.getInstance().getExtruderManager().getInitialExtruderNr()
plate_desc["is_seq_print"] = Application.getInstance().getGlobalContainerStack().getValue("print_sequence") == "one_at_a_time"
plate_desc["nozzle_diameter"] = CuraApplication.getInstance().getExtruderManager().getActiveExtruderStack().getValue("machine_nozzle_size")
plate_desc["version"] = 2
file = zipfile.ZipInfo(PLATE_DESC_PATH)
file.compress_type = zipfile.ZIP_DEFLATED
archive.writestr(file, json.dumps(plate_desc).encode("UTF-8"))
def _storeSliceInfo(self, archive: zipfile.ZipFile):
"""Store slice information in the archive."""
config = ET.Element("config")
header = ET.SubElement(config, "header")
ET.SubElement(header, "header_item", key="X-BBL-Client-Type", value="slicer")
ET.SubElement(header, "header_item", key="X-BBL-Client-Version", value="02.00.01.50")
plate = ET.SubElement(config, "plate")
ET.SubElement(plate, "metadata", key="index", value="1")
ET.SubElement(plate,
"metadata",
key="nozzle_diameters",
value=str(CuraApplication.getInstance().getExtruderManager().getActiveExtruderStack().getValue("machine_nozzle_size")))
print_information = CuraApplication.getInstance().getPrintInformation()
for index, extruder in enumerate(Application.getInstance().getGlobalContainerStack().extruderList):
used_m = print_information.materialLengths[index]
used_g = print_information.materialWeights[index]
if used_m > 0.0 and used_g > 0.0:
ET.SubElement(plate,
"filament",
id=str(extruder.getValue("extruder_nr") + 1),
tray_info_idx="GFA00",
type=extruder.material.getMetaDataEntry("material", ""),
color=self._writer._getMaterialColor(extruder),
used_m=str(used_m),
used_g=str(used_g))
self._writer._storeElementTree(archive, SLICE_INFO_PATH, config)
def _storeProjectSettings(self, archive: zipfile.ZipFile):
api = CuraApplication.getInstance().getCuraAPI()
file = zipfile.ZipInfo(PROJECT_SETTINGS_PATH)
json_string = json.dumps(api.interface.settings.getAllGlobalSettings(), separators=(", ", ": "), indent=4)
archive.writestr(file, json_string.encode("UTF-8"))

View File

@ -0,0 +1,33 @@
# Copyright (c) 2025 UltiMaker
# Cura is released under the terms of the LGPLv3 or higher.
import xml.etree.ElementTree as ET
import zipfile
from PyQt6.QtCore import QBuffer
from PyQt6.QtGui import QImage
from .ThreeMFVariant import ThreeMFVariant
# Standard 3MF paths
METADATA_PATH = "Metadata"
THUMBNAIL_PATH = f"{METADATA_PATH}/thumbnail.png"
class Cura3mfVariant(ThreeMFVariant):
"""Default implementation of the 3MF format."""
@property
def mime_type(self) -> str:
return "application/vnd.ms-package.3dmanufacturing-3dmodel+xml"
def process_thumbnail(self, snapshot: QImage, thumbnail_buffer: QBuffer,
archive: zipfile.ZipFile, relations_element: ET.Element) -> None:
"""Process the thumbnail for default 3MF variant."""
thumbnail_file = zipfile.ZipInfo(THUMBNAIL_PATH)
# Don't try to compress snapshot file, because the PNG is pretty much as compact as it will get
archive.writestr(thumbnail_file, thumbnail_buffer.data())
# Add thumbnail relation to _rels/.rels file
ET.SubElement(relations_element, "Relationship",
Target="/" + THUMBNAIL_PATH, Id="rel1",
Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail")

View File

@ -0,0 +1,74 @@
# Copyright (c) 2025 UltiMaker
# Cura is released under the terms of the LGPLv3 or higher.
from abc import ABC, abstractmethod
from typing import TYPE_CHECKING
import xml.etree.ElementTree as ET
import zipfile
from PyQt6.QtGui import QImage
from PyQt6.QtCore import QBuffer
if TYPE_CHECKING:
from .ThreeMFWriter import ThreeMFWriter
class ThreeMFVariant(ABC):
"""Base class for 3MF format variants.
Different vendors may have their own extensions to the 3MF format,
such as BambuLab's 3MF variant. This class provides an interface
for implementing these variants.
"""
def __init__(self, writer: 'ThreeMFWriter'):
"""
:param writer: The ThreeMFWriter instance that will use this variant
"""
self._writer = writer
@property
@abstractmethod
def mime_type(self) -> str:
"""The MIME type for this 3MF variant."""
pass
def handles_mime_type(self, mime_type: str) -> bool:
"""Check if this variant handles the given MIME type.
:param mime_type: The MIME type to check
:return: True if this variant handles the MIME type, False otherwise
"""
return mime_type == self.mime_type
def prepare_content_types(self, content_types: ET.Element) -> None:
"""Prepare the content types XML element for this variant.
:param content_types: The content types XML element
"""
pass
def prepare_relations(self, relations_element: ET.Element) -> None:
"""Prepare the relations XML element for this variant.
:param relations_element: The relations XML element
"""
pass
def process_thumbnail(self, snapshot: QImage, thumbnail_buffer: QBuffer,
archive: zipfile.ZipFile, relations_element: ET.Element) -> None:
"""Process the thumbnail for this variant.
:param snapshot: The snapshot image
:param thumbnail_buffer: Buffer containing the thumbnail data
:param archive: The zip archive to write to
:param relations_element: The relations XML element
"""
pass
def add_extra_files(self, archive: zipfile.ZipFile, metadata_relations_element: ET.Element) -> None:
"""Add any extra files required by this variant to the archive.
:param archive: The zip archive to write to
:param metadata_relations_element: The metadata relations XML element
"""
pass

View File

@ -1,11 +1,13 @@
# Copyright (c) 2015-2022 Ultimaker B.V.
# Copyright (c) 2015-2025 UltiMaker
# Cura is released under the terms of the LGPLv3 or higher.
import json
import re
import threading
from typing import Optional, cast, List, Dict, Pattern, Set
from typing import Optional, cast, List, Dict, Set
from UM.PluginRegistry import PluginRegistry
from UM.Mesh.MeshWriter import MeshWriter
from UM.Math.Vector import Vector
from UM.Logger import Logger
@ -19,7 +21,9 @@ from UM.Settings.ContainerRegistry import ContainerRegistry
from cura.CuraApplication import CuraApplication
from cura.CuraPackageManager import CuraPackageManager
from cura.Machines.Models.ExtrudersModel import ExtrudersModel
from cura.Settings import CuraContainerStack
from cura.Settings.ExtruderStack import ExtruderStack
from cura.Utils.Threading import call_on_qt_thread
from cura.Scene.CuraSceneNode import CuraSceneNode
from cura.Snapshot import Snapshot
@ -45,11 +49,13 @@ import UM.Application
from .SettingsExportModel import SettingsExportModel
from .SettingsExportGroup import SettingsExportGroup
from .ThreeMFVariant import ThreeMFVariant
from .Cura3mfVariant import Cura3mfVariant
from .BambuLabVariant import BambuLabVariant
from UM.i18n import i18nCatalog
catalog = i18nCatalog("cura")
THUMBNAIL_PATH = "Metadata/thumbnail.png"
MODEL_PATH = "3D/3dmodel.model"
PACKAGE_METADATA_PATH = "Cura/packages.json"
@ -68,6 +74,12 @@ class ThreeMFWriter(MeshWriter):
self._store_archive = False
self._lock = threading.Lock()
# Register available variants
self._variants = {
Cura3mfVariant(self).mime_type: Cura3mfVariant,
BambuLabVariant(self).mime_type: BambuLabVariant
}
@staticmethod
def _convertMatrixToString(matrix):
result = ""
@ -201,26 +213,48 @@ class ThreeMFWriter(MeshWriter):
painter.end()
def write(self, stream, nodes, mode = MeshWriter.OutputMode.BinaryMode, export_settings_model = None) -> bool:
def _getVariant(self, mime_type: str) -> ThreeMFVariant:
"""Get the appropriate variant for the given MIME type.
:param mime_type: The MIME type to get the variant for
:return: An instance of the variant for the given MIME type
"""
variant_class = self._variants.get(mime_type, Cura3mfVariant)
return variant_class(self)
def write(self, stream, nodes, mode = MeshWriter.OutputMode.BinaryMode, export_settings_model = None, **kwargs) -> bool:
self._archive = None # Reset archive
archive = zipfile.ZipFile(stream, "w", compression = zipfile.ZIP_DEFLATED)
# Determine which variant to use based on mime type in kwargs
mime_type = kwargs.get("mime_type", Cura3mfVariant(self).mime_type)
variant = self._getVariant(mime_type)
try:
model_file = zipfile.ZipInfo(MODEL_PATH)
# Because zipfile is stupid and ignores archive-level compression settings when writing with ZipInfo.
model_file.compress_type = zipfile.ZIP_DEFLATED
# Create content types file
content_types_file = zipfile.ZipInfo("[Content_Types].xml")
content_types_file.compress_type = zipfile.ZIP_DEFLATED
content_types = ET.Element("Types", xmlns = self._namespaces["content-types"])
rels_type = ET.SubElement(content_types, "Default", Extension = "rels", ContentType = "application/vnd.openxmlformats-package.relationships+xml")
model_type = ET.SubElement(content_types, "Default", Extension = "model", ContentType = "application/vnd.ms-package.3dmanufacturing-3dmodel+xml")
# Create _rels/.rels file
relations_file = zipfile.ZipInfo("_rels/.rels")
relations_file.compress_type = zipfile.ZIP_DEFLATED
relations_element = ET.Element("Relationships", xmlns = self._namespaces["relationships"])
model_relation_element = ET.SubElement(relations_element, "Relationship", Target = "/" + MODEL_PATH, Id = "rel0", Type = "http://schemas.microsoft.com/3dmanufacturing/2013/01/3dmodel")
relations_element = self._makeRelationsTree()
model_relation_element = ET.SubElement(relations_element, "Relationship", Target="/" + MODEL_PATH,
Id="rel0",
Type="http://schemas.microsoft.com/3dmanufacturing/2013/01/3dmodel")
# Create Metadata/_rels/model_settings.config.rels
metadata_relations_element = self._makeRelationsTree()
# Let the variant add its specific files
variant.add_extra_files(archive, metadata_relations_element)
# Let the variant prepare content types and relations
variant.prepare_content_types(content_types)
variant.prepare_relations(relations_element)
# Attempt to add a thumbnail
snapshot = self._createSnapshot()
@ -233,16 +267,11 @@ class ThreeMFWriter(MeshWriter):
thumbnail_buffer.open(QBuffer.OpenModeFlag.ReadWrite)
snapshot.save(thumbnail_buffer, "PNG")
thumbnail_file = zipfile.ZipInfo(THUMBNAIL_PATH)
# Don't try to compress snapshot file, because the PNG is pretty much as compact as it will get
archive.writestr(thumbnail_file, thumbnail_buffer.data())
# Add PNG to content types file
thumbnail_type = ET.SubElement(content_types, "Default", Extension="png", ContentType="image/png")
# Add thumbnail relation to _rels/.rels file
thumbnail_relation_element = ET.SubElement(relations_element, "Relationship",
Target="/" + THUMBNAIL_PATH, Id="rel1",
Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail")
# Let the variant process the thumbnail
variant.process_thumbnail(snapshot, thumbnail_buffer, archive, relations_element)
# Write material metadata
packages_metadata = self._getMaterialPackageMetadata() + self._getPluginPackageMetadata()
@ -305,8 +334,10 @@ class ThreeMFWriter(MeshWriter):
scene_string = parser.sceneToString(savitar_scene)
archive.writestr(model_file, scene_string)
archive.writestr(content_types_file, b'<?xml version="1.0" encoding="UTF-8"?> \n' + ET.tostring(content_types))
archive.writestr(relations_file, b'<?xml version="1.0" encoding="UTF-8"?> \n' + ET.tostring(relations_element))
self._storeElementTree(archive, "[Content_Types].xml", content_types)
self._storeElementTree(archive, "_rels/.rels", relations_element)
if len(metadata_relations_element) > 0:
self._storeElementTree(archive, "Metadata/_rels/model_settings.config.rels", metadata_relations_element)
except Exception as error:
Logger.logException("e", "Error writing zip file")
self.setInformation(str(error))
@ -319,6 +350,25 @@ class ThreeMFWriter(MeshWriter):
return True
@staticmethod
def _storeElementTree(archive: zipfile.ZipFile, file_path: str, root_element: ET.Element):
file = zipfile.ZipInfo(file_path)
file.compress_type = zipfile.ZIP_DEFLATED
archive.writestr(file, b'<?xml version="1.0" encoding="UTF-8"?> \n' + ET.tostring(root_element))
def _makeRelationsTree(self):
return ET.Element("Relationships", xmlns=self._namespaces["relationships"])
@staticmethod
def _getMaterialColor(extruder: "ExtruderStack") -> str:
position = int(extruder.getMetaDataEntry("position", default="0"))
try:
default_color = ExtrudersModel.defaultColors[position]
except IndexError:
default_color = "#e0e000"
color_code = extruder.material.getMetaDataEntry("color_code", default=default_color)
return color_code.upper()
@staticmethod
def _storeMetadataJson(metadata: Dict[str, List[Dict[str, str]]], archive: zipfile.ZipFile, path: str) -> None:
"""Stores metadata inside archive path as json file"""

View File

@ -28,11 +28,17 @@ def getMetaData():
metaData["mesh_writer"] = {
"output": [
{
"extension": "3mf",
"extension": workspace_extension,
"description": i18n_catalog.i18nc("@item:inlistbox", "3MF file"),
"mime_type": "application/vnd.ms-package.3dmanufacturing-3dmodel+xml",
"mode": ThreeMFWriter.ThreeMFWriter.OutputMode.BinaryMode
},
{
"extension": f"gcode.{workspace_extension}",
"description": i18n_catalog.i18nc("@item:inlistbox", "BambuLab 3MF file"),
"mime_type": "application/vnd.bambulab-package.3dmanufacturing-3dmodel+xml",
"mode": ThreeMFWorkspaceWriter.ThreeMFWorkspaceWriter.OutputMode.BinaryMode
}
]
}
metaData["workspace_writer"] = {
@ -44,7 +50,7 @@ def getMetaData():
"mode": ThreeMFWorkspaceWriter.ThreeMFWorkspaceWriter.OutputMode.BinaryMode
},
{
"extension": "3mf",
"extension": workspace_extension,
"description": i18n_catalog.i18nc("@item:inlistbox", "Universal Cura Project"),
"mime_type": "application/x-ucp",
"mode": ThreeMFWorkspaceWriter.ThreeMFWorkspaceWriter.OutputMode.BinaryMode

View File

@ -1,4 +1,4 @@
# Copyright (c) 2020 Ultimaker B.V.
# Copyright (c) 2025 UltiMaker
# Cura is released under the terms of the LGPLv3 or higher.
import json
import threading
@ -13,11 +13,14 @@ from UM.Message import Message
from UM.TaskManagement.HttpRequestManager import HttpRequestManager
from UM.TaskManagement.HttpRequestScope import JsonDecoratorScope
from UM.i18n import i18nCatalog
from cura.ApplicationMetadata import CuraSDKVersion
from cura.CuraApplication import CuraApplication
from cura.UltimakerCloud.UltimakerCloudScope import UltimakerCloudScope
import cura.UltimakerCloud.UltimakerCloudConstants as UltimakerCloudConstants
catalog = i18nCatalog("cura")
PACKAGES_URL = f"{UltimakerCloudConstants.CuraCloudAPIRoot}/cura-packages/v{UltimakerCloudConstants.CuraCloudAPIVersion}/cura/v{CuraSDKVersion}/packages"
class CreateBackupJob(Job):
"""Creates backup zip, requests upload url and uploads the backup file to cloud storage."""
@ -40,23 +43,54 @@ class CreateBackupJob(Job):
self._job_done = threading.Event()
"""Set when the job completes. Does not indicate success."""
self.backup_upload_error_message = ""
"""After the job completes, an empty string indicates success. Othrerwise, the value is a translated message."""
"""After the job completes, an empty string indicates success. Otherwise, the value is a translated message."""
def _setPluginFetchErrorMessage(self, error_msg: str) -> None:
Logger.error(f"Fetching plugins for backup resulted in error: {error_msg}")
self.backup_upload_error_message = "Couldn't update currently available plugins, backup stopped."
self._upload_message.hide()
self._job_done.set()
def run(self) -> None:
upload_message = Message(catalog.i18nc("@info:backup_status", "Creating your backup..."),
self._upload_message = Message(catalog.i18nc("@info:backup_status", "Fetch re-downloadable package-ids..."),
title = self.MESSAGE_TITLE,
progress = -1)
upload_message.show()
self._upload_message.show()
CuraApplication.getInstance().processEvents()
if CuraApplication.getInstance().getCuraAPI().backups.shouldReinstallDownloadablePlugins():
request_url = f"{PACKAGES_URL}?package_type=plugin"
scope = JsonDecoratorScope(UltimakerCloudScope(CuraApplication.getInstance()))
HttpRequestManager.getInstance().get(
request_url,
scope=scope,
callback=self._continueRun,
error_callback=lambda reply, error: self._setPluginFetchErrorMessage(str(error)),
)
else:
self._continueRun()
def _continueRun(self, reply: "QNetworkReply" = None) -> None:
if reply is not None:
response_data = HttpRequestManager.readJSON(reply)
if "data" not in response_data:
self._setPluginFetchErrorMessage(f"Missing 'data' from response. Keys in response: {response_data.keys()}")
return
available_remote_plugins = frozenset({v["package_id"] for v in response_data["data"]})
else:
available_remote_plugins = frozenset()
self._upload_message.setText(catalog.i18nc("@info:backup_status", "Creating your backup..."))
CuraApplication.getInstance().processEvents()
cura_api = CuraApplication.getInstance().getCuraAPI()
self._backup_zip, backup_meta_data = cura_api.backups.createBackup()
self._backup_zip, backup_meta_data = cura_api.backups.createBackup(available_remote_plugins)
if not self._backup_zip or not backup_meta_data:
self.backup_upload_error_message = catalog.i18nc("@info:backup_status", "There was an error while creating your backup.")
upload_message.hide()
self._upload_message.hide()
return
upload_message.setText(catalog.i18nc("@info:backup_status", "Uploading your backup..."))
self._upload_message.setText(catalog.i18nc("@info:backup_status", "Uploading your backup..."))
CuraApplication.getInstance().processEvents()
# Create an upload entry for the backup.
@ -64,13 +98,18 @@ class CreateBackupJob(Job):
backup_meta_data["description"] = "{}.backup.{}.cura.zip".format(timestamp, backup_meta_data["cura_release"])
self._requestUploadSlot(backup_meta_data, len(self._backup_zip))
self._job_done.wait()
# Note: One 'process events' call wasn't enough with the changed situation somehow.
for _ in range(5000):
CuraApplication.getInstance().processEvents()
if self._job_done.wait(0.02):
break
if self.backup_upload_error_message == "":
upload_message.setText(catalog.i18nc("@info:backup_status", "Your backup has finished uploading."))
upload_message.setProgress(None) # Hide progress bar
self._upload_message.setText(catalog.i18nc("@info:backup_status", "Your backup has finished uploading."))
self._upload_message.setProgress(None) # Hide progress bar
else:
# some error occurred. This error is presented to the user by DrivePluginExtension
upload_message.hide()
self._upload_message.hide()
def _requestUploadSlot(self, backup_metadata: Dict[str, Any], backup_size: int) -> None:
"""Request a backup upload slot from the API.
@ -83,7 +122,6 @@ class CreateBackupJob(Job):
"metadata": backup_metadata
}
}).encode()
HttpRequestManager.getInstance().put(
self._api_backup_url,
data = payload,

View File

@ -1,8 +1,9 @@
# Copyright (c) 2021 Ultimaker B.V.
# Copyright (c) 2025 UltiMaker
# Cura is released under the terms of the LGPLv3 or higher.
import base64
import hashlib
import json
import os
import threading
from tempfile import NamedTemporaryFile
from typing import Optional, Any, Dict
@ -12,9 +13,16 @@ from PyQt6.QtNetwork import QNetworkReply, QNetworkRequest
from UM.Job import Job
from UM.Logger import Logger
from UM.PackageManager import catalog
from UM.Resources import Resources
from UM.TaskManagement.HttpRequestManager import HttpRequestManager
from cura.CuraApplication import CuraApplication
from UM.Version import Version
from cura.ApplicationMetadata import CuraSDKVersion
from cura.CuraApplication import CuraApplication
from cura.UltimakerCloud.UltimakerCloudScope import UltimakerCloudScope
import cura.UltimakerCloud.UltimakerCloudConstants as UltimakerCloudConstants
PACKAGES_URL_TEMPLATE = f"{UltimakerCloudConstants.CuraCloudAPIRoot}/cura-packages/v{UltimakerCloudConstants.CuraCloudAPIVersion}/cura/v{{0}}/packages/{{1}}/download"
class RestoreBackupJob(Job):
"""Downloads a backup and overwrites local configuration with the backup.
@ -38,7 +46,6 @@ class RestoreBackupJob(Job):
self.restore_backup_error_message = ""
def run(self) -> None:
url = self._backup.get("download_url")
assert url is not None
@ -48,7 +55,11 @@ class RestoreBackupJob(Job):
error_callback = self._onRestoreRequestCompleted
)
self._job_done.wait() # A job is considered finished when the run function completes
# Note: Just to be sure, use the same structure here as in CreateBackupJob.
for _ in range(5000):
CuraApplication.getInstance().processEvents()
if self._job_done.wait(0.02):
break
def _onRestoreRequestCompleted(self, reply: QNetworkReply, error: Optional["QNetworkReply.NetworkError"] = None) -> None:
if not HttpRequestManager.replyIndicatesSuccess(reply, error):
@ -60,8 +71,8 @@ class RestoreBackupJob(Job):
# We store the file in a temporary path fist to ensure integrity.
try:
temporary_backup_file = NamedTemporaryFile(delete = False)
with open(temporary_backup_file.name, "wb") as write_backup:
self._temporary_backup_file = NamedTemporaryFile(delete_on_close = False)
with open(self._temporary_backup_file.name, "wb") as write_backup:
app = CuraApplication.getInstance()
bytes_read = reply.read(self.DISK_WRITE_BUFFER_SIZE)
while bytes_read:
@ -69,23 +80,98 @@ class RestoreBackupJob(Job):
bytes_read = reply.read(self.DISK_WRITE_BUFFER_SIZE)
app.processEvents()
except EnvironmentError as e:
Logger.log("e", f"Unable to save backed up files due to computer limitations: {str(e)}")
Logger.error(f"Unable to save backed up files due to computer limitations: {str(e)}")
self.restore_backup_error_message = self.DEFAULT_ERROR_MESSAGE
self._job_done.set()
return
if not self._verifyMd5Hash(temporary_backup_file.name, self._backup.get("md5_hash", "")):
if not self._verifyMd5Hash(self._temporary_backup_file.name, self._backup.get("md5_hash", "")):
# Don't restore the backup if the MD5 hashes do not match.
# This can happen if the download was interrupted.
Logger.log("w", "Remote and local MD5 hashes do not match, not restoring backup.")
Logger.error("Remote and local MD5 hashes do not match, not restoring backup.")
self.restore_backup_error_message = self.DEFAULT_ERROR_MESSAGE
self._job_done.set()
return
# Tell Cura to place the backup back in the user data folder.
with open(temporary_backup_file.name, "rb") as read_backup:
metadata = self._backup.get("metadata", {})
with open(self._temporary_backup_file.name, "rb") as read_backup:
cura_api = CuraApplication.getInstance().getCuraAPI()
cura_api.backups.restoreBackup(read_backup.read(), self._backup.get("metadata", {}))
cura_api.backups.restoreBackup(read_backup.read(), metadata, auto_close=False)
self._job_done.set()
# Read packages data-file, to get the 'to_install' plugin-ids.
version_to_restore = Version(metadata.get("cura_release", "dev"))
version_str = f"{version_to_restore.getMajor()}.{version_to_restore.getMinor()}"
packages_path = os.path.abspath(os.path.join(os.path.abspath(
Resources.getConfigStoragePath()), "..", version_str, "packages.json"))
if not os.path.exists(packages_path):
Logger.error(f"Can't find path '{packages_path}' to tell what packages should be redownloaded.")
self.restore_backup_error_message = self.DEFAULT_ERROR_MESSAGE
self._job_done.set()
return
to_install = {}
try:
with open(packages_path, "r") as packages_file:
packages_json = json.load(packages_file)
if "to_install" in packages_json:
for package_data in packages_json["to_install"].values():
if "package_info" not in package_data:
continue
package_info = package_data["package_info"]
if "package_id" in package_info and "sdk_version_semver" in package_info:
to_install[package_info["package_id"]] = package_info["sdk_version_semver"]
except IOError as ex:
Logger.error(f"Couldn't open '{packages_path}' because '{str(ex)}' to get packages to re-install.")
self.restore_backup_error_message = self.DEFAULT_ERROR_MESSAGE
self._job_done.set()
return
if len(to_install) < 1:
Logger.info("No packages to reinstall, early out.")
self._job_done.set()
return
# Download all re-installable plugins packages, so they can be put back on start-up.
redownload_errors = []
def packageDownloadCallback(package_id: str, msg: "QNetworkReply", err: "QNetworkReply.NetworkError" = None) -> None:
if err is not None or HttpRequestManager.safeHttpStatus(msg) != 200:
redownload_errors.append(err)
del to_install[package_id]
try:
with NamedTemporaryFile(mode="wb", suffix=".curapackage", delete=False) as temp_file:
bytes_read = msg.read(self.DISK_WRITE_BUFFER_SIZE)
while bytes_read:
temp_file.write(bytes_read)
bytes_read = msg.read(self.DISK_WRITE_BUFFER_SIZE)
CuraApplication.getInstance().processEvents()
temp_file.close()
if not CuraApplication.getInstance().getPackageManager().installPackage(temp_file.name):
redownload_errors.append(f"Couldn't install package '{package_id}'.")
except IOError as ex:
redownload_errors.append(f"Couldn't process package '{package_id}' because '{ex}'.")
if len(to_install) < 1:
if len(redownload_errors) == 0:
Logger.info("All packages redownloaded!")
self._job_done.set()
else:
msgs = "\n - ".join(redownload_errors)
Logger.error(f"Couldn't re-install at least one package(s) because: {msgs}")
self.restore_backup_error_message = self.DEFAULT_ERROR_MESSAGE
self._job_done.set()
self._package_download_scope = UltimakerCloudScope(CuraApplication.getInstance())
for package_id, package_api_version in to_install.items():
def handlePackageId(package_id: str = package_id):
HttpRequestManager.getInstance().get(
PACKAGES_URL_TEMPLATE.format(package_api_version, package_id),
scope=self._package_download_scope,
callback=lambda msg: packageDownloadCallback(package_id, msg),
error_callback=lambda msg, err: packageDownloadCallback(package_id, msg, err)
)
handlePackageId(package_id)
@staticmethod
def _verifyMd5Hash(file_path: str, known_hash: str) -> bool:

View File

@ -76,7 +76,7 @@ class GcodeStartEndFormatter:
# will be used. Alternatively, if the expression is formatted as "{[expression], [extruder_nr]}",
# then the expression will be evaluated with the extruder stack of the specified extruder_nr.
_instruction_regex = re.compile(r"{(?P<condition>if|else|elif|endif)?\s*(?P<expression>.*?)\s*(?:,\s*(?P<extruder_nr_expr>.*))?\s*}(?P<end_of_line>\n?)")
_instruction_regex = re.compile(r"{(?P<condition>if|else|elif|endif)?\s*(?P<expression>[^{}]*?)\s*(?:,\s*(?P<extruder_nr_expr>[^{}]*))?\s*}(?P<end_of_line>\n?)")
def __init__(self, all_extruder_settings: Dict[str, Dict[str, Any]], default_extruder_nr: int = -1) -> None:
super().__init__()

View File

@ -24,7 +24,7 @@ class GCodeGzWriter(MeshWriter):
def __init__(self) -> None:
super().__init__(add_to_recent_files = False)
def write(self, stream: BufferedIOBase, nodes: List[SceneNode], mode = MeshWriter.OutputMode.BinaryMode) -> bool:
def write(self, stream: BufferedIOBase, nodes: List[SceneNode], mode = MeshWriter.OutputMode.BinaryMode, **kwargs) -> bool:
"""Writes the gzipped g-code to a stream.
Note that even though the function accepts a collection of nodes, the

View File

@ -56,7 +56,7 @@ class GCodeWriter(MeshWriter):
self._application = Application.getInstance()
def write(self, stream, nodes, mode = MeshWriter.OutputMode.TextMode):
def write(self, stream, nodes, mode = MeshWriter.OutputMode.TextMode, **kwargs):
"""Writes the g-code for the entire scene to a stream.
Note that even though the function accepts a collection of nodes, the

View File

@ -91,7 +91,7 @@ class MakerbotWriter(MeshWriter):
return None
def write(self, stream: BufferedIOBase, nodes: List[SceneNode], mode=MeshWriter.OutputMode.BinaryMode) -> bool:
def write(self, stream: BufferedIOBase, nodes: List[SceneNode], mode=MeshWriter.OutputMode.BinaryMode, **kwargs) -> bool:
metadata, file_format = self._getMeta(nodes)
if mode != MeshWriter.OutputMode.BinaryMode:
Logger.log("e", "MakerbotWriter does not support text mode.")
@ -258,87 +258,11 @@ class MakerbotWriter(MeshWriter):
meta["preferences"] = dict()
bounds = application.getBuildVolume().getBoundingBox()
intent = CuraApplication.getInstance().getIntentManager().currentIntentCategory
meta["preferences"]["instance0"] = {
"machineBounds": [bounds.right, bounds.front, bounds.left, bounds.back] if bounds is not None else None,
"printMode": intent
"printMode": CuraApplication.getInstance().getIntentManager().currentIntentCategory,
}
if file_format == "application/x-makerbot":
accel_overrides = meta["accel_overrides"] = {}
if intent in ['highspeed', 'highspeedsolid']:
accel_overrides['do_input_shaping'] = True
accel_overrides['do_corner_rounding'] = True
bead_mode_overrides = accel_overrides["bead_mode"] = {}
accel_enabled = global_stack.getProperty('acceleration_enabled', 'value')
if accel_enabled:
global_accel_setting = global_stack.getProperty('acceleration_print', 'value')
accel_overrides["rate_mm_per_s_sq"] = {
"x": global_accel_setting,
"y": global_accel_setting
}
if global_stack.getProperty('acceleration_travel_enabled', 'value'):
travel_accel_setting = global_stack.getProperty('acceleration_travel', 'value')
bead_mode_overrides['Travel Move'] = {
"rate_mm_per_s_sq": {
"x": travel_accel_setting,
"y": travel_accel_setting
}
}
jerk_enabled = global_stack.getProperty('jerk_enabled', 'value')
if jerk_enabled:
global_jerk_setting = global_stack.getProperty('jerk_print', 'value')
accel_overrides["max_speed_change_mm_per_s"] = {
"x": global_jerk_setting,
"y": global_jerk_setting
}
if global_stack.getProperty('jerk_travel_enabled', 'value'):
travel_jerk_setting = global_stack.getProperty('jerk_travel', 'value')
if 'Travel Move' not in bead_mode_overrides:
bead_mode_overrides['Travel Move' ] = {}
bead_mode_overrides['Travel Move'].update({
"max_speed_change_mm_per_s": {
"x": travel_jerk_setting,
"y": travel_jerk_setting
}
})
# Get bead mode settings per extruder
available_bead_modes = {
"infill": "FILL",
"prime_tower": "PRIME_TOWER",
"roofing": "TOP_SURFACE",
"support_infill": "SUPPORT",
"support_interface": "SUPPORT_INTERFACE",
"wall_0": "WALL_OUTER",
"wall_x": "WALL_INNER",
"skirt_brim": "SKIRT"
}
for idx, extruder in enumerate(extruders):
for bead_mode_setting, bead_mode_tag in available_bead_modes.items():
ext_specific_tag = "%s_%s" % (bead_mode_tag, idx)
if accel_enabled or jerk_enabled:
bead_mode_overrides[ext_specific_tag] = {}
if accel_enabled:
accel_val = extruder.getProperty('acceleration_%s' % bead_mode_setting, 'value')
bead_mode_overrides[ext_specific_tag]["rate_mm_per_s_sq"] = {
"x": accel_val,
"y": accel_val
}
if jerk_enabled:
jerk_val = extruder.getProperty('jerk_%s' % bead_mode_setting, 'value')
bead_mode_overrides[ext_specific_tag][ "max_speed_change_mm_per_s"] = {
"x": jerk_val,
"y": jerk_val
}
meta["miracle_config"] = {"gaggles": {"instance0": {}}}
version_info = dict()

View File

@ -163,11 +163,21 @@ class PurgeLinesAndUnload(Script):
"move_to_start":
{
"label": "Circle around to layer start ⚠️​",
"description": "Depending on where the 'Layer Start X' and 'Layer Start Y' are for the print, the opening travel move can pass across the print area and leave a string there. This option will generate an orthogonal path that moves the nozzle around the edges of the build plate and then comes in to the Start Point. || ⚠️​ || The nozzle will drop to Z0.0 and touch the build plate at each stop in order to 'nail down the string' so it doesn't follow in a straight line.",
"description": "Depending on where the 'Layer Start X' and 'Layer Start Y' are for the print, the opening travel move can pass across the print area and leave a string there. This option will generate an orthogonal path that moves the nozzle around the edges of the build plate and then comes in to the Start Point. || ⚠️​ || The nozzle can drop to Z0.0 and touch the build plate at each stop in order to 'nail down the string'. The nozzle always raises after the touch-down. It will not drag on the bed.",
"type": "bool",
"default_value": false,
"enabled": true
},
"move_to_start_min_z":
{
"label": " Minimum Z height ⚠️​",
"description": "When moving to the start position, the nozzle can touch down on the build plate at each stop (Z = 0.0). That will stick the string to the build plate at each direction change so it doesn't pull across the print area. Some printers may not respond well to Z=0.0. You may set a minimum Z height here (min is 0.0 and max is 0.50). The string must stick or it defeats the purpose of moving around the periphery.",
"type": "float",
"default_value": 0.0,
"minimum_value": 0.0,
"maximum_value": 0.5,
"enabled": "move_to_start"
},
"adjust_starting_e":
{
"label": "Adjust Starting E location",
@ -254,7 +264,9 @@ class PurgeLinesAndUnload(Script):
self.prime_blob_distance = self.getSettingValueByKey("prime_blob_distance")
else:
self.prime_blob_distance = 0
# Set the minimum Z to stick the string to the build plate when Move to Start is selected.
self.touchdown_z = self.getSettingValueByKey("move_to_start_min_z")
# Mapping settings to corresponding methods
procedures = {
"add_purge_lines": self._add_purge_lines,
@ -385,7 +397,7 @@ class PurgeLinesAndUnload(Script):
def add_move(axis: str, position: float) -> None:
moves.append(
f"G0 F{self.speed_travel} {axis}{position} ; Start move\n"
f"G0 F600 Z0 ; Nail down the string\n"
f"G0 F600 Z{self.touchdown_z} ; Nail down the string\n"
f"G0 F600 Z2 ; Move up\n"
)
@ -479,6 +491,14 @@ class PurgeLinesAndUnload(Script):
def calculate_purge_volume(line_width, purge_length, volume_per_mm):
return round((line_width * 0.3 * purge_length) * 1.25 / volume_per_mm, 5)
def adjust_for_prime_blob_gcode(retract_speed, retract_distance):
"""Generates G-code lines for prime blob adjustment."""
gcode_lines = [
f"G1 F{retract_speed} E{retract_distance} ; Unretract",
"G92 E0 ; Reset extruder\n"
]
return "\n".join(gcode_lines)
purge_location = self.getSettingValueByKey("purge_line_location")
purge_extrusion_full = True if self.getSettingValueByKey("purge_line_length") == "purge_full" else False
@ -494,6 +514,8 @@ class PurgeLinesAndUnload(Script):
# Travel to the purge start
purge_str += f"G0 F{self.speed_travel} X{self.machine_left + self.border_distance} Y{self.machine_front + 10} ; Move to start\n"
purge_str += f"G0 F600 Z0.3 ; Move down\n"
if self.prime_blob_enable:
purge_str += adjust_for_prime_blob_gcode(self.retract_speed, self.retract_dist)
# Purge two lines
purge_str += f"G1 F{self.print_speed} X{self.machine_left + self.border_distance} Y{y_stop} E{purge_volume} ; First line\n"
purge_str += f"G0 X{self.machine_left + 3 + self.border_distance} Y{y_stop} ; Move over\n"
@ -513,6 +535,8 @@ class PurgeLinesAndUnload(Script):
# Travel to the purge start
purge_str += f"G0 F{self.speed_travel} X{self.machine_right - self.border_distance} ; Move\nG0 Y{self.machine_back - 10} ; Move\n"
purge_str += f"G0 F600 Z0.3 ; Move down\n"
if self.prime_blob_enable:
purge_str += adjust_for_prime_blob_gcode(self.retract_speed, self.retract_dist)
# Purge two lines
purge_str += f"G1 F{self.print_speed} X{self.machine_right - self.border_distance} Y{y_stop} E{purge_volume} ; First line\n"
purge_str += f"G0 X{self.machine_right - 3 - self.border_distance} Y{y_stop} ; Move over\n"
@ -533,6 +557,8 @@ class PurgeLinesAndUnload(Script):
# Travel to the purge start
purge_str += f"G0 F{self.speed_travel} X{self.machine_left + 10} Y{self.machine_front + self.border_distance} ; Move to start\n"
purge_str += f"G0 F600 Z0.3 ; Move down\n"
if self.prime_blob_enable:
purge_str += adjust_for_prime_blob_gcode(self.retract_speed, self.retract_dist)
# Purge two lines
purge_str += f"G1 F{self.print_speed} X{x_stop} Y{self.machine_front + self.border_distance} E{purge_volume} ; First line\n"
purge_str += f"G0 X{x_stop} Y{self.machine_front + 3 + self.border_distance} ; Move over\n"
@ -554,6 +580,8 @@ class PurgeLinesAndUnload(Script):
purge_str += f"G0 F{self.speed_travel} Y{self.machine_back - self.border_distance} ; Ortho Move to back\n"
purge_str += f"G0 X{self.machine_right - 10} ; Ortho move to start\n"
purge_str += f"G0 F600 Z0.3 ; Move down\n"
if self.prime_blob_enable:
purge_str += adjust_for_prime_blob_gcode(self.retract_speed, self.retract_dist)
# Purge two lines
purge_str += f"G1 F{self.print_speed} X{x_stop} Y{self.machine_back - self.border_distance} E{purge_volume} ; First line\n"
purge_str += f"G0 X{x_stop} Y{self.machine_back - 3 - self.border_distance} ; Move over\n"
@ -575,6 +603,8 @@ class PurgeLinesAndUnload(Script):
# Travel to the purge start
purge_str += f"G0 F{self.speed_travel} X{self.machine_left + self.border_distance} Y{self.machine_front + 10} ; Move to start\n"
purge_str += f"G0 F600 Z0.3 ; Move down\n"
if self.prime_blob_enable:
purge_str += adjust_for_prime_blob_gcode(self.retract_speed, self.retract_dist)
# Purge two lines
purge_str += f"G1 F{self.print_speed} X{self.machine_left + self.border_distance} Y{y_stop} E{purge_volume} ; First line\n"
purge_str += f"G0 X{self.machine_left + 3 + self.border_distance} Y{y_stop} ; Move over\n"
@ -594,6 +624,8 @@ class PurgeLinesAndUnload(Script):
# Travel to the purge start
purge_str += f"G0 F{self.speed_travel} X{self.machine_right - self.border_distance} Z2 ; Move\nG0 Y{self.machine_back - 10} Z2 ; Move to start\n"
purge_str += f"G0 F600 Z0.3 ; Move down\n"
if self.prime_blob_enable:
purge_str += adjust_for_prime_blob_gcode(self.retract_speed, self.retract_dist)
# Purge two lines
purge_str += f"G1 F{self.print_speed} X{self.machine_right - self.border_distance} Y{y_stop} E{purge_volume} ; First line\n"
purge_str += f"G0 X{self.machine_right - 3 - self.border_distance} Y{y_stop} ; Move over\n"
@ -613,6 +645,8 @@ class PurgeLinesAndUnload(Script):
# Travel to the purge start
purge_str += f"G0 F{self.speed_travel} X{self.machine_left + 10} Z2 ; Move\nG0 Y{self.machine_front + self.border_distance} Z2 ; Move to start\n"
purge_str += f"G0 F600 Z0.3 ; Move down\n"
if self.prime_blob_enable:
purge_str += adjust_for_prime_blob_gcode(self.retract_speed, self.retract_dist)
# Purge two lines
purge_str += f"G1 F{self.print_speed} X{x_stop} Y{self.machine_front + self.border_distance} E{purge_volume} ; First line\n"
purge_str += f"G0 X{x_stop} Y{self.machine_front + 3 + self.border_distance} ; Move over\n"
@ -633,6 +667,8 @@ class PurgeLinesAndUnload(Script):
purge_str += f"G0 F{self.speed_travel} Y{self.machine_back - self.border_distance} Z2; Ortho Move to back\n"
purge_str += f"G0 X{self.machine_right - 10} Z2 ; Ortho Move to start\n"
purge_str += f"G0 F600 Z0.3 ; Move down\n"
if self.prime_blob_enable:
purge_str += adjust_for_prime_blob_gcode(self.retract_speed, self.retract_dist)
# Purge two lines
purge_str += f"G1 F{self.print_speed} X{x_stop} Y{self.machine_back - self.border_distance} E{purge_volume} ; First line\n"
purge_str += f"G0 X{x_stop} Y{self.machine_back - 3 - self.border_distance} ; Move over\n"
@ -945,7 +981,7 @@ class PurgeLinesAndUnload(Script):
blob_string = "G0 F1200 Z20 ; Move up\n"
blob_string += f"G0 F{self.speed_travel} X{blob_x} Y{blob_y} ; Move to blob location\n"
blob_string += f"G1 F{speed_blob} E{self.prime_blob_distance} ; Blob\n"
blob_string += f"G1 F{self.retract_speed} E-{self.retract_dist} ; Retract\n"
blob_string += f"G1 F{self.retract_speed} E{self.prime_blob_distance - self.retract_dist} ; Retract\n"
blob_string += "G92 E0 ; Reset extruder\n"
blob_string += "M300 P500 S600 ; Beep\n"
blob_string += "G4 S2 ; Wait\n"

View File

@ -101,7 +101,8 @@ class RemovableDriveOutputDevice(OutputDevice):
self._stream = open(file_name, "wt", buffering = 1, encoding = "utf-8")
else: #Binary mode.
self._stream = open(file_name, "wb", buffering = 1)
job = WriteFileJob(writer, self._stream, nodes, preferred_format["mode"])
writer_args = {"mime_type": preferred_format["mime_type"]}
job = WriteFileJob(writer, self._stream, nodes, preferred_format["mode"], writer_args)
job.setFileName(file_name)
job.progress.connect(self._onProgress)
job.finished.connect(self._onFinished)

View File

@ -67,39 +67,40 @@ class SimulationPass(RenderPass):
if not self._compatibility_mode:
self._layer_shader.setUniformValue("u_starts_color", Color(*Application.getInstance().getTheme().getColor("layerview_starts").getRgb()))
if self._layer_view:
self._layer_shader.setUniformValue("u_max_feedrate", self._layer_view.getMaxFeedrate())
self._layer_shader.setUniformValue("u_min_feedrate", self._layer_view.getMinFeedrate())
self._layer_shader.setUniformValue("u_max_thickness", self._layer_view.getMaxThickness())
self._layer_shader.setUniformValue("u_min_thickness", self._layer_view.getMinThickness())
self._layer_shader.setUniformValue("u_max_line_width", self._layer_view.getMaxLineWidth())
self._layer_shader.setUniformValue("u_min_line_width", self._layer_view.getMinLineWidth())
self._layer_shader.setUniformValue("u_max_flow_rate", self._layer_view.getMaxFlowRate())
self._layer_shader.setUniformValue("u_min_flow_rate", self._layer_view.getMinFlowRate())
self._layer_shader.setUniformValue("u_layer_view_type", self._layer_view.getSimulationViewType())
self._layer_shader.setUniformValue("u_extruder_opacity", self._layer_view.getExtruderOpacities())
self._layer_shader.setUniformValue("u_show_travel_moves", self._layer_view.getShowTravelMoves())
self._layer_shader.setUniformValue("u_show_helpers", self._layer_view.getShowHelpers())
self._layer_shader.setUniformValue("u_show_skin", self._layer_view.getShowSkin())
self._layer_shader.setUniformValue("u_show_infill", self._layer_view.getShowInfill())
self._layer_shader.setUniformValue("u_show_starts", self._layer_view.getShowStarts())
else:
#defaults
self._layer_shader.setUniformValue("u_max_feedrate", 1)
self._layer_shader.setUniformValue("u_min_feedrate", 0)
self._layer_shader.setUniformValue("u_max_thickness", 1)
self._layer_shader.setUniformValue("u_min_thickness", 0)
self._layer_shader.setUniformValue("u_max_flow_rate", 1)
self._layer_shader.setUniformValue("u_min_flow_rate", 0)
self._layer_shader.setUniformValue("u_max_line_width", 1)
self._layer_shader.setUniformValue("u_min_line_width", 0)
self._layer_shader.setUniformValue("u_layer_view_type", 1)
self._layer_shader.setUniformValue("u_extruder_opacity", [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]])
self._layer_shader.setUniformValue("u_show_travel_moves", 0)
self._layer_shader.setUniformValue("u_show_helpers", 1)
self._layer_shader.setUniformValue("u_show_skin", 1)
self._layer_shader.setUniformValue("u_show_infill", 1)
self._layer_shader.setUniformValue("u_show_starts", 1)
for shader in [self._layer_shader, self._layer_shadow_shader]:
if self._layer_view:
shader.setUniformValue("u_max_feedrate", self._layer_view.getMaxFeedrate())
shader.setUniformValue("u_min_feedrate", self._layer_view.getMinFeedrate())
shader.setUniformValue("u_max_thickness", self._layer_view.getMaxThickness())
shader.setUniformValue("u_min_thickness", self._layer_view.getMinThickness())
shader.setUniformValue("u_max_line_width", self._layer_view.getMaxLineWidth())
shader.setUniformValue("u_min_line_width", self._layer_view.getMinLineWidth())
shader.setUniformValue("u_max_flow_rate", self._layer_view.getMaxFlowRate())
shader.setUniformValue("u_min_flow_rate", self._layer_view.getMinFlowRate())
shader.setUniformValue("u_layer_view_type", self._layer_view.getSimulationViewType())
shader.setUniformValue("u_extruder_opacity", self._layer_view.getExtruderOpacities())
shader.setUniformValue("u_show_travel_moves", self._layer_view.getShowTravelMoves())
shader.setUniformValue("u_show_helpers", self._layer_view.getShowHelpers())
shader.setUniformValue("u_show_skin", self._layer_view.getShowSkin())
shader.setUniformValue("u_show_infill", self._layer_view.getShowInfill())
shader.setUniformValue("u_show_starts", self._layer_view.getShowStarts())
else:
#defaults
shader.setUniformValue("u_max_feedrate", 1)
shader.setUniformValue("u_min_feedrate", 0)
shader.setUniformValue("u_max_thickness", 1)
shader.setUniformValue("u_min_thickness", 0)
shader.setUniformValue("u_max_flow_rate", 1)
shader.setUniformValue("u_min_flow_rate", 0)
shader.setUniformValue("u_max_line_width", 1)
shader.setUniformValue("u_min_line_width", 0)
shader.setUniformValue("u_layer_view_type", 1)
shader.setUniformValue("u_extruder_opacity", [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]])
shader.setUniformValue("u_show_travel_moves", 0)
shader.setUniformValue("u_show_helpers", 1)
shader.setUniformValue("u_show_skin", 1)
shader.setUniformValue("u_show_infill", 1)
shader.setUniformValue("u_show_starts", 1)
if not self._tool_handle_shader:
self._tool_handle_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "toolhandle.shader"))

View File

@ -51,7 +51,7 @@ class UFPWriter(MeshWriter):
# Qt thread. The File read/write operations right now are executed on separated threads because they are scheduled
# by the Job class.
@call_on_qt_thread
def write(self, stream, nodes, mode = MeshWriter.OutputMode.BinaryMode):
def write(self, stream, nodes, mode = MeshWriter.OutputMode.BinaryMode, **kwargs):
archive = VirtualFile()
archive.openStream(stream, "application/x-ufp", OpenMode.WriteOnly)

View File

@ -21,7 +21,7 @@ def main() -> None:
parser.add_argument("--diagnose", action="store_true", help="Diagnose the files")
parser.add_argument("--deleted", action="store_true", help="Check for deleted files")
parser.add_argument("--fix", action="store_true", help="Attempt to apply the suggested fixes on the files")
parser.add_argument("Files", metavar="F", type=Path, nargs="+", help="Files or directories to format")
parser.add_argument("Files", type=Path, nargs="+", help="Files or directories to format")
args = parser.parse_args()
files = extractFilePaths(args.Files)
@ -39,7 +39,7 @@ def main() -> None:
return
with open(setting_path, "r") as f:
settings = yaml.load(f, yaml.FullLoader)
settings = yaml.safe_load(f)
full_body_check = {"Diagnostics": []}
comments_check = {"Error Files": []}

View File

@ -1 +1 @@
version: "5.10.0-beta.1"
version: "5.11.0-alpha.0"

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,267 @@
{
"version": 2,
"name": "BambuLab base definition",
"inherits": "fdmprinter",
"metadata":
{
"visible": false,
"author": "UltiMaker",
"manufacturer": "BambuLab",
"file_formats": "application/vnd.bambulab-package.3dmanufacturing-3dmodel+xml"
},
"overrides":
{
"acceleration_infill": { "value": "acceleration_print" },
"acceleration_layer_0": { "value": 2000 },
"acceleration_prime_tower": { "value": "acceleration_print" },
"acceleration_print": { "value": 20000 },
"acceleration_print_layer_0": { "value": "acceleration_layer_0" },
"acceleration_roofing": { "value": "acceleration_wall_0" },
"acceleration_skirt_brim": { "value": "acceleration_layer_0" },
"acceleration_support": { "value": "acceleration_print" },
"acceleration_support_bottom": { "value": "acceleration_support_interface" },
"acceleration_support_infill": { "value": "acceleration_support" },
"acceleration_support_interface": { "value": "acceleration_support" },
"acceleration_support_roof": { "value": "acceleration_support_interface" },
"acceleration_topbottom": { "value": "acceleration_print" },
"acceleration_travel": { "value": 20000 },
"acceleration_travel_enabled": { "value": true },
"acceleration_travel_layer_0": { "value": "acceleration_layer_0" },
"acceleration_wall": { "value": "acceleration_print/8" },
"acceleration_wall_0": { "value": "acceleration_wall" },
"acceleration_wall_0_roofing": { "value": "acceleration_wall_0" },
"acceleration_wall_x": { "value": "acceleration_print" },
"acceleration_wall_x_roofing": { "value": "acceleration_wall" },
"adhesion_type": { "value": "'skirt'" },
"bottom_thickness": { "value": 0.6 },
"bridge_skin_speed":
{
"unit": "mm/s",
"value": "bridge_wall_speed"
},
"bridge_sparse_infill_max_density": { "value": 50 },
"bridge_wall_min_length": { "value": 10 },
"bridge_wall_speed":
{
"unit": "mm/s",
"value": 50
},
"cool_min_layer_time": { "value": 6 },
"cool_min_speed": { "value": 6 },
"cool_min_temperature": { "value": "material_print_temperature-15" },
"default_material_print_temperature": { "maximum_value_warning": 320 },
"extra_infill_lines_to_support_skins": { "value": "'walls_and_lines'" },
"gradual_flow_enabled": { "value": false },
"hole_xy_offset": { "value": 0.075 },
"infill_overlap": { "value": 10 },
"infill_pattern": { "value": "'zigzag' if infill_sparse_density > 80 else 'gyroid'" },
"infill_sparse_density": { "value": 15 },
"infill_wall_line_count": { "value": "1 if infill_sparse_density > 80 else 0" },
"jerk_infill": { "value": "jerk_print" },
"jerk_layer_0": { "value": "jerk_print/2" },
"jerk_prime_tower": { "value": "jerk_print" },
"jerk_print": { "value": "50" },
"jerk_print_layer_0": { "value": "jerk_layer_0" },
"jerk_roofing": { "value": "jerk_wall_0" },
"jerk_skirt_brim": { "value": "jerk_layer_0" },
"jerk_support": { "value": "jerk_print" },
"jerk_support_bottom": { "value": "jerk_support_interface" },
"jerk_support_infill": { "value": "jerk_support" },
"jerk_support_interface": { "value": "jerk_support" },
"jerk_support_roof": { "value": "jerk_support_interface" },
"jerk_topbottom": { "value": "jerk_print" },
"jerk_travel": { "value": 50 },
"jerk_travel_enabled": { "value": true },
"jerk_travel_layer_0": { "value": "jerk_travel" },
"jerk_wall": { "value": "jerk_print/5" },
"jerk_wall_0": { "value": "jerk_wall" },
"jerk_wall_0_roofing": { "value": "jerk_wall_0" },
"jerk_wall_x": { "value": "jerk_print" },
"jerk_wall_x_roofing": { "value": "jerk_wall_0" },
"line_width": { "value": 0.42 },
"machine_acceleration": { "value": 10000 },
"machine_buildplate_type":
{
"default_value": "textured_pei_plate",
"options":
{
"cool_plate": "Cool Plate",
"engineering_plate": "Engineering Plate",
"high_temp_plate": "High Temp Plate",
"textured_pei_plate": "Textured PEI Plate"
}
},
"machine_center_is_zero": { "default_value": false },
"machine_gcode_flavor": { "default_value": "BambuLab" },
"machine_heated_bed": { "default_value": true },
"machine_max_feedrate_e": { "value": 150 },
"machine_max_feedrate_x": { "value": 500 },
"machine_max_feedrate_y": { "value": 500 },
"machine_max_feedrate_z": { "value": 15 },
"machine_max_jerk_e": { "default_value": 100 },
"machine_max_jerk_xy": { "default_value": 5000 },
"machine_max_jerk_z": { "default_value": 100 },
"machine_nozzle_cool_down_speed": { "default_value": 1.3 },
"machine_nozzle_heat_up_speed": { "default_value": 1.9 },
"machine_nozzle_size": { "default_value": 0.4 },
"machine_show_variants": { "value": true },
"machine_use_extruder_offset_to_offset_coords": { "value": false },
"material_diameter": { "default_value": 1.75 },
"material_flush_purge_length":
{
"default_value": 80,
"enabled": "not prime_tower_enable"
},
"material_flush_purge_speed":
{
"default_value": 500,
"enabled": "not prime_tower_enable"
},
"material_max_flowrate": { "enabled": true },
"max_skin_angle_for_expansion": { "value": 45 },
"meshfix_maximum_resolution": { "value": 0.4 },
"min_infill_area": { "default_value": 10 },
"optimize_wall_printing_order": { "value": false },
"prime_tower_enable": { "default_value": true },
"prime_tower_line_width": { "value": "1.5 * line_width" },
"prime_tower_min_volume": { "default_value": 250 },
"prime_tower_size": { "default_value": 40 },
"relative_extrusion": { "value": true },
"retraction_amount": { "value": 0.5 },
"retraction_combing_max_distance": { "value": 100 },
"retraction_extra_prime_amount": { "value": 0.12 },
"retraction_hop": { "value": 0.2 },
"retraction_hop_after_extruder_switch_height": { "value": 2 },
"retraction_hop_enabled": { "value": true },
"retraction_min_travel": { "value": "5 if support_enable and support_structure=='tree' else line_width * 2" },
"retraction_prime_speed": { "value": 15 },
"retraction_speed": { "value": 30 },
"skin_edge_support_thickness": { "value": 0 },
"skin_material_flow": { "value": 95 },
"skin_overlap": { "value": 0 },
"skin_preshrink": { "value": 0 },
"skirt_brim_speed": { "maximum_value_warning": 500 },
"skirt_line_count": { "value": 5 },
"small_skin_on_surface": { "value": false },
"small_skin_width": { "value": 4 },
"speed_infill":
{
"maximum_value_warning": 500,
"value": "speed_print"
},
"speed_ironing":
{
"maximum_value_warning": 500,
"value": 20
},
"speed_layer_0":
{
"maximum_value_warning": 500,
"value": "speed_print/6"
},
"speed_prime_tower":
{
"maximum_value_warning": 500,
"value": "speed_wall"
},
"speed_print":
{
"maximum_value_warning": 500,
"value": 300
},
"speed_print_layer_0":
{
"maximum_value_warning": 500,
"value": "speed_layer_0"
},
"speed_roofing":
{
"maximum_value_warning": 500,
"value": "speed_wall"
},
"speed_support":
{
"maximum_value_warning": 500,
"value": "speed_wall_0"
},
"speed_support_bottom":
{
"maximum_value_warning": 500,
"value": "speed_support_interface"
},
"speed_support_infill":
{
"maximum_value_warning": 500,
"value": "speed_support"
},
"speed_support_interface":
{
"maximum_value_warning": 500,
"value": 50
},
"speed_support_roof":
{
"maximum_value_warning": 500,
"value": "speed_support_interface"
},
"speed_topbottom":
{
"maximum_value_warning": 500,
"value": "speed_print"
},
"speed_travel":
{
"maximum_value": 500,
"value": 500
},
"speed_travel_layer_0":
{
"maximum_value": 500,
"value": 150
},
"speed_wall":
{
"maximum_value_warning": 500,
"value": "speed_print*2/3"
},
"speed_wall_0":
{
"maximum_value_warning": 500,
"value": "speed_wall"
},
"speed_wall_0_roofing":
{
"maximum_value_warning": 500,
"value": "speed_wall"
},
"speed_wall_x":
{
"maximum_value_warning": 500,
"value": "speed_print"
},
"speed_wall_x_roofing":
{
"maximum_value_warning": 500,
"value": "speed_wall"
},
"support_brim_line_count": { "value": 5 },
"support_infill_rate": { "value": "80 if gradual_support_infill_steps != 0 else 15" },
"support_pattern": { "value": "'gyroid'" },
"support_structure": { "value": "'tree'" },
"switch_extruder_retraction_amount": { "value": 5 },
"travel_avoid_other_parts": { "value": false },
"wall_0_acceleration": { "value": 1000 },
"wall_0_deceleration": { "value": 1000 },
"wall_0_end_speed_ratio": { "value": 100 },
"wall_0_speed_split_distance": { "value": 0.2 },
"wall_0_start_speed_ratio": { "value": 100 },
"wall_0_wipe_dist": { "value": 0 },
"wall_material_flow": { "value": 95 },
"wall_overhang_angle": { "value": 10 },
"wall_overhang_speed_factors": { "default_value": "[25,15,5,5]" },
"wall_x_material_flow": { "value": 100 },
"z_seam_corner": { "value": "'z_seam_corner_weighted'" },
"z_seam_position": { "value": "'backright'" },
"z_seam_type": { "value": "'sharpest_corner'" }
}
}

File diff suppressed because one or more lines are too long

View File

@ -214,8 +214,8 @@
},
"machine_buildplate_type":
{
"label": "Build Plate Material",
"description": "The material of the build plate installed on the printer.",
"label": "Build Plate Type",
"description": "The type of build plate installed on the printer.",
"default_value": "glass",
"type": "enum",
"options":
@ -388,7 +388,8 @@
"Makerbot": "Makerbot",
"BFB": "Bits from Bytes",
"MACH3": "Mach3",
"Repetier": "Repetier"
"Repetier": "Repetier",
"BambuLab": "BambuLab"
},
"default_value": "RepRap (Marlin/Sprinter)",
"settable_per_mesh": false,
@ -3021,6 +3022,7 @@
"minimum_value": "0.0001",
"minimum_value_warning": "50",
"maximum_value_warning": "150",
"enabled": "roofing_layer_count > 0 and top_layers > 0",
"limit_to_extruder": "wall_0_extruder_nr",
"settable_per_mesh": true
},
@ -3035,6 +3037,7 @@
"minimum_value": "0.0001",
"minimum_value_warning": "50",
"maximum_value_warning": "150",
"enabled": "roofing_layer_count > 0 and top_layers > 0",
"limit_to_extruder": "wall_x_extruder_nr",
"settable_per_mesh": true
},
@ -3049,6 +3052,7 @@
"minimum_value": "0.0001",
"minimum_value_warning": "50",
"maximum_value_warning": "150",
"enabled": "flooring_layer_count > 0 and bottom_layers > 0",
"limit_to_extruder": "wall_0_extruder_nr",
"settable_per_mesh": true
},
@ -3063,6 +3067,7 @@
"minimum_value": "0.0001",
"minimum_value_warning": "50",
"maximum_value_warning": "150",
"enabled": "flooring_layer_count > 0 and bottom_layers > 0",
"limit_to_extruder": "wall_x_extruder_nr",
"settable_per_mesh": true
}
@ -3372,6 +3377,20 @@
"settable_per_mesh": false,
"settable_per_extruder": true,
"settable_per_meshgroup": false
},
"material_max_flowrate":
{
"default_value": 16,
"description": "Maximum flow rate that the printer can extrude for the material",
"enabled": false,
"label": "Material Maximum Flow Rate",
"maximum_value": "machine_max_feedrate_e * (material_diameter/2)**2 * math.pi",
"minimum_value": "0",
"settable_per_extruder": true,
"settable_per_mesh": false,
"type": "float",
"unit": "mm\u00b3/s",
"value": "16"
}
}
},
@ -3464,6 +3483,7 @@
"maximum_value_warning": "150",
"default_value": 30,
"value": "speed_wall_0",
"enabled": "roofing_layer_count > 0 and top_layers > 0",
"limit_to_extruder": "wall_0_extruder_nr",
"settable_per_mesh": true
},
@ -3478,6 +3498,7 @@
"maximum_value_warning": "150",
"default_value": 60,
"value": "speed_wall_x",
"enabled": "roofing_layer_count > 0 and top_layers > 0",
"limit_to_extruder": "wall_x_extruder_nr",
"settable_per_mesh": true
},
@ -3492,6 +3513,7 @@
"maximum_value_warning": "150",
"default_value": 30,
"value": "speed_wall_0",
"enabled": "flooring_layer_count > 0 and bottom_layers > 0",
"limit_to_extruder": "wall_0_extruder_nr",
"settable_per_mesh": true
},
@ -3506,6 +3528,7 @@
"maximum_value_warning": "150",
"default_value": 60,
"value": "speed_wall_x",
"enabled": "flooring_layer_count > 0 and bottom_layers > 0",
"limit_to_extruder": "wall_x_extruder_nr",
"settable_per_mesh": true
}
@ -3878,7 +3901,7 @@
"maximum_value_warning": "10000",
"default_value": 3000,
"value": "acceleration_wall_0",
"enabled": "resolveOrValue('acceleration_enabled')",
"enabled": "resolveOrValue('acceleration_enabled') and roofing_layer_count > 0 and top_layers > 0",
"limit_to_extruder": "wall_0_extruder_nr",
"settable_per_mesh": true
},
@ -3893,7 +3916,7 @@
"maximum_value_warning": "10000",
"default_value": 3000,
"value": "acceleration_wall_x",
"enabled": "resolveOrValue('acceleration_enabled')",
"enabled": "resolveOrValue('acceleration_enabled') and roofing_layer_count > 0 and top_layers > 0",
"limit_to_extruder": "wall_x_extruder_nr",
"settable_per_mesh": true
},
@ -3908,7 +3931,7 @@
"maximum_value_warning": "10000",
"default_value": 3000,
"value": "acceleration_wall_0",
"enabled": "resolveOrValue('acceleration_enabled')",
"enabled": "resolveOrValue('acceleration_enabled') and flooring_layer_count > 0 and bottom_layers > 0",
"limit_to_extruder": "wall_0_extruder_nr",
"settable_per_mesh": true
},
@ -3923,7 +3946,7 @@
"maximum_value_warning": "10000",
"default_value": 3000,
"value": "acceleration_wall_x",
"enabled": "resolveOrValue('acceleration_enabled')",
"enabled": "resolveOrValue('acceleration_enabled') and flooring_layer_count > 0 and bottom_layers > 0",
"limit_to_extruder": "wall_x_extruder_nr",
"settable_per_mesh": true
}
@ -4251,7 +4274,7 @@
"maximum_value_warning": "50",
"default_value": 20,
"value": "jerk_wall_0",
"enabled": "resolveOrValue('jerk_enabled')",
"enabled": "resolveOrValue('jerk_enabled') and roofing_layer_count > 0 and top_layers > 0",
"limit_to_extruder": "wall_0_extruder_nr",
"settable_per_mesh": true
},
@ -4265,7 +4288,7 @@
"maximum_value_warning": "50",
"default_value": 20,
"value": "jerk_wall_x",
"enabled": "resolveOrValue('jerk_enabled')",
"enabled": "resolveOrValue('jerk_enabled') and roofing_layer_count > 0 and top_layers > 0",
"limit_to_extruder": "wall_x_extruder_nr",
"settable_per_mesh": true
},
@ -4279,7 +4302,7 @@
"maximum_value_warning": "50",
"default_value": 20,
"value": "jerk_wall_0",
"enabled": "resolveOrValue('jerk_enabled')",
"enabled": "resolveOrValue('jerk_enabled') and flooring_layer_count > 0 and bottom_layers > 0",
"limit_to_extruder": "wall_0_extruder_nr",
"settable_per_mesh": true
},
@ -4293,7 +4316,7 @@
"maximum_value_warning": "50",
"default_value": 20,
"value": "jerk_wall_x",
"enabled": "resolveOrValue('jerk_enabled')",
"enabled": "resolveOrValue('jerk_enabled') and flooring_layer_count > 0 and bottom_layers > 0",
"limit_to_extruder": "wall_x_extruder_nr",
"settable_per_mesh": true
}
@ -4847,7 +4870,7 @@
},
"build_fan_full_at_height":
{
"label": "Build Fan Speed at Height",
"label": "Build Volume Fan Speed at Height",
"description": "The height at which the fans spin on regular fan speed. At the layers below the fan speed gradually increases from Initial Fan Speed to Regular Fan Speed.",
"unit": "mm",
"type": "float",
@ -4862,8 +4885,8 @@
{
"build_fan_full_layer":
{
"label": "Build Fan Speed at Layer",
"description": "The layer at which the build fans spin on full fan speed. This value is calculated and rounded to a whole number.",
"label": "Build Volume Fan Speed at Layer",
"description": "The layer at which the build-volume fans spin on full fan speed. This value is calculated and rounded to a whole number.",
"type": "int",
"default_value": 0,
"minimum_value": "0",
@ -4876,6 +4899,34 @@
}
}
},
"build_volume_fan_speed_0":
{
"label": "Initial Layers Build Volume Fan Speed",
"description": "The fan speed (as a percentage) for the auxiliary or build-volume fan, that is set until the layer specified at 'Build Volume Fan Speed at Layer' is reached. After that, the speed is set by 'Build Volume Fan Speed' instead (so not this 'Initial Layers' one).",
"unit": "%",
"type": "float",
"minimum_value": "0",
"maximum_value": "100",
"default_value": 0,
"enabled": "build_volume_fan_nr != 0",
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
},
"build_volume_fan_speed":
{
"label": "Build Volume Fan Speed",
"description": "The fan speed (as a percentage) for the auxiliary or build-volume fan, that is set from the moment that the layer specified at 'Build Volume Fan Speed at Layer' is reached and onwards. Before that, the speed is set by 'Initial Layers Build Volume Fan Speed' instead.",
"unit": "%",
"type": "float",
"minimum_value": "0",
"maximum_value": "100",
"default_value": 100,
"enabled": "build_volume_fan_nr != 0",
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
},
"cool_fan_speed":
{
"label": "Fan Speed",
@ -4985,31 +5036,6 @@
"settable_per_mesh": false,
"settable_per_extruder": true
},
"cool_min_layer_time_overhang":
{
"label": "Minimum Layer Time with Overhang",
"description": "The minimum time spent in a layer that contains overhanging extrusions. This forces the printer to slow down, to at least spend the time set here in one layer. This allows the printed material to cool down properly before printing the next layer. Layers may still take shorter than the minimal layer time if Lift Head is disabled and if the Minimum Speed would otherwise be violated.",
"unit": "s",
"type": "float",
"default_value": 5,
"value": "cool_min_layer_time",
"minimum_value": "0",
"maximum_value_warning": "600",
"settable_per_mesh": false,
"settable_per_extruder": true
},
"cool_min_layer_time_overhang_min_segment_length":
{
"label": "Minimum Overhang Segment Length",
"description": "When trying to apply the minimum layer time specific for overhanging layers, it will be applied only if at least one consecutive overhanging extrusion move is longer than this value.",
"unit": "mm",
"type": "float",
"default_value": 5,
"minimum_value": "0",
"maximum_value_warning": "500",
"settable_per_mesh": false,
"settable_per_extruder": true
},
"cool_min_speed":
{
"label": "Minimum Speed",
@ -7482,6 +7508,17 @@
"limit_to_extruder": "raft_surface_extruder_nr"
}
}
},
"machine_scan_first_layer":
{
"default_value": false,
"description": "Whether to scan the first layer for layer adhesion problems.",
"enabled": false,
"label": "Scan the first layer",
"settable_per_extruder": false,
"settable_per_mesh": false,
"settable_per_meshgroup": false,
"type": "bool"
}
}
},
@ -8699,6 +8736,33 @@
"default_value": 90,
"settable_per_mesh": true
},
"cool_min_layer_time_overhang":
{
"label": "Minimum Layer Time with Overhang",
"description": "The minimum time spent in a layer that contains overhanging extrusions. This forces the printer to slow down, to at least spend the time set here in one layer. This allows the printed material to cool down properly before printing the next layer. Layers may still take shorter than the minimal layer time if Lift Head is disabled and if the Minimum Speed would otherwise be violated.",
"unit": "s",
"type": "float",
"default_value": 5,
"value": "cool_min_layer_time",
"minimum_value": "0",
"maximum_value_warning": "600",
"enabled": "wall_overhang_angle < 90",
"settable_per_mesh": false,
"settable_per_extruder": true
},
"cool_min_layer_time_overhang_min_segment_length":
{
"label": "Minimum Overhang Segment Length",
"description": "When trying to apply the minimum layer time specific for overhanging layers, it will be applied only if at least one consecutive overhanging extrusion move is longer than this value.",
"unit": "mm",
"type": "float",
"default_value": 5,
"minimum_value": "0",
"maximum_value_warning": "500",
"enabled": "wall_overhang_angle < 90",
"settable_per_mesh": false,
"settable_per_extruder": true
},
"seam_overhang_angle":
{
"label": "Seam Overhanging Wall Angle",
@ -8719,6 +8783,7 @@
"unit": "%",
"type": "[int]",
"default_value": "[100]",
"enabled": "wall_overhang_angle < 90",
"settable_per_mesh": true
},
"bridge_settings_enabled":

View File

@ -84,7 +84,7 @@
"material_standby_temperature":
{
"minimum_value": "0",
"value": "material_print_temperature - 100"
"value": "resolveOrValue('material_print_temperature') - 100"
},
"meshfix_maximum_deviation": { "value": "machine_nozzle_size / 10" },
"meshfix_maximum_resolution": { "value": "max(speed_wall_0 / 75, 0.5)" },

View File

@ -33,14 +33,12 @@
{
"acceleration_enabled":
{
"enabled": true,
"enabled": false,
"value": true
},
"acceleration_infill":
{
"maximum_value": 3500,
"minimum_value": 200,
"minimum_value_warning": 750,
"enabled": false,
"value": "acceleration_print"
},
"acceleration_layer_0":
@ -50,18 +48,12 @@
},
"acceleration_prime_tower":
{
"enabled": "acceleration_enabled and prime_tower_enable and extruders_enabled_count > 1",
"maximum_value": 3500,
"minimum_value": 200,
"minimum_value_warning": 750,
"enabled": false,
"value": "acceleration_print"
},
"acceleration_print":
{
"enabled": "acceleration_enabled",
"maximum_value": 3500,
"minimum_value": 200,
"minimum_value_warning": 750,
"enabled": false,
"value": 800
},
"acceleration_print_layer_0":
@ -71,49 +63,33 @@
},
"acceleration_roofing":
{
"maximum_value": 3500,
"minimum_value": 200,
"minimum_value_warning": 750,
"enabled": false,
"value": "acceleration_print"
},
"acceleration_skirt_brim":
{
"enabled": "acceleration_enabled and (adhesion_type == 'skirt' or adhesion_type == 'brim')",
"maximum_value": 3500,
"minimum_value": 200,
"minimum_value_warning": 750,
"value": 800
},
"acceleration_support":
{
"maximum_value": 3500,
"minimum_value": 200,
"minimum_value_warning": 750,
"enabled": false,
"value": "acceleration_print"
},
"acceleration_support_bottom":
{
"enabled": false,
"value": "acceleration_support_interface"
"value": "acceleration_print"
},
"acceleration_support_infill":
{
"maximum_value": 3500,
"minimum_value": 200,
"minimum_value_warning": 750,
"value": "acceleration_support"
"enabled": false,
"value": "acceleration_print"
},
"acceleration_support_interface":
{
"maximum_value": 3500,
"minimum_value": 200,
"minimum_value_warning": 750,
"value": "acceleration_support"
"enabled": false,
"value": "acceleration_print"
},
"acceleration_support_roof":
{
"enabled": false,
"value": "acceleration_support_interface"
"value": "acceleration_print"
},
"acceleration_topbottom":
{
@ -122,10 +98,7 @@
},
"acceleration_travel":
{
"enabled": "acceleration_enabled",
"maximum_value": 5000,
"minimum_value": 200,
"minimum_value_warning": 750,
"enabled": false,
"value": 5000
},
"acceleration_travel_enabled":
@ -140,37 +113,28 @@
},
"acceleration_wall":
{
"enabled": "acceleration_enabled",
"maximum_value": 3500,
"minimum_value": 200,
"minimum_value_warning": 750,
"enabled": false,
"value": "acceleration_print"
},
"acceleration_wall_0":
{
"enabled": "acceleration_enabled",
"maximum_value": 3500,
"minimum_value": 200,
"minimum_value_warning": 750,
"value": "acceleration_wall"
"enabled": false,
"value": "acceleration_print"
},
"acceleration_wall_0_roofing":
{
"enabled": false,
"value": "acceleration_wall"
"value": "acceleration_print"
},
"acceleration_wall_x":
{
"enabled": "acceleration_enabled",
"maximum_value": 3500,
"minimum_value": 200,
"minimum_value_warning": 750,
"value": "acceleration_wall"
"enabled": false,
"value": "acceleration_print"
},
"acceleration_wall_x_roofing":
{
"enabled": false,
"value": "acceleration_wall"
"value": "acceleration_print"
},
"adhesion_extruder_nr":
{
@ -239,15 +203,12 @@
"inset_direction": { "value": "'inside_out'" },
"jerk_enabled":
{
"enabled": true,
"enabled": false,
"value": true
},
"jerk_infill":
{
"enabled": "jerk_enabled",
"maximum_value": 35,
"minimum_value": 5,
"minimum_value_warning": 12,
"enabled": false,
"value": "jerk_print"
},
"jerk_layer_0":
@ -257,19 +218,13 @@
},
"jerk_prime_tower":
{
"enabled": "jerk_enabled and prime_tower_enable and extruders_enabled_count > 1",
"maximum_value": 35,
"minimum_value": 5,
"minimum_value_warning": 12,
"enabled": false,
"value": "jerk_print"
},
"jerk_print":
{
"enabled": "jerk_enabled",
"maximum_value": 35,
"minimum_value": 5,
"minimum_value_warning": 12,
"value": 12.5
"enabled": false,
"value": 6.25
},
"jerk_print_layer_0":
{
@ -278,50 +233,33 @@
},
"jerk_roofing":
{
"enabled": "jerk_enabled",
"maximum_value": 35,
"minimum_value": 5,
"minimum_value_warning": 12,
"enabled": false,
"value": "jerk_print"
},
"jerk_skirt_brim":
{
"enabled": "jerk_enabled and (adhesion_type == 'brim' or adhesion_type == 'skirt')",
"value": 12.5
},
"jerk_support":
{
"enabled": "jerk_enabled and support_enable",
"maximum_value": 35,
"minimum_value": 5,
"minimum_value_warning": 12,
"enabled": false,
"value": "jerk_print"
},
"jerk_support_bottom":
{
"enabled": false,
"value": "jerk_support_interface"
"value": "jerk_print"
},
"jerk_support_infill":
{
"enabled": "jerk_enabled and support_enable",
"maximum_value": 35,
"minimum_value": 5,
"minimum_value_warning": 12,
"value": "jerk_support"
"enabled": false,
"value": "jerk_print"
},
"jerk_support_interface":
{
"enabled": "jerk_enabled and support_enable",
"maximum_value": 35,
"minimum_value": 5,
"minimum_value_warning": 12,
"value": "jerk_support"
"enabled": false,
"value": "jerk_print"
},
"jerk_support_roof":
{
"enabled": false,
"value": "jerk_support_interface"
"value": "jerk_print"
},
"jerk_topbottom":
{
@ -330,11 +268,8 @@
},
"jerk_travel":
{
"enabled": "jerk_enabled",
"maximum_value": 35,
"minimum_value": 5,
"minimum_value_warning": 12,
"value": 12.5
"enabled": false,
"value": "jerk_print"
},
"jerk_travel_enabled":
{
@ -348,18 +283,12 @@
},
"jerk_wall":
{
"enabled": "jerk_enabled",
"maximum_value": 35,
"minimum_value": 5,
"minimum_value_warning": 12,
"enabled": false,
"value": "jerk_print"
},
"jerk_wall_0":
{
"enabled": "jerk_enabled",
"maximum_value": 35,
"minimum_value": 5,
"minimum_value_warning": 12,
"enabled": false,
"value": "jerk_print"
},
"jerk_wall_0_roofing":
@ -369,10 +298,7 @@
},
"jerk_wall_x":
{
"enabled": "jerk_enabled",
"maximum_value": 35,
"minimum_value": 5,
"minimum_value_warning": 12,
"enabled": false,
"value": "jerk_print"
},
"jerk_wall_x_roofing":
@ -391,7 +317,7 @@
"machine_heated_bed": { "default_value": false },
"machine_heated_build_volume": { "default_value": true },
"machine_height": { "default_value": 196.749 },
"machine_min_cool_heat_time_window": { "value": 15 },
"machine_min_cool_heat_time_window": { "value": 0 },
"machine_name": { "default_value": "UltiMaker Method" },
"machine_nozzle_cool_down_speed": { "value": 0.8 },
"machine_nozzle_heat_up_speed": { "value": 3.5 },
@ -591,86 +517,16 @@
"skirt_height": { "value": 3 },
"small_skin_width": { "value": 4 },
"speed_equalize_flow_width_factor": { "value": 0 },
"speed_infill":
{
"maximum_value": 350,
"maximum_value_warning": 325
},
"speed_prime_tower":
{
"maximum_value": 250,
"maximum_value_warning": 200,
"value": "speed_topbottom"
},
"speed_print":
{
"maximum_value": 350,
"maximum_value_warning": 325,
"value": 50
},
"speed_roofing":
{
"maximum_value": 300,
"maximum_value_warning": 275,
"value": "speed_wall_0"
},
"speed_support":
{
"maximum_value": 350,
"maximum_value_warning": 325,
"value": "speed_wall"
},
"speed_support_infill":
{
"maximum_value": 350,
"maximum_value_warning": 325
},
"speed_support_interface":
{
"maximum_value": 260,
"maximum_value_warning": 255,
"value": "speed_topbottom"
},
"speed_support_roof":
{
"maximum_value": 260,
"maximum_value_warning": 255
},
"speed_topbottom":
{
"maximum_value": 260,
"maximum_value_warning": 255,
"value": "speed_wall"
},
"speed_prime_tower": { "value": "speed_topbottom" },
"speed_print": { "value": 50 },
"speed_roofing": { "value": "speed_wall_0" },
"speed_support": { "value": "speed_wall" },
"speed_support_interface": { "value": "speed_topbottom" },
"speed_topbottom": { "value": "speed_wall" },
"speed_travel": { "value": 250 },
"speed_wall":
{
"maximum_value": 260,
"maximum_value_warning": 255,
"value": "speed_print * 40/50"
},
"speed_wall_0":
{
"maximum_value": 260,
"maximum_value_warning": 255,
"value": "speed_wall * 30/40"
},
"speed_wall_0_roofing":
{
"maximum_value": 260,
"maximum_value_warning": 255
},
"speed_wall_x":
{
"maximum_value": 260,
"maximum_value_warning": 255,
"value": "speed_wall"
},
"speed_wall_x_roofing":
{
"maximum_value": 260,
"maximum_value_warning": 255
},
"speed_wall": { "value": "speed_print * 40/50" },
"speed_wall_0": { "value": "speed_wall * 30/40" },
"speed_wall_x": { "value": "speed_wall" },
"support_angle": { "value": 40 },
"support_bottom_height": { "value": "2*support_infill_sparse_thickness" },
"support_bottom_line_width":

View File

@ -65,7 +65,7 @@
"machine_extruder_trains": { "0": "ultimaker_replicator_extruder" },
"preferred_material": "ultimaker_pla_175",
"preferred_quality_type": "draft",
"preferred_variant_name": "ultimaker_replicator_smart_extruder_plus",
"preferred_variant_name": "Smart Extruder+",
"reference_machine_id": "replicator_b",
"supports_network_connection": true,
"supports_usb_connection": false,

View File

@ -0,0 +1,53 @@
{
"version": 2,
"name": "UltiMaker S6",
"inherits": "ultimaker_s8",
"metadata":
{
"visible": true,
"author": "UltiMaker",
"manufacturer": "Ultimaker B.V.",
"file_formats": "application/x-ufp;text/x-gcode",
"platform": "ultimaker_s5_platform.obj",
"bom_numbers": [
10700
],
"firmware_update_info":
{
"check_urls": [ "https://software.ultimaker.com/releases/firmware/5078167/stable/um-update.swu.version" ],
"id": 5078167,
"update_url": "https://ultimaker.com/firmware?utm_source=cura&utm_medium=software&utm_campaign=fw-update"
},
"first_start_actions": [ "DiscoverUM3Action" ],
"has_machine_quality": true,
"has_materials": true,
"has_variants": true,
"machine_extruder_trains":
{
"0": "ultimaker_s6_extruder_left",
"1": "ultimaker_s6_extruder_right"
},
"nozzle_offsetting_for_disallowed_areas": false,
"platform_offset": [
0,
-30,
-10
],
"platform_texture": "UltimakerS6backplate.png",
"preferred_material": "ultimaker_pla_blue",
"preferred_variant_name": "AA+ 0.4",
"quality_definition": "ultimaker_s8",
"supported_actions": [ "DiscoverUM3Action" ],
"supports_material_export": true,
"supports_network_connection": true,
"supports_usb_connection": false,
"variants_name": "Print Core",
"variants_name_has_translation": true,
"weight": -2
},
"overrides":
{
"adhesion_type": { "value": "'brim'" },
"machine_name": { "default_value": "UltiMaker S6" }
}
}

View File

@ -47,7 +47,7 @@
"overrides":
{
"default_material_print_temperature": { "maximum_value_warning": "320" },
"machine_name": { "default_value": "Ultimaker S7" },
"machine_name": { "default_value": "UltiMaker S7" },
"material_print_temperature_layer_0": { "maximum_value_warning": "320" }
}
}

View File

@ -1,11 +1,11 @@
{
"version": 2,
"name": "Ultimaker S8",
"name": "UltiMaker S8",
"inherits": "ultimaker_s7",
"metadata":
{
"visible": true,
"author": "Ultimaker",
"author": "UltiMaker",
"manufacturer": "Ultimaker B.V.",
"file_formats": "application/x-ufp;text/x-gcode",
"platform": "ultimaker_s7_platform.obj",
@ -48,29 +48,147 @@
},
"overrides":
{
"acceleration_infill": { "value": "acceleration_print" },
"acceleration_layer_0": { "value": 2000 },
"acceleration_prime_tower": { "value": "acceleration_print" },
"acceleration_print": { "value": 20000 },
"acceleration_print_layer_0": { "value": "acceleration_layer_0" },
"acceleration_roofing": { "value": "acceleration_wall_0" },
"acceleration_skirt_brim": { "value": "acceleration_layer_0" },
"acceleration_support": { "value": "acceleration_print" },
"acceleration_support_bottom": { "value": "acceleration_support_interface" },
"acceleration_support_infill": { "value": "acceleration_support" },
"acceleration_support_interface": { "value": "acceleration_support" },
"acceleration_support_roof": { "value": "acceleration_support_interface" },
"acceleration_topbottom": { "value": "acceleration_print" },
"acceleration_travel": { "value": 10000 },
"acceleration_flooring":
{
"maximum_value": "machine_max_acceleration_x",
"maximum_value_warning": "machine_max_acceleration_x*0.8",
"value": "acceleration_roofing"
},
"acceleration_infill":
{
"maximum_value": "machine_max_acceleration_x",
"maximum_value_warning": "machine_max_acceleration_x*0.8",
"value": "acceleration_print"
},
"acceleration_layer_0":
{
"maximum_value": "machine_max_acceleration_x",
"maximum_value_warning": "machine_max_acceleration_x*0.8",
"value": 2000
},
"acceleration_prime_tower":
{
"maximum_value": "machine_max_acceleration_x",
"maximum_value_warning": "machine_max_acceleration_x*0.8",
"value": "acceleration_print"
},
"acceleration_print":
{
"maximum_value": "machine_max_acceleration_x",
"maximum_value_warning": "machine_max_acceleration_x*0.8",
"value": 20000
},
"acceleration_print_layer_0":
{
"maximum_value": "machine_max_acceleration_x",
"maximum_value_warning": "machine_max_acceleration_x*0.8",
"value": "acceleration_layer_0"
},
"acceleration_roofing":
{
"maximum_value": "machine_max_acceleration_x",
"maximum_value_warning": "machine_max_acceleration_x*0.8",
"value": "acceleration_wall_0"
},
"acceleration_skirt_brim":
{
"maximum_value": "machine_max_acceleration_x",
"maximum_value_warning": "machine_max_acceleration_x*0.8",
"value": "acceleration_layer_0"
},
"acceleration_support":
{
"maximum_value": "machine_max_acceleration_x",
"maximum_value_warning": "machine_max_acceleration_x*0.8",
"value": "acceleration_print"
},
"acceleration_support_bottom":
{
"maximum_value": "machine_max_acceleration_x",
"maximum_value_warning": "machine_max_acceleration_x*0.8",
"value": "acceleration_support_interface"
},
"acceleration_support_infill":
{
"maximum_value": "machine_max_acceleration_x",
"maximum_value_warning": "machine_max_acceleration_x*0.8",
"value": "acceleration_support"
},
"acceleration_support_interface":
{
"maximum_value": "machine_max_acceleration_x",
"maximum_value_warning": "machine_max_acceleration_x*0.8",
"value": "acceleration_support"
},
"acceleration_support_roof":
{
"maximum_value": "machine_max_acceleration_x",
"maximum_value_warning": "machine_max_acceleration_x*0.8",
"value": "acceleration_support_interface"
},
"acceleration_topbottom":
{
"maximum_value": "machine_max_acceleration_x",
"maximum_value_warning": "machine_max_acceleration_x*0.8",
"value": "acceleration_print"
},
"acceleration_travel":
{
"maximum_value": "machine_max_acceleration_x",
"maximum_value_warning": "machine_max_acceleration_x*0.8",
"value": 10000
},
"acceleration_travel_enabled": { "value": true },
"acceleration_travel_layer_0": { "value": "acceleration_layer_0" },
"acceleration_wall": { "value": "acceleration_print/8" },
"acceleration_wall_0": { "value": "acceleration_wall" },
"acceleration_wall_0_roofing": { "value": "acceleration_wall_0" },
"acceleration_wall_x": { "value": "acceleration_print" },
"acceleration_wall_x_roofing": { "value": "acceleration_wall" },
"adhesion_type": { "value": "'skirt'" },
"bottom_thickness": { "value": "3*layer_height if top_layers==4 else top_bottom_thickness" },
"acceleration_travel_layer_0":
{
"maximum_value": "machine_max_acceleration_x",
"maximum_value_warning": "machine_max_acceleration_x*0.8",
"value": "acceleration_layer_0"
},
"acceleration_wall":
{
"maximum_value": "machine_max_acceleration_x",
"maximum_value_warning": "machine_max_acceleration_x*0.8",
"value": "acceleration_print/8"
},
"acceleration_wall_0":
{
"maximum_value": "machine_max_acceleration_x",
"maximum_value_warning": "machine_max_acceleration_x*0.8",
"value": "acceleration_wall"
},
"acceleration_wall_0_flooring":
{
"maximum_value": "machine_max_acceleration_x",
"maximum_value_warning": "machine_max_acceleration_x*0.8",
"value": "acceleration_wall_0_roofing"
},
"acceleration_wall_0_roofing":
{
"maximum_value": "machine_max_acceleration_x",
"maximum_value_warning": "machine_max_acceleration_x*0.8",
"value": "acceleration_wall_0"
},
"acceleration_wall_x":
{
"maximum_value": "machine_max_acceleration_x",
"maximum_value_warning": "machine_max_acceleration_x*0.8",
"value": "acceleration_print"
},
"acceleration_wall_x_flooring":
{
"maximum_value": "machine_max_acceleration_x",
"maximum_value_warning": "machine_max_acceleration_x*0.8",
"value": "acceleration_wall_x_roofing"
},
"acceleration_wall_x_roofing":
{
"maximum_value": "machine_max_acceleration_x",
"maximum_value_warning": "machine_max_acceleration_x*0.8",
"value": "acceleration_wall"
},
"adhesion_type": { "value": "'brim' if support_enable and support_structure=='tree' else 'skirt'" },
"bottom_thickness": { "value": "3*layer_height if top_layers==4 and not support_enable else top_bottom_thickness" },
"bridge_skin_material_flow": { "value": 200 },
"bridge_skin_speed":
{
@ -89,16 +207,28 @@
"cool_min_layer_time_overhang": { "value": 9 },
"cool_min_layer_time_overhang_min_segment_length": { "value": 2 },
"cool_min_speed": { "value": 6 },
"cool_min_temperature": { "value": "material_print_temperature-15" },
"cool_min_temperature":
{
"minimum_value_warning": "material_print_temperature-15",
"value": "material_print_temperature-15"
},
"default_material_print_temperature": { "maximum_value_warning": 320 },
"extra_infill_lines_to_support_skins": { "value": "'walls_and_lines'" },
"flooring_layer_count": { "value": 1 },
"gradual_flow_enabled": { "value": false },
"hole_xy_offset": { "value": 0.075 },
"infill_material_flow": { "value": "material_flow" },
"infill_overlap": { "value": 10 },
"infill_pattern": { "value": "'zigzag' if infill_sparse_density > 80 else 'grid'" },
"infill_sparse_density": { "value": 15 },
"infill_wall_line_count": { "value": "1 if infill_sparse_density > 80 else 0" },
"initial_bottom_layers": { "value": 2 },
"jerk_flooring":
{
"maximum_value_warning": "machine_max_jerk_xy / 2",
"unit": "m/s\u00b3",
"value": "jerk_roofing"
},
"jerk_infill":
{
"maximum_value_warning": "machine_max_jerk_xy / 2",
@ -202,6 +332,12 @@
"unit": "m/s\u00b3",
"value": "jerk_wall"
},
"jerk_wall_0_flooring":
{
"maximum_value_warning": "machine_max_jerk_xy / 2",
"unit": "m/s\u00b3",
"value": "jerk_wall_0_roofing"
},
"jerk_wall_0_roofing":
{
"maximum_value_warning": "machine_max_jerk_xy / 2",
@ -214,6 +350,12 @@
"unit": "m/s\u00b3",
"value": "jerk_print"
},
"jerk_wall_x_flooring":
{
"maximum_value_warning": "machine_max_jerk_xy / 2",
"unit": "m/s\u00b3",
"value": "jerk_wall_x_roofing"
},
"jerk_wall_x_roofing":
{
"maximum_value_warning": "machine_max_jerk_xy / 2",
@ -221,6 +363,8 @@
"value": "jerk_wall_0"
},
"machine_gcode_flavor": { "default_value": "Cheetah" },
"machine_max_acceleration_x": { "default_value": 50000 },
"machine_max_acceleration_y": { "default_value": 50000 },
"machine_max_feedrate_x": { "default_value": 500 },
"machine_max_feedrate_y": { "default_value": 500 },
"machine_max_jerk_e":
@ -241,7 +385,7 @@
"unit": "m/s\u00b3",
"value": "20000 if machine_gcode_flavor == 'Cheetah' else 100"
},
"machine_name": { "default_value": "Ultimaker S8" },
"machine_name": { "default_value": "UltiMaker S8" },
"machine_nozzle_cool_down_speed": { "default_value": 1.3 },
"machine_nozzle_heat_up_speed": { "default_value": 0.6 },
"machine_start_gcode": { "default_value": "M213 U0.1 ;undercut 0.1mm" },
@ -261,18 +405,20 @@
"optimize_wall_printing_order": { "value": false },
"prime_tower_brim_enable": { "value": true },
"prime_tower_min_volume": { "value": 10 },
"prime_tower_mode": { "resolve": "'normal'" },
"retraction_amount": { "value": 6.5 },
"retraction_combing_avoid_distance": { "value": 1.2 },
"retraction_combing_max_distance": { "value": 50 },
"retraction_hop": { "value": 1 },
"retraction_hop_after_extruder_switch_height": { "value": 2 },
"retraction_hop_enabled": { "value": true },
"retraction_min_travel": { "value": "5 if support_enable and support_structure=='tree' else line_width * 2" },
"retraction_min_travel": { "value": "5 if support_enable and support_structure=='tree' else line_width * 2.5" },
"retraction_prime_speed": { "value": 15 },
"skin_edge_support_thickness": { "value": 0 },
"skin_material_flow": { "value": 95 },
"skin_overlap": { "value": 0 },
"skin_preshrink": { "value": 0 },
"skirt_brim_minimal_length": { "value": 1000 },
"skirt_brim_speed":
{
"maximum_value_warning": 300,
@ -281,6 +427,11 @@
"skirt_line_count": { "value": 5 },
"small_skin_on_surface": { "value": false },
"small_skin_width": { "value": 4 },
"speed_flooring":
{
"maximum_value_warning": 300,
"value": "speed_roofing"
},
"speed_infill":
{
"maximum_value_warning": 300,
@ -319,7 +470,7 @@
"speed_support":
{
"maximum_value_warning": 300,
"value": "speed_wall_0"
"value": "speed_wall"
},
"speed_support_bottom":
{
@ -334,7 +485,7 @@
"speed_support_interface":
{
"maximum_value_warning": 300,
"value": 50
"value": 80
},
"speed_support_roof":
{
@ -349,11 +500,13 @@
"speed_travel":
{
"maximum_value": 500,
"value": 500
"maximum_value_warning": 300,
"value": 300
},
"speed_travel_layer_0":
{
"maximum_value": 500,
"maximum_value_warning": 300,
"value": 150
},
"speed_wall":
@ -366,6 +519,11 @@
"maximum_value_warning": 300,
"value": "speed_wall"
},
"speed_wall_0_flooring":
{
"maximum_value_warning": 300,
"value": "speed_wall_0_roofing"
},
"speed_wall_0_roofing":
{
"maximum_value_warning": 300,
@ -376,19 +534,36 @@
"maximum_value_warning": 300,
"value": "speed_print"
},
"speed_wall_x_flooring":
{
"maximum_value_warning": 300,
"value": "speed_wall_x_roofing"
},
"speed_wall_x_roofing":
{
"maximum_value_warning": 300,
"value": "speed_wall"
},
"support_brim_line_count": { "value": 5 },
"support_infill_rate": { "value": "80 if gradual_support_infill_steps != 0 else 15" },
"support_angle": { "value": 60 },
"support_bottom_distance": { "maximum_value_warning": "3*layer_height" },
"support_bottom_offset": { "value": 0 },
"support_brim_width": { "value": 10 },
"support_interface_enable": { "value": true },
"support_interface_offset": { "value": "support_offset" },
"support_line_width": { "value": "1.25*line_width" },
"support_offset": { "value": "1.2 if support_structure == 'tree' else 0.8" },
"support_pattern": { "value": "'gyroid' if support_structure == 'tree' else 'lines'" },
"support_roof_height": { "minimum_value_warning": 0 },
"support_structure": { "value": "'normal'" },
"support_top_distance": { "maximum_value_warning": "3*layer_height" },
"support_tree_bp_diameter": { "value": 15 },
"support_tree_tip_diameter": { "value": 1.0 },
"support_tree_top_rate": { "value": 20 },
"support_xy_distance_overhang": { "value": "machine_nozzle_size" },
"support_z_distance": { "value": "0.4*material_shrinkage_percentage_z/100.0" },
"top_bottom_thickness": { "value": "round(4*layer_height, 2)" },
"travel_avoid_other_parts": { "value": true },
"travel_avoid_supports": { "value": true },
"wall_0_acceleration": { "value": 1000 },
"wall_0_deceleration": { "value": 1000 },
"wall_0_end_speed_ratio": { "value": 100 },

View File

@ -55,10 +55,6 @@
"basf_",
"jabil_",
"polymaker_",
"ultimaker_rapidrinse",
"ultimaker_sr30",
"ultimaker_petg",
"ultimaker_pva",
"ultimaker_pc-abs",
"ultimaker_pc-abs-fr"
],
@ -66,6 +62,7 @@
"has_materials": true,
"has_variants": true,
"machine_extruder_trains": { "0": "ultimaker_sketch_extruder" },
"preferred_material": "ultimaker_pla_175",
"preferred_quality_type": "draft",
"preferred_variant_name": "0.4mm",
"reference_machine_id": "sketch",

View File

@ -397,8 +397,6 @@
"z_seam_corner": { "value": "'z_seam_corner_inner'" },
"z_seam_position": { "value": "'backleft'" },
"z_seam_type": { "value": "'sharpest_corner'" },
"z_seam_x": { "value": 150 },
"z_seam_y": { "value": 180 },
"zig_zaggify_infill": { "value": true }
}
}

View File

@ -0,0 +1,19 @@
{
"version": 2,
"name": "Extruder",
"inherits": "fdmextruder",
"metadata":
{
"machine": "bambulab_a1",
"position": "0"
},
"overrides":
{
"extruder_nr": { "default_value": 0 },
"machine_extruder_change_duration": { "default_value": 29 },
"machine_extruder_end_code": { "default_value": ";===== A1 extruder end {extruder_nr} begin =====\nG392 S0\nM1007 S0 ; turn off mass estimation\nM204 S9000\n\nG91 ; set relative positioning\nG1 Z3.0 F1200\nG90 ; back to abolute positioning\n\nG1 X267 F18000\nG1 Y128 F9000\n\nM400\nM106 P1 S0\nM106 P2 S0\n{if material_print_temperature > 142, extruder_nr}\nM104 S{material_print_temperature, extruder_nr}\n{endif}\n\n\nM620.11 S1 I{extruder_nr} E-18 F1200\nM400\n\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A0 F{material_flush_purge_speed}\n\nM628 S1\nG92 E0\nG1 E-18 F{material_flush_purge_speed}\nM400\nM629 S1\n\n;===== A1 extruder end {extruder_nr} finish =====\n" },
"machine_extruder_start_code": { "default_value": ";===== A1 extruder start {extruder_nr} begin =====\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A1 F{material_flush_purge_speed} L{material_flush_purge_length} H{machine_nozzle_size} T{material_print_temperature, extruder_nr}\n\nM400\nG92 E0\n\n{if not prime_tower_enable}\n\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S{material_print_temperature, extruder_nr}\nM106 P1 S60\nG1 E{material_flush_purge_length / 4.0} F{min(extruderValues('material_flush_purge_speed'))} ; do not need pulsatile flushing for start part\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{min(extruderValues('material_flush_purge_speed'))}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\nM400\nM1002 set_filament_type:{material_type, extruder_nr}\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n\nM400\nM106 P1 S60\nG1 E6 F{material_flush_purge_speed, extruder_nr} ;Compensate for filament spillage during waiting temperature\n\n{endif} ; prime_tower_enable\n\nM400\nG92 E0\n; G1 E-{retraction_amount} F1800\nM400\nM106 P1 S178\nM400 S4\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM622.1 S0\n\nM621 S{extruder_nr}A\nG392 S0\n\nM1007 S1\n;===== A1 extruder start {extruder_nr} finish =====\n" },
"material_diameter": { "default_value": 1.75 },
"switch_extruder_retraction_amount": { "default_value": 18 }
}
}

View File

@ -0,0 +1,19 @@
{
"version": 2,
"name": "Extruder",
"inherits": "fdmextruder",
"metadata":
{
"machine": "bambulab_a1",
"position": "1"
},
"overrides":
{
"extruder_nr": { "default_value": 1 },
"machine_extruder_change_duration": { "default_value": 29 },
"machine_extruder_end_code": { "default_value": ";===== A1 extruder end {extruder_nr} begin =====\nG392 S0\nM1007 S0 ; turn off mass estimation\nM204 S9000\n\nG91 ; set relative positioning\nG1 Z3.0 F1200\nG90 ; back to abolute positioning\n\nG1 X267 F18000\nG1 Y128 F9000\n\nM400\nM106 P1 S0\nM106 P2 S0\n{if material_print_temperature > 142, extruder_nr}\nM104 S{material_print_temperature, extruder_nr}\n{endif}\n\n\nM620.11 S1 I{extruder_nr} E-18 F1200\nM400\n\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A0 F{material_flush_purge_speed}\n\nM628 S1\nG92 E0\nG1 E-18 F{material_flush_purge_speed}\nM400\nM629 S1\n\n;===== A1 extruder end {extruder_nr} finish =====\n" },
"machine_extruder_start_code": { "default_value": ";===== A1 extruder start {extruder_nr} begin =====\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A1 F{material_flush_purge_speed} L{material_flush_purge_length} H{machine_nozzle_size} T{material_print_temperature, extruder_nr}\n\nM400\nG92 E0\n\n{if not prime_tower_enable}\n\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S{material_print_temperature, extruder_nr}\nM106 P1 S60\nG1 E{material_flush_purge_length / 4.0} F{min(extruderValues('material_flush_purge_speed'))} ; do not need pulsatile flushing for start part\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{min(extruderValues('material_flush_purge_speed'))}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\nM400\nM1002 set_filament_type:{material_type, extruder_nr}\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n\nM400\nM106 P1 S60\nG1 E6 F{material_flush_purge_speed, extruder_nr} ;Compensate for filament spillage during waiting temperature\n\n{endif} ; prime_tower_enable\n\nM400\nG92 E0\n; G1 E-{retraction_amount} F1800\nM400\nM106 P1 S178\nM400 S4\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM622.1 S0\n\nM621 S{extruder_nr}A\nG392 S0\n\nM1007 S1\n;===== A1 extruder start {extruder_nr} finish =====\n" },
"material_diameter": { "default_value": 1.75 },
"switch_extruder_retraction_amount": { "default_value": 18 }
}
}

View File

@ -0,0 +1,19 @@
{
"version": 2,
"name": "Extruder",
"inherits": "fdmextruder",
"metadata":
{
"machine": "bambulab_a1",
"position": "2"
},
"overrides":
{
"extruder_nr": { "default_value": 2 },
"machine_extruder_change_duration": { "default_value": 29 },
"machine_extruder_end_code": { "default_value": ";===== A1 extruder end {extruder_nr} begin =====\nG392 S0\nM1007 S0 ; turn off mass estimation\nM204 S9000\n\nG91 ; set relative positioning\nG1 Z3.0 F1200\nG90 ; back to abolute positioning\n\nG1 X267 F18000\nG1 Y128 F9000\n\nM400\nM106 P1 S0\nM106 P2 S0\n{if material_print_temperature > 142, extruder_nr}\nM104 S{material_print_temperature, extruder_nr}\n{endif}\n\n\nM620.11 S1 I{extruder_nr} E-18 F1200\nM400\n\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A0 F{material_flush_purge_speed}\n\nM628 S1\nG92 E0\nG1 E-18 F{material_flush_purge_speed}\nM400\nM629 S1\n\n;===== A1 extruder end {extruder_nr} finish =====\n" },
"machine_extruder_start_code": { "default_value": ";===== A1 extruder start {extruder_nr} begin =====\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A1 F{material_flush_purge_speed} L{material_flush_purge_length} H{machine_nozzle_size} T{material_print_temperature, extruder_nr}\n\nM400\nG92 E0\n\n{if not prime_tower_enable}\n\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S{material_print_temperature, extruder_nr}\nM106 P1 S60\nG1 E{material_flush_purge_length / 4.0} F{min(extruderValues('material_flush_purge_speed'))} ; do not need pulsatile flushing for start part\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{min(extruderValues('material_flush_purge_speed'))}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\nM400\nM1002 set_filament_type:{material_type, extruder_nr}\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n\nM400\nM106 P1 S60\nG1 E6 F{material_flush_purge_speed, extruder_nr} ;Compensate for filament spillage during waiting temperature\n\n{endif} ; prime_tower_enable\n\nM400\nG92 E0\n; G1 E-{retraction_amount} F1800\nM400\nM106 P1 S178\nM400 S4\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM622.1 S0\n\nM621 S{extruder_nr}A\nG392 S0\n\nM1007 S1\n;===== A1 extruder start {extruder_nr} finish =====\n" },
"material_diameter": { "default_value": 1.75 },
"switch_extruder_retraction_amount": { "default_value": 18 }
}
}

View File

@ -0,0 +1,19 @@
{
"version": 2,
"name": "Extruder",
"inherits": "fdmextruder",
"metadata":
{
"machine": "bambulab_a1",
"position": "3"
},
"overrides":
{
"extruder_nr": { "default_value": 3 },
"machine_extruder_change_duration": { "default_value": 29 },
"machine_extruder_end_code": { "default_value": ";===== A1 extruder end {extruder_nr} begin =====\nG392 S0\nM1007 S0 ; turn off mass estimation\nM204 S9000\n\nG91 ; set relative positioning\nG1 Z3.0 F1200\nG90 ; back to abolute positioning\n\nG1 X267 F18000\nG1 Y128 F9000\n\nM400\nM106 P1 S0\nM106 P2 S0\n{if material_print_temperature > 142, extruder_nr}\nM104 S{material_print_temperature, extruder_nr}\n{endif}\n\n\nM620.11 S1 I{extruder_nr} E-18 F1200\nM400\n\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A0 F{material_flush_purge_speed}\n\nM628 S1\nG92 E0\nG1 E-18 F{material_flush_purge_speed}\nM400\nM629 S1\n\n;===== A1 extruder end {extruder_nr} finish =====\n" },
"machine_extruder_start_code": { "default_value": ";===== A1 extruder start {extruder_nr} begin =====\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A1 F{material_flush_purge_speed} L{material_flush_purge_length} H{machine_nozzle_size} T{material_print_temperature, extruder_nr}\n\nM400\nG92 E0\n\n{if not prime_tower_enable}\n\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S{material_print_temperature, extruder_nr}\nM106 P1 S60\nG1 E{material_flush_purge_length / 4.0} F{min(extruderValues('material_flush_purge_speed'))} ; do not need pulsatile flushing for start part\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{min(extruderValues('material_flush_purge_speed'))}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\nM400\nM1002 set_filament_type:{material_type, extruder_nr}\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n\nM400\nM106 P1 S60\nG1 E6 F{material_flush_purge_speed, extruder_nr} ;Compensate for filament spillage during waiting temperature\n\n{endif} ; prime_tower_enable\n\nM400\nG92 E0\n; G1 E-{retraction_amount} F1800\nM400\nM106 P1 S178\nM400 S4\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM622.1 S0\n\nM621 S{extruder_nr}A\nG392 S0\n\nM1007 S1\n;===== A1 extruder start {extruder_nr} finish =====\n" },
"material_diameter": { "default_value": 1.75 },
"switch_extruder_retraction_amount": { "default_value": 18 }
}
}

View File

@ -0,0 +1,19 @@
{
"version": 2,
"name": "Extruder",
"inherits": "fdmextruder",
"metadata":
{
"machine": "bambulab_a1mini",
"position": "0"
},
"overrides":
{
"extruder_nr": { "default_value": 0 },
"machine_extruder_change_duration": { "default_value": 29 },
"machine_extruder_end_code": { "default_value": ";===== A1mini extruder end {extruder_nr} begin =====\nG392 S0\nM1007 S0 ; turn off mass estimation\nM204 S9000\n\nG91 ; set relative positioning\nG1 Z3.0 F1200\nG90 ; back to abolute positioning\n\nG1 X180 F18000\nG1 Y90 F9000\n\nM400\nM106 P1 S0\nM106 P2 S0\n{if material_print_temperature > 142, extruder_nr}\nM104 S{material_print_temperature, extruder_nr}\n{endif}\n\n\nM620.11 S1 I{extruder_nr} E-18 F1200\nM400\n\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A0 F{material_flush_purge_speed}\n\nM628 S1\nG92 E0\nG1 E-18 F{material_flush_purge_speed}\nM400\nM629 S1\n\n;===== A1mini extruder end {extruder_nr} finish =====\n" },
"machine_extruder_start_code": { "default_value": ";===== A1mini extruder start {extruder_nr} begin =====\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A1 F{material_flush_purge_speed} L{material_flush_purge_length} H{machine_nozzle_size} T{material_print_temperature, extruder_nr}\n\nM400\nG92 E0\n\n{if not prime_tower_enable}\n\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S{material_print_temperature, extruder_nr}\nM106 P1 S60\nG1 E{material_flush_purge_length / 4.0} F{min(extruderValues('material_flush_purge_speed'))} ; do not need pulsatile flushing for start part\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{min(extruderValues('material_flush_purge_speed'))}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\nM400\nM1002 set_filament_type:{material_type, extruder_nr}\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n\nM400\nM106 P1 S60\nG1 E5 F{material_flush_purge_speed, extruder_nr} ;Compensate for filament spillage during waiting temperature\n\n{endif} ; prime_tower_enable\n\nM400\nG92 E0\n; G1 E-{retraction_amount} F1800\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n\nM622.1 S0\n\nM621 S{extruder_nr}A\nG392 S0\n\nM1007 S1\n;===== A1mini extruder start {extruder_nr} finish =====\n" },
"material_diameter": { "default_value": 1.75 },
"switch_extruder_retraction_amount": { "default_value": 18 }
}
}

View File

@ -0,0 +1,19 @@
{
"version": 2,
"name": "Extruder",
"inherits": "fdmextruder",
"metadata":
{
"machine": "bambulab_a1mini",
"position": "1"
},
"overrides":
{
"extruder_nr": { "default_value": 1 },
"machine_extruder_change_duration": { "default_value": 29 },
"machine_extruder_end_code": { "default_value": ";===== A1mini extruder end {extruder_nr} begin =====\nG392 S0\nM1007 S0 ; turn off mass estimation\nM204 S9000\n\nG91 ; set relative positioning\nG1 Z3.0 F1200\nG90 ; back to abolute positioning\n\nG1 X180 F18000\nG1 Y90 F9000\n\nM400\nM106 P1 S0\nM106 P2 S0\n{if material_print_temperature > 142, extruder_nr}\nM104 S{material_print_temperature, extruder_nr}\n{endif}\n\n\nM620.11 S1 I{extruder_nr} E-18 F1200\nM400\n\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A0 F{material_flush_purge_speed}\n\nM628 S1\nG92 E0\nG1 E-18 F{material_flush_purge_speed}\nM400\nM629 S1\n\n;===== A1mini extruder end {extruder_nr} finish =====\n" },
"machine_extruder_start_code": { "default_value": ";===== A1mini extruder start {extruder_nr} begin =====\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A1 F{material_flush_purge_speed} L{material_flush_purge_length} H{machine_nozzle_size} T{material_print_temperature, extruder_nr}\n\nM400\nG92 E0\n\n{if not prime_tower_enable}\n\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S{material_print_temperature, extruder_nr}\nM106 P1 S60\nG1 E{material_flush_purge_length / 4.0} F{min(extruderValues('material_flush_purge_speed'))} ; do not need pulsatile flushing for start part\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{min(extruderValues('material_flush_purge_speed'))}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\nM400\nM1002 set_filament_type:{material_type, extruder_nr}\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n\nM400\nM106 P1 S60\nG1 E5 F{material_flush_purge_speed, extruder_nr} ;Compensate for filament spillage during waiting temperature\n\n{endif} ; prime_tower_enable\n\nM400\nG92 E0\n; G1 E-{retraction_amount} F1800\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n\nM622.1 S0\n\nM621 S{extruder_nr}A\nG392 S0\n\nM1007 S1\n;===== A1mini extruder start {extruder_nr} finish =====\n" },
"material_diameter": { "default_value": 1.75 },
"switch_extruder_retraction_amount": { "default_value": 18 }
}
}

View File

@ -0,0 +1,19 @@
{
"version": 2,
"name": "Extruder",
"inherits": "fdmextruder",
"metadata":
{
"machine": "bambulab_a1mini",
"position": "2"
},
"overrides":
{
"extruder_nr": { "default_value": 2 },
"machine_extruder_change_duration": { "default_value": 29 },
"machine_extruder_end_code": { "default_value": ";===== A1mini extruder end {extruder_nr} begin =====\nG392 S0\nM1007 S0 ; turn off mass estimation\nM204 S9000\n\nG91 ; set relative positioning\nG1 Z3.0 F1200\nG90 ; back to abolute positioning\n\nG1 X180 F18000\nG1 Y90 F9000\n\nM400\nM106 P1 S0\nM106 P2 S0\n{if material_print_temperature > 142, extruder_nr}\nM104 S{material_print_temperature, extruder_nr}\n{endif}\n\n\nM620.11 S1 I{extruder_nr} E-18 F1200\nM400\n\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A0 F{material_flush_purge_speed}\n\nM628 S1\nG92 E0\nG1 E-18 F{material_flush_purge_speed}\nM400\nM629 S1\n\n;===== A1mini extruder end {extruder_nr} finish =====\n" },
"machine_extruder_start_code": { "default_value": ";===== A1mini extruder start {extruder_nr} begin =====\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A1 F{material_flush_purge_speed} L{material_flush_purge_length} H{machine_nozzle_size} T{material_print_temperature, extruder_nr}\n\nM400\nG92 E0\n\n{if not prime_tower_enable}\n\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S{material_print_temperature, extruder_nr}\nM106 P1 S60\nG1 E{material_flush_purge_length / 4.0} F{min(extruderValues('material_flush_purge_speed'))} ; do not need pulsatile flushing for start part\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{min(extruderValues('material_flush_purge_speed'))}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\nM400\nM1002 set_filament_type:{material_type, extruder_nr}\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n\nM400\nM106 P1 S60\nG1 E5 F{material_flush_purge_speed, extruder_nr} ;Compensate for filament spillage during waiting temperature\n\n{endif} ; prime_tower_enable\n\nM400\nG92 E0\n; G1 E-{retraction_amount} F1800\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n\nM622.1 S0\n\nM621 S{extruder_nr}A\nG392 S0\n\nM1007 S1\n;===== A1mini extruder start {extruder_nr} finish =====\n" },
"material_diameter": { "default_value": 1.75 },
"switch_extruder_retraction_amount": { "default_value": 18 }
}
}

View File

@ -0,0 +1,19 @@
{
"version": 2,
"name": "Extruder",
"inherits": "fdmextruder",
"metadata":
{
"machine": "bambulab_a1mini",
"position": "3"
},
"overrides":
{
"extruder_nr": { "default_value": 3 },
"machine_extruder_change_duration": { "default_value": 29 },
"machine_extruder_end_code": { "default_value": ";===== A1mini extruder end {extruder_nr} begin =====\nG392 S0\nM1007 S0 ; turn off mass estimation\nM204 S9000\n\nG91 ; set relative positioning\nG1 Z3.0 F1200\nG90 ; back to abolute positioning\n\nG1 X180 F18000\nG1 Y90 F9000\n\nM400\nM106 P1 S0\nM106 P2 S0\n{if material_print_temperature > 142, extruder_nr}\nM104 S{material_print_temperature, extruder_nr}\n{endif}\n\n\nM620.11 S1 I{extruder_nr} E-18 F1200\nM400\n\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A0 F{material_flush_purge_speed}\n\nM628 S1\nG92 E0\nG1 E-18 F{material_flush_purge_speed}\nM400\nM629 S1\n\n;===== A1mini extruder end {extruder_nr} finish =====\n" },
"machine_extruder_start_code": { "default_value": ";===== A1mini extruder start {extruder_nr} begin =====\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A1 F{material_flush_purge_speed} L{material_flush_purge_length} H{machine_nozzle_size} T{material_print_temperature, extruder_nr}\n\nM400\nG92 E0\n\n{if not prime_tower_enable}\n\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S{material_print_temperature, extruder_nr}\nM106 P1 S60\nG1 E{material_flush_purge_length / 4.0} F{min(extruderValues('material_flush_purge_speed'))} ; do not need pulsatile flushing for start part\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{min(extruderValues('material_flush_purge_speed'))}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\nM400\nM1002 set_filament_type:{material_type, extruder_nr}\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n\nM400\nM106 P1 S60\nG1 E5 F{material_flush_purge_speed, extruder_nr} ;Compensate for filament spillage during waiting temperature\n\n{endif} ; prime_tower_enable\n\nM400\nG92 E0\n; G1 E-{retraction_amount} F1800\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n\nM622.1 S0\n\nM621 S{extruder_nr}A\nG392 S0\n\nM1007 S1\n;===== A1mini extruder start {extruder_nr} finish =====\n" },
"material_diameter": { "default_value": 1.75 },
"switch_extruder_retraction_amount": { "default_value": 18 }
}
}

View File

@ -0,0 +1,18 @@
{
"version": 2,
"name": "Extruder",
"inherits": "fdmextruder",
"metadata":
{
"machine": "bambulab_x1",
"position": "0"
},
"overrides":
{
"extruder_nr": { "default_value": 0 },
"machine_extruder_change_duration": { "default_value": 29 },
"machine_extruder_end_code": { "default_value": "M204 S9000\n\nG91 ; set relative positioning\nG1 Z3.0 F1200\nG90 ; back to abolute positioning\n\nG1 X70 F21000\nG1 Y245\nG1 Y265 F3000\nM400\nM106 P1 S0\nM106 P2 S0\n\n{if material_print_temperature > 142}\nM104 S{material_print_temperature}\n{endif}\n\nM620.11 S1 I{extruder_nr} E-18 F1200\nM400\n\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 X120 F15000\nG1 X20 Y50 F21000\nG1 Y-3\n\n;{if toolchange_count == 2}\n; get travel path for change filament\n;M620.1 X[travel_point_1_x] Y[travel_point_1_y] F21000 P0\n;M620.1 X[travel_point_2_x] Y[travel_point_2_y] F21000 P1\n;M620.1 X[travel_point_3_x] Y[travel_point_3_y] F21000 P2\n;{endif}\n\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\n" },
"machine_extruder_start_code": { "default_value": "M620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\n\nG92 E0\n\n; always use highest temperature to flush\n{if material_type == 'PETG'}\nM109 S260\n{elsif material_type == 'PVA'}\nM109 S210\n{else}\nM109 S{material_print_temperature}\n{endif}\n\n{if not prime_tower_enable}\n\nM83\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S{material_print_temperature, extruder_nr}\nM106 P1 S60\nG1 E{material_flush_purge_length / 4.0} F{min(extruderValues('material_flush_purge_speed'))} ; do not need pulsatile flushing for start part\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{min(extruderValues('material_flush_purge_speed'))}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\nM400\nM1002 set_filament_type:{material_type, extruder_nr}\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; FLUSH_START\nM400\nM109 S{material_print_temperature}\nG1 E6 F{material_flush_purge_speed, extruder_nr} ;Compensate for filament spillage during waiting temperature\n; FLUSH_END\n\n{endif} ; prime_tower_enable\n\nM400\nG92 E0\n;G1 E-[new_retract_length_toolchange] F1800\nM106 P1 S255\nM400 S3\n\nG1 X70 F5000\nG1 X90 F3000\nG1 Y255 F4000\nG1 X105 F5000\nG1 Y265 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X70 F10000\nG1 X100 F5000\n\nG1 X70 F10000\nG1 X80 F15000\nG1 X60\nG1 X80\nG1 X60\nG1 X80 ; shake to put down garbage\nG1 X100 F5000\nG1 X165 F15000; wipe and shake\nG1 Y256 ; move Y to aside, prevent collision\nM400\n\nM621 S{extruder_nr}A\n" },
"material_diameter": { "default_value": 1.75 }
}
}

View File

@ -0,0 +1,18 @@
{
"version": 2,
"name": "Extruder",
"inherits": "fdmextruder",
"metadata":
{
"machine": "bambulab_x1",
"position": "1"
},
"overrides":
{
"extruder_nr": { "default_value": 1 },
"machine_extruder_change_duration": { "default_value": 29 },
"machine_extruder_end_code": { "default_value": "M204 S9000\n\nG91 ; set relative positioning\nG1 Z3.0 F1200\nG90 ; back to abolute positioning\n\nG1 X70 F21000\nG1 Y245\nG1 Y265 F3000\nM400\nM106 P1 S0\nM106 P2 S0\n\n{if material_print_temperature > 142}\nM104 S{material_print_temperature}\n{endif}\n\nM620.11 S1 I{extruder_nr} E-18 F1200\nM400\n\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 X120 F15000\nG1 X20 Y50 F21000\nG1 Y-3\n\n;{if toolchange_count == 2}\n; get travel path for change filament\n;M620.1 X[travel_point_1_x] Y[travel_point_1_y] F21000 P0\n;M620.1 X[travel_point_2_x] Y[travel_point_2_y] F21000 P1\n;M620.1 X[travel_point_3_x] Y[travel_point_3_y] F21000 P2\n;{endif}\n\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\n" },
"machine_extruder_start_code": { "default_value": "M620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\n\nG92 E0\n\n; always use highest temperature to flush\n{if material_type == 'PETG'}\nM109 S260\n{elsif material_type == 'PVA'}\nM109 S210\n{else}\nM109 S{material_print_temperature}\n{endif}\n\n{if not prime_tower_enable}\n\nM83\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S{material_print_temperature, extruder_nr}\nM106 P1 S60\nG1 E{material_flush_purge_length / 4.0} F{min(extruderValues('material_flush_purge_speed'))} ; do not need pulsatile flushing for start part\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{min(extruderValues('material_flush_purge_speed'))}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\nM400\nM1002 set_filament_type:{material_type, extruder_nr}\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; FLUSH_START\nM400\nM109 S{material_print_temperature}\nG1 E6 F{material_flush_purge_speed, extruder_nr} ;Compensate for filament spillage during waiting temperature\n; FLUSH_END\n\n{endif} ; prime_tower_enable\n\nM400\nG92 E0\n;G1 E-[new_retract_length_toolchange] F1800\nM106 P1 S255\nM400 S3\n\nG1 X70 F5000\nG1 X90 F3000\nG1 Y255 F4000\nG1 X105 F5000\nG1 Y265 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X70 F10000\nG1 X100 F5000\n\nG1 X70 F10000\nG1 X80 F15000\nG1 X60\nG1 X80\nG1 X60\nG1 X80 ; shake to put down garbage\nG1 X100 F5000\nG1 X165 F15000; wipe and shake\nG1 Y256 ; move Y to aside, prevent collision\nM400\n\nM621 S{extruder_nr}A\n" },
"material_diameter": { "default_value": 1.75 }
}
}

View File

@ -0,0 +1,18 @@
{
"version": 2,
"name": "Extruder",
"inherits": "fdmextruder",
"metadata":
{
"machine": "bambulab_x1",
"position": "2"
},
"overrides":
{
"extruder_nr": { "default_value": 2 },
"machine_extruder_change_duration": { "default_value": 29 },
"machine_extruder_end_code": { "default_value": "M204 S9000\n\nG91 ; set relative positioning\nG1 Z3.0 F1200\nG90 ; back to abolute positioning\n\nG1 X70 F21000\nG1 Y245\nG1 Y265 F3000\nM400\nM106 P1 S0\nM106 P2 S0\n\n{if material_print_temperature > 142}\nM104 S{material_print_temperature}\n{endif}\n\nM620.11 S1 I{extruder_nr} E-18 F1200\nM400\n\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 X120 F15000\nG1 X20 Y50 F21000\nG1 Y-3\n\n;{if toolchange_count == 2}\n; get travel path for change filament\n;M620.1 X[travel_point_1_x] Y[travel_point_1_y] F21000 P0\n;M620.1 X[travel_point_2_x] Y[travel_point_2_y] F21000 P1\n;M620.1 X[travel_point_3_x] Y[travel_point_3_y] F21000 P2\n;{endif}\n\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\n" },
"machine_extruder_start_code": { "default_value": "M620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\n\nG92 E0\n\n; always use highest temperature to flush\n{if material_type == 'PETG'}\nM109 S260\n{elsif material_type == 'PVA'}\nM109 S210\n{else}\nM109 S{material_print_temperature}\n{endif}\n\n{if not prime_tower_enable}\n\nM83\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S{material_print_temperature, extruder_nr}\nM106 P1 S60\nG1 E{material_flush_purge_length / 4.0} F{min(extruderValues('material_flush_purge_speed'))} ; do not need pulsatile flushing for start part\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{min(extruderValues('material_flush_purge_speed'))}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\nM400\nM1002 set_filament_type:{material_type, extruder_nr}\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; FLUSH_START\nM400\nM109 S{material_print_temperature}\nG1 E6 F{material_flush_purge_speed, extruder_nr} ;Compensate for filament spillage during waiting temperature\n; FLUSH_END\n\n{endif} ; prime_tower_enable\n\nM400\nG92 E0\n;G1 E-[new_retract_length_toolchange] F1800\nM106 P1 S255\nM400 S3\n\nG1 X70 F5000\nG1 X90 F3000\nG1 Y255 F4000\nG1 X105 F5000\nG1 Y265 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X70 F10000\nG1 X100 F5000\n\nG1 X70 F10000\nG1 X80 F15000\nG1 X60\nG1 X80\nG1 X60\nG1 X80 ; shake to put down garbage\nG1 X100 F5000\nG1 X165 F15000; wipe and shake\nG1 Y256 ; move Y to aside, prevent collision\nM400\n\nM621 S{extruder_nr}A\n" },
"material_diameter": { "default_value": 1.75 }
}
}

View File

@ -0,0 +1,18 @@
{
"version": 2,
"name": "Extruder",
"inherits": "fdmextruder",
"metadata":
{
"machine": "bambulab_x1",
"position": "3"
},
"overrides":
{
"extruder_nr": { "default_value": 3 },
"machine_extruder_change_duration": { "default_value": 29 },
"machine_extruder_end_code": { "default_value": "M204 S9000\n\nG91 ; set relative positioning\nG1 Z3.0 F1200\nG90 ; back to abolute positioning\n\nG1 X70 F21000\nG1 Y245\nG1 Y265 F3000\nM400\nM106 P1 S0\nM106 P2 S0\n\n{if material_print_temperature > 142}\nM104 S{material_print_temperature}\n{endif}\n\nM620.11 S1 I{extruder_nr} E-18 F1200\nM400\n\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 X120 F15000\nG1 X20 Y50 F21000\nG1 Y-3\n\n;{if toolchange_count == 2}\n; get travel path for change filament\n;M620.1 X[travel_point_1_x] Y[travel_point_1_y] F21000 P0\n;M620.1 X[travel_point_2_x] Y[travel_point_2_y] F21000 P1\n;M620.1 X[travel_point_3_x] Y[travel_point_3_y] F21000 P2\n;{endif}\n\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\n" },
"machine_extruder_start_code": { "default_value": "M620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\n\nG92 E0\n\n; always use highest temperature to flush\n{if material_type == 'PETG'}\nM109 S260\n{elsif material_type == 'PVA'}\nM109 S210\n{else}\nM109 S{material_print_temperature}\n{endif}\n\n{if not prime_tower_enable}\n\nM83\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S{material_print_temperature, extruder_nr}\nM106 P1 S60\nG1 E{material_flush_purge_length / 4.0} F{min(extruderValues('material_flush_purge_speed'))} ; do not need pulsatile flushing for start part\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{min(extruderValues('material_flush_purge_speed'))}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\nM400\nM1002 set_filament_type:{material_type, extruder_nr}\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; FLUSH_START\nM400\nM109 S{material_print_temperature}\nG1 E6 F{material_flush_purge_speed, extruder_nr} ;Compensate for filament spillage during waiting temperature\n; FLUSH_END\n\n{endif} ; prime_tower_enable\n\nM400\nG92 E0\n;G1 E-[new_retract_length_toolchange] F1800\nM106 P1 S255\nM400 S3\n\nG1 X70 F5000\nG1 X90 F3000\nG1 Y255 F4000\nG1 X105 F5000\nG1 Y265 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X70 F10000\nG1 X100 F5000\n\nG1 X70 F10000\nG1 X80 F15000\nG1 X60\nG1 X80\nG1 X60\nG1 X80 ; shake to put down garbage\nG1 X100 F5000\nG1 X165 F15000; wipe and shake\nG1 Y256 ; move Y to aside, prevent collision\nM400\n\nM621 S{extruder_nr}A\n" },
"material_diameter": { "default_value": 1.75 }
}
}

View File

@ -0,0 +1,31 @@
{
"version": 2,
"name": "Extruder 1",
"inherits": "fdmextruder",
"metadata":
{
"machine": "ultimaker_s6",
"position": "0"
},
"overrides":
{
"extruder_nr":
{
"default_value": 0,
"maximum_value": "1"
},
"extruder_prime_pos_x": { "default_value": -3 },
"extruder_prime_pos_y": { "default_value": 6 },
"extruder_prime_pos_z": { "default_value": 2 },
"machine_extruder_end_pos_abs": { "default_value": true },
"machine_extruder_end_pos_x": { "default_value": 330 },
"machine_extruder_end_pos_y": { "default_value": 237 },
"machine_extruder_start_code": { "value": "\"M214 D0 K{material_pressure_advance_factor} R0.04\"" },
"machine_extruder_start_pos_abs": { "default_value": true },
"machine_extruder_start_pos_x": { "default_value": 330 },
"machine_extruder_start_pos_y": { "default_value": 237 },
"machine_nozzle_head_distance": { "default_value": 2.7 },
"machine_nozzle_offset_x": { "default_value": 0 },
"machine_nozzle_offset_y": { "default_value": 0 }
}
}

View File

@ -0,0 +1,31 @@
{
"version": 2,
"name": "Extruder 2",
"inherits": "fdmextruder",
"metadata":
{
"machine": "ultimaker_s6",
"position": "1"
},
"overrides":
{
"extruder_nr":
{
"default_value": 1,
"maximum_value": "1"
},
"extruder_prime_pos_x": { "default_value": 333 },
"extruder_prime_pos_y": { "default_value": 6 },
"extruder_prime_pos_z": { "default_value": 2 },
"machine_extruder_end_pos_abs": { "default_value": true },
"machine_extruder_end_pos_x": { "default_value": 330 },
"machine_extruder_end_pos_y": { "default_value": 219 },
"machine_extruder_start_code": { "value": "\"M214 D0 K{material_pressure_advance_factor} R0.04\"" },
"machine_extruder_start_pos_abs": { "default_value": true },
"machine_extruder_start_pos_x": { "default_value": 330 },
"machine_extruder_start_pos_y": { "default_value": 219 },
"machine_nozzle_head_distance": { "default_value": 4.2 },
"machine_nozzle_offset_x": { "default_value": 22 },
"machine_nozzle_offset_y": { "default_value": 0 }
}
}

View File

@ -4284,7 +4284,7 @@ msgstr "Interface du support"
msgctxt "@action:label"
msgid "Support Type"
msgstr "Type de prise en charge"
msgstr "Structure du support"
msgctxt "@label Description for application dependency"
msgid "Support library for faster math"

View File

@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-21 15:37+0100\n"
"PO-Revision-Date: 2024-10-30 02:53+0000\n"
"PO-Revision-Date: 2025-03-02 04:30+0000\n"
"Last-Translator: h1data <h1data@users.noreply.github.com>\n"
"Language-Team: Japanese <https://github.com/h1data/Cura/wiki>\n"
"Language: ja_JP\n"
@ -175,7 +175,7 @@ msgstr "3Dビュー"
msgctxt "name"
msgid "3DConnexion mouses"
msgstr ""
msgstr "3DConnexionマウス"
msgctxt "@item:inlistbox"
msgid "3MF File"
@ -474,7 +474,7 @@ msgstr "G-codeファイルの読み込み、表示を許可する。"
msgctxt "description"
msgid "Allows working with 3D mouses inside Cura."
msgstr ""
msgstr "Curaで3Dマウスの利用を許可します。"
msgctxt "@option:discardOrKeep"
msgid "Always ask me this"
@ -1063,7 +1063,7 @@ msgstr "<filename>{0}</filename>を保存できませんでした: <message>{1}<
#, python-brace-format
msgctxt "@info:status"
msgid "Could not save to removable drive {0}: {1}"
msgstr "リムーバブルドライブ{0}に保存することができませんでした: {1}"
msgstr "リムーバブルドライブ{0}に保存できませんでした: {1}"
msgctxt "@info:text"
msgid "Could not upload the data to the printer."
@ -1461,7 +1461,7 @@ msgstr "リムーバブルデバイス{0}を取り出す"
#, python-brace-format
msgctxt "@info:status"
msgid "Ejected {0}. You can now safely remove the drive."
msgstr "{0}取り出し完了。デバイスを安全に取り外せます。"
msgstr "{0}を取り出しました。デバイスを安全に取り外せます。"
msgctxt "@label"
msgid "Empty"
@ -1477,7 +1477,7 @@ msgstr "エクストルーダーを有効にする"
msgctxt "@label"
msgid "Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards. Disabling it results in a skirt around object by default."
msgstr "またはラフトの印刷を有効にできます。これにより、オブジェクトの周囲または下に平らな部分が追加され、後で簡単に切り取ることができます。無効にすると、デフォルトでオブジェクトの周囲にスカートが形成されます。"
msgstr "ブリムまたはラフトの印刷を有効にできます。これにより、オブジェクトの周囲または下に平らな部分が追加され、後で簡単に切り取ることができます。無効にすると、デフォルトでオブジェクトの周囲にスカートが形成されます。"
msgctxt "@label"
msgid "Enabled"
@ -1594,7 +1594,7 @@ msgstr "エクストルーダー%1"
msgctxt "@label"
msgid "Extruder Change duration"
msgstr ""
msgstr "エクストルーダー切り替え時間"
msgctxt "@title:label"
msgid "Extruder End G-code"
@ -1606,7 +1606,7 @@ msgstr "エクストルーダー終了Gコードの時間"
msgctxt "@title:label"
msgid "Extruder Prestart G-code"
msgstr ""
msgstr "エクストルーダー開始前G-Code"
msgctxt "@title:label"
msgid "Extruder Start G-code"
@ -1767,7 +1767,7 @@ msgstr "プリンターと接続されていないため、ファームウェア
msgctxt "@label"
msgid "Firmware is the piece of software running directly on your 3D printer. This firmware controls the step motors, regulates the temperature and ultimately makes your printer work."
msgstr "ファームウェアとは直接お持ちの3Dプリンターを動かすソフトウェアです。このファームウェアはステップモーターを操作し、温度を管理し、プリンターとして成すべき点を補います。"
msgstr "ファームウェアとは直接お持ちの3Dプリンターを動かすソフトウェアです。このファームウェアはステップモーターを操作し、温度を管理し、プリンターを動作できるようにします。"
msgctxt "@label"
msgid "Firmware update completed."
@ -1799,7 +1799,7 @@ msgstr "次の空き"
msgctxt "@option:check"
msgid "Flip model's toolhandle Y axis (restart required)"
msgstr ""
msgstr "モデルツールハンドルのY軸を反転再起動が必要"
msgctxt "@label:listbox"
msgid "Flow"
@ -1894,7 +1894,7 @@ msgstr "一般"
msgctxt "@label"
msgid "Generate structures to support parts of the model which have overhangs. Without these structures, these parts would collapse during printing."
msgstr "オーバーハングがあるモデルにサポートを生成します。このサポート構造なしでは、プリント中にオーバーハングのパーツが崩壊してしまいます。"
msgstr "オーバーハングがあるモデルにサポートを生成します。このサポート構造なしでは、プリント中にオーバーハングのパーツが崩てしまいます。"
msgctxt "@label:category menu label"
msgid "Generic"
@ -2023,7 +2023,7 @@ msgstr "モデルを取り込む"
msgctxt "@label:MonitorStatus"
msgid "In maintenance. Please check the printer"
msgstr "メンテナンス。プリンターをチェックしてください"
msgstr "メンテナンス中です。プリンターをチェックしてください"
msgctxt "@info"
msgid "In order to monitor your print from Cura, please connect the printer."
@ -2291,7 +2291,7 @@ msgstr "ビルドプレートを調整する"
msgctxt "@title:window The argument is a package name, and the second is the version."
msgid "License for %1 %2"
msgstr ""
msgstr "%1 %2のライセンス"
msgctxt "@item:inlistbox"
msgid "Lighter is higher"
@ -2399,7 +2399,7 @@ msgstr "Makerbotプリントファイルライター"
msgctxt "@item:inlistbox"
msgid "Makerbot Replicator+ Printfile"
msgstr ""
msgstr "Makerbot Replicator+ プリントファイル"
msgctxt "@item:inlistbox"
msgid "Makerbot Sketch Printfile"
@ -2459,7 +2459,7 @@ msgstr "プリンター管理"
msgctxt "@text"
msgid "Manage your UltiMaker Cura plugins and material profiles here. Make sure to keep your plugins up to date and backup your setup regularly."
msgstr "UltiMaker Curaのプラグインと材料プロファイルはここで管理します。プラグインを常に最新の状態に保ち、セットアップのバックアップを定期的に取るようにしてください。"
msgstr "ここでUltiMaker Curaのプラグインと材料プロファイル管理します。プラグインを常に最新の状態に保ち、セットアップのバックアップを定期的に取るようにしてください。"
msgctxt "description"
msgid "Manages extensions to the application and allows browsing extensions from the UltiMaker website."
@ -2467,7 +2467,7 @@ msgstr "アプリケーションの拡張機能を管理し、UltiMakerウェブ
msgctxt "description"
msgid "Manages network connections to UltiMaker networked printers."
msgstr "Ultimakerのネットワーク接属できるプリンターのネットワーク接続を管理します。"
msgstr "ネットワーク対応Ultimakerプリンターのネットワーク接続を管理します。"
msgctxt "@label"
msgid "Manufacturer"
@ -4015,7 +4015,7 @@ msgstr "スライスのクラッシュを自動的にUltimakerに報告するか
msgctxt "@info:tooltip"
msgid "Should the Y axis of the translate toolhandle be flipped? This will only affect model's Y coordinate, all other settings such as machine Printhead settings are unaffected and still behave as before."
msgstr ""
msgstr "ツールハンドルのY軸移動を反転するかどうか。これはモデルのY軸方向のみに影響し、プリントヘッド設定など他の設定は影響せず、従前と変わらず動作します。"
msgctxt "@info:tooltip"
msgid "Should the build plate be cleared before loading a new model in the single instance of Cura?"
@ -4255,7 +4255,7 @@ msgstr "開始G-Code"
msgctxt "@label"
msgid "Start GCode must be first"
msgstr ""
msgstr "開始G-Codeを必ず最初に実行"
msgctxt "@label"
msgid "Start the slicing process"
@ -4267,7 +4267,7 @@ msgstr "開始"
msgctxt "@text"
msgid "Streamline your workflow and customize your UltiMaker Cura experience with plugins contributed by our amazing community of users."
msgstr "素晴らしいユーザーコミュニティから提供されるプラグインを活用して、ワークフローを合理化し、UltiMaker Cura体験をカスタマイズすることができます。"
msgstr "素晴らしいユーザーコミュニティから提供されるプラグインを活用して、ワークフローを合理化し、UltiMaker Cura体験をカスタマイズできます。"
msgctxt "@label"
msgid "Strength"
@ -4405,7 +4405,7 @@ msgstr "バックアップが最大ファイルサイズを超えています。
msgctxt "@text"
msgid "The balanced profile is designed to strike a balance between productivity, surface quality, mechanical properties and dimensional accuracy."
msgstr "バランスのとれたプロファイルは、生産性、表面品質、機械的特性、寸法精度のバランスを取るために設計されています。"
msgstr "バランスプロファイルは、生産性、表面品質、機械的特性、寸法精度のバランスを取るために設計されています。"
msgctxt "@info:tooltip"
msgid "The base height from the build plate in millimeters."
@ -4470,7 +4470,7 @@ msgstr "<filename>{0}</filename> は既に存在します。ファイルを上
msgctxt "@label"
msgid "The firmware shipping with new printers works, but new versions tend to have more features and improvements."
msgstr "配達時のファームウェアで動かすことはできますが、新しいバージョンの方がより改善され、便利なフィーチャーがついてきます。"
msgstr "出荷時のファームウェアは動作しますが、新しいバージョンの方がより改善され、便利な機能があります。"
msgctxt "@info:backup_failed"
msgid "The following error occurred while trying to restore a Cura backup:"
@ -4593,7 +4593,7 @@ msgstr "Digital Factoryからの応答に重要な情報がありません。"
msgctxt "@tooltip"
msgid "The target temperature of the heated bed. The bed will heat up or cool down towards this temperature. If this is 0, the bed heating is turned off."
msgstr "ヒーテッドベッドの目標温度。ベッドはこの温度に向けて上がったり下がったりします。これが0の場合、ベッドの加熱はオフになっています。"
msgstr "ヒーテッドベッドの目標温度。ベッドはこの温度に向けて上がったり下がったりします。これが0の場合、ベッドの加熱はオフになっています。"
msgctxt "@tooltip"
msgid "The target temperature of the hotend. The hotend will heat up or cool down towards this temperature. If this is 0, the hotend heating is turned off."
@ -4601,11 +4601,11 @@ msgstr "ホットエンドの目標温度。ホットエンドはこの温度に
msgctxt "@tooltip of temperature input"
msgid "The temperature to pre-heat the bed to."
msgstr "ベッドのプヒート温度。"
msgstr "ベッドのプヒート温度。"
msgctxt "@tooltip of temperature input"
msgid "The temperature to pre-heat the hotend to."
msgstr "ホットエンドをプヒートする温度です。"
msgstr "ホットエンドをプヒートする温度です。"
msgctxt "@text"
msgid "The visual profile is designed to print visual prototypes and models with the intent of high visual and surface quality."
@ -4633,7 +4633,7 @@ msgstr "このエクストルーダーの構成に一致するプロファイル
msgctxt "@info:status"
msgid "There is no active printer yet."
msgstr "アクティブなプリンターありません。"
msgstr "アクティブなプリンターありません。"
msgctxt "@label"
msgid "There is no printer found over your network."
@ -4661,7 +4661,7 @@ msgstr "%1 が認識されていないためこの構成は利用できません
msgctxt "@label"
msgid "This configuration is not available because there is a mismatch or other problem with core-type %1. Please visit <a href='%2'>the support page</a> to check which cores this printer-type supports w.r.t. new slices."
msgstr ""
msgstr "この設定は不整合あるいはコアタイプ%1による他の問題により無効化されました。<a href='%2'>サポートページ</a>をご覧いただくか、このプリンター機種のどのコアが新しいスライスをサポートしているか確認してください。"
msgctxt "@text:window"
msgid "This is a Cura Universal project file. Would you like to open it as a Cura Universal Project or import the models from it?"
@ -4669,7 +4669,7 @@ msgstr "これはCura Universal Projectファイルです。Cura Universal Proje
msgctxt "@text:window"
msgid "This is a Cura project file. Would you like to open it as a project or import the models from it?"
msgstr "これはCuraのプロジェクトファイルです。プロジェクトとしてあけますか、それともモデルのみ取り込みますか?"
msgstr "これはCuraのプロジェクトファイルです。プロジェクトとして開きますか、それともモデルのみ取り込みますか?"
msgctxt "@label"
msgid "This material is linked to %1 and shares some of its properties."
@ -4789,7 +4789,7 @@ msgstr "プリントの成功率を上げるために、ビルドプレートを
msgctxt "@label"
msgid "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer."
msgstr "印刷ジョブをネットワーク上のプリンターに直接送信するため、ネットワークケーブルを使用してプリンターを確実にネットワークに接続するか、プリンターをWiFiネットワークに接続されていることを確認してください。Curaをプリンタに接続していない場合でも、USBドライブを使用してg-codeファイルをプリンターに転送することができます。"
msgstr "印刷ジョブをネットワーク上のプリンターに直接送信するため、ネットワークケーブルを使用してプリンターを確実にネットワークに接続するか、プリンターをWiFiネットワークに接続されていることを確認してください。Curaをプリンタに接続していない場合でも、USBドライブを使用してg-codeファイルをプリンターに転送できます。"
#, python-brace-format
msgctxt "@message {printer_name} is replaced with the name of the printer"
@ -5032,7 +5032,7 @@ msgstr "Universal Cura Project"
msgctxt "@action:description Don't translate 'Universal Cura Project'"
msgid "Universal Cura Project files can be printed on different 3D printers while retaining positional data and selected settings. When exported, all models present on the build plate will be included along with their current position, orientation, and scale. You can also select which per-extruder or per-model settings should be included to ensure proper printing."
msgstr "Universal Cura Projectファイルは座標情報と選択した設定を保持し、さまざまな3Dプリンタで印刷することができます。エクスポートすると、ビルドプレート上に存在するすべてのモデルに、現在の位置、方向、拡大率が含まれます。適切な印刷を保証するために、エクストルーダーごとまたはモデルごとにどの設定を含めるかを選択することもできます。"
msgstr "Universal Cura Projectファイルは座標情報と選択した設定を保持し、さまざまな3Dプリンタで印刷できます。エクスポートすると、ビルドプレート上に存在するすべてのモデルに、現在の位置、方向、拡大率が含まれます。適切な印刷を保証するために、エクストルーダーごとまたはモデルごとにどの設定を含めるかを選択できます。"
msgctxt "@label"
msgid "Unknown"
@ -5229,7 +5229,7 @@ msgstr "Cura 5.8から Cura 5.9に構成をアップグレードします。"
msgctxt "description"
msgid "Upgrades configurations from Cura 5.9 to Cura 5.10"
msgstr ""
msgstr "Cura 5.9からCura 5.10に構成をアップグレードします。"
msgctxt "@action:button"
msgid "Upload custom Firmware"
@ -5373,7 +5373,7 @@ msgstr "バージョン5.8から5.9へのアップグレード"
msgctxt "name"
msgid "Version Upgrade 5.9 to 5.10"
msgstr ""
msgstr "バージョン5.9から5.10へのアップグレード"
msgctxt "@button"
msgid "View printers in Digital Factory"
@ -5538,11 +5538,11 @@ msgstr "Y奥行き"
msgctxt "@label"
msgid "Y max ( '+' towards front)"
msgstr ""
msgstr "Y座標最大値'+' で前方へ)"
msgctxt "@label"
msgid "Y min ( '-' towards back)"
msgstr ""
msgstr "Y座標最小値'-' で後方へ)"
msgctxt "@info"
msgid "Yes"

View File

@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: plugins@ultimaker.com\n"
"POT-Creation-Date: 2025-02-21 15:37+0000\n"
"PO-Revision-Date: 2024-10-27 13:25+0000\n"
"PO-Revision-Date: 2025-02-25 12:01+0000\n"
"Last-Translator: h1data <h1data@users.noreply.github.com>\n"
"Language-Team: Japanese <https://github.com/h1data/Cura/wiki>\n"
"Language: ja_JP\n"
@ -38,7 +38,7 @@ msgstr "エクストルーダー"
msgctxt "machine_extruder_change_duration label"
msgid "Extruder Change duration"
msgstr ""
msgstr "エクストルーダー切り替え時間"
msgctxt "machine_extruder_end_code label"
msgid "Extruder End G-Code"
@ -62,7 +62,7 @@ msgstr "エクストルーダー終了位置Y座標"
msgctxt "machine_extruder_prestart_code label"
msgid "Extruder Prestart G-Code"
msgstr ""
msgstr "エクストルーダー開始前G-Code"
msgctxt "extruder_prime_pos_x label"
msgid "Extruder Prime X Position"
@ -146,7 +146,7 @@ msgstr "ズルY座標オフセット"
msgctxt "machine_extruder_prestart_code description"
msgid "Prestart g-code to execute before switching to this extruder."
msgstr ""
msgstr "このエクストルーダーに切り替える前に実行される開始前G-Code。"
msgctxt "machine_extruder_start_code description"
msgid "Start g-code to execute when switching to this extruder."
@ -218,4 +218,4 @@ msgstr "エクストルーダーをオンにする際の開始位置Y座標。"
msgctxt "machine_extruder_change_duration description"
msgid "When using a multi tool setup, this value is the tool change time in seconds. This value will be added to the estimate time based on the number of changes that occur."
msgstr ""
msgstr "複数のエクストルーダーを用いる構成において、この値はエクストルーダーを切り替える時間を秒で表します。切り替えが発生する回数に基づいて、この値は残り時間に加算されます。"

View File

@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: plugins@ultimaker.com\n"
"POT-Creation-Date: 2025-02-21 15:37+0000\n"
"PO-Revision-Date: 2024-10-30 02:17+0000\n"
"PO-Revision-Date: 2025-03-02 04:31+0000\n"
"Last-Translator: h1data <h1data@users.noreply.github.com>\n"
"Language-Team: Japanese <https://github.com/h1data/Cura/wiki>\n"
"Language: ja_JP\n"
@ -34,7 +34,7 @@ msgstr "フィーダーとノズルチャンバーの間でフィラメントが
msgctxt "flooring_angles description"
msgid "A list of integer line directions to use when the bottom surface skin layers use the lines or zig zag pattern. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees)."
msgstr ""
msgstr "底面の表面レイヤーがジグザグパターンの場合に使用する、ラインの角度を示す整数のリストです。リストの要素はレイヤーが進むごとに順番に使用され、最後に到達すると次は最初からとなります。リスト項目はカンマ区切りで、リストの全体は四角かっこで囲います。既定は空のリストで、この場合は従来の角度45度と135度を用います。"
msgctxt "roofing_angles description"
msgid "A list of integer line directions to use when the top surface skin layers use the lines or zig zag pattern. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees)."
@ -306,71 +306,71 @@ msgstr "底面除去幅"
msgctxt "acceleration_wall_x_flooring label"
msgid "Bottom Surface Inner Wall Acceleration"
msgstr ""
msgstr "底面内側ウォールの加速度"
msgctxt "jerk_wall_x_flooring label"
msgid "Bottom Surface Inner Wall Jerk"
msgstr ""
msgstr "底面内側ウォールのジャーク"
msgctxt "speed_wall_x_flooring label"
msgid "Bottom Surface Inner Wall Speed"
msgstr ""
msgstr "底面内側ウォールの速度"
msgctxt "wall_x_material_flow_flooring label"
msgid "Bottom Surface Inner Wall(s) Flow"
msgstr ""
msgstr "底面内側ウォールのフロー"
msgctxt "acceleration_wall_0_flooring label"
msgid "Bottom Surface Outer Wall Acceleration"
msgstr ""
msgstr "底面外側ウォールの加速度"
msgctxt "wall_0_material_flow_flooring label"
msgid "Bottom Surface Outer Wall Flow"
msgstr ""
msgstr "底面外側ウォールのフロー"
msgctxt "jerk_wall_0_flooring label"
msgid "Bottom Surface Outer Wall Jerk"
msgstr ""
msgstr "底面外側ウォールのジャーク"
msgctxt "speed_wall_0_flooring label"
msgid "Bottom Surface Outer Wall Speed"
msgstr ""
msgstr "底面外側ウォールの速度"
msgctxt "acceleration_flooring label"
msgid "Bottom Surface Skin Acceleration"
msgstr ""
msgstr "底面スキンの加速度"
msgctxt "flooring_extruder_nr label"
msgid "Bottom Surface Skin Extruder"
msgstr ""
msgstr "底面スキン用エクストルーダー"
msgctxt "flooring_material_flow label"
msgid "Bottom Surface Skin Flow"
msgstr ""
msgstr "底面スキンのフロー"
msgctxt "jerk_flooring label"
msgid "Bottom Surface Skin Jerk"
msgstr ""
msgstr "底面スキンのジャーク"
msgctxt "flooring_layer_count label"
msgid "Bottom Surface Skin Layers"
msgstr ""
msgstr "底面スキンのレイヤー数"
msgctxt "flooring_angles label"
msgid "Bottom Surface Skin Line Directions"
msgstr ""
msgstr "底面ライン方向"
msgctxt "flooring_line_width label"
msgid "Bottom Surface Skin Line Width"
msgstr ""
msgstr "底面スキンのライン幅"
msgctxt "flooring_pattern label"
msgid "Bottom Surface Skin Pattern"
msgstr ""
msgstr "底面スキンのパターン"
msgctxt "speed_flooring label"
msgid "Bottom Surface Skin Speed"
msgstr ""
msgstr "底面スキンの速度"
msgctxt "bottom_thickness label"
msgid "Bottom Thickness"
@ -610,7 +610,7 @@ msgstr "コマンドライン設定"
msgctxt "flooring_pattern option concentric"
msgid "Concentric"
msgstr ""
msgstr "同心円"
msgctxt "infill_pattern option concentric"
msgid "Concentric"
@ -1122,7 +1122,7 @@ msgstr "ノズル切替え後のプライムに必要な余剰材料。"
msgctxt "variant_name"
msgid "Extruder"
msgstr ""
msgstr "エクストルーダー"
msgctxt "extruder_prime_pos_x label"
msgid "Extruder Prime X Position"
@ -1222,7 +1222,7 @@ msgstr "最初のレイヤーの底面ラインのフロー補正"
msgctxt "wall_x_material_flow_flooring description"
msgid "Flow compensation on bottom surface wall lines for all wall lines except the outermost one."
msgstr ""
msgstr "最も外側を除いた底面ウォールのすべてのラインにフロー補正を行います。"
msgctxt "infill_material_flow description"
msgid "Flow compensation on infill lines."
@ -1234,7 +1234,7 @@ msgstr "支持材の天井面または床面のフロー補正。"
msgctxt "flooring_material_flow description"
msgid "Flow compensation on lines of the areas at the bottom of the print."
msgstr ""
msgstr "造形物の底におけるラインにフロー補正を行います。"
msgctxt "roofing_material_flow description"
msgid "Flow compensation on lines of the areas at the top of the print."
@ -1262,7 +1262,7 @@ msgstr "支持材のフロー補正。"
msgctxt "wall_0_material_flow_flooring description"
msgid "Flow compensation on the bottom surface outermost wall line."
msgstr ""
msgstr "最も外側の底面ウォールのラインにフロー補正を行います。"
msgctxt "wall_0_material_flow_layer_0 description"
msgid "Flow compensation on the outermost wall line of the first layer."
@ -1482,7 +1482,7 @@ msgstr "Griffin"
msgctxt "machine_gcode_flavor option Cheetah"
msgid "Griffin+Cheetah"
msgstr ""
msgstr "Griffin+Cheetah"
msgctxt "group_outer_walls label"
msgid "Group Outer Walls"
@ -1890,7 +1890,7 @@ msgstr "内側から外側へ"
msgctxt "retraction_combing_avoid_distance label"
msgid "Inside Travel Avoid Distance"
msgstr ""
msgstr "内側の移動経路回避距離"
msgctxt "support_interface_priority option interface_lines_overwrite_support_area"
msgid "Interface lines preferred"
@ -2082,7 +2082,7 @@ msgstr "ライン幅"
msgctxt "flooring_pattern option lines"
msgid "Lines"
msgstr ""
msgstr "ライン"
msgctxt "infill_pattern option lines"
msgid "Lines"
@ -2414,7 +2414,7 @@ msgstr "最小レイヤー時間"
msgctxt "cool_min_layer_time_overhang label"
msgid "Minimum Layer Time with Overhang"
msgstr ""
msgstr "オーバーハングするレイヤーの最小時間"
msgctxt "min_odd_wall_line_width label"
msgid "Minimum Odd Wall Line Width"
@ -2422,7 +2422,7 @@ msgstr "最小奇数ウォールライン幅"
msgctxt "cool_min_layer_time_overhang_min_segment_length label"
msgid "Minimum Overhang Segment Length"
msgstr ""
msgstr "オーバーハングセグメントの最小距離"
msgctxt "minimum_polygon_circumference label"
msgid "Minimum Polygon Circumference"
@ -2510,7 +2510,7 @@ msgstr "型ルーフ高さ"
msgctxt "flooring_monotonic label"
msgid "Monotonic Bottom Surface Order"
msgstr ""
msgstr "底面方向の一貫性"
msgctxt "ironing_monotonic label"
msgid "Monotonic Ironing Order"
@ -2734,7 +2734,7 @@ msgstr "外側ウォール加速度"
msgctxt "wall_0_deceleration label"
msgid "Outer Wall End Deceleration"
msgstr ""
msgstr "外側ウォールの終了時減速度"
msgctxt "wall_0_end_speed_ratio label"
msgid "Outer Wall End Speed Ratio"
@ -2770,7 +2770,7 @@ msgstr "外側ウォールでの速度スプリットの距離"
msgctxt "wall_0_acceleration label"
msgid "Outer Wall Start Acceleration"
msgstr ""
msgstr "外側ウォール開始時加速度"
msgctxt "wall_0_start_speed_ratio label"
msgid "Outer Wall Start Speed Ratio"
@ -2798,11 +2798,11 @@ msgstr "オーバーハングウォール角"
msgctxt "wall_overhang_speed_factors label"
msgid "Overhanging Wall Speeds"
msgstr ""
msgstr "オーバーハングウォール速度"
msgctxt "wall_overhang_speed_factors description"
msgid "Overhanging walls will be printed at a percentage of their normal print speed. You can specify multiple values, so that even more overhanging walls will be printed even slower, e.g. by setting [75, 50, 25]"
msgstr ""
msgstr "オーバーハングするウォールは、通常のプリント速度に対し設定したパーセントの速度でプリントされます。複数の値を指定でき、オーバーハングしたウォールが増えるごとに遅くすることができます。設定例:[75, 50, 25]"
msgctxt "wipe_pause description"
msgid "Pause after the unretract."
@ -2838,7 +2838,7 @@ msgstr "希望枝角度"
msgctxt "material_pressure_advance_factor label"
msgid "Pressure advance factor"
msgstr ""
msgstr "圧力推進係数"
msgctxt "wall_transition_filter_deviation description"
msgid "Prevent transitioning back and forth between one extra wall and one less. This margin extends the range of line widths which follow to [Minimum Wall Line Width - Margin, 2 * Minimum Wall Line Width + Margin]. Increasing this margin reduces the number of transitions, which reduces the number of extrusion starts/stops and travel time. However, large line width variation can lead to under- or overextrusion problems."
@ -2918,7 +2918,7 @@ msgstr "印刷加速度"
msgctxt "variant_name"
msgid "Print Core"
msgstr ""
msgstr "プリントコア"
msgctxt "jerk_print label"
msgid "Print Jerk"
@ -2950,7 +2950,7 @@ msgstr "印刷物の隣に、ノズルを切り替えた後の材料でタワー
msgctxt "flooring_monotonic description"
msgid "Print bottom surface lines in an ordering that causes them to always overlap with adjacent lines in a single direction. This takes slightly more time to print, but makes flat surfaces look more consistent."
msgstr ""
msgstr "底面のラインを一方向に揃えることで、隣接するラインと常に重なり合います。これによりわずかに印刷時間がかかりますが、平面がより一貫した見た目になります。"
msgctxt "infill_support_enabled description"
msgid "Print infill structures only where tops of the model should be supported. Enabling this reduces print time and material usage, but leads to ununiform object strength."
@ -3670,7 +3670,7 @@ msgstr "開始G-Code"
msgctxt "machine_start_gcode_first label"
msgid "Start GCode must be first"
msgstr ""
msgstr "開始G-Codeを必ず最初に実行"
msgctxt "z_seam_type description"
msgid "Starting point of each path in a layer. When paths in consecutive layers start at the same point a vertical seam may show on the print. When aligning these near a user specified location, the seam is easiest to remove. When placed randomly the inaccuracies at the paths' start will be less noticeable. When taking the shortest path the print will be quicker."
@ -4094,7 +4094,7 @@ msgstr "内側のウォールがが出力される際のスピード。"
msgctxt "acceleration_flooring description"
msgid "The acceleration with which bottom surface skin layers are printed."
msgstr ""
msgstr "底面レイヤーが印刷される際の加速度。"
msgctxt "acceleration_infill description"
msgid "The acceleration with which infill is printed."
@ -4114,11 +4114,11 @@ msgstr "ラフトの底面印刷時の加速度。"
msgctxt "acceleration_wall_x_flooring description"
msgid "The acceleration with which the bottom surface inner walls are printed."
msgstr ""
msgstr "底面内側ウォールが印刷される際の加速度。"
msgctxt "acceleration_wall_0_flooring description"
msgid "The acceleration with which the bottom surface outermost walls are printed."
msgstr ""
msgstr "底面の最も外側のウォールが印刷される際の加速度。"
msgctxt "acceleration_support_bottom description"
msgid "The acceleration with which the floors of support are printed. Printing them at lower acceleration can improve adhesion of support on top of your model."
@ -4338,7 +4338,7 @@ msgstr "次のレイヤーの高さを前のレイヤーの高さと比べた差
msgctxt "machine_head_with_fans_polygon description"
msgid "The dimensions of the print head used to determine 'Safe Model Distance' when printing 'One at a Time'. These numbers relate to the centerline of the first extruder nozzle. Left of the nozzle is 'X Min' and must be negative. Rear of the nozzle is 'Y Min' and must be negative. X Max (right) and Y Max (front) are positive numbers. Gantry height is the dimension from the build plate to the X gantry beam."
msgstr ""
msgstr "一度にプリントする場合の「モデルとの安全距離」に使用される、プリントヘッドの座標です。これらの数値は最初のエクストルーダーズルの中心線との相対値になります。ズルの左側がX軸の最小値で、必ず負の値になります。ズルの後方がY軸の最小値で、必ず負の値になります。X軸最大値右側とY軸最大値前方は正の値になります。ガントリーの高さはビルドプレートからガントリーの梁はりとの距離になります。"
msgctxt "ironing_line_spacing description"
msgid "The distance between the lines of ironing."
@ -4350,7 +4350,7 @@ msgstr "Z軸シームにおける、モデルとそのサポート構造との
msgctxt "retraction_combing_avoid_distance description"
msgid "The distance between the nozzle and already printed outer walls when travelling inside a model."
msgstr ""
msgstr "モデルの内側を移動する際の、ノズルとプリント済みの外側ウォールとの距離。"
msgctxt "travel_avoid_distance description"
msgid "The distance between the nozzle and already printed parts when avoiding during travel moves."
@ -4462,7 +4462,7 @@ msgstr "インフィル造形時に使われるエクストルーダー。デュ
msgctxt "flooring_extruder_nr description"
msgid "The extruder train used for printing the bottom most skin. This is used in multi-extrusion."
msgstr ""
msgstr "最低面のスキンを印刷時に使用するエクストルーダー列。複数のエクストルーダーがある場合に使用されます。"
msgctxt "wall_x_extruder_nr description"
msgid "The extruder train used for printing the inner walls. This is used in multi-extrusion."
@ -4714,7 +4714,7 @@ msgstr "内側のウォールがプリントされれう際の最大瞬間速度
msgctxt "jerk_flooring description"
msgid "The maximum instantaneous velocity change with which bottom surface skin layers are printed."
msgstr ""
msgstr "底面スキンレイヤーをプリントする際の最大瞬間速度変化です。"
msgctxt "jerk_infill description"
msgid "The maximum instantaneous velocity change with which infill is printed."
@ -4722,11 +4722,11 @@ msgstr "インフィルの印刷時の瞬間速度の変更。"
msgctxt "jerk_wall_x_flooring description"
msgid "The maximum instantaneous velocity change with which the bottom surface inner walls are printed."
msgstr ""
msgstr "底面内側ウォールをプリントする際の最大瞬間速度変化です。"
msgctxt "jerk_wall_0_flooring description"
msgid "The maximum instantaneous velocity change with which the bottom surface outermost walls are printed."
msgstr ""
msgstr "底面の最も外側のウォールをプリントする際の最大瞬間速度変化です。"
msgctxt "jerk_support_bottom description"
msgid "The maximum instantaneous velocity change with which the floors of support are printed."
@ -4870,7 +4870,7 @@ msgstr "プライムタワーシェルの最小の厚さ。厚くすることで
msgctxt "cool_min_layer_time_overhang description"
msgid "The minimum time spent in a layer that contains overhanging extrusions. This forces the printer to slow down, to at least spend the time set here in one layer. This allows the printed material to cool down properly before printing the next layer. Layers may still take shorter than the minimal layer time if Lift Head is disabled and if the Minimum Speed would otherwise be violated."
msgstr ""
msgstr "オーバーハングになる押し出しを含むレイヤーでの最小時間です。これは1つのレイヤーに最低限かける時間までプリンターを強制的に遅くします。これにより、次のレイヤーを印刷する前にプリントされた材料が適切に冷却されるようになります。ヘッド持ち上げが無効かつ最低速度を下回ってしまう場合は、レイヤーの印刷時間は最小レイヤー印刷時間より短くなります。"
msgctxt "cool_min_layer_time description"
msgid "The minimum time spent in a layer. This forces the printer to slow down, to at least spend the time set here in one layer. This allows the printed material to cool down properly before printing the next layer. Layers may still take shorter than the minimal layer time if Lift Head is disabled and if the Minimum Speed would otherwise be violated."
@ -4906,7 +4906,7 @@ msgstr "最底面のレイヤー数。下の厚さで計算すると、この値
msgctxt "flooring_layer_count description"
msgid "The number of bottom most skin layers. Usually only one bottom most layer is sufficient to generate higher quality bottom surfaces."
msgstr ""
msgstr "最低面レイヤーの数です。通常、最低面はより良い品質の底面にするのに1レイヤーで十分です。"
msgctxt "raft_base_wall_count description"
msgid "The number of contours to print around the linear pattern in the base layer of the raft."
@ -4990,7 +4990,7 @@ msgstr "ノズルの外径。"
msgctxt "flooring_pattern description"
msgid "The pattern of the bottom most layers."
msgstr ""
msgstr "最低面レイヤーのパターンです。"
msgctxt "infill_pattern description"
msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Gyroid, cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction. Lightning infill tries to minimize the infill, by only supporting the ceiling of the object."
@ -5074,7 +5074,7 @@ msgstr "内側のウォールをプリントする速度。外側より内側の
msgctxt "speed_flooring description"
msgid "The speed at which bottom surface skin layers are printed."
msgstr ""
msgstr "底面レイヤーをプリントする際の速度です。"
msgctxt "bridge_skin_speed description"
msgid "The speed at which bridge skin regions are printed."
@ -5094,11 +5094,11 @@ msgstr "ベースラフト層が印刷される速度。ノズルから出てく
msgctxt "speed_wall_x_flooring description"
msgid "The speed at which the bottom surface inner walls are printed."
msgstr ""
msgstr "底面内側ウォールをプリントする際の速度です。"
msgctxt "speed_wall_0_flooring description"
msgid "The speed at which the bottom surface outermost wall is printed."
msgstr ""
msgstr "底面の最も外側のウォールをプリントする際の速度です。"
msgctxt "bridge_wall_speed description"
msgid "The speed at which the bridge walls are printed."
@ -5422,7 +5422,7 @@ msgstr "この設定は、ラフト上層部の輪郭の内側の角をどの程
msgctxt "machine_start_gcode_first description"
msgid "This setting controls if the start-gcode is forced to always be the first g-code. Without this option other g-code, such as a T0 can be inserted before the start g-code."
msgstr ""
msgstr "この設定は開始G-Codeが必ず最初のG-Codeとなるよう制御します。この設定が無効の場合、T0といった他のG-Codeが開始G-Codeの前に挿入される場合があります。"
msgctxt "retraction_count_max description"
msgid "This setting limits the number of retractions occurring within the minimum extrusion distance window. Further retractions within this window will be ignored. This avoids retracting repeatedly on the same piece of filament, as that can flatten the filament and cause grinding issues."
@ -5658,7 +5658,7 @@ msgstr "ウォールのシームがこの角度以上にオーバーハングし
msgctxt "material_pressure_advance_factor description"
msgid "Tuning factor for pressure advance, which is meant to synchronize extrusion with motion"
msgstr ""
msgstr "吐出と動作を同期するための、圧力推進を調整する係数です。"
msgctxt "machine_gcode_flavor option UltiGCode"
msgid "Ultimaker 2"
@ -5874,7 +5874,7 @@ msgstr "部品が薄くなるにつれて異なる数のウォール間を移行
msgctxt "cool_min_layer_time_overhang_min_segment_length description"
msgid "When trying to apply the minimum layer time specific for overhanging layers, it will be applied only if at least one consecutive overhanging extrusion move is longer than this value."
msgstr ""
msgstr "オーバーハングするレイヤーに最小時間を適用する際、少なくとも1つの連続したオーバーハング移動がこの値より長くなるよう適用されます。"
msgctxt "wipe_hop_enable description"
msgid "When wiping, the build plate is lowered to create clearance between the nozzle and the print. It prevents the nozzle from hitting the print during travel moves, reducing the chance to knock the print from the build plate."
@ -5926,7 +5926,7 @@ msgstr "オブジェクトが保存された座標系を使用する代わりに
msgctxt "machine_nozzle_temp_enabled description"
msgid "Whether to control temperature from Cura. Turn this off to control nozzle temperature from outside of Cura."
msgstr "Curaから温度を制御するかどうか。これをオフにして、Cura外からズル温度を制御することで無効化。"
msgstr "Curaから温度を制御するかどうか。これをオフにすることで、Cura外からズル温度を制御します。"
msgctxt "material_bed_temp_prepend description"
msgid "Whether to include build plate temperature commands at the start of the gcode. When the start_gcode already contains build plate temperature commands Cura frontend will automatically disable this setting."
@ -5974,7 +5974,7 @@ msgstr "サポートのルーフ、フロアのライン幅。"
msgctxt "flooring_line_width description"
msgid "Width of a single line of the areas at the bottom of the print."
msgstr ""
msgstr "プリントの底面領域における1本のラインの幅です。"
msgctxt "roofing_line_width description"
msgid "Width of a single line of the areas at the top of the print."
@ -6178,7 +6178,7 @@ msgstr "ZがX/Yを上書き"
msgctxt "flooring_pattern option zigzag"
msgid "Zig Zag"
msgstr ""
msgstr "ジグザグ"
msgctxt "infill_pattern option zigzag"
msgid "Zig Zag"

View File

@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Cura 5.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-21 15:37+0100\n"
"PO-Revision-Date: 2024-10-28 04:18+0100\n"
"PO-Revision-Date: 2025-03-23 17:45+0100\n"
"Last-Translator: Cláudio Sampaio <patola@gmail.com>\n"
"Language-Team: Cláudio Sampaio <patola@gmail.com>\n"
"Language: pt_BR\n"
@ -16,7 +16,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Poedit 3.4.2\n"
"X-Generator: Poedit 3.5\n"
msgctxt "@title:label"
msgid " "
@ -183,7 +183,7 @@ msgstr "Visão 3D"
msgctxt "name"
msgid "3DConnexion mouses"
msgstr ""
msgstr "Mouses 3DConnexion"
msgctxt "@item:inlistbox"
msgid "3MF File"
@ -483,7 +483,7 @@ msgstr "Permite carregar e exibir arquivos G-Code."
msgctxt "description"
msgid "Allows working with 3D mouses inside Cura."
msgstr ""
msgstr "Permite trabalhar com mouses 3D dentro do Cura."
msgctxt "@option:discardOrKeep"
msgid "Always ask me this"
@ -1603,7 +1603,7 @@ msgstr "Extrusor %1"
msgctxt "@label"
msgid "Extruder Change duration"
msgstr ""
msgstr "Duração de Mudança do Extrusor"
msgctxt "@title:label"
msgid "Extruder End G-code"
@ -1615,7 +1615,7 @@ msgstr "Duração do G-code Final do Extrusor"
msgctxt "@title:label"
msgid "Extruder Prestart G-code"
msgstr ""
msgstr "G-Code de Pré-Início do Extrusor"
msgctxt "@title:label"
msgid "Extruder Start G-code"
@ -1808,7 +1808,7 @@ msgstr "Primeira disponível"
msgctxt "@option:check"
msgid "Flip model's toolhandle Y axis (restart required)"
msgstr ""
msgstr "Trocar o eixo Y da ferramenta do modelo (reinício requerido)"
msgctxt "@label:listbox"
msgid "Flow"
@ -2300,7 +2300,7 @@ msgstr "Nivelar mesa"
msgctxt "@title:window The argument is a package name, and the second is the version."
msgid "License for %1 %2"
msgstr ""
msgstr "Licença para %1 %2"
msgctxt "@item:inlistbox"
msgid "Lighter is higher"
@ -2408,7 +2408,7 @@ msgstr "Gerador de Makerbot Printfile"
msgctxt "@item:inlistbox"
msgid "Makerbot Replicator+ Printfile"
msgstr ""
msgstr "Makerbot Replicator+ Arquivo de Impressão"
msgctxt "@item:inlistbox"
msgid "Makerbot Sketch Printfile"
@ -4029,7 +4029,7 @@ msgstr "Devem falhas de fatiamento serem automaticamente relatadas à Ultimaker?
msgctxt "@info:tooltip"
msgid "Should the Y axis of the translate toolhandle be flipped? This will only affect model's Y coordinate, all other settings such as machine Printhead settings are unaffected and still behave as before."
msgstr ""
msgstr "Deverá o eixo Y de translação da ferramenta trocar de orientação? Isto afetará apenas a coordenada Y do modelo, todos os outros ajustes tais como ajustes de Cabeça de Impressão não serão afetados e ainda funcionarão como antes."
msgctxt "@info:tooltip"
msgid "Should the build plate be cleared before loading a new model in the single instance of Cura?"
@ -4269,7 +4269,7 @@ msgstr "G-Code Inicial"
msgctxt "@label"
msgid "Start GCode must be first"
msgstr ""
msgstr "O GCode de Início deve ser o primeiro"
msgctxt "@label"
msgid "Start the slicing process"
@ -4677,7 +4677,7 @@ msgstr "Esta configuração não está disponível porque %1 não foi reconhecid
msgctxt "@label"
msgid "This configuration is not available because there is a mismatch or other problem with core-type %1. Please visit <a href='%2'>the support page</a> to check which cores this printer-type supports w.r.t. new slices."
msgstr ""
msgstr "Esta configuração não está disponível porque há uma incompatibilidade ou outro problema com o core-type %1. Por favor visite a <a href='%2'>página de suporte</a> para verificar que núcleos este tipo de impressora suporta de acordo com as novas fatias."
msgctxt "@text:window"
msgid "This is a Cura Universal project file. Would you like to open it as a Cura Universal Project or import the models from it?"
@ -5247,7 +5247,7 @@ msgstr "Atualiza configurações do Cura 5.8 para o Cura 5.9."
msgctxt "description"
msgid "Upgrades configurations from Cura 5.9 to Cura 5.10"
msgstr ""
msgstr "Atualiza configurações do Cura 5.9 para o Cura 5.10"
msgctxt "@action:button"
msgid "Upload custom Firmware"
@ -5391,7 +5391,7 @@ msgstr "Atualização de Versão de 5.8 para 5.9"
msgctxt "name"
msgid "Version Upgrade 5.9 to 5.10"
msgstr ""
msgstr "Atualização de Versão de 5.9 para 5.10"
msgctxt "@button"
msgid "View printers in Digital Factory"
@ -5556,11 +5556,11 @@ msgstr "Y (Profundidade)"
msgctxt "@label"
msgid "Y max ( '+' towards front)"
msgstr ""
msgstr "Y máximo ('+' indo para a frente)"
msgctxt "@label"
msgid "Y min ( '-' towards back)"
msgstr ""
msgstr "Y mínimo ('-' indo para trás)"
msgctxt "@info"
msgid "Yes"

View File

@ -7,7 +7,7 @@ msgstr ""
"Project-Id-Version: Cura 5.1\n"
"Report-Msgid-Bugs-To: plugins@ultimaker.com\n"
"POT-Creation-Date: 2025-02-21 15:37+0000\n"
"PO-Revision-Date: 2024-10-28 04:20+0100\n"
"PO-Revision-Date: 2025-03-23 17:27+0100\n"
"Last-Translator: Cláudio Sampaio <patola@gmail.com>\n"
"Language-Team: Cláudio Sampaio <patola@gmail.com>\n"
"Language: pt_BR\n"
@ -15,7 +15,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Poedit 3.4.2\n"
"X-Generator: Poedit 3.5\n"
msgctxt "platform_adhesion description"
msgid "Adhesion"
@ -43,7 +43,7 @@ msgstr "Extrusor"
msgctxt "machine_extruder_change_duration label"
msgid "Extruder Change duration"
msgstr ""
msgstr "Duração da Mudança do Extrusor"
msgctxt "machine_extruder_end_code label"
msgid "Extruder End G-Code"
@ -67,7 +67,7 @@ msgstr "Posição Y Final do Extrusor"
msgctxt "machine_extruder_prestart_code label"
msgid "Extruder Prestart G-Code"
msgstr ""
msgstr "G-Code de Pré-Início do Extrusor"
msgctxt "extruder_prime_pos_x label"
msgid "Extruder Prime X Position"
@ -151,7 +151,7 @@ msgstr "Deslocamento Y do Bico"
msgctxt "machine_extruder_prestart_code description"
msgid "Prestart g-code to execute before switching to this extruder."
msgstr ""
msgstr "G-Code a executar antes de trocar para este extrusor."
msgctxt "machine_extruder_start_code description"
msgid "Start g-code to execute when switching to this extruder."
@ -223,7 +223,7 @@ msgstr "A coordenada Y da posição de início quando se liga o extrusor."
msgctxt "machine_extruder_change_duration description"
msgid "When using a multi tool setup, this value is the tool change time in seconds. This value will be added to the estimate time based on the number of changes that occur."
msgstr ""
msgstr "Ao usar uma configuração multiferramentas, este valor é o tempo da mudança de ferramentas em segundos. O valor será adicionado ao tempo estimado baseado no número de mudanças que ocorrem."
#~ msgctxt "machine_extruder_end_code description"
#~ msgid "End g-code to execute whenever turning the extruder off."

View File

@ -7,7 +7,7 @@ msgstr ""
"Project-Id-Version: Cura 5.7\n"
"Report-Msgid-Bugs-To: plugins@ultimaker.com\n"
"POT-Creation-Date: 2025-02-21 15:37+0000\n"
"PO-Revision-Date: 2024-10-29 03:52+0100\n"
"PO-Revision-Date: 2025-03-23 23:56+0100\n"
"Last-Translator: Cláudio Sampaio <patola@gmail.com>\n"
"Language-Team: Cláudio Sampaio <patola@gmail.com>\n"
"Language: pt_BR\n"
@ -15,7 +15,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Poedit 3.4.2\n"
"X-Generator: Poedit 3.5\n"
msgctxt "prime_tower_mode description"
msgid "<html>How to generate the prime tower:<ul><li><b>Normal:</b> create a bucket in which secondary materials are primed</li><li><b>Interleaved:</b> create a prime tower as sparse as possible. This will save time and filament, but is only possible if the used materials adhere to each other</li></ul></html>"
@ -39,7 +39,7 @@ msgstr "Um fator indicando em quanto o filamento é comprimido entre o alimentad
msgctxt "flooring_angles description"
msgid "A list of integer line directions to use when the bottom surface skin layers use the lines or zig zag pattern. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees)."
msgstr ""
msgstr "Uma lista de linhas de direções inteiras a usar quando as camadas de contorno da superfície inferior usa os padrões de linhas ou ziguezague. Elementos da lista são usados sequencialmente à medida que as camadas progridem e quando o fim da lista é alcançado, ela reinicia do começo. Os itens da lista são separados por vírgulas e a lista inteira é contida em colchetes. O valor default é uma lista vazia que significa usar os ângulos default tradicionais (45 e 135 graus)."
msgctxt "roofing_angles description"
msgid "A list of integer line directions to use when the top surface skin layers use the lines or zig zag pattern. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees)."
@ -311,71 +311,71 @@ msgstr "Largura de Remoção do Contorno Inferior"
msgctxt "acceleration_wall_x_flooring label"
msgid "Bottom Surface Inner Wall Acceleration"
msgstr ""
msgstr "Aceleração da Parede Interna da Superfície Inferior"
msgctxt "jerk_wall_x_flooring label"
msgid "Bottom Surface Inner Wall Jerk"
msgstr ""
msgstr "Jerk da Parede Interna da Superfície Inferior"
msgctxt "speed_wall_x_flooring label"
msgid "Bottom Surface Inner Wall Speed"
msgstr ""
msgstr "Velocidade da Parede Interna da Superfície Inferior"
msgctxt "wall_x_material_flow_flooring label"
msgid "Bottom Surface Inner Wall(s) Flow"
msgstr ""
msgstr "Fluxo da(s) Parede(s) Interna(s) da Superfície Inferior"
msgctxt "acceleration_wall_0_flooring label"
msgid "Bottom Surface Outer Wall Acceleration"
msgstr ""
msgstr "Aceleração da Parede Externa da Superfície Inferior"
msgctxt "wall_0_material_flow_flooring label"
msgid "Bottom Surface Outer Wall Flow"
msgstr ""
msgstr "Fluxo da Parede Externa da Superfície Inferior"
msgctxt "jerk_wall_0_flooring label"
msgid "Bottom Surface Outer Wall Jerk"
msgstr ""
msgstr "Jerk da Parede Externa da Superfície Inferior"
msgctxt "speed_wall_0_flooring label"
msgid "Bottom Surface Outer Wall Speed"
msgstr ""
msgstr "Velocidade da Parede Externa da Superfície Inferior"
msgctxt "acceleration_flooring label"
msgid "Bottom Surface Skin Acceleration"
msgstr ""
msgstr "Aceleração do Contorno da Superfície Inferior"
msgctxt "flooring_extruder_nr label"
msgid "Bottom Surface Skin Extruder"
msgstr ""
msgstr "Extrusor do Contorno da Superfície Inferior"
msgctxt "flooring_material_flow label"
msgid "Bottom Surface Skin Flow"
msgstr ""
msgstr "Fluxo do Contorno da Superfície Inferior"
msgctxt "jerk_flooring label"
msgid "Bottom Surface Skin Jerk"
msgstr ""
msgstr "Jerk do Contorno da Superfície Inferior"
msgctxt "flooring_layer_count label"
msgid "Bottom Surface Skin Layers"
msgstr ""
msgstr "Camadas do Contorno da Superfície Inferior"
msgctxt "flooring_angles label"
msgid "Bottom Surface Skin Line Directions"
msgstr ""
msgstr "Direções de Filete do Contorno da Superfície Inferior"
msgctxt "flooring_line_width label"
msgid "Bottom Surface Skin Line Width"
msgstr ""
msgstr "Largura de Filete do Contorno da Superfície Inferior"
msgctxt "flooring_pattern label"
msgid "Bottom Surface Skin Pattern"
msgstr ""
msgstr "Padrão do Contorno da Superfície Inferior"
msgctxt "speed_flooring label"
msgid "Bottom Surface Skin Speed"
msgstr ""
msgstr "Velocidade do Contorno da Superfície Inferior"
msgctxt "bottom_thickness label"
msgid "Bottom Thickness"
@ -615,7 +615,7 @@ msgstr "Ajustes de Linha de Comando"
msgctxt "flooring_pattern option concentric"
msgid "Concentric"
msgstr ""
msgstr "Concêntrico"
msgctxt "infill_pattern option concentric"
msgid "Concentric"
@ -1127,7 +1127,7 @@ msgstr "Material extra a avançar depois da troca de bico."
msgctxt "variant_name"
msgid "Extruder"
msgstr ""
msgstr "Extrusor"
msgctxt "extruder_prime_pos_x label"
msgid "Extruder Prime X Position"
@ -1227,7 +1227,7 @@ msgstr "Compensação de fluxo nos filetes da base da primeira camada"
msgctxt "wall_x_material_flow_flooring description"
msgid "Flow compensation on bottom surface wall lines for all wall lines except the outermost one."
msgstr ""
msgstr "Compensação de fluxo nos filetes de parede da superfície inferior para todos os filetes exceto o mais externo."
msgctxt "infill_material_flow description"
msgid "Flow compensation on infill lines."
@ -1239,7 +1239,7 @@ msgstr "Compensação de fluxo em filetes do teto ou base do suporte."
msgctxt "flooring_material_flow description"
msgid "Flow compensation on lines of the areas at the bottom of the print."
msgstr ""
msgstr "Compensação de fluxo em filetes das áreas da base da impressão."
msgctxt "roofing_material_flow description"
msgid "Flow compensation on lines of the areas at the top of the print."
@ -1267,7 +1267,7 @@ msgstr "Compensação de fluxo em filetes de estruturas de suporte."
msgctxt "wall_0_material_flow_flooring description"
msgid "Flow compensation on the bottom surface outermost wall line."
msgstr ""
msgstr "Compensação de fluxo na parede mais externa da superfície inferior."
msgctxt "wall_0_material_flow_layer_0 description"
msgid "Flow compensation on the outermost wall line of the first layer."
@ -1491,7 +1491,7 @@ msgstr "Griffin"
msgctxt "machine_gcode_flavor option Cheetah"
msgid "Griffin+Cheetah"
msgstr ""
msgstr "Griffin+Cheetah"
msgctxt "group_outer_walls label"
msgid "Group Outer Walls"
@ -1899,7 +1899,7 @@ msgstr "De Dentro Pra Fora"
msgctxt "retraction_combing_avoid_distance label"
msgid "Inside Travel Avoid Distance"
msgstr ""
msgstr "Distância de Desvio do Percurso Interior"
msgctxt "support_interface_priority option interface_lines_overwrite_support_area"
msgid "Interface lines preferred"
@ -2091,7 +2091,7 @@ msgstr "Largura de Extrusão"
msgctxt "flooring_pattern option lines"
msgid "Lines"
msgstr ""
msgstr "Filetes"
msgctxt "infill_pattern option lines"
msgid "Lines"
@ -2423,7 +2423,7 @@ msgstr "Tempo Mínimo de Camada"
msgctxt "cool_min_layer_time_overhang label"
msgid "Minimum Layer Time with Overhang"
msgstr ""
msgstr "Tempo Mínimo de Camada com Seção Pendente"
msgctxt "min_odd_wall_line_width label"
msgid "Minimum Odd Wall Line Width"
@ -2431,7 +2431,7 @@ msgstr "Largura Mínima de Filete de Parede Ímpar"
msgctxt "cool_min_layer_time_overhang_min_segment_length label"
msgid "Minimum Overhang Segment Length"
msgstr ""
msgstr "Comprimento Mínimo do Segmento de Seção Pendente"
msgctxt "minimum_polygon_circumference label"
msgid "Minimum Polygon Circumference"
@ -2519,7 +2519,7 @@ msgstr "Altura de Teto do Molde"
msgctxt "flooring_monotonic label"
msgid "Monotonic Bottom Surface Order"
msgstr ""
msgstr "Ordem Monotônica de Superfície Inferior"
msgctxt "ironing_monotonic label"
msgid "Monotonic Ironing Order"
@ -2743,7 +2743,7 @@ msgstr "Aceleração da Parede Exterior"
msgctxt "wall_0_deceleration label"
msgid "Outer Wall End Deceleration"
msgstr ""
msgstr "Deceleração do Final da Parede Externa"
msgctxt "wall_0_end_speed_ratio label"
msgid "Outer Wall End Speed Ratio"
@ -2779,7 +2779,7 @@ msgstr "Distância de Divisão de Velocidade da Parede Externa"
msgctxt "wall_0_acceleration label"
msgid "Outer Wall Start Acceleration"
msgstr ""
msgstr "Aceleração do Início da Parede Externa"
msgctxt "wall_0_start_speed_ratio label"
msgid "Outer Wall Start Speed Ratio"
@ -2807,11 +2807,11 @@ msgstr "Ângulo de Parede Pendente"
msgctxt "wall_overhang_speed_factors label"
msgid "Overhanging Wall Speeds"
msgstr ""
msgstr "Velocidades das Paredes Pendentes"
msgctxt "wall_overhang_speed_factors description"
msgid "Overhanging walls will be printed at a percentage of their normal print speed. You can specify multiple values, so that even more overhanging walls will be printed even slower, e.g. by setting [75, 50, 25]"
msgstr ""
msgstr "Paredes pendentes serão impressas em uma porcentagem de sua velocidade normal de impressão. Você pode especificar valores múltiplos, de forma que ainda mais paredes pendentes sejam impressas mais lentamente, por exemplo colocando [75, 50, 25]"
msgctxt "wipe_pause description"
msgid "Pause after the unretract."
@ -2847,7 +2847,7 @@ msgstr "Ângulo Preferido de Galho"
msgctxt "material_pressure_advance_factor label"
msgid "Pressure advance factor"
msgstr ""
msgstr "Factor de avanço de pressão"
msgctxt "wall_transition_filter_deviation description"
msgid "Prevent transitioning back and forth between one extra wall and one less. This margin extends the range of line widths which follow to [Minimum Wall Line Width - Margin, 2 * Minimum Wall Line Width + Margin]. Increasing this margin reduces the number of transitions, which reduces the number of extrusion starts/stops and travel time. However, large line width variation can lead to under- or overextrusion problems."
@ -2927,7 +2927,7 @@ msgstr "Aceleração da Impressão"
msgctxt "variant_name"
msgid "Print Core"
msgstr ""
msgstr "Núcleo de Impressão"
msgctxt "jerk_print label"
msgid "Print Jerk"
@ -2959,7 +2959,7 @@ msgstr "Imprimir uma torre próxima à impressão que serve para purgar o materi
msgctxt "flooring_monotonic description"
msgid "Print bottom surface lines in an ordering that causes them to always overlap with adjacent lines in a single direction. This takes slightly more time to print, but makes flat surfaces look more consistent."
msgstr ""
msgstr "Imprime os filetes da superfície inferior em uma ordem que faz com que sempre se sobreponham com linhas adjacentes em uma direção única. Isso leva um pouco mais de tempo pra imprimir, mas faz superfícies chatas terem aspecto mais consistente."
msgctxt "infill_support_enabled description"
msgid "Print infill structures only where tops of the model should be supported. Enabling this reduces print time and material usage, but leads to ununiform object strength."
@ -3679,7 +3679,7 @@ msgstr "G-Code Inicial"
msgctxt "machine_start_gcode_first label"
msgid "Start GCode must be first"
msgstr ""
msgstr "O GCode de Início deve ser o primeiro"
msgctxt "z_seam_type description"
msgid "Starting point of each path in a layer. When paths in consecutive layers start at the same point a vertical seam may show on the print. When aligning these near a user specified location, the seam is easiest to remove. When placed randomly the inaccuracies at the paths' start will be less noticeable. When taking the shortest path the print will be quicker."
@ -4103,7 +4103,7 @@ msgstr "Aceleração com que se imprimem as paredes interiores."
msgctxt "acceleration_flooring description"
msgid "The acceleration with which bottom surface skin layers are printed."
msgstr ""
msgstr "A aceleração com a qual as camadas do contorno da superfície inferior serão impressas."
msgctxt "acceleration_infill description"
msgid "The acceleration with which infill is printed."
@ -4123,11 +4123,11 @@ msgstr "A aceleração com que as camadas de base do raft são impressas."
msgctxt "acceleration_wall_x_flooring description"
msgid "The acceleration with which the bottom surface inner walls are printed."
msgstr ""
msgstr "A aceleração com que as paredes internas da superfície inferior são impressas."
msgctxt "acceleration_wall_0_flooring description"
msgid "The acceleration with which the bottom surface outermost walls are printed."
msgstr ""
msgstr "A aceleração com que as paredes mais externas da superfície inferior são impressas."
msgctxt "acceleration_support_bottom description"
msgid "The acceleration with which the floors of support are printed. Printing them at lower acceleration can improve adhesion of support on top of your model."
@ -4347,7 +4347,7 @@ msgstr "A diferença em tamanho da próxima camada comparada à anterior."
msgctxt "machine_head_with_fans_polygon description"
msgid "The dimensions of the print head used to determine 'Safe Model Distance' when printing 'One at a Time'. These numbers relate to the centerline of the first extruder nozzle. Left of the nozzle is 'X Min' and must be negative. Rear of the nozzle is 'Y Min' and must be negative. X Max (right) and Y Max (front) are positive numbers. Gantry height is the dimension from the build plate to the X gantry beam."
msgstr ""
msgstr "As dimensões da cabeça de impressão usadas para determinar a 'Distância de Modo Seguro' ao imprimir 'Um de Cada Vez'. Esses número se relacionam ao filete central do bico do primeiro extrusor. À esquerda do bico é 'X Mínimo' e deve ser negativo. A parte de trás do bico é 'Y Mínimo' e deve ser negativa. X Máximo (direita) e Y Máximo (frente) são números positivos. Altura do eixo é a dimensão da plataforma de impressão até a barra do eixo X."
msgctxt "ironing_line_spacing description"
msgid "The distance between the lines of ironing."
@ -4359,7 +4359,7 @@ msgstr "A distância entre o modelo e sua estrutura de suporta na costura do eix
msgctxt "retraction_combing_avoid_distance description"
msgid "The distance between the nozzle and already printed outer walls when travelling inside a model."
msgstr ""
msgstr "A distância entre o bico e paredes externas já impressas ao percorrer no interior do modelo."
msgctxt "travel_avoid_distance description"
msgid "The distance between the nozzle and already printed parts when avoiding during travel moves."
@ -4471,7 +4471,7 @@ msgstr "O carro extrusor usado para imprimir preenchimento. Este ajuste é usado
msgctxt "flooring_extruder_nr description"
msgid "The extruder train used for printing the bottom most skin. This is used in multi-extrusion."
msgstr ""
msgstr "O carro de extrusor usado para imprimir o contorno mais inferior. Isto é usado em multi-extrusão."
msgctxt "wall_x_extruder_nr description"
msgid "The extruder train used for printing the inner walls. This is used in multi-extrusion."
@ -4723,7 +4723,7 @@ msgstr "A máxima mudança de velocidade instantânea em uma direção com que a
msgctxt "jerk_flooring description"
msgid "The maximum instantaneous velocity change with which bottom surface skin layers are printed."
msgstr ""
msgstr "A máxima mudança instantânea de velocidade com que as camadas de contorno da superfície inferior são impressas."
msgctxt "jerk_infill description"
msgid "The maximum instantaneous velocity change with which infill is printed."
@ -4731,11 +4731,11 @@ msgstr "A mudança instantânea máxima de velocidade em uma direção com que o
msgctxt "jerk_wall_x_flooring description"
msgid "The maximum instantaneous velocity change with which the bottom surface inner walls are printed."
msgstr ""
msgstr "A máxima mudança instantânea de velocidade com que as paredes internas da superfície inferior são impressas."
msgctxt "jerk_wall_0_flooring description"
msgid "The maximum instantaneous velocity change with which the bottom surface outermost walls are printed."
msgstr ""
msgstr "A máxima mudança instantânea de velocidade com quem as paredes externas da superfície inferior são impressas."
msgctxt "jerk_support_bottom description"
msgid "The maximum instantaneous velocity change with which the floors of support are printed."
@ -4879,7 +4879,7 @@ msgstr "A espessura mínima do casco da torre de purga. Você pode aumentar este
msgctxt "cool_min_layer_time_overhang description"
msgid "The minimum time spent in a layer that contains overhanging extrusions. This forces the printer to slow down, to at least spend the time set here in one layer. This allows the printed material to cool down properly before printing the next layer. Layers may still take shorter than the minimal layer time if Lift Head is disabled and if the Minimum Speed would otherwise be violated."
msgstr ""
msgstr "O tempo mínimo gasto em uma camada que contenha extrusões pendentes. Isto força a impressora a desacelerar para pelo menos gastar o tempo ajustado aqui em uma camada. E por sua vez isso permite que o material impresso esfrie apropriadamente antes de imprimir a próxima camada. Camadas ainda podem levar menos tempo que o tempo mínimo de camada se Levantar Cabeça estiver desabilitado e se a Velocidade Mínima fosse violada dessa forma."
msgctxt "cool_min_layer_time description"
msgid "The minimum time spent in a layer. This forces the printer to slow down, to at least spend the time set here in one layer. This allows the printed material to cool down properly before printing the next layer. Layers may still take shorter than the minimal layer time if Lift Head is disabled and if the Minimum Speed would otherwise be violated."
@ -4915,7 +4915,7 @@ msgstr "O número de camadas inferiores. Quando calculado da espessura inferior,
msgctxt "flooring_layer_count description"
msgid "The number of bottom most skin layers. Usually only one bottom most layer is sufficient to generate higher quality bottom surfaces."
msgstr ""
msgstr "O número de camadas do contorno mais inferior. Geralmente somente uma camada de contorno mais inferior é suficiente para gerar superfícies inferiores de maior qualidade."
msgctxt "raft_base_wall_count description"
msgid "The number of contours to print around the linear pattern in the base layer of the raft."
@ -4955,7 +4955,7 @@ msgstr "O número de filetes usado para o brim de suporte. Mais filetes melhoram
msgctxt "build_volume_fan_nr description"
msgid "The number of the fan that cools the build volume. If this is set to 0, it's means that there is no build volume fan"
msgstr "O número da ventoinha que refrigera o volume de construção. Se isto for colocado em 0, significa que não há ventoinha do volume de construção."
msgstr "O número da ventoinhas que refrigeram o volume de construção. Se isto for colocado em 0, significa que não há ventoinha do volume de construção."
msgctxt "raft_surface_layers description"
msgid "The number of top layers on top of the 2nd raft layer. These are fully filled layers that the model sits on. 2 layers result in a smoother top surface than 1."
@ -4999,7 +4999,7 @@ msgstr "Diâmetro exterior do bico (a ponta do hotend)."
msgctxt "flooring_pattern description"
msgid "The pattern of the bottom most layers."
msgstr ""
msgstr "O padrão das camadas mais inferiores."
msgctxt "infill_pattern description"
msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Gyroid, cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction. Lightning infill tries to minimize the infill, by only supporting the ceiling of the object."
@ -5083,7 +5083,7 @@ msgstr "A velocidade em que todas as paredes interiores são impressas. Imprimir
msgctxt "speed_flooring description"
msgid "The speed at which bottom surface skin layers are printed."
msgstr ""
msgstr "A velocidade com que as camadas do contorno da superfície inferior são impressas."
msgctxt "bridge_skin_speed description"
msgid "The speed at which bridge skin regions are printed."
@ -5103,11 +5103,11 @@ msgstr "A velocidade em que a camada de base do raft é impressa. Deve ser impre
msgctxt "speed_wall_x_flooring description"
msgid "The speed at which the bottom surface inner walls are printed."
msgstr ""
msgstr "A velocidade com que as paredes internas da superfície inferior são impressas."
msgctxt "speed_wall_0_flooring description"
msgid "The speed at which the bottom surface outermost wall is printed."
msgstr ""
msgstr "A velocidade com que a parede mais externa da superfície inferior é impressa."
msgctxt "bridge_wall_speed description"
msgid "The speed at which the bridge walls are printed."
@ -5431,7 +5431,7 @@ msgstr "Este ajuste controle quantos cantos internos no contorno do topo do raft
msgctxt "machine_start_gcode_first description"
msgid "This setting controls if the start-gcode is forced to always be the first g-code. Without this option other g-code, such as a T0 can be inserted before the start g-code."
msgstr ""
msgstr "Este ajuste controle se o gcode de início é forçado para sempre ser o primeiro g-code. Sem esta opção outro g-code, como um T0, pode ser inserido antes do g-code de início."
msgctxt "retraction_count_max description"
msgid "This setting limits the number of retractions occurring within the minimum extrusion distance window. Further retractions within this window will be ignored. This avoids retracting repeatedly on the same piece of filament, as that can flatten the filament and cause grinding issues."
@ -5667,7 +5667,7 @@ msgstr "Tentar prevenir costuras nas paredes que tenham seção pendente com ân
msgctxt "material_pressure_advance_factor description"
msgid "Tuning factor for pressure advance, which is meant to synchronize extrusion with motion"
msgstr ""
msgstr "Fator de sintonização de avanço de pressão, que tem a função de sincronizar a extrusão com o movimento"
msgctxt "machine_gcode_flavor option UltiGCode"
msgid "Ultimaker 2"
@ -5883,7 +5883,7 @@ msgstr "Ao transicionar entre diferentes números de paredes à medida que a pe
msgctxt "cool_min_layer_time_overhang_min_segment_length description"
msgid "When trying to apply the minimum layer time specific for overhanging layers, it will be applied only if at least one consecutive overhanging extrusion move is longer than this value."
msgstr ""
msgstr "Ao tentar aplicar o tempo mínimo de camada específico para camadas pendentes, o ajuste valerá somente se no mínimo um movimento de extrusão pendente consecutivo demorar mais que esse valor."
msgctxt "wipe_hop_enable description"
msgid "When wiping, the build plate is lowered to create clearance between the nozzle and the print. It prevents the nozzle from hitting the print during travel moves, reducing the chance to knock the print from the build plate."
@ -5983,7 +5983,7 @@ msgstr "Largura de um filete usado no teto ou base do suporte."
msgctxt "flooring_line_width description"
msgid "Width of a single line of the areas at the bottom of the print."
msgstr ""
msgstr "Largura de um filete singular das áreas na base da impressão."
msgctxt "roofing_line_width description"
msgid "Width of a single line of the areas at the top of the print."
@ -6187,7 +6187,7 @@ msgstr "Z substitui X/Y"
msgctxt "flooring_pattern option zigzag"
msgid "Zig Zag"
msgstr ""
msgstr "Ziguezague"
msgctxt "infill_pattern option zigzag"
msgid "Zig Zag"

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

View File

@ -1,34 +0,0 @@
[general]
definition = ultimaker_method
name = High Speed
version = 4
[metadata]
intent_category = highspeed
is_experimental = True
material = ultimaker_pla_175
quality_type = draft
setting_version = 25
type = intent
variant = 1A
[values]
acceleration_print = 3500
bridge_wall_speed = 300
cool_fan_enabled = True
cool_fan_speed = 100
cool_min_layer_time = 3
infill_pattern = zigzag
jerk_print = 35
speed_infill = 240.0
speed_layer_0 = 55
speed_print = 300
speed_travel = 500
speed_travel_layer_0 = 350.0
speed_wall_0 = 45
support_interface_line_width = 0.42
support_line_width = 0.47
support_material_flow = 100
support_pattern = zigzag
support_roof_line_width = 0.42

View File

@ -1,41 +0,0 @@
[general]
definition = ultimaker_method
name = High Speed Solid
version = 4
[metadata]
intent_category = highspeedsolid
is_experimental = True
material = ultimaker_pla_175
quality_type = draft
setting_version = 25
type = intent
variant = 1A
[values]
acceleration_print = 3500
bottom_thickness = =top_bottom_thickness
bridge_wall_speed = 300
build_volume_temperature = 47
cool_fan_enabled = True
cool_fan_speed = 100
cool_min_layer_time = 3
infill_angles = [45,135]
infill_material_flow = 97
infill_pattern = zigzag
infill_sparse_density = 99
jerk_print = 35
speed_infill = 240.0
speed_layer_0 = 55
speed_print = 300
speed_travel = 500
speed_travel_layer_0 = 350.0
speed_wall_0 = 45
support_interface_line_width = 0.42
support_line_width = 0.47
support_material_flow = 100
support_pattern = zigzag
support_roof_line_width = 0.42
top_bottom_thickness = =layer_height * 2
top_thickness = =top_bottom_thickness

View File

@ -1,34 +0,0 @@
[general]
definition = ultimaker_method
name = High Speed
version = 4
[metadata]
intent_category = highspeed
is_experimental = True
material = ultimaker_tough_pla_175
quality_type = draft
setting_version = 25
type = intent
variant = 1A
[values]
acceleration_print = 3500
bridge_wall_speed = 300
cool_fan_enabled = True
cool_fan_speed = 100
cool_min_layer_time = 3
infill_pattern = zigzag
jerk_print = 35
speed_infill = 240.0
speed_layer_0 = 55
speed_print = 300
speed_travel = 500
speed_travel_layer_0 = 350.0
speed_wall_0 = 45
support_interface_line_width = 0.42
support_line_width = 0.47
support_material_flow = 100
support_pattern = zigzag
support_roof_line_width = 0.42

View File

@ -1,41 +0,0 @@
[general]
definition = ultimaker_method
name = High Speed Solid
version = 4
[metadata]
intent_category = highspeedsolid
is_experimental = True
material = ultimaker_tough_pla_175
quality_type = draft
setting_version = 25
type = intent
variant = 1A
[values]
acceleration_print = 3500
bottom_thickness = =top_bottom_thickness
bridge_wall_speed = 300
build_volume_temperature = 47
cool_fan_enabled = True
cool_fan_speed = 100
cool_min_layer_time = 3
infill_angles = [45,135]
infill_material_flow = 97
infill_pattern = zigzag
infill_sparse_density = 99
jerk_print = 35
speed_infill = 240.0
speed_layer_0 = 55
speed_print = 300
speed_travel = 500
speed_travel_layer_0 = 350.0
speed_wall_0 = 45
support_interface_line_width = 0.42
support_line_width = 0.47
support_material_flow = 100
support_pattern = zigzag
support_roof_line_width = 0.42
top_bottom_thickness = =layer_height * 2
top_thickness = =top_bottom_thickness

View File

@ -1,34 +0,0 @@
[general]
definition = ultimaker_method
name = High Speed
version = 4
[metadata]
intent_category = highspeed
is_experimental = True
material = ultimaker_pla_175
quality_type = draft
setting_version = 25
type = intent
variant = 1C
[values]
acceleration_print = 3500
bridge_wall_speed = 300
cool_fan_enabled = True
cool_fan_speed = 100
cool_min_layer_time = 3
infill_pattern = zigzag
jerk_print = 35
speed_infill = 240.0
speed_layer_0 = 55
speed_print = 300
speed_travel = 500
speed_travel_layer_0 = 350.0
speed_wall_0 = 45
support_interface_line_width = 0.42
support_line_width = 0.47
support_material_flow = 100
support_pattern = zigzag
support_roof_line_width = 0.42

View File

@ -1,41 +0,0 @@
[general]
definition = ultimaker_method
name = High Speed Solid
version = 4
[metadata]
intent_category = highspeedsolid
is_experimental = True
material = ultimaker_pla_175
quality_type = draft
setting_version = 25
type = intent
variant = 1C
[values]
acceleration_print = 3500
bottom_thickness = =top_bottom_thickness
bridge_wall_speed = 300
build_volume_temperature = 47
cool_fan_enabled = True
cool_fan_speed = 100
cool_min_layer_time = 3
infill_angles = [45,135]
infill_material_flow = 97
infill_pattern = zigzag
infill_sparse_density = 99
jerk_print = 35
speed_infill = 240.0
speed_layer_0 = 55
speed_print = 300
speed_travel = 500
speed_travel_layer_0 = 350.0
speed_wall_0 = 45
support_interface_line_width = 0.42
support_line_width = 0.47
support_material_flow = 100
support_pattern = zigzag
support_roof_line_width = 0.42
top_bottom_thickness = =layer_height * 2
top_thickness = =top_bottom_thickness

View File

@ -1,34 +0,0 @@
[general]
definition = ultimaker_method
name = High Speed
version = 4
[metadata]
intent_category = highspeed
is_experimental = True
material = ultimaker_tough_pla_175
quality_type = draft
setting_version = 25
type = intent
variant = 1C
[values]
acceleration_print = 3500
bridge_wall_speed = 300
cool_fan_enabled = True
cool_fan_speed = 100
cool_min_layer_time = 3
infill_pattern = zigzag
jerk_print = 35
speed_infill = 240.0
speed_layer_0 = 55
speed_print = 300
speed_travel = 500
speed_travel_layer_0 = 350.0
speed_wall_0 = 45
support_interface_line_width = 0.42
support_line_width = 0.47
support_material_flow = 100
support_pattern = zigzag
support_roof_line_width = 0.42

View File

@ -1,41 +0,0 @@
[general]
definition = ultimaker_method
name = High Speed Solid
version = 4
[metadata]
intent_category = highspeedsolid
is_experimental = True
material = ultimaker_tough_pla_175
quality_type = draft
setting_version = 25
type = intent
variant = 1C
[values]
acceleration_print = 3500
bottom_thickness = =top_bottom_thickness
bridge_wall_speed = 300
build_volume_temperature = 47
cool_fan_enabled = True
cool_fan_speed = 100
cool_min_layer_time = 3
infill_angles = [45,135]
infill_material_flow = 97
infill_pattern = zigzag
infill_sparse_density = 99
jerk_print = 35
speed_infill = 240.0
speed_layer_0 = 55
speed_print = 300
speed_travel = 500
speed_travel_layer_0 = 350.0
speed_wall_0 = 45
support_interface_line_width = 0.42
support_line_width = 0.47
support_material_flow = 100
support_pattern = zigzag
support_roof_line_width = 0.42
top_bottom_thickness = =layer_height * 2
top_thickness = =top_bottom_thickness

View File

@ -1,34 +0,0 @@
[general]
definition = ultimaker_method
name = High Speed
version = 4
[metadata]
intent_category = highspeed
is_experimental = True
material = ultimaker_pla_175
quality_type = draft
setting_version = 25
type = intent
variant = LABS
[values]
acceleration_print = 3500
bridge_wall_speed = 300
cool_fan_enabled = True
cool_fan_speed = 100
cool_min_layer_time = 3
infill_pattern = zigzag
jerk_print = 35
speed_infill = 240.0
speed_layer_0 = 55
speed_print = 300
speed_travel = 500
speed_travel_layer_0 = 350.0
speed_wall_0 = 45
support_interface_line_width = 0.42
support_line_width = 0.47
support_material_flow = 100
support_pattern = zigzag
support_roof_line_width = 0.42

View File

@ -1,41 +0,0 @@
[general]
definition = ultimaker_method
name = High Speed Solid
version = 4
[metadata]
intent_category = highspeedsolid
is_experimental = True
material = ultimaker_pla_175
quality_type = draft
setting_version = 25
type = intent
variant = LABS
[values]
acceleration_print = 3500
bottom_thickness = =top_bottom_thickness
bridge_wall_speed = 300
build_volume_temperature = 47
cool_fan_enabled = True
cool_fan_speed = 100
cool_min_layer_time = 3
infill_angles = [45,135]
infill_material_flow = 97
infill_pattern = zigzag
infill_sparse_density = 99
jerk_print = 35
speed_infill = 240.0
speed_layer_0 = 55
speed_print = 300
speed_travel = 500
speed_travel_layer_0 = 350.0
speed_wall_0 = 45
support_interface_line_width = 0.42
support_line_width = 0.47
support_material_flow = 100
support_pattern = zigzag
support_roof_line_width = 0.42
top_bottom_thickness = =layer_height * 2
top_thickness = =top_bottom_thickness

View File

@ -1,34 +0,0 @@
[general]
definition = ultimaker_method
name = High Speed
version = 4
[metadata]
intent_category = highspeed
is_experimental = True
material = ultimaker_tough_pla_175
quality_type = draft
setting_version = 25
type = intent
variant = LABS
[values]
acceleration_print = 3500
bridge_wall_speed = 300
cool_fan_enabled = True
cool_fan_speed = 100
cool_min_layer_time = 3
infill_pattern = zigzag
jerk_print = 35
speed_infill = 240.0
speed_layer_0 = 55
speed_print = 300
speed_travel = 500
speed_travel_layer_0 = 350.0
speed_wall_0 = 45
support_interface_line_width = 0.42
support_line_width = 0.47
support_material_flow = 100
support_pattern = zigzag
support_roof_line_width = 0.42

View File

@ -1,41 +0,0 @@
[general]
definition = ultimaker_method
name = High Speed Solid
version = 4
[metadata]
intent_category = highspeedsolid
is_experimental = True
material = ultimaker_tough_pla_175
quality_type = draft
setting_version = 25
type = intent
variant = LABS
[values]
acceleration_print = 3500
bottom_thickness = =top_bottom_thickness
bridge_wall_speed = 300
build_volume_temperature = 47
cool_fan_enabled = True
cool_fan_speed = 100
cool_min_layer_time = 3
infill_angles = [45,135]
infill_material_flow = 97
infill_pattern = zigzag
infill_sparse_density = 99
jerk_print = 35
speed_infill = 240.0
speed_layer_0 = 55
speed_print = 300
speed_travel = 500
speed_travel_layer_0 = 350.0
speed_wall_0 = 45
support_interface_line_width = 0.42
support_line_width = 0.47
support_material_flow = 100
support_pattern = zigzag
support_roof_line_width = 0.42
top_bottom_thickness = =layer_height * 2
top_thickness = =top_bottom_thickness

View File

@ -1,34 +0,0 @@
[general]
definition = ultimaker_methodx
name = High Speed
version = 4
[metadata]
intent_category = highspeed
is_experimental = True
material = ultimaker_pla_175
quality_type = draft
setting_version = 25
type = intent
variant = 1A
[values]
acceleration_print = 3500
bridge_wall_speed = 300
cool_fan_enabled = True
cool_fan_speed = 100
cool_min_layer_time = 3
infill_pattern = zigzag
jerk_print = 35
speed_infill = 240.0
speed_layer_0 = 55
speed_print = 300
speed_travel = 500
speed_travel_layer_0 = 350.0
speed_wall_0 = 45
support_interface_line_width = 0.42
support_line_width = 0.47
support_material_flow = 100
support_pattern = zigzag
support_roof_line_width = 0.42

View File

@ -1,41 +0,0 @@
[general]
definition = ultimaker_methodx
name = High Speed Solid
version = 4
[metadata]
intent_category = highspeedsolid
is_experimental = True
material = ultimaker_pla_175
quality_type = draft
setting_version = 25
type = intent
variant = 1A
[values]
acceleration_print = 3500
bottom_thickness = =top_bottom_thickness
bridge_wall_speed = 300
build_volume_temperature = 47
cool_fan_enabled = True
cool_fan_speed = 100
cool_min_layer_time = 3
infill_angles = [45,135]
infill_material_flow = 97
infill_pattern = zigzag
infill_sparse_density = 99
jerk_print = 35
speed_infill = 240.0
speed_layer_0 = 55
speed_print = 300
speed_travel = 500
speed_travel_layer_0 = 350.0
speed_wall_0 = 45
support_interface_line_width = 0.42
support_line_width = 0.47
support_material_flow = 100
support_pattern = zigzag
support_roof_line_width = 0.42
top_bottom_thickness = =layer_height * 2
top_thickness = =top_bottom_thickness

View File

@ -1,34 +0,0 @@
[general]
definition = ultimaker_methodx
name = High Speed
version = 4
[metadata]
intent_category = highspeed
is_experimental = True
material = ultimaker_tough_pla_175
quality_type = draft
setting_version = 25
type = intent
variant = 1A
[values]
acceleration_print = 3500
bridge_wall_speed = 300
cool_fan_enabled = True
cool_fan_speed = 100
cool_min_layer_time = 3
infill_pattern = zigzag
jerk_print = 35
speed_infill = 240.0
speed_layer_0 = 55
speed_print = 300
speed_travel = 500
speed_travel_layer_0 = 350.0
speed_wall_0 = 45
support_interface_line_width = 0.42
support_line_width = 0.47
support_material_flow = 100
support_pattern = zigzag
support_roof_line_width = 0.42

View File

@ -1,41 +0,0 @@
[general]
definition = ultimaker_methodx
name = High Speed Solid
version = 4
[metadata]
intent_category = highspeedsolid
is_experimental = True
material = ultimaker_tough_pla_175
quality_type = draft
setting_version = 25
type = intent
variant = 1A
[values]
acceleration_print = 3500
bottom_thickness = =top_bottom_thickness
bridge_wall_speed = 300
build_volume_temperature = 47
cool_fan_enabled = True
cool_fan_speed = 100
cool_min_layer_time = 3
infill_angles = [45,135]
infill_material_flow = 97
infill_pattern = zigzag
infill_sparse_density = 99
jerk_print = 35
speed_infill = 240.0
speed_layer_0 = 55
speed_print = 300
speed_travel = 500
speed_travel_layer_0 = 350.0
speed_wall_0 = 45
support_interface_line_width = 0.42
support_line_width = 0.47
support_material_flow = 100
support_pattern = zigzag
support_roof_line_width = 0.42
top_bottom_thickness = =layer_height * 2
top_thickness = =top_bottom_thickness

View File

@ -1,32 +0,0 @@
[general]
definition = ultimaker_methodx
name = High Speed
version = 4
[metadata]
intent_category = highspeed
is_experimental = True
material = ultimaker_absr_175
quality_type = draft
setting_version = 25
type = intent
variant = 1C
[values]
acceleration_print = 3500
bridge_wall_speed = 300
cool_fan_enabled = True
cool_fan_speed = 100
cool_min_layer_time = 3
cool_min_temperature = 245.0
infill_pattern = zigzag
jerk_print = 35
speed_layer_0 = 55
speed_print = 300
speed_support = 100
speed_support_interface = 75
speed_travel = 500
speed_travel_layer_0 = 250
speed_wall_0 = 40
support_pattern = zigzag

View File

@ -1,38 +0,0 @@
[general]
definition = ultimaker_methodx
name = High Speed Solid
version = 4
[metadata]
intent_category = highspeedsolid
is_experimental = True
material = ultimaker_absr_175
quality_type = draft
setting_version = 25
type = intent
variant = 1C
[values]
acceleration_print = 3500
bottom_thickness = =top_bottom_thickness
bridge_wall_speed = 300
cool_fan_enabled = True
cool_fan_speed = 100
cool_min_layer_time = 3
cool_min_temperature = 245.0
infill_angles = [45,135]
infill_material_flow = 97
infill_pattern = zigzag
infill_sparse_density = 99
jerk_print = 35
speed_layer_0 = 55
speed_print = 300
speed_support = 100
speed_support_interface = 75
speed_travel = 500
speed_travel_layer_0 = 250
speed_wall_0 = 40
support_pattern = zigzag
top_bottom_thickness = =layer_height * 2
top_thickness = =top_bottom_thickness

View File

@ -1,34 +0,0 @@
[general]
definition = ultimaker_methodx
name = High Speed
version = 4
[metadata]
intent_category = highspeed
is_experimental = True
material = ultimaker_pla_175
quality_type = draft
setting_version = 25
type = intent
variant = 1C
[values]
acceleration_print = 3500
bridge_wall_speed = 300
cool_fan_enabled = True
cool_fan_speed = 100
cool_min_layer_time = 3
infill_pattern = zigzag
jerk_print = 35
speed_infill = 240.0
speed_layer_0 = 55
speed_print = 300
speed_travel = 500
speed_travel_layer_0 = 350.0
speed_wall_0 = 45
support_interface_line_width = 0.42
support_line_width = 0.47
support_material_flow = 100
support_pattern = zigzag
support_roof_line_width = 0.42

View File

@ -1,41 +0,0 @@
[general]
definition = ultimaker_methodx
name = High Speed Solid
version = 4
[metadata]
intent_category = highspeedsolid
is_experimental = True
material = ultimaker_pla_175
quality_type = draft
setting_version = 25
type = intent
variant = 1C
[values]
acceleration_print = 3500
bottom_thickness = =top_bottom_thickness
bridge_wall_speed = 300
build_volume_temperature = 47
cool_fan_enabled = True
cool_fan_speed = 100
cool_min_layer_time = 3
infill_angles = [45,135]
infill_material_flow = 97
infill_pattern = zigzag
infill_sparse_density = 99
jerk_print = 35
speed_infill = 240.0
speed_layer_0 = 55
speed_print = 300
speed_travel = 500
speed_travel_layer_0 = 350.0
speed_wall_0 = 45
support_interface_line_width = 0.42
support_line_width = 0.47
support_material_flow = 100
support_pattern = zigzag
support_roof_line_width = 0.42
top_bottom_thickness = =layer_height * 2
top_thickness = =top_bottom_thickness

View File

@ -1,34 +0,0 @@
[general]
definition = ultimaker_methodx
name = High Speed
version = 4
[metadata]
intent_category = highspeed
is_experimental = True
material = ultimaker_tough_pla_175
quality_type = draft
setting_version = 25
type = intent
variant = 1C
[values]
acceleration_print = 3500
bridge_wall_speed = 300
cool_fan_enabled = True
cool_fan_speed = 100
cool_min_layer_time = 3
infill_pattern = zigzag
jerk_print = 35
speed_infill = 240.0
speed_layer_0 = 55
speed_print = 300
speed_travel = 500
speed_travel_layer_0 = 350.0
speed_wall_0 = 45
support_interface_line_width = 0.42
support_line_width = 0.47
support_material_flow = 100
support_pattern = zigzag
support_roof_line_width = 0.42

View File

@ -1,41 +0,0 @@
[general]
definition = ultimaker_methodx
name = High Speed Solid
version = 4
[metadata]
intent_category = highspeedsolid
is_experimental = True
material = ultimaker_tough_pla_175
quality_type = draft
setting_version = 25
type = intent
variant = 1C
[values]
acceleration_print = 3500
bottom_thickness = =top_bottom_thickness
bridge_wall_speed = 300
build_volume_temperature = 47
cool_fan_enabled = True
cool_fan_speed = 100
cool_min_layer_time = 3
infill_angles = [45,135]
infill_material_flow = 97
infill_pattern = zigzag
infill_sparse_density = 99
jerk_print = 35
speed_infill = 240.0
speed_layer_0 = 55
speed_print = 300
speed_travel = 500
speed_travel_layer_0 = 350.0
speed_wall_0 = 45
support_interface_line_width = 0.42
support_line_width = 0.47
support_material_flow = 100
support_pattern = zigzag
support_roof_line_width = 0.42
top_bottom_thickness = =layer_height * 2
top_thickness = =top_bottom_thickness

View File

@ -1,32 +0,0 @@
[general]
definition = ultimaker_methodx
name = High Speed
version = 4
[metadata]
intent_category = highspeed
is_experimental = True
material = ultimaker_absr_175
quality_type = draft
setting_version = 25
type = intent
variant = 1XA
[values]
acceleration_print = 3500
bridge_wall_speed = 300
cool_fan_enabled = True
cool_fan_speed = 100
cool_min_layer_time = 3
cool_min_temperature = 245.0
infill_pattern = zigzag
jerk_print = 35
speed_layer_0 = 55
speed_print = 300
speed_support = 100
speed_support_interface = 75
speed_travel = 500
speed_travel_layer_0 = 250
speed_wall_0 = 40
support_pattern = zigzag

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