mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-06 22:47:29 -06:00
Merge branch 'master' into python_type_hinting
This commit is contained in:
commit
fb70eb6813
124 changed files with 65675 additions and 49200 deletions
|
@ -10,6 +10,7 @@ set(URANIUM_SCRIPTS_DIR "${CMAKE_SOURCE_DIR}/../uranium/scripts" CACHE DIRECTORY
|
|||
add_custom_target(tests)
|
||||
add_custom_command(TARGET tests POST_BUILD COMMAND "PYTHONPATH=${CMAKE_SOURCE_DIR}/../Uranium/:${CMAKE_SOURCE_DIR}" ${PYTHON_EXECUTABLE} -m pytest -r a --junitxml=${CMAKE_BINARY_DIR}/junit.xml ${CMAKE_SOURCE_DIR} || exit 0)
|
||||
|
||||
option(CURA_DEBUGMODE "Enable debug dialog and other debug features" OFF)
|
||||
|
||||
set(CURA_VERSION "master" CACHE STRING "Version name of Cura")
|
||||
set(CURA_BUILDTYPE "" CACHE STRING "Build type of Cura, eg. 'PPA'")
|
||||
|
|
9
cura/BlockSlicingDecorator.py
Normal file
9
cura/BlockSlicingDecorator.py
Normal file
|
@ -0,0 +1,9 @@
|
|||
from UM.Scene.SceneNodeDecorator import SceneNodeDecorator
|
||||
|
||||
|
||||
class BlockSlicingDecorator(SceneNodeDecorator):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
def isBlockSlicing(self):
|
||||
return True
|
|
@ -223,7 +223,7 @@ class BuildVolume(SceneNode):
|
|||
scale_matrix = Matrix()
|
||||
if self._width != 0:
|
||||
# Scale circular meshes by aspect ratio if width != height
|
||||
aspect = self._height / self._width
|
||||
aspect = self._depth / self._width
|
||||
scale_matrix.compose(scale = Vector(1, 1, aspect))
|
||||
mb = MeshBuilder()
|
||||
mb.addArc(max_w, Vector.Unit_Y, center = (0, min_h - z_fight_distance, 0), color = self.VolumeOutlineColor)
|
||||
|
@ -283,6 +283,9 @@ class BuildVolume(SceneNode):
|
|||
color = Color(0.0, 0.0, 0.0, 0.15)
|
||||
for polygon in self._disallowed_areas:
|
||||
points = polygon.getPoints()
|
||||
if len(points) == 0:
|
||||
continue
|
||||
|
||||
first = Vector(self._clamp(points[0][0], min_w, max_w), disallowed_area_height, self._clamp(points[0][1], min_d, max_d))
|
||||
previous_point = Vector(self._clamp(points[0][0], min_w, max_w), disallowed_area_height, self._clamp(points[0][1], min_d, max_d))
|
||||
for point in points:
|
||||
|
@ -533,8 +536,11 @@ class BuildVolume(SceneNode):
|
|||
prime_tower_size = self._global_container_stack.getProperty("prime_tower_size", "value")
|
||||
machine_width = self._global_container_stack.getProperty("machine_width", "value")
|
||||
machine_depth = self._global_container_stack.getProperty("machine_depth", "value")
|
||||
prime_tower_x = self._global_container_stack.getProperty("prime_tower_position_x", "value") - machine_width / 2 #Offset by half machine_width and _depth to put the origin in the front-left.
|
||||
prime_tower_y = - self._global_container_stack.getProperty("prime_tower_position_y", "value") + machine_depth / 2
|
||||
prime_tower_x = self._global_container_stack.getProperty("prime_tower_position_x", "value")
|
||||
prime_tower_y = - self._global_container_stack.getProperty("prime_tower_position_y", "value")
|
||||
if not self._global_container_stack.getProperty("machine_center_is_zero", "value"):
|
||||
prime_tower_x = prime_tower_x - machine_width / 2 #Offset by half machine_width and _depth to put the origin in the front-left.
|
||||
prime_tower_y = prime_tower_y + machine_depth / 2
|
||||
|
||||
prime_tower_area = Polygon([
|
||||
[prime_tower_x - prime_tower_size, prime_tower_y - prime_tower_size],
|
||||
|
@ -565,8 +571,17 @@ class BuildVolume(SceneNode):
|
|||
machine_width = self._global_container_stack.getProperty("machine_width", "value")
|
||||
machine_depth = self._global_container_stack.getProperty("machine_depth", "value")
|
||||
for extruder in used_extruders:
|
||||
prime_x = extruder.getProperty("extruder_prime_pos_x", "value") - machine_width / 2 #Offset by half machine_width and _depth to put the origin in the front-left.
|
||||
prime_y = machine_depth / 2 - extruder.getProperty("extruder_prime_pos_y", "value")
|
||||
prime_x = extruder.getProperty("extruder_prime_pos_x", "value")
|
||||
prime_y = - extruder.getProperty("extruder_prime_pos_y", "value")
|
||||
|
||||
#Ignore extruder prime position if it is not set
|
||||
if prime_x == 0 and prime_y == 0:
|
||||
result[extruder.getId()] = []
|
||||
continue
|
||||
|
||||
if not self._global_container_stack.getProperty("machine_center_is_zero", "value"):
|
||||
prime_x = prime_x - machine_width / 2 #Offset by half machine_width and _depth to put the origin in the front-left.
|
||||
prime_y = prime_x + machine_depth / 2
|
||||
|
||||
prime_polygon = Polygon.approximatedCircle(PRIME_CLEARANCE)
|
||||
prime_polygon = prime_polygon.translate(prime_x, prime_y)
|
||||
|
@ -716,7 +731,12 @@ class BuildVolume(SceneNode):
|
|||
#
|
||||
# \return A sequence of setting values, one for each extruder.
|
||||
def _getSettingFromAllExtruders(self, setting_key, property = "value"):
|
||||
return ExtruderManager.getInstance().getAllExtruderSettings(setting_key, property)
|
||||
all_values = ExtruderManager.getInstance().getAllExtruderSettings(setting_key, property)
|
||||
all_types = ExtruderManager.getInstance().getAllExtruderSettings(setting_key, "type")
|
||||
for i in range(len(all_values)):
|
||||
if not all_values[i] and (all_types[i] == "int" or all_types[i] == "float"):
|
||||
all_values[i] = 0
|
||||
return all_values
|
||||
|
||||
## Private convenience function to get a setting from the support infill
|
||||
# extruder.
|
||||
|
@ -740,16 +760,21 @@ class BuildVolume(SceneNode):
|
|||
multi_extrusion = self._global_container_stack.getProperty("machine_extruder_count", "value") > 1
|
||||
|
||||
if not multi_extrusion:
|
||||
return self._global_container_stack.getProperty(setting_key, property)
|
||||
|
||||
stack = self._global_container_stack
|
||||
else:
|
||||
extruder_index = self._global_container_stack.getProperty(extruder_setting_key, "value")
|
||||
|
||||
if extruder_index == "-1": # If extruder index is -1 use global instead
|
||||
return self._global_container_stack.getProperty(setting_key, property)
|
||||
|
||||
stack = self._global_container_stack
|
||||
else:
|
||||
extruder_stack_id = ExtruderManager.getInstance().extruderIds[str(extruder_index)]
|
||||
stack = ContainerRegistry.getInstance().findContainerStacks(id = extruder_stack_id)[0]
|
||||
return stack.getProperty(setting_key, property)
|
||||
|
||||
value = stack.getProperty(setting_key, property)
|
||||
setting_type = stack.getProperty(setting_key, "type")
|
||||
if not value and (setting_type == "int" or setting_type == "float"):
|
||||
return 0
|
||||
return value
|
||||
|
||||
## Convenience function to calculate the disallowed radius around the edge.
|
||||
#
|
||||
|
|
|
@ -12,6 +12,11 @@ from UM.Logger import Logger
|
|||
from UM.i18n import i18nCatalog
|
||||
catalog = i18nCatalog("cura")
|
||||
|
||||
try:
|
||||
from cura.CuraVersion import CuraDebugMode
|
||||
except ImportError:
|
||||
CuraDebugMode = False # [CodeStyle: Reflecting imported value]
|
||||
|
||||
# List of exceptions that should be considered "fatal" and abort the program.
|
||||
# These are primarily some exception types that we simply cannot really recover from
|
||||
# (MemoryError and SystemError) and exceptions that indicate grave errors in the
|
||||
|
@ -24,21 +29,18 @@ fatal_exception_types = [
|
|||
]
|
||||
|
||||
def show(exception_type, value, tb):
|
||||
debug_mode = True
|
||||
|
||||
Logger.log("c", "An uncaught exception has occurred!")
|
||||
for line in traceback.format_exception(exception_type, value, tb):
|
||||
for part in line.rstrip("\n").split("\n"):
|
||||
Logger.log("c", part)
|
||||
|
||||
if not debug_mode and exception_type not in fatal_exception_types:
|
||||
if not CuraDebugMode and exception_type not in fatal_exception_types:
|
||||
return
|
||||
|
||||
application = QCoreApplication.instance()
|
||||
if not application:
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
dialog = QDialog()
|
||||
dialog.setMinimumWidth(640)
|
||||
dialog.setMinimumHeight(640)
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
from PyQt5.QtCore import QObject, pyqtSlot, QUrl
|
||||
from PyQt5.QtCore import QObject, QUrl
|
||||
from PyQt5.QtGui import QDesktopServices
|
||||
from UM.FlameProfiler import pyqtSlot
|
||||
|
||||
from UM.Event import CallFunctionEvent
|
||||
from UM.Application import Application
|
||||
|
|
|
@ -19,13 +19,16 @@ from UM.SaveFile import SaveFile
|
|||
from UM.Scene.Selection import Selection
|
||||
from UM.Scene.GroupDecorator import GroupDecorator
|
||||
from UM.Settings.Validator import Validator
|
||||
from UM.Message import Message
|
||||
from UM.i18n import i18nCatalog
|
||||
|
||||
from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation
|
||||
from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation
|
||||
from UM.Operations.GroupedOperation import GroupedOperation
|
||||
from UM.Operations.SetTransformOperation import SetTransformOperation
|
||||
from UM.Operations.TranslateOperation import TranslateOperation
|
||||
from cura.SetParentOperation import SetParentOperation
|
||||
from cura.SliceableObjectDecorator import SliceableObjectDecorator
|
||||
from cura.BlockSlicingDecorator import BlockSlicingDecorator
|
||||
|
||||
from UM.Settings.SettingDefinition import SettingDefinition, DefinitionPropertyType
|
||||
from UM.Settings.ContainerRegistry import ContainerRegistry
|
||||
|
@ -34,8 +37,6 @@ from cura.Settings.MachineNameValidator import MachineNameValidator
|
|||
from cura.Settings.ProfilesModel import ProfilesModel
|
||||
from cura.Settings.QualityAndUserProfilesModel import QualityAndUserProfilesModel
|
||||
from cura.Settings.SettingInheritanceManager import SettingInheritanceManager
|
||||
|
||||
from UM.i18n import i18nCatalog
|
||||
from cura.Settings.UserProfilesModel import UserProfilesModel
|
||||
|
||||
from . import PlatformPhysics
|
||||
|
@ -57,7 +58,8 @@ from cura.Settings.MaterialSettingsVisibilityHandler import MaterialSettingsVisi
|
|||
from cura.Settings.QualitySettingsModel import QualitySettingsModel
|
||||
from cura.Settings.ContainerManager import ContainerManager
|
||||
|
||||
from PyQt5.QtCore import pyqtSlot, QUrl, pyqtSignal, pyqtProperty, QEvent, Q_ENUMS
|
||||
from PyQt5.QtCore import QUrl, pyqtSignal, pyqtProperty, QEvent, Q_ENUMS
|
||||
from UM.FlameProfiler import pyqtSlot
|
||||
from PyQt5.QtGui import QColor, QIcon
|
||||
from PyQt5.QtWidgets import QMessageBox
|
||||
from PyQt5.QtQml import qmlRegisterUncreatableType, qmlRegisterSingletonType, qmlRegisterType
|
||||
|
@ -151,6 +153,9 @@ class CuraApplication(QtApplication):
|
|||
}
|
||||
)
|
||||
|
||||
self._currently_loading_files = []
|
||||
self._non_sliceable_extensions = []
|
||||
|
||||
self._machine_action_manager = MachineActionManager.MachineActionManager()
|
||||
self._machine_manager = None # This is initialized on demand.
|
||||
self._setting_inheritance_manager = None
|
||||
|
@ -228,7 +233,7 @@ class CuraApplication(QtApplication):
|
|||
Preferences.getInstance().addPreference("cura/recent_files", "")
|
||||
Preferences.getInstance().addPreference("cura/categories_expanded", "")
|
||||
Preferences.getInstance().addPreference("cura/jobname_prefix", True)
|
||||
Preferences.getInstance().addPreference("view/center_on_select", True)
|
||||
Preferences.getInstance().addPreference("view/center_on_select", False)
|
||||
Preferences.getInstance().addPreference("mesh/scale_to_fit", True)
|
||||
Preferences.getInstance().addPreference("mesh/scale_tiny_meshes", True)
|
||||
Preferences.getInstance().addPreference("cura/dialog_on_project_save", True)
|
||||
|
@ -598,9 +603,12 @@ class CuraApplication(QtApplication):
|
|||
def updatePlatformActivity(self, node = None):
|
||||
count = 0
|
||||
scene_bounding_box = None
|
||||
is_block_slicing_node = False
|
||||
for node in DepthFirstIterator(self.getController().getScene().getRoot()):
|
||||
if type(node) is not SceneNode or not node.getMeshData():
|
||||
if type(node) is not SceneNode or (not node.getMeshData() and not node.callDecoration("getLayerData")):
|
||||
continue
|
||||
if node.callDecoration("isBlockSlicing"):
|
||||
is_block_slicing_node = True
|
||||
|
||||
count += 1
|
||||
if not scene_bounding_box:
|
||||
|
@ -610,6 +618,10 @@ class CuraApplication(QtApplication):
|
|||
if other_bb is not None:
|
||||
scene_bounding_box = scene_bounding_box + node.getBoundingBox()
|
||||
|
||||
print_information = self.getPrintInformation()
|
||||
if print_information:
|
||||
print_information.setPreSliced(is_block_slicing_node)
|
||||
|
||||
if not scene_bounding_box:
|
||||
scene_bounding_box = AxisAlignedBox.Null
|
||||
|
||||
|
@ -730,7 +742,7 @@ class CuraApplication(QtApplication):
|
|||
for node in DepthFirstIterator(self.getController().getScene().getRoot()):
|
||||
if type(node) is not SceneNode:
|
||||
continue
|
||||
if not node.getMeshData() and not node.callDecoration("isGroup"):
|
||||
if (not node.getMeshData() and not node.callDecoration("getLayerData")) and not node.callDecoration("isGroup"):
|
||||
continue # Node that doesnt have a mesh and is not a group.
|
||||
if node.getParent() and node.getParent().callDecoration("isGroup"):
|
||||
continue # Grouped nodes don't need resetting as their parent (the group) is resetted)
|
||||
|
@ -1025,3 +1037,78 @@ class CuraApplication(QtApplication):
|
|||
@pyqtSlot(str)
|
||||
def log(self, msg):
|
||||
Logger.log("d", msg)
|
||||
|
||||
@pyqtSlot(QUrl)
|
||||
def readLocalFile(self, file):
|
||||
if not file.isValid():
|
||||
return
|
||||
|
||||
scene = self.getController().getScene()
|
||||
|
||||
for node in DepthFirstIterator(scene.getRoot()):
|
||||
if node.callDecoration("isBlockSlicing"):
|
||||
self.deleteAll()
|
||||
break
|
||||
|
||||
f = file.toLocalFile()
|
||||
extension = os.path.splitext(f)[1]
|
||||
filename = os.path.basename(f)
|
||||
if len(self._currently_loading_files) > 0:
|
||||
# If a non-slicable file is already being loaded, we prevent loading of any further non-slicable files
|
||||
if extension.lower() in self._non_sliceable_extensions:
|
||||
message = Message(
|
||||
self._i18n_catalog.i18nc("@info:status",
|
||||
"Only one G-code file can be loaded at a time. Skipped importing {0}",
|
||||
filename))
|
||||
message.show()
|
||||
return
|
||||
# If file being loaded is non-slicable file, then prevent loading of any other files
|
||||
extension = os.path.splitext(self._currently_loading_files[0])[1]
|
||||
if extension.lower() in self._non_sliceable_extensions:
|
||||
message = Message(
|
||||
self._i18n_catalog.i18nc("@info:status",
|
||||
"Can't open any other file if G-code is loading. Skipped importing {0}",
|
||||
filename))
|
||||
message.show()
|
||||
return
|
||||
|
||||
self._currently_loading_files.append(f)
|
||||
if extension in self._non_sliceable_extensions:
|
||||
self.deleteAll()
|
||||
|
||||
job = ReadMeshJob(f)
|
||||
job.finished.connect(self._readMeshFinished)
|
||||
job.start()
|
||||
|
||||
def _readMeshFinished(self, job):
|
||||
nodes = job.getResult()
|
||||
filename = job.getFileName()
|
||||
self._currently_loading_files.remove(filename)
|
||||
|
||||
for node in nodes:
|
||||
node.setSelectable(True)
|
||||
node.setName(os.path.basename(filename))
|
||||
|
||||
extension = os.path.splitext(filename)[1]
|
||||
if extension.lower() in self._non_sliceable_extensions:
|
||||
self.getController().setActiveView("LayerView")
|
||||
view = self.getController().getActiveView()
|
||||
view.resetLayerData()
|
||||
view.setLayer(9999999)
|
||||
view.calculateMaxLayers()
|
||||
|
||||
block_slicing_decorator = BlockSlicingDecorator()
|
||||
node.addDecorator(block_slicing_decorator)
|
||||
else:
|
||||
sliceable_decorator = SliceableObjectDecorator()
|
||||
node.addDecorator(sliceable_decorator)
|
||||
|
||||
scene = self.getController().getScene()
|
||||
|
||||
op = AddSceneNodeOperation(node, scene.getRoot())
|
||||
op.push()
|
||||
|
||||
scene.sceneChanged.emit(node)
|
||||
|
||||
def addNonSliceableExtension(self, extension):
|
||||
self._non_sliceable_extensions.append(extension)
|
||||
|
|
|
@ -3,3 +3,4 @@
|
|||
|
||||
CuraVersion = "@CURA_VERSION@"
|
||||
CuraBuildType = "@CURA_BUILDTYPE@"
|
||||
CuraDebugMode = True if "@CURA_DEBUGMODE@" == "ON" else False
|
||||
|
|
13
cura/GCodeListDecorator.py
Normal file
13
cura/GCodeListDecorator.py
Normal file
|
@ -0,0 +1,13 @@
|
|||
from UM.Scene.SceneNodeDecorator import SceneNodeDecorator
|
||||
|
||||
|
||||
class GCodeListDecorator(SceneNodeDecorator):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self._gcode_list = []
|
||||
|
||||
def getGCodeList(self):
|
||||
return self._gcode_list
|
||||
|
||||
def setGCodeList(self, list):
|
||||
self._gcode_list = list
|
|
@ -6,7 +6,8 @@ from UM.PluginRegistry import PluginRegistry # So MachineAction can be added as
|
|||
from UM.Settings.ContainerRegistry import ContainerRegistry
|
||||
from UM.Settings.DefinitionContainer import DefinitionContainer
|
||||
|
||||
from PyQt5.QtCore import QObject, pyqtSlot
|
||||
from PyQt5.QtCore import QObject
|
||||
from UM.FlameProfiler import pyqtSlot
|
||||
|
||||
## Raised when trying to add an unknown machine action as a required action
|
||||
class UnknownMachineActionError(Exception):
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
# Copyright (c) 2015 Ultimaker B.V.
|
||||
# Cura is released under the terms of the AGPLv3 or higher.
|
||||
|
||||
from PyQt5.QtCore import QObject, pyqtSignal, pyqtProperty, pyqtSlot
|
||||
from PyQt5.QtCore import QObject, pyqtSignal, pyqtProperty
|
||||
from UM.FlameProfiler import pyqtSlot
|
||||
|
||||
from UM.Application import Application
|
||||
from UM.Qt.Duration import Duration
|
||||
|
@ -13,6 +14,9 @@ import math
|
|||
import os.path
|
||||
import unicodedata
|
||||
|
||||
from UM.i18n import i18nCatalog
|
||||
catalog = i18nCatalog("cura")
|
||||
|
||||
## A class for processing and calculating minimum, current and maximum print time as well as managing the job name
|
||||
#
|
||||
# This class contains all the logic relating to calculation and slicing for the
|
||||
|
@ -49,6 +53,8 @@ class PrintInformation(QObject):
|
|||
self._material_lengths = []
|
||||
self._material_weights = []
|
||||
|
||||
self._pre_sliced = False
|
||||
|
||||
self._backend = Application.getInstance().getBackend()
|
||||
if self._backend:
|
||||
self._backend.printDurationMessage.connect(self._onPrintDurationMessage)
|
||||
|
@ -61,6 +67,16 @@ class PrintInformation(QObject):
|
|||
|
||||
currentPrintTimeChanged = pyqtSignal()
|
||||
|
||||
preSlicedChanged = pyqtSignal()
|
||||
|
||||
@pyqtProperty(bool, notify=preSlicedChanged)
|
||||
def preSliced(self):
|
||||
return self._pre_sliced
|
||||
|
||||
def setPreSliced(self, pre_sliced):
|
||||
self._pre_sliced = pre_sliced
|
||||
self.preSlicedChanged.emit()
|
||||
|
||||
@pyqtProperty(Duration, notify = currentPrintTimeChanged)
|
||||
def currentPrintTime(self):
|
||||
return self._current_print_time
|
||||
|
@ -122,7 +138,9 @@ class PrintInformation(QObject):
|
|||
def createJobName(self, base_name):
|
||||
base_name = self._stripAccents(base_name)
|
||||
self._setAbbreviatedMachineName()
|
||||
if Preferences.getInstance().getValue("cura/jobname_prefix"):
|
||||
if self._pre_sliced:
|
||||
return catalog.i18nc("@label", "Pre-sliced file {0}", base_name)
|
||||
elif Preferences.getInstance().getValue("cura/jobname_prefix"):
|
||||
return self._abbr_machine + "_" + base_name
|
||||
else:
|
||||
return base_name
|
||||
|
|
|
@ -224,6 +224,9 @@ class QualityManager:
|
|||
material_ids = set()
|
||||
for material_instance in material_containers:
|
||||
if material_instance is not None:
|
||||
# Add the parent material too.
|
||||
for basic_material in self._getBasicMaterials(material_instance):
|
||||
material_ids.add(basic_material.getId())
|
||||
material_ids.add(material_instance.getId())
|
||||
|
||||
containers = ContainerRegistry.getInstance().findInstanceContainers(**criteria)
|
||||
|
|
|
@ -4,7 +4,8 @@
|
|||
import os.path
|
||||
import urllib
|
||||
|
||||
from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal, QUrl, QVariant
|
||||
from PyQt5.QtCore import QObject, pyqtProperty, pyqtSignal, QUrl, QVariant
|
||||
from UM.FlameProfiler import pyqtSlot
|
||||
from PyQt5.QtWidgets import QMessageBox
|
||||
|
||||
from UM.PluginRegistry import PluginRegistry
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
# Copyright (c) 2016 Ultimaker B.V.
|
||||
# Cura is released under the terms of the AGPLv3 or higher.
|
||||
|
||||
from PyQt5.QtCore import pyqtSignal, pyqtProperty, pyqtSlot, QObject, QVariant #For communicating data and events to Qt.
|
||||
from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant #For communicating data and events to Qt.
|
||||
from UM.FlameProfiler import pyqtSlot
|
||||
|
||||
from UM.Application import Application #To get the global container stack to find the current machine.
|
||||
from UM.Logger import Logger
|
||||
|
@ -355,8 +356,11 @@ class ExtruderManager(QObject):
|
|||
#The platform adhesion extruder. Not used if using none.
|
||||
if global_stack.getProperty("adhesion_type", "value") != "none":
|
||||
used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("adhesion_extruder_nr", "value"))])
|
||||
|
||||
try:
|
||||
return [container_registry.findContainerStacks(id = stack_id)[0] for stack_id in used_extruder_stack_ids]
|
||||
except IndexError: # One or more of the extruders was not found.
|
||||
Logger.log("e", "Unable to find one or more of the extruders in %s", used_extruder_stack_ids)
|
||||
return []
|
||||
|
||||
## Removes the container stack and user profile for the extruders for a specific machine.
|
||||
#
|
||||
|
@ -395,7 +399,12 @@ class ExtruderManager(QObject):
|
|||
# \return \type{List[ContainerStack]} a list of
|
||||
def getActiveExtruderStacks(self):
|
||||
global_stack = Application.getInstance().getGlobalContainerStack()
|
||||
return list(self._extruder_trains[global_stack.getId()].values()) if global_stack else []
|
||||
|
||||
result = []
|
||||
if global_stack:
|
||||
for extruder in sorted(self._extruder_trains[global_stack.getId()]):
|
||||
result.append(self._extruder_trains[global_stack.getId()][extruder])
|
||||
return result
|
||||
|
||||
def __globalContainerStackChanged(self) -> None:
|
||||
self._addCurrentMachineExtruders()
|
||||
|
|
|
@ -2,7 +2,8 @@
|
|||
# Cura is released under the terms of the AGPLv3 or higher.
|
||||
from typing import Union
|
||||
|
||||
from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal
|
||||
from PyQt5.QtCore import QObject, pyqtProperty, pyqtSignal
|
||||
from UM.FlameProfiler import pyqtSlot
|
||||
from PyQt5.QtWidgets import QMessageBox
|
||||
from UM import Util
|
||||
|
||||
|
@ -419,6 +420,17 @@ class MachineManager(QObject):
|
|||
|
||||
return False
|
||||
|
||||
@pyqtProperty(int, notify = activeStackValueChanged)
|
||||
def numUserSettings(self):
|
||||
if not self._global_container_stack:
|
||||
return 0
|
||||
num_user_settings = 0
|
||||
num_user_settings += len(self._global_container_stack.getTop().findInstances())
|
||||
stacks = list(ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId()))
|
||||
for stack in stacks:
|
||||
num_user_settings += len(stack.getTop().findInstances())
|
||||
return num_user_settings
|
||||
|
||||
## Delete a user setting from the global stack and all extruder stacks.
|
||||
# \param key \type{str} the name of the key to delete
|
||||
@pyqtSlot(str)
|
||||
|
@ -494,6 +506,17 @@ class MachineManager(QObject):
|
|||
|
||||
return ""
|
||||
|
||||
@pyqtProperty("QVariantList", notify=activeVariantChanged)
|
||||
def activeVariantNames(self):
|
||||
result = []
|
||||
if ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks() is not None:
|
||||
for stack in ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks():
|
||||
variant_container = stack.findContainer({"type": "variant"})
|
||||
if variant_container and variant_container != self._empty_variant_container:
|
||||
result.append(variant_container.getName())
|
||||
|
||||
return result
|
||||
|
||||
@pyqtProperty("QVariantList", notify = activeMaterialChanged)
|
||||
def activeMaterialNames(self):
|
||||
result = []
|
||||
|
@ -823,6 +846,8 @@ class MachineManager(QObject):
|
|||
for stack in stacks:
|
||||
material = stack.findContainer(type="material")
|
||||
quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material])
|
||||
if not quality: #No quality profile is found for this quality type.
|
||||
quality = self._empty_quality_container
|
||||
result.append({"stack": stack, "quality": quality, "quality_changes": empty_quality_changes})
|
||||
|
||||
if extruder_stacks:
|
||||
|
@ -876,6 +901,8 @@ class MachineManager(QObject):
|
|||
|
||||
material = stack.findContainer(type="material")
|
||||
quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material])
|
||||
if not quality: #No quality profile found for this quality type.
|
||||
quality = self._empty_quality_container
|
||||
|
||||
result.append({"stack": stack, "quality": quality, "quality_changes": quality_changes})
|
||||
|
||||
|
@ -975,6 +1002,15 @@ class MachineManager(QObject):
|
|||
|
||||
return ""
|
||||
|
||||
@pyqtProperty(str, notify=globalContainerChanged)
|
||||
def activeDefinitionName(self):
|
||||
if self._global_container_stack:
|
||||
definition = self._global_container_stack.getBottom()
|
||||
if definition:
|
||||
return definition.getName()
|
||||
|
||||
return ""
|
||||
|
||||
## Get the Definition ID to use to select quality profiles for the currently active machine
|
||||
# \returns DefinitionID (string) if found, empty string otherwise
|
||||
# \sa getQualityDefinitionId
|
||||
|
|
|
@ -192,6 +192,7 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel):
|
|||
profile_value_source = ""
|
||||
for container in containers:
|
||||
new_value = container.getProperty(definition.key, "value")
|
||||
|
||||
if new_value is not None:
|
||||
profile_value_source = container.getMetaDataEntry("type")
|
||||
profile_value = new_value
|
||||
|
@ -199,7 +200,7 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel):
|
|||
# Global tab should use resolve (if there is one)
|
||||
if not self._extruder_id:
|
||||
resolve_value = global_container_stack.getProperty(definition.key, "resolve")
|
||||
if resolve_value is not None and profile_value is not None:
|
||||
if resolve_value is not None and profile_value is not None and profile_value_source != "quality_changes":
|
||||
profile_value = resolve_value
|
||||
|
||||
user_value = None
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
# Copyright (c) 2016 Ultimaker B.V.
|
||||
# Cura is released under the terms of the AGPLv3 or higher.
|
||||
|
||||
from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal
|
||||
from PyQt5.QtCore import QObject, pyqtProperty, pyqtSignal
|
||||
from UM.FlameProfiler import pyqtSlot
|
||||
from UM.Application import Application
|
||||
from UM.Logger import Logger
|
||||
|
||||
|
@ -36,7 +37,8 @@ class SettingInheritanceManager(QObject):
|
|||
def getChildrenKeysWithOverride(self, key):
|
||||
definitions = self._global_container_stack.getBottom().findDefinitions(key=key)
|
||||
if not definitions:
|
||||
return
|
||||
Logger.log("w", "Could not find definition for key [%s]", key)
|
||||
return []
|
||||
result = []
|
||||
for key in definitions[0].getAllKeys():
|
||||
if key in self._settings_with_inheritance_warning:
|
||||
|
@ -55,7 +57,8 @@ class SettingInheritanceManager(QObject):
|
|||
|
||||
definitions = self._global_container_stack.getBottom().findDefinitions(key=key)
|
||||
if not definitions:
|
||||
return
|
||||
Logger.log("w", "Could not find definition for key [%s] (2)", key)
|
||||
return []
|
||||
result = []
|
||||
for key in definitions[0].getAllKeys():
|
||||
if self._settingIsOverwritingInheritance(key, extruder):
|
||||
|
|
12
cura/SliceableObjectDecorator.py
Normal file
12
cura/SliceableObjectDecorator.py
Normal file
|
@ -0,0 +1,12 @@
|
|||
from UM.Scene.SceneNodeDecorator import SceneNodeDecorator
|
||||
|
||||
|
||||
class SliceableObjectDecorator(SceneNodeDecorator):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
def isSliceable(self):
|
||||
return True
|
||||
|
||||
def __deepcopy__(self, memo):
|
||||
return type(self)()
|
35
docs/How_to_use_the_flame_graph_profiler.md
Normal file
35
docs/How_to_use_the_flame_graph_profiler.md
Normal file
|
@ -0,0 +1,35 @@
|
|||
|
||||
How to Profile Cura and See What It is Doing
|
||||
============================================
|
||||
Cura has a simple flame graph profiler available as a plugin which can be used to see what Cura is doing as it runs and how much time it takes. A flame graph profile shows its output as a timeline and stacks of "blocks" which represent parts of the code and are stacked up to show call depth. These often form little peaks which look like flames. It is a simple yet powerful way to visualise the activity of a program.
|
||||
|
||||
|
||||
Setting up and installing the profiler
|
||||
--------------------------------------
|
||||
|
||||
The profiler plugin is kept outside of the Cura source code here: https://github.com/sedwards2009/cura-big-flame-graph
|
||||
|
||||
To install it do:
|
||||
|
||||
* Use `git clone https://github.com/sedwards2009/cura-big-flame-graph.git` to grab a copy of the code.
|
||||
* Copy the `BigFlameGraph` directory into the `plugins` directory in your local Cura.
|
||||
* Set the `URANIUM_FLAME_PROFILER` environment variable to something before starting Cura. This flags to the profiler code in Cura to activate and insert the needed hooks into the code.
|
||||
|
||||
|
||||
Using the profiler
|
||||
------------------
|
||||
To open the profiler go to the Extensions menu and select "Start BFG" from the "Big Flame Graph" menu. A page will open up in your default browser. This is the profiler UI. Click on "Record" to start recording, go to Cura and perform an action and then back in the profiler click on "Stop". The results should now load in.
|
||||
|
||||
The time scale is at the top of the window. The blocks should be read as meaning the blocks at the bottom call the blocks which are stacked on top of them. Hover the mouse to get more detailed information about a block such as the name of the code involved and its duration. Use the zoom buttons or mouse wheel to zoom in. The display can be panned by dragging with the left mouse button.
|
||||
|
||||
|
||||
What the Profiler Sees
|
||||
----------------------
|
||||
The profiler doesn't capture every function call in Cura. It hooks into a number of important systems which give a good picture of activity without too much run time overhead. The most important system is Uranium's signal mechanism and PyQt5 slots. Functions which are called via the signal mechanism are recorded and thier names appear in the results. PyQt5 slots appear in the results with the prefix `[SLOT]`.
|
||||
|
||||
Note that not all slots are captured. Only those slots which belong to classes which use the `pyqtSlot` decorator from the `UM.FlameProfiler` module.
|
||||
|
||||
|
||||
Manually adding profiling code to more detail
|
||||
---------------------------------------------
|
||||
It is also possible to manually add decorators to methods to make them appear in the profiler results. The `UM.FlameProfiler` module contains the `profile` decorator which can be applied to methods. There is also a `profileCall` context manager which can be used with Python's `with` statement to measure a block of code. `profileCall` takes one argument, a label to use in the results.
|
|
@ -1,21 +1,21 @@
|
|||
# Copyright (c) 2015 Ultimaker B.V.
|
||||
# Cura is released under the terms of the AGPLv3 or higher.
|
||||
|
||||
from UM.Mesh.MeshReader import MeshReader
|
||||
from UM.Mesh.MeshBuilder import MeshBuilder
|
||||
import os.path
|
||||
import zipfile
|
||||
|
||||
from UM.Job import Job
|
||||
from UM.Logger import Logger
|
||||
from UM.Math.Matrix import Matrix
|
||||
from UM.Math.Vector import Vector
|
||||
from UM.Scene.SceneNode import SceneNode
|
||||
from UM.Mesh.MeshBuilder import MeshBuilder
|
||||
from UM.Mesh.MeshReader import MeshReader
|
||||
from UM.Scene.GroupDecorator import GroupDecorator
|
||||
from UM.Job import Job
|
||||
from cura.Settings.SettingOverrideDecorator import SettingOverrideDecorator
|
||||
from UM.Application import Application
|
||||
from cura.Settings.ExtruderManager import ExtruderManager
|
||||
from cura.QualityManager import QualityManager
|
||||
|
||||
import os.path
|
||||
import zipfile
|
||||
from UM.Scene.SceneNode import SceneNode
|
||||
|
||||
try:
|
||||
import xml.etree.cElementTree as ET
|
||||
|
|
|
@ -54,7 +54,12 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
|||
else:
|
||||
Logger.log("w", "Could not find reader that was able to read the scene data for 3MF workspace")
|
||||
return WorkspaceReader.PreReadResult.failed
|
||||
|
||||
machine_name = ""
|
||||
machine_type = ""
|
||||
variant_type_name = i18n_catalog.i18nc("@label", "Nozzle")
|
||||
|
||||
num_extruders = 0
|
||||
# Check if there are any conflicts, so we can ask the user.
|
||||
archive = zipfile.ZipFile(file_name, "r")
|
||||
cura_file_names = [name for name in archive.namelist() if name.startswith("Cura/")]
|
||||
|
@ -76,6 +81,30 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
|||
machine_conflict = True
|
||||
Job.yieldThread()
|
||||
|
||||
definition_container_files = [name for name in cura_file_names if name.endswith(self._definition_container_suffix)]
|
||||
for definition_container_file in definition_container_files:
|
||||
container_id = self._stripFileToId(definition_container_file)
|
||||
definitions = self._container_registry.findDefinitionContainers(id=container_id)
|
||||
|
||||
if not definitions:
|
||||
definition_container = DefinitionContainer(container_id)
|
||||
definition_container.deserialize(archive.open(definition_container_file).read().decode("utf-8"))
|
||||
|
||||
else:
|
||||
definition_container = definitions[0]
|
||||
|
||||
if definition_container.getMetaDataEntry("type") != "extruder":
|
||||
machine_type = definition_container.getName()
|
||||
variant_type_name = definition_container.getMetaDataEntry("variants_name", variant_type_name)
|
||||
else:
|
||||
num_extruders += 1
|
||||
Job.yieldThread()
|
||||
|
||||
if num_extruders == 0:
|
||||
num_extruders = 1 # No extruder stacks found, which means there is one extruder
|
||||
|
||||
extruders = num_extruders * [""]
|
||||
|
||||
material_labels = []
|
||||
material_conflict = False
|
||||
xml_material_profile = self._getXmlProfileClass()
|
||||
|
@ -95,6 +124,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
|||
quality_name = ""
|
||||
quality_type = ""
|
||||
num_settings_overriden_by_quality_changes = 0 # How many settings are changed by the quality changes
|
||||
num_user_settings = 0
|
||||
for instance_container_file in instance_container_files:
|
||||
container_id = self._stripFileToId(instance_container_file)
|
||||
instance_container = InstanceContainer(container_id)
|
||||
|
@ -117,6 +147,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
|||
if quality_name == "":
|
||||
quality_name = instance_container.getName()
|
||||
quality_type = instance_container.getName()
|
||||
elif container_type == "user":
|
||||
num_user_settings += len(instance_container._instances)
|
||||
|
||||
Job.yieldThread()
|
||||
num_visible_settings = 0
|
||||
try:
|
||||
|
@ -142,9 +175,13 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
|||
self._dialog.setQualityName(quality_name)
|
||||
self._dialog.setQualityType(quality_type)
|
||||
self._dialog.setNumSettingsOverridenByQualityChanges(num_settings_overriden_by_quality_changes)
|
||||
self._dialog.setNumUserSettings(num_user_settings)
|
||||
self._dialog.setActiveMode(active_mode)
|
||||
self._dialog.setMachineName(machine_name)
|
||||
self._dialog.setMaterialLabels(material_labels)
|
||||
self._dialog.setMachineType(machine_type)
|
||||
self._dialog.setExtruders(extruders)
|
||||
self._dialog.setVariantType(variant_type_name)
|
||||
self._dialog.setHasObjectsOnPlate(Application.getInstance().getPlatformActivity)
|
||||
self._dialog.show()
|
||||
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
# Copyright (c) 2016 Ultimaker B.V.
|
||||
# Cura is released under the terms of the AGPLv3 or higher.
|
||||
|
||||
from PyQt5.QtCore import Qt, QUrl, pyqtSignal, pyqtSlot, QObject, pyqtProperty, QCoreApplication
|
||||
from PyQt5.QtCore import Qt, QUrl, pyqtSignal, QObject, pyqtProperty, QCoreApplication
|
||||
from UM.FlameProfiler import pyqtSlot
|
||||
from PyQt5.QtQml import QQmlComponent, QQmlContext
|
||||
from UM.PluginRegistry import PluginRegistry
|
||||
from UM.Application import Application
|
||||
|
@ -36,12 +37,16 @@ class WorkspaceDialog(QObject):
|
|||
self._has_machine_conflict = False
|
||||
self._has_material_conflict = False
|
||||
self._num_visible_settings = 0
|
||||
self._num_user_settings = 0
|
||||
self._active_mode = ""
|
||||
self._quality_name = ""
|
||||
self._num_settings_overriden_by_quality_changes = 0
|
||||
self._quality_type = ""
|
||||
self._machine_name = ""
|
||||
self._machine_type = ""
|
||||
self._variant_type = ""
|
||||
self._material_labels = []
|
||||
self._extruders = []
|
||||
self._objects_on_plate = False
|
||||
|
||||
machineConflictChanged = pyqtSignal()
|
||||
|
@ -55,6 +60,34 @@ class WorkspaceDialog(QObject):
|
|||
machineNameChanged = pyqtSignal()
|
||||
materialLabelsChanged = pyqtSignal()
|
||||
objectsOnPlateChanged = pyqtSignal()
|
||||
numUserSettingsChanged = pyqtSignal()
|
||||
machineTypeChanged = pyqtSignal()
|
||||
variantTypeChanged = pyqtSignal()
|
||||
extrudersChanged = pyqtSignal()
|
||||
|
||||
@pyqtProperty(str, notify=variantTypeChanged)
|
||||
def variantType(self):
|
||||
return self._variant_type
|
||||
|
||||
def setVariantType(self, variant_type):
|
||||
self._variant_type = variant_type
|
||||
self.variantTypeChanged.emit()
|
||||
|
||||
@pyqtProperty(str, notify=machineTypeChanged)
|
||||
def machineType(self):
|
||||
return self._machine_type
|
||||
|
||||
def setMachineType(self, machine_type):
|
||||
self._machine_type = machine_type
|
||||
self.machineTypeChanged.emit()
|
||||
|
||||
def setNumUserSettings(self, num_user_settings):
|
||||
self._num_user_settings = num_user_settings
|
||||
self.numVisibleSettingsChanged.emit()
|
||||
|
||||
@pyqtProperty(int, notify=numUserSettingsChanged)
|
||||
def numUserSettings(self):
|
||||
return self._num_user_settings
|
||||
|
||||
@pyqtProperty(bool, notify=objectsOnPlateChanged)
|
||||
def hasObjectsOnPlate(self):
|
||||
|
@ -72,6 +105,14 @@ class WorkspaceDialog(QObject):
|
|||
self._material_labels = material_labels
|
||||
self.materialLabelsChanged.emit()
|
||||
|
||||
@pyqtProperty("QVariantList", notify=extrudersChanged)
|
||||
def extruders(self):
|
||||
return self._extruders
|
||||
|
||||
def setExtruders(self, extruders):
|
||||
self._extruders = extruders
|
||||
self.extrudersChanged.emit()
|
||||
|
||||
@pyqtProperty(str, notify = machineNameChanged)
|
||||
def machineName(self):
|
||||
return self._machine_name
|
||||
|
@ -144,6 +185,11 @@ class WorkspaceDialog(QObject):
|
|||
if key in self._result:
|
||||
self._result[key] = strategy
|
||||
|
||||
## Close the backend: otherwise one could end up with "Slicing..."
|
||||
@pyqtSlot()
|
||||
def closeBackend(self):
|
||||
Application.getInstance().getBackend().close()
|
||||
|
||||
def setMaterialConflict(self, material_conflict):
|
||||
self._has_material_conflict = material_conflict
|
||||
self.materialConflictChanged.emit()
|
||||
|
|
|
@ -16,9 +16,9 @@ UM.Dialog
|
|||
minimumWidth: 550
|
||||
maximumWidth: 550
|
||||
|
||||
height: 350
|
||||
minimumHeight: 350
|
||||
maximumHeight: 350
|
||||
height: 400
|
||||
minimumHeight: 400
|
||||
maximumHeight: 400
|
||||
property int comboboxHeight: 15
|
||||
property int spacerHeight: 10
|
||||
onClosing: manager.notifyClosed()
|
||||
|
@ -28,12 +28,20 @@ UM.Dialog
|
|||
{
|
||||
machineResolveComboBox.currentIndex = 0
|
||||
qualityChangesResolveComboBox.currentIndex = 0
|
||||
materialConflictComboBox.currentIndex = 0
|
||||
materialResolveComboBox.currentIndex = 0
|
||||
}
|
||||
}
|
||||
Item
|
||||
{
|
||||
anchors.fill: parent
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
||||
anchors.topMargin: 20
|
||||
anchors.bottomMargin: 20
|
||||
anchors.leftMargin:20
|
||||
anchors.rightMargin: 20
|
||||
|
||||
UM.I18nCatalog
|
||||
{
|
||||
|
@ -77,27 +85,22 @@ UM.Dialog
|
|||
width: height
|
||||
}
|
||||
|
||||
Row
|
||||
{
|
||||
height: childrenRect.height
|
||||
width: parent.width
|
||||
Label
|
||||
{
|
||||
text: catalog.i18nc("@action:label", "Printer settings")
|
||||
font.bold: true
|
||||
width: parent.width /3
|
||||
}
|
||||
|
||||
Row
|
||||
Item
|
||||
{
|
||||
width: parent.width
|
||||
height: childrenRect.height
|
||||
Label
|
||||
{
|
||||
text: catalog.i18nc("@action:label", "Name")
|
||||
// spacer
|
||||
height: spacerHeight
|
||||
width: parent.width / 3
|
||||
}
|
||||
Label
|
||||
{
|
||||
text: manager.machineName
|
||||
width: parent.width / 3
|
||||
}
|
||||
|
||||
UM.TooltipArea
|
||||
{
|
||||
id: machineResolveTooltip
|
||||
|
@ -118,16 +121,20 @@ UM.Dialog
|
|||
}
|
||||
}
|
||||
}
|
||||
Item // Spacer
|
||||
Row
|
||||
{
|
||||
height: spacerHeight
|
||||
width: height
|
||||
}
|
||||
|
||||
width: parent.width
|
||||
height: childrenRect.height
|
||||
Label
|
||||
{
|
||||
text: catalog.i18nc("@action:label", "Profile settings")
|
||||
font.bold: true
|
||||
text: catalog.i18nc("@action:label", "Type")
|
||||
width: parent.width / 3
|
||||
}
|
||||
Label
|
||||
{
|
||||
text: manager.machineType
|
||||
width: parent.width / 3
|
||||
}
|
||||
}
|
||||
|
||||
Row
|
||||
|
@ -141,10 +148,32 @@ UM.Dialog
|
|||
}
|
||||
Label
|
||||
{
|
||||
text: manager.qualityName
|
||||
text: manager.machineName
|
||||
width: parent.width / 3
|
||||
}
|
||||
}
|
||||
|
||||
Item // Spacer
|
||||
{
|
||||
height: spacerHeight
|
||||
width: height
|
||||
}
|
||||
Row
|
||||
{
|
||||
height: childrenRect.height
|
||||
width: parent.width
|
||||
Label
|
||||
{
|
||||
text: catalog.i18nc("@action:label", "Profile settings")
|
||||
font.bold: true
|
||||
width: parent.width / 3
|
||||
}
|
||||
Item
|
||||
{
|
||||
// spacer
|
||||
height: spacerHeight
|
||||
width: parent.width / 3
|
||||
}
|
||||
UM.TooltipArea
|
||||
{
|
||||
id: qualityChangesResolveTooltip
|
||||
|
@ -170,13 +199,44 @@ UM.Dialog
|
|||
width: parent.width
|
||||
height: childrenRect.height
|
||||
Label
|
||||
{
|
||||
text: catalog.i18nc("@action:label", "Name")
|
||||
width: parent.width / 3
|
||||
}
|
||||
Label
|
||||
{
|
||||
text: manager.qualityName
|
||||
width: parent.width / 3
|
||||
}
|
||||
}
|
||||
Row
|
||||
{
|
||||
width: parent.width
|
||||
height: manager.numUserSettings != 0 ? childrenRect.height : 0
|
||||
Label
|
||||
{
|
||||
text: catalog.i18nc("@action:label", "Not in profile")
|
||||
width: parent.width / 3
|
||||
}
|
||||
Label
|
||||
{
|
||||
text: catalog.i18ncp("@action:label", "%1 override", "%1 overrides", manager.numUserSettings).arg(manager.numUserSettings)
|
||||
width: parent.width / 3
|
||||
}
|
||||
visible: manager.numUserSettings != 0
|
||||
}
|
||||
Row
|
||||
{
|
||||
width: parent.width
|
||||
height: manager.numSettingsOverridenByQualityChanges != 0 ? childrenRect.height : 0
|
||||
Label
|
||||
{
|
||||
text: catalog.i18nc("@action:label", "Derivative from")
|
||||
width: parent.width / 3
|
||||
}
|
||||
Label
|
||||
{
|
||||
text: catalog.i18nc("@action:label", "%1, %2 override(s)" ).arg(manager.qualityType).arg(manager.numSettingsOverridenByQualityChanges)
|
||||
text: catalog.i18ncp("@action:label", "%1, %2 override", "%1, %2 overrides", manager.numSettingsOverridenByQualityChanges).arg(manager.qualityType).arg(manager.numSettingsOverridenByQualityChanges)
|
||||
width: parent.width / 3
|
||||
}
|
||||
visible: manager.numSettingsOverridenByQualityChanges != 0
|
||||
|
@ -186,11 +246,41 @@ UM.Dialog
|
|||
height: spacerHeight
|
||||
width: height
|
||||
}
|
||||
|
||||
Row
|
||||
{
|
||||
height: childrenRect.height
|
||||
width: parent.width
|
||||
Label
|
||||
{
|
||||
text: catalog.i18nc("@action:label", "Material settings")
|
||||
font.bold: true
|
||||
width: parent.width / 3
|
||||
}
|
||||
Item
|
||||
{
|
||||
// spacer
|
||||
height: spacerHeight
|
||||
width: parent.width / 3
|
||||
}
|
||||
UM.TooltipArea
|
||||
{
|
||||
id: materialResolveTooltip
|
||||
width: parent.width / 3
|
||||
height: visible ? comboboxHeight : 0
|
||||
visible: manager.materialConflict
|
||||
text: catalog.i18nc("@info:tooltip", "How should the conflict in the material be resolved?")
|
||||
ComboBox
|
||||
{
|
||||
model: resolveStrategiesModel
|
||||
textRole: "label"
|
||||
id: materialResolveComboBox
|
||||
width: parent.width
|
||||
onActivated:
|
||||
{
|
||||
manager.setResolveStrategy("material", resolveStrategiesModel.get(index).key)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Repeater
|
||||
|
@ -213,37 +303,6 @@ UM.Dialog
|
|||
}
|
||||
}
|
||||
|
||||
Row
|
||||
{
|
||||
width: parent.width
|
||||
height: childrenRect.height
|
||||
visible: manager.materialConflict
|
||||
Item
|
||||
{
|
||||
width: parent.width / 3 * 2
|
||||
height: comboboxHeight
|
||||
}
|
||||
|
||||
UM.TooltipArea
|
||||
{
|
||||
id: materialResolveTooltip
|
||||
width: parent.width / 3
|
||||
height: visible ? comboboxHeight : 0
|
||||
|
||||
text: catalog.i18nc("@info:tooltip", "How should the conflict in the material be resolved?")
|
||||
ComboBox
|
||||
{
|
||||
model: resolveStrategiesModel
|
||||
textRole: "label"
|
||||
id: materialResolveComboBox
|
||||
width: parent.width
|
||||
onActivated:
|
||||
{
|
||||
manager.setResolveStrategy("material", resolveStrategiesModel.get(index).key)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Item // Spacer
|
||||
{
|
||||
height: spacerHeight
|
||||
|
@ -290,30 +349,47 @@ UM.Dialog
|
|||
height: spacerHeight
|
||||
width: height
|
||||
}
|
||||
Row
|
||||
{
|
||||
width: parent.width
|
||||
height: childrenRect.height
|
||||
visible: manager.hasObjectsOnPlate
|
||||
UM.RecolorImage
|
||||
{
|
||||
width: warningLabel.height
|
||||
height: width
|
||||
|
||||
source: UM.Theme.getIcon("notice")
|
||||
color: "black"
|
||||
|
||||
}
|
||||
Label
|
||||
{
|
||||
id: warningLabel
|
||||
text: catalog.i18nc("@action:warning", "Loading a project will clear all models on the buildplate")
|
||||
visible: manager.hasObjectsOnPlate
|
||||
color: "red"
|
||||
width: parent.width
|
||||
wrapMode: Text.Wrap
|
||||
}
|
||||
}
|
||||
}
|
||||
rightButtons: [
|
||||
Button
|
||||
{
|
||||
id: ok_button
|
||||
text: catalog.i18nc("@action:button","OK");
|
||||
onClicked: { manager.onOkButtonClicked() }
|
||||
enabled: true
|
||||
},
|
||||
Button
|
||||
{
|
||||
id: cancel_button
|
||||
text: catalog.i18nc("@action:button","Cancel");
|
||||
onClicked: { manager.onCancelButtonClicked() }
|
||||
enabled: true
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.right: ok_button.left
|
||||
anchors.bottomMargin: - 0.5 * height
|
||||
anchors.rightMargin:2
|
||||
}
|
||||
Button
|
||||
{
|
||||
id: ok_button
|
||||
text: catalog.i18nc("@action:button","Open");
|
||||
onClicked: { manager.closeBackend(); manager.onOkButtonClicked() }
|
||||
anchors.bottomMargin: - 0.5 * height
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.right: parent.right
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
|
@ -4,10 +4,16 @@
|
|||
from . import ThreeMFReader
|
||||
from . import ThreeMFWorkspaceReader
|
||||
from UM.i18n import i18nCatalog
|
||||
import UM.Platform
|
||||
catalog = i18nCatalog("cura")
|
||||
|
||||
|
||||
def getMetaData():
|
||||
# Workarround for osx not supporting double file extensions correclty.
|
||||
if UM.Platform.isOSX():
|
||||
workspace_extension = "3mf"
|
||||
else:
|
||||
workspace_extension = "curaproject.3mf"
|
||||
return {
|
||||
"plugin": {
|
||||
"name": catalog.i18nc("@label", "3MF Reader"),
|
||||
|
@ -25,7 +31,7 @@ def getMetaData():
|
|||
"workspace_reader":
|
||||
[
|
||||
{
|
||||
"extension": "curaproject.3mf",
|
||||
"extension": workspace_extension,
|
||||
"description": catalog.i18nc("@item:inlistbox", "3MF File")
|
||||
}
|
||||
]
|
||||
|
|
|
@ -1,3 +1,128 @@
|
|||
[2.4.0]
|
||||
*Project saving & opening
|
||||
You can now save your build plate configuration - with all your active machine’s meshes and settings. When you reopen the project file, you’ll find that the build plate configuration and all settings will be exactly as you last left them when you saved the project.
|
||||
|
||||
*Setting search
|
||||
You can now search the custom settings directly from the side panel, which means you can easily locate the setting you need to tweak. Thanks to community member Aldo Hoeben & LulzBot for this feature.
|
||||
|
||||
*Editing start g-code and end g-code
|
||||
Aldo Hoeben also added this feature, enabling you to alter both start and end code g-code settings for single extrusion machines.
|
||||
|
||||
*Multiply object function
|
||||
By right-clicking on an object, you can multiply it by a variable amount, rather than duplicating multiple times. Thanks again to Aldo Hoeben for this feature.
|
||||
|
||||
*Ultimaker 3 single extrusion prints
|
||||
Dual extrusion printers now allow for single extrusion prints in a larger printable area.
|
||||
|
||||
*Streaming printer monitor view
|
||||
Ultimaker 3’s camera views no longer only show snapshots. They now show a live stream.
|
||||
|
||||
*Explain why slicing is disabled
|
||||
When slicing is blocked by settings with error values, a message now appears, clearly indicating which settings need to be changed.
|
||||
|
||||
*Ultimaker 3 print profiles
|
||||
The initial and final printing temperatures reduce the amount of oozing during PLA-PLA, PLA-PVA and Nylon-PVA prints. This means printing a prime tower is now optional (except for CPE and ABS at the moment). The new Ultimaker 3 printing profiles ensure increased reliability and shorter print time.
|
||||
|
||||
*Initial Layer Printing Temperature
|
||||
Initial and final printing temperature settings have been tuned for higher quality results.
|
||||
|
||||
*Printing temperature of the materials
|
||||
The printing temperature of the materials in the material profiles is now the same as the printing temperature for the Normal Quality profile.
|
||||
|
||||
*Improved PLA-PVA layer adhesion
|
||||
The PVA jerk and acceleration have been optimized to improve the layer adhesion between PVA and PLA.
|
||||
|
||||
*Default build plate adhesion type for Nylon
|
||||
The default build plate adhesion type for Nylon prints has been changed from raft to brim.
|
||||
|
||||
*Support Interface Thickness
|
||||
The Support Roof Thickness is now 0.8 mm and PVA support infill has been slightly decreased to lower the printing time.
|
||||
|
||||
*Ultimaker 2+ PC prints
|
||||
In the polycarbonate profiles, the raft settings for the 0.25 mm and 0.4 mm nozzles are tweaked for less warping.
|
||||
|
||||
*Hollow prime tower
|
||||
Print the prime tower hollow to minimize material use while maintaining stability. Wiping the oozed material on the prime tower is now done from the inside, which means the excess material is contained within the prime tower.
|
||||
|
||||
*Precooling and prewarming
|
||||
Printing now starts at a lower temperature, before increasing swiftly to the normal printing temperature. Cooling also starts earlier than the last extrusion (with that print core). This minimizes the material’s heat absorption, which decreases the amount of degradation of the PVA material. This reduces the risk of clogging your nozzles.
|
||||
|
||||
*Remove Mesh Intersection
|
||||
You are now able to turn off resolving of overlapping meshes. Models can now overlap, so you can perform build plate color mixing, by placing meshes over one another and lowering their flow.
|
||||
|
||||
*Alternate Mesh Removal
|
||||
For areas where two models overlap, let each layer of the overlapping volume alternate (depending on which object the overlapping area of that layer belongs to). This improves the bonding between dual color models and allows for more controlled build plate color mixing.
|
||||
|
||||
*Hollow Object
|
||||
Remove the infill from a mesh and treat internal cavities as overhangs, so as to create support in the model’s interior. This experimental setting greatly reduces the amount of material needed on the inside of the print.
|
||||
|
||||
*Fill Gaps Between Walls
|
||||
Fill up small gaps between consecutive walls, making thin pieces in your model dense, rather than hollow. This feature makes the thin pieces stronger.
|
||||
|
||||
*Cubic subdivision infill
|
||||
This experimental new infill pattern is similar to cubic infill, but generates bigger cubes farther inside the mesh. This greatly reduces print times and material use, while maintaining structural integrity. Thanks to community members Martin Boerwinckle and Nicholas Seward for this feature.
|
||||
|
||||
*Concentric 3D infill
|
||||
This new infill pattern is similar to concentric infill, but touches the shell every X layers, creating better support for the top layers.
|
||||
|
||||
* Printing Temperature Initial Layer
|
||||
Nozzle temperature to be used during the first layer.
|
||||
|
||||
*Build Plate Temperature Initial Layer
|
||||
Bed temperature to be used during the first layer.
|
||||
|
||||
*Initial Fan Speed
|
||||
Fan speed to be used during the first layer.
|
||||
|
||||
*Retract at Layer Change
|
||||
Retract each time the printer progresses to the next layer.
|
||||
|
||||
*Outer Wall Wipe Distance
|
||||
Wipe the nozzle after printing the outer wall.
|
||||
|
||||
*Set X-Y coordinate of z-seam
|
||||
Select where to place the Z seam.
|
||||
|
||||
*Start Layers with the Same Part
|
||||
Start each layer with the part closest to a given location.
|
||||
|
||||
*Turn off nozzle after last use
|
||||
Turn off the nozzle after its last use, while other nozzles are still in use.
|
||||
|
||||
*Option for no build plate adhesion
|
||||
Select not to print any build plate adhesion helper parts.
|
||||
|
||||
*Anti-overhang and support meshes
|
||||
Use a mesh to specify a volume within which to classify nothing as overhang for support or specify a volume within which to print support.
|
||||
|
||||
*Delta printer support
|
||||
This release adds support for printers with elliptic buildplates. This feature has not been extensively tested so please let us know if it works or get involved in improving it.
|
||||
|
||||
*bugfixes
|
||||
The user is now notified when a new version of Cura is available.
|
||||
When searching in the setting visibility preferences, the category for each setting is always displayed.
|
||||
3MF files are now saved and loaded correctly.
|
||||
Dragging a profile onto Cura now loads it automatically.
|
||||
You can now view which print cores and materials are currently in your Ultimaker 3, via the machine manager.
|
||||
You can now add the heated bed upgrade etc. from the machine manager.
|
||||
Print core and material is now arranged under extruder tabs.
|
||||
Cura now remembers all printers and profiles when you open just after closing it.
|
||||
You can now duplicate the standard profiles.
|
||||
Layer view now doesn’t use as much RAM.
|
||||
It’s now quicker to change the value of the Support Enable setting.
|
||||
Changing a setting updates all dependent settings more quickly.
|
||||
Having errors in your setting values now always blocks slicing.
|
||||
Selecting a model with any active tool no longer causes a reslice.
|
||||
The prime poop now introduces a separate area where you cannot print.
|
||||
Support Extruder setting is now near the support settings.
|
||||
Build Plate Adhesion Extruder setting is now near the build plate adhesion settings.
|
||||
Z hop settings have been moved to the Travel category.
|
||||
Inactive nozzle wiping on the prime tower is re-enabled.
|
||||
There are no more unnecessary retractions in support.
|
||||
Each layer now has less extruder switches than the machine has extruders.
|
||||
Concentric infill doesn’t generate the first infill perimeter next to the walls.
|
||||
Extruder priming now always happens on the first layer.
|
||||
|
||||
[2.3.1]
|
||||
*Layer Height in Profile Selection
|
||||
Added the layer height to the profile selection menu.
|
||||
|
|
|
@ -12,6 +12,8 @@ from UM.PluginRegistry import PluginRegistry
|
|||
from UM.Resources import Resources
|
||||
from UM.Settings.Validator import ValidatorState #To find if a setting is in an error state. We can't slice then.
|
||||
from UM.Platform import Platform
|
||||
from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
|
||||
|
||||
|
||||
from cura.Settings.ExtruderManager import ExtruderManager
|
||||
from . import ProcessSlicedLayersJob
|
||||
|
@ -65,6 +67,8 @@ class CuraEngineBackend(Backend):
|
|||
self._scene = Application.getInstance().getController().getScene()
|
||||
self._scene.sceneChanged.connect(self._onSceneChanged)
|
||||
|
||||
self._pause_slicing = False
|
||||
|
||||
# Workaround to disable layer view processing if layer view is not active.
|
||||
self._layer_view_active = False
|
||||
Application.getInstance().getController().activeViewChanged.connect(self._onActiveViewChanged)
|
||||
|
@ -145,6 +149,9 @@ class CuraEngineBackend(Backend):
|
|||
|
||||
## Perform a slice of the scene.
|
||||
def slice(self):
|
||||
Logger.log("d", "Starting slice job...")
|
||||
if self._pause_slicing:
|
||||
return
|
||||
self._slice_start_time = time()
|
||||
if not self._enabled or not self._global_container_stack: # We shouldn't be slicing.
|
||||
# try again in a short time
|
||||
|
@ -178,6 +185,17 @@ class CuraEngineBackend(Backend):
|
|||
self._start_slice_job.start()
|
||||
self._start_slice_job.finished.connect(self._onStartSliceCompleted)
|
||||
|
||||
|
||||
def pauseSlicing(self):
|
||||
self.close()
|
||||
self._pause_slicing = True
|
||||
self.backendStateChange.emit(BackendState.Disabled)
|
||||
|
||||
def continueSlicing(self):
|
||||
if self._pause_slicing:
|
||||
self._pause_slicing = False
|
||||
self.backendStateChange.emit(BackendState.NotStarted)
|
||||
|
||||
## Terminate the engine process.
|
||||
def _terminate(self):
|
||||
self._slicing = False
|
||||
|
@ -293,6 +311,19 @@ class CuraEngineBackend(Backend):
|
|||
if source is self._scene.getRoot():
|
||||
return
|
||||
|
||||
should_pause = False
|
||||
for node in DepthFirstIterator(self._scene.getRoot()):
|
||||
if node.callDecoration("isBlockSlicing"):
|
||||
should_pause = True
|
||||
gcode_list = node.callDecoration("getGCodeList")
|
||||
if gcode_list is not None:
|
||||
self._scene.gcode_list = gcode_list
|
||||
|
||||
if should_pause:
|
||||
self.pauseSlicing()
|
||||
else:
|
||||
self.continueSlicing()
|
||||
|
||||
if source.getMeshData() is None:
|
||||
return
|
||||
|
||||
|
|
|
@ -253,7 +253,7 @@ class StartSliceJob(Job):
|
|||
for key, value in settings.items(): #Add all submessages for each individual setting.
|
||||
setting_message = self._slice_message.getMessage("global_settings").addRepeatedMessage("settings")
|
||||
setting_message.name = key
|
||||
if key == "machine_start_gcode" or key == "machine_end_gcode": #If it's a g-code message, use special formatting.
|
||||
if key == "machine_start_gcode" or key == "machine_end_gcode" or key == "machine_extruder_start_code" or key == "machine_extruder_end_code": #If it's a g-code message, use special formatting.
|
||||
setting_message.value = self._expandGcodeTokens(key, value, settings)
|
||||
else:
|
||||
setting_message.value = str(value).encode("utf-8")
|
||||
|
|
303
plugins/GCodeReader/GCodeReader.py
Normal file
303
plugins/GCodeReader/GCodeReader.py
Normal file
|
@ -0,0 +1,303 @@
|
|||
# Copyright (c) 2016 Aleph Objects, Inc.
|
||||
# Cura is released under the terms of the AGPLv3 or higher.
|
||||
|
||||
from UM.Application import Application
|
||||
from UM.Logger import Logger
|
||||
from UM.Math.AxisAlignedBox import AxisAlignedBox
|
||||
from UM.Math.Vector import Vector
|
||||
from UM.Mesh.MeshReader import MeshReader
|
||||
from UM.Message import Message
|
||||
from UM.Scene.SceneNode import SceneNode
|
||||
from UM.i18n import i18nCatalog
|
||||
|
||||
catalog = i18nCatalog("cura")
|
||||
|
||||
|
||||
from cura import LayerDataBuilder
|
||||
from cura import LayerDataDecorator
|
||||
from cura.LayerPolygon import LayerPolygon
|
||||
from cura.GCodeListDecorator import GCodeListDecorator
|
||||
|
||||
import numpy
|
||||
import math
|
||||
import re
|
||||
from collections import namedtuple
|
||||
|
||||
|
||||
# Class for loading and parsing G-code files
|
||||
class GCodeReader(MeshReader):
|
||||
def __init__(self):
|
||||
super(GCodeReader, self).__init__()
|
||||
self._supported_extensions = [".gcode", ".g"]
|
||||
Application.getInstance().hideMessageSignal.connect(self._onHideMessage)
|
||||
self._cancelled = False
|
||||
self._message = None
|
||||
self._clearValues()
|
||||
self._scene_node = None
|
||||
self._position = namedtuple('Position', ['x', 'y', 'z', 'e'])
|
||||
|
||||
def _clearValues(self):
|
||||
self._extruder = 0
|
||||
self._layer_type = LayerPolygon.Inset0Type
|
||||
self._layer = 0
|
||||
self._previous_z = 0
|
||||
self._layer_data_builder = LayerDataBuilder.LayerDataBuilder()
|
||||
self._center_is_zero = False
|
||||
|
||||
@staticmethod
|
||||
def _getValue(line, code):
|
||||
n = line.find(code)
|
||||
if n < 0:
|
||||
return None
|
||||
n += len(code)
|
||||
pattern = re.compile("[;\s]")
|
||||
match = pattern.search(line, n)
|
||||
m = match.start() if match is not None else -1
|
||||
try:
|
||||
if m < 0:
|
||||
return line[n:]
|
||||
return line[n:m]
|
||||
except:
|
||||
return None
|
||||
|
||||
def _getInt(self, line, code):
|
||||
value = self._getValue(line, code)
|
||||
try:
|
||||
return int(value)
|
||||
except:
|
||||
return None
|
||||
|
||||
def _getFloat(self, line, code):
|
||||
value = self._getValue(line, code)
|
||||
try:
|
||||
return float(value)
|
||||
except:
|
||||
return None
|
||||
|
||||
def _onHideMessage(self, message):
|
||||
if message == self._message:
|
||||
self._cancelled = True
|
||||
|
||||
@staticmethod
|
||||
def _getNullBoundingBox():
|
||||
return AxisAlignedBox(minimum=Vector(0, 0, 0), maximum=Vector(10, 10, 10))
|
||||
|
||||
def _createPolygon(self, current_z, path):
|
||||
countvalid = 0
|
||||
for point in path:
|
||||
if point[3] > 0:
|
||||
countvalid += 1
|
||||
if countvalid < 2:
|
||||
return False
|
||||
try:
|
||||
self._layer_data_builder.addLayer(self._layer)
|
||||
self._layer_data_builder.setLayerHeight(self._layer, path[0][2])
|
||||
self._layer_data_builder.setLayerThickness(self._layer, math.fabs(current_z - self._previous_z))
|
||||
this_layer = self._layer_data_builder.getLayer(self._layer)
|
||||
except ValueError:
|
||||
return False
|
||||
count = len(path)
|
||||
line_types = numpy.empty((count - 1, 1), numpy.int32)
|
||||
line_widths = numpy.empty((count - 1, 1), numpy.float32)
|
||||
# TODO: need to calculate actual line width based on E values
|
||||
line_widths[:, 0] = 0.4
|
||||
points = numpy.empty((count, 3), numpy.float32)
|
||||
i = 0
|
||||
for point in path:
|
||||
points[i, 0] = point[0]
|
||||
points[i, 1] = point[2]
|
||||
points[i, 2] = -point[1]
|
||||
if i > 0:
|
||||
line_types[i - 1] = point[3]
|
||||
if point[3] in [LayerPolygon.MoveCombingType, LayerPolygon.MoveRetractionType]:
|
||||
line_widths[i - 1] = 0.2
|
||||
i += 1
|
||||
|
||||
this_poly = LayerPolygon(self._layer_data_builder, self._extruder, line_types, points, line_widths)
|
||||
this_poly.buildCache()
|
||||
|
||||
this_layer.polygons.append(this_poly)
|
||||
return True
|
||||
|
||||
def _gCode0(self, position, params, path):
|
||||
x, y, z, e = position
|
||||
x = params.x if params.x is not None else x
|
||||
y = params.y if params.y is not None else y
|
||||
z_changed = False
|
||||
if params.z is not None:
|
||||
if z != params.z:
|
||||
z_changed = True
|
||||
self._previous_z = z
|
||||
z = params.z
|
||||
if params.e is not None:
|
||||
if params.e > e[self._extruder]:
|
||||
path.append([x, y, z, self._layer_type]) # extrusion
|
||||
else:
|
||||
path.append([x, y, z, LayerPolygon.MoveRetractionType]) # retraction
|
||||
e[self._extruder] = params.e
|
||||
else:
|
||||
path.append([x, y, z, LayerPolygon.MoveCombingType])
|
||||
if z_changed:
|
||||
if not self._is_layers_in_file:
|
||||
if len(path) > 1 and z > 0:
|
||||
if self._createPolygon(z, path):
|
||||
self._layer += 1
|
||||
path.clear()
|
||||
else:
|
||||
path.clear()
|
||||
return self._position(x, y, z, e)
|
||||
|
||||
def _gCode28(self, position, params, path):
|
||||
return self._position(
|
||||
params.x if params.x is not None else position.x,
|
||||
params.y if params.y is not None else position.y,
|
||||
0,
|
||||
position.e)
|
||||
|
||||
def _gCode92(self, position, params, path):
|
||||
if params.e is not None:
|
||||
position.e[self._extruder] = params.e
|
||||
return self._position(
|
||||
params.x if params.x is not None else position.x,
|
||||
params.y if params.y is not None else position.y,
|
||||
params.z if params.z is not None else position.z,
|
||||
position.e)
|
||||
|
||||
_gCode1 = _gCode0
|
||||
|
||||
def _processGCode(self, G, line, position, path):
|
||||
func = getattr(self, "_gCode%s" % G, None)
|
||||
x = self._getFloat(line, "X")
|
||||
y = self._getFloat(line, "Y")
|
||||
z = self._getFloat(line, "Z")
|
||||
e = self._getFloat(line, "E")
|
||||
if func is not None:
|
||||
if (x is not None and x < 0) or (y is not None and y < 0):
|
||||
self._center_is_zero = True
|
||||
params = self._position(x, y, z, e)
|
||||
return func(position, params, path)
|
||||
return position
|
||||
|
||||
def _processTCode(self, T, line, position, path):
|
||||
self._extruder = T
|
||||
if self._extruder + 1 > len(position.e):
|
||||
position.e.extend([0] * (self._extruder - len(position.e) + 1))
|
||||
if not self._is_layers_in_file:
|
||||
if len(path) > 1 and position[2] > 0:
|
||||
if self._createPolygon(position[2], path):
|
||||
self._layer += 1
|
||||
path.clear()
|
||||
else:
|
||||
path.clear()
|
||||
return position
|
||||
|
||||
_type_keyword = ";TYPE:"
|
||||
_layer_keyword = ";LAYER:"
|
||||
|
||||
def read(self, file_name):
|
||||
Logger.log("d", "Preparing to load %s" % file_name)
|
||||
self._cancelled = False
|
||||
|
||||
scene_node = SceneNode()
|
||||
scene_node.getBoundingBox = self._getNullBoundingBox # Manually set bounding box, because mesh doesn't have mesh data
|
||||
|
||||
glist = []
|
||||
self._is_layers_in_file = False
|
||||
|
||||
|
||||
Logger.log("d", "Opening file %s" % file_name)
|
||||
|
||||
with open(file_name, "r") as file:
|
||||
file_lines = 0
|
||||
current_line = 0
|
||||
for line in file:
|
||||
file_lines += 1
|
||||
glist.append(line)
|
||||
if not self._is_layers_in_file and line[:len(self._layer_keyword)] == self._layer_keyword:
|
||||
self._is_layers_in_file = True
|
||||
file.seek(0)
|
||||
|
||||
file_step = max(math.floor(file_lines / 100), 1)
|
||||
|
||||
self._clearValues()
|
||||
|
||||
self._message = Message(catalog.i18nc("@info:status", "Parsing G-code"), lifetime=0)
|
||||
self._message.setProgress(0)
|
||||
self._message.show()
|
||||
|
||||
Logger.log("d", "Parsing %s" % file_name)
|
||||
|
||||
current_position = self._position(0, 0, 0, [0])
|
||||
current_path = []
|
||||
|
||||
for line in file:
|
||||
if self._cancelled:
|
||||
Logger.log("d", "Parsing %s cancelled" % file_name)
|
||||
return None
|
||||
current_line += 1
|
||||
if current_line % file_step == 0:
|
||||
self._message.setProgress(math.floor(current_line / file_lines * 100))
|
||||
if len(line) == 0:
|
||||
continue
|
||||
if line.find(self._type_keyword) == 0:
|
||||
type = line[len(self._type_keyword):].strip()
|
||||
if type == "WALL-INNER":
|
||||
self._layer_type = LayerPolygon.InsetXType
|
||||
elif type == "WALL-OUTER":
|
||||
self._layer_type = LayerPolygon.Inset0Type
|
||||
elif type == "SKIN":
|
||||
self._layer_type = LayerPolygon.SkinType
|
||||
elif type == "SKIRT":
|
||||
self._layer_type = LayerPolygon.SkirtType
|
||||
elif type == "SUPPORT":
|
||||
self._layer_type = LayerPolygon.SupportType
|
||||
elif type == "FILL":
|
||||
self._layer_type = LayerPolygon.InfillType
|
||||
if self._is_layers_in_file and line[:len(self._layer_keyword)] == self._layer_keyword:
|
||||
try:
|
||||
layer_number = int(line[len(self._layer_keyword):])
|
||||
self._createPolygon(current_position[2], current_path)
|
||||
current_path.clear()
|
||||
self._layer = layer_number
|
||||
except:
|
||||
pass
|
||||
if line[0] == ";":
|
||||
continue
|
||||
|
||||
G = self._getInt(line, "G")
|
||||
if G is not None:
|
||||
current_position = self._processGCode(G, line, current_position, current_path)
|
||||
T = self._getInt(line, "T")
|
||||
if T is not None:
|
||||
current_position = self._processTCode(T, line, current_position, current_path)
|
||||
|
||||
if not self._is_layers_in_file and len(current_path) > 1 and current_position[2] > 0:
|
||||
if self._createPolygon(current_position[2], current_path):
|
||||
self._layer += 1
|
||||
current_path.clear()
|
||||
|
||||
layer_mesh = self._layer_data_builder.build()
|
||||
decorator = LayerDataDecorator.LayerDataDecorator()
|
||||
decorator.setLayerData(layer_mesh)
|
||||
scene_node.addDecorator(decorator)
|
||||
|
||||
gcode_list_decorator = GCodeListDecorator()
|
||||
gcode_list_decorator.setGCodeList(glist)
|
||||
scene_node.addDecorator(gcode_list_decorator)
|
||||
|
||||
Logger.log("d", "Finished parsing %s" % file_name)
|
||||
self._message.hide()
|
||||
|
||||
if self._layer == 0:
|
||||
Logger.log("w", "File %s doesn't contain any valid layers" % file_name)
|
||||
|
||||
settings = Application.getInstance().getGlobalContainerStack()
|
||||
machine_width = settings.getProperty("machine_width", "value")
|
||||
machine_depth = settings.getProperty("machine_depth", "value")
|
||||
|
||||
if not self._center_is_zero:
|
||||
scene_node.setPosition(Vector(-machine_width / 2, 0, machine_depth / 2))
|
||||
|
||||
Logger.log("d", "Loaded %s" % file_name)
|
||||
|
||||
return scene_node
|
33
plugins/GCodeReader/__init__.py
Normal file
33
plugins/GCodeReader/__init__.py
Normal file
|
@ -0,0 +1,33 @@
|
|||
# Copyright (c) 2016 Aleph Objects, Inc.
|
||||
# Cura is released under the terms of the AGPLv3 or higher.
|
||||
|
||||
from . import GCodeReader
|
||||
|
||||
from UM.i18n import i18nCatalog
|
||||
i18n_catalog = i18nCatalog("cura")
|
||||
|
||||
def getMetaData():
|
||||
return {
|
||||
"plugin": {
|
||||
"name": i18n_catalog.i18nc("@label", "G-code Reader"),
|
||||
"author": "Victor Larchenko",
|
||||
"version": "1.0",
|
||||
"description": i18n_catalog.i18nc("@info:whatsthis", "Allows loading and displaying G-code files."),
|
||||
"api": 3
|
||||
},
|
||||
"mesh_reader": [
|
||||
{
|
||||
"extension": "gcode",
|
||||
"description": i18n_catalog.i18nc("@item:inlistbox", "G-code File")
|
||||
},
|
||||
{
|
||||
"extension": "g",
|
||||
"description": i18n_catalog.i18nc("@item:inlistbox", "G File")
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
def register(app):
|
||||
app.addNonSliceableExtension(".gcode")
|
||||
app.addNonSliceableExtension(".g")
|
||||
return { "mesh_reader": GCodeReader.GCodeReader() }
|
|
@ -4,9 +4,9 @@
|
|||
import os
|
||||
import threading
|
||||
|
||||
from PyQt5.QtCore import Qt, QUrl, pyqtSignal, pyqtSlot, QObject
|
||||
from PyQt5.QtCore import Qt, QUrl, pyqtSignal, QObject
|
||||
from PyQt5.QtQml import QQmlComponent, QQmlContext
|
||||
|
||||
from UM.FlameProfiler import pyqtSlot
|
||||
from UM.Application import Application
|
||||
from UM.PluginRegistry import PluginRegistry
|
||||
from UM.Logger import Logger
|
||||
|
|
|
@ -45,10 +45,11 @@ class LayerPass(RenderPass):
|
|||
tool_handle_batch = RenderBatch(self._tool_handle_shader, type = RenderBatch.RenderType.Overlay)
|
||||
|
||||
for node in DepthFirstIterator(self._scene.getRoot()):
|
||||
|
||||
if isinstance(node, ToolHandle):
|
||||
tool_handle_batch.addItem(node.getWorldTransformation(), mesh = node.getSolidMesh())
|
||||
|
||||
elif isinstance(node, SceneNode) and node.getMeshData() and node.isVisible():
|
||||
elif isinstance(node, SceneNode) and (node.getMeshData() or node.callDecoration("isBlockSlicing")) and node.isVisible():
|
||||
layer_data = node.callDecoration("getLayerData")
|
||||
if not layer_data:
|
||||
continue
|
||||
|
|
|
@ -119,7 +119,7 @@ class LayerView(View):
|
|||
continue
|
||||
|
||||
if not node.render(renderer):
|
||||
if node.getMeshData() and node.isVisible():
|
||||
if (node.getMeshData()) and node.isVisible():
|
||||
renderer.queueNode(node, transparent = True, shader = self._ghost_shader)
|
||||
|
||||
def setLayer(self, value):
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot, pyqtProperty
|
||||
from PyQt5.QtCore import QObject, pyqtSignal, pyqtProperty
|
||||
from UM.FlameProfiler import pyqtSlot
|
||||
from UM.Application import Application
|
||||
|
||||
import LayerView
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
# Copyright (c) 2016 Ultimaker B.V.
|
||||
# Cura is released under the terms of the AGPLv3 or higher.
|
||||
|
||||
from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot
|
||||
from PyQt5.QtCore import pyqtProperty, pyqtSignal
|
||||
from UM.FlameProfiler import pyqtSlot
|
||||
|
||||
from cura.MachineAction import MachineAction
|
||||
|
||||
|
|
|
@ -322,7 +322,7 @@ Item {
|
|||
id: settingPickDialog
|
||||
|
||||
title: catalog.i18nc("@title:window", "Select Settings to Customize for this model")
|
||||
width: screenScaleFactor * 360;
|
||||
width: Screen.devicePixelRatio * 360;
|
||||
|
||||
property string labelFilter: ""
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
# Copyright (c) 2015 Ultimaker B.V.
|
||||
# Uranium is released under the terms of the AGPLv3 or higher.
|
||||
# Cura is released under the terms of the AGPLv3 or higher.
|
||||
|
||||
import platform
|
||||
from UM.Platform import Platform
|
||||
|
||||
from UM.i18n import i18nCatalog
|
||||
catalog = i18nCatalog("cura")
|
||||
|
@ -18,15 +18,15 @@ def getMetaData():
|
|||
}
|
||||
|
||||
def register(app):
|
||||
if platform.system() == "Windows":
|
||||
if Platform.isWindows():
|
||||
from . import WindowsRemovableDrivePlugin
|
||||
return { "output_device": WindowsRemovableDrivePlugin.WindowsRemovableDrivePlugin() }
|
||||
elif platform.system() == "Darwin":
|
||||
elif Platform.isOSX():
|
||||
from . import OSXRemovableDrivePlugin
|
||||
return { "output_device": OSXRemovableDrivePlugin.OSXRemovableDrivePlugin() }
|
||||
elif platform.system() == "Linux":
|
||||
elif Platform.isLinux():
|
||||
from . import LinuxRemovableDrivePlugin
|
||||
return { "output_device": LinuxRemovableDrivePlugin.LinuxRemovableDrivePlugin() }
|
||||
else:
|
||||
Logger.log("e", "Unsupported system %s, no removable device hotplugging support available.", platform.system())
|
||||
Logger.log("e", "Unsupported system, thus no removable device hotplugging support available.")
|
||||
return { }
|
||||
|
|
|
@ -87,8 +87,10 @@ class SolidView(View):
|
|||
extruder_id = node.callDecoration("getActiveExtruder")
|
||||
if extruder_id:
|
||||
extruder_index = max(0, self._extruders_model.find("id", extruder_id))
|
||||
|
||||
try:
|
||||
material_color = self._extruders_model.getItem(extruder_index)["color"]
|
||||
except KeyError:
|
||||
material_color = self._extruders_model.defaultColors[0]
|
||||
|
||||
if extruder_index != ExtruderManager.getInstance().activeExtruderIndex:
|
||||
# Shade objects that are printed with the non-active extruder 25% darker
|
||||
|
|
|
@ -1016,7 +1016,7 @@ class NetworkPrinterOutputDevice(PrinterOutputDevice):
|
|||
|
||||
## Let the user decide if the hotends and/or material should be synced with the printer
|
||||
def materialHotendChangedMessage(self, callback):
|
||||
Application.getInstance().messageBox(i18n_catalog.i18nc("@window:title", "Changes on the Printer"),
|
||||
Application.getInstance().messageBox(i18n_catalog.i18nc("@window:title", "Sync with your printer"),
|
||||
i18n_catalog.i18nc("@label",
|
||||
"Would you like to use your current printer configuration in Cura?"),
|
||||
i18n_catalog.i18nc("@label",
|
||||
|
|
|
@ -313,6 +313,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
|
|||
if self._serial is None:
|
||||
try:
|
||||
self._serial = serial.Serial(str(self._serial_port), baud_rate, timeout = 3, writeTimeout = 10000)
|
||||
time.sleep(10)
|
||||
except serial.SerialException:
|
||||
Logger.log("d", "Could not open port %s" % self._serial_port)
|
||||
continue
|
||||
|
@ -468,7 +469,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
|
|||
break # None is only returned when something went wrong. Stop listening
|
||||
|
||||
if time.time() > temperature_request_timeout:
|
||||
if self._num_extruders > 0:
|
||||
if self._num_extruders > 1:
|
||||
self._temperature_requested_extruder_index = (self._temperature_requested_extruder_index + 1) % self._num_extruders
|
||||
self.sendCommand("M105 T%d" % (self._temperature_requested_extruder_index))
|
||||
else:
|
||||
|
@ -524,7 +525,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
|
|||
|
||||
# Request the temperature on comm timeout (every 2 seconds) when we are not printing.)
|
||||
if line == b"":
|
||||
if self._num_extruders > 0:
|
||||
if self._num_extruders > 1:
|
||||
self._temperature_requested_extruder_index = (self._temperature_requested_extruder_index + 1) % self._num_extruders
|
||||
self.sendCommand("M105 T%d" % self._temperature_requested_extruder_index)
|
||||
else:
|
||||
|
|
|
@ -43,8 +43,8 @@ class Stk500v2(ispBase.IspBase):
|
|||
|
||||
self.serial.flushInput()
|
||||
self.serial.flushOutput()
|
||||
try:
|
||||
if self.sendMessage([0x10, 0xc8, 0x64, 0x19, 0x20, 0x00, 0x53, 0x03, 0xac, 0x53, 0x00, 0x00]) != [0x10, 0x00]:
|
||||
self.close()
|
||||
raise ispBase.IspError("Failed to enter programming mode")
|
||||
|
||||
self.sendMessage([0x06, 0x80, 0x00, 0x00, 0x00])
|
||||
|
@ -52,6 +52,9 @@ class Stk500v2(ispBase.IspBase):
|
|||
self._has_checksum = True
|
||||
else:
|
||||
self._has_checksum = False
|
||||
except ispBase.IspError:
|
||||
self.close()
|
||||
raise
|
||||
self.serial.timeout = 5
|
||||
|
||||
def close(self):
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
from cura.MachineAction import MachineAction
|
||||
from cura.PrinterOutputDevice import PrinterOutputDevice
|
||||
|
||||
from PyQt5.QtCore import pyqtSlot
|
||||
from UM.FlameProfiler import pyqtSlot
|
||||
|
||||
from UM.Application import Application
|
||||
from UM.i18n import i18nCatalog
|
||||
|
|
|
@ -8,6 +8,7 @@ import io
|
|||
|
||||
from UM.Resources import Resources
|
||||
from UM.VersionUpgrade import VersionUpgrade # Superclass of the plugin.
|
||||
import UM.VersionUpgrade
|
||||
|
||||
class VersionUpgrade22to24(VersionUpgrade):
|
||||
|
||||
|
@ -19,6 +20,10 @@ class VersionUpgrade22to24(VersionUpgrade):
|
|||
|
||||
config = configparser.ConfigParser(interpolation = None)
|
||||
config.read_string(serialised) # Read the input string as config file.
|
||||
if config.get("metadata", "type") == "definition_changes":
|
||||
# This is not a container stack, don't upgrade it here
|
||||
return
|
||||
|
||||
config.set("general", "version", "3")
|
||||
|
||||
container_list = []
|
||||
|
@ -44,9 +49,11 @@ class VersionUpgrade22to24(VersionUpgrade):
|
|||
# Change the name of variant and insert empty_variant into the stack.
|
||||
new_container_list = []
|
||||
for item in container_list:
|
||||
if not item: # the last item may be an empty string
|
||||
continue
|
||||
if item == variant_name:
|
||||
new_container_list.append(config_name)
|
||||
new_container_list.append("empty_variant")
|
||||
new_container_list.append(config_name)
|
||||
else:
|
||||
new_container_list.append(item)
|
||||
|
||||
|
@ -58,7 +65,7 @@ class VersionUpgrade22to24(VersionUpgrade):
|
|||
config.remove_option("general", "containers")
|
||||
|
||||
for index in range(len(container_list)):
|
||||
config.set("containers", index, container_list[index])
|
||||
config.set("containers", str(index), container_list[index])
|
||||
|
||||
output = io.StringIO()
|
||||
config.write(output)
|
||||
|
@ -114,6 +121,26 @@ class VersionUpgrade22to24(VersionUpgrade):
|
|||
config.write(output)
|
||||
return [filename], [output.getvalue()]
|
||||
|
||||
def upgradePreferences(self, serialised, filename):
|
||||
config = configparser.ConfigParser(interpolation = None)
|
||||
config.read_string(serialised)
|
||||
|
||||
if not config.has_section("general"):
|
||||
raise UM.VersionUpgrade.FormatException("No \"general\" section.")
|
||||
|
||||
# Make z_seam_x and z_seam_y options visible. In a clean 2.4 they are visible by default.
|
||||
if config.has_option("general", "visible_settings"):
|
||||
visible_settings = config.get("general", "visible_settings")
|
||||
visible_set = set(visible_settings.split(";"))
|
||||
visible_set.add("z_seam_x")
|
||||
visible_set.add("z_seam_y")
|
||||
config.set("general", "visible_settings", ";".join(visible_set))
|
||||
config.set("general", "version", value="4")
|
||||
|
||||
output = io.StringIO()
|
||||
config.write(output)
|
||||
return [filename], [output.getvalue()]
|
||||
|
||||
def getCfgVersion(self, serialised):
|
||||
parser = configparser.ConfigParser(interpolation = None)
|
||||
parser.read_string(serialised)
|
||||
|
|
|
@ -20,7 +20,9 @@ def getMetaData():
|
|||
"version_upgrade": {
|
||||
# From To Upgrade function
|
||||
("machine_instance", 2): ("machine_stack", 3, upgrade.upgradeMachineInstance),
|
||||
("extruder_train", 2): ("extruder_train", 3, upgrade.upgradeExtruderTrain)
|
||||
("extruder_train", 2): ("extruder_train", 3, upgrade.upgradeExtruderTrain),
|
||||
("preferences", 3): ("preferences", 4, upgrade.upgradePreferences)
|
||||
|
||||
},
|
||||
"sources": {
|
||||
"machine_stack": {
|
||||
|
|
|
@ -1,15 +1,17 @@
|
|||
# Contributed by Seva Alekseyev <sevaa@nih.gov> with National Institutes of Health, 2016
|
||||
# Cura is released under the terms of the AGPLv3 or higher.
|
||||
|
||||
from UM.Mesh.MeshReader import MeshReader
|
||||
from UM.Mesh.MeshBuilder import MeshBuilder
|
||||
from math import pi, sin, cos, sqrt
|
||||
|
||||
import numpy
|
||||
|
||||
from UM.Job import Job
|
||||
from UM.Logger import Logger
|
||||
from UM.Math.Matrix import Matrix
|
||||
from UM.Math.Vector import Vector
|
||||
from UM.Mesh.MeshBuilder import MeshBuilder
|
||||
from UM.Mesh.MeshReader import MeshReader
|
||||
from UM.Scene.SceneNode import SceneNode
|
||||
from UM.Job import Job
|
||||
from math import pi, sin, cos, sqrt
|
||||
import numpy
|
||||
|
||||
try:
|
||||
import xml.etree.cElementTree as ET
|
||||
|
|
|
@ -593,6 +593,8 @@ class XmlMaterialProfile(InstanceContainer):
|
|||
# Map XML file product names to internal ids
|
||||
# TODO: Move this to definition's metadata
|
||||
__product_id_map = {
|
||||
"Ultimaker 3": "ultimaker3",
|
||||
"Ultimaker 3 Extended": "ultimaker3_extended",
|
||||
"Ultimaker 2": "ultimaker2",
|
||||
"Ultimaker 2+": "ultimaker2_plus",
|
||||
"Ultimaker 2 Go": "ultimaker2_go",
|
||||
|
|
58
resources/definitions/101Hero.def.json
Normal file
58
resources/definitions/101Hero.def.json
Normal file
|
@ -0,0 +1,58 @@
|
|||
{
|
||||
"id": "101Hero",
|
||||
"version": 2,
|
||||
"name": "101Hero",
|
||||
"inherits": "fdmprinter",
|
||||
"metadata": {
|
||||
"visible": true,
|
||||
"author": "rikky",
|
||||
"manufacturer": "101Hero",
|
||||
"category": "Other",
|
||||
"machine_extruder_trains":
|
||||
{
|
||||
"0": "fdmextruder"
|
||||
},
|
||||
"file_formats": "text/x-gcode",
|
||||
"supports_usb_connection": true
|
||||
},
|
||||
|
||||
"overrides": {
|
||||
"machine_name": { "default_value": "101Hero" },
|
||||
"machine_shape": { "default_value": "elliptic"},
|
||||
"machine_heated_bed": { "default_value": false },
|
||||
"machine_width": { "default_value": 149.86 },
|
||||
"machine_depth": { "default_value": 149.86 },
|
||||
"machine_height": { "default_value": 99.822 },
|
||||
"machine_center_is_zero": { "default_value": true },
|
||||
"layer_height": { "default_value": 0.2 },
|
||||
"machine_nozzle_size": { "default_value": 0.4 },
|
||||
"material_diameter": { "default_value": 1.75 },
|
||||
"machine_nozzle_heat_up_speed": { "default_value": 2 },
|
||||
"machine_nozzle_cool_down_speed": { "default_value": 2 },
|
||||
"machine_head_with_fans_polygon": {
|
||||
"default_value": [
|
||||
[ 0, 0 ],
|
||||
[ 0, 0 ],
|
||||
[ 0, 0 ],
|
||||
[ 0, 0 ]
|
||||
]
|
||||
},
|
||||
"speed_print": { "default_value": 14 },
|
||||
"speed_travel": { "value": "speed_print" },
|
||||
"speed_infill": { "default_value": 14 },
|
||||
"speed_wall": { "value": "speed_print * 0.7" },
|
||||
"speed_topbottom": { "value": "speed_print * 0.7" },
|
||||
"speed_layer_0": { "value": "speed_print * 0.7" },
|
||||
"gantry_height": { "default_value": 0 },
|
||||
"retraction_speed": { "default_value" : 10 },
|
||||
"retraction_amount": { "default_value" : 2.5 },
|
||||
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
|
||||
|
||||
"machine_start_gcode": {
|
||||
"default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 Z0 ;home Z\nG1 Z15.0 F840\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F840\n;Put printing message on LCD screen\nM117 Printing...\n"
|
||||
},
|
||||
"machine_end_gcode": {
|
||||
"default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit\nG1 Z0.5 E-5 F840 ;move Z up a bit and retract even more\nG28 X0 Y0 ;home X/Y, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -30,6 +30,7 @@
|
|||
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
|
||||
"machine_depth": { "default_value": 150 },
|
||||
"machine_width": { "default_value": 150 },
|
||||
"machine_name": { "default_value": "DeltaBot style" }
|
||||
"machine_name": { "default_value": "DeltaBot style" },
|
||||
"machine_shape": { "default_value": "elliptic"}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -890,6 +890,21 @@
|
|||
"default_value": "lines",
|
||||
"settable_per_mesh": true
|
||||
},
|
||||
"top_bottom_pattern_0":
|
||||
{
|
||||
"label": "Bottom Pattern Initial Layer",
|
||||
"description": "The pattern on the bottom of the print on the first layer.",
|
||||
"type": "enum",
|
||||
"options":
|
||||
{
|
||||
"lines": "Lines",
|
||||
"concentric": "Concentric",
|
||||
"zigzag": "Zig Zag"
|
||||
},
|
||||
"default_value": "lines",
|
||||
"value": "top_bottom_pattern",
|
||||
"settable_per_mesh": true
|
||||
},
|
||||
"wall_0_inset":
|
||||
{
|
||||
"label": "Outer Wall Inset",
|
||||
|
@ -1190,7 +1205,7 @@
|
|||
"type": "int",
|
||||
"minimum_value": "0",
|
||||
"maximum_value_warning": "4",
|
||||
"maximum_value": "20 - math.log(infill_line_distance) / math.log(2)",
|
||||
"maximum_value": "(20 - math.log(infill_line_distance) / math.log(2)) if infill_line_distance > 0 else 0",
|
||||
"enabled": "infill_sparse_density > 0 and infill_pattern != 'cubicsubdiv'",
|
||||
"settable_per_mesh": true
|
||||
},
|
||||
|
@ -2800,7 +2815,7 @@
|
|||
"support_z_distance":
|
||||
{
|
||||
"label": "Support Z Distance",
|
||||
"description": "Distance from the top/bottom of the support structure to the print. This gap provides clearance to remove the supports after the model is printed. This value is rounded down to a multiple of the layer height.",
|
||||
"description": "Distance from the top/bottom of the support structure to the print. This gap provides clearance to remove the supports after the model is printed. This value is rounded up to a multiple of the layer height.",
|
||||
"unit": "mm",
|
||||
"type": "float",
|
||||
"minimum_value": "0",
|
||||
|
@ -3113,8 +3128,8 @@
|
|||
"type": "float",
|
||||
"unit": "mm",
|
||||
"default_value": 0,
|
||||
"minimum_value_warning": "0",
|
||||
"maximum_value_warning": "machine_width",
|
||||
"minimum_value_warning": "machine_width / -2 if machine_center_is_zero else 0",
|
||||
"maximum_value_warning": "machine_width / 2 if machine_center_is_zero else machine_width",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true,
|
||||
"enabled": false
|
||||
|
@ -3126,8 +3141,8 @@
|
|||
"type": "float",
|
||||
"unit": "mm",
|
||||
"default_value": 0,
|
||||
"minimum_value_warning": "0",
|
||||
"maximum_value_warning": "machine_depth",
|
||||
"minimum_value_warning": "machine_depth / -2 if machine_center_is_zero else 0",
|
||||
"maximum_value_warning": "machine_depth / 2 if machine_center_is_zero else machine_depth",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true,
|
||||
"enabled": false
|
||||
|
@ -3755,7 +3770,7 @@
|
|||
"unit": "mm",
|
||||
"type": "float",
|
||||
"default_value": 2,
|
||||
"value": "max(2 * min(extruderValues('prime_tower_line_width')), 0.5 * (resolveOrValue('prime_tower_size') - math.sqrt(resolveOrValue('prime_tower_size') ** 2 - max(extruderValues('prime_tower_min_volume')) / resolveOrValue('layer_height'))))",
|
||||
"value": "max(2 * min(extruderValues('prime_tower_line_width')), 0.5 * (resolveOrValue('prime_tower_size') - math.sqrt(max(0, resolveOrValue('prime_tower_size') ** 2 - max(extruderValues('prime_tower_min_volume')) / resolveOrValue('layer_height')))))",
|
||||
"resolve": "max(extruderValues('prime_tower_wall_thickness'))",
|
||||
"minimum_value": "0.001",
|
||||
"minimum_value_warning": "2 * min(extruderValues('prime_tower_line_width'))",
|
||||
|
@ -3776,8 +3791,8 @@
|
|||
"default_value": 200,
|
||||
"minimum_value_warning": "-1000",
|
||||
"maximum_value_warning": "1000",
|
||||
"maximum_value": "machine_width - 0.5 * resolveOrValue('prime_tower_size')",
|
||||
"minimum_value": "0.5 * resolveOrValue('prime_tower_size')",
|
||||
"maximum_value": "machine_width / 2 if machine_center_is_zero else machine_width",
|
||||
"minimum_value": "resolveOrValue('prime_tower_size') - machine_width / 2 if machine_center_is_zero else resolveOrValue('prime_tower_size')",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": false
|
||||
},
|
||||
|
@ -3791,8 +3806,10 @@
|
|||
"default_value": 200,
|
||||
"minimum_value_warning": "-1000",
|
||||
"maximum_value_warning": "1000",
|
||||
"maximum_value": "machine_depth - 0.5 * resolveOrValue('prime_tower_size')",
|
||||
"minimum_value": "0.5 * resolveOrValue('prime_tower_size')",
|
||||
"maximum_value": "machine_depth - resolveOrValue('prime_tower_size')",
|
||||
"minimum_value": "0",
|
||||
"maximum_value": "machine_depth / 2 - resolveOrValue('prime_tower_size') if machine_center_is_zero else machine_depth - resolveOrValue('prime_tower_size')",
|
||||
"minimum_value": "machine_depth / -2 if machine_center_is_zero else 0",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": false
|
||||
},
|
||||
|
@ -3804,6 +3821,7 @@
|
|||
"unit": "%",
|
||||
"enabled": "resolveOrValue('prime_tower_enable')",
|
||||
"default_value": 100,
|
||||
"value": "material_flow",
|
||||
"minimum_value": "0.0001",
|
||||
"minimum_value_warning": "50",
|
||||
"maximum_value_warning": "150",
|
||||
|
|
|
@ -10,7 +10,8 @@
|
|||
"category": "Other",
|
||||
"file_formats": "text/x-gcode",
|
||||
"icon": "icon_ultimaker2",
|
||||
"platform": "kossel_platform.stl"
|
||||
"platform": "kossel_platform.stl",
|
||||
"platform_offset": [0, -0.25, 0]
|
||||
},
|
||||
|
||||
"overrides": {
|
||||
|
@ -50,18 +51,8 @@
|
|||
"machine_end_gcode": {
|
||||
"default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG28 ;Home all axes (max endstops)\nM84 ;steppers off\nG90 ;absolute positioning"
|
||||
},
|
||||
"machine_disallowed_areas": {
|
||||
"default_value": [
|
||||
[[-34, -85], [ -85, -85], [-70, -70]],
|
||||
[[-85, -85], [-85, -34], [-70, -70]],
|
||||
[[34, -85], [ 85, -85], [70, -70]],
|
||||
[[85, -85], [85, -34], [70, -70]],
|
||||
[[-34, 85], [ -85, 85], [-70, 70]],
|
||||
[[-85, 85], [-85, 34], [-70, 70]],
|
||||
[[34, 85], [ 85, 85], [70, 70]],
|
||||
[[85, 85], [85, 34], [70, 70]]
|
||||
]
|
||||
"machine_shape": {
|
||||
"default_value": "elliptic"
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,7 +10,8 @@
|
|||
"category": "Other",
|
||||
"file_formats": "text/x-gcode",
|
||||
"icon": "icon_ultimaker2",
|
||||
"platform": "kossel_pro_build_platform.stl"
|
||||
"platform": "kossel_pro_build_platform.stl",
|
||||
"platform_offset": [0, -0.25, 0]
|
||||
},
|
||||
"overrides": {
|
||||
"machine_heated_bed": {
|
||||
|
@ -49,8 +50,8 @@
|
|||
"machine_end_gcode": {
|
||||
"default_value": "M104 S0 ; turn off temperature\nM140 S0 ; turn off bed\nG28 ; home all axes\nM84 ; disable motors\n"
|
||||
},
|
||||
"machine_disallowed_areas": {
|
||||
"default_value": [[[125.0, 125.0], [125.0, 0.0], [120.741, 32.352]], [[-125.0, 125.0], [-125.0, 0.0], [-120.741, 32.352]], [[125.0, -125.0], [125.0, -0.0], [120.741, -32.352]], [[-125.0, -125.0], [-125.0, -0.0], [-120.741, -32.352]], [[125.0, 125.0], [120.741, 32.352], [108.253, 62.5]], [[-125.0, 125.0], [-120.741, 32.352], [-108.253, 62.5]], [[125.0, -125.0], [120.741, -32.352], [108.253, -62.5]], [[-125.0, -125.0], [-120.741, -32.352], [-108.253, -62.5]], [[125.0, 125.0], [108.253, 62.5], [88.388, 88.388]], [[-125.0, 125.0], [-108.253, 62.5], [-88.388, 88.388]], [[125.0, -125.0], [108.253, -62.5], [88.388, -88.388]], [[-125.0, -125.0], [-108.253, -62.5], [-88.388, -88.388]], [[125.0, 125.0], [88.388, 88.388], [62.5, 108.253]], [[-125.0, 125.0], [-88.388, 88.388], [-62.5, 108.253]], [[125.0, -125.0], [88.388, -88.388], [62.5, -108.253]], [[-125.0, -125.0], [-88.388, -88.388], [-62.5, -108.253]], [[125.0, 125.0], [62.5, 108.253], [32.352, 120.741]], [[-125.0, 125.0], [-62.5, 108.253], [-32.352, 120.741]], [[125.0, -125.0], [62.5, -108.253], [32.352, -120.741]], [[-125.0, -125.0], [-62.5, -108.253], [-32.352, -120.741]], [[125.0, 125.0], [32.352, 120.741], [0.0, 125.0]], [[-125.0, 125.0], [-32.352, 120.741], [-0.0, 125.0]], [[125.0, -125.0], [32.352, -120.741], [0.0, -125.0]], [[-125.0, -125.0], [-32.352, -120.741], [-0.0, -125.0]]]
|
||||
"machine_shape": {
|
||||
"default_value": "elliptic"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -26,10 +26,10 @@
|
|||
"machine_nozzle_cool_down_speed": { "default_value": 2 },
|
||||
"machine_head_with_fans_polygon": {
|
||||
"default_value": [
|
||||
[ 55, -20 ],
|
||||
[ 55, 99999 ],
|
||||
[ -49, 99999 ],
|
||||
[ -49, -20 ]
|
||||
[-49, 20],
|
||||
[-49, -99999],
|
||||
[55, 20],
|
||||
[55, -99999]
|
||||
]
|
||||
},
|
||||
"gantry_height": { "default_value": 99999 },
|
||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -3,10 +3,11 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: Uranium json setting files\n"
|
||||
"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n"
|
||||
"POT-Creation-Date: 2016-09-20 17:35+0000\n"
|
||||
"POT-Creation-Date: 2016-12-28 10:51+0000\n"
|
||||
"PO-Revision-Date: 2016-09-29 13:02+0200\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
@ -68,9 +69,7 @@ msgstr "Absolute Startposition des Extruders"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_start_pos_abs description"
|
||||
msgid ""
|
||||
"Make the extruder starting position absolute rather than relative to the "
|
||||
"last-known location of the head."
|
||||
msgid "Make the extruder starting position absolute rather than relative to the last-known location of the head."
|
||||
msgstr "Bevorzugen Sie eine absolute Startposition des Extruders anstelle einer relativen Position zur zuletzt bekannten Kopfposition."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
|
@ -110,9 +109,7 @@ msgstr "Absolute Extruder-Endposition"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_end_pos_abs description"
|
||||
msgid ""
|
||||
"Make the extruder ending position absolute rather than relative to the last-"
|
||||
"known location of the head."
|
||||
msgid "Make the extruder ending position absolute rather than relative to the last-known location of the head."
|
||||
msgstr "Bevorzugen Sie eine absolute Endposition des Extruders anstelle einer relativen Position zur zuletzt bekannten Kopfposition."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
|
@ -142,9 +139,7 @@ msgstr "Z-Position Extruder-Einzug"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "extruder_prime_pos_z description"
|
||||
msgid ""
|
||||
"The Z coordinate of the position where the nozzle primes at the start of "
|
||||
"printing."
|
||||
msgid "The Z coordinate of the position where the nozzle primes at the start of printing."
|
||||
msgstr "Die Z-Koordinate der Position, an der die Düse am Druckbeginn einzieht."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
|
@ -164,9 +159,7 @@ msgstr "X-Position Extruder-Einzug"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "extruder_prime_pos_x description"
|
||||
msgid ""
|
||||
"The X coordinate of the position where the nozzle primes at the start of "
|
||||
"printing."
|
||||
msgid "The X coordinate of the position where the nozzle primes at the start of printing."
|
||||
msgstr "Die X-Koordinate der Position, an der die Düse am Druckbeginn einzieht."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
|
@ -176,7 +169,5 @@ msgstr "Y-Position Extruder-Einzug"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "extruder_prime_pos_y description"
|
||||
msgid ""
|
||||
"The Y coordinate of the position where the nozzle primes at the start of "
|
||||
"printing."
|
||||
msgid "The Y coordinate of the position where the nozzle primes at the start of printing."
|
||||
msgstr "Die Y-Koordinate der Position, an der die Düse am Druckbeginn einzieht."
|
||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -3,10 +3,11 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: Uranium json setting files\n"
|
||||
"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n"
|
||||
"POT-Creation-Date: 2016-09-20 17:35+0000\n"
|
||||
"POT-Creation-Date: 2016-12-28 10:51+0000\n"
|
||||
"PO-Revision-Date: 2016-09-29 13:02+0200\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
@ -68,9 +69,7 @@ msgstr "Posición de inicio absoluta del extrusor"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_start_pos_abs description"
|
||||
msgid ""
|
||||
"Make the extruder starting position absolute rather than relative to the "
|
||||
"last-known location of the head."
|
||||
msgid "Make the extruder starting position absolute rather than relative to the last-known location of the head."
|
||||
msgstr "El extrusor se coloca en la posición de inicio absoluta según la última ubicación conocida del cabezal."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
|
@ -110,9 +109,7 @@ msgstr "Posición final absoluta del extrusor"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_end_pos_abs description"
|
||||
msgid ""
|
||||
"Make the extruder ending position absolute rather than relative to the last-"
|
||||
"known location of the head."
|
||||
msgid "Make the extruder ending position absolute rather than relative to the last-known location of the head."
|
||||
msgstr "La posición final del extrusor se considera absoluta, en lugar de relativa a la última ubicación conocida del cabezal."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
|
@ -142,9 +139,7 @@ msgstr "Posición de preparación del extrusor sobre el eje Z"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "extruder_prime_pos_z description"
|
||||
msgid ""
|
||||
"The Z coordinate of the position where the nozzle primes at the start of "
|
||||
"printing."
|
||||
msgid "The Z coordinate of the position where the nozzle primes at the start of printing."
|
||||
msgstr "Coordenada Z de la posición en la que la tobera queda preparada al inicio de la impresión."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
|
@ -164,9 +159,7 @@ msgstr "Posición de preparación del extrusor sobre el eje X"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "extruder_prime_pos_x description"
|
||||
msgid ""
|
||||
"The X coordinate of the position where the nozzle primes at the start of "
|
||||
"printing."
|
||||
msgid "The X coordinate of the position where the nozzle primes at the start of printing."
|
||||
msgstr "Coordenada X de la posición en la que la tobera se coloca al inicio de la impresión."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
|
@ -176,7 +169,5 @@ msgstr "Posición de preparación del extrusor sobre el eje Y"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "extruder_prime_pos_y description"
|
||||
msgid ""
|
||||
"The Y coordinate of the position where the nozzle primes at the start of "
|
||||
"printing."
|
||||
msgid "The Y coordinate of the position where the nozzle primes at the start of printing."
|
||||
msgstr "Coordenada X de la posición en la que la tobera se coloca al inicio de la impresión."
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -3,7 +3,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: Uranium json setting files\n"
|
||||
"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n"
|
||||
"POT-Creation-Date: 2016-10-27 11:28+0000\n"
|
||||
"POT-Creation-Date: 2016-12-28 10:51+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE\n"
|
||||
|
|
|
@ -3,7 +3,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: Uranium json setting files\n"
|
||||
"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n"
|
||||
"POT-Creation-Date: 2016-10-27 11:28+0000\n"
|
||||
"POT-Creation-Date: 2016-12-28 10:51+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE\n"
|
||||
|
@ -145,6 +145,27 @@ msgctxt "machine_depth description"
|
|||
msgid "The depth (Y-direction) of the printable area."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "machine_shape label"
|
||||
msgid "Build plate shape"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "machine_shape description"
|
||||
msgid ""
|
||||
"The shape of the build plate without taking unprintable areas into account."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "machine_shape option rectangular"
|
||||
msgid "Rectangular"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "machine_shape option elliptic"
|
||||
msgid "Elliptic"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "machine_height label"
|
||||
msgid "Machine height"
|
||||
|
@ -179,7 +200,7 @@ msgstr ""
|
|||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "machine_extruder_count label"
|
||||
msgid "Number extruders"
|
||||
msgid "Number of Extruders"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
|
@ -232,7 +253,19 @@ msgstr ""
|
|||
msgctxt "machine_heat_zone_length description"
|
||||
msgid ""
|
||||
"The distance from the tip of the nozzle in which heat from the nozzle is "
|
||||
"transfered to the filament."
|
||||
"transferred to the filament."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "machine_filament_park_distance label"
|
||||
msgid "Filament Park Distance"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "machine_filament_park_distance description"
|
||||
msgid ""
|
||||
"The distance from the tip of the nozzle where to park the filament when an "
|
||||
"extruder is no longer used."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
|
@ -332,6 +365,16 @@ msgctxt "machine_disallowed_areas description"
|
|||
msgid "A list of polygons with areas the print head is not allowed to enter."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "nozzle_disallowed_areas label"
|
||||
msgid "Nozzle Disallowed Areas"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "nozzle_disallowed_areas description"
|
||||
msgid "A list of polygons with areas the nozzle is not allowed to enter."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "machine_head_polygon label"
|
||||
msgid "Machine head polygon"
|
||||
|
@ -716,6 +759,18 @@ msgid ""
|
|||
"rounded to a whole number."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "wall_0_wipe_dist label"
|
||||
msgid "Outer Wall Wipe Distance"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "wall_0_wipe_dist description"
|
||||
msgid ""
|
||||
"Distance of a travel move inserted after the outer wall, to hide the Z seam "
|
||||
"better."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "top_bottom_thickness label"
|
||||
msgid "Top/Bottom Thickness"
|
||||
|
@ -877,6 +932,26 @@ msgid ""
|
|||
"already a wall in place."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "fill_perimeter_gaps label"
|
||||
msgid "Fill Gaps Between Walls"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "fill_perimeter_gaps description"
|
||||
msgid "Fills the gaps between walls where no walls fit."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "fill_perimeter_gaps option nowhere"
|
||||
msgid "Nowhere"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "fill_perimeter_gaps option everywhere"
|
||||
msgid "Everywhere"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "xy_offset label"
|
||||
msgid "Horizontal Expansion"
|
||||
|
@ -900,14 +975,14 @@ msgctxt "z_seam_type description"
|
|||
msgid ""
|
||||
"Starting point of each path in a layer. When paths in consecutive layers "
|
||||
"start at the same point a vertical seam may show on the print. When aligning "
|
||||
"these at the back, the seam is easiest to remove. When placed randomly the "
|
||||
"inaccuracies at the paths' start will be less noticeable. When taking the "
|
||||
"shortest path the print will be quicker."
|
||||
"these near a user specified location, the seam is easiest to remove. When "
|
||||
"placed randomly the inaccuracies at the paths' start will be less "
|
||||
"noticeable. When taking the shortest path the print will be quicker."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "z_seam_type option back"
|
||||
msgid "Back"
|
||||
msgid "User Specified"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
|
@ -920,6 +995,30 @@ msgctxt "z_seam_type option random"
|
|||
msgid "Random"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "z_seam_x label"
|
||||
msgid "Z Seam X"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "z_seam_x description"
|
||||
msgid ""
|
||||
"The X coordinate of the position near where to start printing each part in a "
|
||||
"layer."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "z_seam_y label"
|
||||
msgid "Z Seam Y"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "z_seam_y description"
|
||||
msgid ""
|
||||
"The Y coordinate of the position near where to start printing each part in a "
|
||||
"layer."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "skin_no_small_gaps_heuristic label"
|
||||
msgid "Ignore Small Z Gaps"
|
||||
|
@ -1000,6 +1099,11 @@ msgctxt "infill_pattern option cubic"
|
|||
msgid "Cubic"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "infill_pattern option cubicsubdiv"
|
||||
msgid "Cubic Subdivision"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "infill_pattern option tetrahedral"
|
||||
msgid "Tetrahedral"
|
||||
|
@ -1010,11 +1114,43 @@ msgctxt "infill_pattern option concentric"
|
|||
msgid "Concentric"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "infill_pattern option concentric_3d"
|
||||
msgid "Concentric 3D"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "infill_pattern option zigzag"
|
||||
msgid "Zig Zag"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "sub_div_rad_mult label"
|
||||
msgid "Cubic Subdivision Radius"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "sub_div_rad_mult description"
|
||||
msgid ""
|
||||
"A multiplier on the radius from the center of each cube to check for the "
|
||||
"boundary of the model, as to decide whether this cube should be subdivided. "
|
||||
"Larger values lead to more subdivisions, i.e. more small cubes."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "sub_div_rad_add label"
|
||||
msgid "Cubic Subdivision Shell"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "sub_div_rad_add description"
|
||||
msgid ""
|
||||
"An addition to the radius from the center of each cube to check for the "
|
||||
"boundary of the model, as to decide whether this cube should be subdivided. "
|
||||
"Larger values lead to a thicker shell of small cubes near the boundary of "
|
||||
"the model."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "infill_overlap label"
|
||||
msgid "Infill Overlap Percentage"
|
||||
|
@ -1148,6 +1284,19 @@ msgid ""
|
|||
"speed of that layer."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "default_material_print_temperature label"
|
||||
msgid "Default Printing Temperature"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "default_material_print_temperature description"
|
||||
msgid ""
|
||||
"The default temperature used for printing. This should be the \"base\" "
|
||||
"temperature of a material. All other print temperatures should use offsets "
|
||||
"based on this value"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "material_print_temperature label"
|
||||
msgid "Printing Temperature"
|
||||
|
@ -1159,6 +1308,42 @@ msgid ""
|
|||
"The temperature used for printing. Set at 0 to pre-heat the printer manually."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "material_print_temperature_layer_0 label"
|
||||
msgid "Printing Temperature Initial Layer"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "material_print_temperature_layer_0 description"
|
||||
msgid ""
|
||||
"The temperature used for printing the first layer. Set at 0 to disable "
|
||||
"special handling of the initial layer."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "material_initial_print_temperature label"
|
||||
msgid "Initial Printing Temperature"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "material_initial_print_temperature description"
|
||||
msgid ""
|
||||
"The minimal temperature while heating up to the Printing Temperature at "
|
||||
"which printing can already start."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "material_final_print_temperature label"
|
||||
msgid "Final Printing Temperature"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "material_final_print_temperature description"
|
||||
msgid ""
|
||||
"The temperature to which to already start cooling down just before the end "
|
||||
"of printing."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "material_flow_temp_graph label"
|
||||
msgid "Flow Temperature Graph"
|
||||
|
@ -1195,6 +1380,16 @@ msgid ""
|
|||
"printer manually."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "material_bed_temperature_layer_0 label"
|
||||
msgid "Build Plate Temperature Initial Layer"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "material_bed_temperature_layer_0 description"
|
||||
msgid "The temperature used for the heated build plate at the first layer."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "material_diameter label"
|
||||
msgid "Diameter"
|
||||
|
@ -1230,6 +1425,16 @@ msgid ""
|
|||
"Retract the filament when the nozzle is moving over a non-printed area. "
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "retract_at_layer_change label"
|
||||
msgid "Retract at Layer Change"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "retract_at_layer_change description"
|
||||
msgid "Retract the filament when the nozzle is moving to the next layer."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "retraction_amount label"
|
||||
msgid "Retraction Distance"
|
||||
|
@ -1553,7 +1758,9 @@ msgstr ""
|
|||
msgctxt "speed_travel_layer_0 description"
|
||||
msgid ""
|
||||
"The speed of travel moves in the initial layer. A lower value is advised to "
|
||||
"prevent pulling previously printed parts away from the build plate."
|
||||
"prevent pulling previously printed parts away from the build plate. The "
|
||||
"value of this setting can automatically be calculated from the ratio between "
|
||||
"the Travel Speed and the Print Speed."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
|
@ -1991,9 +2198,7 @@ msgid ""
|
|||
"results in slightly longer travel moves but reduces the need for "
|
||||
"retractions. If combing is off, the material will retract and the nozzle "
|
||||
"moves in a straight line to the next point. It is also possible to avoid "
|
||||
"combing over top/bottom skin areas by combing within the infill only. It is "
|
||||
"also possible to avoid combing over top/bottom skin areas by combing within "
|
||||
"the infill only."
|
||||
"combing over top/bottom skin areas by combing within the infill only."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
|
@ -2013,7 +2218,7 @@ msgstr ""
|
|||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "travel_avoid_other_parts label"
|
||||
msgid "Avoid Printed Parts when Traveling"
|
||||
msgid "Avoid Printed Parts When Traveling"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
|
@ -2035,9 +2240,47 @@ msgid ""
|
|||
"during travel moves."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "start_layers_at_same_position label"
|
||||
msgid "Start Layers with the Same Part"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "start_layers_at_same_position description"
|
||||
msgid ""
|
||||
"In each layer start with printing the object near the same point, so that we "
|
||||
"don't start a new layer with printing the piece which the previous layer "
|
||||
"ended with. This makes for better overhangs and small parts, but increases "
|
||||
"printing time."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "layer_start_x label"
|
||||
msgid "Layer Start X"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "layer_start_x description"
|
||||
msgid ""
|
||||
"The X coordinate of the position near where to find the part to start "
|
||||
"printing each layer."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "layer_start_y label"
|
||||
msgid "Layer Start Y"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "layer_start_y description"
|
||||
msgid ""
|
||||
"The Y coordinate of the position near where to find the part to start "
|
||||
"printing each layer."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "retraction_hop_enabled label"
|
||||
msgid "Z Hop when Retracted"
|
||||
msgid "Z Hop When Retracted"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
|
@ -2156,6 +2399,19 @@ msgid ""
|
|||
"maximum fan speed."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "cool_fan_speed_0 label"
|
||||
msgid "Initial Fan Speed"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "cool_fan_speed_0 description"
|
||||
msgid ""
|
||||
"The speed at which the fans spin at the start of the print. In subsequent "
|
||||
"layers the fan speed is gradually increased up to the layer corresponding to "
|
||||
"Regular Fan Speed at Height."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "cool_fan_full_at_height label"
|
||||
msgid "Regular Fan Speed at Height"
|
||||
|
@ -2165,7 +2421,8 @@ msgstr ""
|
|||
msgctxt "cool_fan_full_at_height description"
|
||||
msgid ""
|
||||
"The height at which the fans spin on regular fan speed. At the layers below "
|
||||
"the fan speed gradually increases from zero to regular fan speed."
|
||||
"the fan speed gradually increases from Initial Fan Speed to Regular Fan "
|
||||
"Speed."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
|
@ -2358,6 +2615,11 @@ msgctxt "support_pattern option concentric"
|
|||
msgid "Concentric"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "support_pattern option concentric_3d"
|
||||
msgid "Concentric 3D"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "support_pattern option zigzag"
|
||||
msgid "Zig Zag"
|
||||
|
@ -2635,6 +2897,11 @@ msgctxt "support_interface_pattern option concentric"
|
|||
msgid "Concentric"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "support_interface_pattern option concentric_3d"
|
||||
msgid "Concentric 3D"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "support_interface_pattern option zigzag"
|
||||
msgid "Zig Zag"
|
||||
|
@ -2751,6 +3018,11 @@ msgctxt "adhesion_type option raft"
|
|||
msgid "Raft"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "adhesion_type option none"
|
||||
msgid "None"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "adhesion_extruder_nr label"
|
||||
msgid "Build Plate Adhesion Extruder"
|
||||
|
@ -3198,6 +3470,30 @@ msgctxt "prime_tower_size description"
|
|||
msgid "The width of the prime tower."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "prime_tower_min_volume label"
|
||||
msgid "Prime Tower Minimum Volume"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "prime_tower_min_volume description"
|
||||
msgid ""
|
||||
"The minimum volume for each layer of the prime tower in order to purge "
|
||||
"enough material."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "prime_tower_wall_thickness label"
|
||||
msgid "Prime Tower Thickness"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "prime_tower_wall_thickness description"
|
||||
msgid ""
|
||||
"The thickness of the hollow prime tower. A thickness larger than half the "
|
||||
"Prime Tower Minimum Volume will result in a dense prime tower."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "prime_tower_position_x label"
|
||||
msgid "Prime Tower X Position"
|
||||
|
@ -3232,7 +3528,7 @@ msgstr ""
|
|||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "prime_tower_wipe_enabled label"
|
||||
msgid "Wipe Nozzle on Prime Tower"
|
||||
msgid "Wipe Inactive Nozzle on Prime Tower"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
|
@ -3243,15 +3539,16 @@ msgid ""
|
|||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "multiple_mesh_overlap label"
|
||||
msgid "Dual Extrusion Overlap"
|
||||
msgctxt "dual_pre_wipe label"
|
||||
msgid "Wipe Nozzle After Switch"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "multiple_mesh_overlap description"
|
||||
msgctxt "dual_pre_wipe description"
|
||||
msgid ""
|
||||
"Make the models printed with different extruder trains overlap a bit. This "
|
||||
"makes the different materials bond together better."
|
||||
"After switching extruder, wipe the oozed material off of the nozzle on the "
|
||||
"first thing printed. This performs a safe slow wipe move at a place where "
|
||||
"the oozed material causes least harm to the surface quality of your print."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
|
@ -3308,8 +3605,9 @@ msgstr ""
|
|||
#: fdmprinter.def.json
|
||||
msgctxt "meshfix_union_all description"
|
||||
msgid ""
|
||||
"Ignore the internal geometry arising from overlapping volumes and print the "
|
||||
"volumes as one. This may cause internal cavities to disappear."
|
||||
"Ignore the internal geometry arising from overlapping volumes within a mesh "
|
||||
"and print the volumes as one. This may cause unintended internal cavities to "
|
||||
"disappear."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
|
@ -3352,6 +3650,18 @@ msgid ""
|
|||
"everything else fails to produce proper GCode."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "multiple_mesh_overlap label"
|
||||
msgid "Merged Meshes Overlap"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "multiple_mesh_overlap description"
|
||||
msgid ""
|
||||
"Make meshes which are touching each other overlap a bit. This makes them "
|
||||
"bond together better."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "carve_multiple_volumes label"
|
||||
msgid "Remove Mesh Intersection"
|
||||
|
@ -3360,8 +3670,22 @@ msgstr ""
|
|||
#: fdmprinter.def.json
|
||||
msgctxt "carve_multiple_volumes description"
|
||||
msgid ""
|
||||
"Remove areas where multiple objecs are overlapping with each other. This is "
|
||||
"may be used if merged dual material objects overlap with each other."
|
||||
"Remove areas where multiple meshes are overlapping with each other. This may "
|
||||
"be used if merged dual material objects overlap with each other."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "alternate_carve_order label"
|
||||
msgid "Alternate Mesh Removal"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "alternate_carve_order description"
|
||||
msgid ""
|
||||
"Switch to which mesh intersecting volumes will belong with every layer, so "
|
||||
"that the overlapping meshes become interwoven. Turning this setting off will "
|
||||
"cause one of the meshes to obtain all of the volume in the overlap, while it "
|
||||
"is removed from the other meshes."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
|
@ -3425,6 +3749,30 @@ msgid ""
|
|||
"lower order and normal meshes."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "support_mesh label"
|
||||
msgid "Support Mesh"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "support_mesh description"
|
||||
msgid ""
|
||||
"Use this mesh to specify support areas. This can be used to generate support "
|
||||
"structure."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "anti_overhang_mesh label"
|
||||
msgid "Anti Overhang Mesh"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "anti_overhang_mesh description"
|
||||
msgid ""
|
||||
"Use this mesh to specify where no part of the model should be detected as "
|
||||
"overhang. This can be used to remove unwanted support structure."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "magic_mesh_surface_mode label"
|
||||
msgid "Surface Mode"
|
||||
|
@ -3677,6 +4025,17 @@ msgid ""
|
|||
"Small widths can lead to unstable support structures."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "infill_hollow label"
|
||||
msgid "Hollow Out Objects"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "infill_hollow description"
|
||||
msgid ""
|
||||
"Remove all infill and make the inside of the object eligible for support."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "magic_fuzzy_skin_enabled label"
|
||||
msgid "Fuzzy Skin"
|
||||
|
@ -4040,3 +4399,70 @@ msgid ""
|
|||
"which in turn results in less upward connections with the next layer. Only "
|
||||
"applies to Wire Printing."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "command_line_settings label"
|
||||
msgid "Command Line Settings"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "command_line_settings description"
|
||||
msgid ""
|
||||
"Settings which are only used if CuraEngine isn't called from the Cura "
|
||||
"frontend."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "center_object label"
|
||||
msgid "Center object"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "center_object description"
|
||||
msgid ""
|
||||
"Whether to center the object on the middle of the build platform (0,0), "
|
||||
"instead of using the coordinate system in which the object was saved."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "mesh_position_x label"
|
||||
msgid "Mesh position x"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "mesh_position_x description"
|
||||
msgid "Offset applied to the object in the x direction."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "mesh_position_y label"
|
||||
msgid "Mesh position y"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "mesh_position_y description"
|
||||
msgid "Offset applied to the object in the y direction."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "mesh_position_z label"
|
||||
msgid "Mesh position z"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "mesh_position_z description"
|
||||
msgid ""
|
||||
"Offset applied to the object in the z direction. With this you can perform "
|
||||
"what was used to be called 'Object Sink'."
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "mesh_rotation_matrix label"
|
||||
msgid "Mesh Rotation Matrix"
|
||||
msgstr ""
|
||||
|
||||
#: fdmprinter.def.json
|
||||
msgctxt "mesh_rotation_matrix description"
|
||||
msgid ""
|
||||
"Transformation matrix to be applied to the model when loading it from file."
|
||||
msgstr ""
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -3,10 +3,11 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: Uranium json setting files\n"
|
||||
"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n"
|
||||
"POT-Creation-Date: 2016-09-20 17:35+0000\n"
|
||||
"POT-Creation-Date: 2016-12-28 10:51+0000\n"
|
||||
"PO-Revision-Date: 2016-09-29 13:02+0200\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
@ -68,9 +69,7 @@ msgstr "Suulakkeen aloitussijainti absoluuttinen"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_start_pos_abs description"
|
||||
msgid ""
|
||||
"Make the extruder starting position absolute rather than relative to the "
|
||||
"last-known location of the head."
|
||||
msgid "Make the extruder starting position absolute rather than relative to the last-known location of the head."
|
||||
msgstr "Tekee suulakkeen aloitussijainnista absoluuttisen eikä suhteellisen viimeksi tunnettuun pään sijaintiin nähden."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
|
@ -110,9 +109,7 @@ msgstr "Suulakkeen lopetussijainti absoluuttinen"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_end_pos_abs description"
|
||||
msgid ""
|
||||
"Make the extruder ending position absolute rather than relative to the last-"
|
||||
"known location of the head."
|
||||
msgid "Make the extruder ending position absolute rather than relative to the last-known location of the head."
|
||||
msgstr "Tekee suulakkeen lopetussijainnista absoluuttisen eikä suhteellisen viimeksi tunnettuun pään sijaintiin nähden."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
|
@ -142,9 +139,7 @@ msgstr "Suulakkeen esitäytön Z-sijainti"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "extruder_prime_pos_z description"
|
||||
msgid ""
|
||||
"The Z coordinate of the position where the nozzle primes at the start of "
|
||||
"printing."
|
||||
msgid "The Z coordinate of the position where the nozzle primes at the start of printing."
|
||||
msgstr "Z-koordinaatti sijainnille, jossa suutin esitäytetään tulostusta aloitettaessa."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
|
@ -164,9 +159,7 @@ msgstr "Suulakkeen esitäytön X-sijainti"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "extruder_prime_pos_x description"
|
||||
msgid ""
|
||||
"The X coordinate of the position where the nozzle primes at the start of "
|
||||
"printing."
|
||||
msgid "The X coordinate of the position where the nozzle primes at the start of printing."
|
||||
msgstr "X-koordinaatti sijainnille, jossa suutin esitäytetään tulostusta aloitettaessa."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
|
@ -176,7 +169,5 @@ msgstr "Suulakkeen esitäytön Y-sijainti"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "extruder_prime_pos_y description"
|
||||
msgid ""
|
||||
"The Y coordinate of the position where the nozzle primes at the start of "
|
||||
"printing."
|
||||
msgid "The Y coordinate of the position where the nozzle primes at the start of printing."
|
||||
msgstr "Y-koordinaatti sijainnille, jossa suutin esitäytetään tulostusta aloitettaessa."
|
||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -3,10 +3,11 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: Uranium json setting files\n"
|
||||
"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n"
|
||||
"POT-Creation-Date: 2016-09-20 17:35+0000\n"
|
||||
"POT-Creation-Date: 2016-12-28 10:51+0000\n"
|
||||
"PO-Revision-Date: 2016-09-29 13:02+0200\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
@ -68,9 +69,7 @@ msgstr "Extrudeuse Position de départ absolue"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_start_pos_abs description"
|
||||
msgid ""
|
||||
"Make the extruder starting position absolute rather than relative to the "
|
||||
"last-known location of the head."
|
||||
msgid "Make the extruder starting position absolute rather than relative to the last-known location of the head."
|
||||
msgstr "Rendre la position de départ de l'extrudeuse absolue plutôt que relative à la dernière position connue de la tête."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
|
@ -110,9 +109,7 @@ msgstr "Extrudeuse Position de fin absolue"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_end_pos_abs description"
|
||||
msgid ""
|
||||
"Make the extruder ending position absolute rather than relative to the last-"
|
||||
"known location of the head."
|
||||
msgid "Make the extruder ending position absolute rather than relative to the last-known location of the head."
|
||||
msgstr "Rendre la position de fin de l'extrudeuse absolue plutôt que relative à la dernière position connue de la tête."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
|
@ -142,9 +139,7 @@ msgstr "Extrudeuse Position d'amorçage Z"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "extruder_prime_pos_z description"
|
||||
msgid ""
|
||||
"The Z coordinate of the position where the nozzle primes at the start of "
|
||||
"printing."
|
||||
msgid "The Z coordinate of the position where the nozzle primes at the start of printing."
|
||||
msgstr "Les coordonnées Z de la position à laquelle la buse s'amorce au début de l'impression."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
|
@ -164,9 +159,7 @@ msgstr "Extrudeuse Position d'amorçage X"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "extruder_prime_pos_x description"
|
||||
msgid ""
|
||||
"The X coordinate of the position where the nozzle primes at the start of "
|
||||
"printing."
|
||||
msgid "The X coordinate of the position where the nozzle primes at the start of printing."
|
||||
msgstr "Les coordonnées X de la position à laquelle la buse s'amorce au début de l'impression."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
|
@ -176,7 +169,5 @@ msgstr "Extrudeuse Position d'amorçage Y"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "extruder_prime_pos_y description"
|
||||
msgid ""
|
||||
"The Y coordinate of the position where the nozzle primes at the start of "
|
||||
"printing."
|
||||
msgid "The Y coordinate of the position where the nozzle primes at the start of printing."
|
||||
msgstr "Les coordonnées Y de la position à laquelle la buse s'amorce au début de l'impression."
|
||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -3,10 +3,11 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: Uranium json setting files\n"
|
||||
"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n"
|
||||
"POT-Creation-Date: 2016-09-20 17:35+0000\n"
|
||||
"POT-Creation-Date: 2016-12-28 10:51+0000\n"
|
||||
"PO-Revision-Date: 2016-09-29 13:02+0200\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
@ -68,9 +69,7 @@ msgstr "Assoluto posizione avvio estrusore"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_start_pos_abs description"
|
||||
msgid ""
|
||||
"Make the extruder starting position absolute rather than relative to the "
|
||||
"last-known location of the head."
|
||||
msgid "Make the extruder starting position absolute rather than relative to the last-known location of the head."
|
||||
msgstr "Rende la posizione di partenza estrusore assoluta anziché relativa rispetto all’ultima posizione nota della testina."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
|
@ -110,9 +109,7 @@ msgstr "Assoluto posizione fine estrusore"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_end_pos_abs description"
|
||||
msgid ""
|
||||
"Make the extruder ending position absolute rather than relative to the last-"
|
||||
"known location of the head."
|
||||
msgid "Make the extruder ending position absolute rather than relative to the last-known location of the head."
|
||||
msgstr "Rende la posizione di fine estrusore assoluta anziché relativa rispetto all’ultima posizione nota della testina."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
|
@ -142,9 +139,7 @@ msgstr "Posizione Z innesco estrusore"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "extruder_prime_pos_z description"
|
||||
msgid ""
|
||||
"The Z coordinate of the position where the nozzle primes at the start of "
|
||||
"printing."
|
||||
msgid "The Z coordinate of the position where the nozzle primes at the start of printing."
|
||||
msgstr "Indica la coordinata Z della posizione in cui l’ugello si innesca all’avvio della stampa."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
|
@ -164,9 +159,7 @@ msgstr "Posizione X innesco estrusore"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "extruder_prime_pos_x description"
|
||||
msgid ""
|
||||
"The X coordinate of the position where the nozzle primes at the start of "
|
||||
"printing."
|
||||
msgid "The X coordinate of the position where the nozzle primes at the start of printing."
|
||||
msgstr "La coordinata X della posizione in cui l’ugello si innesca all’avvio della stampa."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
|
@ -176,7 +169,5 @@ msgstr "Posizione Y innesco estrusore"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "extruder_prime_pos_y description"
|
||||
msgid ""
|
||||
"The Y coordinate of the position where the nozzle primes at the start of "
|
||||
"printing."
|
||||
msgid "The Y coordinate of the position where the nozzle primes at the start of printing."
|
||||
msgstr "La coordinata Y della posizione in cui l’ugello si innesca all’avvio della stampa."
|
||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -2,11 +2,12 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Uranium json setting files\n"
|
||||
"Report-Msgid-Bugs-To: http://github.com/Ultimaker/Cura\n"
|
||||
"POT-Creation-Date: 2016-09-20 17:35+0000\n"
|
||||
"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n"
|
||||
"POT-Creation-Date: 2016-12-28 10:51+0000\n"
|
||||
"PO-Revision-Date: 2016-10-11 16:05+0200\n"
|
||||
"Last-Translator: Ruben Dulek <r.dulek@ultimaker.com>\n"
|
||||
"Language-Team: Ultimaker\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
@ -68,9 +69,7 @@ msgstr "Absolute Startpositie Extruder"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_start_pos_abs description"
|
||||
msgid ""
|
||||
"Make the extruder starting position absolute rather than relative to the "
|
||||
"last-known location of the head."
|
||||
msgid "Make the extruder starting position absolute rather than relative to the last-known location of the head."
|
||||
msgstr "Maak van de startpositie van de extruder de absolute startpositie, in plaats van de relatieve startpositie ten opzichte van de laatst bekende locatie van de printkop."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
|
@ -110,9 +109,7 @@ msgstr "Absolute Eindpositie Extruder"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_end_pos_abs description"
|
||||
msgid ""
|
||||
"Make the extruder ending position absolute rather than relative to the last-"
|
||||
"known location of the head."
|
||||
msgid "Make the extruder ending position absolute rather than relative to the last-known location of the head."
|
||||
msgstr "Maak van de eindpositie van de extruder de absolute eindpositie, in plaats van de relatieve eindpositie ten opzichte van de laatst bekende locatie van de printkop."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
|
@ -142,9 +139,7 @@ msgstr "Z-positie voor Primen Extruder"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "extruder_prime_pos_z description"
|
||||
msgid ""
|
||||
"The Z coordinate of the position where the nozzle primes at the start of "
|
||||
"printing."
|
||||
msgid "The Z coordinate of the position where the nozzle primes at the start of printing."
|
||||
msgstr "De Z-coördinaat van de positie waar filament in de nozzle wordt geprimet aan het begin van het printen."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
|
@ -164,9 +159,7 @@ msgstr "X-positie voor Primen Extruder"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "extruder_prime_pos_x description"
|
||||
msgid ""
|
||||
"The X coordinate of the position where the nozzle primes at the start of "
|
||||
"printing."
|
||||
msgid "The X coordinate of the position where the nozzle primes at the start of printing."
|
||||
msgstr "De X-coördinaat van de positie waar filament in de nozzle wordt geprimet aan het begin van het printen."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
|
@ -176,7 +169,5 @@ msgstr "Y-positie voor Primen Extruder"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "extruder_prime_pos_y description"
|
||||
msgid ""
|
||||
"The Y coordinate of the position where the nozzle primes at the start of "
|
||||
"printing."
|
||||
msgid "The Y coordinate of the position where the nozzle primes at the start of printing."
|
||||
msgstr "De Y-coördinaat van de positie waar filament in de nozzle wordt geprimet aan het begin van het printen."
|
||||
|
|
File diff suppressed because it is too large
Load diff
3544
resources/i18n/ru/cura.po
Normal file
3544
resources/i18n/ru/cura.po
Normal file
File diff suppressed because it is too large
Load diff
2417
resources/i18n/ru/fdmextruder.def.json.po
Normal file
2417
resources/i18n/ru/fdmextruder.def.json.po
Normal file
File diff suppressed because it is too large
Load diff
5394
resources/i18n/ru/fdmprinter.def.json.po
Normal file
5394
resources/i18n/ru/fdmprinter.def.json.po
Normal file
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -3,10 +3,11 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: Uranium json setting files\n"
|
||||
"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n"
|
||||
"POT-Creation-Date: 2016-09-20 17:35+0000\n"
|
||||
"POT-Creation-Date: 2016-12-28 10:51+0000\n"
|
||||
"PO-Revision-Date: 2016-09-29 13:02+0200\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
@ -68,9 +69,7 @@ msgstr "Ekstruderin Mutlak Başlangıç Konumu"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_start_pos_abs description"
|
||||
msgid ""
|
||||
"Make the extruder starting position absolute rather than relative to the "
|
||||
"last-known location of the head."
|
||||
msgid "Make the extruder starting position absolute rather than relative to the last-known location of the head."
|
||||
msgstr "Ekstruder başlama konumunu, yazıcı başlığının son konumuna göre ayarlamak yerine mutlak olarak ayarlayın."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
|
@ -110,9 +109,7 @@ msgstr "Ekstruderin Mutlak Bitiş Konumu"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_end_pos_abs description"
|
||||
msgid ""
|
||||
"Make the extruder ending position absolute rather than relative to the last-"
|
||||
"known location of the head."
|
||||
msgid "Make the extruder ending position absolute rather than relative to the last-known location of the head."
|
||||
msgstr "Ekstruder bitiş konumunu, yazıcı başlığının son konumuna göre ayarlamak yerine mutlak olarak ayarlayın."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
|
@ -142,9 +139,7 @@ msgstr "Ekstruder İlk Z konumu"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "extruder_prime_pos_z description"
|
||||
msgid ""
|
||||
"The Z coordinate of the position where the nozzle primes at the start of "
|
||||
"printing."
|
||||
msgid "The Z coordinate of the position where the nozzle primes at the start of printing."
|
||||
msgstr "Nozül yazdırma işlemini başlatmaya hazırlandığında konumun Z koordinatı."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
|
@ -164,9 +159,7 @@ msgstr "Extruder İlk X konumu"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "extruder_prime_pos_x description"
|
||||
msgid ""
|
||||
"The X coordinate of the position where the nozzle primes at the start of "
|
||||
"printing."
|
||||
msgid "The X coordinate of the position where the nozzle primes at the start of printing."
|
||||
msgstr "Nozül yazdırma işlemini başlatmaya hazırlandığında konumun X koordinatı."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
|
@ -176,7 +169,5 @@ msgstr "Extruder İlk Y konumu"
|
|||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "extruder_prime_pos_y description"
|
||||
msgid ""
|
||||
"The Y coordinate of the position where the nozzle primes at the start of "
|
||||
"printing."
|
||||
msgid "The Y coordinate of the position where the nozzle primes at the start of printing."
|
||||
msgstr "Nozül yazdırma işlemini başlatmaya hazırlandığında konumun Y koordinatı."
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -14,25 +14,25 @@ UM.Dialog
|
|||
//: About dialog title
|
||||
title: catalog.i18nc("@title:window","About Cura")
|
||||
|
||||
minimumWidth: 400 * Screen.devicePixelRatio
|
||||
minimumHeight: 300 * Screen.devicePixelRatio
|
||||
minimumWidth: 450 * Screen.devicePixelRatio
|
||||
minimumHeight: 550 * Screen.devicePixelRatio
|
||||
width: minimumWidth
|
||||
height: minimumHeight
|
||||
//UM.I18nCatalog { id: catalog; }
|
||||
|
||||
|
||||
Image
|
||||
{
|
||||
id: logo
|
||||
width: parent.width * 0.75
|
||||
width: base.minimumWidth * 0.85
|
||||
height: width * (1/4.25)
|
||||
|
||||
source: UM.Theme.getImage("logo")
|
||||
|
||||
sourceSize.width: width
|
||||
sourceSize.height: height
|
||||
anchors.centerIn: parent
|
||||
anchors.verticalCenterOffset : -(height * 0.5)
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: (base.minimumWidth - width) / 2
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
|
||||
UM.I18nCatalog{id: catalog; name:"cura"}
|
||||
}
|
||||
|
||||
|
@ -42,10 +42,9 @@ UM.Dialog
|
|||
|
||||
text: "Cura %1".arg(UM.Application.version)
|
||||
font: UM.Theme.getFont("large")
|
||||
anchors.horizontalCenter : logo.horizontalCenter
|
||||
anchors.horizontalCenterOffset : (logo.width * 0.25)
|
||||
anchors.right : logo.right
|
||||
anchors.top: logo.bottom
|
||||
anchors.topMargin : 5
|
||||
anchors.topMargin: UM.Theme.getSize("default_margin").height / 2
|
||||
}
|
||||
|
||||
Label
|
||||
|
@ -55,20 +54,82 @@ UM.Dialog
|
|||
|
||||
//: About dialog application description
|
||||
text: catalog.i18nc("@label","End-to-end solution for fused filament 3D printing.")
|
||||
font: UM.Theme.getFont("system")
|
||||
wrapMode: Text.WordWrap
|
||||
anchors.top: version.bottom
|
||||
anchors.topMargin : 10
|
||||
anchors.topMargin: UM.Theme.getSize("default_margin").height
|
||||
}
|
||||
|
||||
Label
|
||||
{
|
||||
id: author_note
|
||||
id: creditsNotes
|
||||
width: parent.width
|
||||
|
||||
//: About dialog application author note
|
||||
text: catalog.i18nc("@info:credit","Cura has been developed by Ultimaker B.V. in cooperation with the community.")
|
||||
text: catalog.i18nc("@info:credit","Cura is developed by Ultimaker B.V. in cooperation with the community.\nCura proudly uses the following open source projects:")
|
||||
font: UM.Theme.getFont("system")
|
||||
wrapMode: Text.WordWrap
|
||||
anchors.top: description.bottom
|
||||
anchors.topMargin: UM.Theme.getSize("default_margin").height
|
||||
}
|
||||
|
||||
ListView
|
||||
{
|
||||
id: projectsList
|
||||
|
||||
anchors.top: creditsNotes.bottom
|
||||
anchors.topMargin: 10
|
||||
|
||||
width: parent.width
|
||||
height: childrenRect.height
|
||||
|
||||
delegate: Row
|
||||
{
|
||||
Label
|
||||
{
|
||||
text: "<a href='%1' title='%2'>%2</a>".arg(model.url).arg(model.name)
|
||||
width: projectsList.width * 0.25
|
||||
elide: Text.ElideRight
|
||||
onLinkActivated: Qt.openUrlExternally(link)
|
||||
}
|
||||
Label
|
||||
{
|
||||
text: model.description
|
||||
elide: Text.ElideRight
|
||||
width: projectsList.width * 0.6
|
||||
}
|
||||
Label
|
||||
{
|
||||
text: model.license
|
||||
elide: Text.ElideRight
|
||||
width: projectsList.width * 0.15
|
||||
}
|
||||
}
|
||||
model: ListModel
|
||||
{
|
||||
id: projectsModel
|
||||
}
|
||||
Component.onCompleted:
|
||||
{
|
||||
projectsModel.append({ name:"Cura", description: catalog.i18nc("@label", "Graphical user interface"), license: "AGPLv3", url: "https://github.com/Ultimaker/Cura" });
|
||||
projectsModel.append({ name:"Uranium", description: catalog.i18nc("@label", "Application framework"), license: "AGPLv3", url: "https://github.com/Ultimaker/Uranium" });
|
||||
projectsModel.append({ name:"CuraEngine", description: catalog.i18nc("@label", "GCode generator"), license: "AGPLv3", url: "https://github.com/Ultimaker/CuraEngine" });
|
||||
projectsModel.append({ name:"libArcus", description: catalog.i18nc("@label", "Interprocess communication library"), license: "AGPLv3", url: "https://github.com/Ultimaker/libArcus" });
|
||||
|
||||
projectsModel.append({ name:"Python", description: catalog.i18nc("@label", "Programming language"), license: "Python", url: "http://python.org/" });
|
||||
projectsModel.append({ name:"Qt5", description: catalog.i18nc("@label", "GUI framework"), license: "LGPLv3", url: "https://www.qt.io/" });
|
||||
projectsModel.append({ name:"PyQt", description: catalog.i18nc("@label", "GUI framework bindings"), license: "GPL", url: "https://riverbankcomputing.com/software/pyqt" });
|
||||
projectsModel.append({ name:"SIP", description: catalog.i18nc("@label", "C/C++ Binding library"), license: "GPL", url: "https://riverbankcomputing.com/software/sip" });
|
||||
projectsModel.append({ name:"Protobuf", description: catalog.i18nc("@label", "Data interchange format"), license: "BSD", url: "https://developers.google.com/protocol-buffers" });
|
||||
projectsModel.append({ name:"SciPy", description: catalog.i18nc("@label", "Support library for scientific computing "), license: "BSD-new", url: "https://www.scipy.org/" });
|
||||
projectsModel.append({ name:"NumPy", description: catalog.i18nc("@label", "Support library for faster math"), license: "BSD", url: "http://www.numpy.org/" });
|
||||
projectsModel.append({ name:"NumPy-STL", description: catalog.i18nc("@label", "Support library for handling STL files"), license: "BSD", url: "https://github.com/WoLpH/numpy-stl" });
|
||||
projectsModel.append({ name:"PySerial", description: catalog.i18nc("@label", "Serial communication library"), license: "Python", url: "http://pyserial.sourceforge.net/" });
|
||||
projectsModel.append({ name:"python-zeroconf", description: catalog.i18nc("@label", "ZeroConf discovery library"), license: "LGPL", url: "https://github.com/jstasiak/python-zeroconf" });
|
||||
projectsModel.append({ name:"Clipper", description: catalog.i18nc("@label", "Polygon clipping library"), license: "Boost", url: "http://www.angusj.com/delphi/clipper.php" });
|
||||
projectsModel.append({ name:"Open Sans", description: catalog.i18nc("@label", "Font"), license: "Apache 2.0", url: "https://fonts.google.com/specimen/Open+Sans" });
|
||||
projectsModel.append({ name:"Font-Awesome-SVG-PNG", description: catalog.i18nc("@label", "SVG icons"), license: "SIL OFL 1.1", url: "https://github.com/encharm/Font-Awesome-SVG-PNG" });
|
||||
}
|
||||
}
|
||||
|
||||
rightButtons: Button
|
||||
|
|
|
@ -20,6 +20,11 @@ UM.Dialog
|
|||
property string preferredCategory: "Ultimaker"
|
||||
property string activeCategory: preferredCategory
|
||||
|
||||
minimumWidth: UM.Theme.getSize("modal_window_minimum").width
|
||||
minimumHeight: UM.Theme.getSize("modal_window_minimum").height
|
||||
width: minimumWidth
|
||||
height: minimumHeight
|
||||
|
||||
onVisibilityChanged:
|
||||
{
|
||||
// Reset selection and machine name
|
||||
|
@ -46,7 +51,8 @@ UM.Dialog
|
|||
left: parent.left;
|
||||
top: parent.top;
|
||||
right: parent.right;
|
||||
bottom: parent.bottom;
|
||||
bottom: machineNameRow.top;
|
||||
bottomMargin: UM.Theme.getSize("default_margin").height
|
||||
}
|
||||
|
||||
ListView
|
||||
|
@ -65,6 +71,7 @@ UM.Dialog
|
|||
section.delegate: Button
|
||||
{
|
||||
text: section
|
||||
width: machineList.width
|
||||
style: ButtonStyle
|
||||
{
|
||||
background: Rectangle
|
||||
|
@ -102,8 +109,8 @@ UM.Dialog
|
|||
base.activeCategory = section;
|
||||
if (machineList.model.getItem(machineList.currentIndex).section != section) {
|
||||
// Find the first machine from this section
|
||||
for(var i = 0; i < sortedMachineDefinitionsModel.count; i++) {
|
||||
var item = sortedMachineDefinitionsModel.getItem(i);
|
||||
for(var i = 0; i < machineList.model.rowCount(); i++) {
|
||||
var item = machineList.model.getItem(i);
|
||||
if (item.section == section) {
|
||||
machineList.currentIndex = i;
|
||||
break;
|
||||
|
@ -169,9 +176,21 @@ UM.Dialog
|
|||
}
|
||||
}
|
||||
|
||||
Row
|
||||
{
|
||||
id: machineNameRow
|
||||
anchors.bottom:parent.bottom
|
||||
spacing: UM.Theme.getSize("default_margin").width
|
||||
|
||||
Label
|
||||
{
|
||||
text: catalog.i18nc("@label", "Printer Name:")
|
||||
anchors.verticalCenter: machineName.verticalCenter
|
||||
}
|
||||
|
||||
TextField
|
||||
{
|
||||
id: machineName;
|
||||
id: machineName
|
||||
text: getMachineName()
|
||||
implicitWidth: UM.Theme.getSize("standard_list_input").width
|
||||
maximumLength: 40
|
||||
|
@ -183,7 +202,7 @@ UM.Dialog
|
|||
}
|
||||
}
|
||||
property var machine_name_validator: Cura.MachineNameValidator { }
|
||||
anchors.bottom:parent.bottom
|
||||
}
|
||||
}
|
||||
|
||||
Button
|
||||
|
|
|
@ -269,16 +269,16 @@ UM.MainWindow
|
|||
if(drop.urls.length > 0)
|
||||
{
|
||||
// Import models
|
||||
var imported_model = -1;
|
||||
for(var i in drop.urls)
|
||||
{
|
||||
// There is no endsWith in this version of JS...
|
||||
if ((drop.urls[i].length <= 12) || (drop.urls[i].substring(drop.urls[i].length-12) !== ".curaprofile")) {
|
||||
// Drop an object
|
||||
UM.MeshFileHandler.readLocalFile(drop.urls[i]);
|
||||
if (i == drop.urls.length - 1)
|
||||
Printer.readLocalFile(drop.urls[i]);
|
||||
if (imported_model == -1)
|
||||
{
|
||||
var meshName = backgroundItem.getMeshName(drop.urls[i].toString());
|
||||
backgroundItem.hasMesh(decodeURIComponent(meshName));
|
||||
imported_model = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -297,6 +297,11 @@ UM.MainWindow
|
|||
}
|
||||
messageDialog.open()
|
||||
}
|
||||
if (imported_model != -1)
|
||||
{
|
||||
var meshName = backgroundItem.getMeshName(drop.urls[imported_model].toString())
|
||||
backgroundItem.hasMesh(decodeURIComponent(meshName))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -406,7 +411,8 @@ UM.MainWindow
|
|||
iconSource: UM.Theme.getIcon("viewmode");
|
||||
|
||||
style: UM.Theme.styles.tool_button;
|
||||
tooltip: '';
|
||||
tooltip: "";
|
||||
enabled: !PrintInformation.preSliced
|
||||
menu: ViewMenu { }
|
||||
}
|
||||
|
||||
|
@ -533,9 +539,9 @@ UM.MainWindow
|
|||
target: Cura.Actions.addProfile
|
||||
onTriggered:
|
||||
{
|
||||
preferences.setPage(4);
|
||||
preferences.show();
|
||||
|
||||
preferences.show();
|
||||
preferences.setPage(4);
|
||||
// Create a new profile after a very short delay so the preference page has time to initiate
|
||||
createProfileTimer.start();
|
||||
}
|
||||
|
@ -731,16 +737,13 @@ UM.MainWindow
|
|||
|
||||
for(var i in fileUrls)
|
||||
{
|
||||
UM.MeshFileHandler.readLocalFile(fileUrls[i])
|
||||
Printer.readLocalFile(fileUrls[i])
|
||||
}
|
||||
|
||||
if (i == fileUrls.length - 1)
|
||||
{
|
||||
var meshName = backgroundItem.getMeshName(fileUrls.toString())
|
||||
var meshName = backgroundItem.getMeshName(fileUrls[0].toString())
|
||||
backgroundItem.hasMesh(decodeURIComponent(meshName))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Connections
|
||||
{
|
||||
|
|
|
@ -23,7 +23,7 @@ Menu
|
|||
if(printerConnected && Cura.MachineManager.printerOutputDevices[0].materialNames.length > extruderIndex)
|
||||
{
|
||||
var materialName = Cura.MachineManager.printerOutputDevices[0].materialNames[extruderIndex];
|
||||
return catalog.i18nc("@title:menuitem %1 is the value from the printer", "Automatic: %1").arg(materialName);
|
||||
return catalog.i18nc("@title:menuitem %1 is the automatically selected material", "Automatic: %1").arg(materialName);
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
|
|
@ -26,7 +26,7 @@ Menu
|
|||
return (index + 1) + ". " + path.slice(path.lastIndexOf("/") + 1);
|
||||
}
|
||||
onTriggered: {
|
||||
UM.MeshFileHandler.readLocalFile(modelData);
|
||||
Printer.readLocalFile(modelData);
|
||||
var meshName = backgroundItem.getMeshName(modelData.toString())
|
||||
backgroundItem.hasMesh(decodeURIComponent(meshName))
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@ Menu
|
|||
{
|
||||
title: catalog.i18nc("@title:menu menubar:toplevel", "&View");
|
||||
id: menu
|
||||
enabled: !PrintInformation.preSliced
|
||||
Instantiator
|
||||
{
|
||||
model: UM.ViewModel { }
|
||||
|
|
|
@ -97,6 +97,7 @@ UM.PreferencesPage
|
|||
append({ text: "Français", code: "fr" })
|
||||
append({ text: "Italiano", code: "it" })
|
||||
append({ text: "Nederlands", code: "nl" })
|
||||
append({ text: "Русский", code: "ru" })
|
||||
append({ text: "Türkçe", code: "tr" })
|
||||
}
|
||||
}
|
||||
|
|
|
@ -278,6 +278,7 @@ UM.ManagementPage
|
|||
{
|
||||
messageDialog.icon = StandardIcon.Information
|
||||
messageDialog.text = catalog.i18nc("@info:status", "Successfully imported material <filename>%1</filename>").arg(fileUrl)
|
||||
currentItem = base.model.getItem(base.objectList.currentIndex)
|
||||
}
|
||||
else if(result.status == "duplicate")
|
||||
{
|
||||
|
|
|
@ -34,6 +34,8 @@ Rectangle {
|
|||
return catalog.i18nc("@label:PrintjobStatus %1 is target operation","Ready to %1").arg(UM.OutputDeviceManager.activeDeviceShortDescription);
|
||||
case 4:
|
||||
return catalog.i18nc("@label:PrintjobStatus", "Unable to Slice");
|
||||
case 5:
|
||||
return catalog.i18nc("@label:PrintjobStatus", "Slicing unavailable");
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
|
@ -104,7 +106,7 @@ Rectangle {
|
|||
id: saveToButton
|
||||
|
||||
tooltip: UM.OutputDeviceManager.activeDeviceDescription;
|
||||
enabled: base.backendState == 3 && base.activity == true
|
||||
enabled: (base.backendState == 3 || base.backendState == 5) && base.activity == true
|
||||
height: UM.Theme.getSize("save_button_save_to_button").height
|
||||
|
||||
anchors.top: parent.top
|
||||
|
@ -179,7 +181,7 @@ Rectangle {
|
|||
anchors.rightMargin: UM.Theme.getSize("default_margin").width
|
||||
width: UM.Theme.getSize("save_button_save_to_button").height
|
||||
height: UM.Theme.getSize("save_button_save_to_button").height
|
||||
enabled: base.backendState == 3 && base.activity == true
|
||||
enabled: (base.backendState == 3 || base.backendState == 5) && base.activity == true
|
||||
visible: devicesModel.deviceCount > 1
|
||||
|
||||
|
||||
|
|
|
@ -230,6 +230,10 @@ Item {
|
|||
}
|
||||
|
||||
// Setting does have a limit_to_extruder property, so use that one instead.
|
||||
if (definition.key === undefined) {
|
||||
// Observed when loading workspace, probably when SettingItems are removed.
|
||||
return false;
|
||||
}
|
||||
return Cura.SettingInheritanceManager.getOverridesForExtruder(definition.key, globalPropertyProvider.properties.limit_to_extruder).indexOf(definition.key) >= 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -100,7 +100,7 @@ SettingItem
|
|||
|
||||
maximumLength: 10;
|
||||
|
||||
validator: RegExpValidator { regExp: (definition.type == "int") ? /^-?[0-9]{0,10}/ : /^-?[0-9.,]{0,10}/ } // definition.type property from parent loader used to disallow fractional number entry
|
||||
validator: RegExpValidator { regExp: (definition.type == "int") ? /^-?[0-9]{0,10}$/ : /^-?[0-9]{0,9}[.,]?[0-9]{0,10}$/ } // definition.type property from parent loader used to disallow fractional number entry
|
||||
|
||||
Binding
|
||||
{
|
||||
|
@ -113,7 +113,8 @@ SettingItem
|
|||
// 2: quality
|
||||
// 3: material -> user changed material in materialspage
|
||||
// 4: variant
|
||||
// 5: machine
|
||||
// 5: machine_changes
|
||||
// 6: machine
|
||||
if ((base.resolve != "None" && base.resolve) && (stackLevel != 0) && (stackLevel != 1)) {
|
||||
// We have a resolve function. Indicates that the setting is not settable per extruder and that
|
||||
// we have to choose between the resolved value (default) and the global value
|
||||
|
|
|
@ -167,7 +167,7 @@ Item
|
|||
id: definitionsModel;
|
||||
containerId: Cura.MachineManager.activeDefinitionId
|
||||
visibilityHandler: UM.SettingPreferenceVisibilityHandler { }
|
||||
exclude: ["machine_settings", "command_line_settings", "infill_mesh", "infill_mesh_order"] // 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.
|
||||
exclude: ["machine_settings", "command_line_settings", "infill_mesh", "infill_mesh_order", "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: Printer.expandedCategories
|
||||
onExpandedChanged:
|
||||
{
|
||||
|
|
|
@ -16,6 +16,7 @@ Rectangle
|
|||
|
||||
property int currentModeIndex;
|
||||
property bool monitoringPrint: false
|
||||
property bool hideSettings: PrintInformation.preSliced
|
||||
Connections
|
||||
{
|
||||
target: Printer
|
||||
|
@ -114,10 +115,28 @@ Rectangle
|
|||
anchors.verticalCenter: parent.verticalCenter
|
||||
style: ButtonStyle {
|
||||
background: Rectangle {
|
||||
color: control.hovered ? UM.Theme.getColor("button_hover") :
|
||||
control.pressed ? UM.Theme.getColor("button_hover") : UM.Theme.getColor("sidebar_header_bar")
|
||||
color: {
|
||||
if(control.pressed) {
|
||||
return UM.Theme.getColor("sidebar_header_active");
|
||||
} else if(control.hovered) {
|
||||
return UM.Theme.getColor("sidebar_header_hover");
|
||||
} else {
|
||||
return UM.Theme.getColor("sidebar_header_bar");
|
||||
}
|
||||
}
|
||||
Behavior on color { ColorAnimation { duration: 50; } }
|
||||
|
||||
Rectangle {
|
||||
id: underline;
|
||||
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
height: UM.Theme.getSize("sidebar_header_highlight").height
|
||||
color: UM.Theme.getColor("sidebar_header_highlight_hover")
|
||||
visible: control.hovered || control.pressed
|
||||
}
|
||||
|
||||
UM.RecolorImage {
|
||||
id: downArrow
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
|
@ -252,7 +271,7 @@ Rectangle
|
|||
Rectangle {
|
||||
id: headerSeparator
|
||||
width: parent.width
|
||||
visible: !monitoringPrint
|
||||
visible: !monitoringPrint && !hideSettings
|
||||
height: visible ? UM.Theme.getSize("sidebar_lining").height : 0
|
||||
color: UM.Theme.getColor("sidebar_lining")
|
||||
anchors.top: header.bottom
|
||||
|
@ -270,7 +289,7 @@ Rectangle
|
|||
|
||||
Label {
|
||||
id: settingsModeLabel
|
||||
text: catalog.i18nc("@label:listbox", "Print Setup");
|
||||
text: !hideSettings ? catalog.i18nc("@label:listbox", "Print Setup") : catalog.i18nc("@label:listbox","Print Setup disabled\nG-code files cannot be modified");
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: UM.Theme.getSize("default_margin").width;
|
||||
anchors.top: headerSeparator.bottom
|
||||
|
@ -290,7 +309,7 @@ Rectangle
|
|||
anchors.rightMargin: UM.Theme.getSize("default_margin").width
|
||||
anchors.top: headerSeparator.bottom
|
||||
anchors.topMargin: UM.Theme.getSize("default_margin").height
|
||||
visible: !monitoringPrint
|
||||
visible: !monitoringPrint && !hideSettings
|
||||
Component{
|
||||
id: wizardDelegate
|
||||
Button {
|
||||
|
@ -366,7 +385,7 @@ Rectangle
|
|||
height: settingsModeSelection.height
|
||||
width: visible ? height : 0
|
||||
|
||||
visible: !monitoringPrint && modesListModel.get(base.currentModeIndex) != undefined && modesListModel.get(base.currentModeIndex).showFilterButton
|
||||
visible: !monitoringPrint && !hideSettings && modesListModel.get(base.currentModeIndex) != undefined && modesListModel.get(base.currentModeIndex).showFilterButton
|
||||
opacity: visible ? 1 : 0
|
||||
|
||||
onClicked: sidebarContents.currentItem.toggleFilterField()
|
||||
|
@ -414,7 +433,7 @@ Rectangle
|
|||
anchors.topMargin: UM.Theme.getSize("default_margin").height
|
||||
anchors.left: base.left
|
||||
anchors.right: base.right
|
||||
visible: !monitoringPrint
|
||||
visible: !monitoringPrint && !hideSettings
|
||||
|
||||
delegate: StackViewDelegate
|
||||
{
|
||||
|
|
|
@ -164,7 +164,7 @@ Column
|
|||
id: variantRow
|
||||
|
||||
height: UM.Theme.getSize("sidebar_setup").height
|
||||
visible: (Cura.MachineManager.hasVariants || Cura.MachineManager.hasMaterials) && !sidebar.monitoringPrint
|
||||
visible: (Cura.MachineManager.hasVariants || Cura.MachineManager.hasMaterials) && !sidebar.monitoringPrint && !sidebar.hideSettings
|
||||
|
||||
anchors
|
||||
{
|
||||
|
@ -261,7 +261,7 @@ Column
|
|||
{
|
||||
id: globalProfileRow
|
||||
height: UM.Theme.getSize("sidebar_setup").height
|
||||
visible: !sidebar.monitoringPrint
|
||||
visible: !sidebar.monitoringPrint && !sidebar.hideSettings
|
||||
|
||||
anchors
|
||||
{
|
||||
|
|
|
@ -29,7 +29,6 @@ UM.Dialog
|
|||
|
||||
onClosing:
|
||||
{
|
||||
UM.Preferences.setValue("cura/asked_dialog_on_project_save", true)
|
||||
UM.Preferences.setValue("cura/dialog_on_project_save", !dontShowAgainCheckbox.checked)
|
||||
}
|
||||
|
||||
|
@ -37,16 +36,22 @@ UM.Dialog
|
|||
{
|
||||
if(visible)
|
||||
{
|
||||
if (UM.Preferences.getValue("cura/asked_dialog_on_project_save"))
|
||||
{
|
||||
dontShowAgain = true
|
||||
} else { dontShowAgain = UM.Preferences.setValue("cura/dialog_on_project_save")}
|
||||
dontShowAgain = !UM.Preferences.getValue("cura/dialog_on_project_save")
|
||||
}
|
||||
}
|
||||
|
||||
Item
|
||||
{
|
||||
anchors.fill: parent
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
||||
anchors.topMargin: 20
|
||||
anchors.bottomMargin: 20
|
||||
anchors.leftMargin:20
|
||||
anchors.rightMargin: 20
|
||||
|
||||
UM.SettingDefinitionsModel
|
||||
{
|
||||
id: definitionsModel
|
||||
|
@ -91,7 +96,21 @@ UM.Dialog
|
|||
text: catalog.i18nc("@action:label", "Printer settings")
|
||||
font.bold: true
|
||||
}
|
||||
|
||||
Row
|
||||
{
|
||||
width: parent.width
|
||||
height: childrenRect.height
|
||||
Label
|
||||
{
|
||||
text: catalog.i18nc("@action:label", "Type")
|
||||
width: parent.width / 3
|
||||
}
|
||||
Label
|
||||
{
|
||||
text: Cura.MachineManager.activeDefinitionName
|
||||
width: parent.width / 3
|
||||
}
|
||||
}
|
||||
Row
|
||||
{
|
||||
width: parent.width
|
||||
|
@ -106,8 +125,42 @@ UM.Dialog
|
|||
text: Cura.MachineManager.activeMachineName
|
||||
width: parent.width / 3
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Repeater
|
||||
{
|
||||
model: Cura.MachineManager.activeMaterialNames
|
||||
delegate: Column
|
||||
{
|
||||
Item // Spacer
|
||||
{
|
||||
height: spacerHeight
|
||||
width: height
|
||||
}
|
||||
Label
|
||||
{
|
||||
text: catalog.i18nc("@action:label", "Extruder %1").arg(index+1)
|
||||
}
|
||||
height: childrenRect.height
|
||||
width: parent.width
|
||||
Row
|
||||
{
|
||||
width: parent.width
|
||||
height: childrenRect.height
|
||||
Label
|
||||
{
|
||||
text: catalog.i18nc("@action:label", "%1 & material").arg(Cura.MachineManager.activeDefinitionVariantsName)
|
||||
width: parent.width / 3
|
||||
}
|
||||
Label
|
||||
{
|
||||
text: Cura.MachineManager.activeVariantNames[index] + ", " + modelData
|
||||
width: parent.width / 3
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Item // Spacer
|
||||
{
|
||||
height: spacerHeight
|
||||
|
@ -119,7 +172,21 @@ UM.Dialog
|
|||
text: catalog.i18nc("@action:label", "Profile settings")
|
||||
font.bold: true
|
||||
}
|
||||
|
||||
Row
|
||||
{
|
||||
width: parent.width
|
||||
Label
|
||||
{
|
||||
text: catalog.i18nc("@action:label", "Not in profile")
|
||||
width: parent.width / 3
|
||||
}
|
||||
Label
|
||||
{
|
||||
text: catalog.i18ncp("@action:label", "%1 override", "%1 overrides", Cura.MachineManager.numUserSettings).arg(Cura.MachineManager.numUserSettings)
|
||||
width: parent.width / 3
|
||||
}
|
||||
visible: Cura.MachineManager.numUserSettings
|
||||
}
|
||||
Row
|
||||
{
|
||||
width: parent.width
|
||||
|
@ -136,38 +203,6 @@ UM.Dialog
|
|||
}
|
||||
|
||||
}
|
||||
Item // Spacer
|
||||
{
|
||||
height: spacerHeight
|
||||
width: height
|
||||
}
|
||||
|
||||
Label
|
||||
{
|
||||
text: catalog.i18nc("@action:label", "Material settings")
|
||||
font.bold: true
|
||||
}
|
||||
|
||||
Repeater
|
||||
{
|
||||
model: Cura.MachineManager.activeMaterialNames
|
||||
delegate: Row
|
||||
{
|
||||
width: parent.width
|
||||
height: childrenRect.height
|
||||
Label
|
||||
{
|
||||
text: catalog.i18nc("@action:label", "Name")
|
||||
width: parent.width / 3
|
||||
}
|
||||
Label
|
||||
{
|
||||
text: modelData
|
||||
width: parent.width / 3
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Item // Spacer
|
||||
{
|
||||
|
@ -202,22 +237,34 @@ UM.Dialog
|
|||
checked: dontShowAgain
|
||||
}
|
||||
}
|
||||
}
|
||||
rightButtons: [
|
||||
Button
|
||||
{
|
||||
id: cancel_button
|
||||
text: catalog.i18nc("@action:button","Cancel");
|
||||
enabled: true
|
||||
onClicked: close()
|
||||
},
|
||||
|
||||
|
||||
Button
|
||||
{
|
||||
id: ok_button
|
||||
text: catalog.i18nc("@action:button","Save");
|
||||
enabled: true
|
||||
onClicked: {
|
||||
close(); yes() }
|
||||
close()
|
||||
yes()
|
||||
}
|
||||
anchors.bottomMargin: - 0.5 * height
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.right: parent.right
|
||||
}
|
||||
|
||||
Button
|
||||
{
|
||||
id: cancel_button
|
||||
text: catalog.i18nc("@action:button","Cancel");
|
||||
enabled: true
|
||||
onClicked: close()
|
||||
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.right: ok_button.left
|
||||
anchors.bottomMargin: - 0.5 * height
|
||||
anchors.rightMargin:2
|
||||
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
|
@ -17,7 +17,7 @@ infill_sparse_density = 22
|
|||
speed_print = 30
|
||||
speed_layer_0 = =round(speed_print * 30 / 30)
|
||||
cool_min_layer_time = 3
|
||||
cool_fan_speed_min = 20
|
||||
cool_fan_speed_min = =cool_fan_speed * 0.2
|
||||
cool_min_speed = 10
|
||||
cool_min_layer_time_fan_speed_max = 15
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@ speed_wall = 40
|
|||
speed_topbottom = 30
|
||||
speed_travel = 150
|
||||
cool_min_layer_time = 3
|
||||
cool_fan_speed_min = 20
|
||||
cool_fan_speed_min = =cool_fan_speed * 0.2
|
||||
cool_min_speed = 10
|
||||
cool_min_layer_time_fan_speed_max = 15
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ speed_print = 45
|
|||
speed_layer_0 = =round(speed_print * 30 / 45)
|
||||
speed_wall = 30
|
||||
cool_min_layer_time = 3
|
||||
cool_fan_speed_min = 20
|
||||
cool_fan_speed_min = =cool_fan_speed * 0.2
|
||||
cool_min_speed = 10
|
||||
cool_min_layer_time_fan_speed_max = 15
|
||||
|
||||
|
|
|
@ -18,6 +18,6 @@ speed_print = 45
|
|||
speed_layer_0 = =round(speed_print * 30 / 45)
|
||||
speed_wall = 30
|
||||
cool_min_layer_time = 3
|
||||
cool_fan_speed_min = 20
|
||||
cool_fan_speed_min = =cool_fan_speed * 0.2
|
||||
cool_min_speed = 10
|
||||
cool_min_layer_time_fan_speed_max = 15
|
||||
|
|
|
@ -18,7 +18,7 @@ speed_print = 40
|
|||
speed_layer_0 = =round(speed_print * 30 / 40)
|
||||
speed_infill = 55
|
||||
cool_min_layer_time = 3
|
||||
cool_fan_speed_min = 50
|
||||
cool_fan_speed_min = =cool_fan_speed * 0.5
|
||||
cool_min_speed = 20
|
||||
cool_min_layer_time_fan_speed_max = 20
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@ infill_sparse_density = 20
|
|||
speed_print = 40
|
||||
speed_layer_0 = =round(speed_print * 30 / 40)
|
||||
cool_min_layer_time = 3
|
||||
cool_fan_speed_min = 50
|
||||
cool_fan_speed_min = =cool_fan_speed * 0.5
|
||||
cool_min_speed = 15
|
||||
cool_min_layer_time_fan_speed_max = 25
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@ infill_sparse_density = 22
|
|||
speed_print = 30
|
||||
speed_layer_0 = =round(speed_print * 30 / 30)
|
||||
cool_min_layer_time = 2
|
||||
cool_fan_speed_min = 20
|
||||
cool_fan_speed_min = =cool_fan_speed * 0.2
|
||||
cool_min_speed = 15
|
||||
cool_min_layer_time_fan_speed_max = 15
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue