diff options
author | Remco Burema <r.burema@ultimaker.com> | 2022-11-04 13:51:26 +0300 |
---|---|---|
committer | Remco Burema <r.burema@ultimaker.com> | 2022-11-04 13:51:26 +0300 |
commit | 15f31a7c0c7c4783744180417a5ad60adfbb8145 (patch) | |
tree | 816e5ecfaa2046e87855bb360f274191dcc3e4a5 | |
parent | 79af58ef7e59ae1343e86d224106fd2c1e93917d (diff) | |
parent | 997b6f830d6a711341d0211f3034a9cf343a692e (diff) |
Merge branch 'main' into PR-13661
-rw-r--r-- | .github/ISSUE_TEMPLATE/featurerequest.yaml | 4 | ||||
-rw-r--r-- | .github/workflows/conan-package-create.yml | 16 | ||||
-rw-r--r-- | .github/workflows/conan-package.yml | 2 | ||||
-rw-r--r-- | .github/workflows/conan-recipe-version.yml | 16 | ||||
-rwxr-xr-x | cura/BuildVolume.py | 72 | ||||
-rwxr-xr-x | cura/Settings/ExtruderManager.py | 4 | ||||
-rw-r--r-- | cura/Settings/ExtruderStack.py | 2 | ||||
-rwxr-xr-x | cura/Settings/GlobalStack.py | 2 | ||||
-rw-r--r-- | plugins/CuraEngineBackend/StartSliceJob.py | 4 | ||||
-rw-r--r-- | plugins/PostProcessingPlugin/scripts/PauseAtHeight.py | 47 | ||||
-rw-r--r-- | resources/definitions/fdmprinter.def.json | 47 | ||||
-rw-r--r-- | resources/images/cura.png | bin | 325136 -> 299931 bytes | |||
-rw-r--r-- | resources/images/cura_enterprise.png | bin | 327226 -> 301636 bytes | |||
-rw-r--r-- | resources/images/cura_wip.png | bin | 324496 -> 298589 bytes | |||
-rw-r--r-- | resources/themes/cura-light/images/logo.svg | 30 | ||||
-rw-r--r-- | tests/TestBuildVolume.py | 16 |
16 files changed, 130 insertions, 132 deletions
diff --git a/.github/ISSUE_TEMPLATE/featurerequest.yaml b/.github/ISSUE_TEMPLATE/featurerequest.yaml index 83c448fe44..bbdd3908bd 100644 --- a/.github/ISSUE_TEMPLATE/featurerequest.yaml +++ b/.github/ISSUE_TEMPLATE/featurerequest.yaml @@ -1,6 +1,6 @@ name: Feature Request description: Suggest an idea for this project. -labels: "Type: New Feature" +labels: ["Type: New Feature", "Status: Triage"] body: - type: markdown attributes: @@ -41,4 +41,4 @@ body: - type: textarea attributes: label: Additional information & file uploads - description: You can add pictures or files to visualize your feature request in the comments below.
\ No newline at end of file + description: You can add pictures or files to visualize your feature request in the comments below. diff --git a/.github/workflows/conan-package-create.yml b/.github/workflows/conan-package-create.yml index 4af608b7ac..a3b769fdb3 100644 --- a/.github/workflows/conan-package-create.yml +++ b/.github/workflows/conan-package-create.yml @@ -3,6 +3,14 @@ name: Create and Upload Conan package on: workflow_call: inputs: + project_name: + required: true + type: string + + build_id: + required: true + type: number + recipe_id_full: required: true type: string @@ -128,7 +136,13 @@ jobs: - name: Create the Packages if: ${{ !inputs.create_from_source }} - run: conan install ${{ inputs.recipe_id_full }} --build=missing --update + run: | + conan_build_info --v2 start ${{ inputs.project_name }} ${{ github.run_number }}000${{ inputs.build_id }} + conan lock create --reference ${{ inputs.recipe_id_full }} --build=missing --update + conan install ${{ inputs.recipe_id_full }} --build=missing --update --lockfile=conan.lock + conan_build_info --v2 create buildinfo.json --lockfile conan.lock --user ${{ secrets.CONAN_USER }} --password ${{ secrets.CONAN_PASS }} + conan_build_info --v2 publish buildinfo.json --url https://ultimaker.jfrog.io/artifactory --user ${{ secrets.CONAN_USER }} --password ${{ secrets.CONAN_PASS }} + conan_build_info --v2 stop - name: Create the Packages (from source) if: ${{ inputs.create_from_source }} diff --git a/.github/workflows/conan-package.yml b/.github/workflows/conan-package.yml index 8a9de2e37f..0a3d4447c1 100644 --- a/.github/workflows/conan-package.yml +++ b/.github/workflows/conan-package.yml @@ -81,6 +81,8 @@ jobs: uses: ultimaker/cura/.github/workflows/conan-package-create.yml@main with: + project_name: cura + build_id: 1 recipe_id_full: ${{ needs.conan-recipe-version.outputs.recipe_id_full }} runs_on: 'ubuntu-20.04' python_version: '3.10.x' diff --git a/.github/workflows/conan-recipe-version.yml b/.github/workflows/conan-recipe-version.yml index f1dfc67bf3..eb1824c8f7 100644 --- a/.github/workflows/conan-recipe-version.yml +++ b/.github/workflows/conan-recipe-version.yml @@ -93,12 +93,13 @@ jobs: issue_number = "${{ github.ref }}".split('/')[2] is_tag = "${{ github.ref_type }}" == "tag" is_release_branch = False + ref_name = "${{ github.base_ref }}" if event_name == "pull_request" else "${{ github.ref_name }}" buildmetadata = "" if "${{ inputs.additional_buildmetadata }}" == "" else "${{ inputs.additional_buildmetadata }}_" # FIXME: for when we push a tag (such as an release) channel = "testing" if is_tag: - branch_version = tools.Version("${{ github.ref_name }}") + branch_version = tools.Version(ref_name) is_release_branch = True channel = "_" user = "_" @@ -108,10 +109,10 @@ jobs: branch_version = tools.Version(repo.active_branch.name) except ConanException: branch_version = tools.Version('0.0.0') - if "${{ github.ref_name }}" == f"{branch_version.major}.{branch_version.minor}": + if ref_name == f"{branch_version.major}.{branch_version.minor}": channel = 'stable' is_release_branch = True - elif "${{ github.ref_name }}" in ("main", "master"): + elif ref_name in ("main", "master"): channel = 'testing' else: channel = repo.active_branch.name.split("_")[0].replace("-", "_").lower() @@ -165,15 +166,6 @@ jobs: bump_up_minor = int(latest_branch_version.minor) + 1 reset_patch = 0 actual_version = f"{latest_branch_version.major}.{bump_up_minor}.{reset_patch}-alpha+{buildmetadata}{channel_metadata}" - else: - # FIXME: for external PR's - actual_version = f"5.3.0-alpha+{buildmetadata}pr_{issue_number}" - - if is_tag and "${{ github.ref_name }}" == "5.2.0-beta": - actual_version = "5.2.0-beta" - is_release_branch = True - user = "_" - channel = "_" # %% print to output cmd_name = ["echo", f"::set-output name=name::{project_name}"] diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 776d92a1f6..1536d541c7 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -810,11 +810,6 @@ class BuildVolume(SceneNode): break if prime_tower_collision: # Already found a collision. break - if self._global_container_stack.getProperty("prime_tower_brim_enable", "value") and self._global_container_stack.getProperty("adhesion_type", "value") != "raft": - brim_size = self._calculateBedAdhesionSize(used_extruders, "brim") - # Use 2x the brim size, since we need 1x brim size distance due to the object brim and another - # times the brim due to the brim of the prime tower - prime_tower_areas[extruder_id][area_index] = prime_tower_area.getMinkowskiHull(Polygon.approximatedCircle(2 * brim_size, num_segments = 24)) if not prime_tower_collision: result_areas[extruder_id].extend(prime_tower_areas[extruder_id]) result_areas_no_brim[extruder_id].extend(prime_tower_areas[extruder_id]) @@ -840,9 +835,13 @@ class BuildVolume(SceneNode): result = {} skirt_brim_extruder: ExtruderStack = None + skirt_brim_extruder_nr = self._global_container_stack.getProperty("skirt_brim_extruder_nr", "value") + for extruder in used_extruders: - if int(extruder.getProperty("extruder_nr", "value")) == int(self._global_container_stack.getProperty("skirt_brim_extruder_nr", "value")): - skirt_brim_extruder = extruder + if skirt_brim_extruder_nr == -1: + skirt_brim_extruder = used_extruders[0] # The prime tower brim is always printed with the first extruder + elif int(extruder.getProperty("extruder_nr", "value")) == int(skirt_brim_extruder_nr): + skirt_brim_extruder = extruder result[extruder.getId()] = [] # Currently, the only normally printed object is the prime tower. @@ -856,15 +855,6 @@ class BuildVolume(SceneNode): 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 - if skirt_brim_extruder is not None and self._global_container_stack.getProperty("prime_tower_brim_enable", "value") and self._global_container_stack.getProperty("adhesion_type", "value") != "raft": - brim_size = ( - skirt_brim_extruder.getProperty("brim_line_count", "value") * - skirt_brim_extruder.getProperty("skirt_brim_line_width", "value") / 100.0 * - skirt_brim_extruder.getProperty("initial_layer_line_width_factor", "value") - ) - prime_tower_x -= brim_size - prime_tower_y += brim_size - 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) @@ -1076,7 +1066,7 @@ class BuildVolume(SceneNode): all_values[i] = 0 return all_values - def _calculateBedAdhesionSize(self, used_extruders, adhesion_override = None): + def _calculateBedAdhesionSize(self, used_extruders): """Get the bed adhesion size for the global container stack and used extruders :param adhesion_override: override adhesion type. @@ -1086,52 +1076,12 @@ class BuildVolume(SceneNode): return None container_stack = self._global_container_stack - adhesion_type = adhesion_override - if adhesion_type is None: - adhesion_type = container_stack.getProperty("adhesion_type", "value") - - # Skirt_brim_line_width is a bit of an odd one out. The primary bit of the skirt/brim is printed - # with the adhesion extruder, but it also prints one extra line by all other extruders. As such, the - # setting does *not* have a limit_to_extruder setting (which means that we can't ask the global extruder what - # the value is. - skirt_brim_extruder_nr = self._global_container_stack.getProperty("skirt_brim_extruder_nr", "value") - try: - skirt_brim_stack = self._global_container_stack.extruderList[int(skirt_brim_extruder_nr)] - except IndexError: - Logger.warning(f"Couldn't find extruder with index '{skirt_brim_extruder_nr}', defaulting to 0 instead.") - skirt_brim_stack = self._global_container_stack.extruderList[0] - skirt_brim_line_width = skirt_brim_stack.getProperty("skirt_brim_line_width", "value") - - initial_layer_line_width_factor = skirt_brim_stack.getProperty("initial_layer_line_width_factor", "value") - # Use brim width if brim is enabled OR the prime tower has a brim. - if adhesion_type == "brim": - brim_line_count = skirt_brim_stack.getProperty("brim_line_count", "value") - brim_gap = skirt_brim_stack.getProperty("brim_gap", "value") - bed_adhesion_size = brim_gap + skirt_brim_line_width * brim_line_count * initial_layer_line_width_factor / 100.0 - - for extruder_stack in used_extruders: - bed_adhesion_size += extruder_stack.getProperty("skirt_brim_line_width", "value") * extruder_stack.getProperty("initial_layer_line_width_factor", "value") / 100.0 - - # We don't create an additional line for the extruder we're printing the brim with. - bed_adhesion_size -= skirt_brim_line_width * initial_layer_line_width_factor / 100.0 - elif adhesion_type == "skirt": - skirt_distance = skirt_brim_stack.getProperty("skirt_gap", "value") - skirt_line_count = skirt_brim_stack.getProperty("skirt_line_count", "value") - - bed_adhesion_size = skirt_distance + ( - skirt_brim_line_width * skirt_line_count) * initial_layer_line_width_factor / 100.0 - - for extruder_stack in used_extruders: - bed_adhesion_size += extruder_stack.getProperty("skirt_brim_line_width", "value") * extruder_stack.getProperty("initial_layer_line_width_factor", "value") / 100.0 - - # We don't create an additional line for the extruder we're printing the skirt with. - bed_adhesion_size -= skirt_brim_line_width * initial_layer_line_width_factor / 100.0 - elif adhesion_type == "raft": + adhesion_type = container_stack.getProperty("adhesion_type", "value") + + if adhesion_type == "raft": bed_adhesion_size = self._global_container_stack.getProperty("raft_margin", "value") # Should refer to the raft extruder if set. - elif adhesion_type == "none": + else: # raft, brim or skirt. Those last two are handled by CuraEngine. bed_adhesion_size = 0 - else: - raise Exception("Unknown bed adhesion type. Did you forget to update the build volume calculations for your new bed adhesion type?") max_length_available = 0.5 * min( self._global_container_stack.getProperty("machine_width", "value"), diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 52d63b611b..f429a0de19 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -275,7 +275,7 @@ class ExtruderManager(QObject): for extruder_setting in used_adhesion_extruders: extruder_str_nr = str(global_stack.getProperty(extruder_setting, "value")) if extruder_str_nr == "-1": - extruder_str_nr = self._application.getMachineManager().defaultExtruderPosition + continue # An optional extruder doesn't force any extruder to be used if it isn't used already if extruder_str_nr in self.extruderIds: used_extruder_stack_ids.add(self.extruderIds[extruder_str_nr]) @@ -298,7 +298,7 @@ class ExtruderManager(QObject): # Starts with the adhesion extruder. adhesion_type = global_stack.getProperty("adhesion_type", "value") if adhesion_type in {"skirt", "brim"}: - return global_stack.getProperty("skirt_brim_extruder_nr", "value") + return max(0, int(global_stack.getProperty("skirt_brim_extruder_nr", "value"))) # optional skirt/brim extruder defaults to zero if adhesion_type == "raft": return global_stack.getProperty("raft_base_extruder_nr", "value") diff --git a/cura/Settings/ExtruderStack.py b/cura/Settings/ExtruderStack.py index e93193818c..eba41569b7 100644 --- a/cura/Settings/ExtruderStack.py +++ b/cura/Settings/ExtruderStack.py @@ -142,8 +142,6 @@ class ExtruderStack(CuraContainerStack): limit_to_extruder = super().getProperty(key, "limit_to_extruder", context) if limit_to_extruder is not None: - if limit_to_extruder == -1: - limit_to_extruder = int(cura.CuraApplication.CuraApplication.getInstance().getMachineManager().defaultExtruderPosition) limit_to_extruder = str(limit_to_extruder) if (limit_to_extruder is not None and limit_to_extruder != "-1") and self.getMetaDataEntry("position") != str(limit_to_extruder): diff --git a/cura/Settings/GlobalStack.py b/cura/Settings/GlobalStack.py index 041bd19d3a..25fc74b28f 100755 --- a/cura/Settings/GlobalStack.py +++ b/cura/Settings/GlobalStack.py @@ -226,8 +226,6 @@ class GlobalStack(CuraContainerStack): # Handle the "limit_to_extruder" property. limit_to_extruder = super().getProperty(key, "limit_to_extruder", context) if limit_to_extruder is not None: - if limit_to_extruder == -1: - limit_to_extruder = int(cura.CuraApplication.CuraApplication.getInstance().getMachineManager().defaultExtruderPosition) limit_to_extruder = str(limit_to_extruder) if limit_to_extruder is not None and limit_to_extruder != "-1" and limit_to_extruder in self._extruders: if super().getProperty(key, "settable_per_extruder", context): diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 64216f373f..d06136a2b4 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -487,6 +487,10 @@ class StartSliceJob(Job): settings["machine_start_gcode"] = self._expandGcodeTokens(settings["machine_start_gcode"], initial_extruder_nr) settings["machine_end_gcode"] = self._expandGcodeTokens(settings["machine_end_gcode"], initial_extruder_nr) + # Manually add 'nozzle offsetting', since that is a metadata-entry instead for some reason. + # NOTE: This probably needs to be an actual setting at some point. + settings["nozzle_offsetting_for_disallowed_areas"] = CuraApplication.getInstance().getGlobalContainerStack().getMetaDataEntry("nozzle_offsetting_for_disallowed_areas", True) + # Add all sub-messages for each individual setting. for key, value in settings.items(): setting_message = self._slice_message.getMessage("global_settings").addRepeatedMessage("settings") diff --git a/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py b/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py index 5923a53adf..6afac57359 100644 --- a/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py +++ b/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py @@ -58,16 +58,25 @@ class PauseAtHeight(Script): "default_value": "marlin", "value": "\\\"griffin\\\" if machine_gcode_flavor==\\\"Griffin\\\" else \\\"reprap\\\" if machine_gcode_flavor==\\\"RepRap (RepRap)\\\" else \\\"repetier\\\" if machine_gcode_flavor==\\\"Repetier\\\" else \\\"bq\\\" if \\\"BQ\\\" in machine_name or \\\"Flying Bear Ghost 4S\\\" in machine_name else \\\"marlin\\\"" }, + "hold_steppers_on": + { + "label": "Keep motors engaged", + "description": "Keep the steppers engaged to allow change of filament without moving the head. Applying too much force will move the head/bed anyway", + "type": "bool", + "default_value": true, + "enabled": "pause_method != \\\"griffin\\\"" + }, "disarm_timeout": { "label": "Disarm timeout", - "description": "After this time steppers are going to disarm (meaning that they can easily lose their positions). Set this to 0 if you don't want to set any duration.", + "description": "After this time steppers are going to disarm (meaning that they can easily lose their positions). Set this to 0 if you don't want to set any duration and disarm immediately.", "type": "int", "value": "0", "minimum_value": "0", "minimum_value_warning": "0", "maximum_value_warning": "1800", - "unit": "s" + "unit": "s", + "enabled": "not hold_steppers_on" }, "head_park_enabled": { @@ -192,6 +201,22 @@ class PauseAtHeight(Script): "default_value": "RepRap (Marlin/Sprinter)", "enabled": false }, + "beep_at_pause": + { + "label": "Beep at pause", + "description": "Make a beep when pausing", + "type": "bool", + "default_value": true + }, + "beep_length": + { + "label": "Beep length", + "description": "How much should the beep last", + "type": "int", + "default_value": "1000", + "unit": "ms", + "enabled": "beep_at_pause" + }, "custom_gcode_before_pause": { "label": "G-code Before Pause", @@ -242,6 +267,7 @@ class PauseAtHeight(Script): pause_at = self.getSettingValueByKey("pause_at") pause_height = self.getSettingValueByKey("pause_height") pause_layer = self.getSettingValueByKey("pause_layer") + hold_steppers_on = self.getSettingValueByKey("hold_steppers_on") disarm_timeout = self.getSettingValueByKey("disarm_timeout") retraction_amount = self.getSettingValueByKey("retraction_amount") retraction_speed = self.getSettingValueByKey("retraction_speed") @@ -260,6 +286,8 @@ class PauseAtHeight(Script): display_text = self.getSettingValueByKey("display_text") gcode_before = self.getSettingValueByKey("custom_gcode_before_pause") gcode_after = self.getSettingValueByKey("custom_gcode_after_pause") + beep_at_pause = self.getSettingValueByKey("beep_at_pause") + beep_length = self.getSettingValueByKey("beep_length") pause_method = self.getSettingValueByKey("pause_method") pause_command = { @@ -437,19 +465,26 @@ class PauseAtHeight(Script): prepend_gcode += "M117 " + display_text + "\n" # Set the disarm timeout - if disarm_timeout > 0: - prepend_gcode += self.putValue(M = 18, S = disarm_timeout) + " ; Set the disarm timeout\n" + if hold_steppers_on: + prepend_gcode += self.putValue(M = 84, S = 3600) + " ; Keep steppers engaged for 1h\n" + elif disarm_timeout > 0: + prepend_gcode += self.putValue(M = 84, S = disarm_timeout) + " ; Set the disarm timeout\n" + + # Beep at pause + if beep_at_pause: + prepend_gcode += self.putValue(M = 300, S = 440, P = beep_length) + " ; Beep\n" + # Set a custom GCODE section before pause if gcode_before: - prepend_gcode += gcode_before + "\n" + prepend_gcode += gcode_before.replace(";","\n") + "\n" # Wait till the user continues printing prepend_gcode += pause_command + " ; Do the actual pause\n" # Set a custom GCODE section before pause if gcode_after: - prepend_gcode += gcode_after + "\n" + prepend_gcode += gcode_after.replace(";","\n") + "\n" if pause_method == "repetier": #Push the filament back, diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 15bd6914b5..08a895c9fa 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4785,7 +4785,6 @@ "default_value": 8.0, "minimum_value": "0.0", "maximum_value_warning": "50.0", - "maximum_value": "0.5 * min(machine_width, machine_depth)", "enabled": "(support_enable or support_meshes_present) and support_brim_enable", "settable_per_mesh": false, "settable_per_extruder": true, @@ -4800,7 +4799,6 @@ "default_value": 20, "minimum_value": "0", "maximum_value_warning": "50 / skirt_brim_line_width", - "maximum_value": "0.5 * min(machine_width, machine_depth) / skirt_brim_line_width", "value": "math.ceil(support_brim_width / (skirt_brim_line_width * initial_layer_line_width_factor / 100.0))", "enabled": "(support_enable or support_meshes_present) and support_brim_enable", "settable_per_mesh": false, @@ -5559,10 +5557,11 @@ { "label": "Skirt/Brim Extruder", "description": "The extruder train to use for printing the skirt or brim. This is used in multi-extrusion.", - "type": "extruder", + "type": "optional_extruder", "default_value": "0", "value": "adhesion_extruder_nr", "enabled": "extruders_enabled_count > 1 and (resolveOrValue('adhesion_type') == 'skirt' or resolveOrValue('adhesion_type') == 'brim' or resolveOrValue('prime_tower_brim_enable'))", + "resolve": "'-1' if '-1' in extruderValues('skirt_brim_extruder_nr') else adhesion_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": false }, @@ -5614,9 +5613,9 @@ "maximum_value_warning": "10", "maximum_value": "0.5 * min(machine_width, machine_depth) / skirt_brim_line_width", "enabled": "resolveOrValue('adhesion_type') == 'skirt'", + "limit_to_extruder": "skirt_brim_extruder_nr", "settable_per_mesh": false, - "settable_per_extruder": true, - "limit_to_extruder": "skirt_brim_extruder_nr" + "settable_per_extruder": true }, "skirt_gap": { @@ -5628,9 +5627,9 @@ "minimum_value_warning": "max(extruderValues('machine_nozzle_size'))", "maximum_value_warning": "10", "enabled": "resolveOrValue('adhesion_type') == 'skirt'", + "limit_to_extruder": "skirt_brim_extruder_nr", "settable_per_mesh": false, - "settable_per_extruder": true, - "limit_to_extruder": "skirt_brim_extruder_nr" + "settable_per_extruder": true }, "skirt_brim_minimal_length": { @@ -5643,6 +5642,7 @@ "minimum_value_warning": "25", "maximum_value_warning": "2500", "enabled": "resolveOrValue('adhesion_type') == 'skirt' or resolveOrValue('adhesion_type') == 'brim' or resolveOrValue('prime_tower_brim_enable')", + "limit_to_extruder": "skirt_brim_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -5655,11 +5655,10 @@ "default_value": 8.0, "minimum_value": "0.0", "maximum_value_warning": "50.0", - "maximum_value": "0.5 * min(machine_width, machine_depth)", "enabled": "resolveOrValue('adhesion_type') == 'brim' or resolveOrValue('prime_tower_brim_enable')", + "limit_to_extruder": "skirt_brim_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "skirt_brim_extruder_nr", "children": { "brim_line_count": @@ -5670,12 +5669,11 @@ "default_value": 20, "minimum_value": "0", "maximum_value_warning": "50 / skirt_brim_line_width", - "maximum_value": "0.5 * min(machine_width, machine_depth) / skirt_brim_line_width", "value": "math.ceil(brim_width / (skirt_brim_line_width * initial_layer_line_width_factor / 100.0))", "enabled": "resolveOrValue('adhesion_type') == 'brim' or resolveOrValue('prime_tower_brim_enable')", + "limit_to_extruder": "skirt_brim_extruder_nr", "settable_per_mesh": false, - "settable_per_extruder": true, - "limit_to_extruder": "skirt_brim_extruder_nr" + "settable_per_extruder": true } } }, @@ -5689,9 +5687,9 @@ "minimum_value": "0", "maximum_value_warning": "skirt_brim_line_width", "enabled": "resolveOrValue('adhesion_type') == 'brim'", + "limit_to_extruder": "skirt_brim_extruder_nr", "settable_per_mesh": true, - "settable_per_extruder": true, - "limit_to_extruder": "skirt_brim_extruder_nr" + "settable_per_extruder": true }, "brim_replaces_support": { @@ -5700,9 +5698,9 @@ "type": "bool", "default_value": true, "enabled": "resolveOrValue('adhesion_type') == 'brim' and (support_enable or support_meshes_present)", + "limit_to_extruder": "skirt_brim_extruder_nr", "settable_per_mesh": false, - "settable_per_extruder": true, - "limit_to_extruder": "support_infill_extruder_nr" + "settable_per_extruder": true }, "brim_outside_only": { @@ -5711,9 +5709,22 @@ "type": "bool", "default_value": true, "enabled": "resolveOrValue('adhesion_type') == 'brim'", + "limit_to_extruder": "skirt_brim_extruder_nr", "settable_per_mesh": false, - "settable_per_extruder": true, - "limit_to_extruder": "skirt_brim_extruder_nr" + "settable_per_extruder": true + }, + "brim_inside_margin": + { + "label": "Brim Inside Avoid Margin", + "description": "If brim is only on outside then parts fully enclosed inside another part will get a brim which might overlap with the internal holes of the outer part. This setting controls how far to stay away from those internal holes. Set to a high value to prevent any brim from being generated for parts enclosed within the holes of other parts.", + "unit": "mm", + "type": "float", + "default_value": 5, + "minimum_value": "0", + "enabled": "resolveOrValue('adhesion_type') == 'brim' and any(extruderValues('brim_outside_only'))", + "limit_to_extruder": "skirt_brim_extruder_nr", + "settable_per_mesh": false, + "settable_per_extruder": true }, "raft_margin": { diff --git a/resources/images/cura.png b/resources/images/cura.png Binary files differindex 66b10d5118..ac1677f3f8 100644 --- a/resources/images/cura.png +++ b/resources/images/cura.png diff --git a/resources/images/cura_enterprise.png b/resources/images/cura_enterprise.png Binary files differindex fd5025b67c..4a200a8c6b 100644 --- a/resources/images/cura_enterprise.png +++ b/resources/images/cura_enterprise.png diff --git a/resources/images/cura_wip.png b/resources/images/cura_wip.png Binary files differindex f98957a0b5..5c2c8104cc 100644 --- a/resources/images/cura_wip.png +++ b/resources/images/cura_wip.png diff --git a/resources/themes/cura-light/images/logo.svg b/resources/themes/cura-light/images/logo.svg index 611840e248..63449bb296 100644 --- a/resources/themes/cura-light/images/logo.svg +++ b/resources/themes/cura-light/images/logo.svg @@ -1,18 +1,20 @@ <?xml version="1.0" encoding="utf-8"?> <svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="170.6px" height="23.7px" viewBox="0 0 170.6 23.7"> <g fill="white"> - <!-- U --> <path d="M16.3,3.1v11.1c0,1.2-0.3,2.3-0.8,3.2s-1.3,1.7-2.3,2.3c-1,0.6-2.3,0.8-3.9,0.8c-2.2,0-3.9-0.6-5.1-1.7s-1.7-2.7-1.7-4.6v-11h3.1v10.7c0,1.4,0.3,2.4,0.9,3.1c0.6,0.6,1.6,1,2.9,1c1.3,0,2.3-0.3,2.9-1c0.6-0.7,0.9-1.7,0.9-3V3.1H16.3z" /> - <!-- l --> <path d="M22.6,20.3h-3V2h3V20.3z" /> - <!-- t --> <path d="M30.8,18.1c0.4,0,0.7,0,1.1-0.1c0.4-0.1,0.7-0.2,1-0.3V20c-0.3,0.2-0.7,0.3-1.2,0.4c-0.5,0.1-1,0.1-1.6,0.1c-0.8,0-1.4-0.1-2-0.4s-1.1-0.7-1.4-1.3c-0.4-0.6-0.5-1.5-0.5-2.6V9.5h-1.8V8.2l1.9-1.1l1-2.8h1.9v2.9h3.7v2.3h-3.7v6.7c0,0.6,0.2,1.1,0.5,1.4C29.9,17.9,30.3,18.1,30.8,18.1z" /> - <!-- i --> <path d="M36.3,2.2c0.4,0,0.8,0.1,1.2,0.3C37.8,2.8,38,3.2,38,3.8c0,0.6-0.2,1-0.5,1.2c-0.3,0.2-0.7,0.4-1.2,0.4c-0.5,0-0.9-0.1-1.2-0.4c-0.3-0.2-0.5-0.7-0.5-1.2c0-0.6,0.2-1,0.5-1.2C35.5,2.3,35.8,2.2,36.3,2.2z M37.8,7.2v13h-3v-13H37.8z" /> - <!-- m --> <path d="M55.9,7c1.5,0,2.6,0.4,3.3,1.1c0.7,0.8,1.1,2,1.1,3.6v8.5h-3v-7.9c0-1.9-0.7-2.9-2.2-2.9c-1.1,0-1.8,0.3-2.3,1c-0.4,0.7-0.7,1.7-0.7,3v6.8h-3v-7.9c0-1.9-0.7-2.9-2.2-2.9c-1.1,0-1.9,0.4-2.3,1.2c-0.4,0.8-0.6,1.9-0.6,3.3v6.4h-3v-13h2.3L43.7,9h0.2c0.4-0.7,0.9-1.2,1.6-1.5C46.2,7.2,46.9,7,47.7,7c1,0,1.8,0.2,2.5,0.5c0.7,0.3,1.2,0.8,1.5,1.5h0.2c0.4-0.7,1-1.2,1.7-1.5C54.3,7.2,55.1,7,55.9,7z" /> - <!-- a --> <path d="M68.6,7c1.7,0,3,0.4,3.8,1.1c0.9,0.7,1.3,1.9,1.3,3.4v8.7h-2.1L71,18.5h-0.1c-0.6,0.7-1.2,1.2-1.8,1.5c-0.6,0.3-1.5,0.5-2.5,0.5c-1.2,0-2.1-0.3-2.9-1c-0.8-0.7-1.2-1.7-1.2-3c0-1.3,0.5-2.4,1.5-3c1-0.7,2.5-1,4.5-1.1l2.3-0.1v-0.6c0-0.8-0.2-1.4-0.6-1.8c-0.4-0.4-1-0.5-1.7-0.5c-0.7,0-1.3,0.1-1.9,0.3c-0.6,0.2-1.2,0.4-1.8,0.7l-1-2.1c0.6-0.3,1.4-0.6,2.2-0.8S67.7,7,68.6,7z M70.7,14.1l-1.6,0c-1.3,0-2.2,0.3-2.8,0.7c-0.5,0.4-0.8,1-0.8,1.6c0,0.6,0.2,1.1,0.5,1.3c0.4,0.3,0.8,0.4,1.4,0.4c0.9,0,1.6-0.3,2.2-0.8c0.6-0.5,0.9-1.3,0.9-2.2V14.1z" /> - <!-- k --> <path d="M79.8,2v8.7c0,0.4,0,0.8,0,1.3c0,0.5-0.1,0.9-0.1,1.3h0.1c0.2-0.3,0.4-0.6,0.7-1s0.5-0.7,0.8-1l3.8-4.1h3.4l-5.2,5.6l5.5,7.4h-3.5l-4-5.6l-1.5,1.2v4.3h-3V2H79.8z" /> - <!-- e --> <path d="M95.4,7c1.7,0,3.1,0.5,4.1,1.6c1,1,1.5,2.5,1.5,4.3v1.5h-8.6c0,1.2,0.4,2.1,1,2.7c0.6,0.6,1.5,1,2.6,1c0.8,0,1.6-0.1,2.3-0.3s1.4-0.4,2.1-0.7v2.4c-0.6,0.3-1.3,0.5-2,0.7c-0.7,0.1-1.5,0.2-2.5,0.2c-1.3,0-2.4-0.2-3.4-0.7c-1-0.5-1.7-1.2-2.3-2.2c-0.6-1-0.8-2.2-0.8-3.7c0-2.2,0.5-3.9,1.6-5.1C92.1,7.6,93.6,7,95.4,7z M95.4,9.2c-0.8,0-1.5,0.3-2,0.8c-0.5,0.5-0.8,1.3-0.9,2.3h5.6c0-0.9-0.2-1.6-0.7-2.2C97,9.5,96.3,9.2,95.4,9.2z" /> - <!-- r --> <path d="M110.2,7c0.2,0,0.4,0,0.7,0c0.3,0,0.5,0.1,0.6,0.1l-0.3,2.8c-0.2,0-0.4-0.1-0.6-0.1c-0.2,0-0.4,0-0.6,0c-0.6,0-1.2,0.1-1.8,0.4s-1,0.7-1.4,1.2c-0.3,0.5-0.5,1.2-0.5,2.1v6.7h-3v-13h2.3l0.4,2.3h0.1c0.4-0.7,0.9-1.3,1.6-1.8C108.6,7.3,109.3,7,110.2,7z" /> - <!-- C --> <path d="M127.2,4.1c-1.4,0-2.6,0.3-3.6,0.9c-1,0.6-1.8,1.5-2.3,2.6s-0.8,2.4-0.8,3.9c0,1.5,0.2,2.9,0.7,4c0.5,1.1,1.2,2,2.2,2.6s2.2,0.9,3.6,0.9c0.8,0,1.6-0.1,2.3-0.2c0.7-0.1,1.4-0.3,2-0.5v1.2c-0.6,0.2-1.2,0.4-2,0.5s-1.5,0.2-2.5,0.2c-1.7,0-3.2-0.4-4.3-1.1c-1.2-0.7-2-1.8-2.6-3.1s-0.9-2.9-0.9-4.7c0-1.7,0.3-3.2,1-4.5c0.6-1.3,1.6-2.4,2.8-3.1s2.7-1.1,4.4-1.1c1.7,0,3.2,0.3,4.5,1L131.2,5C129.9,4.4,128.6,4.1,127.2,4.1z" /> - <!-- u --> <path d="M144.6,7.5v12.8h-1.1l-0.2-2.2h-0.1c-0.4,0.7-0.9,1.3-1.6,1.7s-1.6,0.7-2.7,0.7c-3,0-4.5-1.6-4.5-4.7V7.5h1.4v8.3c0,1.2,0.3,2.1,0.8,2.7s1.4,0.9,2.4,0.9c2.8,0,4.2-1.6,4.2-4.9v-7H144.6z" /> - <!-- r --> <path d="M154.1,7.3c0.7,0,1.2,0.1,1.7,0.2l-0.2,1.2c-0.3-0.1-0.5-0.1-0.8-0.1s-0.5,0-0.8,0c-1.2,0-2.1,0.4-2.8,1.3c-0.7,0.9-1,2-1,3.4v7h-1.4V7.5h1.2l0.1,2.4h0.1c0.3-0.7,0.8-1.3,1.5-1.8S153.1,7.3,154.1,7.3z" /> - <!-- a --> <path d="M162.4,7.3c1.4,0,2.5,0.4,3.2,1.1s1.1,1.8,1.1,3.3v8.6h-1l-0.3-2.2h0c-0.4,0.7-1,1.3-1.7,1.7c-0.7,0.4-1.6,0.7-2.8,0.7c-1.2,0-2.2-0.3-2.9-0.9s-1.1-1.5-1.1-2.7c0-1.3,0.5-2.2,1.5-2.9c1-0.7,2.5-1,4.5-1.1l2.3-0.1v-0.9c0-1.3-0.3-2.2-0.8-2.7s-1.2-0.8-2.2-0.8c-0.7,0-1.3,0.1-1.9,0.3c-0.6,0.2-1.2,0.4-1.8,0.7l-0.4-1.1c0.6-0.3,1.2-0.6,2-0.7C160.8,7.4,161.6,7.3,162.4,7.3z M165.3,13.8l-2.2,0.1c-1.6,0.1-2.8,0.3-3.6,0.8c-0.8,0.5-1.2,1.2-1.2,2.2c0,0.8,0.2,1.4,0.7,1.8c0.5,0.4,1.2,0.6,2,0.6c1.3,0,2.4-0.4,3.1-1.1c0.7-0.8,1.1-1.8,1.1-3.2V13.8z" /> -</g> + <path class="cls-1" d="M128.2,4.1c-1.4,0-2.6,.3-3.6,.9s-1.8,1.5-2.3,2.6-.8,2.4-.8,3.9,.2,2.9,.7,4,1.2,2,2.2,2.6,2.2,.9,3.6,.9c.8,0,1.6-.1,2.3-.2s1.4-.3,2-.5v1.2c-.6,.2-1.2,.4-2,.5s-1.5,.2-2.5,.2c-1.7,0-3.2-.4-4.3-1.1-1.2-.7-2-1.8-2.6-3.1s-.9-2.9-.9-4.7c0-1.7,.3-3.2,1-4.5,.6-1.3,1.6-2.4,2.8-3.1s2.7-1.1,4.4-1.1,3.2,.3,4.5,1l-.5,1.4c-1.3-.6-2.6-.9-4-.9Z"/> + <path class="cls-1" d="M145.6,7.5v12.8h-1.1l-.2-2.2h-.1c-.4,.7-.9,1.3-1.6,1.7s-1.6,.7-2.7,.7c-3,0-4.5-1.6-4.5-4.7V7.5h1.4V15.8c0,1.2,.3,2.1,.8,2.7s1.4,.9,2.4,.9c2.8,0,4.2-1.64,4.2-4.9V7.5h1.4Z"/> + <path class="cls-1" d="M155.1,7.3c.7,0,1.2,.1,1.7,.2l-.2,1.2c-.3-.1-.5-.1-.8-.1h-.8c-1.2,0-2.1,.4-2.8,1.3-.7,.9-1,2-1,3.4v7h-1.4V7.5h1.2l.1,2.4h.1c.3-.7,.8-1.3,1.5-1.8s1.4-.8,2.4-.8Z"/> + <path class="cls-1" d="M163.4,7.3c1.4,0,2.5,.4,3.2,1.1,.7,.7,1.1,1.8,1.1,3.3v8.6h-1l-.3-2.2h0c-.4,.7-1,1.3-1.7,1.7-.7,.4-1.6,.7-2.8,.7s-2.2-.3-2.9-.9-1.1-1.5-1.1-2.7c0-1.3,.5-2.2,1.5-2.9s2.5-1,4.5-1.1l2.3-.1v-.9c0-1.3-.3-2.2-.8-2.7s-1.2-.8-2.2-.8c-.7,0-1.3,.1-1.9,.3-.6,.2-1.2,.4-1.8,.7l-.4-1.1c.6-.3,1.2-.6,2-.7,.7-.2,1.5-.3,2.3-.3Zm2.9,6.5l-2.2,.1c-1.6,.1-2.8,.3-3.6,.8s-1.2,1.2-1.2,2.2c0,.8,.2,1.4,.7,1.8s1.2,.6,2,.6c1.3,0,2.4-.4,3.1-1.1,.7-.8,1.1-1.8,1.1-3.2v-1.2h.1Z"/> + + <path class="cls-1" d="M102.39,16.94c-.22-.29-.43-.33-.74-.13-.85,.53-1.89,.88-3.55,.88-1.86,0-2.69-.61-3.03-1.68-.12-.36,.15-.74,.53-.74h6.43c.7,0,1.45-.81,1.45-1.51v-2.65c0-.8-.47-1.58-.98-2.19-.83-1-2.19-1.6-4.43-1.6-5.4,0-6.56,3.06-6.56,6.6s1.12,6.6,6.58,6.6c2.5,0,4.1-.49,5.73-1.72-.48-.62-.96-1.24-1.44-1.86h0Zm-7.49-4.74v-.54c0-.78,.63-1.41,1.4-1.41h2.79c.78,0,1.4,.63,1.4,1.41v1.1h-5.04c-.4,0-.56-.16-.56-.56h0Z"/> + <path class="cls-1" d="M27.32,7.06v9.29c0,2.82,.98,3.98,4.39,3.98,.62,0,1.56,0,2.07-.05v-2.36c0-.4-.16-.56-.56-.56-.27,0-.53,0-.8,0-1.5,0-1.63-.54-1.63-1.52v-4.65c0-.4,.16-.56,.56-.56h1.87c.4,0,.56-.16,.56-.56v-1.87c0-.4-.16-.56-.56-.56h-1.87c-.4,0-.56-.16-.56-.56v-2.79c0-.4-.16-.56-.56-.56h-2.36c-.4,0-.56,.16-.56,.56v2.79Z"/> + <path class="cls-1" d="M17.63,13.95V4.27c0-.4-.16-.56-.56-.56h-2.42c-.4,0-.56,.16-.56,.56V13.48c0,2.55-.65,3.87-3.97,3.87s-3.95-1.41-3.95-3.87V4.27c0-.4-.16-.56-.56-.56H3.06c-.4,0-.56,.16-.56,.56V13.95c0,3.18,.58,6.64,7.56,6.64s7.56-3.47,7.56-6.64h0Z"/> + <path class="cls-1" d="M112.54,10.84c.4,0,.56-.16,.56-.56v-2.13c0-.39-.16-.56-.56-.56-.55,0-1.11,.07-1.63,.25-.69,.24-1.33,.66-1.85,1.17-.08-.32-.17-.64-.25-.96-.08-.31-.23-.42-.54-.42h-1.73c-.4,0-.56,.16-.56,.56v11.53c0,.4,.16,.56,.56,.56h2.94v-6.63c0-1.55,1.26-2.81,2.81-2.81h.24Z"/> + <path class="cls-1" d="M39.85,20.28V8.19c0-.4-.16-.56-.56-.56h-2.36c-.4,0-.56,.16-.56,.56v11.53c0,.4,.16,.56,.56,.56h2.92Z"/> + <path class="cls-1" d="M24.2,20.33V4.27c0-.4-.16-.56-.56-.56h-2.34c-.4,0-.56,.16-.56,.56v15.5c0,.4,.16,.56,.56,.56h2.9Z"/> + <path class="cls-1" d="M38.11,6.45c.97,0,1.76-.79,1.76-1.77s-.79-1.77-1.76-1.77-1.76,.79-1.76,1.77,.79,1.77,1.76,1.77Z"/> + <path class="cls-1" d="M70.35,7.33c-1.55,0-2.96,.32-4.04,.71-.46,.17-.87,.35-1.2,.52-.3,.16-.4,.54-.21,.82,.37,.55,.74,1.1,1.12,1.65,.2,.29,.4,.35,.72,.19,.79-.4,1.95-.79,3.23-.79,1.98,0,2.41,.48,2.48,1.42,.02,.21-.07,.3-.28,.3h-4.11c-2.33,0-4.21,1.89-4.21,4.22v.21c0,2.21,.85,3.91,4.75,3.91h7.23V12.36c0-3.58-.94-5.03-5.49-5.03h0Zm2.12,10.33c-1.29,0-2.59,0-3.88-.01-.78,0-1.4-.63-1.4-1.41v-.28c0-.78,.63-1.41,1.4-1.41h3.32c.4,0,.56,.16,.56,.56v2.55Z"/> + <path class="cls-1" d="M82.64,17.14l1.21-1.44c.16-.19,.32-.18,.45,.03,.91,1.43,1.82,2.86,2.73,4.29,.12,.19,.25,.26,.47,.26h3.57c-1.47-2.38-2.94-4.77-4.41-7.15-.15-.25-.14-.43,.04-.65,1.08-1.31,2.15-2.62,3.23-3.94,.3-.37,.04-.92-.43-.92h-2.36c-.19,0-.31,.06-.43,.2-1.21,1.48-2.43,2.95-3.64,4.43-.21,.26-.5,.15-.5-.18V4.27c0-.4-.16-.56-.56-.56h-2.34c-.4,0-.56,.16-.56,.56v15.45c0,.39,.16,.55,.55,.56h2.91v-2.96c0-.07,.02-.13,.07-.18h0Z"/> + <path class="cls-1" d="M46.93,10.63c1.24,3.1,2.49,6.2,3.73,9.31,.1,.26,.25,.35,.52,.35h2.01c.28,0,.42-.1,.52-.35,1.24-3.1,2.49-6.21,3.73-9.32,.13-.34,.55-.25,.54,.11,0,3,.01,6,.02,8.99,0,.4,.16,.56,.56,.56h3.01V5.11c0-.78-.63-1.41-1.4-1.41h-2.4c-.7,0-1.06,.25-1.31,.9-1.29,3.26-2.58,6.52-3.87,9.78-.12,.3-.38,.3-.51,.01-1.29-3.27-2.58-6.54-3.87-9.81-.25-.64-.61-.89-1.3-.89h-2.42c-.78,0-1.4,.63-1.4,1.41v14.61c0,.4,.16,.56,.56,.56h2.74V10.73c0-.36,.41-.44,.54-.11h0Z"/> + </g> </svg> diff --git a/tests/TestBuildVolume.py b/tests/TestBuildVolume.py index 458b7afad3..5012784bdf 100644 --- a/tests/TestBuildVolume.py +++ b/tests/TestBuildVolume.py @@ -86,12 +86,12 @@ class TestCalculateBedAdhesionSize: ({"adhesion_type": {"value": "skirt"}}, 0), ({"adhesion_type": {"value": "raft"}}, 0), ({"adhesion_type": {"value": "none"}}, 0), - ({"adhesion_type": {"value": "skirt"}, "skirt_line_count": {"value": 2}, "initial_layer_line_width_factor": {"value": 1}, "skirt_brim_line_width": {"value": 2}}, 0.02), + ({"adhesion_type": {"value": "skirt"}, "skirt_line_count": {"value": 2}, "initial_layer_line_width_factor": {"value": 1}, "skirt_brim_line_width": {"value": 2}}, 0), # Even though it's marked as skirt, it should behave as a brim as the prime tower has a brim (skirt line count is still at 0!) - ({"adhesion_type": {"value": "skirt"}, "prime_tower_brim_enable": {"value": True}, "skirt_brim_line_width": {"value": 2}, "initial_layer_line_width_factor": {"value": 3}}, -0.06), + ({"adhesion_type": {"value": "skirt"}, "prime_tower_brim_enable": {"value": True}, "skirt_brim_line_width": {"value": 2}, "initial_layer_line_width_factor": {"value": 3}}, 0), ({"brim_line_count": {"value": 1}, "skirt_brim_line_width": {"value": 2}, "initial_layer_line_width_factor": {"value": 3}}, 0), - ({"brim_line_count": {"value": 2}, "skirt_brim_line_width": {"value": 2}, "initial_layer_line_width_factor": {"value": 3}}, 0.06), - ({"brim_line_count": {"value": 9000000}, "skirt_brim_line_width": {"value": 90000}, "initial_layer_line_width_factor": {"value": 9000}}, 100), # Clamped at half the max size of buildplate + ({"brim_line_count": {"value": 2}, "skirt_brim_line_width": {"value": 2}, "initial_layer_line_width_factor": {"value": 3}}, 0), + ({"brim_line_count": {"value": 9000000}, "skirt_brim_line_width": {"value": 90000}, "initial_layer_line_width_factor": {"value": 9000}}, 0), # Clamped at half the max size of buildplate ]) def test_singleExtruder(self, build_volume: BuildVolume, setting_dict, result): self.createAndSetGlobalStack(build_volume) @@ -106,14 +106,6 @@ class TestCalculateBedAdhesionSize: with patch.dict(self.setting_property_dict, patched_dictionary): assert build_volume._calculateBedAdhesionSize([]) == result - def test_unknownBedAdhesion(self, build_volume: BuildVolume): - self.createAndSetGlobalStack(build_volume) - patched_dictionary = self.setting_property_dict.copy() - patched_dictionary.update({"adhesion_type": {"value": "OMGZOMGBBQ"}}) - with patch.dict(self.setting_property_dict, patched_dictionary): - with pytest.raises(Exception): - build_volume._calculateBedAdhesionSize([]) - class TestComputeDisallowedAreasStatic: setting_property_dict = {"machine_disallowed_areas": {"value": [[[-200, 112.5], [ -82, 112.5], [ -84, 102.5], [-115, 102.5]]]}, "machine_width": {"value": 200}, |