diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index fe607915c1..776d92a1f6 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -565,8 +565,8 @@ class BuildVolume(SceneNode): self._updateScaleFactor() self._volume_aabb = AxisAlignedBox( - minimum = Vector(min_w, min_h - 1.0, min_d).scale(self._scale_vector), - maximum = Vector(max_w, max_h - self._raft_thickness - self._extra_z_clearance, max_d).scale(self._scale_vector) + minimum = Vector(min_w, min_h - 1.0, min_d), + maximum = Vector(max_w, max_h - self._raft_thickness - self._extra_z_clearance, max_d) ) bed_adhesion_size = self.getEdgeDisallowedSize() @@ -575,8 +575,8 @@ class BuildVolume(SceneNode): # This is probably wrong in all other cases. TODO! # The +1 and -1 is added as there is always a bit of extra room required to work properly. scale_to_max_bounds = AxisAlignedBox( - minimum = Vector(min_w + bed_adhesion_size + 1, min_h, min_d + self._disallowed_area_size - bed_adhesion_size + 1).scale(self._scale_vector), - maximum = Vector(max_w - bed_adhesion_size - 1, max_h - self._raft_thickness - self._extra_z_clearance, max_d - self._disallowed_area_size + bed_adhesion_size - 1).scale(self._scale_vector) + minimum = Vector(min_w + bed_adhesion_size + 1, min_h, min_d + self._disallowed_area_size - bed_adhesion_size + 1), + maximum = Vector(max_w - bed_adhesion_size - 1, max_h - self._raft_thickness - self._extra_z_clearance, max_d - self._disallowed_area_size + bed_adhesion_size - 1) ) self._application.getController().getScene()._maximum_bounds = scale_to_max_bounds # type: ignore @@ -645,7 +645,7 @@ class BuildVolume(SceneNode): for extruder in extruders: extruder.propertyChanged.connect(self._onSettingPropertyChanged) - self._width = self._global_container_stack.getProperty("machine_width", "value") * self._scale_vector.x + self._width = self._global_container_stack.getProperty("machine_width", "value") machine_height = self._global_container_stack.getProperty("machine_height", "value") if self._global_container_stack.getProperty("print_sequence", "value") == "one_at_a_time" and len(self._scene_objects) > 1: self._height = min(self._global_container_stack.getProperty("gantry_height", "value") * self._scale_vector.z, machine_height) @@ -656,7 +656,7 @@ class BuildVolume(SceneNode): else: self._height = self._global_container_stack.getProperty("machine_height", "value") self._build_volume_message.hide() - self._depth = self._global_container_stack.getProperty("machine_depth", "value") * self._scale_vector.y + self._depth = self._global_container_stack.getProperty("machine_depth", "value") self._shape = self._global_container_stack.getProperty("machine_shape", "value") self._updateDisallowedAreas() @@ -752,8 +752,8 @@ class BuildVolume(SceneNode): return self._updateScaleFactor() self._height = self._global_container_stack.getProperty("machine_height", "value") * self._scale_vector.z - self._width = self._global_container_stack.getProperty("machine_width", "value") * self._scale_vector.x - self._depth = self._global_container_stack.getProperty("machine_depth", "value") * self._scale_vector.y + self._width = self._global_container_stack.getProperty("machine_width", "value") + self._depth = self._global_container_stack.getProperty("machine_depth", "value") self._shape = self._global_container_stack.getProperty("machine_shape", "value") def _updateDisallowedAreasAndRebuild(self): @@ -770,14 +770,6 @@ class BuildVolume(SceneNode): self._extra_z_clearance = self._calculateExtraZClearance(ExtruderManager.getInstance().getUsedExtruderStacks()) self.rebuild() - def _scaleAreas(self, result_areas: List[Polygon]) -> None: - if self._global_container_stack is None: - return - for i, polygon in enumerate(result_areas): - result_areas[i] = polygon.scale( - 100.0 / max(100.0, self._global_container_stack.getProperty("material_shrinkage_percentage_xy", "value")) - ) - def _updateDisallowedAreas(self) -> None: if not self._global_container_stack: return @@ -833,11 +825,9 @@ class BuildVolume(SceneNode): self._disallowed_areas = [] for extruder_id in result_areas: - self._scaleAreas(result_areas[extruder_id]) self._disallowed_areas.extend(result_areas[extruder_id]) self._disallowed_areas_no_brim = [] for extruder_id in result_areas_no_brim: - self._scaleAreas(result_areas_no_brim[extruder_id]) self._disallowed_areas_no_brim.extend(result_areas_no_brim[extruder_id]) def _computeDisallowedAreasPrinted(self, used_extruders): @@ -993,6 +983,9 @@ class BuildVolume(SceneNode): half_machine_width = self._global_container_stack.getProperty("machine_width", "value") / 2 half_machine_depth = self._global_container_stack.getProperty("machine_depth", "value") / 2 + # We need at a minimum a very small border around the edge so that models can't go off the build plate + border_size = max(border_size, 0.1) + if self._shape != "elliptic": if border_size - left_unreachable_border > 0: result[extruder_id].append(Polygon(numpy.array([ diff --git a/plugins/3MFWriter/ThreeMFWriter.py b/plugins/3MFWriter/ThreeMFWriter.py index c507703823..57c667145e 100644 --- a/plugins/3MFWriter/ThreeMFWriter.py +++ b/plugins/3MFWriter/ThreeMFWriter.py @@ -12,6 +12,8 @@ from UM.Application import Application from UM.Message import Message from UM.Resources import Resources from UM.Scene.SceneNode import SceneNode +from UM.Settings.ContainerRegistry import ContainerRegistry +from UM.Settings.EmptyInstanceContainer import EmptyInstanceContainer from cura.CuraApplication import CuraApplication from cura.CuraPackageManager import CuraPackageManager @@ -268,6 +270,10 @@ class ThreeMFWriter(MeshWriter): # Don't export materials not in use continue + if isinstance(extruder.material, type(ContainerRegistry.getInstance().getEmptyInstanceContainer())): + # This is an empty material container, no material to export + continue + if package_manager.isMaterialBundled(extruder.material.getFileName(), extruder.material.getMetaDataEntry("GUID")): # Don't export bundled materials continue @@ -275,14 +281,9 @@ class ThreeMFWriter(MeshWriter): package_id = package_manager.getMaterialFilePackageId(extruder.material.getFileName(), extruder.material.getMetaDataEntry("GUID")) package_data = package_manager.getInstalledPackageInfo(package_id) + # We failed to find the package for this material if not package_data: - # We failed to find the package for this material - - message = Message(catalog.i18nc("@error:material", - "It was not possible to store material package information in project file: {material}. This project may not open correctly on other systems.".format(material=extruder.getName())), - title=catalog.i18nc("@info:title", "Failed to save material package information"), - message_type=Message.MessageType.WARNING) - message.show() + Logger.info(f"Could not find package for material in extruder {extruder.id}, skipping.") continue material_metadata = {"id": package_id, diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index c34216572d..872101154c 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -8053,6 +8053,7 @@ "description": "Remove inside corners from the raft, causing the raft to become convex.", "type": "bool", "default_value": false, + "resolve": "any(extruderValues('raft_remove_inside_corners'))", "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, "settable_per_extruder": false