@@ -151,6 +213,7 @@ Overlapping skin and alternating wall. The extra wall at each alternating step w
Assertion failure in SkeletalTrapezoidation. Can cause the engine to crash on certain models.
+
[4.10.0]
For an overview of the new features in Cura 4.10, please watch our video.
@@ -206,7 +269,7 @@ When double clicking on a file in the open project dialog in Digital Factory it
- Mingda D3, D4 and Rock3, contributed by cataclism.
- JGAurora A6, contributed by CrissR.
-Please, be aware that after version 4.10 Ultimaker Cura will only be supported on operating systems actively maintained by their software manufacturer or community. This means Windows 7 and MacOS 10.13 will no longer be supported. Technically this means Ultimaker will stop testing and developing for such operating systems. However, even though it is no longer supported, there is still a high likelihood the application keeps functioning.
+*Please, be aware that after version 4.10 Ultimaker Cura will only be supported on operating systems actively maintained by their software manufacturer or community. This means Windows 7 and MacOS 10.13 will no longer be supported. Technically this means Ultimaker will stop testing and developing for such operating systems. However, even though it is no longer supported, there is still a high likelihood the application keeps functioning.
[4.9.1]
* PETG Profile update.
@@ -244,19 +307,11 @@ The shell category was a mix of settings about walls and settings about top/bott
The ability to have thumbnails embedded. Contributed by Gravedigger7789.
* Add checkbox for Extruder Offsets.
-Ability to enable or disable the extruder offsets to gcode. This will be enabled by default, unless it is in the printer's def.json file. Contributed by RFBomb.
+Ability to enable or disable the extruder offsets to gcode. This will be enabled by default, unless it is in the printer's def.json file. Contributed by RFBomb.
* Cura should work properly on MacOS 'Big Sur' now, afforded by upgrades to Python (to 3.8) and Qt (to 5.15).
If you had (UX, visual, graphics card) problems, specifically on (newer) MacOS versions, like Big Sur, you should be able to use this new version.
-* Known UX issues that will be fixed before final in our current plan
-- Custom menu Materials and Nozzle menu now open at cursor position instead of under the menu button.
-- Visuals of Preference screen are large.
-- Drop downs in Preference screen don't react to mouse-scroll.
-- Default language not selected in Preference screen.
-- Changelog takes long too load.
-- Setting Visibility submenu items in the Preference screen are greyed-out and can't be selected on Mac OSX.
-
* Bug Fixes
- Fixed a security vulnerability on windows permitting the openssl library used to launch other programs. Thanks to Xavier Danest for raising this bug.
- Fixed Connect Top/Bottom Polygons.
@@ -287,7 +342,8 @@ If you had (UX, visual, graphics card) problems, specifically on (newer) MacOS v
- Fixed message for non manifold models.
- Fixed setting category arrows. Contributed by fieldOfView.
- Fixed metadate tags for 3MF files.
-- Fixed engine crash when using low-density Cross Infill
+- Fixed engine crash when using low-density Cross Infill.
+- Improved performance of loading .def.json files.
* Printer definitions, profiles and materials
- 3DFuel Pro PLA and SnapSupport materials, contributed by grk3010.
@@ -311,6 +367,7 @@ If you had (UX, visual, graphics card) problems, specifically on (newer) MacOS v
- TwoTrees Bluer, contributed by WashingtonJunior.
- Update Hellbot Magna 1 and Hellbot Magna dual, contributed by DevelopmentHellbot.
- Update Rigid3D and added Rigid3D Mucit2, contributed by mehmetsutas.
+- Update TPU profiles for 0.6mm nozzle of UM2+C.
- ZAV series, contributed by kimer2002.
[4.8.0]
diff --git a/resources/texts/whats_new/0.html b/resources/texts/whats_new/0.html
index d0a7459099..c121d42d93 100644
--- a/resources/texts/whats_new/0.html
+++ b/resources/texts/whats_new/0.html
@@ -1,3 +1,3 @@
-
Open native CAD files for Ultimaker Professional and Excellence
-
Ultimaker Professional and Excellence subscribers can now directly import native CAD files into Ultimaker Cura. This provides users with an even more effective workflow by boosting productivity and increasing first-time right results.
-Learn more about our enterprise plans to access this feature.
\ No newline at end of file
+
Complete UI refresh
+
Look around and you will notice that we have refreshed over 100 icons throughout Ultimaker Cura. The new icons are designed for clarity – resulting in a simpler and more informative slicing experience. Also, when scaling the Ultimaker Cura window, the UI will adapt, resulting in less visual clutter.
+Learn more
\ No newline at end of file
diff --git a/resources/texts/whats_new/1.html b/resources/texts/whats_new/1.html
index 2537344454..e6e5c5f22c 100644
--- a/resources/texts/whats_new/1.html
+++ b/resources/texts/whats_new/1.html
@@ -1,2 +1,3 @@
-
Try Ultimaker 3D Printing Academy and level up your slicing skills
-
Follow the Expert Tips for Ultimaker Cura course in the Ultimaker 3D Printing Academy and expand your knowledge. Get the most out of your slicing software by learning how to optimize prints and receive plugin recommendations from our team of 3D printing experts.
+
Improved digital library integration
+
Collaborative workflows using the Digital Library are now simpler. Every user with a cloud-connected Ultimaker 3D printer can access stored projects. And we have added a “Search” function to make finding files easier. Learn more
+Ready to get more out of your Ultimaker 3D Printer? Upgrade to Ultimaker Essentials
\ No newline at end of file
diff --git a/resources/texts/whats_new/2.html b/resources/texts/whats_new/2.html
index a6f20cb493..cff32b2aa9 100644
--- a/resources/texts/whats_new/2.html
+++ b/resources/texts/whats_new/2.html
@@ -1,2 +1,2 @@
-
Ultimaker PETG print profiles are now available for the Ultimaker 3
-
Ultimaker PETG sets the standard for industrial applications and is suitable for a wide range of use cases thanks to its ease of use and versatility. Ultimaker PETG is now fully supported on the Ultimaker 3. Find out more.
\ No newline at end of file
+
Smooth top-surfaces with monotonic top/bottom orders
+
The new Monotonic top/bottom order setting enables users to print parts with smoother top surfaces. This is especially useful for parts that need good aesthetics, such as visual prototypes. Or for parts that benefit from smooth surfaces, such as those that contact-sensitive components.
\ No newline at end of file
diff --git a/resources/texts/whats_new/3.html b/resources/texts/whats_new/3.html
index a433453bde..91b7e63458 100644
--- a/resources/texts/whats_new/3.html
+++ b/resources/texts/whats_new/3.html
@@ -1,2 +1,2 @@
-
Flow rate
-
Thanks to Khani3s, we have now added the volumetric flow rate (in mm³/s) to the preview mode color schemes. In addition, we tweaked the minimum/maximum color values, making it easier to optimize your print strategy displayed as the flow, layer thickness, line width and speed.
\ No newline at end of file
+
Stay tuned – Get the latest updates about Ultimaker products
+
Ultimaker is constantly improving our products to offer users the best 3D Printing experience. We host regular webinars and events to showcase what this ever-evolving platform can do for you. Register here to never miss an update.
\ No newline at end of file
diff --git a/resources/texts/whats_new/4.html b/resources/texts/whats_new/4.html
index 5997ce2408..64b07f1a83 100644
--- a/resources/texts/whats_new/4.html
+++ b/resources/texts/whats_new/4.html
@@ -1,2 +1,2 @@
-
Learn more!
-
Want more information for Ultimaker Cura 4.10? Read the blog post or watch the video, and don't forget to give us your feedback!
\ No newline at end of file
+
Free new course available
+
To coincide with the improved Digital Library integration into Ultimaker Cura, we’ve created a new course about Digital Library Best Practices. Learn how to get started, streamline your workflow and never waste time looking for that 3D model file again.
\ No newline at end of file
diff --git a/resources/texts/whats_new/5.html b/resources/texts/whats_new/5.html
new file mode 100644
index 0000000000..d06a1c0d31
--- /dev/null
+++ b/resources/texts/whats_new/5.html
@@ -0,0 +1,2 @@
+
Learn about the past and future of Ultimaker Cura
+
How did Ultimaker Cura start? What does its future hold? Hear the origin stories and discover what's next, by listening to the core developers and community featured in episode 29 and episode 30 of the Talking Additive podcast.
\ No newline at end of file
diff --git a/resources/texts/whats_new/6.html b/resources/texts/whats_new/6.html
new file mode 100644
index 0000000000..bb308a9794
--- /dev/null
+++ b/resources/texts/whats_new/6.html
@@ -0,0 +1,2 @@
+
Get more information
+
Want more information on new features, bug fixes, and more for Ultimaker Cura 4.11? Read the full blog post watch our video and don't forget to give us your feedback on Github!
\ No newline at end of file
diff --git a/resources/themes/cura-dark/theme.json b/resources/themes/cura-dark/theme.json
index 457d2092c1..520f863972 100644
--- a/resources/themes/cura-dark/theme.json
+++ b/resources/themes/cura-dark/theme.json
@@ -177,6 +177,7 @@
"toolbox_header_button_text_active": [255, 255, 255, 255],
"toolbox_header_button_text_inactive": [128, 128, 128, 255],
+ "toolbox_premium_packages_background": [57, 57, 57, 255],
"monitor_printer_family_tag": [86, 86, 106, 255],
"monitor_text_disabled": [102, 102, 102, 255],
diff --git a/plugins/UM3NetworkPrinting/resources/svg/icons/Buildplate.svg b/resources/themes/cura-light/icons/default/Buildplate.svg
old mode 100755
new mode 100644
similarity index 100%
rename from plugins/UM3NetworkPrinting/resources/svg/icons/Buildplate.svg
rename to resources/themes/cura-light/icons/default/Buildplate.svg
diff --git a/resources/themes/cura-light/icons/default/People.svg b/resources/themes/cura-light/icons/default/People.svg
new file mode 100644
index 0000000000..8632b37f7c
--- /dev/null
+++ b/resources/themes/cura-light/icons/default/People.svg
@@ -0,0 +1,3 @@
+
diff --git a/resources/themes/cura-light/icons/default/Play.svg b/resources/themes/cura-light/icons/default/Play.svg
new file mode 100644
index 0000000000..1b2510513d
--- /dev/null
+++ b/resources/themes/cura-light/icons/default/Play.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/resources/themes/cura-light/icons/deprecated_icons.json b/resources/themes/cura-light/icons/deprecated_icons.json
index df286cffc7..28abf119ae 100644
--- a/resources/themes/cura-light/icons/deprecated_icons.json
+++ b/resources/themes/cura-light/icons/deprecated_icons.json
@@ -1,306 +1,402 @@
{
- "notice": {
- "new_icon": "Information",
- "size": "default"
- },
- "info": {
- "new_icon": "Information",
- "size": "default"
- },
- "plus": {
- "new_icon": "Plus",
- "size": "default"
- },
- "cross1": {
- "new_icon": "Cancel",
- "size": "default"
- },
- "application": {
- "new_icon": "UltimakerCura",
- "size": "default"
- },
- "printer_single": {
- "new_icon": "Printer",
- "size": "default"
- },
- "category_material": {
- "new_icon": "Spool",
- "size": "default"
- },
- "settings": {
- "new_icon": "Sliders",
- "size": "default"
- },
- "plugin": {
- "new_icon": "Plugin",
- "size": "default"
- },
- "external_link": {
- "new_icon": "LinkExternal",
- "size": "default"
- },
- "arrow_top": {
- "new_icon": "ChevronSingleUp",
- "size": "default"
- },
- "arrow_bottom": {
- "new_icon": "ChevronSingleDown",
- "size": "default"
- },
- "arrow_right": {
- "new_icon": "ChevronSingleRight",
- "size": "default"
- },
- "pos_normal": {
- "new_icon": "Infill0",
- "size": "default"
- },
- "pos_print_as_support": {
- "new_icon": "MeshTypeSupport",
- "size": "default"
- },
- "pos_modify_overlaps": {
- "new_icon": "MeshTypeIntersect",
- "size": "default"
- },
- "pos_modify_dont_support_overlap": {
- "new_icon": "BlockSupportOverlaps",
- "size": "default"
- },
- "minus": {
- "new_icon": "Minus",
- "size": "default"
- },
- "load": {
- "new_icon": "Folder",
- "size": "default"
- },
- "extruder_button": {
- "new_icon": "Extruder",
- "size": "medium"
- },
- "category_adhesion": {
- "new_icon": "Adhesion",
- "size": "default"
- },
- "category_machine": {
- "new_icon": "Printer",
- "size": "default"
- },
- "category_layer_height": {
- "new_icon": "PrintQuality",
- "size": "default"
- },
- "category_shell": {
- "new_icon": "PrintShell",
- "size": "default"
- },
- "category_topbottom": {
- "new_icon": "PrintTopBottom",
- "size": "default"
- },
- "category_infill": {
- "new_icon": "Infill1",
- "size": "default"
- },
- "category_speed": {
- "new_icon": "SpeedOMeter",
- "size": "default"
- },
- "category_travel": {
- "new_icon": "PrintTravel",
- "size": "default"
- },
- "category_cool": {
- "new_icon": "Fan",
- "size": "default"
- },
- "category_support": {
- "new_icon": "Support",
- "size": "default"
- },
- "category_dual": {
- "new_icon": "DualExtrusion",
- "size": "default"
- },
- "category_fixes": {
- "new_icon": "Bandage",
- "size": "default"
- },
- "category_blackmagic": {
- "new_icon": "BlackMagic",
- "size": "default"
- },
- "category_experimental": {
- "new_icon": "Experiment",
- "size": "default"
- },
- "circle_outline": {
- "new_icon": "CircleOutline",
- "size": "default"
- },
- "update": {
- "new_icon": "ArrowDoubleCircleRight",
- "size": "default"
- },
- "checked": {
- "new_icon": "CheckCircle",
- "size": "default"
- },
- "warning_light": {
- "new_icon": "Warning",
- "size": "default"
- },
- "clock": {
- "new_icon": "Clock",
- "size": "default"
- },
- "spool": {
- "new_icon": "Spool",
- "size": "default"
- },
- "warning": {
- "new_icon": "Warning",
- "size": "default"
- },
- "check": {
- "new_icon": "Check",
- "size": "default"
- },
- "pencil": {
- "new_icon": "Pencil",
- "size": "default"
- },
- "printing_guideline": {
- "new_icon": "Guide",
- "size": "default"
- },
- "favorites_star_full": {
- "new_icon": "StarFilled",
- "size": "default"
- },
- "favorites_star_empty": {
- "new_icon": "Star",
- "size": "default"
- },
- "resize": {
- "new_icon": "ThreeDots",
- "size": "default"
- },
- "gradual": {
- "new_icon": "InfillGradual",
- "size": "default"
- },
- "hollow": {
- "new_icon": "Infill0",
- "size": "default"
- },
- "sparse": {
- "new_icon": "Infill3",
- "size": "default"
- },
- "dense": {
- "new_icon": "Infill2",
- "size": "default"
- },
- "solid": {
- "new_icon": "Solid",
- "size": "default"
- },
- "reset": {
- "new_icon": "ArrowReset",
- "size": "default"
- },
- "arrow_left": {
- "new_icon": "ChevronSingleLeft",
- "size": "default"
- },
- "home": {
- "new_icon": "House",
- "size": "default"
- },
- "printer_group": {
- "new_icon": "PrinterTriple",
- "size": "medium"
- },
- "formula": {
- "new_icon": "Function",
- "size": "default"
- },
- "search": {
- "new_icon": "Magnifier",
- "size": "default"
- },
- "menu": {
- "new_icon": "Hamburger",
- "size": "default"
- },
- "view_3d": {
- "new_icon": "View3D",
- "size": "default"
- },
- "view_layer": {
- "new_icon": "Layers",
- "size": "default"
- },
- "view_front": {
- "new_icon": "ViewFront",
- "size": "default"
- },
- "view_top": {
- "new_icon": "ViewTop",
- "size": "default"
- },
- "view_left": {
- "new_icon": "ViewLeft",
- "size": "default"
- },
- "view_right": {
- "new_icon": "ViewRight",
- "size": "default"
- },
- "package": {
- "new_icon": "Plugin",
- "size": "default"
- },
- "material_spool": {
- "new_icon": "Spool",
- "size": "default"
- },
- "dot": {
- "new_icon": "Dot",
- "size": "low"
- },
- "mirror": {
- "new_icon": "Mirror",
- "size": "default"
- },
- "rotate_reset": {
- "new_icon": "ArrowReset",
- "size": "default"
- },
- "rotate_layflat": {
- "new_icon": "LayFlat",
- "size": "default"
- },
- "rotate_face_layflat": {
- "new_icon": "LayFlatOnFace",
- "size": "default"
- },
- "rotate": {
- "new_icon": "Rotate",
- "size": "default"
- },
- "scale_reset": {
- "new_icon": "ArrowReset",
- "size": "default"
- },
- "scale": {
- "new_icon": "Scale",
- "size": "default"
- },
- "translate": {
- "new_icon": "ArrowFourWay",
- "size": "default"
- }
+ "notice": {
+ "new_icon": "Information",
+ "size": "default"
+ },
+ "info": {
+ "new_icon": "Information",
+ "size": "default"
+ },
+ "plus": {
+ "new_icon": "Plus",
+ "size": "default"
+ },
+ "cross1": {
+ "new_icon": "Cancel",
+ "size": "default"
+ },
+ "application": {
+ "new_icon": "UltimakerCura",
+ "size": "default"
+ },
+ "printer_single": {
+ "new_icon": "Printer",
+ "size": "default"
+ },
+ "category_material": {
+ "new_icon": "Spool",
+ "size": "default"
+ },
+ "settings": {
+ "new_icon": "Sliders",
+ "size": "default"
+ },
+ "plugin": {
+ "new_icon": "Plugin",
+ "size": "default"
+ },
+ "external_link": {
+ "new_icon": "LinkExternal",
+ "size": "default"
+ },
+ "arrow_top": {
+ "new_icon": "ChevronSingleUp",
+ "size": "default"
+ },
+ "arrow_bottom": {
+ "new_icon": "ChevronSingleDown",
+ "size": "default"
+ },
+ "arrow_right": {
+ "new_icon": "ChevronSingleRight",
+ "size": "default"
+ },
+ "pos_normal": {
+ "new_icon": "Infill0",
+ "size": "default"
+ },
+ "pos_print_as_support": {
+ "new_icon": "MeshTypeSupport",
+ "size": "default"
+ },
+ "pos_modify_overlaps": {
+ "new_icon": "MeshTypeIntersect",
+ "size": "default"
+ },
+ "pos_modify_dont_support_overlap": {
+ "new_icon": "BlockSupportOverlaps",
+ "size": "default"
+ },
+ "minus": {
+ "new_icon": "Minus",
+ "size": "default"
+ },
+ "load": {
+ "new_icon": "Folder",
+ "size": "default"
+ },
+ "extruder_button": {
+ "new_icon": "Extruder",
+ "size": "medium"
+ },
+ "category_adhesion": {
+ "new_icon": "Adhesion",
+ "size": "default"
+ },
+ "category_machine": {
+ "new_icon": "Printer",
+ "size": "default"
+ },
+ "category_layer_height": {
+ "new_icon": "PrintQuality",
+ "size": "default"
+ },
+ "category_shell": {
+ "new_icon": "PrintShell",
+ "size": "default"
+ },
+ "category_topbottom": {
+ "new_icon": "PrintTopBottom",
+ "size": "default"
+ },
+ "category_infill": {
+ "new_icon": "Infill1",
+ "size": "default"
+ },
+ "category_speed": {
+ "new_icon": "SpeedOMeter",
+ "size": "default"
+ },
+ "category_travel": {
+ "new_icon": "PrintTravel",
+ "size": "default"
+ },
+ "category_cool": {
+ "new_icon": "Fan",
+ "size": "default"
+ },
+ "category_support": {
+ "new_icon": "Support",
+ "size": "default"
+ },
+ "category_dual": {
+ "new_icon": "DualExtrusion",
+ "size": "default"
+ },
+ "category_fixes": {
+ "new_icon": "Bandage",
+ "size": "default"
+ },
+ "category_blackmagic": {
+ "new_icon": "BlackMagic",
+ "size": "default"
+ },
+ "category_experimental": {
+ "new_icon": "Experiment",
+ "size": "default"
+ },
+ "circle_outline": {
+ "new_icon": "CircleOutline",
+ "size": "default"
+ },
+ "update": {
+ "new_icon": "ArrowDoubleCircleRight",
+ "size": "default"
+ },
+ "checked": {
+ "new_icon": "CheckCircle",
+ "size": "default"
+ },
+ "warning_light": {
+ "new_icon": "Warning",
+ "size": "default"
+ },
+ "clock": {
+ "new_icon": "Clock",
+ "size": "default"
+ },
+ "spool": {
+ "new_icon": "Spool",
+ "size": "default"
+ },
+ "warning": {
+ "new_icon": "Warning",
+ "size": "default"
+ },
+ "check": {
+ "new_icon": "Check",
+ "size": "default"
+ },
+ "star": {
+ "new_icon": "StarFilled",
+ "size": "default"
+ },
+ "pencil": {
+ "new_icon": "Pen",
+ "size": "default"
+ },
+ "printing_guideline": {
+ "new_icon": "Guide",
+ "size": "default"
+ },
+ "favorites_star_full": {
+ "new_icon": "StarFilled",
+ "size": "default"
+ },
+ "favorites_star_empty": {
+ "new_icon": "Star",
+ "size": "default"
+ },
+ "resize": {
+ "new_icon": "ThreeDots",
+ "size": "default"
+ },
+ "gradual": {
+ "new_icon": "InfillGradual",
+ "size": "default"
+ },
+ "hollow": {
+ "new_icon": "Infill0",
+ "size": "default"
+ },
+ "sparse": {
+ "new_icon": "Infill3",
+ "size": "default"
+ },
+ "dense": {
+ "new_icon": "Infill2",
+ "size": "default"
+ },
+ "solid": {
+ "new_icon": "Solid",
+ "size": "default"
+ },
+ "reset": {
+ "new_icon": "ArrowReset",
+ "size": "default"
+ },
+ "arrow_left": {
+ "new_icon": "ChevronSingleLeft",
+ "size": "default"
+ },
+ "home": {
+ "new_icon": "House",
+ "size": "default"
+ },
+ "printer_group": {
+ "new_icon": "PrinterTriple",
+ "size": "medium"
+ },
+ "formula": {
+ "new_icon": "Function",
+ "size": "default"
+ },
+ "search": {
+ "new_icon": "Magnifier",
+ "size": "default"
+ },
+ "menu": {
+ "new_icon": "Hamburger",
+ "size": "default"
+ },
+ "view_3d": {
+ "new_icon": "View3D",
+ "size": "default"
+ },
+ "view_layer": {
+ "new_icon": "Layers",
+ "size": "default"
+ },
+ "view_front": {
+ "new_icon": "ViewFront",
+ "size": "default"
+ },
+ "view_top": {
+ "new_icon": "ViewTop",
+ "size": "default"
+ },
+ "view_left": {
+ "new_icon": "ViewLeft",
+ "size": "default"
+ },
+ "view_right": {
+ "new_icon": "ViewRight",
+ "size": "default"
+ },
+ "package": {
+ "new_icon": "Plugin",
+ "size": "default"
+ },
+ "material_spool": {
+ "new_icon": "Spool",
+ "size": "default"
+ },
+ "dot": {
+ "new_icon": "Dot",
+ "size": "low"
+ },
+ "mirror": {
+ "new_icon": "Mirror",
+ "size": "default"
+ },
+ "rotate_reset": {
+ "new_icon": "ArrowReset",
+ "size": "default"
+ },
+ "rotate_layflat": {
+ "new_icon": "LayFlat",
+ "size": "default"
+ },
+ "rotate_face_layflat": {
+ "new_icon": "LayFlatOnFace",
+ "size": "default"
+ },
+ "rotate": {
+ "new_icon": "Rotate",
+ "size": "default"
+ },
+ "scale_reset": {
+ "new_icon": "ArrowReset",
+ "size": "default"
+ },
+ "scale": {
+ "new_icon": "Scale",
+ "size": "default"
+ },
+ "translate": {
+ "new_icon": "ArrowFourWay",
+ "size": "default"
+ },
+ "buildplate": {
+ "new_icon": "Buildplate",
+ "size": "default"
+ },
+ "basic": {
+ "new_icon": "PrintQuality",
+ "size": "default"
+ },
+ "category_shield": {
+ "new_icon": "Shield",
+ "size": "default"
+ },
+ "category_unknown": {
+ "new_icon": "Sputnik",
+ "size": "default"
+ },
+ "cross2": {
+ "new_icon": "CancelBlock",
+ "size": "default"
+ },
+ "drop_down_button": {
+ "new_icon": "ChevronSingleDown",
+ "size": "default"
+ },
+ "group": {
+ "new_icon": "People",
+ "size": "default"
+ },
+ "link": {
+ "new_icon": "Link",
+ "size": "default"
+ },
+ "play": {
+ "new_icon": "Play",
+ "size": "default"
+ },
+ "print_time": {
+ "new_icon": "Clock",
+ "size": "default"
+ },
+ "printer_cloud_connected": {
+ "new_icon": "CloudBadge",
+ "size": "low"
+ },
+ "printer_cloud_not_available": {
+ "new_icon": "CloudBadge",
+ "size": "low"
+ },
+ "printer_connected": {
+ "new_icon": "CheckBlueBG",
+ "size": "low"
+ },
+ "printsetup": {
+ "new_icon": "Sliders",
+ "size": "default"
+ },
+ "quick": {
+ "new_icon": "Quick",
+ "size": "default"
+ },
+ "scale_max": {
+ "new_icon": "ScaleMax",
+ "size": "default"
+ },
+ "setting_per_object": {
+ "new_icon": "MeshType",
+ "size": "default"
+ },
+ "star_empty": {
+ "new_icon": "Star",
+ "size": "default"
+ },
+ "star_filled": {
+ "new_icon": "StarFilled",
+ "size": "default"
+ },
+ "ulti": {
+ "new_icon": "PrintQuality",
+ "size": "default"
+ },
+ "view_xray": {
+ "new_icon": "CancelBlock",
+ "size": "default"
+ },
+ "view_normal": {
+ "new_icon": "Infill0",
+ "size": "default"
+ },
+ "viewmode": {
+ "new_icon": "Eye",
+ "size": "default"
+ }
}
\ No newline at end of file
diff --git a/resources/themes/cura-light/icons/high/People.svg b/resources/themes/cura-light/icons/high/People.svg
new file mode 100644
index 0000000000..058353015a
--- /dev/null
+++ b/resources/themes/cura-light/icons/high/People.svg
@@ -0,0 +1,3 @@
+
diff --git a/resources/themes/cura-light/icons/high/Plugin.svg b/resources/themes/cura-light/icons/high/Plugin.svg
new file mode 100644
index 0000000000..89346eee57
--- /dev/null
+++ b/resources/themes/cura-light/icons/high/Plugin.svg
@@ -0,0 +1,3 @@
+
diff --git a/resources/themes/cura-light/icons/high/Spool.svg b/resources/themes/cura-light/icons/high/Spool.svg
new file mode 100644
index 0000000000..3faffb7a52
--- /dev/null
+++ b/resources/themes/cura-light/icons/high/Spool.svg
@@ -0,0 +1,3 @@
+
diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json
index 6d99b7ae03..d50a748493 100644
--- a/resources/themes/cura-light/theme.json
+++ b/resources/themes/cura-light/theme.json
@@ -428,6 +428,7 @@
"printer_config_mismatch": [127, 127, 127, 255],
"toolbox_header_button_text_inactive": [0, 0, 0, 255],
+ "toolbox_premium_packages_background": [240, 240, 240, 255],
"favorites_header_bar": [245, 245, 245, 255],
"favorites_header_hover": [245, 245, 245, 255],
diff --git a/resources/variants/weedo_x40_weedo_0.4.inst.cfg b/resources/variants/weedo_x40_weedo_0.4.inst.cfg
new file mode 100644
index 0000000000..9527eacf1b
--- /dev/null
+++ b/resources/variants/weedo_x40_weedo_0.4.inst.cfg
@@ -0,0 +1,12 @@
+[general]
+name = 0.4mm Nozzle
+version = 4
+definition = weedo_x40
+
+[metadata]
+setting_version = 17
+type = variant
+hardware_type = nozzle
+
+[values]
+machine_nozzle_size = 0.4
diff --git a/resources/variants/weedo_x40_weedo_0.6.inst.cfg b/resources/variants/weedo_x40_weedo_0.6.inst.cfg
new file mode 100644
index 0000000000..1ff9bbc5ee
--- /dev/null
+++ b/resources/variants/weedo_x40_weedo_0.6.inst.cfg
@@ -0,0 +1,12 @@
+[general]
+name = 0.6mm Nozzle
+version = 4
+definition = weedo_x40
+
+[metadata]
+setting_version = 17
+type = variant
+hardware_type = nozzle
+
+[values]
+machine_nozzle_size = 0.6
diff --git a/resources/variants/weedo_x40_weedo_0.8.inst.cfg b/resources/variants/weedo_x40_weedo_0.8.inst.cfg
new file mode 100644
index 0000000000..6a19fd75c0
--- /dev/null
+++ b/resources/variants/weedo_x40_weedo_0.8.inst.cfg
@@ -0,0 +1,12 @@
+[general]
+name = 0.8mm Nozzle
+version = 4
+definition = weedo_x40
+
+[metadata]
+setting_version = 17
+type = variant
+hardware_type = nozzle
+
+[values]
+machine_nozzle_size = 0.8
diff --git a/scripts/check_gcode_buffer.py b/scripts/check_gcode_buffer.py
index ed093089e4..31ce5a046d 100755
--- a/scripts/check_gcode_buffer.py
+++ b/scripts/check_gcode_buffer.py
@@ -69,9 +69,9 @@ def calc_distance(pos1, pos2):
def calc_acceleration_distance(init_speed: float, target_speed: float, acceleration: float) -> float:
"""Given the initial speed, the target speed, and the acceleration
-
- calculate the distance that's neede for the acceleration to finish.
+ calculate the distance that's needed for the acceleration to finish.
"""
+
if acceleration == 0:
return 0.0
return (target_speed ** 2 - init_speed ** 2) / (2 * acceleration)
diff --git a/scripts/lionbridge_import.py b/scripts/lionbridge_import.py
index 0a7b63e9ac..65b07183a3 100644
--- a/scripts/lionbridge_import.py
+++ b/scripts/lionbridge_import.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2019 Ultimaker B.V.
+# Copyright (c) 2021 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
import argparse #To get the source directory from command line arguments.
@@ -190,6 +190,20 @@ def find_translation(source: str, msgctxt: str, msgid: str) -> str:
return "\"\"\n"
if __name__ == "__main__":
+ print("""Usage instructions:
+
+1. In Smartling, in the Cura project go to the "Files" tab.
+2. Select all four .pot files.
+3. In the expando above the file list, choose "Download Selected".
+4. In the pop-up, select:
+ - Current translations
+ - Select all languages
+ - Organize files: Folders for languages.
+5. Download that and extract the .zip archive somewhere.
+6. Start this script, with the location you extracted to as a parameter, e.g.:
+ python3 /path/to/lionbridge_import.py /home/username/Desktop/cura_translations
+""")
+
argparser = argparse.ArgumentParser(description = "Import translation files from Lionbridge.")
argparser.add_argument("source")
args = argparser.parse_args()
diff --git a/tests/Machines/Models/TestDiscoveredPrintersModel.py b/tests/Machines/Models/TestDiscoveredPrintersModel.py
index 1ec777ff88..3407ae575e 100644
--- a/tests/Machines/Models/TestDiscoveredPrintersModel.py
+++ b/tests/Machines/Models/TestDiscoveredPrintersModel.py
@@ -14,7 +14,7 @@ def discovered_printer() -> DiscoveredPrinter:
return DiscoveredPrinter("127.0.0.1", "zomg", "yay", None, "bleep", MagicMock())
-@pytest.mark.skip # TODO: This has some unknown dependency on the applicaiton / registry, which is hard to patch out. (which doesn't mean we shouldn't fix it!)
+@pytest.mark.skip # TODO: This has some unknown dependency on the application / registry, which is hard to patch out. (which doesn't mean we shouldn't fix it!)
def test_discoveredPrinters(discovered_printer_model):
mocked_device = MagicMock()
cluster_size = PropertyMock(return_value = 1)
diff --git a/tests/PrinterOutput/TestNetworkedPrinterOutputDevice.py b/tests/PrinterOutput/TestNetworkedPrinterOutputDevice.py
index 107ed77b51..84ad7f0473 100644
--- a/tests/PrinterOutput/TestNetworkedPrinterOutputDevice.py
+++ b/tests/PrinterOutput/TestNetworkedPrinterOutputDevice.py
@@ -38,7 +38,7 @@ def test_post():
mocked_network_manager = MagicMock()
output_device._manager = mocked_network_manager
- # Create a fake reply (we cant use a QReply, since those are abstract C++)
+ # Create a fake reply (we can't use a QReply, since those are abstract C++)
reply = MagicMock()
reply.operation = MagicMock(return_value=QNetworkAccessManager.PostOperation)
reply.url = MagicMock(return_value=QUrl("127.0.0.1"))
@@ -47,7 +47,7 @@ def test_post():
mocked_callback_handler = MagicMock()
output_device.post("whatever", "omgzomg", on_finished = mocked_callback_handler.onFinished)
- # So we now fake that the request was sucesful.
+ # So we now fake that the request was successful.
output_device._handleOnFinished(reply)
# We expect to get a callback regarding this.
@@ -60,7 +60,7 @@ def test_get():
mocked_network_manager = MagicMock()
output_device._manager = mocked_network_manager
- # Create a fake reply (we cant use a QReply, since those are abstract C++)
+ # Create a fake reply (we can't use a QReply, since those are abstract C++)
reply = MagicMock()
reply.operation = MagicMock(return_value=QNetworkAccessManager.PostOperation)
reply.url = MagicMock(return_value=QUrl("127.0.0.1"))
@@ -69,7 +69,7 @@ def test_get():
mocked_callback_handler = MagicMock()
output_device.get("whatever", on_finished=mocked_callback_handler.onFinished)
- # So we now fake that the request was sucesful.
+ # So we now fake that the request was successful.
output_device._handleOnFinished(reply)
# We expect to get a callback regarding this.
@@ -82,7 +82,7 @@ def test_delete():
mocked_network_manager = MagicMock()
output_device._manager = mocked_network_manager
- # Create a fake reply (we cant use a QReply, since those are abstract C++)
+ # Create a fake reply (we can't use a QReply, since those are abstract C++)
reply = MagicMock()
reply.operation = MagicMock(return_value=QNetworkAccessManager.PostOperation)
reply.url = MagicMock(return_value=QUrl("127.0.0.1"))
@@ -91,7 +91,7 @@ def test_delete():
mocked_callback_handler = MagicMock()
output_device.delete("whatever", on_finished=mocked_callback_handler.onFinished)
- # So we now fake that the request was sucesful.
+ # So we now fake that the request was successful.
output_device._handleOnFinished(reply)
# We expect to get a callback regarding this.
@@ -104,7 +104,7 @@ def test_put():
mocked_network_manager = MagicMock()
output_device._manager = mocked_network_manager
- # Create a fake reply (we cant use a QReply, since those are abstract C++)
+ # Create a fake reply (we can't use a QReply, since those are abstract C++)
reply = MagicMock()
reply.operation = MagicMock(return_value=QNetworkAccessManager.PostOperation)
reply.url = MagicMock(return_value=QUrl("127.0.0.1"))
@@ -113,7 +113,7 @@ def test_put():
mocked_callback_handler = MagicMock()
output_device.put("whatever", "omgzomg", on_finished = mocked_callback_handler.onFinished)
- # So we now fake that the request was sucesful.
+ # So we now fake that the request was successful.
output_device._handleOnFinished(reply)
# We expect to get a callback regarding this.
diff --git a/tests/Settings/TestSettingInheritanceManager.py b/tests/Settings/TestSettingInheritanceManager.py
index 3589d8b91f..8613095a9a 100644
--- a/tests/Settings/TestSettingInheritanceManager.py
+++ b/tests/Settings/TestSettingInheritanceManager.py
@@ -84,12 +84,12 @@ def test_getOverridesForExtruderNoGlobalStack(setting_inheritance_manager):
def test_settingIsOverwritingInheritanceNoUserState(setting_inheritance_manager, mocked_stack):
- # Setting 1 doesn't have a user state, so it cant have an override
+ # Setting 1 doesn't have a user state, so it can't have an override
assert not setting_inheritance_manager._settingIsOverwritingInheritance("setting_1", mocked_stack)
def test_settingIsOverwritingInheritanceNotEnabled(setting_inheritance_manager, mocked_stack):
- # Setting 2 doesn't have a enabled, so it cant have an override
+ # Setting 2 doesn't have a enabled, so it can't have an override
assert not setting_inheritance_manager._settingIsOverwritingInheritance("setting_2", mocked_stack)
diff --git a/tests/Settings/TestSettingVisibilityPresets.py b/tests/Settings/TestSettingVisibilityPresets.py
index 017bb6077a..bb4738f4f7 100644
--- a/tests/Settings/TestSettingVisibilityPresets.py
+++ b/tests/Settings/TestSettingVisibilityPresets.py
@@ -15,11 +15,11 @@ Resources.addStorageType(CuraApplication.ResourceTypes.SettingVisibilityPreset,
def test_createVisibilityPresetFromLocalFile():
- # Simple creation test. This is seperated from the visibilityFromPrevious, since we can't check for the contents
+ # Simple creation test. This is separated from the visibilityFromPrevious, since we can't check for the contents
# of the other profiles, since they might change over time.
visibility_preset = SettingVisibilityPreset()
- visibility_preset.loadFromFile(os.path.join(os.path.dirname(os.path.abspath(__file__)), "setting_visiblity_preset_test.cfg"))
+ visibility_preset.loadFromFile(os.path.join(os.path.dirname(os.path.abspath(__file__)), "setting_visibility_preset_test.cfg"))
assert setting_visibility_preset_test_settings == set(visibility_preset.settings)
assert visibility_preset.name == "test"
@@ -49,7 +49,7 @@ def test_setActivePreset():
with patch("cura.CuraApplication.CuraApplication.getInstance"):
visibility_model = SettingVisibilityPresetsModel(preferences)
visibility_model.activePresetChanged = MagicMock()
- # Ensure that we start off with basic (since we didn't change anyting just yet!)
+ # Ensure that we start off with basic (since we didn't change anything just yet!)
assert visibility_model.activePreset == "basic"
# Everything should be the same.
diff --git a/tests/Settings/setting_visiblity_preset_test.cfg b/tests/Settings/setting_visibility_preset_test.cfg
similarity index 100%
rename from tests/Settings/setting_visiblity_preset_test.cfg
rename to tests/Settings/setting_visibility_preset_test.cfg
diff --git a/tests/TestCuraSceneController.py b/tests/TestCuraSceneController.py
index ffffa8ac2a..634ce89d86 100644
--- a/tests/TestCuraSceneController.py
+++ b/tests/TestCuraSceneController.py
@@ -75,5 +75,5 @@ def test_updateMaxBuildPlate(objects_model, multi_build_plate_model):
# And check what happens if we move down again!
controller._calcMaxBuildPlate = MagicMock(return_value=2)
controller.updateMaxBuildPlate(SceneNode())
- assert controller._active_build_plate == 0 # We don't have any items anywere, so default to 0
+ assert controller._active_build_plate == 0 # We don't have any items anywhere, so default to 0
diff --git a/tests/TestMachineAction.py b/tests/TestMachineAction.py
index 7dbc6b1270..2bc9659e42 100755
--- a/tests/TestMachineAction.py
+++ b/tests/TestMachineAction.py
@@ -38,7 +38,7 @@ def test_addDefaultMachineActions(machine_action_manager, global_stack):
machine_action_manager.addMachineAction(action)
# Only the actions in the definition that were registered first will be added to the machine.
- # For the sake of this test, all the actions were previouly added.
+ # For the sake of this test, all the actions were previously added.
machine_action_manager.addDefaultMachineActions(global_stack)
definition_id = global_stack.getDefinition().getId()
diff --git a/tests/TestThemes.py b/tests/TestThemes.py
new file mode 100644
index 0000000000..a84d94298c
--- /dev/null
+++ b/tests/TestThemes.py
@@ -0,0 +1,33 @@
+# Copyright (c) 2021 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+
+import json # To parse the deprecated icons files.
+import os # To find the theme folders.
+import pytest
+
+theme_base = os.path.join(os.path.split(__file__)[0], "..", "resources", "themes")
+theme_paths = [os.path.join(theme_base, theme_folder) for theme_folder in os.listdir(theme_base) if os.path.isdir(os.path.join(theme_base, theme_folder))]
+
+@pytest.mark.parametrize("theme_path", theme_paths)
+def test_deprecatedIconsExist(theme_path: str) -> None:
+ icons_folder = os.path.join(theme_path, "icons")
+ deprecated_icons_file = os.path.join(icons_folder, "deprecated_icons.json")
+ if not os.path.exists(deprecated_icons_file):
+ return # No deprecated icons file, there is nothing to go wrong.
+
+ # Find out which icons exist in this theme file.
+ existing_icons = {}
+ for size in [subfolder for subfolder in os.listdir(icons_folder) if os.path.isdir(os.path.join(icons_folder, subfolder))]:
+ existing_icons[size] = set(os.path.splitext(fname)[0] for fname in os.listdir(os.path.join(icons_folder, size)))
+
+ with open(deprecated_icons_file) as f:
+ deprecated_icons = json.load(f)
+
+ for entry in deprecated_icons.values():
+ assert "new_icon" in entry # For each deprecated icon we must know which icon replaced it.
+ new_icon = entry["new_icon"]
+ assert "size" in entry
+ size = entry["size"]
+
+ assert size in existing_icons # The replacement icon must have a size that exists.
+ assert new_icon in existing_icons[size] # The new icon must exist for that size.