Merge branch 'master' into cura-1811

This commit is contained in:
Jack Ha 2016-07-13 11:15:16 +02:00
commit ecbc387020
11 changed files with 315 additions and 111 deletions

View File

@ -126,6 +126,7 @@ class CuraApplication(QtApplication):
)
self._machine_action_manager = MachineActionManager.MachineActionManager()
self._machine_manager = None # This is initialized on demand.
super().__init__(name = "cura", version = CuraVersion, buildtype = CuraBuildType)
@ -399,8 +400,7 @@ class CuraApplication(QtApplication):
# Initialise extruder so as to listen to global container stack changes before the first global container stack is set.
cura.Settings.ExtruderManager.getInstance()
qmlRegisterSingletonType(cura.Settings.MachineManager, "Cura", 1, 0, "MachineManager",
cura.Settings.MachineManager.createMachineManager)
qmlRegisterSingletonType(cura.Settings.MachineManager, "Cura", 1, 0, "MachineManager", self.getMachineManager)
qmlRegisterSingletonType(MachineActionManager.MachineActionManager, "Cura", 1, 0, "MachineActionManager", self.getMachineActionManager)
self.setMainQml(Resources.getPath(self.ResourceTypes.QmlFiles, "Cura.qml"))
@ -419,6 +419,11 @@ class CuraApplication(QtApplication):
self.exec_()
def getMachineManager(self, *args):
if self._machine_manager is None:
self._machine_manager = cura.Settings.MachineManager.createMachineManager()
return self._machine_manager
## Get the machine action manager
# We ignore any *args given to this, as we also register the machine manager as qml singleton.
# It wants to give this function an engine and script engine, but we don't care about that.

View File

@ -12,6 +12,6 @@ class ProfileReader(PluginObject):
## Read profile data from a file and return a filled profile.
#
# \return \type{Profile} The profile that was obtained from the file.
# \return \type{Profile|Profile[]} The profile that was obtained from the file or a list of Profiles.
def read(self, file_name):
raise NotImplementedError("Profile reader plug-in was not correctly implemented. The read function was not implemented.")

View File

@ -133,32 +133,45 @@ class CuraContainerRegistry(ContainerRegistry):
for plugin_id, meta_data in self._getIOPlugins("profile_reader"):
profile_reader = plugin_registry.getPluginObject(plugin_id)
try:
profile = profile_reader.read(file_name) #Try to open the file with the profile reader.
profile_or_list = profile_reader.read(file_name) # Try to open the file with the profile reader.
except Exception as e:
#Note that this will fail quickly. That is, if any profile reader throws an exception, it will stop reading. It will only continue reading if the reader returned None.
Logger.log("e", "Failed to import profile from %s: %s", file_name, str(e))
return { "status": "error", "message": catalog.i18nc("@info:status", "Failed to import profile from <filename>{0}</filename>: <message>{1}</message>", file_name, str(e))}
if profile: #Success!
profile.setReadOnly(False)
new_name = self.createUniqueName("quality", "", os.path.splitext(os.path.basename(file_name))[0],
catalog.i18nc("@label", "Custom profile"))
profile.setName(new_name)
profile._id = new_name
if self._machineHasOwnQualities():
profile.setDefinition(self._activeDefinition())
if self._machineHasOwnMaterials():
profile.addMetaDataEntry("material", self._activeMaterialId())
if profile_or_list: # Success!
name_seed = os.path.splitext(os.path.basename(file_name))[0]
if type(profile_or_list) is not list:
profile = profile_or_list
self._configureProfile(profile, name_seed)
return { "status": "ok", "message": catalog.i18nc("@info:status", "Successfully imported profile {0}", profile.getName()) }
else:
profile.setDefinition(ContainerRegistry.getInstance().findDefinitionContainers(id="fdmprinter")[0])
ContainerRegistry.getInstance().addContainer(profile)
for profile in profile_or_list:
self._configureProfile(profile, name_seed)
return { "status": "ok", "message": catalog.i18nc("@info:status", "Successfully imported profile {0}", profile.getName()) }
if len(profile_or_list) == 1:
return {"status": "ok", "message": catalog.i18nc("@info:status", "Successfully imported profile {0}", profile_or_list[0].getName())}
else:
profile_names = ", ".join([profile.getName() for profile in profile_or_list])
return { "status": "ok", "message": catalog.i18nc("@info:status", "Successfully imported profiles {0}", profile_names) }
#If it hasn't returned by now, none of the plugins loaded the profile successfully.
return { "status": "error", "message": catalog.i18nc("@info:status", "Profile {0} has an unknown file type.", file_name)}
def _configureProfile(self, profile, name_seed):
profile.setReadOnly(False)
new_name = self.createUniqueName("quality", "", name_seed, catalog.i18nc("@label", "Custom profile"))
profile.setName(new_name)
profile._id = new_name
if self._machineHasOwnQualities():
profile.setDefinition(self._activeDefinition())
if self._machineHasOwnMaterials():
profile.addMetaDataEntry("material", self._activeMaterialId())
else:
profile.setDefinition(ContainerRegistry.getInstance().findDefinitionContainers(id="fdmprinter")[0])
ContainerRegistry.getInstance().addContainer(profile)
## Gets a list of profile writer plugins
# \return List of tuples of (plugin_id, meta_data).
def _getIOPlugins(self, io_type):

View File

@ -95,21 +95,21 @@ class ExtruderManager(QObject):
container_registry = UM.Settings.ContainerRegistry.getInstance()
if container_registry:
#Add the extruder trains that don't exist yet.
# Add the extruder trains that don't exist yet.
for extruder_definition in container_registry.findDefinitionContainers(machine = machine_definition.getId()):
position = extruder_definition.getMetaDataEntry("position", None)
if not position:
UM.Logger.log("w", "Extruder definition %s specifies no position metadata entry.", extruder_definition.getId())
if not container_registry.findContainerStacks(machine = machine_id, position = position): #Doesn't exist yet.
if not container_registry.findContainerStacks(machine = machine_id, position = position): # Doesn't exist yet.
self.createExtruderTrain(extruder_definition, machine_definition, position)
changed = True
#Gets the extruder trains that we just created as well as any that still existed.
# Gets the extruder trains that we just created as well as any that still existed.
extruder_trains = container_registry.findContainerStacks(type = "extruder_train", machine = machine_definition.getId())
for extruder_train in extruder_trains:
self._extruder_trains[machine_id][extruder_train.getMetaDataEntry("position")] = extruder_train
#Ensure that the extruder train stacks are linked to global stack.
# Ensure that the extruder train stacks are linked to global stack.
extruder_train.setNextStack(UM.Application.getInstance().getGlobalContainerStack())
changed = True
@ -124,30 +124,27 @@ class ExtruderManager(QObject):
#
# The resulting container stack is added to the registry.
#
# \param extruder_definition The extruder to create the extruder train
# for.
# \param machine_definition The machine that the extruder train belongs
# to.
# \param position The position of this extruder train in the extruder
# slots of the machine.
# \param extruder_definition The extruder to create the extruder train for.
# \param machine_definition The machine that the extruder train belongs to.
# \param position The position of this extruder train in the extruder slots of the machine.
def createExtruderTrain(self, extruder_definition, machine_definition, position):
#Cache some things.
# Cache some things.
container_registry = UM.Settings.ContainerRegistry.getInstance()
machine_id = machine_definition.getId()
#Create a container stack for this extruder.
# Create a container stack for this extruder.
extruder_stack_id = container_registry.uniqueName(extruder_definition.getId())
container_stack = UM.Settings.ContainerStack(extruder_stack_id)
container_stack.setName(extruder_definition.getName()) #Take over the display name to display the stack with.
container_stack.setName(extruder_definition.getName()) # Take over the display name to display the stack with.
container_stack.addMetaDataEntry("type", "extruder_train")
container_stack.addMetaDataEntry("machine", machine_definition.getId())
container_stack.addMetaDataEntry("position", position)
container_stack.addContainer(extruder_definition)
#Find the variant to use for this extruder.
variant = container_registry.getEmptyInstanceContainer()
# Find the variant to use for this extruder.
variant = container_registry.findInstanceContainers(id = "empty_variant")[0]
if machine_definition.getMetaDataEntry("has_variants"):
#First add any variant. Later, overwrite with preference if the preference is valid.
# First add any variant. Later, overwrite with preference if the preference is valid.
variants = container_registry.findInstanceContainers(definition = machine_id, type = "variant")
if len(variants) >= 1:
variant = variants[0]
@ -158,13 +155,13 @@ class ExtruderManager(QObject):
variant = preferred_variants[0]
else:
UM.Logger.log("w", "The preferred variant \"%s\" of machine %s doesn't exist or is not a variant profile.", preferred_variant_id, machine_id)
#And leave it at the default variant.
# And leave it at the default variant.
container_stack.addContainer(variant)
#Find a material to use for this variant.
material = container_registry.getEmptyInstanceContainer()
# Find a material to use for this variant.
material = container_registry.findInstanceContainers(id = "empty_material")[0]
if machine_definition.getMetaDataEntry("has_materials"):
#First add any material. Later, overwrite with preference if the preference is valid.
# First add any material. Later, overwrite with preference if the preference is valid.
if machine_definition.getMetaDataEntry("has_variant_materials", default = "False") == "True":
materials = container_registry.findInstanceContainers(type = "material", definition = machine_id, variant = variant.getId())
else:
@ -187,13 +184,13 @@ class ExtruderManager(QObject):
material = preferred_materials[0]
else:
UM.Logger.log("w", "The preferred material \"%s\" of machine %s doesn't exist or is not a material profile.", preferred_material_id, machine_id)
#And leave it at the default material.
# And leave it at the default material.
container_stack.addContainer(material)
#Find a quality to use for this extruder.
# Find a quality to use for this extruder.
quality = container_registry.getEmptyInstanceContainer()
#First add any quality. Later, overwrite with preference if the preference is valid.
# First add any quality. Later, overwrite with preference if the preference is valid.
qualities = container_registry.findInstanceContainers(type = "quality")
if len(qualities) >= 1:
quality = qualities[0]
@ -204,15 +201,16 @@ class ExtruderManager(QObject):
quality = preferred_quality[0]
else:
UM.Logger.log("w", "The preferred quality \"%s\" of machine %s doesn't exist or is not a quality profile.", preferred_quality_id, machine_id)
#And leave it at the default quality.
# And leave it at the default quality.
container_stack.addContainer(quality)
user_profile = container_registry.findInstanceContainers(id = extruder_stack_id + "_current_settings")
if user_profile: #There was already a user profile, loaded from settings.
user_profile = container_registry.findInstanceContainers(type = "user", extruder = extruder_stack_id)
if user_profile: # There was already a user profile, loaded from settings.
user_profile = user_profile[0]
else:
user_profile = UM.Settings.InstanceContainer(extruder_stack_id + "_current_settings") #Add an empty user profile.
user_profile = UM.Settings.InstanceContainer(extruder_stack_id + "_current_settings") # Add an empty user profile.
user_profile.addMetaDataEntry("type", "user")
user_profile.addMetaDataEntry("extruder", extruder_stack_id)
user_profile.setDefinition(machine_definition)
container_registry.addContainer(user_profile)
container_stack.addContainer(user_profile)
@ -226,8 +224,7 @@ class ExtruderManager(QObject):
# \param machine_id The machine to remove the extruders for.
def removeMachineExtruders(self, machine_id):
for extruder in self.getMachineExtruders(machine_id):
current_settings_id = extruder.getId() + "_current_settings"
containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = current_settings_id)
containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(type = "user", extruder = extruder.getId())
for container in containers:
UM.Settings.ContainerRegistry.getInstance().removeContainer(container.getId())
UM.Settings.ContainerRegistry.getInstance().removeContainer(extruder.getId())

View File

@ -640,8 +640,7 @@ class MachineManager(QObject):
return
ExtruderManager.getInstance().removeMachineExtruders(stacks[0].getBottom().getId())
current_settings_id = machine_id + "_current_settings"
containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = current_settings_id)
containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(type = "user", machine = machine_id)
for container in containers:
UM.Settings.ContainerRegistry.getInstance().removeContainer(container.getId())
UM.Settings.ContainerRegistry.getInstance().removeContainer(machine_id)
@ -693,7 +692,7 @@ class MachineManager(QObject):
return containers[0].getBottom().getId()
@staticmethod
def createMachineManager(engine, script_engine):
def createMachineManager(engine=None, script_engine=None):
return MachineManager()
def _updateVariantContainer(self, definition):

View File

@ -3,7 +3,6 @@
import os.path
from UM.Application import Application #To get the machine manager to create the new profile in.
from UM.Logger import Logger
from UM.Settings.InstanceContainer import InstanceContainer #The new profile to make.
from cura.ProfileReader import ProfileReader

View File

@ -1,10 +1,9 @@
# Copyright (c) 2015 Ultimaker B.V.
# Cura is released under the terms of the AGPLv3 or higher.
import os
import re #Regular expressions for parsing escape characters in the settings.
import json
from UM.Application import Application #To get the machine manager to create the new profile in.
from UM.Settings.InstanceContainer import InstanceContainer
from UM.Logger import Logger
from UM.i18n import i18nCatalog
@ -22,7 +21,7 @@ class GCodeProfileReader(ProfileReader):
# It can only read settings with the same version as the version it was
# written with. If the file format is changed in a way that breaks reverse
# compatibility, increment this version number!
version = 2
version = 3
## Dictionary that defines how characters are escaped when embedded in
# g-code.
@ -66,21 +65,37 @@ class GCodeProfileReader(ProfileReader):
Logger.log("e", "Unable to open file %s for reading: %s", file_name, str(e))
return None
# Un-escape the serialized profile.
pattern = re.compile("|".join(GCodeProfileReader.escape_characters.keys()))
# Perform the replacement with a regular expression.
serialized = pattern.sub(lambda m: GCodeProfileReader.escape_characters[re.escape(m.group(0))], serialized)
serialized = unescapeGcodeComment(serialized)
Logger.log("i", "Serialized the following from %s: %s" %(file_name, repr(serialized)))
# Create an empty profile - the id and name will be changed by the ContainerRegistry
profile = InstanceContainer("")
try:
profile.deserialize(serialized)
except Exception as e: # Not a valid g-code file.
Logger.log("e", "Unable to serialise the profile: %s", str(e))
return None
json_data = json.loads(serialized)
profile.addMetaDataEntry("type", "quality")
profile_strings = [json_data["global_quality"]]
profile_strings.extend(json_data.get("extruder_quality", []))
return profile
return [readQualityProfileFromString(profile_string) for profile_string in profile_strings]
## Unescape a string which has been escaped for use in a gcode comment.
#
# \param string The string to unescape.
# \return \type{str} The unscaped string.
def unescapeGcodeComment(string):
# Un-escape the serialized profile.
pattern = re.compile("|".join(GCodeProfileReader.escape_characters.keys()))
# Perform the replacement with a regular expression.
return pattern.sub(lambda m: GCodeProfileReader.escape_characters[re.escape(m.group(0))], string)
## Read in a profile from a serialized string.
#
# \param profile_string The profile data in serialized form.
# \return \type{Profile} the resulting Profile object or None if it could not be read.
def readQualityProfileFromString(profile_string):
# Create an empty profile - the id and name will be changed by the ContainerRegistry
profile = InstanceContainer("")
try:
profile.deserialize(profile_string)
except Exception as e: # Not a valid g-code file.
Logger.log("e", "Unable to serialise the profile: %s", str(e))
return None
return profile

View File

@ -4,8 +4,13 @@
from UM.Mesh.MeshWriter import MeshWriter
from UM.Logger import Logger
from UM.Application import Application
from UM.Settings.InstanceContainer import InstanceContainer #To create a complete setting profile to store in the g-code.
import UM.Settings.ContainerRegistry
from cura.CuraApplication import CuraApplication
from cura.Settings.ExtruderManager import ExtruderManager
import re #For escaping characters in the settings.
import json
## Writes g-code to a file.
#
@ -23,7 +28,7 @@ class GCodeWriter(MeshWriter):
# It can only read settings with the same version as the version it was
# written with. If the file format is changed in a way that breaks reverse
# compatibility, increment this version number!
version = 2
version = 3
## Dictionary that defines how characters are escaped when embedded in
# g-code.
@ -64,25 +69,49 @@ class GCodeWriter(MeshWriter):
#
# \param settings A container stack to serialise.
# \return A serialised string of the settings.
def _serialiseSettings(self, settings):
def _serialiseSettings(self, stack):
prefix = ";SETTING_" + str(GCodeWriter.version) + " " # The prefix to put before each line.
prefix_length = len(prefix)
global_stack = Application.getInstance().getGlobalContainerStack()
container_with_profile = global_stack.findContainer({"type": "quality"})
serialized = container_with_profile.serialize()
container_with_profile = stack.findContainer({"type": "quality"})
machine_manager = CuraApplication.getInstance().getMachineManager()
# Duplicate the current quality profile and update it with any user settings.
flat_quality_id = machine_manager.duplicateContainer(container_with_profile.getId())
flat_quality = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = flat_quality_id)[0]
user_settings = stack.getTop()
for key in user_settings.getAllKeys():
flat_quality.setProperty(key, "value", user_settings.getProperty(key, "value"))
serialized = flat_quality.serialize()
data = {"global_quality": serialized}
manager = ExtruderManager.getInstance()
for extruder in manager.getMachineExtruders(stack.getBottom().getId()):
extruder_quality = extruder.findContainer({"type": "quality"})
flat_extruder_quality_id = machine_manager.duplicateContainer(extruder_quality.getId())
flat_extruder_quality = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id=flat_extruder_quality_id)[0]
extruder_user_settings = extruder.getTop()
for key in extruder_user_settings.getAllKeys():
flat_extruder_quality.setProperty(key, "value", extruder_user_settings.getProperty(key, "value"))
extruder_serialized = flat_extruder_quality.serialize()
data.setdefault("extruder_quality", []).append(extruder_serialized)
json_string = json.dumps(data)
# Escape characters that have a special meaning in g-code comments.
pattern = re.compile("|".join(GCodeWriter.escape_characters.keys()))
# Perform the replacement with a regular expression.
serialized = pattern.sub(lambda m: GCodeWriter.escape_characters[re.escape(m.group(0))], serialized)
escaped_string = pattern.sub(lambda m: GCodeWriter.escape_characters[re.escape(m.group(0))], json_string)
# Introduce line breaks so that each comment is no longer than 80 characters. Prepend each line with the prefix.
result = ""
# Lines have 80 characters, so the payload of each line is 80 - prefix.
for pos in range(0, len(serialized), 80 - prefix_length):
result += prefix + serialized[pos : pos + 80 - prefix_length] + "\n"
serialized = result
return serialized
for pos in range(0, len(escaped_string), 80 - prefix_length):
result += prefix + escaped_string[pos : pos + 80 - prefix_length] + "\n"
return result

View File

@ -370,6 +370,136 @@
"default_value": false,
"settable_per_mesh": false,
"settable_per_extruder": true
},
"machine_max_feedrate_x": {
"label": "Maximum Speed X",
"description": "The maximum speed for the motor of the X-direction.",
"unit": "mm/s",
"type": "float",
"default_value": 500,
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
},
"machine_max_feedrate_y": {
"label": "Maximum Speed Y",
"description": "The maximum speed for the motor of the Y-direction.",
"unit": "mm/s",
"type": "float",
"default_value": 500,
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
},
"machine_max_feedrate_z": {
"label": "Maximum Speed Z",
"description": "The maximum speed for the motor of the Z-direction.",
"unit": "mm/s",
"type": "float",
"default_value": 5,
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
},
"machine_max_feedrate_e": {
"label": "Maximum Feedrate",
"description": "The maximum speed of the filament.",
"unit": "mm/s",
"type": "float",
"default_value": 25,
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
},
"machine_max_acceleration_x": {
"label": "Maximum Acceleration X",
"description": "Maximum acceleration for the motor of the X-direction",
"unit": "mm/s²",
"type": "float",
"default_value": 9000,
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
},
"machine_max_acceleration_y": {
"label": "Maximum Acceleration Y",
"description": "Maximum acceleration for the motor of the Y-direction.",
"unit": "mm/s²",
"type": "float",
"default_value": 9000,
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
},
"machine_max_acceleration_z": {
"label": "Maximum Acceleration Z",
"description": "Maximum acceleration for the motor of the Z-direction.",
"unit": "mm/s²",
"type": "float",
"default_value": 100,
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
},
"machine_max_acceleration_e": {
"label": "Maximum Filament Acceleration",
"description": "Maximum acceleration for the motor of the filament.",
"unit": "mm/s²",
"type": "float",
"default_value": 10000,
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
},
"machine_acceleration": {
"label": "Default Acceleration",
"description": "The default acceleration of print head movement.",
"unit": "mm/s²",
"type": "float",
"default_value": 4000,
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
},
"machine_max_jerk_xy": {
"label": "Default X-Y Jerk",
"description": "Default jerk for movement in the horizontal plane.",
"unit": "mm/s",
"type": "float",
"default_value": 20.0,
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
},
"machine_max_jerk_z": {
"label": "Default Z Jerk",
"description": "Default jerk for the motor of the Z-direction.",
"unit": "mm/s",
"type": "float",
"default_value": 0.4,
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
},
"machine_max_jerk_e": {
"label": "Default Filament Jerk",
"description": "Default jerk for the motor of the filament.",
"unit": "mm/s",
"type": "float",
"default_value": 5.0,
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
},
"machine_minimum_feedrate": {
"label": "Minimum Feedrate",
"description": "The minimal movement speed of the print head.",
"unit": "mm/s",
"type": "float",
"default_value": 0.0,
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
}
}
},
@ -774,7 +904,7 @@
"type": "float",
"default_value": 2,
"minimum_value": "0",
"value": "0 if infill_sparse_density == 0 else (infill_line_width * 100) / infill_sparse_density * (2 if infill_pattern == \"grid\" else (3 if infill_pattern == \"triangles\" else (3 if infill_pattern == \"cubic\" else 1)))",
"value": "0 if infill_sparse_density == 0 else (infill_line_width * 100) / infill_sparse_density * (2 if infill_pattern == \"grid\" else (3 if infill_pattern == \"triangles\" else 1))",
"settable_per_mesh": true
}
}
@ -782,13 +912,12 @@
"infill_pattern":
{
"label": "Infill Pattern",
"description": "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, cubic, triangle and concentric patterns are fully printed every layer.",
"description": "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle and concentric patterns are fully printed every layer.",
"type": "enum",
"options":
{
"grid": "Grid",
"lines": "Lines",
"cubic": "Cubic",
"triangles": "Triangles",
"concentric": "Concentric",
"zigzag": "Zig Zag"
@ -1304,7 +1433,7 @@
"maximum_value_warning": "150",
"default_value": 60,
"value": "speed_print",
"enabled": "support_roof_enable",
"enabled": "support_enable",
"settable_per_mesh": false,
"settable_per_extruder": false,
"children":
@ -1506,7 +1635,7 @@
"maximum_value_warning": "10000",
"default_value": 3000,
"value": "acceleration_print",
"enabled": "acceleration_enabled and support_roof_enable",
"enabled": "acceleration_enabled and support_enable",
"settable_per_mesh": false,
"settable_per_extruder": false,
"children": {
@ -1534,7 +1663,7 @@
"minimum_value": "0.1",
"minimum_value_warning": "100",
"maximum_value_warning": "10000",
"enabled": "acceleration_enabled and support_roof_enable",
"enabled": "acceleration_enabled and support_roof_enable and support_enable",
"settable_per_mesh": false,
"settable_per_extruder": false
}
@ -1608,7 +1737,7 @@
"jerk_print": {
"label": "Print Jerk",
"description": "The maximum instantaneous velocity change of the print head.",
"unit": "mm/s³",
"unit": "mm/s",
"type": "float",
"minimum_value": "0.1",
"minimum_value_warning": "5",
@ -1620,7 +1749,7 @@
"jerk_infill": {
"label": "Infill Jerk",
"description": "The maximum instantaneous velocity change with which infill is printed.",
"unit": "mm/s³",
"unit": "mm/s",
"type": "float",
"minimum_value": "0.1",
"minimum_value_warning": "5",
@ -1633,7 +1762,7 @@
"jerk_wall": {
"label": "Wall Jerk",
"description": "The maximum instantaneous velocity change with which the walls are printed.",
"unit": "mm/s³",
"unit": "mm/s",
"type": "float",
"minimum_value": "0.1",
"minimum_value_warning": "5",
@ -1646,7 +1775,7 @@
"jerk_wall_0": {
"label": "Outer Wall Jerk",
"description": "The maximum instantaneous velocity change with which the outermost walls are printed.",
"unit": "mm/s³",
"unit": "mm/s",
"type": "float",
"minimum_value": "0.1",
"minimum_value_warning": "5",
@ -1659,7 +1788,7 @@
"jerk_wall_x": {
"label": "Inner Wall Jerk",
"description": "The maximum instantaneous velocity change with which all inner walls are printed.",
"unit": "mm/s³",
"unit": "mm/s",
"type": "float",
"minimum_value": "0.1",
"minimum_value_warning": "5",
@ -1674,7 +1803,7 @@
"jerk_topbottom": {
"label": "Top/Bottom Jerk",
"description": "The maximum instantaneous velocity change with which top/bottom layers are printed.",
"unit": "mm/s³",
"unit": "mm/s",
"type": "float",
"minimum_value": "0.1",
"minimum_value_warning": "5",
@ -1687,21 +1816,21 @@
"jerk_support": {
"label": "Support Jerk",
"description": "The maximum instantaneous velocity change with which the support structure is printed.",
"unit": "mm/s³",
"unit": "mm/s",
"type": "float",
"minimum_value": "0.1",
"minimum_value_warning": "5",
"maximum_value_warning": "50",
"default_value": 20,
"value": "jerk_print",
"enabled": "jerk_enabled and support_roof_enable",
"enabled": "jerk_enabled and support_enable",
"settable_per_mesh": false,
"settable_per_extruder": false,
"children": {
"jerk_support_infill": {
"label": "Support Infill Jerk",
"description": "The maximum instantaneous velocity change with which the infill of support is printed.",
"unit": "mm/s³",
"unit": "mm/s",
"type": "float",
"default_value": 20,
"value": "jerk_support",
@ -1715,14 +1844,14 @@
"jerk_support_roof": {
"label": "Support Roof Jerk",
"description": "The maximum instantaneous velocity change with which the roofs of support are printed.",
"unit": "mm/s³",
"unit": "mm/s",
"type": "float",
"default_value": 20,
"value": "jerk_support",
"minimum_value": "0.1",
"minimum_value_warning": "5",
"maximum_value_warning": "50",
"enabled": "jerk_enabled and support_roof_enable",
"enabled": "jerk_enabled and support_roof_enable and support_enable",
"settable_per_mesh": false,
"settable_per_extruder": false
}
@ -1731,7 +1860,7 @@
"jerk_prime_tower": {
"label": "Prime Tower Jerk",
"description": "The maximum instantaneous velocity change with which the prime tower is printed.",
"unit": "mm/s³",
"unit": "mm/s",
"type": "float",
"minimum_value": "0.1",
"minimum_value_warning": "5",
@ -1746,7 +1875,7 @@
"jerk_travel": {
"label": "Travel Jerk",
"description": "The maximum instantaneous velocity change with which travel moves are made.",
"unit": "mm/s³",
"unit": "mm/s",
"type": "float",
"default_value": 30,
"minimum_value": "0.1",
@ -1759,7 +1888,7 @@
"jerk_layer_0": {
"label": "Initial Layer Jerk",
"description": "The print maximum instantaneous velocity change for the initial layer.",
"unit": "mm/s³",
"unit": "mm/s",
"type": "float",
"default_value": 20,
"value": "jerk_print",
@ -1772,7 +1901,7 @@
"jerk_skirt": {
"label": "Skirt Jerk",
"description": "The maximum instantaneous velocity change with which the skirt and brim are printed.",
"unit": "mm/s³",
"unit": "mm/s",
"type": "float",
"default_value": 20,
"minimum_value": "0.1",
@ -2211,7 +2340,7 @@
"default_value": 1,
"minimum_value": "0",
"maximum_value_warning": "10",
"enabled": "support_roof_enable",
"enabled": "support_roof_enable and support_enable",
"settable_per_mesh": true
},
"support_roof_density":
@ -2223,7 +2352,7 @@
"default_value": 100,
"minimum_value": "0",
"maximum_value_warning": "100",
"enabled":"support_roof_enable",
"enabled":"support_roof_enable and support_enable",
"settable_per_mesh": false,
"settable_per_extruder": false,
"children":
@ -2237,7 +2366,7 @@
"default_value": 0.4,
"minimum_value": "0",
"value": "0 if support_roof_density == 0 else (support_roof_line_width * 100) / support_roof_density * (2 if support_roof_pattern == \"grid\" else (3 if support_roof_pattern == \"triangles\" else 1))",
"enabled": "support_roof_enable",
"enabled": "support_roof_enable and support_enable",
"settable_per_mesh": false,
"settable_per_extruder": false
}
@ -2257,7 +2386,7 @@
"zigzag": "Zig Zag"
},
"default_value": "concentric",
"enabled": "support_roof_enable",
"enabled": "support_roof_enable and support_enable",
"settable_per_mesh": false,
"settable_per_extruder": false
},
@ -2701,7 +2830,7 @@
"raft_jerk": {
"label": "Raft Print Jerk",
"description": "The jerk with which the raft is printed.",
"unit": "mm/s³",
"unit": "mm/s",
"type": "float",
"default_value": 20,
"minimum_value": "0.1",
@ -2714,7 +2843,7 @@
"raft_surface_jerk": {
"label": "Raft Top Print Jerk",
"description": "The jerk with which the top raft layers are printed.",
"unit": "mm/s³",
"unit": "mm/s",
"type": "float",
"default_value": 20,
"value": "raft_jerk",
@ -2727,7 +2856,7 @@
"raft_interface_jerk": {
"label": "Raft Middle Print Jerk",
"description": "The jerk with which the middle raft layer is printed.",
"unit": "mm/s³",
"unit": "mm/s",
"type": "float",
"default_value": 20,
"value": "raft_jerk",
@ -2740,7 +2869,7 @@
"raft_base_jerk": {
"label": "Raft Base Print Jerk",
"description": "The jerk with which the base raft layer is printed.",
"unit": "mm/s³",
"unit": "mm/s",
"type": "float",
"default_value": 20,
"value": "raft_jerk",
@ -2869,7 +2998,7 @@
"type": "extruder",
"default_value": "0",
"value": "support_extruder_nr",
"enabled": "support_enable and support_roof_enable",
"enabled": "support_enable",
"settable_per_mesh": false,
"settable_per_extruder": false
}

View File

@ -87,6 +87,21 @@
"material_bed_temperature": {
"enabled": "False"
},
"machine_max_feedrate_x": {
"default_value": 300
},
"machine_max_feedrate_y": {
"default_value": 300
},
"machine_max_feedrate_z": {
"default_value": 40
},
"machine_max_feedrate_e": {
"default_value": 45
},
"machine_acceleration": {
"default_value": 3000
},
"material_diameter": {
"enabled": "False"
},

View File

@ -17,6 +17,9 @@
"overrides": {
"machine_heated_bed": {
"default_value": true
},
"machine_max_feedrate_z": {
"default_value": 30
}
}
}