Merge branch 'master' into CURA-6856_signed_plugins_and_packages

This commit is contained in:
Remco Burema 2019-11-01 16:45:42 +01:00
commit 3dabd6023b
No known key found for this signature in database
GPG Key ID: 215C49431D43F98C
148 changed files with 1704 additions and 696 deletions

View File

@ -11,23 +11,24 @@ Information about how to find the log file can be found at https://github.com/Ul
Thank you for using Cura!
-->
**Application Version**
<!-- The version of the application this issue occurs with -->
**Application version**
(The version of the application this issue occurs with.)
**Platform**
<!-- Information about the operating system the issue occurs on -->
(Information about the operating system the issue occurs on. Include at least the operating system. In the case of visual glitches/issues, also include information about your graphics drivers and GPU.)
**Printer**
<!-- Which printer was selected in Cura. Please attach project file as .curaproject.3mf.zip -->
(Which printer was selected in Cura? If possible, please attach project file as .curaproject.3mf.zip.)
**Steps to Reproduce**
<!-- Add the steps needed that lead up to the issue -->
**Reproduction steps**
1. Something you did.
2. Something you did next.
**Actual Results**
<!-- What happens after the above steps have been followed -->
**Actual results**
(What happens after the above steps have been followed.)
**Expected results**
<!-- What should happen after the above steps have been followed -->
(What should happen after the above steps have been followed.)
**Additional Information**
<!-- Extra information relevant to the issue, like screenshots -->
**Additional information**
(Extra information relevant to the issue, like screenshots. Don't forget to attach the log files with this issue report.)

View File

@ -22,22 +22,23 @@ Thank you for using Cura!
-->
**Application version**
<!-- The version of the application this issue occurs with -->
(The version of the application this issue occurs with.)
**Platform**
<!-- Information about the operating system the issue occurs on. Include at least the operating system. In the case of visual glitches/issues, also include information about your graphics drivers and GPU. -->
(Information about the operating system the issue occurs on. Include at least the operating system. In the case of visual glitches/issues, also include information about your graphics drivers and GPU.)
**Printer**
<!-- Which printer was selected in Cura? If possible, please attach project file as .curaproject.3mf.zip -->
(Which printer was selected in Cura? If possible, please attach project file as .curaproject.3mf.zip.)
**Reproduction steps**
<!-- How did you encounter the bug? -->
1. Something you did.
2. Something you did next.
**Actual results**
<!-- What happens after the above steps have been followed -->
(What happens after the above steps have been followed.)
**Expected results**
<!-- What should happen after the above steps have been followed -->
(What should happen after the above steps have been followed.)
**Additional information**
<!-- Extra information relevant to the issue, like screenshots. Don't forget to attach the log files with this issue report. -->
(Extra information relevant to the issue, like screenshots. Don't forget to attach the log files with this issue report.)

View File

@ -8,15 +8,16 @@ assignees: ''
---
**Is your feature request related to a problem? Please describe.**
<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
(A clear and concise description of what the problem is. Ex. I'm always frustrated when [...])
**Describe the solution you'd like**
<!--A clear and concise description of what you want to happen. If possible, describe why you think this is a good solution.-->
(A clear and concise description of what you want to happen. If possible, describe why you think this is a good solution.)
**Describe alternatives you've considered**
<!-- A clear and concise description of any alternative solutions or features you've considered. Again, if possible, think about why these alternatives are not working out. -->
(A clear and concise description of any alternative solutions or features you've considered. Again, if possible, think about why these alternatives are not working out.)
**Affected users and/or printers**
<!-- Who do you think will benefit from this? Is everyone going to benefit from these changes? Only a few people? -->
(Who do you think will benefit from this? Is everyone going to benefit from these changes? Or specific kinds of users?)
**Additional context**
<!-- Add any other context or screenshots about the feature request here. -->
(Add any other context or screenshots about the feature request here.)

View File

@ -49,7 +49,7 @@ endif()
if(NOT ${URANIUM_DIR} STREQUAL "")
set(CMAKE_MODULE_PATH "${URANIUM_DIR}/cmake")
set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${URANIUM_DIR}/cmake")
endif()
if(NOT ${URANIUM_SCRIPTS_DIR} STREQUAL "")
list(APPEND CMAKE_MODULE_PATH ${URANIUM_DIR}/cmake)
@ -63,8 +63,8 @@ endif()
install(DIRECTORY resources
DESTINATION ${CMAKE_INSTALL_DATADIR}/cura)
install(DIRECTORY plugins
DESTINATION lib${LIB_SUFFIX}/cura)
include(CuraPluginInstall)
if(NOT APPLE AND NOT WIN32)
install(FILES cura_app.py

View File

@ -0,0 +1,99 @@
# Copyright (c) 2019 Ultimaker B.V.
# CuraPluginInstall.cmake is released under the terms of the LGPLv3 or higher.
#
# This module detects all plugins that need to be installed and adds them using the CMake install() command.
# It detects all plugin folder in the path "plugins/*" where there's a "plugin.json" in it.
#
# Plugins can be configured to NOT BE INSTALLED via the variable "CURA_NO_INSTALL_PLUGINS" as a list of string in the
# form of "a;b;c" or "a,b,c". By default all plugins will be installed.
#
# FIXME: Remove the code for CMake <3.12 once we have switched over completely.
# FindPython3 is a new module since CMake 3.12. It deprecates FindPythonInterp and FindPythonLibs. The FindPython3
# module is copied from the CMake repository here so in CMake <3.12 we can still use it.
if(${CMAKE_VERSION} VERSION_LESS 3.12)
# Use FindPythonInterp and FindPythonLibs for CMake <3.12
find_package(PythonInterp 3 REQUIRED)
set(Python3_EXECUTABLE ${PYTHON_EXECUTABLE})
else()
# Use FindPython3 for CMake >=3.12
find_package(Python3 REQUIRED COMPONENTS Interpreter)
endif()
# Options or configuration variables
set(CURA_NO_INSTALL_PLUGINS "" CACHE STRING "A list of plugins that should not be installed, separated with ';' or ','.")
file(GLOB_RECURSE _plugin_json_list ${CMAKE_SOURCE_DIR}/plugins/*/plugin.json)
list(LENGTH _plugin_json_list _plugin_json_list_len)
# Sort the lists alphabetically so we can handle cases like this:
# - plugins/my_plugin/plugin.json
# - plugins/my_plugin/my_module/plugin.json
# In this case, only "plugins/my_plugin" should be added via install().
set(_no_install_plugin_list ${CURA_NO_INSTALL_PLUGINS})
# Sanitize the string so the comparison will be case-insensitive.
string(STRIP "${_no_install_plugin_list}" _no_install_plugin_list)
string(TOLOWER "${_no_install_plugin_list}" _no_install_plugin_list)
# WORKAROUND counterpart of what's in cura-build.
string(REPLACE "," ";" _no_install_plugin_list "${_no_install_plugin_list}")
list(LENGTH _no_install_plugin_list _no_install_plugin_list_len)
if(_no_install_plugin_list_len GREATER 0)
list(SORT _no_install_plugin_list)
endif()
if(_plugin_json_list_len GREATER 0)
list(SORT _plugin_json_list)
endif()
# Check all plugin directories and add them via install() if needed.
set(_install_plugin_list "")
foreach(_plugin_json_path ${_plugin_json_list})
get_filename_component(_plugin_dir ${_plugin_json_path} DIRECTORY)
file(RELATIVE_PATH _rel_plugin_dir ${CMAKE_CURRENT_SOURCE_DIR} ${_plugin_dir})
get_filename_component(_plugin_dir_name ${_plugin_dir} NAME)
# Make plugin name comparison case-insensitive
string(TOLOWER "${_plugin_dir_name}" _plugin_dir_name_lowercase)
# Check if this plugin needs to be skipped for installation
set(_add_plugin ON) # Indicates if this plugin should be added to the build or not.
set(_is_no_install_plugin OFF) # If this plugin will not be added, this indicates if it's because the plugin is
# specified in the NO_INSTALL_PLUGINS list.
if(_no_install_plugin_list)
if("${_plugin_dir_name_lowercase}" IN_LIST _no_install_plugin_list)
set(_add_plugin OFF)
set(_is_no_install_plugin ON)
endif()
endif()
# Make sure this is not a subdirectory in a plugin that's already in the install list
if(_add_plugin)
foreach(_known_install_plugin_dir ${_install_plugin_list})
if(_plugin_dir MATCHES "${_known_install_plugin_dir}.+")
set(_add_plugin OFF)
break()
endif()
endforeach()
endif()
if(_add_plugin)
message(STATUS "[+] PLUGIN TO INSTALL: ${_rel_plugin_dir}")
get_filename_component(_rel_plugin_parent_dir ${_rel_plugin_dir} DIRECTORY)
install(DIRECTORY ${_rel_plugin_dir}
DESTINATION lib${LIB_SUFFIX}/cura/${_rel_plugin_parent_dir}
PATTERN "__pycache__" EXCLUDE
PATTERN "*.qmlc" EXCLUDE
)
list(APPEND _install_plugin_list ${_plugin_dir})
elseif(_is_no_install_plugin)
message(STATUS "[-] PLUGIN TO REMOVE : ${_rel_plugin_dir}")
execute_process(COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/mod_bundled_packages_json.py
-d ${CMAKE_CURRENT_SOURCE_DIR}/resources/bundled_packages
${_plugin_dir_name}
RESULT_VARIABLE _mod_json_result)
endif()
endforeach()

View File

@ -0,0 +1,69 @@
#!/usr/bin/env python3
#
# This script removes the given package entries in the bundled_packages JSON files. This is used by the PluginInstall
# CMake module.
#
import argparse
import collections
import json
import os
import sys
## Finds all JSON files in the given directory recursively and returns a list of those files in absolute paths.
#
# \param work_dir The directory to look for JSON files recursively.
# \return A list of JSON files in absolute paths that are found in the given directory.
def find_json_files(work_dir: str) -> list:
json_file_list = []
for root, dir_names, file_names in os.walk(work_dir):
for file_name in file_names:
abs_path = os.path.abspath(os.path.join(root, file_name))
json_file_list.append(abs_path)
return json_file_list
## Removes the given entries from the given JSON file. The file will modified in-place.
#
# \param file_path The JSON file to modify.
# \param entries A list of strings as entries to remove.
# \return None
def remove_entries_from_json_file(file_path: str, entries: list) -> None:
try:
with open(file_path, "r", encoding = "utf-8") as f:
package_dict = json.load(f, object_hook = collections.OrderedDict)
except Exception as e:
msg = "Failed to load '{file_path}' as a JSON file. This file will be ignored Exception: {e}"\
.format(file_path = file_path, e = e)
sys.stderr.write(msg + os.linesep)
return
for entry in entries:
if entry in package_dict:
del package_dict[entry]
print("[INFO] Remove entry [{entry}] from [{file_path}]".format(file_path = file_path, entry = entry))
try:
with open(file_path, "w", encoding = "utf-8", newline = "\n") as f:
json.dump(package_dict, f, indent = 4)
except Exception as e:
msg = "Failed to write '{file_path}' as a JSON file. Exception: {e}".format(file_path = file_path, e = e)
raise IOError(msg)
def main() -> None:
parser = argparse.ArgumentParser("mod_bundled_packages_json")
parser.add_argument("-d", "--dir", dest = "work_dir",
help = "The directory to look for bundled packages JSON files, recursively.")
parser.add_argument("entries", metavar = "ENTRIES", type = str, nargs = "+")
args = parser.parse_args()
json_file_list = find_json_files(args.work_dir)
for json_file_path in json_file_list:
remove_entries_from_json_file(json_file_path, args.entries)
if __name__ == "__main__":
main()

View File

@ -224,7 +224,7 @@ class CuraApplication(QtApplication):
self._quality_management_model = None
self._discovered_printer_model = DiscoveredPrintersModel(self, parent = self)
self._first_start_machine_actions_model = FirstStartMachineActionsModel(self, parent = self)
self._first_start_machine_actions_model = None
self._welcome_pages_model = WelcomePagesModel(self, parent = self)
self._add_printer_pages_model = AddPrinterPagesModel(self, parent = self)
self._whats_new_pages_model = WhatsNewPagesModel(self, parent = self)
@ -517,7 +517,8 @@ class CuraApplication(QtApplication):
with self._container_registry.lockFile():
self._container_registry.loadAllMetadata()
# set the setting version for Preferences
self.showSplashMessage(self._i18n_catalog.i18nc("@info:progress", "Setting up preferences..."))
# Set the setting version for Preferences
preferences = self.getPreferences()
preferences.addPreference("metadata/setting_version", 0)
preferences.setValue("metadata/setting_version", self.SettingVersion) #Don't make it equal to the default so that the setting version always gets written to the file.
@ -879,6 +880,10 @@ class CuraApplication(QtApplication):
@pyqtSlot(result = QObject)
def getFirstStartMachineActionsModel(self, *args) -> "FirstStartMachineActionsModel":
if self._first_start_machine_actions_model is None:
self._first_start_machine_actions_model = FirstStartMachineActionsModel(self, parent = self)
if self.started:
self._first_start_machine_actions_model.initialize()
return self._first_start_machine_actions_model
@pyqtSlot(result = QObject)

View File

@ -33,11 +33,11 @@ class FirstStartMachineActionsModel(ListModel):
self._current_action_index = 0
self._application = application
self._application.initializationFinished.connect(self._initialize)
self._application.initializationFinished.connect(self.initialize)
self._previous_global_stack = None
def _initialize(self) -> None:
def initialize(self) -> None:
self._application.getMachineManager().globalContainerChanged.connect(self._update)
self._update()

View File

@ -1,7 +1,7 @@
#Copyright (c) 2019 Ultimaker B.V.
#Cura is released under the terms of the LGPLv3 or higher.
from PyQt5.QtCore import Qt
from PyQt5.QtCore import Qt, QTimer
import collections
from typing import TYPE_CHECKING, Optional, Dict
@ -35,15 +35,19 @@ class IntentCategoryModel(ListModel):
_translations["default"] = {
"name": catalog.i18nc("@label", "Default")
}
_translations["visual"] = {
"name": catalog.i18nc("@label", "Visual"),
"description": catalog.i18nc("@text", "Optimized for appearance")
}
_translations["engineering"] = {
"name": catalog.i18nc("@label", "Engineering"),
"description": catalog.i18nc("@text", "Suitable for engineering work")
"description": catalog.i18nc("@text", "Optimized for higher accuracy")
}
_translations["quick"] = {
"name": catalog.i18nc("@label", "Draft"),
"description": catalog.i18nc("@text", "Optimized for fast results")
}
}
_translations["smooth"] = {
"name": catalog.i18nc("@label", "Smooth"),
"description": catalog.i18nc("@text", "Optimized for a smooth surfaces")
}
## Creates a new model for a certain intent category.
# \param The category to list the intent profiles for.
@ -69,6 +73,11 @@ class IntentCategoryModel(ListModel):
extruder_manager = application.getExtruderManager()
extruder_manager.extrudersChanged.connect(self.update)
self._update_timer = QTimer()
self._update_timer.setInterval(500)
self._update_timer.setSingleShot(True)
self._update_timer.timeout.connect(self._update)
self.update()
## Updates the list of intents if an intent profile was added or removed.
@ -76,8 +85,11 @@ class IntentCategoryModel(ListModel):
if container.getMetaDataEntry("type") == "intent":
self.update()
def update(self):
self._update_timer.start()
## Updates the list of intents.
def update(self) -> None:
def _update(self) -> None:
available_categories = IntentManager.getInstance().currentAvailableIntentCategories()
result = []
for category in available_categories:

View File

@ -83,7 +83,7 @@ class VariantNode(ContainerNode):
# if there is no match.
def preferredMaterial(self, approximate_diameter: int) -> MaterialNode:
for base_material, material_node in self.materials.items():
if self.machine.preferred_material in base_material and approximate_diameter == int(material_node.getMetaDataEntry("approximate_diameter")):
if self.machine.preferred_material == base_material and approximate_diameter == int(material_node.getMetaDataEntry("approximate_diameter")):
return material_node
# First fallback: Choose any material with matching diameter.
for material_node in self.materials.values():

View File

@ -20,7 +20,7 @@ class FirmwareUpdater(QObject):
self._output_device = output_device
self._update_firmware_thread = Thread(target=self._updateFirmware, daemon=True)
self._update_firmware_thread = Thread(target=self._updateFirmware, daemon=True, name = "FirmwareUpdateThread")
self._firmware_file = ""
self._firmware_progress = 0
@ -43,7 +43,7 @@ class FirmwareUpdater(QObject):
## Cleanup after a succesful update
def _cleanupAfterUpdate(self) -> None:
# Clean up for next attempt.
self._update_firmware_thread = Thread(target=self._updateFirmware, daemon=True)
self._update_firmware_thread = Thread(target=self._updateFirmware, daemon=True, name = "FirmwareUpdateThread")
self._firmware_file = ""
self._onFirmwareProgress(100)
self._setFirmwareUpdateState(FirmwareUpdateState.completed)

View File

@ -35,6 +35,7 @@ class PrinterOutputModel(QObject):
self._target_bed_temperature = 0 # type: float
self._name = ""
self._key = "" # Unique identifier
self._unique_name = "" # Unique name (used in Connect)
self._controller = output_controller
self._controller.canUpdateFirmwareChanged.connect(self._onControllerCanUpdateFirmwareChanged)
self._extruders = [ExtruderOutputModel(printer = self, position = i) for i in range(number_of_extruders)]
@ -190,6 +191,15 @@ class PrinterOutputModel(QObject):
self._name = name
self.nameChanged.emit()
@pyqtProperty(str, notify = nameChanged)
def uniqueName(self) -> str:
return self._unique_name
def updateUniqueName(self, unique_name: str) -> None:
if self._unique_name != unique_name:
self._unique_name = unique_name
self.nameChanged.emit()
## Update the bed temperature. This only changes it locally.
def updateBedTemperature(self, temperature: float) -> None:
if self._bed_temperature != temperature:

View File

@ -220,6 +220,9 @@ class PrinterOutputDevice(QObject, OutputDevice):
if printer.printerConfiguration is not None and printer.printerConfiguration.hasAnyMaterialLoaded():
all_configurations.add(printer.printerConfiguration)
all_configurations.update(printer.availableConfigurations)
if None in all_configurations: # Shouldn't happen, but it does. I don't see how it could ever happen. Skip adding that configuration. List could end up empty!
Logger.log("e", "Found a broken configuration in the synced list!")
all_configurations.remove(None)
new_configurations = sorted(all_configurations, key = lambda config: config.printerType or "")
if new_configurations != self._unique_configurations:
self._unique_configurations = new_configurations

View File

@ -872,7 +872,10 @@ class MachineManager(QObject):
def numberExtrudersEnabled(self) -> int:
if self._global_container_stack is None:
return 1
return self._global_container_stack.definitionChanges.getProperty("extruders_enabled_count", "value")
extruders_enabled_count = self._global_container_stack.definitionChanges.getProperty("extruders_enabled_count", "value")
if extruders_enabled_count is None:
extruders_enabled_count = len(self._global_container_stack.extruderList)
return extruders_enabled_count
@pyqtProperty(str, notify = extruderChanged)
def defaultExtruderPosition(self) -> str:

View File

@ -28,20 +28,21 @@ if TYPE_CHECKING:
class SettingInheritanceManager(QObject):
def __init__(self, parent = None) -> None:
super().__init__(parent)
Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerChanged)
self._global_container_stack = None # type: Optional[ContainerStack]
self._settings_with_inheritance_warning = [] # type: List[str]
self._active_container_stack = None # type: Optional[ExtruderStack]
self._onGlobalContainerChanged()
ExtruderManager.getInstance().activeExtruderChanged.connect(self._onActiveExtruderChanged)
self._onActiveExtruderChanged()
self._update_timer = QTimer()
self._update_timer.setInterval(500)
self._update_timer.setSingleShot(True)
self._update_timer.timeout.connect(self._update)
Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerChanged)
ExtruderManager.getInstance().activeExtruderChanged.connect(self._onActiveExtruderChanged)
self._onGlobalContainerChanged()
self._onActiveExtruderChanged()
settingsWithIntheritanceChanged = pyqtSignal()
## Get the keys of all children settings with an override.
@ -88,8 +89,8 @@ class SettingInheritanceManager(QObject):
self.settingsWithIntheritanceChanged.emit()
@pyqtSlot()
def forceUpdate(self) -> None:
self._update()
def scheduleUpdate(self) -> None:
self._update_timer.start()
def _onActiveExtruderChanged(self) -> None:
new_active_stack = ExtruderManager.getInstance().getActiveExtruderStack()
@ -106,7 +107,7 @@ class SettingInheritanceManager(QObject):
if self._active_container_stack is not None:
self._active_container_stack.propertyChanged.connect(self._onPropertyChanged)
self._active_container_stack.containersChanged.connect(self._onContainersChanged)
self._update() # Ensure that the settings_with_inheritance_warning list is populated.
self._update_timer.start() # Ensure that the settings_with_inheritance_warning list is populated.
def _onPropertyChanged(self, key: str, property_name: str) -> None:
if (property_name == "value" or property_name == "enabled") and self._global_container_stack:

View File

@ -1,6 +1,6 @@
#!/usr/bin/env python3
# Copyright (c) 2018 Ultimaker B.V.
# Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
import argparse
@ -131,7 +131,10 @@ def exceptHook(hook_type, value, traceback):
# Set exception hook to use the crash dialog handler
sys.excepthook = exceptHook
# Enable dumping traceback for all threads
faulthandler.enable(all_threads = True)
if sys.stderr:
faulthandler.enable(file = sys.stderr, all_threads = True)
else:
faulthandler.enable(file = sys.stdout, all_threads = True)
# Workaround for a race condition on certain systems where there
# is a race condition between Arcus and PyQt. Importing Arcus

View File

@ -1,4 +1,4 @@
# Copyright (c) 2018 Ultimaker B.V.
# Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
import numpy
@ -72,7 +72,7 @@ class GcodeStartEndFormatter(Formatter):
value = default_value_str
# "-1" is global stack, and if the setting value exists in the global stack, use it as the fallback value.
if key in kwargs["-1"]:
value = kwargs["-1"]
value = kwargs["-1"][key]
if str(extruder_nr) in kwargs and key in kwargs[str(extruder_nr)]:
value = kwargs[str(extruder_nr)][key]

View File

@ -143,6 +143,52 @@ UM.Dialog
}
}
UM.TooltipArea {
Layout.fillWidth:true
height: childrenRect.height
text: catalog.i18nc("@info:tooltip","For lithophanes a simple logarithmic model for translucency is available. For height maps the pixel values correspond to heights linearly.")
Row {
width: parent.width
Label {
text: "Color Model"
width: 150 * screenScaleFactor
anchors.verticalCenter: parent.verticalCenter
}
ComboBox {
id: color_model
objectName: "ColorModel"
model: [ catalog.i18nc("@item:inlistbox","Linear"), catalog.i18nc("@item:inlistbox","Translucency") ]
width: 180 * screenScaleFactor
onCurrentIndexChanged: { manager.onColorModelChanged(currentIndex) }
}
}
}
UM.TooltipArea {
Layout.fillWidth:true
height: childrenRect.height
text: catalog.i18nc("@info:tooltip","The percentage of light penetrating a print with a thickness of 1 millimeter. Lowering this value increases the contrast in dark regions and decreases the contrast in light regions of the image.")
visible: color_model.currentText == catalog.i18nc("@item:inlistbox","Translucency")
Row {
width: parent.width
Label {
text: catalog.i18nc("@action:label", "1mm Transmittance (%)")
width: 150 * screenScaleFactor
anchors.verticalCenter: parent.verticalCenter
}
TextField {
id: transmittance
objectName: "Transmittance"
focus: true
validator: RegExpValidator {regExp: /^[1-9]\d{0,2}([\,|\.]\d*)?$/}
width: 180 * screenScaleFactor
onTextChanged: { manager.onTransmittanceChanged(text) }
}
}
}
UM.TooltipArea {
Layout.fillWidth:true
height: childrenRect.height

View File

@ -3,6 +3,8 @@
import numpy
import math
from PyQt5.QtGui import QImage, qRed, qGreen, qBlue
from PyQt5.QtCore import Qt
@ -46,9 +48,9 @@ class ImageReader(MeshReader):
def _read(self, file_name):
size = max(self._ui.getWidth(), self._ui.getDepth())
return self._generateSceneNode(file_name, size, self._ui.peak_height, self._ui.base_height, self._ui.smoothing, 512, self._ui.lighter_is_higher)
return self._generateSceneNode(file_name, size, self._ui.peak_height, self._ui.base_height, self._ui.smoothing, 512, self._ui.lighter_is_higher, self._ui.use_transparency_model, self._ui.transmittance_1mm)
def _generateSceneNode(self, file_name, xz_size, peak_height, base_height, blur_iterations, max_size, lighter_is_higher):
def _generateSceneNode(self, file_name, xz_size, peak_height, base_height, blur_iterations, max_size, lighter_is_higher, use_transparency_model, transmittance_1mm):
scene_node = SceneNode()
mesh = MeshBuilder()
@ -99,12 +101,14 @@ class ImageReader(MeshReader):
for x in range(0, width):
for y in range(0, height):
qrgb = img.pixel(x, y)
avg = float(qRed(qrgb) + qGreen(qrgb) + qBlue(qrgb)) / (3 * 255)
height_data[y, x] = avg
if use_transparency_model:
height_data[y, x] = (0.299 * math.pow(qRed(qrgb) / 255.0, 2.2) + 0.587 * math.pow(qGreen(qrgb) / 255.0, 2.2) + 0.114 * math.pow(qBlue(qrgb) / 255.0, 2.2))
else:
height_data[y, x] = (0.212655 * qRed(qrgb) + 0.715158 * qGreen(qrgb) + 0.072187 * qBlue(qrgb)) / 255 # fast computation ignoring gamma and degamma
Job.yieldThread()
if not lighter_is_higher:
if lighter_is_higher == use_transparency_model:
height_data = 1 - height_data
for _ in range(0, blur_iterations):
@ -124,8 +128,15 @@ class ImageReader(MeshReader):
Job.yieldThread()
height_data *= scale_vector.y
height_data += base_height
if use_transparency_model:
divisor = 1.0 / math.log(transmittance_1mm / 100.0) # log-base doesn't matter here. Precompute this value for faster computation of each pixel.
min_luminance = (transmittance_1mm / 100.0) ** (peak_height - base_height)
for (y, x) in numpy.ndindex(height_data.shape):
mapped_luminance = min_luminance + (1.0 - min_luminance) * height_data[y, x]
height_data[y, x] = base_height + divisor * math.log(mapped_luminance) # use same base as a couple lines above this
else:
height_data *= scale_vector.y
height_data += base_height
heightmap_face_count = 2 * height_minus_one * width_minus_one
total_face_count = heightmap_face_count + (width_minus_one * 2) * (height_minus_one * 2) + 2

View File

@ -34,6 +34,8 @@ class ImageReaderUI(QObject):
self.peak_height = 2.5
self.smoothing = 1
self.lighter_is_higher = False;
self.use_transparency_model = True;
self.transmittance_1mm = 50.0; # based on pearl PLA
self._ui_lock = threading.Lock()
self._cancelled = False
@ -75,6 +77,7 @@ class ImageReaderUI(QObject):
self._ui_view.findChild(QObject, "Base_Height").setProperty("text", str(self.base_height))
self._ui_view.findChild(QObject, "Peak_Height").setProperty("text", str(self.peak_height))
self._ui_view.findChild(QObject, "Transmittance").setProperty("text", str(self.transmittance_1mm))
self._ui_view.findChild(QObject, "Smoothing").setProperty("value", self.smoothing)
def _createConfigUI(self):
@ -144,3 +147,11 @@ class ImageReaderUI(QObject):
@pyqtSlot(int)
def onImageColorInvertChanged(self, value):
self.lighter_is_higher = (value == 1)
@pyqtSlot(int)
def onColorModelChanged(self, value):
self.use_transparency_model = (value == 0)
@pyqtSlot(int)
def onTransmittanceChanged(self, value):
self.transmittance_1mm = value

View File

@ -0,0 +1,94 @@
# Cura PostProcessingPlugin
# Author: Mathias Lyngklip Kjeldgaard
# Date: July 31, 2019
# Modified: ---
# Description: This plugin displayes the remaining time on the LCD of the printer
# using the estimated print-time generated by Cura.
from ..Script import Script
import re
import datetime
class DisplayRemainingTimeOnLCD(Script):
def __init__(self):
super().__init__()
def getSettingDataString(self):
return """{
"name":"Disaplay Remaining Time on LCD",
"key":"DisplayRemainingTimeOnLCD",
"metadata": {},
"version": 2,
"settings":
{
"TurnOn":
{
"label": "Enable",
"description": "When enabled, It will write Time Left: HHMMSS on the display",
"type": "bool",
"default_value": false
}
}
}"""
def execute(self, data):
if self.getSettingValueByKey("TurnOn"):
total_time = 0
total_time_string = ""
for layer in data:
layer_index = data.index(layer)
lines = layer.split("\n")
for line in lines:
if line.startswith(";TIME:"):
# At this point, we have found a line in the GCODE with ";TIME:"
# which is the indication of total_time. Looks like: ";TIME:1337", where
# 1337 is the total print time in seconds.
line_index = lines.index(line) # We take a hold of that line
split_string = re.split(":", line) # Then we split it, so we can get the number
string_with_numbers = "{}".format(split_string[1]) # Here we insert that number from the
# list into a string.
total_time = int(string_with_numbers) # Only to contert it to a int.
m, s = divmod(total_time, 60) # Math to calculate
h, m = divmod(m, 60) # hours, minutes and seconds.
total_time_string = "{:d}h{:02d}m{:02d}s".format(h, m, s) # Now we put it into the string
lines[line_index] = "M117 Time Left {}".format(total_time_string) # And print that string instead of the original one
elif line.startswith(";TIME_ELAPSED:"):
# As we didnt find the total time (";TIME:"), we have found a elapsed time mark
# This time represents the time the printer have printed. So with some math;
# totalTime - printTime = RemainingTime.
line_index = lines.index(line) # We get a hold of the line
list_split = re.split(":", line) # Again, we split at ":" so we can get the number
string_with_numbers = "{}".format(list_split[1]) # Then we put that number from the list, into a string
current_time = float(string_with_numbers) # This time we convert to a float, as the line looks something like:
# ;TIME_ELAPSED:1234.6789
# which is total time in seconds
time_left = total_time - current_time # Here we calculate remaining time
m1, s1 = divmod(time_left, 60) # And some math to get the total time in seconds into
h1, m1 = divmod(m1, 60) # the right format. (HH,MM,SS)
current_time_string = "{:d}h{:2d}m{:2d}s".format(int(h1), int(m1), int(s1)) # Here we create the string holding our time
lines[line_index] = "M117 Time Left {}".format(current_time_string) # And now insert that into the GCODE
# Here we are OUT of the second for-loop
# Which means we have found and replaces all the occurences.
# Which also means we are ready to join the lines for that section of the GCODE file.
final_lines = "\n".join(lines)
data[layer_index] = final_lines
return data

View File

@ -12,14 +12,18 @@ import Cura 1.0 as Cura
Item
{
// An Item whose bounds are guaranteed to be safe for overlays to be placed.
// Defaults to parent, ie. the entire available area
property var safeArea: parent
// Subtract the actionPanel from the safe area. This way the view won't draw interface elements under/over it
Item {
id: safeArea
visible: false
anchors.left: parent.left
anchors.right: actionPanelWidget.left
anchors.top: parent.top
anchors.bottom: actionPanelWidget.top
Item
{
id: childSafeArea
x: safeArea.x - parent.x
y: safeArea.y - parent.y
width: actionPanelWidget.x - x
height: actionPanelWidget.y - y
}
Loader
@ -29,11 +33,11 @@ Item
source: UM.Controller.activeView != null && UM.Controller.activeView.mainComponent != null ? UM.Controller.activeView.mainComponent : ""
Binding
onLoaded:
{
target: previewMain.item
property: "safeArea"
value:safeArea
if (previewMain.item.safeArea !== undefined){
previewMain.item.safeArea = Qt.binding(function() { return childSafeArea });
}
}
}

View File

@ -56,6 +56,11 @@ Item
return Math.min(Math.max(value, sliderRoot.minimumValue), sliderRoot.maximumValue)
}
onWidthChanged : {
// After a width change, the pixel-position of the handle is out of sync with the property value
setHandleValue(handleValue)
}
// slider track
Rectangle
{

View File

@ -18,7 +18,10 @@ Item
property bool isSimulationPlaying: false
readonly property var layerSliderSafeYMax: safeArea.y + safeArea.height
readonly property real layerSliderSafeYMin: safeArea.y
readonly property real layerSliderSafeYMax: safeArea.y + safeArea.height
readonly property real pathSliderSafeXMin: safeArea.x + playButton.width
readonly property real pathSliderSafeXMax: safeArea.x + safeArea.width
visible: UM.SimulationView.layerActivity && CuraApplication.platformActivity
@ -26,13 +29,21 @@ Item
PathSlider
{
id: pathSlider
readonly property real preferredWidth: UM.Theme.getSize("slider_layerview_size").height // not a typo, should be as long as layerview slider
readonly property real margin: UM.Theme.getSize("default_margin").width
readonly property real pathSliderSafeWidth: pathSliderSafeXMax - pathSliderSafeXMin
height: UM.Theme.getSize("slider_handle").width
width: UM.Theme.getSize("slider_layerview_size").height
width: preferredWidth + margin * 2 < pathSliderSafeWidth ? preferredWidth : pathSliderSafeWidth - margin * 2
anchors.bottom: parent.bottom
anchors.bottomMargin: UM.Theme.getSize("default_margin").height
anchors.bottomMargin: margin
anchors.horizontalCenter: parent.horizontalCenter
anchors.horizontalCenterOffset: -(parent.width - pathSliderSafeXMax - pathSliderSafeXMin) / 2 // center between parent top and layerSliderSafeYMax
visible: !UM.SimulationView.compatibilityMode
@ -184,16 +195,19 @@ Item
{
property var preferredHeight: UM.Theme.getSize("slider_layerview_size").height
property double heightMargin: UM.Theme.getSize("default_margin").height
property double layerSliderSafeHeight: layerSliderSafeYMax - layerSliderSafeYMin
//todo incorporate margins in safeHeight?
id: layerSlider
width: UM.Theme.getSize("slider_handle").width
height: preferredHeight + heightMargin * 2 < layerSliderSafeYMax ? preferredHeight : layerSliderSafeYMax - heightMargin * 2
height: preferredHeight + heightMargin * 2 < layerSliderSafeHeight ? preferredHeight : layerSliderSafeHeight - heightMargin * 2
anchors
{
right: parent.right
verticalCenter: parent.verticalCenter
verticalCenterOffset: -(parent.height - layerSliderSafeYMax) / 2 // center between parent top and layerSliderSafeYMax
verticalCenterOffset: -(parent.height - layerSliderSafeYMax - layerSliderSafeYMin) / 2 // center between parent top and layerSliderSafeYMax
rightMargin: UM.Theme.getSize("default_margin").width
bottomMargin: heightMargin
topMargin: heightMargin

View File

@ -63,41 +63,41 @@ Item
verticalCenter: parent.verticalCenter
}
color: UM.Theme.getColor("monitor_text_primary")
font: UM.Theme.getFont("default") // 12pt, regular
font: UM.Theme.getFont("default")
text:
{
if (!printJob)
{
return ""
return "";
}
switch (printJob.state)
{
case "wait_cleanup":
if (printJob.timeTotal > printJob.timeElapsed)
{
return catalog.i18nc("@label:status", "Aborted")
return catalog.i18nc("@label:status", "Aborted");
}
return catalog.i18nc("@label:status", "Finished")
return catalog.i18nc("@label:status", "Finished");
case "finished":
return catalog.i18nc("@label:status", "Finished")
return catalog.i18nc("@label:status", "Finished");
case "sent_to_printer":
return catalog.i18nc("@label:status", "Preparing...")
return catalog.i18nc("@label:status", "Preparing...");
case "pre_print":
return catalog.i18nc("@label:status", "Preparing...")
return catalog.i18nc("@label:status", "Preparing...");
case "aborting": // NOTE: Doesn't exist but maybe should someday
return catalog.i18nc("@label:status", "Aborting...")
return catalog.i18nc("@label:status", "Aborting...");
case "aborted": // NOTE: Unused, see above
return catalog.i18nc("@label:status", "Aborted")
return catalog.i18nc("@label:status", "Aborted");
case "pausing":
return catalog.i18nc("@label:status", "Pausing...")
return catalog.i18nc("@label:status", "Pausing...");
case "paused":
return catalog.i18nc("@label:status", "Paused")
return catalog.i18nc("@label:status", "Paused");
case "resuming":
return catalog.i18nc("@label:status", "Resuming...")
return catalog.i18nc("@label:status", "Resuming...");
case "queued":
return catalog.i18nc("@label:status", "Action required")
return catalog.i18nc("@label:status", "Action required");
default:
return catalog.i18nc("@label:status", "Finishes %1 at %2".arg(OutputDevice.getDateCompleted( printJob.timeRemaining )).arg(OutputDevice.getTimeCompleted( printJob.timeRemaining )))
return catalog.i18nc("@label:status", "Finishes %1 at %2".arg(OutputDevice.getDateCompleted(printJob.timeRemaining)).arg(OutputDevice.getTimeCompleted(printJob.timeRemaining)));
}
}
width: contentWidth

View File

@ -1,52 +1,57 @@
// Copyright (c) 2019 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.2
import QtQuick.Window 2.2
import QtQuick.Controls 1.2
import UM 1.1 as UM
UM.Dialog {
id: base;
title: catalog.i18nc("@title:window", "Print over network");
width: minimumWidth;
height: minimumHeight;
leftButtons: [
Button {
enabled: true;
onClicked: {
base.visible = false;
printerSelectionCombobox.currentIndex = 0;
OutputDevice.cancelPrintSelection();
}
text: catalog.i18nc("@action:button","Cancel");
}
]
maximumHeight: minimumHeight;
maximumWidth: minimumWidth;
minimumHeight: 140 * screenScaleFactor;
minimumWidth: 500 * screenScaleFactor;
modality: Qt.ApplicationModal;
onVisibleChanged: {
if (visible) {
resetPrintersModel();
} else {
OutputDevice.cancelPrintSelection();
Component.onCompleted: {
populateComboBox()
}
// populates the combo box with the correct printer values
function populateComboBox() {
comboBoxPrintersModel.clear();
comboBoxPrintersModel.append({ name: "Automatic", key: "" }); // Connect will just do it's thing
for (var i in OutputDevice.printers) {
comboBoxPrintersModel.append({
name: OutputDevice.printers[i].name,
key: OutputDevice.printers[i].uniqueName
});
}
}
leftButtons: [
Button {
enabled: true;
onClicked: {
base.close();
}
text: catalog.i18nc("@action:button","Cancel");
}
]
rightButtons: [
Button {
enabled: true;
onClicked: {
base.visible = false;
OutputDevice.selectPrinter(printerSelectionCombobox.model.get(printerSelectionCombobox.currentIndex).key);
// reset to defaults
printerSelectionCombobox.currentIndex = 0;
OutputDevice.selectTargetPrinter(printerComboBox.model.get(printerComboBox.currentIndex).key);
base.close();
}
text: catalog.i18nc("@action:button","Print");
}
]
title: catalog.i18nc("@title:window", "Print over network");
visible: true;
width: minimumWidth;
Column {
id: printerSelection;
@ -59,10 +64,6 @@ UM.Dialog {
}
height: 50 * screenScaleFactor;
SystemPalette {
id: palette;
}
UM.I18nCatalog {
id: catalog;
name: "cura";
@ -82,23 +83,14 @@ UM.Dialog {
}
ComboBox {
id: printerSelectionCombobox;
id: printerComboBox;
Behavior on height { NumberAnimation { duration: 100 } }
height: 40 * screenScaleFactor;
model: ListModel {
id: printersModel;
id: comboBoxPrintersModel;
}
textRole: "name";
width: parent.width;
}
}
// Utils
function resetPrintersModel() {
printersModel.clear();
printersModel.append({ name: "Automatic", key: ""});
for (var index in OutputDevice.printers) {
printersModel.append({name: OutputDevice.printers[index].name, key: OutputDevice.printers[index].key});
}
}
}

View File

@ -79,6 +79,7 @@ class ClusterPrinterStatus(BaseModel):
def updateOutputModel(self, model: PrinterOutputModel) -> None:
model.updateKey(self.uuid)
model.updateName(self.friendly_name)
model.updateUniqueName(self.unique_name)
model.updateType(self.machine_variant)
model.updateState(self.status if self.enabled else "disabled")
model.updateBuildplate(self.build_plate.type if self.build_plate else "glass")

View File

@ -135,7 +135,7 @@ class ClusterApiClient:
result = model_class(**response) # type: ClusterApiClientModel
on_finished_item = cast(Callable[[ClusterApiClientModel], Any], on_finished)
on_finished_item(result)
except (JSONDecodeError, TypeError):
except (JSONDecodeError, TypeError, ValueError):
Logger.log("e", "Could not parse response from network: %s", str(response))
## Creates a callback function so that it includes the parsing of the response into the correct model.

View File

@ -1,16 +1,17 @@
# Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
import os
from typing import Optional, Dict, List, Callable, Any
from PyQt5.QtGui import QDesktopServices
from PyQt5.QtCore import pyqtSlot, QUrl, pyqtSignal, pyqtProperty
from PyQt5.QtCore import pyqtSlot, QUrl, pyqtSignal, pyqtProperty, QObject
from PyQt5.QtNetwork import QNetworkReply
from UM.FileHandler.FileHandler import FileHandler
from UM.i18n import i18nCatalog
from UM.Logger import Logger
from UM.Scene.SceneNode import SceneNode
from cura.CuraApplication import CuraApplication
from cura.PrinterOutput.NetworkedPrinterOutputDevice import AuthState
from cura.PrinterOutput.PrinterOutputDevice import ConnectionType
@ -42,6 +43,8 @@ class LocalClusterOutputDevice(UltimakerNetworkedPrinterOutputDevice):
)
self._cluster_api = None # type: Optional[ClusterApiClient]
self._active_exported_job = None # type: Optional[ExportFileJob]
self._printer_select_dialog = None # type: Optional[QObject]
# We don't have authentication over local networking, so we're always authenticated.
self.setAuthenticationState(AuthState.Authenticated)
@ -129,17 +132,50 @@ class LocalClusterOutputDevice(UltimakerNetworkedPrinterOutputDevice):
job.finished.connect(self._onPrintJobCreated)
job.start()
## Allows the user to choose a printer to print with from the printer selection dialogue.
# \param unique_name: The unique name of the printer to target.
@pyqtSlot(str, name="selectTargetPrinter")
def selectTargetPrinter(self, unique_name: str = "") -> None:
self._startPrintJobUpload(unique_name if unique_name != "" else None)
## Handler for when the print job was created locally.
# It can now be sent over the network.
def _onPrintJobCreated(self, job: ExportFileJob) -> None:
self._active_exported_job = job
# TODO: add preference to enable/disable this feature?
if self.clusterSize > 1:
self._showPrinterSelectionDialog() # self._startPrintJobUpload will be triggered from this dialog
return
self._startPrintJobUpload()
## Shows a dialog allowing the user to select which printer in a group to send a job to.
def _showPrinterSelectionDialog(self) -> None:
if not self._printer_select_dialog:
plugin_path = CuraApplication.getInstance().getPluginRegistry().getPluginPath("UM3NetworkPrinting") or ""
path = os.path.join(plugin_path, "resources", "qml", "PrintWindow.qml")
self._printer_select_dialog = CuraApplication.getInstance().createQmlComponent(path, {"OutputDevice": self})
if self._printer_select_dialog is not None:
self._printer_select_dialog.show()
## Upload the print job to the group.
def _startPrintJobUpload(self, unique_name: str = None) -> None:
if not self._active_exported_job:
Logger.log("e", "No active exported job to upload!")
return
self._progress.show()
parts = [
self._createFormPart("name=owner", bytes(self._getUserName(), "utf-8"), "text/plain"),
self._createFormPart("name=\"file\"; filename=\"%s\"" % job.getFileName(), job.getOutput())
self._createFormPart("name=\"file\"; filename=\"%s\"" % self._active_exported_job.getFileName(),
self._active_exported_job.getOutput())
]
# If a specific printer was selected we include the name in the request.
# FIXME: Connect should allow the printer UUID here instead of the 'unique_name'.
if unique_name is not None:
parts.append(self._createFormPart("name=require_printer_name", bytes(unique_name, "utf-8"), "text/plain"))
# FIXME: move form posting to API client
self.postFormWithParts("/cluster-api/v1/print_jobs/", parts, on_finished=self._onPrintUploadCompleted,
on_progress=self._onPrintJobUploadProgress)
self._active_exported_job = None
## Handler for print job upload progress.
def _onPrintJobUploadProgress(self, bytes_sent: int, bytes_total: int) -> None:

View File

@ -43,7 +43,7 @@ class ZeroConfClient:
Logger.logException("e", "Failed to create zeroconf instance.")
return
self._service_changed_request_thread = Thread(target = self._handleOnServiceChangedRequests, daemon = True)
self._service_changed_request_thread = Thread(target = self._handleOnServiceChangedRequests, daemon = True, name = "ZeroConfServiceChangedThread")
self._service_changed_request_thread.start()
self._zero_conf_browser = ServiceBrowser(self._zero_conf, self.ZERO_CONF_NAME, [self._queueService])

View File

@ -61,7 +61,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
self._all_baud_rates = [115200, 250000, 500000, 230400, 57600, 38400, 19200, 9600]
# Instead of using a timer, we really need the update to be as a thread, as reading from serial can block.
self._update_thread = Thread(target = self._update, daemon = True)
self._update_thread = Thread(target = self._update, daemon = True, name = "USBPrinterUpdate")
self._last_temperature_request = None # type: Optional[int]
self._firmware_idle_count = 0
@ -212,7 +212,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
self._serial.close()
# Re-create the thread so it can be started again later.
self._update_thread = Thread(target=self._update, daemon=True)
self._update_thread = Thread(target=self._update, daemon=True, name = "USBPrinterUpdate")
self._serial = None
## Send a command to printer.

View File

@ -66,6 +66,13 @@ class VersionUpgrade43to44(VersionUpgrade):
# Alternate skin rotation should be translated to top/bottom line directions.
if "skin_alternate_rotation" in parser["values"] and parseBool(parser["values"]["skin_alternate_rotation"]):
parser["values"]["skin_angles"] = "[45, 135, 0, 90]"
# Unit of adaptive layers topography size changed.
if "adaptive_layer_height_threshold" in parser["values"]:
val = parser["values"]["adaptive_layer_height_threshold"]
if val.startswith("="):
val = val[1:]
val = "=({val}) / 1000".format(val = val) # Convert microns to millimetres. Works even if the profile contained a formula.
parser["values"]["adaptive_layer_height_threshold"] = val
result = io.StringIO()
parser.write(result)

View File

@ -6658,30 +6658,26 @@
},
"flow_rate_max_extrusion_offset":
{
"label": "Flow rate compensation max extrusion offset",
"description": "The maximum distance in mm to compensate.",
"label": "Flow Rate Compensation Max Extrusion Offset",
"description": "The maximum distance in mm to move the filament to compensate for changes in flow rate.",
"unit": "mm",
"type": "float",
"minimum_value": "0",
"maximum_value_warning": "10",
"default_value": 0,
"value": "0",
"enabled": true,
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
},
"flow_rate_extrusion_offset_factor":
{
"label": "Flow rate compensation factor",
"description": "The multiplication factor for the flow rate -> distance translation.",
"label": "Flow Rate Compensation Factor",
"description": "How far to move the filament in order to compensate for changes in flow rate, as a percentage of how far the filament would move in one second of extrusion.",
"unit": "%",
"type": "float",
"minimum_value": "0",
"maximum_value_warning": "100",
"default_value": 100,
"value": "100",
"enabled": true,
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
@ -6704,7 +6700,7 @@
"unit": "mm",
"default_value": 3,
"value": "machine_nozzle_head_distance",
"minimum_value": "0.0001",
"minimum_value": "0.001",
"maximum_value_warning": "20",
"enabled": "wireframe_enabled",
"settable_per_mesh": false,
@ -6734,7 +6730,7 @@
"unit": "mm/s",
"type": "float",
"default_value": 5,
"minimum_value": "0.1",
"minimum_value": "0.05",
"maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2 + machine_max_feedrate_z ** 2)",
"maximum_value_warning": "50",
"enabled": "wireframe_enabled",
@ -6750,11 +6746,11 @@
"unit": "mm/s",
"type": "float",
"default_value": 5,
"minimum_value": "0.1",
"minimum_value": "0.05",
"maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)",
"maximum_value_warning": "50",
"enabled": "wireframe_enabled",
"value": "wireframe_printspeed",
"value": "wireframe_printspeed_flat",
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
@ -6766,7 +6762,7 @@
"unit": "mm/s",
"type": "float",
"default_value": 5,
"minimum_value": "0.1",
"minimum_value": "0.05",
"maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2 + machine_max_feedrate_z ** 2)",
"maximum_value_warning": "50",
"enabled": "wireframe_enabled",
@ -6782,7 +6778,7 @@
"unit": "mm/s",
"type": "float",
"default_value": 5,
"minimum_value": "0.1",
"minimum_value": "0.05",
"maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2 + machine_max_feedrate_z ** 2)",
"maximum_value_warning": "50",
"enabled": "wireframe_enabled",
@ -6798,7 +6794,7 @@
"unit": "mm/s",
"type": "float",
"default_value": 5,
"minimum_value": "0.1",
"minimum_value": "0.05",
"maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)",
"maximum_value_warning": "100",
"value": "wireframe_printspeed",
@ -6921,7 +6917,7 @@
"default_value": 0.6,
"minimum_value": "0",
"maximum_value_warning": "2.0",
"enabled": "wireframe_enabled",
"enabled": "wireframe_enabled and wireframe_strategy == 'knot'",
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
@ -6935,7 +6931,7 @@
"default_value": 0.5,
"minimum_value": "0",
"maximum_value_warning": "wireframe_height",
"enabled": "wireframe_enabled",
"enabled": "wireframe_enabled and wireframe_strategy == 'compensate'",
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
@ -6949,7 +6945,7 @@
"default_value": 0.6,
"minimum_value": "0",
"maximum_value_warning": "wireframe_height",
"enabled": "wireframe_enabled",
"enabled": "wireframe_enabled and wireframe_strategy == 'compensate'",
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
@ -7072,17 +7068,18 @@
"default_value": 0.01,
"unit": "mm",
"settable_per_mesh": false,
"minimum_value": "0.0001",
"minimum_value": "0.001",
"settable_per_extruder": false,
"settable_per_meshgroup": false
},
"adaptive_layer_height_threshold":
{
"label": "Adaptive Layers Threshold",
"description": "Threshold whether to use a smaller layer or not. This number is compared to the tan of the steepest slope in a layer.",
"label": "Adaptive Layers Topography Size",
"description": "Target horizontal distance between two adjacent layers. Reducing this setting causes thinner layers to be used to bring the edges of the layers closer together.",
"type": "float",
"enabled": "adaptive_layer_height_enabled",
"default_value": 200.0,
"default_value": 0.2,
"unit": "mm",
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false

View File

@ -18,12 +18,12 @@
"supports_usb_connection": false,
"machine_extruder_trains":
{
"0": "alya3dp_extruder_0"
"0": "kupido_extruder_0"
}
},
"overrides": {
"machine_name": { "default_value": "ALYA 3DP" },
"machine_name": { "default_value": "KUPIDO" },
"machine_heated_bed": { "default_value": true },
"machine_width": { "default_value": 195 },
"machine_height": { "default_value": 190 },

View File

@ -14,7 +14,7 @@
"has_variants": true,
"preferred_variant_name": "Standard 0.6",
"preferred_material": "emotiontech_pla",
"preferred_quality_type": "e",
"preferred_quality_type": "c",
"variants_name": "Print Head",
"machine_extruder_trains":
{
@ -30,13 +30,14 @@
"machine_depth": { "default_value": 420 },
"machine_height": { "default_value": 495 },
"machine_heated_bed": { "default_value": true },
"machine_heated_build_volume": { "default_value": true },
"machine_center_is_zero": { "default_value": false },
"machine_head_with_fans_polygon": { "default_value": [ [ -76, -51.8 ] , [ 25, -51.8 ] , [ 25, 38.2 ] , [ -76, 38.2 ] ] },
"gantry_height": { "value": "40" },
"machine_extruder_count": { "default_value": 2 },
"machine_gcode_flavor": { "default_value": "Marlin" },
"machine_start_gcode": { "default_value": "G28 \nG90 G1 X300 Y210 Z15 F6000 \nG92 E0" },
"machine_end_gcode": { "default_value": "T1 \nM104 S0 \nT0 \nM104 S0 \nM140 S0 \nM141 S0 \nG91 \nG0 E-1 F1500 \nG0 z1 \nG90 \nG28 \nM801.2 \nM801.0 \nM84" },
"machine_end_gcode": { "default_value": "T1 \nM104 S0 \nT0 \nM104 S0 \nM140 S0 \nM141 S0 \nG91 \nG0 z1 \nG90 \nG28 \nM801.0 \nM84 \nM192" },
"extruder_prime_pos_y": {"minimum_value": "0", "maximum_value": "machine_depth"},
"extruder_prime_pos_x": {"minimum_value": "0", "maximum_value": "machine_width"},
"machine_heat_zone_length": { "default_value": 7 },
@ -46,17 +47,17 @@
"material_bed_temperature": { "maximum_value": "130" },
"material_bed_temperature_layer_0": { "maximum_value": "130" },
"extruder_prime_pos_abs": { "default_value": true },
"machine_acceleration": { "default_value": 2000 },
"machine_acceleration": { "default_value": 1500 },
"acceleration_enabled": { "value": false },
"acceleration_layer_0": { "value": "acceleration_topbottom" },
"acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 1000 / 2000)" },
"acceleration_print": { "value": "2000" },
"acceleration_print": { "value": "machine_acceleration" },
"acceleration_wall": { "value": "math.ceil(acceleration_print * 1250 / acceleration_print)" },
"acceleration_wall_0": { "value": "math.ceil(acceleration_print * 1000 / acceleration_print)" },
"acceleration_topbottom": { "value": "math.ceil(acceleration_print * 1250 / acceleration_print)" },
"acceleration_support": { "value": "acceleration_print" },
"acceleration_support_interface": { "value": "acceleration_topbottom" },
"acceleration_topbottom": { "value": "math.ceil(acceleration_print * 1000 / 2000)" },
"acceleration_wall": { "value": "math.ceil(acceleration_print * 1500 / 2000)" },
"acceleration_wall_0": { "value": "math.ceil(acceleration_wall * 1000 / 1500)" },
"acceleration_travel": { "value": "acceleration_print" },
"acceleration_layer_0": { "value": "acceleration_topbottom" },
"adaptive_layer_height_variation": { "default_value": 0.1 },
"adaptive_layer_height_variation_step": { "default_value": 0.05 },
"adhesion_type": { "default_value": "skirt" },

View File

@ -67,8 +67,6 @@
"extruder_prime_pos_abs": { "default_value": true },
"machine_start_gcode": { "default_value": "" },
"machine_end_gcode": { "default_value": "" },
"prime_tower_position_x": { "value": "345" },
"prime_tower_position_y": { "value": "222.5" },
"prime_blob_enable": { "enabled": true, "default_value": false },
"speed_travel":

View File

@ -1,45 +1,45 @@
{
"version": 2,
"name": "Extruder 1",
"inherits": "fdmextruder",
"metadata": {
"machine": "BIBO2 dual",
"position": "0"
},
"overrides": {
"extruder_nr": {
"default_value": 0,
"maximum_value": "1"
},
"material_diameter": {
"default_value": 1.75
},
"machine_nozzle_size": {
"default_value": 0.4
},
"machine_nozzle_offset_x": {
"default_value": 0.0
},
"machine_nozzle_offset_y": {
"default_value": 0.0
},
"machine_extruder_start_pos_abs": {
"default_value": true
},
"machine_extruder_start_pos_x": {
"value": "prime_tower_position_x"
},
"machine_extruder_start_pos_y": {
"value": "prime_tower_position_y"
},
"machine_extruder_end_pos_abs": {
"default_value": true
},
"machine_extruder_end_pos_x": {
"value": "prime_tower_position_x"
},
"machine_extruder_end_pos_y": {
"value": "prime_tower_position_y"
}
}
"version": 2,
"name": "Extruder 1",
"inherits": "fdmextruder",
"metadata": {
"machine": "bibo2_dual",
"position": "0"
},
"overrides": {
"extruder_nr": {
"default_value": 0,
"maximum_value": "1"
},
"material_diameter": {
"default_value": 1.75
},
"machine_nozzle_size": {
"default_value": 0.4
},
"machine_nozzle_offset_x": {
"default_value": 0.0
},
"machine_nozzle_offset_y": {
"default_value": 0.0
},
"machine_extruder_start_pos_abs": {
"default_value": true
},
"machine_extruder_start_pos_x": {
"value": "prime_tower_position_x"
},
"machine_extruder_start_pos_y": {
"value": "prime_tower_position_y"
},
"machine_extruder_end_pos_abs": {
"default_value": true
},
"machine_extruder_end_pos_x": {
"value": "prime_tower_position_x"
},
"machine_extruder_end_pos_y": {
"value": "prime_tower_position_y"
}
}
}

View File

@ -1,45 +1,45 @@
{
"version": 2,
"name": "Extruder 2",
"inherits": "fdmextruder",
"metadata": {
"machine": "BIBO2 dual",
"position": "1"
},
"overrides": {
"extruder_nr": {
"default_value": 1,
"maximum_value": "1"
},
"material_diameter": {
"default_value": 1.75
},
"machine_nozzle_size": {
"default_value": 0.4
},
"machine_nozzle_offset_x": {
"default_value": 0.0
},
"machine_nozzle_offset_y": {
"default_value": 0.0
},
"machine_extruder_start_pos_abs": {
"default_value": true
},
"machine_extruder_start_pos_x": {
"value": "prime_tower_position_x"
},
"machine_extruder_start_pos_y": {
"value": "prime_tower_position_y"
},
"machine_extruder_end_pos_abs": {
"default_value": true
},
"machine_extruder_end_pos_x": {
"value": "prime_tower_position_x"
},
"machine_extruder_end_pos_y": {
"value": "prime_tower_position_y"
}
}
"version": 2,
"name": "Extruder 2",
"inherits": "fdmextruder",
"metadata": {
"machine": "bibo2_dual",
"position": "1"
},
"overrides": {
"extruder_nr": {
"default_value": 1,
"maximum_value": "1"
},
"material_diameter": {
"default_value": 1.75
},
"machine_nozzle_size": {
"default_value": 0.4
},
"machine_nozzle_offset_x": {
"default_value": 0.0
},
"machine_nozzle_offset_y": {
"default_value": 0.0
},
"machine_extruder_start_pos_abs": {
"default_value": true
},
"machine_extruder_start_pos_x": {
"value": "prime_tower_position_x"
},
"machine_extruder_start_pos_y": {
"value": "prime_tower_position_y"
},
"machine_extruder_end_pos_abs": {
"default_value": true
},
"machine_extruder_end_pos_x": {
"value": "prime_tower_position_x"
},
"machine_extruder_end_pos_y": {
"value": "prime_tower_position_y"
}
}
}

View File

@ -3,7 +3,7 @@
"name": "Left Extruder",
"inherits": "fdmextruder",
"metadata": {
"machine": "Creality CR-X",
"machine": "creality_cr-x",
"position": "0"
},

View File

@ -3,7 +3,7 @@
"name": "Right Extruder",
"inherits": "fdmextruder",
"metadata": {
"machine": "Creality CR-X",
"machine": "creality_cr-x",
"position": "1"
},

View File

@ -3,7 +3,7 @@
"name": "Extruder 1",
"inherits": "fdmextruder",
"metadata": {
"machine": "Creatable_D3",
"machine": "creatable_d3",
"position": "0"
},

View File

@ -3,7 +3,7 @@
"name": "Extruder 1",
"inherits": "fdmextruder",
"metadata": {
"machine": "hellbot_magna_i",
"machine": "hellbot_magna_I",
"position": "0"
},

View File

@ -3,7 +3,7 @@
"name": "0.4mm Nozzle",
"inherits": "fdmextruder",
"metadata": {
"machine": "Tyro",
"machine": "key3d_tyro",
"position": "0"
},

View File

@ -22,7 +22,7 @@
"machine_extruder_end_pos_x": { "default_value": 180 },
"machine_extruder_end_pos_y": { "default_value": 180 },
"machine_nozzle_head_distance": { "default_value": 4.2 },
"extruder_prime_pos_x": { "default_value": 180 },
"extruder_prime_pos_x": { "value": "machine_width + 3" },
"extruder_prime_pos_y": { "default_value": 6 },
"extruder_prime_pos_z": { "default_value": 2 }
}

View File

@ -2795,7 +2795,7 @@ msgstr "Selecteer eventuele upgrades die op deze Ultimaker Original zijn uitgevo
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:41
msgctxt "@label"
msgid "Heated Build Plate (official kit or self-built)"
msgstr "Verwarmd Platform (officiële kit of eigenbouw)"
msgstr "Verwarmd Platform (officiële kit of zelf gebouwd)"
#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:119
msgctxt "@label:MonitorStatus"

View File

@ -0,0 +1,34 @@
[general]
version = 4
name = Quick
definition = ultimaker_s3
[metadata]
setting_version = 10
type = intent
intent_category = quick
quality_type = draft
material = generic_abs
variant = AA 0.4
[values]
speed_infill = =speed_print
speed_topbottom = =speed_print
speed_wall = =speed_print
speed_wall_0 = =speed_wall
speed_wall_x = =speed_wall
speed_layer_0 = 20
top_bottom_thickness = =wall_thickness
wall_thickness = =line_width * 2
fill_perimeter_gaps = nowhere
infill_sparse_density = 15
infill_line_width = =line_width
jerk_print = 30
jerk_infill = =jerk_print
jerk_topbottom = =jerk_print
jerk_wall = =jerk_print
jerk_wall_0 = =jerk_wall
jerk_wall_x = =jerk_wall
jerk_layer_0 = 5
line_width = =machine_nozzle_size
wall_line_width_x = =line_width

View File

@ -0,0 +1,34 @@
[general]
version = 4
name = Accurate
definition = ultimaker_s3
[metadata]
setting_version = 10
type = intent
intent_category = engineering
quality_type = fast
material = generic_abs
variant = AA 0.4
[values]
infill_line_width = =line_width
jerk_print = 30
jerk_infill = =jerk_print
jerk_topbottom = =jerk_print
jerk_wall = =jerk_print
jerk_wall_0 = =jerk_wall
jerk_wall_x = =jerk_wall
jerk_layer_0 = 5
line_width = =machine_nozzle_size
speed_print = 30
speed_infill = =speed_print
speed_layer_0 = 20
speed_topbottom = =speed_print
speed_wall = =speed_print
speed_wall_0 = =speed_wall
speed_wall_x = =speed_wall
top_bottom_thickness = =wall_thickness
wall_line_width_x = =line_width
wall_thickness = =line_width * 3
xy_offset = =- layer_height * 0.2

View File

@ -0,0 +1,17 @@
[general]
version = 4
name = Visual
definition = ultimaker_s3
[metadata]
setting_version = 10
type = intent
quality_type = fast
intent_category = visual
material = generic_abs
variant = AA 0.4
[values]
speed_infill = 50
wall_thickness = =wall_line_width * 3
top_bottom_thickness = =wall_thickness

View File

@ -0,0 +1,17 @@
[general]
version = 4
name = Visual
definition = ultimaker_s3
[metadata]
setting_version = 10
type = intent
quality_type = high
intent_category = visual
material = generic_abs
variant = AA 0.4
[values]
speed_infill = 50
wall_thickness = =wall_line_width * 3
top_bottom_thickness = =wall_thickness

View File

@ -0,0 +1,34 @@
[general]
version = 4
name = Accurate
definition = ultimaker_s3
[metadata]
setting_version = 10
type = intent
intent_category = engineering
quality_type = normal
material = generic_abs
variant = AA 0.4
[values]
infill_line_width = =line_width
jerk_print = 30
jerk_infill = =jerk_print
jerk_topbottom = =jerk_print
jerk_wall = =jerk_print
jerk_wall_0 = =jerk_wall
jerk_wall_x = =jerk_wall
jerk_layer_0 = 5
line_width = =machine_nozzle_size
speed_print = 30
speed_infill = =speed_print
speed_layer_0 = 20
speed_topbottom = =speed_print
speed_wall = =speed_print
speed_wall_0 = =speed_wall
speed_wall_x = =speed_wall
top_bottom_thickness = =wall_thickness
wall_line_width_x = =line_width
wall_thickness = =line_width * 3
xy_offset = =- layer_height * 0.2

View File

@ -0,0 +1,17 @@
[general]
version = 4
name = Visual
definition = ultimaker_s3
[metadata]
setting_version = 10
type = intent
quality_type = normal
intent_category = visual
material = generic_abs
variant = AA 0.4
[values]
speed_infill = 50
wall_thickness = =wall_line_width * 3
top_bottom_thickness = =wall_thickness

View File

@ -0,0 +1,34 @@
[general]
version = 4
name = Quick
definition = ultimaker_s3
[metadata]
setting_version = 10
type = intent
intent_category = quick
quality_type = draft
material = generic_pla
variant = AA 0.4
[values]
speed_infill = =speed_print
speed_topbottom = =speed_print
speed_wall = =speed_print
speed_wall_0 = =speed_wall
speed_wall_x = =speed_wall
speed_layer_0 = 20
top_bottom_thickness = =wall_thickness
wall_thickness = =line_width * 2
fill_perimeter_gaps = nowhere
infill_sparse_density = 15
infill_line_width = =line_width
jerk_print = 30
jerk_infill = =jerk_print
jerk_topbottom = =jerk_print
jerk_wall = =jerk_print
jerk_wall_0 = =jerk_wall
jerk_wall_x = =jerk_wall
jerk_layer_0 = 5
line_width = =machine_nozzle_size
wall_line_width_x = =line_width

View File

@ -0,0 +1,34 @@
[general]
version = 4
name = Accurate
definition = ultimaker_s3
[metadata]
setting_version = 10
type = intent
intent_category = engineering
quality_type = fast
material = generic_pla
variant = AA 0.4
[values]
infill_line_width = =line_width
jerk_print = 30
jerk_infill = =jerk_print
jerk_topbottom = =jerk_print
jerk_wall = =jerk_print
jerk_wall_0 = =jerk_wall
jerk_wall_x = =jerk_wall
jerk_layer_0 = 5
line_width = =machine_nozzle_size
speed_print = 30
speed_infill = =speed_print
speed_layer_0 = 20
speed_topbottom = =speed_print
speed_wall = =speed_print
speed_wall_0 = =speed_wall
speed_wall_x = =speed_wall
top_bottom_thickness = =wall_thickness
wall_line_width_x = =line_width
wall_thickness = =line_width * 3
xy_offset = =- layer_height * 0.2

View File

@ -0,0 +1,17 @@
[general]
version = 4
name = Visual
definition = ultimaker_s3
[metadata]
setting_version = 10
type = intent
quality_type = fast
intent_category = visual
material = generic_pla
variant = AA 0.4
[values]
speed_infill = 50
wall_thickness = =wall_line_width * 3
top_bottom_thickness = =wall_thickness

View File

@ -0,0 +1,17 @@
[general]
version = 4
name = Visual
definition = ultimaker_s3
[metadata]
setting_version = 10
type = intent
quality_type = high
intent_category = visual
material = generic_pla
variant = AA 0.4
[values]
speed_infill = 50
wall_thickness = =wall_line_width * 3
top_bottom_thickness = =wall_thickness

View File

@ -0,0 +1,34 @@
[general]
version = 4
name = Accurate
definition = ultimaker_s3
[metadata]
setting_version = 10
type = intent
intent_category = engineering
quality_type = normal
material = generic_pla
variant = AA 0.4
[values]
infill_line_width = =line_width
jerk_print = 30
jerk_infill = =jerk_print
jerk_topbottom = =jerk_print
jerk_wall = =jerk_print
jerk_wall_0 = =jerk_wall
jerk_wall_x = =jerk_wall
jerk_layer_0 = 5
line_width = =machine_nozzle_size
speed_print = 30
speed_infill = =speed_print
speed_layer_0 = 20
speed_topbottom = =speed_print
speed_wall = =speed_print
speed_wall_0 = =speed_wall
speed_wall_x = =speed_wall
top_bottom_thickness = =wall_thickness
wall_line_width_x = =line_width
wall_thickness = =line_width * 3
xy_offset = =- layer_height * 0.2

View File

@ -0,0 +1,17 @@
[general]
version = 4
name = Visual
definition = ultimaker_s3
[metadata]
setting_version = 10
type = intent
quality_type = normal
intent_category = visual
material = generic_pla
variant = AA 0.4
[values]
speed_infill = 50
wall_thickness = =wall_line_width * 3
top_bottom_thickness = =wall_thickness

View File

@ -0,0 +1,34 @@
[general]
version = 4
name = Quick
definition = ultimaker_s3
[metadata]
setting_version = 10
type = intent
intent_category = quick
quality_type = draft
material = generic_tough_pla
variant = AA 0.4
[values]
speed_infill = =speed_print
speed_topbottom = =speed_print
speed_wall = =speed_print
speed_wall_0 = =speed_wall
speed_wall_x = =speed_wall
speed_layer_0 = 20
top_bottom_thickness = =wall_thickness
wall_thickness = =line_width * 2
fill_perimeter_gaps = nowhere
infill_sparse_density = 15
infill_line_width = =line_width
jerk_print = 30
jerk_infill = =jerk_print
jerk_topbottom = =jerk_print
jerk_wall = =jerk_print
jerk_wall_0 = =jerk_wall
jerk_wall_x = =jerk_wall
jerk_layer_0 = 5
line_width = =machine_nozzle_size
wall_line_width_x = =line_width

View File

@ -0,0 +1,34 @@
[general]
version = 4
name = Accurate
definition = ultimaker_s3
[metadata]
setting_version = 10
type = intent
intent_category = engineering
quality_type = fast
material = generic_tough_pla
variant = AA 0.4
[values]
infill_line_width = =line_width
jerk_print = 30
jerk_infill = =jerk_print
jerk_topbottom = =jerk_print
jerk_wall = =jerk_print
jerk_wall_0 = =jerk_wall
jerk_wall_x = =jerk_wall
jerk_layer_0 = 5
line_width = =machine_nozzle_size
speed_print = 30
speed_infill = =speed_print
speed_layer_0 = 20
speed_topbottom = =speed_print
speed_wall = =speed_print
speed_wall_0 = =speed_wall
speed_wall_x = =speed_wall
top_bottom_thickness = =wall_thickness
wall_line_width_x = =line_width
wall_thickness = =line_width * 3
xy_offset = =- layer_height * 0.2

View File

@ -0,0 +1,17 @@
[general]
version = 4
name = Visual
definition = ultimaker_s3
[metadata]
setting_version = 10
type = intent
quality_type = fast
intent_category = visual
material = generic_tough_pla
variant = AA 0.4
[values]
speed_infill = 50
wall_thickness = =wall_line_width * 3
top_bottom_thickness = =wall_thickness

View File

@ -0,0 +1,17 @@
[general]
version = 4
name = Visual
definition = ultimaker_s3
[metadata]
setting_version = 10
type = intent
quality_type = high
intent_category = visual
material = generic_tough_pla
variant = AA 0.4
[values]
speed_infill = 50
wall_thickness = =wall_line_width * 3
top_bottom_thickness = =wall_thickness

View File

@ -0,0 +1,34 @@
[general]
version = 4
name = Accurate
definition = ultimaker_s3
[metadata]
setting_version = 10
type = intent
intent_category = engineering
quality_type = normal
material = generic_tough_pla
variant = AA 0.4
[values]
infill_line_width = =line_width
jerk_print = 30
jerk_infill = =jerk_print
jerk_topbottom = =jerk_print
jerk_wall = =jerk_print
jerk_wall_0 = =jerk_wall
jerk_wall_x = =jerk_wall
jerk_layer_0 = 5
line_width = =machine_nozzle_size
speed_print = 30
speed_infill = =speed_print
speed_layer_0 = 20
speed_topbottom = =speed_print
speed_wall = =speed_print
speed_wall_0 = =speed_wall
speed_wall_x = =speed_wall
top_bottom_thickness = =wall_thickness
wall_line_width_x = =line_width
wall_thickness = =line_width * 3
xy_offset = =- layer_height * 0.2

View File

@ -0,0 +1,17 @@
[general]
version = 4
name = Visual
definition = ultimaker_s3
[metadata]
setting_version = 10
type = intent
quality_type = normal
intent_category = visual
material = generic_tough_pla
variant = AA 0.4
[values]
speed_infill = 50
wall_thickness = =wall_line_width * 3
top_bottom_thickness = =wall_thickness

View File

@ -6,7 +6,7 @@ definition = ultimaker_s5
[metadata]
setting_version = 10
type = intent
intent_category = smooth
intent_category = quick
quality_type = draft
material = generic_abs
variant = AA 0.4

View File

@ -0,0 +1,17 @@
[general]
version = 4
name = Visual
definition = ultimaker_s5
[metadata]
setting_version = 10
type = intent
quality_type = fast
intent_category = visual
material = generic_abs
variant = AA 0.4
[values]
speed_infill = 50
wall_thickness = =wall_line_width * 3
top_bottom_thickness = =wall_thickness

View File

@ -0,0 +1,17 @@
[general]
version = 4
name = Visual
definition = ultimaker_s5
[metadata]
setting_version = 10
type = intent
quality_type = high
intent_category = visual
material = generic_abs
variant = AA 0.4
[values]
speed_infill = 50
wall_thickness = =wall_line_width * 3
top_bottom_thickness = =wall_thickness

View File

@ -0,0 +1,17 @@
[general]
version = 4
name = Visual
definition = ultimaker_s5
[metadata]
setting_version = 10
type = intent
quality_type = normal
intent_category = visual
material = generic_abs
variant = AA 0.4
[values]
speed_infill = 50
wall_thickness = =wall_line_width * 3
top_bottom_thickness = =wall_thickness

View File

@ -6,7 +6,7 @@ definition = ultimaker_s5
[metadata]
setting_version = 10
type = intent
intent_category = smooth
intent_category = quick
quality_type = draft
material = generic_pla
variant = AA 0.4

View File

@ -0,0 +1,17 @@
[general]
version = 4
name = Visual
definition = ultimaker_s5
[metadata]
setting_version = 10
type = intent
quality_type = fast
intent_category = visual
material = generic_pla
variant = AA 0.4
[values]
speed_infill = 50
wall_thickness = =wall_line_width * 3
top_bottom_thickness = =wall_thickness

View File

@ -0,0 +1,17 @@
[general]
version = 4
name = Visual
definition = ultimaker_s5
[metadata]
setting_version = 10
type = intent
quality_type = high
intent_category = visual
material = generic_pla
variant = AA 0.4
[values]
speed_infill = 50
wall_thickness = =wall_line_width * 3
top_bottom_thickness = =wall_thickness

View File

@ -0,0 +1,17 @@
[general]
version = 4
name = Visual
definition = ultimaker_s5
[metadata]
setting_version = 10
type = intent
quality_type = normal
intent_category = visual
material = generic_pla
variant = AA 0.4
[values]
speed_infill = 50
wall_thickness = =wall_line_width * 3
top_bottom_thickness = =wall_thickness

View File

@ -6,7 +6,7 @@ definition = ultimaker_s5
[metadata]
setting_version = 10
type = intent
intent_category = smooth
intent_category = quick
quality_type = draft
material = generic_tough_pla
variant = AA 0.4

View File

@ -0,0 +1,17 @@
[general]
version = 4
name = Visual
definition = ultimaker_s5
[metadata]
setting_version = 10
type = intent
quality_type = fast
intent_category = visual
material = generic_tough_pla
variant = AA 0.4
[values]
speed_infill = 50
wall_thickness = =wall_line_width * 3
top_bottom_thickness = =wall_thickness

View File

@ -0,0 +1,17 @@
[general]
version = 4
name = Visual
definition = ultimaker_s5
[metadata]
setting_version = 10
type = intent
quality_type = high
intent_category = visual
material = generic_tough_pla
variant = AA 0.4
[values]
speed_infill = 50
wall_thickness = =wall_line_width * 3
top_bottom_thickness = =wall_thickness

View File

@ -0,0 +1,17 @@
[general]
version = 4
name = Visual
definition = ultimaker_s5
[metadata]
setting_version = 10
type = intent
quality_type = normal
intent_category = visual
material = generic_tough_pla
variant = AA 0.4
[values]
speed_infill = 50
wall_thickness = =wall_line_width * 3
top_bottom_thickness = =wall_thickness

View File

@ -301,6 +301,15 @@ UM.MainWindow
}
}
// A hint for the loaded content view. Overlay items / controls can safely be placed in this area
Item {
id: mainSafeArea
anchors.left: viewOrientationControls.right
anchors.right: main.right
anchors.top: main.top
anchors.bottom: main.bottom
}
Loader
{
// A stage can control this area. If nothing is set, it will therefore show the 3D view.
@ -316,6 +325,12 @@ UM.MainWindow
}
source: UM.Controller.activeStage != null ? UM.Controller.activeStage.mainComponent : ""
onLoaded: {
if (main.item.safeArea !== undefined){
main.item.safeArea = Qt.binding(function() { return mainSafeArea });
}
}
}
Loader

View File

@ -53,7 +53,11 @@ Item
}
// When loaded, try to select the active material in the tree
Component.onCompleted: resetExpandedActiveMaterial()
Component.onCompleted:
{
resetExpandedActiveMaterial()
base.newRootMaterialIdToSwitchTo = active_root_material_id
}
// Every time the selected item has changed, notify to the details panel
onCurrentItemChanged:

View File

@ -19,12 +19,6 @@ Item
property bool settingsEnabled: Cura.ExtruderManager.activeExtruderStackId || extrudersEnabledCount.properties.value == 1
property real padding: UM.Theme.getSize("thick_margin").width
UM.I18nCatalog
{
id: catalog
name: "cura"
}
Column
{
spacing: UM.Theme.getSize("wide_margin").height

View File

@ -124,18 +124,6 @@ Item
elide: Text.ElideRight
}
NoIntentIcon
{
affected_extruders: Cura.MachineManager.extruderPositionsWithNonActiveIntent
intent_type: model.name
anchors.right: intentCategoryLabel.right
anchors.rightMargin: UM.Theme.getSize("narrow_margin").width
width: intentCategoryLabel.height * 0.75
anchors.verticalCenter: parent.verticalCenter
height: width
visible: Cura.MachineManager.activeIntentCategory == model.intent_category && affected_extruders.length
}
Cura.RadioCheckbar
{
anchors
@ -164,8 +152,9 @@ Item
isCheckedFunction: checkedFunction
}
MouseArea // tooltip hover area
MouseArea // Intent description tooltip hover area
{
id: intentDescriptionHoverArea
anchors.fill: parent
hoverEnabled: true
enabled: model.description !== undefined
@ -181,6 +170,20 @@ Item
}
onExited: base.hideTooltip()
}
NoIntentIcon // This icon has hover priority over intentDescriptionHoverArea, so draw it above it.
{
affected_extruders: Cura.MachineManager.extruderPositionsWithNonActiveIntent
intent_type: model.name
anchors.right: intentCategoryLabel.right
anchors.rightMargin: UM.Theme.getSize("narrow_margin").width
width: intentCategoryLabel.height * 0.75
anchors.verticalCenter: parent.verticalCenter
height: width
visible: Cura.MachineManager.activeIntentCategory == model.intent_category && affected_extruders.length
}
}
}

View File

@ -75,7 +75,7 @@ SettingItem
base.setActiveFocusToNextSetting(false)
}
currentIndex: propertyProvider.properties.value
currentIndex: propertyProvider.properties.value !== undefined ? propertyProvider.properties.value : 0
property string color: "#fff"

View File

@ -23,17 +23,16 @@ Item
property alias contents: controlContainer.children
property alias hovered: mouse.containsMouse
property var showRevertButton: true
property var showInheritButton: true
property var showLinkedSettingIcon: true
property var doDepthIndentation: true
property var doQualityUserSettingEmphasis: true
property bool showRevertButton: true
property bool showInheritButton: true
property bool showLinkedSettingIcon: true
property bool doDepthIndentation: true
property bool doQualityUserSettingEmphasis: true
property var settingKey: definition.key //Used to detect each individual setting more easily in Squish GUI tests.
// Create properties to put property provider stuff in (bindings break in qt 5.5.1 otherwise)
property var state: propertyProvider.properties.state
// There is no resolve property if there is only one stack.
property var resolve: Cura.MachineManager.activeStackId !== Cura.MachineManager.activeMachine.id ? propertyProvider.properties.resolve : "None"
property var resolve: propertyProvider.properties.resolve
property var stackLevels: propertyProvider.stackLevels
property var stackLevel: stackLevels[0]
// A list of stack levels that will trigger to show the revert button
@ -57,7 +56,8 @@ Item
signal showTooltip(string text)
signal hideTooltip()
signal showAllHiddenInheritedSettings(string category_id)
property string tooltipText:
function createTooltipText()
{
var affects = settingDefinitionsModel.getRequiredBy(definition.key, "value")
var affected_by = settingDefinitionsModel.getRequires(definition.key, "value")
@ -128,7 +128,7 @@ Item
onTriggered:
{
base.showTooltip(base.tooltipText)
base.showTooltip(base.createTooltipText())
}
}
@ -149,7 +149,7 @@ Item
color: UM.Theme.getColor("setting_control_text")
opacity: (definition.visible) ? 1 : 0.5
// emphasize the setting if it has a value in the user or quality profile
font: base.doQualityUserSettingEmphasis && base.stackLevel != undefined && base.stackLevel <= 1 ? UM.Theme.getFont("default_italic") : UM.Theme.getFont("default")
font: base.doQualityUserSettingEmphasis && base.stackLevel !== undefined && base.stackLevel <= 1 ? UM.Theme.getFont("default_italic") : UM.Theme.getFont("default")
}
Row
@ -170,10 +170,11 @@ Item
{
id: linkedSettingIcon;
visible: Cura.MachineManager.activeStack != Cura.MachineManager.activeMachine && (!definition.settable_per_extruder || String(globalPropertyProvider.properties.limit_to_extruder) != "-1") && base.showLinkedSettingIcon
visible: (!definition.settable_per_extruder || String(globalPropertyProvider.properties.limit_to_extruder) != "-1") && base.showLinkedSettingIcon
height: parent.height;
width: height;
anchors.top: parent.top
anchors.bottom: parent.bottom
width: height
color: UM.Theme.getColor("setting_control_button")
hoverColor: UM.Theme.getColor("setting_control_button")
@ -184,14 +185,14 @@ Item
{
hoverTimer.stop()
var tooltipText = catalog.i18nc("@label", "This setting is always shared between all extruders. Changing it here will change the value for all extruders.")
if ((resolve != "None") && (stackLevel != 0))
if ((resolve !== "None") && (stackLevel !== 0))
{
// We come here if a setting has a resolve and the setting is not manually edited.
tooltipText += " " + catalog.i18nc("@label", "The value is resolved from per-extruder values ") + "[" + Cura.ExtruderManager.getInstanceExtruderValues(definition.key) + "]."
}
base.showTooltip(tooltipText)
}
onExited: base.showTooltip(base.tooltipText)
onExited: base.showTooltip(base.createTooltipText())
}
UM.SimpleButton
@ -200,7 +201,8 @@ Item
visible: base.resetButtonVisible
height: parent.height
anchors.top: parent.top
anchors.bottom: parent.bottom
width: height
color: UM.Theme.getColor("setting_control_button")
@ -227,7 +229,7 @@ Item
hoverTimer.stop()
base.showTooltip(catalog.i18nc("@label", "This setting has a value that is different from the profile.\n\nClick to restore the value of the profile."))
}
onExited: base.showTooltip(base.tooltipText)
onExited: base.showTooltip(base.createTooltipText())
}
UM.SimpleButton
@ -275,10 +277,15 @@ Item
// Observed when loading workspace, probably when SettingItems are removed.
return false
}
if(globalPropertyProvider.properties.limit_to_extruder === undefined)
{
return false
}
return Cura.SettingInheritanceManager.getOverridesForExtruder(definition.key, String(globalPropertyProvider.properties.limit_to_extruder)).indexOf(definition.key) >= 0
}
height: parent.height
anchors.top: parent.top
anchors.bottom: parent.bottom
width: height
onClicked:
@ -296,7 +303,7 @@ Item
break
}
}
if ((last_entry == 4 || last_entry == 11) && base.stackLevel == 0 && base.stackLevels.length == 2)
if ((last_entry === 4 || last_entry === 11) && base.stackLevel === 0 && base.stackLevels.length === 2)
{
// Special case of the inherit reset. If only the definition (4th or 11th) container) and the first
// entry (user container) are set, we can simply remove the container.
@ -320,7 +327,7 @@ Item
iconSource: UM.Theme.getIcon("formula")
onEntered: { hoverTimer.stop(); base.showTooltip(catalog.i18nc("@label", "This setting is normally calculated, but it currently has an absolute value set.\n\nClick to restore the calculated value.")) }
onExited: base.showTooltip(base.tooltipText)
onExited: base.showTooltip(base.createTooltipText())
}
}

View File

@ -228,7 +228,7 @@ Item
model: UM.SettingDefinitionsModel
{
id: definitionsModel
containerId: Cura.MachineManager.activeMachine != null ? Cura.MachineManager.activeMachine.definition.id: ""
containerId: Cura.MachineManager.activeMachine !== null ? Cura.MachineManager.activeMachine.definition.id: ""
visibilityHandler: UM.SettingPreferenceVisibilityHandler { }
exclude: ["machine_settings", "command_line_settings", "infill_mesh", "infill_mesh_order", "cutting_mesh", "support_mesh", "anti_overhang_mesh"] // TODO: infill_mesh settigns are excluded hardcoded, but should be based on the fact that settable_globally, settable_per_meshgroup and settable_per_extruder are false.
expanded: CuraApplication.expandedCategories
@ -241,43 +241,41 @@ Item
CuraApplication.setExpandedCategories(expanded)
}
}
onVisibilityChanged: Cura.SettingInheritanceManager.forceUpdate()
onVisibilityChanged: Cura.SettingInheritanceManager.scheduleUpdate()
}
property var indexWithFocus: -1
property int indexWithFocus: -1
property string activeMachineId: Cura.MachineManager.activeMachine !== null ? Cura.MachineManager.activeMachine.id : ""
delegate: Loader
{
id: delegate
width: scrollView.width
height: provider.properties.enabled == "True" ? UM.Theme.getSize("section").height : - contents.spacing
height: provider.properties.enabled === "True" ? UM.Theme.getSize("section").height : - contents.spacing
Behavior on height { NumberAnimation { duration: 100 } }
opacity: provider.properties.enabled == "True" ? 1 : 0
opacity: provider.properties.enabled === "True" ? 1 : 0
Behavior on opacity { NumberAnimation { duration: 100 } }
enabled:
{
if (!Cura.ExtruderManager.activeExtruderStackId && machineExtruderCount.properties.value > 1)
{
// disable all controls on the global tab, except categories
return model.type == "category"
return model.type === "category"
}
return provider.properties.enabled == "True"
return provider.properties.enabled === "True"
}
property var definition: model
property var settingDefinitionsModel: definitionsModel
property var propertyProvider: provider
property var globalPropertyProvider: inheritStackProvider
property var externalResetHandler: false
property string activeMachineId: Cura.MachineManager.activeMachine !== null ? Cura.MachineManager.activeMachine.id : ""
property bool externalResetHandler: false
//Qt5.4.2 and earlier has a bug where this causes a crash: https://bugreports.qt.io/browse/QTBUG-35989
//In addition, while it works for 5.5 and higher, the ordering of the actual combo box drop down changes,
//causing nasty issues when selecting different options. So disable asynchronous loading of enum type completely.
asynchronous: model.type != "enum" && model.type != "extruder" && model.type != "optional_extruder"
active: model.type != undefined
asynchronous: model.type !== "enum" && model.type !== "extruder" && model.type !== "optional_extruder"
active: model.type !== undefined
source:
{
@ -313,7 +311,7 @@ Item
{
target: provider
property: "containerStackId"
when: model.settable_per_extruder || (inheritStackProvider.properties.limit_to_extruder != null && inheritStackProvider.properties.limit_to_extruder >= 0);
when: model.settable_per_extruder || (inheritStackProvider.properties.limit_to_extruder !== null && inheritStackProvider.properties.limit_to_extruder >= 0);
value:
{
// Associate this binding with Cura.MachineManager.activeMachine.id in the beginning so this
@ -324,9 +322,9 @@ Item
if (!model.settable_per_extruder)
{
//Not settable per extruder or there only is global, so we must pick global.
return delegate.activeMachineId
return contents.activeMachineId
}
if (inheritStackProvider.properties.limit_to_extruder != null && inheritStackProvider.properties.limit_to_extruder >= 0)
if (inheritStackProvider.properties.limit_to_extruder !== null && inheritStackProvider.properties.limit_to_extruder >= 0)
{
//We have limit_to_extruder, so pick that stack.
return Cura.ExtruderManager.extruderIds[String(inheritStackProvider.properties.limit_to_extruder)];
@ -337,7 +335,7 @@ Item
return Cura.ExtruderManager.activeExtruderStackId;
}
//No extruder tab is selected. Pick the global stack. Shouldn't happen any more since we removed the global tab.
return delegate.activeMachineId
return contents.activeMachineId
}
}
@ -346,7 +344,7 @@ Item
UM.SettingPropertyProvider
{
id: inheritStackProvider
containerStackId: Cura.MachineManager.activeMachine !== null ? Cura.MachineManager.activeMachine.id: ""
containerStackId: contents.activeMachineId
key: model.key
watchedProperties: [ "limit_to_extruder" ]
}
@ -355,11 +353,11 @@ Item
{
id: provider
containerStackId: delegate.activeMachineId
containerStackId: contents.activeMachineId
key: model.key ? model.key : ""
watchedProperties: [ "value", "enabled", "state", "validationState", "settable_per_extruder", "resolve" ]
storeIndex: 0
removeUnusedValue: model.resolve == undefined
removeUnusedValue: model.resolve === undefined
}
Connections
@ -421,8 +419,6 @@ Item
}
}
UM.I18nCatalog { id: catalog; name: "cura"; }
NumberAnimation {
id: animateContentY
target: contents
@ -465,7 +461,7 @@ Item
//: Settings context menu action
text: catalog.i18nc("@action:menu", "Copy value to all extruders")
visible: machineExtruderCount.properties.value > 1
enabled: contextMenu.provider != undefined && contextMenu.provider.properties.settable_per_extruder != "False"
enabled: contextMenu.provider !== undefined && contextMenu.provider.properties.settable_per_extruder !== "False"
onTriggered: Cura.MachineManager.copyValueToExtruders(contextMenu.key)
}
@ -474,7 +470,7 @@ Item
//: Settings context menu action
text: catalog.i18nc("@action:menu", "Copy all changed values to all extruders")
visible: machineExtruderCount.properties.value > 1
enabled: contextMenu.provider != undefined
enabled: contextMenu.provider !== undefined
onTriggered: Cura.MachineManager.copyAllValuesToExtruders()
}

View File

@ -8,21 +8,20 @@ setting_version = 10
type = quality
quality_type = a
weight = 1
material = generic_abs
material = emotiontech_abs
variant = Standard 0.4
[values]
layer_height_0 = =round(0.5*machine_nozzle_size, 2)
line_width = =machine_nozzle_size/machine_nozzle_size*0.35
line_width = =machine_nozzle_size/machine_nozzle_size*0.4
wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
infill_line_width = =machine_nozzle_size/machine_nozzle_size*0.5
support_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
wall_0_wipe_dist = =machine_nozzle_size/2
speed_print = 55
speed_wall = =math.ceil(speed_print * 40/55)
speed_wall_0 = =math.ceil(speed_wall * 30/40)
speed_topbottom = =math.ceil(speed_print * 35/55)
speed_layer_0 = =math.ceil(speed_print * 20/55)
speed_print = 50
speed_wall = =math.ceil(speed_print * 35/50)
speed_wall_0 = =math.ceil(speed_wall * 30/35)
speed_topbottom = =math.ceil(speed_print * 35/50)
speed_layer_0 = =math.ceil(speed_print * 20/50)
speed_slowdown_layers = 2
cool_fan_enabled = True
cool_fan_speed = 35

View File

@ -8,21 +8,20 @@ setting_version = 10
type = quality
quality_type = b
weight = 0
material = generic_abs
material = emotiontech_abs
variant = Standard 0.4
[values]
layer_height_0 = =round(0.67*machine_nozzle_size, 2)
line_width = =machine_nozzle_size/machine_nozzle_size*0.35
line_width = =machine_nozzle_size/machine_nozzle_size*0.4
wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
infill_line_width = =machine_nozzle_size/machine_nozzle_size*0.5
support_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
wall_0_wipe_dist = =machine_nozzle_size/2
speed_print = 60
speed_wall = =math.ceil(speed_print * 43/60)
speed_wall_0 = =math.ceil(speed_wall * 33/43)
speed_topbottom = =math.ceil(speed_print * 37/60)
speed_layer_0 = =math.ceil(speed_print * 25/60)
speed_print = 55
speed_wall = =math.ceil(speed_print * 37/55)
speed_wall_0 = =math.ceil(speed_wall * 33/37)
speed_topbottom = =math.ceil(speed_print * 37/55)
speed_layer_0 = =math.ceil(speed_print * 25/55)
speed_slowdown_layers = 2
cool_fan_enabled = True
cool_fan_speed = 35

View File

@ -8,21 +8,20 @@ setting_version = 10
type = quality
quality_type = c
weight = -1
material = generic_abs
material = emotiontech_abs
variant = Standard 0.4
[values]
layer_height_0 = =round(0.75*machine_nozzle_size, 2)
line_width = =machine_nozzle_size/machine_nozzle_size*0.35
line_width = =machine_nozzle_size/machine_nozzle_size*0.4
wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
infill_line_width = =machine_nozzle_size/machine_nozzle_size*0.5
support_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
wall_0_wipe_dist = =machine_nozzle_size/2
speed_print = 65
speed_wall = =math.ceil(speed_print * 45/65)
speed_wall_0 = =math.ceil(speed_wall * 35/45)
speed_topbottom = =math.ceil(speed_print * 40/65)
speed_layer_0 = =math.ceil(speed_print * 30/65)
speed_print = 60
speed_wall = =math.ceil(speed_print * 40/60)
speed_wall_0 = =math.ceil(speed_wall * 35/40)
speed_topbottom = =math.ceil(speed_print * 40/60)
speed_layer_0 = =math.ceil(speed_print * 30/60)
speed_slowdown_layers = 2
cool_fan_enabled = True
cool_fan_speed = 35

View File

@ -8,21 +8,20 @@ setting_version = 10
type = quality
quality_type = a
weight = 1
material = generic_petg
material = emotiontech_petg
variant = Standard 0.4
[values]
layer_height_0 = =round(0.5*machine_nozzle_size, 2)
line_width = =machine_nozzle_size/machine_nozzle_size*0.35
line_width = =machine_nozzle_size/machine_nozzle_size*0.4
wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
infill_line_width = =machine_nozzle_size/machine_nozzle_size*0.4
support_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
wall_0_wipe_dist = =machine_nozzle_size/2
speed_print = 55
speed_wall = =math.ceil(speed_print * 40/55)
speed_wall_0 = =math.ceil(speed_wall * 25/40)
speed_topbottom = =math.ceil(speed_print * 35/55)
speed_layer_0 = =math.ceil(speed_print * 20/55)
speed_print = 50
speed_wall = =math.ceil(speed_print * 35/50)
speed_wall_0 = =math.ceil(speed_wall * 30/35)
speed_topbottom = =math.ceil(speed_print * 35/50)
speed_layer_0 = =math.ceil(speed_print * 20/50)
speed_slowdown_layers = 2
cool_fan_enabled = True
cool_fan_speed = 50

View File

@ -8,21 +8,20 @@ setting_version = 10
type = quality
quality_type = b
weight = 0
material = generic_petg
material = emotiontech_petg
variant = Standard 0.4
[values]
layer_height_0 = =round(0.67*machine_nozzle_size, 2)
line_width = =machine_nozzle_size/machine_nozzle_size*0.35
line_width = =machine_nozzle_size/machine_nozzle_size*0.4
wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
infill_line_width = =machine_nozzle_size/machine_nozzle_size*0.4
support_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
wall_0_wipe_dist = =machine_nozzle_size/2
speed_print = 60
speed_wall = =math.ceil(speed_print * 43/60)
speed_wall_0 = =math.ceil(speed_wall * 27/43)
speed_topbottom = =math.ceil(speed_print * 37/60)
speed_layer_0 = =math.ceil(speed_print * 25/60)
speed_print = 55
speed_wall = =math.ceil(speed_print * 37/55)
speed_wall_0 = =math.ceil(speed_wall * 33/37)
speed_topbottom = =math.ceil(speed_print * 37/55)
speed_layer_0 = =math.ceil(speed_print * 25/55)
speed_slowdown_layers = 2
cool_fan_enabled = True
cool_fan_speed = 50

View File

@ -8,21 +8,20 @@ setting_version = 10
type = quality
quality_type = c
weight = -1
material = generic_petg
material = emotiontech_petg
variant = Standard 0.4
[values]
layer_height_0 = =round(0.75*machine_nozzle_size, 2)
line_width = =machine_nozzle_size/machine_nozzle_size*0.35
line_width = =machine_nozzle_size/machine_nozzle_size*0.4
wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
infill_line_width = =machine_nozzle_size/machine_nozzle_size*0.4
support_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
wall_0_wipe_dist = =machine_nozzle_size/2
speed_print = 65
speed_wall = =math.ceil(speed_print * 45/65)
speed_wall_0 = =math.ceil(speed_wall * 30/45)
speed_topbottom = =math.ceil(speed_print * 40/65)
speed_layer_0 = =math.ceil(speed_print * 30/65)
speed_print = 60
speed_wall = =math.ceil(speed_print * 40/60)
speed_wall_0 = =math.ceil(speed_wall * 35/40)
speed_topbottom = =math.ceil(speed_print * 40/60)
speed_layer_0 = =math.ceil(speed_print * 30/60)
speed_slowdown_layers = 2
cool_fan_enabled = True
cool_fan_speed = 50

View File

@ -8,21 +8,20 @@ setting_version = 10
type = quality
quality_type = a
weight = 1
material = generic_pla
material = emotiontech_pla
variant = Standard 0.4
[values]
layer_height_0 = =round(0.5*machine_nozzle_size, 2)
line_width = =machine_nozzle_size/machine_nozzle_size*0.35
line_width = =machine_nozzle_size/machine_nozzle_size*0.4
wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
infill_line_width = =machine_nozzle_size/machine_nozzle_size*0.43
support_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
wall_0_wipe_dist = =machine_nozzle_size/2
speed_print = 55
speed_wall = =math.ceil(speed_print * 40/55)
speed_wall_0 = =math.ceil(speed_wall * 30/40)
speed_topbottom = =math.ceil(speed_print * 35/55)
speed_layer_0 = =math.ceil(speed_print * 20/55)
speed_print = 50
speed_wall = =math.ceil(speed_print * 35/50)
speed_wall_0 = =math.ceil(speed_wall * 30/35)
speed_topbottom = =math.ceil(speed_print * 35/50)
speed_layer_0 = =math.ceil(speed_print * 20/50)
speed_slowdown_layers = 2
cool_fan_enabled = True
cool_fan_speed = 100

View File

@ -8,21 +8,20 @@ setting_version = 10
type = quality
quality_type = b
weight = 0
material = generic_pla
material = emotiontech_pla
variant = Standard 0.4
[values]
layer_height_0 = =round(0.67*machine_nozzle_size, 2)
line_width = =machine_nozzle_size/machine_nozzle_size*0.35
line_width = =machine_nozzle_size/machine_nozzle_size*0.4
wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
infill_line_width = =machine_nozzle_size/machine_nozzle_size*0.43
support_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
wall_0_wipe_dist = =machine_nozzle_size/2
speed_print = 60
speed_wall = =math.ceil(speed_print * 43/60)
speed_wall_0 = =math.ceil(speed_wall * 33/43)
speed_topbottom = =math.ceil(speed_print * 37/60)
speed_layer_0 = =math.ceil(speed_print * 25/60)
speed_print = 55
speed_wall = =math.ceil(speed_print * 37/55)
speed_wall_0 = =math.ceil(speed_wall * 33/37)
speed_topbottom = =math.ceil(speed_print * 37/55)
speed_layer_0 = =math.ceil(speed_print * 25/55)
speed_slowdown_layers = 2
cool_fan_enabled = True
cool_fan_speed = 100

View File

@ -8,21 +8,20 @@ setting_version = 10
type = quality
quality_type = c
weight = -1
material = generic_pla
material = emotiontech_pla
variant = Standard 0.4
[values]
layer_height_0 = =round(0.75*machine_nozzle_size, 2)
line_width = =machine_nozzle_size/machine_nozzle_size*0.35
line_width = =machine_nozzle_size/machine_nozzle_size*0.4
wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
infill_line_width = =machine_nozzle_size/machine_nozzle_size*0.43
support_line_width = =machine_nozzle_size/machine_nozzle_size*0.35
wall_0_wipe_dist = =machine_nozzle_size/2
speed_print = 65
speed_wall = =math.ceil(speed_print * 45/65)
speed_wall_0 = =math.ceil(speed_wall * 35/45)
speed_topbottom = =math.ceil(speed_print * 40/65)
speed_layer_0 = =math.ceil(speed_print * 30/65)
speed_print = 60
speed_wall = =math.ceil(speed_print * 40/60)
speed_wall_0 = =math.ceil(speed_wall * 35/40)
speed_topbottom = =math.ceil(speed_print * 40/60)
speed_layer_0 = =math.ceil(speed_print * 30/60)
speed_slowdown_layers = 2
cool_fan_enabled = True
cool_fan_speed = 100

View File

@ -13,10 +13,9 @@ variant = Standard 0.4
[values]
layer_height_0 = =round(0.5*machine_nozzle_size, 2)
line_width = =machine_nozzle_size/machine_nozzle_size*0.35
wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
infill_line_width = =machine_nozzle_size/machine_nozzle_size*0.4
support_line_width = =machine_nozzle_size/machine_nozzle_size*0.4
line_width = =machine_nozzle_size/machine_nozzle_size*0.4
wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.4
wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.4
wall_0_wipe_dist = =machine_nozzle_size/2
speed_print = 40
speed_wall = =math.ceil(speed_print * 30/40)

View File

@ -13,10 +13,9 @@ variant = Standard 0.4
[values]
layer_height_0 = =round(0.67*machine_nozzle_size, 2)
line_width = =machine_nozzle_size/machine_nozzle_size*0.35
wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
infill_line_width = =machine_nozzle_size/machine_nozzle_size*0.4
support_line_width = =machine_nozzle_size/machine_nozzle_size*0.4
line_width = =machine_nozzle_size/machine_nozzle_size*0.4
wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.4
wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.4
wall_0_wipe_dist = =machine_nozzle_size/2
speed_print = 40
speed_wall = =math.ceil(speed_print * 30/40)
@ -42,7 +41,7 @@ skin_overlap = 15
support_z_distance = =layer_height-layer_height
support_bottom_distance = =support_z_distance
support_xy_distance = =line_width*3/4
support_xy_distance_overhang = ==line_width*0.175/line_width
support_xy_distance_overhang = =line_width*0.175/line_width
support_offset = 3
support_pattern = grid
support_interface_density = 100

View File

@ -13,10 +13,9 @@ variant = Standard 0.4
[values]
layer_height_0 = =round(0.75*machine_nozzle_size, 2)
line_width = =machine_nozzle_size/machine_nozzle_size*0.35
wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.3
infill_line_width = =machine_nozzle_size/machine_nozzle_size*0.4
support_line_width = =machine_nozzle_size/machine_nozzle_size*0.4
line_width = =machine_nozzle_size/machine_nozzle_size*0.4
wall_line_width = =machine_nozzle_size/machine_nozzle_size*0.4
wall_line_width_x = =machine_nozzle_size/machine_nozzle_size*0.4
wall_0_wipe_dist = =machine_nozzle_size/2
speed_print = 40
speed_wall = =math.ceil(speed_print * 30/40)

Some files were not shown because too many files have changed in this diff Show More