Browse Source

Merge branch 'main' into CURA-10561-makerbot

Jelle Spijker 1 year ago
parent
commit
69f474a426

+ 2 - 2
.github/workflows/installers.yml

@@ -95,7 +95,7 @@ jobs:
       enterprise: ${{ github.event.inputs.enterprise == 'true' }}
       staging: ${{ github.event.inputs.staging == 'true' }}
       architecture: X64
-      operating_system: macos-12
+      operating_system: self-hosted-X64
     secrets: inherit
 
   macos-arm-installer:
@@ -107,7 +107,7 @@ jobs:
       enterprise: ${{ github.event.inputs.enterprise == 'true' }}
       staging: ${{ github.event.inputs.staging == 'true' }}
       architecture: ARM64
-      operating_system: self-hosted
+      operating_system: self-hosted-ARM64
     secrets: inherit
 
   # Run and update nightly release when the nightly input is set to true or if the schedule is triggered

+ 7 - 6
.github/workflows/macos.yml

@@ -27,7 +27,7 @@ on:
       architecture:
         description: 'Architecture'
         required: true
-        default: 'X64'
+        default: 'ARM64'
         type: choice
         options:
           - X64
@@ -35,10 +35,11 @@ on:
       operating_system:
         description: 'OS'
         required: true
-        default: 'macos-11'
+        default: 'self-hosted-ARM64'
         type: choice
         options:
-          - self-hosted
+          - self-hosted-X64
+          - self-hosted-ARM64
           - macos-11
           - macos-12
   workflow_call:
@@ -66,12 +67,12 @@ on:
       architecture:
         description: 'Architecture'
         required: true
-        default: 'X64'
+        default: 'ARM64'
         type: string
       operating_system:
         description: 'OS'
         required: true
-        default: 'macos-11'
+        default: 'self-hosted-ARM64'
         type: string
 
 env:
@@ -102,7 +103,7 @@ jobs:
       - name: Setup Python and pip
         uses: actions/setup-python@v4
         with:
-          python-version: '3.10.x'
+          python-version: '3.11.x'
           cache: 'pip'
           cache-dependency-path: .github/workflows/requirements-conan-package.txt
 

+ 1 - 1
conanfile.py

@@ -210,7 +210,7 @@ class CuraConan(ConanFile):
         self.requires("curaengine/(latest)@ultimaker/testing")
         self.requires("pysavitar/5.3.0")
         self.requires("pynest2d/5.3.0")
-        self.requires("curaengine_plugin_gradual_flow/(latest)@ultimaker/testing")
+        self.requires("curaengine_plugin_gradual_flow/0.1.0")
         self.requires("uranium/(latest)@ultimaker/testing")
         self.requires("cura_binary_data/(latest)@ultimaker/testing")
         self.requires("cpython/3.10.4")

+ 3 - 2
cura/Arranging/GridArrange.py

@@ -118,8 +118,9 @@ class GridArrange(Arranger):
 
     def _findOptimalGridOffset(self):
         if len(self._fixed_nodes) == 0:
-            self._offset_x = 0
-            self._offset_y = 0
+            edge_disallowed_size = self._build_volume.getEdgeDisallowedSize()
+            self._offset_x = edge_disallowed_size
+            self._offset_y = edge_disallowed_size
             return
 
         if len(self._fixed_nodes) == 1:

+ 18 - 14
cura/Arranging/Nest2DArrange.py

@@ -49,8 +49,9 @@ class Nest2DArrange(Arranger):
     def findNodePlacement(self) -> Tuple[bool, List[Item]]:
         spacing = int(1.5 * self._factor)  # 1.5mm spacing.
 
-        machine_width = self._build_volume.getWidth()
-        machine_depth = self._build_volume.getDepth()
+        edge_disallowed_size = self._build_volume.getEdgeDisallowedSize()
+        machine_width = self._build_volume.getWidth() - (edge_disallowed_size * 2)
+        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:
@@ -80,7 +81,6 @@ class Nest2DArrange(Arranger):
         ], numpy.float32))
 
         disallowed_areas = self._build_volume.getDisallowedAreas()
-        num_disallowed_areas_added = 0
         for area in disallowed_areas:
             converted_points = []
 
@@ -95,7 +95,6 @@ class Nest2DArrange(Arranger):
                 disallowed_area = Item(converted_points)
                 disallowed_area.markAsDisallowedAreaInBin(0)
                 node_items.append(disallowed_area)
-                num_disallowed_areas_added += 1
 
         for node in self._fixed_nodes:
             converted_points = []
@@ -108,20 +107,25 @@ class Nest2DArrange(Arranger):
                 item = Item(converted_points)
                 item.markAsFixedInBin(0)
                 node_items.append(item)
-                num_disallowed_areas_added += 1
 
-        config = NfpConfig()
-        config.accuracy = 1.0
-        config.alignment = NfpConfig.Alignment.DONT_ALIGN
-        if self._lock_rotation:
-            config.rotations = [0.0]
+        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.starting_point = strategies[0]
+            strategies = strategies[1:]
 
-        num_bins = nest(node_items, build_plate_bounding_box, spacing, config)
+            if self._lock_rotation:
+                config.rotations = [0.0]
 
-        # Strip the fixed items (previously placed) and the disallowed areas from the results again.
-        node_items = list(filter(lambda item: not item.isFixed(), node_items))
+            num_bins = nest(node_items, build_plate_bounding_box, spacing, config)
 
-        found_solution_for_all = num_bins == 1
+            # Strip the fixed items (previously placed) and the disallowed areas from the results again.
+            node_items = list(filter(lambda item: not item.isFixed(), node_items))
+
+            found_solution_for_all = num_bins == 1
 
         return found_solution_for_all, node_items
 

+ 15 - 4
cura/BuildVolume.py

@@ -813,7 +813,7 @@ class BuildVolume(SceneNode):
             prime_tower_areas = self._computeDisallowedAreasPrinted(used_extruders)
             for extruder_id in prime_tower_areas:
                 for area_index, prime_tower_area in enumerate(prime_tower_areas[extruder_id]):
-                    for area in result_areas[extruder_id]:
+                    for area in result_areas_no_brim[extruder_id]:
                         if prime_tower_area.intersectsPolygon(area) is not None:
                             prime_tower_collision = True
                             break
@@ -860,13 +860,24 @@ class BuildVolume(SceneNode):
             machine_depth = self._global_container_stack.getProperty("machine_depth", "value")
             prime_tower_x = self._global_container_stack.getProperty("prime_tower_position_x", "value")
             prime_tower_y = - self._global_container_stack.getProperty("prime_tower_position_y", "value")
+            prime_tower_brim_enable = self._global_container_stack.getProperty("prime_tower_brim_enable", "value")
+            prime_tower_base_size = self._global_container_stack.getProperty("prime_tower_base_size", "value")
+            prime_tower_base_height = self._global_container_stack.getProperty("prime_tower_base_height", "value")
+            adhesion_type = self._global_container_stack.getProperty("adhesion_type", "value")
+
             if not self._global_container_stack.getProperty("machine_center_is_zero", "value"):
                 prime_tower_x = prime_tower_x - machine_width / 2 #Offset by half machine_width and _depth to put the origin in the front-left.
                 prime_tower_y = prime_tower_y + machine_depth / 2
 
             radius = prime_tower_size / 2
-            prime_tower_area = Polygon.approximatedCircle(radius, num_segments = 24)
-            prime_tower_area = prime_tower_area.translate(prime_tower_x - radius, prime_tower_y - radius)
+            delta_x = -radius
+            delta_y = -radius
+
+            if prime_tower_base_size > 0 and ((prime_tower_brim_enable and prime_tower_base_height > 0) or adhesion_type == "raft"):
+                radius += prime_tower_base_size
+
+            prime_tower_area = Polygon.approximatedCircle(radius, num_segments = 32)
+            prime_tower_area = prime_tower_area.translate(prime_tower_x + delta_x, prime_tower_y + delta_y)
 
             prime_tower_area = prime_tower_area.getMinkowskiHull(Polygon.approximatedCircle(0))
             for extruder in used_extruders:
@@ -1171,7 +1182,7 @@ class BuildVolume(SceneNode):
     _raft_settings = ["adhesion_type", "raft_base_thickness", "raft_interface_layers", "raft_interface_thickness", "raft_surface_layers", "raft_surface_thickness", "raft_airgap", "layer_0_z_overlap"]
     _extra_z_settings = ["retraction_hop_enabled", "retraction_hop"]
     _prime_settings = ["extruder_prime_pos_x", "extruder_prime_pos_y", "prime_blob_enable"]
-    _tower_settings = ["prime_tower_enable", "prime_tower_size", "prime_tower_position_x", "prime_tower_position_y", "prime_tower_brim_enable"]
+    _tower_settings = ["prime_tower_enable", "prime_tower_size", "prime_tower_position_x", "prime_tower_position_y", "prime_tower_brim_enable", "prime_tower_base_size", "prime_tower_base_height"]
     _ooze_shield_settings = ["ooze_shield_enabled", "ooze_shield_dist"]
     _distance_settings = ["infill_wipe_dist", "travel_avoid_distance", "support_offset", "support_enable", "travel_avoid_other_parts", "travel_avoid_supports", "wall_line_count", "wall_line_width_0", "wall_line_width_x"]
     _extruder_settings = ["support_enable", "support_bottom_enable", "support_roof_enable", "support_infill_extruder_nr", "support_extruder_nr_layer_0", "support_bottom_extruder_nr", "support_roof_extruder_nr", "brim_line_count", "skirt_brim_extruder_nr", "raft_base_extruder_nr", "raft_interface_extruder_nr", "raft_surface_extruder_nr", "adhesion_type"] #Settings that can affect which extruders are used.

+ 5 - 3
cura/PrinterOutput/NetworkMJPGImage.py

@@ -1,6 +1,8 @@
 # Copyright (c) 2018 Aldo Hoeben / fieldOfView
 # NetworkMJPGImage is released under the terms of the LGPLv3 or higher.
 
+from typing import Optional
+
 from PyQt6.QtCore import QUrl, pyqtProperty, pyqtSignal, pyqtSlot, QRect, QByteArray
 from PyQt6.QtGui import QImage, QPainter
 from PyQt6.QtQuick import QQuickPaintedItem
@@ -19,9 +21,9 @@ class NetworkMJPGImage(QQuickPaintedItem):
 
         self._stream_buffer = QByteArray()
         self._stream_buffer_start_index = -1
-        self._network_manager = None  # type: QNetworkAccessManager
-        self._image_request = None  # type: QNetworkRequest
-        self._image_reply = None  # type: QNetworkReply
+        self._network_manager: Optional[QNetworkAccessManager] = None
+        self._image_request: Optional[QNetworkRequest] = None
+        self._image_reply: Optional[QNetworkReply] = None
         self._image = QImage()
         self._image_rect = QRect()
 

+ 10 - 0
cura/Settings/MachineManager.py

@@ -1700,6 +1700,16 @@ class MachineManager(QObject):
             else:  # No intent had the correct category.
                 extruder.intent = empty_intent_container
 
+    @pyqtSlot()
+    def resetIntents(self) -> None:
+        """Reset the intent category of the current printer.
+        """
+        global_stack = self._application.getGlobalContainerStack()
+        if global_stack is None:
+            return
+        for extruder in global_stack.extruderList:
+            extruder.intent = empty_intent_container
+
     def activeQualityGroup(self) -> Optional["QualityGroup"]:
         """Get the currently activated quality group.
 

+ 22 - 10
packaging/AppImage-builder/AppImageBuilder.yml.jinja

@@ -47,26 +47,38 @@ AppDir:
     - sourceline: deb https://packagecloud.io/slacktechnologies/slack/debian/ jessie
         main
     include:
-      - xdg-desktop-portal-kde:amd64
-    exclude:
+      - xdg-desktop-portal-kde
+      - libgtk-3-0
+      - librsvg2-2
+      - librsvg2-common
+      - libgdk-pixbuf2.0-0
+      - libgdk-pixbuf2.0-bin
+      - libgdk-pixbuf2.0-common
+      - imagemagick
+      - shared-mime-info
+      - gnome-icon-theme-symbolic
       - hicolor-icon-theme
-      - adwaita-icon-theme
-      - humanity-icon-theme
+    exclude: []
   files:
     include: []
     exclude:
-    - usr/share/man
-    - usr/share/doc/*/README.*
-    - usr/share/doc/*/changelog.*
-    - usr/share/doc/*/NEWS.*
-    - usr/share/doc/*/TODO.*
+      - usr/share/man
+      - usr/share/doc/*/README.*
+      - usr/share/doc/*/changelog.*
+      - usr/share/doc/*/NEWS.*
+      - usr/share/doc/*/TODO.*
   runtime:
     env:
-      APPDIR_LIBRARY_PATH: "$APPDIR/usr/lib/x86_64-linux-gnu:$APPDIR/lib/x86_64-linux-gnu:$APPDIR/usr/lib:$APPDIR/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders"
+      APPDIR_LIBRARY_PATH: "$APPDIR:$APPDIR/runtime/compat/:$APPDIR/usr/lib/x86_64-linux-gnu:$APPDIR/lib/x86_64-linux-gnu:$APPDIR/usr/lib:$APPDIR/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders"
+      LD_LIBRARY_PATH: "$APPDIR:$APPDIR/runtime/compat/:$APPDIR/usr/lib/x86_64-linux-gnu:$APPDIR/lib/x86_64-linux-gnu:$APPDIR/usr/lib:$APPDIR/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders"
       PYTHONPATH: "$APPDIR"
       QT_PLUGIN_PATH: "$APPDIR/qt/plugins"
       QML2_IMPORT_PATH: "$APPDIR/qt/qml"
       QT_QPA_PLATFORMTHEME: xdgdesktopportal
+      GDK_PIXBUF_MODULEDIR: $APPDIR/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders
+      GDK_PIXBUF_MODULE_FILE: $APPDIR/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders.cache
+    path_mappings:
+      - /usr/share:$APPDIR/usr/share
   test:
     fedora-30:
       image: appimagecrafters/tests-env:fedora-30

+ 3 - 1
plugins/3MFReader/ThreeMFWorkspaceReader.py

@@ -1259,7 +1259,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
                 available_intent_category_list = IntentManager.getInstance().currentAvailableIntentCategories()
                 if self._intent_category_to_apply is not None and self._intent_category_to_apply in available_intent_category_list:
                     machine_manager.setIntentByCategory(self._intent_category_to_apply)
-
+                else:
+                    # if no intent is provided, reset to the default (balanced) intent
+                    machine_manager.resetIntents()
         # Notify everything/one that is to notify about changes.
         global_stack.containersChanged.emit(global_stack.getTop())
 

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