mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-12-11 16:00:47 -07:00
Merge branch 'master' into feature_setting_visibility_profiles
# Conflicts: # resources/qml/Settings/SettingView.qml
This commit is contained in:
commit
a17160f52d
129 changed files with 1937 additions and 1538 deletions
|
|
@ -55,19 +55,19 @@ class GcodeStartEndFormatter(Formatter):
|
|||
extruder_nr = int(kwargs["-1"][key_fragments[1]]) # get extruder_nr values from the global stack
|
||||
except (KeyError, ValueError):
|
||||
# either the key does not exist, or the value is not an int
|
||||
Logger.log("w", "Unable to determine stack nr '%s' for key '%s' in start/end gcode, using global stack", key_fragments[1], key_fragments[0])
|
||||
Logger.log("w", "Unable to determine stack nr '%s' for key '%s' in start/end g-code, using global stack", key_fragments[1], key_fragments[0])
|
||||
elif len(key_fragments) != 1:
|
||||
Logger.log("w", "Incorrectly formatted placeholder '%s' in start/end gcode", key)
|
||||
Logger.log("w", "Incorrectly formatted placeholder '%s' in start/end g-code", key)
|
||||
return "{" + str(key) + "}"
|
||||
|
||||
key = key_fragments[0]
|
||||
try:
|
||||
return kwargs[str(extruder_nr)][key]
|
||||
except KeyError:
|
||||
Logger.log("w", "Unable to replace '%s' placeholder in start/end gcode", key)
|
||||
Logger.log("w", "Unable to replace '%s' placeholder in start/end g-code", key)
|
||||
return "{" + key + "}"
|
||||
else:
|
||||
Logger.log("w", "Incorrectly formatted placeholder '%s' in start/end gcode", key)
|
||||
Logger.log("w", "Incorrectly formatted placeholder '%s' in start/end g-code", key)
|
||||
return "{" + str(key) + "}"
|
||||
|
||||
|
||||
|
|
@ -308,7 +308,7 @@ class StartSliceJob(Job):
|
|||
settings["default_extruder_nr"] = default_extruder_nr
|
||||
return str(fmt.format(value, **settings))
|
||||
except:
|
||||
Logger.logException("w", "Unable to do token replacement on start/end gcode")
|
||||
Logger.logException("w", "Unable to do token replacement on start/end g-code")
|
||||
return str(value)
|
||||
|
||||
## Create extruder message from stack
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ i18n_catalog = i18nCatalog("cura")
|
|||
# The plugin is currently only usable for applications maintained by Ultimaker. But it should be relatively easy
|
||||
# to change it to work for other applications.
|
||||
class FirmwareUpdateChecker(Extension):
|
||||
JEDI_VERSION_URL = "http://software.ultimaker.com/jedi/releases/latest.version"
|
||||
JEDI_VERSION_URL = "http://software.ultimaker.com/jedi/releases/latest.version?utm_source=cura&utm_medium=software&utm_campaign=resources"
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ class GCodeProfileReader(ProfileReader):
|
|||
try:
|
||||
json_data = json.loads(serialized)
|
||||
except Exception as e:
|
||||
Logger.log("e", "Could not parse serialized JSON data from GCode %s, error: %s", file_name, e)
|
||||
Logger.log("e", "Could not parse serialized JSON data from g-code %s, error: %s", file_name, e)
|
||||
return None
|
||||
|
||||
profiles = []
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"name": "GCode Profile Reader",
|
||||
"name": "G-code Profile Reader",
|
||||
"author": "Ultimaker B.V.",
|
||||
"version": "1.0.0",
|
||||
"description": "Provides support for importing profiles from g-code files.",
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ class GCodeWriter(MeshWriter):
|
|||
# file. This must always be text mode.
|
||||
def write(self, stream, nodes, mode = MeshWriter.OutputMode.TextMode):
|
||||
if mode != MeshWriter.OutputMode.TextMode:
|
||||
Logger.log("e", "GCode Writer does not support non-text mode.")
|
||||
Logger.log("e", "GCodeWriter does not support non-text mode.")
|
||||
return False
|
||||
|
||||
active_build_plate = Application.getInstance().getBuildPlateModel().activeBuildPlate
|
||||
|
|
@ -108,7 +108,7 @@ class GCodeWriter(MeshWriter):
|
|||
|
||||
container_with_profile = stack.qualityChanges
|
||||
if container_with_profile.getId() == "empty_quality_changes":
|
||||
Logger.log("e", "No valid quality profile found, not writing settings to GCode!")
|
||||
Logger.log("e", "No valid quality profile found, not writing settings to g-code!")
|
||||
return ""
|
||||
|
||||
flat_global_container = self._createFlattenedContainerInstance(stack.getTop(), container_with_profile)
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ def getMetaData():
|
|||
"mesh_writer": {
|
||||
"output": [{
|
||||
"extension": "gcode",
|
||||
"description": catalog.i18nc("@item:inlistbox", "GCode File"),
|
||||
"description": catalog.i18nc("@item:inlistbox", "G-code File"),
|
||||
"mime_type": "text/x-gcode",
|
||||
"mode": GCodeWriter.GCodeWriter.OutputMode.TextMode
|
||||
}]
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
{
|
||||
"name": "GCode Writer",
|
||||
"name": "G-code Writer",
|
||||
"author": "Ultimaker B.V.",
|
||||
"version": "1.0.0",
|
||||
"description": "Writes GCode to a file.",
|
||||
"description": "Writes g-code to a file.",
|
||||
"api": 4,
|
||||
"i18n-catalog": "cura"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -70,8 +70,8 @@ Cura.MachineAction
|
|||
anchors.top: pageTitle.bottom
|
||||
anchors.topMargin: UM.Theme.getSize("default_margin").height
|
||||
|
||||
property real columnWidth: ((width - 3 * UM.Theme.getSize("default_margin").width) / 2) | 0
|
||||
property real labelColumnWidth: columnWidth * 0.5
|
||||
property real columnWidth: Math.round((width - 3 * UM.Theme.getSize("default_margin").width) / 2)
|
||||
property real labelColumnWidth: Math.round(columnWidth / 2)
|
||||
|
||||
Tab
|
||||
{
|
||||
|
|
@ -165,7 +165,7 @@ Cura.MachineAction
|
|||
id: gcodeFlavorComboBox
|
||||
sourceComponent: comboBoxWithOptions
|
||||
property string settingKey: "machine_gcode_flavor"
|
||||
property string label: catalog.i18nc("@label", "Gcode flavor")
|
||||
property string label: catalog.i18nc("@label", "G-code flavor")
|
||||
property bool forceUpdateOnChange: true
|
||||
property var afterOnActivate: manager.updateHasMaterialsMetadata
|
||||
}
|
||||
|
|
@ -307,7 +307,7 @@ Cura.MachineAction
|
|||
width: settingsTabs.columnWidth
|
||||
Label
|
||||
{
|
||||
text: catalog.i18nc("@label", "Start Gcode")
|
||||
text: catalog.i18nc("@label", "Start G-code")
|
||||
font.bold: true
|
||||
}
|
||||
Loader
|
||||
|
|
@ -317,7 +317,7 @@ Cura.MachineAction
|
|||
property int areaWidth: parent.width
|
||||
property int areaHeight: parent.height - y
|
||||
property string settingKey: "machine_start_gcode"
|
||||
property string tooltip: catalog.i18nc("@tooltip", "Gcode commands to be executed at the very start.")
|
||||
property string tooltip: catalog.i18nc("@tooltip", "G-code commands to be executed at the very start.")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -326,7 +326,7 @@ Cura.MachineAction
|
|||
width: settingsTabs.columnWidth
|
||||
Label
|
||||
{
|
||||
text: catalog.i18nc("@label", "End Gcode")
|
||||
text: catalog.i18nc("@label", "End G-code")
|
||||
font.bold: true
|
||||
}
|
||||
Loader
|
||||
|
|
@ -336,7 +336,7 @@ Cura.MachineAction
|
|||
property int areaWidth: parent.width
|
||||
property int areaHeight: parent.height - y
|
||||
property string settingKey: "machine_end_gcode"
|
||||
property string tooltip: catalog.i18nc("@tooltip", "Gcode commands to be executed at the very end.")
|
||||
property string tooltip: catalog.i18nc("@tooltip", "G-code commands to be executed at the very end.")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -441,7 +441,7 @@ Cura.MachineAction
|
|||
width: settingsTabs.columnWidth
|
||||
Label
|
||||
{
|
||||
text: catalog.i18nc("@label", "Extruder Start Gcode")
|
||||
text: catalog.i18nc("@label", "Extruder Start G-code")
|
||||
font.bold: true
|
||||
}
|
||||
Loader
|
||||
|
|
@ -459,7 +459,7 @@ Cura.MachineAction
|
|||
width: settingsTabs.columnWidth
|
||||
Label
|
||||
{
|
||||
text: catalog.i18nc("@label", "Extruder End Gcode")
|
||||
text: catalog.i18nc("@label", "Extruder End G-code")
|
||||
font.bold: true
|
||||
}
|
||||
Loader
|
||||
|
|
|
|||
|
|
@ -237,7 +237,7 @@ Item {
|
|||
|
||||
Button
|
||||
{
|
||||
width: Math.floor(UM.Theme.getSize("setting").height / 2)
|
||||
width: Math.round(UM.Theme.getSize("setting").height / 2)
|
||||
height: UM.Theme.getSize("setting").height
|
||||
|
||||
onClicked: addedSettingsModel.setVisible(model.key, false)
|
||||
|
|
|
|||
|
|
@ -287,7 +287,7 @@ class PluginBrowser(QObject, Extension):
|
|||
|
||||
@pyqtProperty(QObject, notify=pluginsMetadataChanged)
|
||||
def pluginsModel(self):
|
||||
self._plugins_model = PluginsModel(self._view)
|
||||
self._plugins_model = PluginsModel(None, self._view)
|
||||
# self._plugins_model.update()
|
||||
|
||||
# Check each plugin the registry for matching plugin from server
|
||||
|
|
|
|||
|
|
@ -118,27 +118,30 @@ class PostProcessingPlugin(QObject, Extension):
|
|||
for loader, script_name, ispkg in scripts:
|
||||
# Iterate over all scripts.
|
||||
if script_name not in sys.modules:
|
||||
spec = importlib.util.spec_from_file_location(__name__ + "." + script_name, os.path.join(path, script_name + ".py"))
|
||||
loaded_script = importlib.util.module_from_spec(spec)
|
||||
spec.loader.exec_module(loaded_script)
|
||||
sys.modules[script_name] = loaded_script
|
||||
|
||||
loaded_class = getattr(loaded_script, script_name)
|
||||
temp_object = loaded_class()
|
||||
Logger.log("d", "Begin loading of script: %s", script_name)
|
||||
try:
|
||||
setting_data = temp_object.getSettingData()
|
||||
if "name" in setting_data and "key" in setting_data:
|
||||
self._script_labels[setting_data["key"]] = setting_data["name"]
|
||||
self._loaded_scripts[setting_data["key"]] = loaded_class
|
||||
else:
|
||||
Logger.log("w", "Script %s.py has no name or key", script_name)
|
||||
self._script_labels[script_name] = script_name
|
||||
self._loaded_scripts[script_name] = loaded_class
|
||||
except AttributeError:
|
||||
Logger.log("e", "Script %s.py is not a recognised script type. Ensure it inherits Script", script_name)
|
||||
except NotImplementedError:
|
||||
Logger.log("e", "Script %s.py has no implemented settings", script_name)
|
||||
spec = importlib.util.spec_from_file_location(__name__ + "." + script_name, os.path.join(path, script_name + ".py"))
|
||||
loaded_script = importlib.util.module_from_spec(spec)
|
||||
spec.loader.exec_module(loaded_script)
|
||||
sys.modules[script_name] = loaded_script
|
||||
|
||||
loaded_class = getattr(loaded_script, script_name)
|
||||
temp_object = loaded_class()
|
||||
Logger.log("d", "Begin loading of script: %s", script_name)
|
||||
try:
|
||||
setting_data = temp_object.getSettingData()
|
||||
if "name" in setting_data and "key" in setting_data:
|
||||
self._script_labels[setting_data["key"]] = setting_data["name"]
|
||||
self._loaded_scripts[setting_data["key"]] = loaded_class
|
||||
else:
|
||||
Logger.log("w", "Script %s.py has no name or key", script_name)
|
||||
self._script_labels[script_name] = script_name
|
||||
self._loaded_scripts[script_name] = loaded_class
|
||||
except AttributeError:
|
||||
Logger.log("e", "Script %s.py is not a recognised script type. Ensure it inherits Script", script_name)
|
||||
except NotImplementedError:
|
||||
Logger.log("e", "Script %s.py has no implemented settings", script_name)
|
||||
except Exception as e:
|
||||
Logger.logException("e", "Exception occurred while loading post processing plugin: {error_msg}".format(error_msg = str(e)))
|
||||
self.loadedScriptListChanged.emit()
|
||||
|
||||
loadedScriptListChanged = pyqtSignal()
|
||||
|
|
@ -171,18 +174,15 @@ class PostProcessingPlugin(QObject, Extension):
|
|||
|
||||
## Load all scripts in the scripts folders
|
||||
for root in [PluginRegistry.getInstance().getPluginPath("PostProcessingPlugin"), Resources.getStoragePath(Resources.Preferences)]:
|
||||
try:
|
||||
path = os.path.join(root, "scripts")
|
||||
if not os.path.isdir(path):
|
||||
try:
|
||||
os.makedirs(path)
|
||||
except OSError:
|
||||
Logger.log("w", "Unable to create a folder for scripts: " + path)
|
||||
continue
|
||||
path = os.path.join(root, "scripts")
|
||||
if not os.path.isdir(path):
|
||||
try:
|
||||
os.makedirs(path)
|
||||
except OSError:
|
||||
Logger.log("w", "Unable to create a folder for scripts: " + path)
|
||||
continue
|
||||
|
||||
self.loadAllScripts(path)
|
||||
except Exception as e:
|
||||
Logger.logException("e", "Exception occurred while loading post processing plugin: {error_msg}".format(error_msg = str(e)))
|
||||
self.loadAllScripts(path)
|
||||
|
||||
# Create the plugin dialog component
|
||||
path = os.path.join(PluginRegistry.getInstance().getPluginPath("PostProcessingPlugin"), "PostProcessingPlugin.qml")
|
||||
|
|
|
|||
|
|
@ -25,8 +25,8 @@ UM.Dialog
|
|||
{
|
||||
UM.I18nCatalog{id: catalog; name:"cura"}
|
||||
id: base
|
||||
property int columnWidth: Math.floor((base.width / 2) - UM.Theme.getSize("default_margin").width)
|
||||
property int textMargin: Math.floor(UM.Theme.getSize("default_margin").width / 2)
|
||||
property int columnWidth: Math.round((base.width / 2) - UM.Theme.getSize("default_margin").width)
|
||||
property int textMargin: Math.round(UM.Theme.getSize("default_margin").width / 2)
|
||||
property string activeScriptName
|
||||
SystemPalette{ id: palette }
|
||||
SystemPalette{ id: disabledPalette; colorGroup: SystemPalette.Disabled }
|
||||
|
|
@ -129,8 +129,8 @@ UM.Dialog
|
|||
{
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
width: Math.floor(control.width / 2.7)
|
||||
height: Math.floor(control.height / 2.7)
|
||||
width: Math.round(control.width / 2.7)
|
||||
height: Math.round(control.height / 2.7)
|
||||
sourceSize.width: width
|
||||
sourceSize.height: width
|
||||
color: palette.text
|
||||
|
|
@ -164,8 +164,8 @@ UM.Dialog
|
|||
{
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
width: Math.floor(control.width / 2.5)
|
||||
height: Math.floor(control.height / 2.5)
|
||||
width: Math.round(control.width / 2.5)
|
||||
height: Math.round(control.height / 2.5)
|
||||
sourceSize.width: width
|
||||
sourceSize.height: width
|
||||
color: control.enabled ? palette.text : disabledPalette.text
|
||||
|
|
@ -199,8 +199,8 @@ UM.Dialog
|
|||
{
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
width: Math.floor(control.width / 2.5)
|
||||
height: Math.floor(control.height / 2.5)
|
||||
width: Math.round(control.width / 2.5)
|
||||
height: Math.round(control.height / 2.5)
|
||||
sourceSize.width: width
|
||||
sourceSize.height: width
|
||||
color: control.enabled ? palette.text : disabledPalette.text
|
||||
|
|
@ -478,15 +478,15 @@ UM.Dialog
|
|||
control.hovered ? UM.Theme.getColor("action_button_hovered") : UM.Theme.getColor("action_button")
|
||||
Behavior on color { ColorAnimation { duration: 50; } }
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: Math.floor(UM.Theme.getSize("save_button_text_margin").width / 2);
|
||||
anchors.leftMargin: Math.round(UM.Theme.getSize("save_button_text_margin").width / 2);
|
||||
width: parent.height
|
||||
height: parent.height
|
||||
|
||||
UM.RecolorImage {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
width: Math.floor(parent.width / 2)
|
||||
height: Math.floor(parent.height / 2)
|
||||
width: Math.round(parent.width / 2)
|
||||
height: Math.round(parent.height / 2)
|
||||
sourceSize.width: width
|
||||
sourceSize.height: height
|
||||
color: !control.enabled ? UM.Theme.getColor("action_button_disabled_text") :
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
# TweakAtZ script - Change printing parameters at a given height
|
||||
# ChangeAtZ script - Change printing parameters at a given height
|
||||
# This script is the successor of the TweakAtZ plugin for legacy Cura.
|
||||
# It contains code from the TweakAtZ plugin V1.0-V4.x and from the ExampleScript by Jaime van Kessel, Ultimaker B.V.
|
||||
# It runs with the PostProcessingPlugin which is released under the terms of the AGPLv3 or higher.
|
||||
# This script is licensed under the Creative Commons - Attribution - Share Alike (CC BY-SA) terms
|
||||
|
||||
#Authors of the TweakAtZ plugin / script:
|
||||
#Authors of the ChangeAtZ plugin / script:
|
||||
# Written by Steven Morlock, smorloc@gmail.com
|
||||
# Modified by Ricardo Gomez, ricardoga@otulook.com, to add Bed Temperature and make it work with Cura_13.06.04+
|
||||
# Modified by Stefan Heule, Dim3nsioneer@gmx.ch since V3.0 (see changelog below)
|
||||
|
|
@ -46,7 +46,7 @@ from ..Script import Script
|
|||
#from UM.Logger import Logger
|
||||
import re
|
||||
|
||||
class TweakAtZ(Script):
|
||||
class ChangeAtZ(Script):
|
||||
version = "5.1.1"
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
|
@ -54,7 +54,7 @@ class TweakAtZ(Script):
|
|||
def getSettingDataString(self):
|
||||
return """{
|
||||
"name":"ChangeAtZ """ + self.version + """ (Experimental)",
|
||||
"key":"TweakAtZ",
|
||||
"key":"ChangeAtZ",
|
||||
"metadata": {},
|
||||
"version": 2,
|
||||
"settings":
|
||||
|
|
@ -109,7 +109,7 @@ class TweakAtZ(Script):
|
|||
"maximum_value_warning": "50",
|
||||
"enabled": "c_behavior == 'keep_value'"
|
||||
},
|
||||
"e1_Tweak_speed":
|
||||
"e1_Change_speed":
|
||||
{
|
||||
"label": "Change Speed",
|
||||
"description": "Select if total speed (print and travel) has to be cahnged",
|
||||
|
|
@ -126,9 +126,9 @@ class TweakAtZ(Script):
|
|||
"minimum_value": "1",
|
||||
"minimum_value_warning": "10",
|
||||
"maximum_value_warning": "200",
|
||||
"enabled": "e1_Tweak_speed"
|
||||
"enabled": "e1_Change_speed"
|
||||
},
|
||||
"f1_Tweak_printspeed":
|
||||
"f1_Change_printspeed":
|
||||
{
|
||||
"label": "Change Print Speed",
|
||||
"description": "Select if print speed has to be changed",
|
||||
|
|
@ -145,9 +145,9 @@ class TweakAtZ(Script):
|
|||
"minimum_value": "1",
|
||||
"minimum_value_warning": "10",
|
||||
"maximum_value_warning": "200",
|
||||
"enabled": "f1_Tweak_printspeed"
|
||||
"enabled": "f1_Change_printspeed"
|
||||
},
|
||||
"g1_Tweak_flowrate":
|
||||
"g1_Change_flowrate":
|
||||
{
|
||||
"label": "Change Flow Rate",
|
||||
"description": "Select if flow rate has to be changed",
|
||||
|
|
@ -164,9 +164,9 @@ class TweakAtZ(Script):
|
|||
"minimum_value": "1",
|
||||
"minimum_value_warning": "10",
|
||||
"maximum_value_warning": "200",
|
||||
"enabled": "g1_Tweak_flowrate"
|
||||
"enabled": "g1_Change_flowrate"
|
||||
},
|
||||
"g3_Tweak_flowrateOne":
|
||||
"g3_Change_flowrateOne":
|
||||
{
|
||||
"label": "Change Flow Rate 1",
|
||||
"description": "Select if first extruder flow rate has to be changed",
|
||||
|
|
@ -183,9 +183,9 @@ class TweakAtZ(Script):
|
|||
"minimum_value": "1",
|
||||
"minimum_value_warning": "10",
|
||||
"maximum_value_warning": "200",
|
||||
"enabled": "g3_Tweak_flowrateOne"
|
||||
"enabled": "g3_Change_flowrateOne"
|
||||
},
|
||||
"g5_Tweak_flowrateTwo":
|
||||
"g5_Change_flowrateTwo":
|
||||
{
|
||||
"label": "Change Flow Rate 2",
|
||||
"description": "Select if second extruder flow rate has to be changed",
|
||||
|
|
@ -202,9 +202,9 @@ class TweakAtZ(Script):
|
|||
"minimum_value": "1",
|
||||
"minimum_value_warning": "10",
|
||||
"maximum_value_warning": "200",
|
||||
"enabled": "g5_Tweak_flowrateTwo"
|
||||
"enabled": "g5_Change_flowrateTwo"
|
||||
},
|
||||
"h1_Tweak_bedTemp":
|
||||
"h1_Change_bedTemp":
|
||||
{
|
||||
"label": "Change Bed Temp",
|
||||
"description": "Select if Bed Temperature has to be changed",
|
||||
|
|
@ -221,9 +221,9 @@ class TweakAtZ(Script):
|
|||
"minimum_value": "0",
|
||||
"minimum_value_warning": "30",
|
||||
"maximum_value_warning": "120",
|
||||
"enabled": "h1_Tweak_bedTemp"
|
||||
"enabled": "h1_Change_bedTemp"
|
||||
},
|
||||
"i1_Tweak_extruderOne":
|
||||
"i1_Change_extruderOne":
|
||||
{
|
||||
"label": "Change Extruder 1 Temp",
|
||||
"description": "Select if First Extruder Temperature has to be changed",
|
||||
|
|
@ -240,9 +240,9 @@ class TweakAtZ(Script):
|
|||
"minimum_value": "0",
|
||||
"minimum_value_warning": "160",
|
||||
"maximum_value_warning": "250",
|
||||
"enabled": "i1_Tweak_extruderOne"
|
||||
"enabled": "i1_Change_extruderOne"
|
||||
},
|
||||
"i3_Tweak_extruderTwo":
|
||||
"i3_Change_extruderTwo":
|
||||
{
|
||||
"label": "Change Extruder 2 Temp",
|
||||
"description": "Select if Second Extruder Temperature has to be changed",
|
||||
|
|
@ -259,9 +259,9 @@ class TweakAtZ(Script):
|
|||
"minimum_value": "0",
|
||||
"minimum_value_warning": "160",
|
||||
"maximum_value_warning": "250",
|
||||
"enabled": "i3_Tweak_extruderTwo"
|
||||
"enabled": "i3_Change_extruderTwo"
|
||||
},
|
||||
"j1_Tweak_fanSpeed":
|
||||
"j1_Change_fanSpeed":
|
||||
{
|
||||
"label": "Change Fan Speed",
|
||||
"description": "Select if Fan Speed has to be changed",
|
||||
|
|
@ -278,17 +278,17 @@ class TweakAtZ(Script):
|
|||
"minimum_value": "0",
|
||||
"minimum_value_warning": "15",
|
||||
"maximum_value_warning": "255",
|
||||
"enabled": "j1_Tweak_fanSpeed"
|
||||
"enabled": "j1_Change_fanSpeed"
|
||||
}
|
||||
}
|
||||
}"""
|
||||
|
||||
def getValue(self, line, key, default = None): #replace default getvalue due to comment-reading feature
|
||||
if not key in line or (";" in line and line.find(key) > line.find(";") and
|
||||
not ";TweakAtZ" in key and not ";LAYER:" in key):
|
||||
not ";ChangeAtZ" in key and not ";LAYER:" in key):
|
||||
return default
|
||||
subPart = line[line.find(key) + len(key):] #allows for string lengths larger than 1
|
||||
if ";TweakAtZ" in key:
|
||||
if ";ChangeAtZ" in key:
|
||||
m = re.search("^[0-4]", subPart)
|
||||
elif ";LAYER:" in key:
|
||||
m = re.search("^[+-]?[0-9]*", subPart)
|
||||
|
|
@ -303,17 +303,17 @@ class TweakAtZ(Script):
|
|||
return default
|
||||
|
||||
def execute(self, data):
|
||||
#Check which tweaks should apply
|
||||
TweakProp = {"speed": self.getSettingValueByKey("e1_Tweak_speed"),
|
||||
"flowrate": self.getSettingValueByKey("g1_Tweak_flowrate"),
|
||||
"flowrateOne": self.getSettingValueByKey("g3_Tweak_flowrateOne"),
|
||||
"flowrateTwo": self.getSettingValueByKey("g5_Tweak_flowrateTwo"),
|
||||
"bedTemp": self.getSettingValueByKey("h1_Tweak_bedTemp"),
|
||||
"extruderOne": self.getSettingValueByKey("i1_Tweak_extruderOne"),
|
||||
"extruderTwo": self.getSettingValueByKey("i3_Tweak_extruderTwo"),
|
||||
"fanSpeed": self.getSettingValueByKey("j1_Tweak_fanSpeed")}
|
||||
TweakPrintSpeed = self.getSettingValueByKey("f1_Tweak_printspeed")
|
||||
TweakStrings = {"speed": "M220 S%f\n",
|
||||
#Check which changes should apply
|
||||
ChangeProp = {"speed": self.getSettingValueByKey("e1_Change_speed"),
|
||||
"flowrate": self.getSettingValueByKey("g1_Change_flowrate"),
|
||||
"flowrateOne": self.getSettingValueByKey("g3_Change_flowrateOne"),
|
||||
"flowrateTwo": self.getSettingValueByKey("g5_Change_flowrateTwo"),
|
||||
"bedTemp": self.getSettingValueByKey("h1_Change_bedTemp"),
|
||||
"extruderOne": self.getSettingValueByKey("i1_Change_extruderOne"),
|
||||
"extruderTwo": self.getSettingValueByKey("i3_Change_extruderTwo"),
|
||||
"fanSpeed": self.getSettingValueByKey("j1_Change_fanSpeed")}
|
||||
ChangePrintSpeed = self.getSettingValueByKey("f1_Change_printspeed")
|
||||
ChangeStrings = {"speed": "M220 S%f\n",
|
||||
"flowrate": "M221 S%f\n",
|
||||
"flowrateOne": "M221 T0 S%f\n",
|
||||
"flowrateTwo": "M221 T1 S%f\n",
|
||||
|
|
@ -369,14 +369,14 @@ class TweakAtZ(Script):
|
|||
for line in lines:
|
||||
if ";Generated with Cura_SteamEngine" in line:
|
||||
TWinstances += 1
|
||||
modified_gcode += ";TweakAtZ instances: %d\n" % TWinstances
|
||||
if not ("M84" in line or "M25" in line or ("G1" in line and TweakPrintSpeed and (state==3 or state==4)) or
|
||||
";TweakAtZ instances:" in line):
|
||||
modified_gcode += ";ChangeAtZ instances: %d\n" % TWinstances
|
||||
if not ("M84" in line or "M25" in line or ("G1" in line and ChangePrintSpeed and (state==3 or state==4)) or
|
||||
";ChangeAtZ instances:" in line):
|
||||
modified_gcode += line + "\n"
|
||||
IsUM2 = ("FLAVOR:UltiGCode" in line) or IsUM2 #Flavor is UltiGCode!
|
||||
if ";TweakAtZ-state" in line: #checks for state change comment
|
||||
state = self.getValue(line, ";TweakAtZ-state", state)
|
||||
if ";TweakAtZ instances:" in line:
|
||||
if ";ChangeAtZ-state" in line: #checks for state change comment
|
||||
state = self.getValue(line, ";ChangeAtZ-state", state)
|
||||
if ";ChangeAtZ instances:" in line:
|
||||
try:
|
||||
tempTWi = int(line[20:])
|
||||
except:
|
||||
|
|
@ -390,7 +390,7 @@ class TweakAtZ(Script):
|
|||
state = old["state"]
|
||||
layer = self.getValue(line, ";LAYER:", layer)
|
||||
if targetL_i > -100000: #target selected by layer no.
|
||||
if (state == 2 or targetL_i == 0) and layer == targetL_i: #determine targetZ from layer no.; checks for tweak on layer 0
|
||||
if (state == 2 or targetL_i == 0) and layer == targetL_i: #determine targetZ from layer no.; checks for change on layer 0
|
||||
state = 2
|
||||
targetZ = z + 0.001
|
||||
if (self.getValue(line, "T", None) is not None) and (self.getValue(line, "M", None) is None): #looking for single T-cmd
|
||||
|
|
@ -415,7 +415,7 @@ class TweakAtZ(Script):
|
|||
elif tmp_extruder == 1: #second extruder
|
||||
old["flowrateOne"] = self.getValue(line, "S", old["flowrateOne"])
|
||||
if ("M84" in line or "M25" in line):
|
||||
if state>0 and TweakProp["speed"]: #"finish" commands for UM Original and UM2
|
||||
if state>0 and ChangeProp["speed"]: #"finish" commands for UM Original and UM2
|
||||
modified_gcode += "M220 S100 ; speed reset to 100% at the end of print\n"
|
||||
modified_gcode += "M117 \n"
|
||||
modified_gcode += line + "\n"
|
||||
|
|
@ -425,14 +425,14 @@ class TweakAtZ(Script):
|
|||
y = self.getValue(line, "Y", None)
|
||||
e = self.getValue(line, "E", None)
|
||||
f = self.getValue(line, "F", None)
|
||||
if 'G1' in line and TweakPrintSpeed and (state==3 or state==4):
|
||||
if 'G1' in line and ChangePrintSpeed and (state==3 or state==4):
|
||||
# check for pure print movement in target range:
|
||||
if x != None and y != None and f != None and e != None and newZ==z:
|
||||
modified_gcode += "G1 F%d X%1.3f Y%1.3f E%1.5f\n" % (int(f / 100.0 * float(target_values["printspeed"])), self.getValue(line, "X"),
|
||||
self.getValue(line, "Y"), self.getValue(line, "E"))
|
||||
else: #G1 command but not a print movement
|
||||
modified_gcode += line + "\n"
|
||||
# no tweaking on retraction hops which have no x and y coordinate:
|
||||
# no changing on retraction hops which have no x and y coordinate:
|
||||
if (newZ != z) and (x is not None) and (y is not None):
|
||||
z = newZ
|
||||
if z < targetZ and state == 1:
|
||||
|
|
@ -440,56 +440,56 @@ class TweakAtZ(Script):
|
|||
if z >= targetZ and state == 2:
|
||||
state = 3
|
||||
done_layers = 0
|
||||
for key in TweakProp:
|
||||
if TweakProp[key] and old[key]==-1: #old value is not known
|
||||
for key in ChangeProp:
|
||||
if ChangeProp[key] and old[key]==-1: #old value is not known
|
||||
oldValueUnknown = True
|
||||
if oldValueUnknown: #the tweaking has to happen within one layer
|
||||
if oldValueUnknown: #the changing has to happen within one layer
|
||||
twLayers = 1
|
||||
if IsUM2: #Parameters have to be stored in the printer (UltiGCode=UM2)
|
||||
modified_gcode += "M605 S%d;stores parameters before tweaking\n" % (TWinstances-1)
|
||||
if behavior == 1: #single layer tweak only and then reset
|
||||
modified_gcode += "M605 S%d;stores parameters before changing\n" % (TWinstances-1)
|
||||
if behavior == 1: #single layer change only and then reset
|
||||
twLayers = 1
|
||||
if TweakPrintSpeed and behavior == 0:
|
||||
if ChangePrintSpeed and behavior == 0:
|
||||
twLayers = done_layers + 1
|
||||
if state==3:
|
||||
if twLayers-done_layers>0: #still layers to go?
|
||||
if targetL_i > -100000:
|
||||
modified_gcode += ";TweakAtZ V%s: executed at Layer %d\n" % (self.version,layer)
|
||||
modified_gcode += "M117 Printing... tw@L%4d\n" % layer
|
||||
modified_gcode += ";ChangeAtZ V%s: executed at Layer %d\n" % (self.version,layer)
|
||||
modified_gcode += "M117 Printing... ch@L%4d\n" % layer
|
||||
else:
|
||||
modified_gcode += (";TweakAtZ V%s: executed at %1.2f mm\n" % (self.version,z))
|
||||
modified_gcode += "M117 Printing... tw@%5.1f\n" % z
|
||||
for key in TweakProp:
|
||||
if TweakProp[key]:
|
||||
modified_gcode += TweakStrings[key] % float(old[key]+(float(target_values[key])-float(old[key]))/float(twLayers)*float(done_layers+1))
|
||||
modified_gcode += (";ChangeAtZ V%s: executed at %1.2f mm\n" % (self.version,z))
|
||||
modified_gcode += "M117 Printing... ch@%5.1f\n" % z
|
||||
for key in ChangeProp:
|
||||
if ChangeProp[key]:
|
||||
modified_gcode += ChangeStrings[key] % float(old[key]+(float(target_values[key])-float(old[key]))/float(twLayers)*float(done_layers+1))
|
||||
done_layers += 1
|
||||
else:
|
||||
state = 4
|
||||
if behavior == 1: #reset values after one layer
|
||||
if targetL_i > -100000:
|
||||
modified_gcode += ";TweakAtZ V%s: reset on Layer %d\n" % (self.version,layer)
|
||||
modified_gcode += ";ChangeAtZ V%s: reset on Layer %d\n" % (self.version,layer)
|
||||
else:
|
||||
modified_gcode += ";TweakAtZ V%s: reset at %1.2f mm\n" % (self.version,z)
|
||||
modified_gcode += ";ChangeAtZ V%s: reset at %1.2f mm\n" % (self.version,z)
|
||||
if IsUM2 and oldValueUnknown: #executes on UM2 with Ultigcode and machine setting
|
||||
modified_gcode += "M606 S%d;recalls saved settings\n" % (TWinstances-1)
|
||||
else: #executes on RepRap, UM2 with Ultigcode and Cura setting
|
||||
for key in TweakProp:
|
||||
if TweakProp[key]:
|
||||
modified_gcode += TweakStrings[key] % float(old[key])
|
||||
for key in ChangeProp:
|
||||
if ChangeProp[key]:
|
||||
modified_gcode += ChangeStrings[key] % float(old[key])
|
||||
# re-activates the plugin if executed by pre-print G-command, resets settings:
|
||||
if (z < targetZ or layer == 0) and state >= 3: #resets if below tweak level or at level 0
|
||||
if (z < targetZ or layer == 0) and state >= 3: #resets if below change level or at level 0
|
||||
state = 2
|
||||
done_layers = 0
|
||||
if targetL_i > -100000:
|
||||
modified_gcode += ";TweakAtZ V%s: reset below Layer %d\n" % (self.version,targetL_i)
|
||||
modified_gcode += ";ChangeAtZ V%s: reset below Layer %d\n" % (self.version,targetL_i)
|
||||
else:
|
||||
modified_gcode += ";TweakAtZ V%s: reset below %1.2f mm\n" % (self.version,targetZ)
|
||||
modified_gcode += ";ChangeAtZ V%s: reset below %1.2f mm\n" % (self.version,targetZ)
|
||||
if IsUM2 and oldValueUnknown: #executes on UM2 with Ultigcode and machine setting
|
||||
modified_gcode += "M606 S%d;recalls saved settings\n" % (TWinstances-1)
|
||||
else: #executes on RepRap, UM2 with Ultigcode and Cura setting
|
||||
for key in TweakProp:
|
||||
if TweakProp[key]:
|
||||
modified_gcode += TweakStrings[key] % float(old[key])
|
||||
for key in ChangeProp:
|
||||
if ChangeProp[key]:
|
||||
modified_gcode += ChangeStrings[key] % float(old[key])
|
||||
data[index] = modified_gcode
|
||||
index += 1
|
||||
return data
|
||||
|
|
@ -7,19 +7,40 @@ class PauseAtHeight(Script):
|
|||
|
||||
def getSettingDataString(self):
|
||||
return """{
|
||||
"name":"Pause at height",
|
||||
"name": "Pause at height",
|
||||
"key": "PauseAtHeight",
|
||||
"metadata": {},
|
||||
"version": 2,
|
||||
"settings":
|
||||
{
|
||||
"pause_at":
|
||||
{
|
||||
"label": "Pause at",
|
||||
"description": "Whether to pause at a certain height or at a certain layer.",
|
||||
"type": "enum",
|
||||
"options": {"height": "Height", "layer_no": "Layer No."},
|
||||
"default_value": "height"
|
||||
},
|
||||
"pause_height":
|
||||
{
|
||||
"label": "Pause Height",
|
||||
"description": "At what height should the pause occur",
|
||||
"unit": "mm",
|
||||
"type": "float",
|
||||
"default_value": 5.0
|
||||
"default_value": 5.0,
|
||||
"minimum_value": "0",
|
||||
"minimum_value_warning": "0.27",
|
||||
"enabled": "pause_at == 'height'"
|
||||
},
|
||||
"pause_layer":
|
||||
{
|
||||
"label": "Pause Layer",
|
||||
"description": "At what layer should the pause occur",
|
||||
"type": "int",
|
||||
"value": "math.floor((pause_height - 0.27) / 0.1) + 1",
|
||||
"minimum_value": "0",
|
||||
"minimum_value_warning": "1",
|
||||
"enabled": "pause_at == 'layer_no'"
|
||||
},
|
||||
"head_park_x":
|
||||
{
|
||||
|
|
@ -102,8 +123,9 @@ class PauseAtHeight(Script):
|
|||
|
||||
x = 0.
|
||||
y = 0.
|
||||
current_z = 0.
|
||||
pause_at = self.getSettingValueByKey("pause_at")
|
||||
pause_height = self.getSettingValueByKey("pause_height")
|
||||
pause_layer = self.getSettingValueByKey("pause_layer")
|
||||
retraction_amount = self.getSettingValueByKey("retraction_amount")
|
||||
retraction_speed = self.getSettingValueByKey("retraction_speed")
|
||||
extrude_amount = self.getSettingValueByKey("extrude_amount")
|
||||
|
|
@ -121,101 +143,121 @@ class PauseAtHeight(Script):
|
|||
|
||||
# use offset to calculate the current height: <current_height> = <current_z> - <layer_0_z>
|
||||
layer_0_z = 0.
|
||||
current_z = 0
|
||||
got_first_g_cmd_on_layer_0 = False
|
||||
for layer in data:
|
||||
for index, layer in enumerate(data):
|
||||
lines = layer.split("\n")
|
||||
for line in lines:
|
||||
if ";LAYER:0" in line:
|
||||
layers_started = True
|
||||
continue
|
||||
|
||||
if not layers_started:
|
||||
continue
|
||||
|
||||
if self.getValue(line, 'G') == 1 or self.getValue(line, 'G') == 0:
|
||||
current_z = self.getValue(line, 'Z')
|
||||
if self.getValue(line, "Z") is not None:
|
||||
current_z = self.getValue(line, "Z")
|
||||
|
||||
if pause_at == "height":
|
||||
if self.getValue(line, "G") != 1 and self.getValue(line, "G") != 0:
|
||||
continue
|
||||
|
||||
if not got_first_g_cmd_on_layer_0:
|
||||
layer_0_z = current_z
|
||||
got_first_g_cmd_on_layer_0 = True
|
||||
|
||||
x = self.getValue(line, 'X', x)
|
||||
y = self.getValue(line, 'Y', y)
|
||||
if current_z is not None:
|
||||
current_height = current_z - layer_0_z
|
||||
if current_height >= pause_height:
|
||||
index = data.index(layer)
|
||||
prevLayer = data[index - 1]
|
||||
prevLines = prevLayer.split("\n")
|
||||
current_e = 0.
|
||||
for prevLine in reversed(prevLines):
|
||||
current_e = self.getValue(prevLine, 'E', -1)
|
||||
if current_e >= 0:
|
||||
break
|
||||
x = self.getValue(line, "X", x)
|
||||
y = self.getValue(line, "Y", y)
|
||||
|
||||
# include a number of previous layers
|
||||
for i in range(1, redo_layers + 1):
|
||||
prevLayer = data[index - i]
|
||||
layer = prevLayer + layer
|
||||
current_height = current_z - layer_0_z
|
||||
if current_height < pause_height:
|
||||
break #Try the next layer.
|
||||
else: #Pause at layer.
|
||||
if not line.startswith(";LAYER:"):
|
||||
continue
|
||||
current_layer = line[len(";LAYER:"):]
|
||||
print("----------current_layer:", current_layer)
|
||||
try:
|
||||
current_layer = int(current_layer)
|
||||
except ValueError: #Couldn't cast to int. Something is wrong with this g-code data.
|
||||
print("----------couldn't cast to int")
|
||||
continue
|
||||
if current_layer < pause_layer:
|
||||
break #Try the next layer.
|
||||
print("------------hit! Got it!")
|
||||
|
||||
prepend_gcode = ";TYPE:CUSTOM\n"
|
||||
prepend_gcode += ";added code by post processing\n"
|
||||
prepend_gcode += ";script: PauseAtHeight.py\n"
|
||||
prepend_gcode += ";current z: %f \n" % current_z
|
||||
prepend_gcode += ";current height: %f \n" % current_height
|
||||
|
||||
# Retraction
|
||||
prepend_gcode += "M83\n"
|
||||
if retraction_amount != 0:
|
||||
prepend_gcode += "G1 E-%f F%f\n" % (retraction_amount, retraction_speed * 60)
|
||||
|
||||
# Move the head away
|
||||
prepend_gcode += "G1 Z%f F300\n" % (current_z + 1)
|
||||
prepend_gcode += "G1 X%f Y%f F9000\n" % (park_x, park_y)
|
||||
if current_z < 15:
|
||||
prepend_gcode += "G1 Z15 F300\n"
|
||||
|
||||
# Disable the E steppers
|
||||
prepend_gcode += "M84 E0\n"
|
||||
|
||||
# Set extruder standby temperature
|
||||
prepend_gcode += "M104 S%i; standby temperature\n" % (standby_temperature)
|
||||
|
||||
# Wait till the user continues printing
|
||||
prepend_gcode += "M0 ;Do the actual pause\n"
|
||||
|
||||
# Set extruder resume temperature
|
||||
prepend_gcode += "M109 S%i; resume temperature\n" % (resume_temperature)
|
||||
|
||||
# Push the filament back,
|
||||
if retraction_amount != 0:
|
||||
prepend_gcode += "G1 E%f F%f\n" % (retraction_amount, retraction_speed * 60)
|
||||
|
||||
# Optionally extrude material
|
||||
if extrude_amount != 0:
|
||||
prepend_gcode += "G1 E%f F%f\n" % (extrude_amount, extrude_speed * 60)
|
||||
|
||||
# and retract again, the properly primes the nozzle
|
||||
# when changing filament.
|
||||
if retraction_amount != 0:
|
||||
prepend_gcode += "G1 E-%f F%f\n" % (retraction_amount, retraction_speed * 60)
|
||||
|
||||
# Move the head back
|
||||
prepend_gcode += "G1 Z%f F300\n" % (current_z + 1)
|
||||
prepend_gcode += "G1 X%f Y%f F9000\n" % (x, y)
|
||||
if retraction_amount != 0:
|
||||
prepend_gcode += "G1 E%f F%f\n" % (retraction_amount, retraction_speed * 60)
|
||||
prepend_gcode += "G1 F9000\n"
|
||||
prepend_gcode += "M82\n"
|
||||
|
||||
# reset extrude value to pre pause value
|
||||
prepend_gcode += "G92 E%f\n" % (current_e)
|
||||
|
||||
layer = prepend_gcode + layer
|
||||
|
||||
|
||||
# Override the data of this layer with the
|
||||
# modified data
|
||||
data[index] = layer
|
||||
return data
|
||||
prevLayer = data[index - 1]
|
||||
prevLines = prevLayer.split("\n")
|
||||
current_e = 0.
|
||||
for prevLine in reversed(prevLines):
|
||||
current_e = self.getValue(prevLine, "E", -1)
|
||||
if current_e >= 0:
|
||||
break
|
||||
|
||||
# include a number of previous layers
|
||||
for i in range(1, redo_layers + 1):
|
||||
prevLayer = data[index - i]
|
||||
layer = prevLayer + layer
|
||||
|
||||
prepend_gcode = ";TYPE:CUSTOM\n"
|
||||
prepend_gcode += ";added code by post processing\n"
|
||||
prepend_gcode += ";script: PauseAtHeight.py\n"
|
||||
if pause_at == "height":
|
||||
prepend_gcode += ";current z: {z}\n".format(z = current_z)
|
||||
prepend_gcode += ";current height: {height}\n".format(height = current_height)
|
||||
else:
|
||||
prepend_gcode += ";current layer: {layer}\n".format(layer = current_layer)
|
||||
|
||||
# Retraction
|
||||
prepend_gcode += "M83\n"
|
||||
if retraction_amount != 0:
|
||||
prepend_gcode += "G1 E-%f F%f\n" % (retraction_amount, retraction_speed * 60)
|
||||
|
||||
# Move the head away
|
||||
prepend_gcode += "G1 Z%f F300\n" % (current_z + 1)
|
||||
prepend_gcode += "G1 X%f Y%f F9000\n" % (park_x, park_y)
|
||||
if current_z < 15:
|
||||
prepend_gcode += "G1 Z15 F300\n"
|
||||
|
||||
# Disable the E steppers
|
||||
prepend_gcode += "M84 E0\n"
|
||||
|
||||
# Set extruder standby temperature
|
||||
prepend_gcode += "M104 S%i; standby temperature\n" % (standby_temperature)
|
||||
|
||||
# Wait till the user continues printing
|
||||
prepend_gcode += "M0 ;Do the actual pause\n"
|
||||
|
||||
# Set extruder resume temperature
|
||||
prepend_gcode += "M109 S%i; resume temperature\n" % (resume_temperature)
|
||||
|
||||
# Push the filament back,
|
||||
if retraction_amount != 0:
|
||||
prepend_gcode += "G1 E%f F%f\n" % (retraction_amount, retraction_speed * 60)
|
||||
|
||||
# Optionally extrude material
|
||||
if extrude_amount != 0:
|
||||
prepend_gcode += "G1 E%f F%f\n" % (extrude_amount, extrude_speed * 60)
|
||||
|
||||
# and retract again, the properly primes the nozzle
|
||||
# when changing filament.
|
||||
if retraction_amount != 0:
|
||||
prepend_gcode += "G1 E-%f F%f\n" % (retraction_amount, retraction_speed * 60)
|
||||
|
||||
# Move the head back
|
||||
prepend_gcode += "G1 Z%f F300\n" % (current_z + 1)
|
||||
prepend_gcode += "G1 X%f Y%f F9000\n" % (x, y)
|
||||
if retraction_amount != 0:
|
||||
prepend_gcode += "G1 E%f F%f\n" % (retraction_amount, retraction_speed * 60)
|
||||
prepend_gcode += "G1 F9000\n"
|
||||
prepend_gcode += "M82\n"
|
||||
|
||||
# reset extrude value to pre pause value
|
||||
prepend_gcode += "G92 E%f\n" % (current_e)
|
||||
|
||||
layer = prepend_gcode + layer
|
||||
|
||||
|
||||
# Override the data of this layer with the
|
||||
# modified data
|
||||
data[index] = layer
|
||||
return data
|
||||
return data
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ class PauseAtHeightforRepetier(Script):
|
|||
"type": "float",
|
||||
"default_value": 5.0
|
||||
},
|
||||
"head_move_Z":
|
||||
"head_move_Z":
|
||||
{
|
||||
"label": "Head move Z",
|
||||
"description": "The Hieght of Z-axis retraction before parking.",
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ UM.PointingRectangle {
|
|||
|
||||
anchors {
|
||||
left: parent.left
|
||||
leftMargin: Math.floor(UM.Theme.getSize("default_margin").width / 2)
|
||||
leftMargin: Math.round(UM.Theme.getSize("default_margin").width / 2)
|
||||
verticalCenter: parent.verticalCenter
|
||||
}
|
||||
|
||||
|
|
@ -91,7 +91,7 @@ UM.PointingRectangle {
|
|||
|
||||
anchors {
|
||||
left: parent.right
|
||||
leftMargin: Math.floor(UM.Theme.getSize("default_margin").width / 2)
|
||||
leftMargin: Math.round(UM.Theme.getSize("default_margin").width / 2)
|
||||
verticalCenter: parent.verticalCenter
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -342,6 +342,11 @@ class SimulationView(View):
|
|||
min_layer_number = sys.maxsize
|
||||
max_layer_number = -sys.maxsize
|
||||
for layer_id in layer_data.getLayers():
|
||||
|
||||
# If a layer doesn't contain any polygons, skip it (for infill meshes taller than print objects
|
||||
if len(layer_data.getLayer(layer_id).polygons) < 1:
|
||||
continue
|
||||
|
||||
# Store the max and min feedrates and thicknesses for display purposes
|
||||
for p in layer_data.getLayer(layer_id).polygons:
|
||||
self._max_feedrate = max(float(p.lineFeedrates.max()), self._max_feedrate)
|
||||
|
|
@ -634,4 +639,3 @@ class _CreateTopLayersJob(Job):
|
|||
def cancel(self):
|
||||
self._cancel = True
|
||||
super().cancel()
|
||||
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ Item
|
|||
Button {
|
||||
id: collapseButton
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: Math.floor(UM.Theme.getSize("default_margin").height + (UM.Theme.getSize("layerview_row").height - UM.Theme.getSize("default_margin").height) / 2)
|
||||
anchors.topMargin: Math.round(UM.Theme.getSize("default_margin").height + (UM.Theme.getSize("layerview_row").height - UM.Theme.getSize("default_margin").height) / 2)
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: UM.Theme.getSize("default_margin").width
|
||||
|
||||
|
|
@ -193,7 +193,7 @@ Item
|
|||
|
||||
Item
|
||||
{
|
||||
height: Math.floor(UM.Theme.getSize("default_margin").width / 2)
|
||||
height: Math.round(UM.Theme.getSize("default_margin").width / 2)
|
||||
width: width
|
||||
}
|
||||
|
||||
|
|
@ -231,7 +231,7 @@ Item
|
|||
width: UM.Theme.getSize("layerview_legend_size").width
|
||||
height: UM.Theme.getSize("layerview_legend_size").height
|
||||
color: model.color
|
||||
radius: width / 2
|
||||
radius: Math.round(width / 2)
|
||||
border.width: UM.Theme.getSize("default_lining").width
|
||||
border.color: UM.Theme.getColor("lining")
|
||||
visible: !viewSettings.show_legend & !viewSettings.show_gradient
|
||||
|
|
@ -249,7 +249,7 @@ Item
|
|||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: extrudersModelCheckBox.left;
|
||||
anchors.right: extrudersModelCheckBox.right;
|
||||
anchors.leftMargin: UM.Theme.getSize("checkbox").width + UM.Theme.getSize("default_margin").width /2
|
||||
anchors.leftMargin: UM.Theme.getSize("checkbox").width + Math.round(UM.Theme.getSize("default_margin").width/2)
|
||||
anchors.rightMargin: UM.Theme.getSize("default_margin").width * 2
|
||||
}
|
||||
}
|
||||
|
|
@ -316,7 +316,7 @@ Item
|
|||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: legendModelCheckBox.left;
|
||||
anchors.right: legendModelCheckBox.right;
|
||||
anchors.leftMargin: UM.Theme.getSize("checkbox").width + UM.Theme.getSize("default_margin").width /2
|
||||
anchors.leftMargin: UM.Theme.getSize("checkbox").width + Math.round(UM.Theme.getSize("default_margin").width/2)
|
||||
anchors.rightMargin: UM.Theme.getSize("default_margin").width * 2
|
||||
}
|
||||
}
|
||||
|
|
@ -461,7 +461,7 @@ Item
|
|||
visible: viewSettings.show_feedrate_gradient
|
||||
anchors.left: parent.right
|
||||
height: parent.width
|
||||
width: UM.Theme.getSize("layerview_row").height * 1.5
|
||||
width: Math.round(UM.Theme.getSize("layerview_row").height * 1.5)
|
||||
border.width: UM.Theme.getSize("default_lining").width
|
||||
border.color: UM.Theme.getColor("lining")
|
||||
transform: Rotation {origin.x: 0; origin.y: 0; angle: 90}
|
||||
|
|
@ -492,7 +492,7 @@ Item
|
|||
visible: viewSettings.show_thickness_gradient
|
||||
anchors.left: parent.right
|
||||
height: parent.width
|
||||
width: UM.Theme.getSize("layerview_row").height * 1.5
|
||||
width: Math.round(UM.Theme.getSize("layerview_row").height * 1.5)
|
||||
border.width: UM.Theme.getSize("default_lining").width
|
||||
border.color: UM.Theme.getColor("lining")
|
||||
transform: Rotation {origin.x: 0; origin.y: 0; angle: 90}
|
||||
|
|
|
|||
|
|
@ -114,7 +114,7 @@ Cura.MachineAction
|
|||
|
||||
Column
|
||||
{
|
||||
width: Math.floor(parent.width * 0.5)
|
||||
width: Math.round(parent.width * 0.5)
|
||||
spacing: UM.Theme.getSize("default_margin").height
|
||||
|
||||
ScrollView
|
||||
|
|
@ -198,7 +198,7 @@ Cura.MachineAction
|
|||
}
|
||||
Column
|
||||
{
|
||||
width: Math.floor(parent.width * 0.5)
|
||||
width: Math.round(parent.width * 0.5)
|
||||
visible: base.selectedDevice ? true : false
|
||||
spacing: UM.Theme.getSize("default_margin").height
|
||||
Label
|
||||
|
|
@ -216,13 +216,13 @@ Cura.MachineAction
|
|||
columns: 2
|
||||
Label
|
||||
{
|
||||
width: Math.floor(parent.width * 0.5)
|
||||
width: Math.round(parent.width * 0.5)
|
||||
wrapMode: Text.WordWrap
|
||||
text: catalog.i18nc("@label", "Type")
|
||||
}
|
||||
Label
|
||||
{
|
||||
width: Math.floor(parent.width * 0.5)
|
||||
width: Math.round(parent.width * 0.5)
|
||||
wrapMode: Text.WordWrap
|
||||
text:
|
||||
{
|
||||
|
|
@ -247,25 +247,25 @@ Cura.MachineAction
|
|||
}
|
||||
Label
|
||||
{
|
||||
width: Math.floor(parent.width * 0.5)
|
||||
width: Math.round(parent.width * 0.5)
|
||||
wrapMode: Text.WordWrap
|
||||
text: catalog.i18nc("@label", "Firmware version")
|
||||
}
|
||||
Label
|
||||
{
|
||||
width: Math.floor(parent.width * 0.5)
|
||||
width: Math.round(parent.width * 0.5)
|
||||
wrapMode: Text.WordWrap
|
||||
text: base.selectedDevice ? base.selectedDevice.firmwareVersion : ""
|
||||
}
|
||||
Label
|
||||
{
|
||||
width: Math.floor(parent.width * 0.5)
|
||||
width: Math.round(parent.width * 0.5)
|
||||
wrapMode: Text.WordWrap
|
||||
text: catalog.i18nc("@label", "Address")
|
||||
}
|
||||
Label
|
||||
{
|
||||
width: Math.floor(parent.width * 0.5)
|
||||
width: Math.round(parent.width * 0.5)
|
||||
wrapMode: Text.WordWrap
|
||||
text: base.selectedDevice ? base.selectedDevice.ipAddress : ""
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ Item
|
|||
id: extruderInfo
|
||||
property var printCoreConfiguration
|
||||
|
||||
width: Math.floor(parent.width / 2)
|
||||
width: Math.round(parent.width / 2)
|
||||
height: childrenRect.height
|
||||
Label
|
||||
{
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@ Rectangle
|
|||
|
||||
Rectangle
|
||||
{
|
||||
width: Math.floor(parent.width / 3)
|
||||
width: Math.round(parent.width / 3)
|
||||
height: parent.height
|
||||
|
||||
Label // Print job name
|
||||
|
|
@ -123,7 +123,7 @@ Rectangle
|
|||
|
||||
Rectangle
|
||||
{
|
||||
width: Math.floor(parent.width / 3 * 2)
|
||||
width: Math.round(parent.width / 3 * 2)
|
||||
height: parent.height
|
||||
|
||||
Label // Friendly machine name
|
||||
|
|
@ -131,7 +131,7 @@ Rectangle
|
|||
id: printerNameLabel
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
width: Math.floor(parent.width / 2 - UM.Theme.getSize("default_margin").width - showCameraIcon.width)
|
||||
width: Math.round(parent.width / 2 - UM.Theme.getSize("default_margin").width - showCameraIcon.width)
|
||||
text: printer.name
|
||||
font: UM.Theme.getFont("default_bold")
|
||||
elide: Text.ElideRight
|
||||
|
|
@ -141,7 +141,7 @@ Rectangle
|
|||
{
|
||||
id: printerTypeLabel
|
||||
anchors.top: printerNameLabel.bottom
|
||||
width: Math.floor(parent.width / 2 - UM.Theme.getSize("default_margin").width)
|
||||
width: Math.round(parent.width / 2 - UM.Theme.getSize("default_margin").width)
|
||||
text: printer.type
|
||||
anchors.left: parent.left
|
||||
elide: Text.ElideRight
|
||||
|
|
@ -175,7 +175,7 @@ Rectangle
|
|||
id: extruderInfo
|
||||
anchors.bottom: parent.bottom
|
||||
|
||||
width: Math.floor(parent.width / 2 - UM.Theme.getSize("default_margin").width)
|
||||
width: Math.round(parent.width / 2 - UM.Theme.getSize("default_margin").width)
|
||||
height: childrenRect.height
|
||||
|
||||
spacing: UM.Theme.getSize("default_margin").width
|
||||
|
|
@ -183,7 +183,7 @@ Rectangle
|
|||
PrintCoreConfiguration
|
||||
{
|
||||
id: leftExtruderInfo
|
||||
width: Math.floor((parent.width - extruderSeperator.width) / 2)
|
||||
width: Math.round((parent.width - extruderSeperator.width) / 2)
|
||||
printCoreConfiguration: printer.extruders[0]
|
||||
}
|
||||
|
||||
|
|
@ -198,7 +198,7 @@ Rectangle
|
|||
PrintCoreConfiguration
|
||||
{
|
||||
id: rightExtruderInfo
|
||||
width: Math.floor((parent.width - extruderSeperator.width) / 2)
|
||||
width: Math.round((parent.width - extruderSeperator.width) / 2)
|
||||
printCoreConfiguration: printer.extruders[1]
|
||||
}
|
||||
}
|
||||
|
|
@ -209,7 +209,7 @@ Rectangle
|
|||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
height: showExtended ? parent.height: printProgressTitleBar.height
|
||||
width: Math.floor(parent.width / 2 - UM.Theme.getSize("default_margin").width)
|
||||
width: Math.round(parent.width / 2 - UM.Theme.getSize("default_margin").width)
|
||||
border.width: UM.Theme.getSize("default_lining").width
|
||||
border.color: lineColor
|
||||
radius: cornerRadius
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ Item
|
|||
{
|
||||
id: cameraImage
|
||||
width: Math.min(sourceSize.width === 0 ? 800 * screenScaleFactor : sourceSize.width, maximumWidth)
|
||||
height: Math.floor((sourceSize.height === 0 ? 600 * screenScaleFactor : sourceSize.height) * width / sourceSize.width)
|
||||
height: Math.round((sourceSize.height === 0 ? 600 * screenScaleFactor : sourceSize.height) * width / sourceSize.width)
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
z: 1
|
||||
|
|
|
|||
|
|
@ -180,7 +180,7 @@ Cura.MachineAction
|
|||
height: childrenRect.height
|
||||
anchors.top: nozzleTempLabel.top
|
||||
anchors.left: bedTempStatus.right
|
||||
anchors.leftMargin: UM.Theme.getSize("default_margin").width/2
|
||||
anchors.leftMargin: Math.round(UM.Theme.getSize("default_margin").width/2)
|
||||
visible: checkupMachineAction.usbConnected
|
||||
Button
|
||||
{
|
||||
|
|
@ -241,7 +241,7 @@ Cura.MachineAction
|
|||
height: childrenRect.height
|
||||
anchors.top: bedTempLabel.top
|
||||
anchors.left: bedTempStatus.right
|
||||
anchors.leftMargin: UM.Theme.getSize("default_margin").width/2
|
||||
anchors.leftMargin: Math.round(UM.Theme.getSize("default_margin").width/2)
|
||||
visible: checkupMachineAction.usbConnected && manager.hasHeatedBed
|
||||
Button
|
||||
{
|
||||
|
|
|
|||
|
|
@ -9,8 +9,8 @@ import UM 1.3 as UM
|
|||
UM.Dialog
|
||||
{
|
||||
id: baseDialog
|
||||
minimumWidth: Math.floor(UM.Theme.getSize("modal_window_minimum").width * 0.75)
|
||||
minimumHeight: Math.floor(UM.Theme.getSize("modal_window_minimum").height * 0.5)
|
||||
minimumWidth: Math.round(UM.Theme.getSize("modal_window_minimum").width * 0.75)
|
||||
minimumHeight: Math.round(UM.Theme.getSize("modal_window_minimum").height * 0.5)
|
||||
width: minimumWidth
|
||||
height: minimumHeight
|
||||
title: catalog.i18nc("@title:window", "User Agreement")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue