mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-08-14 16:05:56 +08:00
Merge branch 'master' into CURA-6856_signed_plugins_and_packages
This commit is contained in:
commit
3dabd6023b
23
.github/ISSUE_TEMPLATE.md
vendored
23
.github/ISSUE_TEMPLATE.md
vendored
@ -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.)
|
||||
|
15
.github/ISSUE_TEMPLATE/bug-report.md
vendored
15
.github/ISSUE_TEMPLATE/bug-report.md
vendored
@ -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.)
|
||||
|
11
.github/ISSUE_TEMPLATE/feature_request.md
vendored
11
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@ -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.)
|
||||
|
@ -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
|
||||
|
99
cmake/CuraPluginInstall.cmake
Normal file
99
cmake/CuraPluginInstall.cmake
Normal 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()
|
69
cmake/mod_bundled_packages_json.py
Executable file
69
cmake/mod_bundled_packages_json.py
Executable 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()
|
@ -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)
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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():
|
||||
|
@ -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)
|
||||
|
@ -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:
|
||||
|
@ -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
|
||||
|
@ -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:
|
||||
|
@ -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:
|
||||
|
@ -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
|
||||
|
@ -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]
|
||||
|
||||
|
@ -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
|
||||
|
@ -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,6 +128,13 @@ class ImageReader(MeshReader):
|
||||
|
||||
Job.yieldThread()
|
||||
|
||||
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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
@ -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 });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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")
|
||||
|
@ -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.
|
||||
|
@ -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:
|
||||
|
@ -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])
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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 },
|
||||
|
@ -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" },
|
||||
|
@ -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":
|
||||
|
@ -3,7 +3,7 @@
|
||||
"name": "Extruder 1",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata": {
|
||||
"machine": "BIBO2 dual",
|
||||
"machine": "bibo2_dual",
|
||||
"position": "0"
|
||||
},
|
||||
"overrides": {
|
||||
|
@ -3,7 +3,7 @@
|
||||
"name": "Extruder 2",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata": {
|
||||
"machine": "BIBO2 dual",
|
||||
"machine": "bibo2_dual",
|
||||
"position": "1"
|
||||
},
|
||||
"overrides": {
|
||||
|
@ -3,7 +3,7 @@
|
||||
"name": "Left Extruder",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata": {
|
||||
"machine": "Creality CR-X",
|
||||
"machine": "creality_cr-x",
|
||||
"position": "0"
|
||||
},
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
"name": "Right Extruder",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata": {
|
||||
"machine": "Creality CR-X",
|
||||
"machine": "creality_cr-x",
|
||||
"position": "1"
|
||||
},
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
"name": "Extruder 1",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata": {
|
||||
"machine": "Creatable_D3",
|
||||
"machine": "creatable_d3",
|
||||
"position": "0"
|
||||
},
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
"name": "Extruder 1",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata": {
|
||||
"machine": "hellbot_magna_i",
|
||||
"machine": "hellbot_magna_I",
|
||||
"position": "0"
|
||||
},
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
"name": "0.4mm Nozzle",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata": {
|
||||
"machine": "Tyro",
|
||||
"machine": "key3d_tyro",
|
||||
"position": "0"
|
||||
},
|
||||
|
||||
|
@ -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 }
|
||||
}
|
||||
|
@ -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"
|
||||
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
||||
|
@ -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:
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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())
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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()
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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
Loading…
x
Reference in New Issue
Block a user