mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-08-20 04:29:16 +08:00
Merge branch 'master' of https://github.com/Ultimaker/Cura
This commit is contained in:
commit
9d7ce210b3
@ -287,5 +287,5 @@ class ConvexHullDecorator(SceneNodeDecorator):
|
|||||||
|
|
||||||
_affected_settings = [
|
_affected_settings = [
|
||||||
"adhesion_type", "raft_base_thickness", "raft_interface_thickness", "raft_surface_layers",
|
"adhesion_type", "raft_base_thickness", "raft_interface_thickness", "raft_surface_layers",
|
||||||
"raft_surface_thickness", "raft_airgap", "print_sequence",
|
"raft_surface_thickness", "raft_airgap", "raft_margin", "print_sequence",
|
||||||
"skirt_gap", "skirt_line_count", "skirt_brim_line_width", "skirt_distance"]
|
"skirt_gap", "skirt_line_count", "skirt_brim_line_width", "skirt_distance"]
|
||||||
|
@ -203,7 +203,7 @@ class CuraApplication(QtApplication):
|
|||||||
"dialog_profile_path",
|
"dialog_profile_path",
|
||||||
"dialog_material_path"]:
|
"dialog_material_path"]:
|
||||||
|
|
||||||
Preferences.getInstance().addPreference("local_file/%s" % key, "~/")
|
Preferences.getInstance().addPreference("local_file/%s" % key, os.path.expanduser("~/"))
|
||||||
|
|
||||||
Preferences.getInstance().setDefault("local_file/last_used_type", "text/x-gcode")
|
Preferences.getInstance().setDefault("local_file/last_used_type", "text/x-gcode")
|
||||||
|
|
||||||
@ -346,6 +346,7 @@ class CuraApplication(QtApplication):
|
|||||||
@pyqtSlot(str, result = QUrl)
|
@pyqtSlot(str, result = QUrl)
|
||||||
def getDefaultPath(self, key):
|
def getDefaultPath(self, key):
|
||||||
default_path = Preferences.getInstance().getValue("local_file/%s" % key)
|
default_path = Preferences.getInstance().getValue("local_file/%s" % key)
|
||||||
|
print(default_path)
|
||||||
return QUrl.fromLocalFile(default_path)
|
return QUrl.fromLocalFile(default_path)
|
||||||
|
|
||||||
@pyqtSlot(str, str)
|
@pyqtSlot(str, str)
|
||||||
@ -896,4 +897,4 @@ class CuraApplication(QtApplication):
|
|||||||
self._additional_components[area_id] = []
|
self._additional_components[area_id] = []
|
||||||
self._additional_components[area_id].append(component)
|
self._additional_components[area_id].append(component)
|
||||||
|
|
||||||
self.additionalComponentsChanged.emit(area_id)
|
self.additionalComponentsChanged.emit(area_id)
|
||||||
|
@ -244,6 +244,7 @@ class ContainerManager(QObject):
|
|||||||
if not type_name or entry["type"] == type_name:
|
if not type_name or entry["type"] == type_name:
|
||||||
filters.append(filter_string)
|
filters.append(filter_string)
|
||||||
|
|
||||||
|
filters.append("All Files (*)")
|
||||||
return filters
|
return filters
|
||||||
|
|
||||||
## Export a container to a file
|
## Export a container to a file
|
||||||
@ -280,6 +281,9 @@ class ContainerManager(QObject):
|
|||||||
return { "status": "error", "message": "Container not found"}
|
return { "status": "error", "message": "Container not found"}
|
||||||
container = containers[0]
|
container = containers[0]
|
||||||
|
|
||||||
|
if UM.Platform.isOSX() and "." in file_url:
|
||||||
|
file_url = file_url[:file_url.rfind(".")]
|
||||||
|
|
||||||
for suffix in mime_type.suffixes:
|
for suffix in mime_type.suffixes:
|
||||||
if file_url.endswith(suffix):
|
if file_url.endswith(suffix):
|
||||||
break
|
break
|
||||||
@ -301,7 +305,7 @@ class ContainerManager(QObject):
|
|||||||
with UM.SaveFile(file_url, "w") as f:
|
with UM.SaveFile(file_url, "w") as f:
|
||||||
f.write(contents)
|
f.write(contents)
|
||||||
|
|
||||||
return { "status": "success", "message": "Succesfully exported container"}
|
return { "status": "success", "message": "Succesfully exported container", "path": file_url}
|
||||||
|
|
||||||
## Imports a profile from a file
|
## Imports a profile from a file
|
||||||
#
|
#
|
||||||
@ -371,11 +375,20 @@ class ContainerManager(QObject):
|
|||||||
"container": container_type
|
"container": container_type
|
||||||
}
|
}
|
||||||
|
|
||||||
suffix_list = "*." + mime_type.preferredSuffix
|
suffix = mime_type.preferredSuffix
|
||||||
|
if UM.Platform.isOSX() and "." in suffix:
|
||||||
|
# OSX's File dialog is stupid and does not allow selecting files with a . in its name
|
||||||
|
suffix = suffix[suffix.index(".") + 1:]
|
||||||
|
|
||||||
|
suffix_list = "*." + suffix
|
||||||
for suffix in mime_type.suffixes:
|
for suffix in mime_type.suffixes:
|
||||||
if suffix == mime_type.preferredSuffix:
|
if suffix == mime_type.preferredSuffix:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
if UM.Platform.isOSX() and "." in suffix:
|
||||||
|
# OSX's File dialog is stupid and does not allow selecting files with a . in its name
|
||||||
|
suffix = suffix[suffix.index("."):]
|
||||||
|
|
||||||
suffix_list += ", *." + suffix
|
suffix_list += ", *." + suffix
|
||||||
|
|
||||||
name_filter = "{0} ({1})".format(mime_type.comment, suffix_list)
|
name_filter = "{0} ({1})".format(mime_type.comment, suffix_list)
|
||||||
|
@ -75,6 +75,7 @@ class SettingOverrideDecorator(SceneNodeDecorator):
|
|||||||
# \param extruder_stack_id The new extruder stack to print with.
|
# \param extruder_stack_id The new extruder stack to print with.
|
||||||
def setActiveExtruder(self, extruder_stack_id):
|
def setActiveExtruder(self, extruder_stack_id):
|
||||||
self._extruder_stack = extruder_stack_id
|
self._extruder_stack = extruder_stack_id
|
||||||
|
self._updateNextStack()
|
||||||
self.activeExtruderChanged.emit()
|
self.activeExtruderChanged.emit()
|
||||||
|
|
||||||
def getStack(self):
|
def getStack(self):
|
||||||
|
@ -13,9 +13,11 @@ from UM.Resources import Resources
|
|||||||
from UM.Settings.Validator import ValidatorState #To find if a setting is in an error state. We can't slice then.
|
from UM.Settings.Validator import ValidatorState #To find if a setting is in an error state. We can't slice then.
|
||||||
from UM.Platform import Platform
|
from UM.Platform import Platform
|
||||||
|
|
||||||
|
|
||||||
import cura.Settings
|
import cura.Settings
|
||||||
|
|
||||||
from cura.OneAtATimeIterator import OneAtATimeIterator
|
from cura.OneAtATimeIterator import OneAtATimeIterator
|
||||||
|
from cura.Settings.ExtruderManager import ExtruderManager
|
||||||
from . import ProcessSlicedLayersJob
|
from . import ProcessSlicedLayersJob
|
||||||
from . import ProcessGCodeJob
|
from . import ProcessGCodeJob
|
||||||
from . import StartSliceJob
|
from . import StartSliceJob
|
||||||
@ -391,22 +393,35 @@ class CuraEngineBackend(Backend):
|
|||||||
if self._global_container_stack:
|
if self._global_container_stack:
|
||||||
self._global_container_stack.propertyChanged.disconnect(self._onSettingChanged)
|
self._global_container_stack.propertyChanged.disconnect(self._onSettingChanged)
|
||||||
self._global_container_stack.containersChanged.disconnect(self._onChanged)
|
self._global_container_stack.containersChanged.disconnect(self._onChanged)
|
||||||
|
extruders = list(ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId()))
|
||||||
|
if extruders:
|
||||||
|
for extruder in extruders:
|
||||||
|
extruder.propertyChanged.disconnect(self._onSettingChanged)
|
||||||
|
|
||||||
self._global_container_stack = Application.getInstance().getGlobalContainerStack()
|
self._global_container_stack = Application.getInstance().getGlobalContainerStack()
|
||||||
|
|
||||||
if self._global_container_stack:
|
if self._global_container_stack:
|
||||||
self._global_container_stack.propertyChanged.connect(self._onSettingChanged) #Note: Only starts slicing when the value changed.
|
self._global_container_stack.propertyChanged.connect(self._onSettingChanged) #Note: Only starts slicing when the value changed.
|
||||||
self._global_container_stack.containersChanged.connect(self._onChanged)
|
self._global_container_stack.containersChanged.connect(self._onChanged)
|
||||||
|
extruders = list(ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId()))
|
||||||
|
if extruders:
|
||||||
|
for extruder in extruders:
|
||||||
|
extruder.propertyChanged.connect(self._onSettingChanged)
|
||||||
self._onActiveExtruderChanged()
|
self._onActiveExtruderChanged()
|
||||||
self._onChanged()
|
self._onChanged()
|
||||||
|
|
||||||
def _onActiveExtruderChanged(self):
|
def _onActiveExtruderChanged(self):
|
||||||
|
if self._global_container_stack:
|
||||||
|
# Connect all extruders of the active machine. This might cause a few connects that have already happend,
|
||||||
|
# but that shouldn't cause issues as only new / unique connections are added.
|
||||||
|
extruders = list(ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId()))
|
||||||
|
if extruders:
|
||||||
|
for extruder in extruders:
|
||||||
|
extruder.propertyChanged.connect(self._onSettingChanged)
|
||||||
if self._active_extruder_stack:
|
if self._active_extruder_stack:
|
||||||
self._active_extruder_stack.propertyChanged.disconnect(self._onSettingChanged)
|
|
||||||
self._active_extruder_stack.containersChanged.disconnect(self._onChanged)
|
self._active_extruder_stack.containersChanged.disconnect(self._onChanged)
|
||||||
|
|
||||||
self._active_extruder_stack = cura.Settings.ExtruderManager.getInstance().getActiveExtruderStack()
|
self._active_extruder_stack = cura.Settings.ExtruderManager.getInstance().getActiveExtruderStack()
|
||||||
if self._active_extruder_stack:
|
if self._active_extruder_stack:
|
||||||
self._active_extruder_stack.propertyChanged.connect(self._onSettingChanged) # Note: Only starts slicing when the value changed.
|
|
||||||
self._active_extruder_stack.containersChanged.connect(self._onChanged)
|
self._active_extruder_stack.containersChanged.connect(self._onChanged)
|
||||||
|
|
||||||
|
@ -211,7 +211,9 @@ class StartSliceJob(Job):
|
|||||||
|
|
||||||
def _handlePerObjectSettings(self, node, message):
|
def _handlePerObjectSettings(self, node, message):
|
||||||
stack = node.callDecoration("getStack")
|
stack = node.callDecoration("getStack")
|
||||||
if stack:
|
# Check if the node has a stack attached to it and the stack has any settings in the top container.
|
||||||
|
if stack and stack.getTop().getAllKeys():
|
||||||
|
# Because we want to use inheritance correctly, we send all settings as seen from the per object stack.
|
||||||
for key in stack.getAllKeys():
|
for key in stack.getAllKeys():
|
||||||
setting = message.addRepeatedMessage("settings")
|
setting = message.addRepeatedMessage("settings")
|
||||||
setting.name = key
|
setting.name = key
|
||||||
|
@ -1511,14 +1511,44 @@
|
|||||||
},
|
},
|
||||||
"speed_layer_0": {
|
"speed_layer_0": {
|
||||||
"label": "Initial Layer Speed",
|
"label": "Initial Layer Speed",
|
||||||
"description": "The print speed for the initial layer. A lower value is advised to improve adhesion to the build plate.",
|
"description": "The speed for the initial layer. A lower value is advised to improve adhesion to the build plate.",
|
||||||
"unit": "mm/s",
|
"unit": "mm/s",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default_value": 30,
|
"default_value": 30,
|
||||||
"minimum_value": "0.1",
|
"minimum_value": "0.1",
|
||||||
"maximum_value": "299792458000",
|
"maximum_value": "299792458000",
|
||||||
"maximum_value_warning": "300",
|
"maximum_value_warning": "300",
|
||||||
"settable_per_mesh": true
|
"settable_per_mesh": true,
|
||||||
|
"children":
|
||||||
|
{
|
||||||
|
"speed_print_layer_0":
|
||||||
|
{
|
||||||
|
"label": "Initial Layer Print Speed",
|
||||||
|
"description": "The speed of printing for the initial layer. A lower value is advised to improve adhesion to the build plate.",
|
||||||
|
"unit": "mm/s",
|
||||||
|
"type": "float",
|
||||||
|
"default_value": 30,
|
||||||
|
"value": "speed_layer_0",
|
||||||
|
"minimum_value": "0.1",
|
||||||
|
"maximum_value": "299792458000",
|
||||||
|
"maximum_value_warning": "300",
|
||||||
|
"settable_per_mesh": true
|
||||||
|
},
|
||||||
|
"speed_travel_layer_0":
|
||||||
|
{
|
||||||
|
"label": "Initial Layer Travel Speed",
|
||||||
|
"description": "The speed of travel moves in the initial layer. A lower value is advised to prevent pulling previously printed parts away from the build plate.",
|
||||||
|
"unit": "mm/s",
|
||||||
|
"type": "float",
|
||||||
|
"default_value": 60,
|
||||||
|
"value": "speed_layer_0 * speed_travel / speed_print",
|
||||||
|
"minimum_value": "0.1",
|
||||||
|
"maximum_value": "299792458000",
|
||||||
|
"maximum_value_warning": "300",
|
||||||
|
"settable_per_mesh": true,
|
||||||
|
"settable_per_extruder": true
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"skirt_brim_speed": {
|
"skirt_brim_speed": {
|
||||||
"label": "Skirt/Brim Speed",
|
"label": "Skirt/Brim Speed",
|
||||||
@ -1546,8 +1576,8 @@
|
|||||||
"settable_per_mesh": false,
|
"settable_per_mesh": false,
|
||||||
"settable_per_extruder": false
|
"settable_per_extruder": false
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
"acceleration_enabled": {
|
"acceleration_enabled": {
|
||||||
"label": "Enable Acceleration Control",
|
"label": "Enable Acceleration Control",
|
||||||
"description": "Enables adjusting the print head acceleration. Increasing the accelerations can reduce printing time at the cost of print quality.",
|
"description": "Enables adjusting the print head acceleration. Increasing the accelerations can reduce printing time at the cost of print quality.",
|
||||||
@ -1734,8 +1764,8 @@
|
|||||||
"settable_per_mesh": false
|
"settable_per_mesh": false
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
"jerk_enabled": {
|
"jerk_enabled": {
|
||||||
"label": "Enable Jerk Control",
|
"label": "Enable Jerk Control",
|
||||||
"description": "Enables adjusting the jerk of print head when the velocity in the X or Y axis changes. Increasing the jerk can reduce printing time at the cost of print quality.",
|
"description": "Enables adjusting the jerk of print head when the velocity in the X or Y axis changes. Increasing the jerk can reduce printing time at the cost of print quality.",
|
||||||
|
@ -255,7 +255,7 @@ UM.ManagementPage
|
|||||||
else if(result.status == "success")
|
else if(result.status == "success")
|
||||||
{
|
{
|
||||||
messageDialog.icon = StandardIcon.Information
|
messageDialog.icon = StandardIcon.Information
|
||||||
messageDialog.text = catalog.i18nc("@info:status", "Successfully exported material to <filename>%1</filename>").arg(fileUrl)
|
messageDialog.text = catalog.i18nc("@info:status", "Successfully exported material to <filename>%1</filename>").arg(result.path)
|
||||||
messageDialog.open()
|
messageDialog.open()
|
||||||
}
|
}
|
||||||
CuraApplication.setDefaultPath("dialog_material_path", folder)
|
CuraApplication.setDefaultPath("dialog_material_path", folder)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user