Merge branch 'master' into feature_config_dir_lock

This commit is contained in:
Jack Ha 2016-11-22 14:46:00 +01:00
commit aa718fc013
190 changed files with 46974 additions and 3032 deletions

8
.gitignore vendored
View file

@ -8,6 +8,7 @@ docs/html
resources/i18n/en
resources/i18n/x-test
resources/firmware
resources/materials
LC_MESSAGES
# Editors and IDEs.
@ -25,3 +26,10 @@ LC_MESSAGES
# Debian packaging
debian*
#Externally located plug-ins.
plugins/Doodle3D-cura-plugin
plugins/GodMode
plugins/PostProcessingPlugin
plugins/UM3NetworkPrinting
plugins/X3GWriter

View file

@ -25,7 +25,7 @@ if(NOT ${URANIUM_SCRIPTS_DIR} STREQUAL "")
CREATE_TRANSLATION_TARGETS()
endif()
find_package(PythonInterp 3.4.0 REQUIRED)
find_package(PythonInterp 3.5.0 REQUIRED)
install(DIRECTORY resources
DESTINATION ${CMAKE_INSTALL_DATADIR}/cura)

View file

@ -5,6 +5,7 @@ Name[de]=Cura
GenericName=3D Printing Software
GenericName[de]=3D-Druck-Software
Comment=Cura converts 3D models into paths for a 3D printer. It prepares your print for maximum accuracy, minimum printing time and good reliability with many extra features that make your print come out great.
Comment[de]=Cura wandelt 3D-Modelle in Pfade für einen 3D-Drucker um. Es bereitet Ihren Druck für maximale Genauigkeit, minimale Druckzeit und guter Zuverlässigkeit mit vielen zusätzlichen Funktionen vor, damit Ihr Druck großartig wird.
Exec=@CMAKE_INSTALL_FULL_BINDIR@/cura %F
TryExec=@CMAKE_INSTALL_FULL_BINDIR@/cura
Icon=@CMAKE_INSTALL_FULL_DATADIR@/cura/resources/images/cura-icon.png

View file

@ -27,12 +27,15 @@ import UM.Settings.ContainerRegistry
# Setting for clearance around the prime
PRIME_CLEARANCE = 1.5
PRIME_CLEARANCE = 6.5
## Build volume is a special kind of node that is responsible for rendering the printable area & disallowed areas.
class BuildVolume(SceneNode):
VolumeOutlineColor = Color(12, 169, 227, 255)
XAxisColor = Color(255, 0, 0, 255)
YAxisColor = Color(0, 0, 255, 255)
ZAxisColor = Color(0, 255, 0, 255)
raftThicknessChanged = Signal()
@ -45,6 +48,10 @@ class BuildVolume(SceneNode):
self._shader = None
self._origin_mesh = None
self._origin_line_length = 20
self._origin_line_width = 0.5
self._grid_mesh = None
self._grid_shader = None
@ -68,8 +75,8 @@ class BuildVolume(SceneNode):
self._has_errors = False
Application.getInstance().getController().getScene().sceneChanged.connect(self._onSceneChanged)
# Number of objects loaded at the moment.
self._number_of_objects = 0
#Objects loaded at the moment. We are connected to the property changed events of these objects.
self._scene_objects = set()
self._change_timer = QTimer()
self._change_timer.setInterval(100)
@ -95,14 +102,33 @@ class BuildVolume(SceneNode):
def _onChangeTimerFinished(self):
root = Application.getInstance().getController().getScene().getRoot()
new_number_of_objects = len([node for node in BreadthFirstIterator(root) if node.getMeshData() and type(node) is SceneNode])
if new_number_of_objects != self._number_of_objects:
recalculate = False
if self._global_container_stack.getProperty("print_sequence", "value") == "one_at_a_time":
recalculate = (new_number_of_objects < 2 and self._number_of_objects > 1) or (new_number_of_objects > 1 and self._number_of_objects < 2)
self._number_of_objects = new_number_of_objects
if recalculate:
self._onSettingPropertyChanged("print_sequence", "value") # Create fake event, so right settings are triggered.
new_scene_objects = set(node for node in BreadthFirstIterator(root) if node.getMeshData() and type(node) is SceneNode)
if new_scene_objects != self._scene_objects:
for node in new_scene_objects - self._scene_objects: #Nodes that were added to the scene.
node.decoratorsChanged.connect(self._onNodeDecoratorChanged)
for node in self._scene_objects - new_scene_objects: #Nodes that were removed from the scene.
per_mesh_stack = node.callDecoration("getStack")
if per_mesh_stack:
per_mesh_stack.propertyChanged.disconnect(self._onSettingPropertyChanged)
active_extruder_changed = node.callDecoration("getActiveExtruderChangedSignal")
if active_extruder_changed is not None:
node.callDecoration("getActiveExtruderChangedSignal").disconnect(self._updateDisallowedAreasAndRebuild)
node.decoratorsChanged.disconnect(self._onNodeDecoratorChanged)
self._scene_objects = new_scene_objects
self._onSettingPropertyChanged("print_sequence", "value") # Create fake event, so right settings are triggered.
## Updates the listeners that listen for changes in per-mesh stacks.
#
# \param node The node for which the decorators changed.
def _onNodeDecoratorChanged(self, node):
per_mesh_stack = node.callDecoration("getStack")
if per_mesh_stack:
per_mesh_stack.propertyChanged.connect(self._onSettingPropertyChanged)
active_extruder_changed = node.callDecoration("getActiveExtruderChangedSignal")
if active_extruder_changed is not None:
active_extruder_changed.connect(self._updateDisallowedAreasAndRebuild)
self._updateDisallowedAreasAndRebuild()
def setWidth(self, width):
if width: self._width = width
@ -128,6 +154,7 @@ class BuildVolume(SceneNode):
self._grid_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "grid.shader"))
renderer.queueNode(self, mode = RenderBatch.RenderMode.Lines)
renderer.queueNode(self, mesh = self._origin_mesh)
renderer.queueNode(self, mesh = self._grid_mesh, shader = self._grid_shader, backface_cull = True)
if self._disallowed_area_mesh:
renderer.queueNode(self, mesh = self._disallowed_area_mesh, shader = self._shader, transparent = True, backface_cull = True, sort = -9)
@ -170,6 +197,37 @@ class BuildVolume(SceneNode):
self.setMeshData(mb.build())
mb = MeshBuilder()
# Indication of the machine origin
if self._global_container_stack.getProperty("machine_center_is_zero", "value"):
origin = (Vector(min_w, min_h, min_d) + Vector(max_w, min_h, max_d)) / 2
else:
origin = Vector(min_w, min_h, max_d)
mb.addCube(
width = self._origin_line_length,
height = self._origin_line_width,
depth = self._origin_line_width,
center = origin + Vector(self._origin_line_length / 2, 0, 0),
color = self.XAxisColor
)
mb.addCube(
width = self._origin_line_width,
height = self._origin_line_length,
depth = self._origin_line_width,
center = origin + Vector(0, self._origin_line_length / 2, 0),
color = self.YAxisColor
)
mb.addCube(
width = self._origin_line_width,
height = self._origin_line_width,
depth = self._origin_line_length,
center = origin - Vector(0, 0, self._origin_line_length / 2),
color = self.ZAxisColor
)
self._origin_mesh = mb.build()
mb = MeshBuilder()
mb.addQuad(
Vector(min_w, min_h - 0.2, min_d),
@ -285,7 +343,7 @@ class BuildVolume(SceneNode):
self._width = self._global_container_stack.getProperty("machine_width", "value")
machine_height = self._global_container_stack.getProperty("machine_height", "value")
if self._global_container_stack.getProperty("print_sequence", "value") == "one_at_a_time" and self._number_of_objects > 1:
if self._global_container_stack.getProperty("print_sequence", "value") == "one_at_a_time" and len(self._scene_objects) > 1:
self._height = min(self._global_container_stack.getProperty("gantry_height", "value"), machine_height)
if self._height < machine_height:
self._build_volume_message.show()
@ -308,7 +366,7 @@ class BuildVolume(SceneNode):
rebuild_me = False
if setting_key == "print_sequence":
machine_height = self._global_container_stack.getProperty("machine_height", "value")
if Application.getInstance().getGlobalContainerStack().getProperty("print_sequence", "value") == "one_at_a_time" and self._number_of_objects > 1:
if Application.getInstance().getGlobalContainerStack().getProperty("print_sequence", "value") == "one_at_a_time" and len(self._scene_objects) > 1:
self._height = min(self._global_container_stack.getProperty("gantry_height", "value"), machine_height)
if self._height < machine_height:
self._build_volume_message.show()
@ -319,7 +377,7 @@ class BuildVolume(SceneNode):
self._build_volume_message.hide()
rebuild_me = True
if setting_key in self._skirt_settings or setting_key in self._prime_settings or setting_key in self._tower_settings or setting_key == "print_sequence" or setting_key in self._ooze_shield_settings or setting_key in self._distance_settings:
if setting_key in self._skirt_settings or setting_key in self._prime_settings or setting_key in self._tower_settings or setting_key == "print_sequence" or setting_key in self._ooze_shield_settings or setting_key in self._distance_settings or setting_key in self._extruder_settings:
self._updateDisallowedAreas()
rebuild_me = True
@ -333,24 +391,109 @@ class BuildVolume(SceneNode):
def hasErrors(self):
return self._has_errors
## Calls _updateDisallowedAreas and makes sure the changes appear in the
# scene.
#
# This is required for a signal to trigger the update in one go. The
# ``_updateDisallowedAreas`` method itself shouldn't call ``rebuild``,
# since there may be other changes before it needs to be rebuilt, which
# would hit performance.
def _updateDisallowedAreasAndRebuild(self):
self._updateDisallowedAreas()
self.rebuild()
def _updateDisallowedAreas(self):
if not self._global_container_stack:
return
self._has_errors = False # Reset.
self._error_areas = []
disallowed_areas = copy.deepcopy(
self._global_container_stack.getProperty("machine_disallowed_areas", "value"))
areas = []
machine_width = self._global_container_stack.getProperty("machine_width", "value")
machine_depth = self._global_container_stack.getProperty("machine_depth", "value")
prime_tower_area = None
extruder_manager = ExtruderManager.getInstance()
used_extruders = extruder_manager.getUsedExtruderStacks()
disallowed_border_size = self._getEdgeDisallowedSize()
result_areas = self._computeDisallowedAreasStatic(disallowed_border_size, used_extruders) #Normal machine disallowed areas can always be added.
prime_areas = self._computeDisallowedAreasPrime(disallowed_border_size, used_extruders)
prime_disallowed_areas = self._computeDisallowedAreasStatic(0, used_extruders) #Where the priming is not allowed to happen. This is not added to the result, just for collision checking.
#Check if prime positions intersect with disallowed areas.
for extruder in used_extruders:
extruder_id = extruder.getId()
collision = False
for prime_polygon in prime_areas[extruder_id]:
for disallowed_polygon in prime_disallowed_areas[extruder_id]:
if prime_polygon.intersectsPolygon(disallowed_polygon) is not None:
collision = True
break
if collision:
break
#Also check other prime positions (without additional offset).
for other_extruder_id in prime_areas:
if extruder_id == other_extruder_id: #It is allowed to collide with itself.
continue
for other_prime_polygon in prime_areas[other_extruder_id]:
if prime_polygon.intersectsPolygon(other_prime_polygon):
collision = True
break
if collision:
break
if collision:
break
if not collision:
#Prime areas are valid. Add as normal.
result_areas[extruder_id].extend(prime_areas[extruder_id])
nozzle_disallowed_areas = extruder.getProperty("nozzle_disallowed_areas", "value")
for area in nozzle_disallowed_areas:
polygon = Polygon(numpy.array(area, numpy.float32))
polygon = polygon.getMinkowskiHull(Polygon.approximatedCircle(disallowed_border_size))
result_areas[extruder_id].append(polygon) #Don't perform the offset on these.
# Add prime tower location as disallowed area.
prime_tower_collision = False
prime_tower_areas = self._computeDisallowedAreasPrinted(used_extruders)
for extruder_id in prime_tower_areas:
for prime_tower_area in prime_tower_areas[extruder_id]:
for area in result_areas[extruder_id]:
if prime_tower_area.intersectsPolygon(area) is not None:
prime_tower_collision = True
break
if prime_tower_collision: #Already found a collision.
break
if not prime_tower_collision:
result_areas[extruder_id].extend(prime_tower_areas[extruder_id])
else:
self._error_areas.extend(prime_tower_areas[extruder_id])
self._has_errors = len(self._error_areas) > 0
self._disallowed_areas = []
for extruder_id in result_areas:
self._disallowed_areas.extend(result_areas[extruder_id])
## Computes the disallowed areas for objects that are printed with print
# features.
#
# This means that the brim, travel avoidance and such will be applied to
# these features.
#
# \return A dictionary with for each used extruder ID the disallowed areas
# where that extruder may not print.
def _computeDisallowedAreasPrinted(self, used_extruders):
result = {}
for extruder in used_extruders:
result[extruder.getId()] = []
#Currently, the only normally printed object is the prime tower.
if ExtruderManager.getInstance().getResolveOrValue("prime_tower_enable") == True:
prime_tower_size = self._global_container_stack.getProperty("prime_tower_size", "value")
prime_tower_x = self._global_container_stack.getProperty("prime_tower_position_x", "value") - machine_width / 2
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_area = Polygon([
@ -359,118 +502,118 @@ class BuildVolume(SceneNode):
[prime_tower_x, prime_tower_y],
[prime_tower_x - prime_tower_size, prime_tower_y],
])
disallowed_polygons = []
prime_tower_area = prime_tower_area.getMinkowskiHull(Polygon.approximatedCircle(0))
for extruder in used_extruders:
result[extruder.getId()].append(prime_tower_area) #The prime tower location is the same for each extruder, regardless of offset.
# Check if prime positions intersect with disallowed areas
prime_collision = False
if disallowed_areas:
for area in disallowed_areas:
poly = Polygon(numpy.array(area, numpy.float32))
return result
# Minkowski with zero, to ensure that the polygon is correct & watertight.
poly = poly.getMinkowskiHull(Polygon.approximatedCircle(0))
disallowed_polygons.append(poly)
## Computes the disallowed areas for the prime locations.
#
# These are special because they are not subject to things like brim or
# travel avoidance. They do get a dilute with the border size though
# because they may not intersect with brims and such of other objects.
#
# \param border_size The size with which to offset the disallowed areas
# due to skirt, brim, travel avoid distance, etc.
# \param used_extruders The extruder stacks to generate disallowed areas
# for.
# \return A dictionary with for each used extruder ID the prime areas.
def _computeDisallowedAreasPrime(self, border_size, used_extruders):
result = {}
extruder_manager = ExtruderManager.getInstance()
extruders = extruder_manager.getMachineExtruders(self._global_container_stack.getId())
prime_polygons = []
# Each extruder has it's own prime location
for extruder in extruders:
prime_x = extruder.getProperty("extruder_prime_pos_x", "value") - machine_width / 2
prime_y = machine_depth / 2 - extruder.getProperty("extruder_prime_pos_y", "value")
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_polygon = Polygon([
[prime_x - PRIME_CLEARANCE, prime_y - PRIME_CLEARANCE],
[prime_x + PRIME_CLEARANCE, prime_y - PRIME_CLEARANCE],
[prime_x + PRIME_CLEARANCE, prime_y + PRIME_CLEARANCE],
[prime_x - PRIME_CLEARANCE, prime_y + PRIME_CLEARANCE],
])
prime_polygon = prime_polygon.getMinkowskiHull(Polygon.approximatedCircle(0))
collision = False
prime_polygon = Polygon.approximatedCircle(PRIME_CLEARANCE)
prime_polygon = prime_polygon.translate(prime_x, prime_y)
prime_polygon = prime_polygon.getMinkowskiHull(Polygon.approximatedCircle(border_size))
result[extruder.getId()] = [prime_polygon]
# Check if prime polygon is intersecting with any of the other disallowed areas.
# Note that we check the prime area without bed adhesion.
for poly in disallowed_polygons:
if prime_polygon.intersectsPolygon(poly) is not None:
collision = True
break
return result
# Also collide with other prime positions
for poly in prime_polygons:
if prime_polygon.intersectsPolygon(poly) is not None:
collision = True
break
## Computes the disallowed areas that are statically placed in the machine.
#
# It computes different disallowed areas depending on the offset of the
# extruder. The resulting dictionary will therefore have an entry for each
# extruder that is used.
#
# \param border_size The size with which to offset the disallowed areas
# due to skirt, brim, travel avoid distance, etc.
# \param used_extruders The extruder stacks to generate disallowed areas
# for.
# \return A dictionary with for each used extruder ID the disallowed areas
# where that extruder may not print.
def _computeDisallowedAreasStatic(self, border_size, used_extruders):
#Convert disallowed areas to polygons and dilate them.
machine_disallowed_polygons = []
for area in self._global_container_stack.getProperty("machine_disallowed_areas", "value"):
polygon = Polygon(numpy.array(area, numpy.float32))
polygon = polygon.getMinkowskiHull(Polygon.approximatedCircle(border_size))
machine_disallowed_polygons.append(polygon)
if not collision:
# Prime area is valid. Add as normal.
# Once it's added like this, it will recieve a bed adhesion offset, just like the others.
prime_polygons.append(prime_polygon)
else:
self._error_areas.append(prime_polygon)
prime_collision = collision or prime_collision
result = {}
for extruder in used_extruders:
extruder_id = extruder.getId()
offset_x = extruder.getProperty("machine_nozzle_offset_x", "value")
if offset_x is None:
offset_x = 0
offset_y = extruder.getProperty("machine_nozzle_offset_y", "value")
if offset_y is None:
offset_y = 0
result[extruder_id] = []
disallowed_polygons.extend(prime_polygons)
for polygon in machine_disallowed_polygons:
result[extruder_id].append(polygon.translate(offset_x, offset_y)) #Compensate for the nozzle offset of this extruder.
disallowed_border_size = self._getEdgeDisallowedSize()
# Extend every area already in the disallowed_areas with the skirt size.
if disallowed_areas:
for poly in disallowed_polygons:
poly = poly.getMinkowskiHull(Polygon.approximatedCircle(disallowed_border_size))
areas.append(poly)
# Add the skirt areas around the borders of the build plate.
if disallowed_border_size > 0:
#Add the border around the edge of the build volume.
left_unreachable_border = 0
right_unreachable_border = 0
top_unreachable_border = 0
bottom_unreachable_border = 0
#The build volume is defined as the union of the area that all extruders can reach, so we need to know the relative offset to all extruders.
for other_extruder in ExtruderManager.getInstance().getActiveExtruderStacks():
other_offset_x = other_extruder.getProperty("machine_nozzle_offset_x", "value")
other_offset_y = other_extruder.getProperty("machine_nozzle_offset_y", "value")
left_unreachable_border = min(left_unreachable_border, other_offset_x - offset_x)
right_unreachable_border = max(right_unreachable_border, other_offset_x - offset_x)
top_unreachable_border = min(top_unreachable_border, other_offset_y - offset_y)
bottom_unreachable_border = max(bottom_unreachable_border, other_offset_y - offset_y)
half_machine_width = self._global_container_stack.getProperty("machine_width", "value") / 2
half_machine_depth = self._global_container_stack.getProperty("machine_depth", "value") / 2
if border_size - left_unreachable_border > 0:
result[extruder_id].append(Polygon(numpy.array([
[-half_machine_width, -half_machine_depth],
[-half_machine_width, half_machine_depth],
[-half_machine_width + border_size - left_unreachable_border, half_machine_depth - border_size - bottom_unreachable_border],
[-half_machine_width + border_size - left_unreachable_border, -half_machine_depth + border_size - top_unreachable_border]
], numpy.float32)))
if border_size + right_unreachable_border > 0:
result[extruder_id].append(Polygon(numpy.array([
[half_machine_width, half_machine_depth],
[half_machine_width, -half_machine_depth],
[half_machine_width - border_size - right_unreachable_border, -half_machine_depth + border_size - top_unreachable_border],
[half_machine_width - border_size - right_unreachable_border, half_machine_depth - border_size - bottom_unreachable_border]
], numpy.float32)))
if border_size + bottom_unreachable_border > 0:
result[extruder_id].append(Polygon(numpy.array([
[-half_machine_width, half_machine_depth],
[half_machine_width, half_machine_depth],
[half_machine_width - border_size - right_unreachable_border, half_machine_depth - border_size - bottom_unreachable_border],
[-half_machine_width + border_size - left_unreachable_border, half_machine_depth - border_size - bottom_unreachable_border]
], numpy.float32)))
if border_size - top_unreachable_border > 0:
result[extruder_id].append(Polygon(numpy.array([
[half_machine_width, -half_machine_depth],
[-half_machine_width, -half_machine_depth],
[-half_machine_width + border_size - left_unreachable_border, -half_machine_depth + border_size - top_unreachable_border],
[half_machine_width - border_size - right_unreachable_border, -half_machine_depth + border_size - top_unreachable_border]
], numpy.float32)))
areas.append(Polygon(numpy.array([
[-half_machine_width, -half_machine_depth],
[-half_machine_width, half_machine_depth],
[-half_machine_width + disallowed_border_size, half_machine_depth - disallowed_border_size],
[-half_machine_width + disallowed_border_size, -half_machine_depth + disallowed_border_size]
], numpy.float32)))
areas.append(Polygon(numpy.array([
[half_machine_width, half_machine_depth],
[half_machine_width, -half_machine_depth],
[half_machine_width - disallowed_border_size, -half_machine_depth + disallowed_border_size],
[half_machine_width - disallowed_border_size, half_machine_depth - disallowed_border_size]
], numpy.float32)))
areas.append(Polygon(numpy.array([
[-half_machine_width, half_machine_depth],
[half_machine_width, half_machine_depth],
[half_machine_width - disallowed_border_size, half_machine_depth - disallowed_border_size],
[-half_machine_width + disallowed_border_size, half_machine_depth - disallowed_border_size]
], numpy.float32)))
areas.append(Polygon(numpy.array([
[half_machine_width, -half_machine_depth],
[-half_machine_width, -half_machine_depth],
[-half_machine_width + disallowed_border_size, -half_machine_depth + disallowed_border_size],
[half_machine_width - disallowed_border_size, -half_machine_depth + disallowed_border_size]
], numpy.float32)))
# Check if the prime tower area intersects with any of the other areas.
# If this is the case, add it to the error area's so it can be drawn in red.
# If not, add it back to disallowed area's, so it's rendered as normal.
prime_tower_collision = False
if prime_tower_area:
# Using Minkowski of 0 fixes the prime tower area so it's rendered correctly
prime_tower_area = prime_tower_area.getMinkowskiHull(Polygon.approximatedCircle(0))
for area in areas:
if prime_tower_area.intersectsPolygon(area) is not None:
prime_tower_collision = True
break
if not prime_tower_collision:
areas.append(prime_tower_area)
else:
self._error_areas.append(prime_tower_area)
# The buildplate has errors if either prime tower or prime has a colission.
self._has_errors = prime_tower_collision or prime_collision
self._disallowed_areas = areas
return result
## Private convenience function to get a setting from the adhesion
# extruder.
@ -481,6 +624,15 @@ class BuildVolume(SceneNode):
def _getSettingFromAdhesionExtruder(self, setting_key, property = "value"):
return self._getSettingFromExtruder(setting_key, "adhesion_extruder_nr", property)
## Private convenience function to get a setting from every extruder.
#
# For single extrusion machines, this gets the setting from the global
# stack.
#
# \return A sequence of setting values, one for each extruder.
def _getSettingFromAllExtruders(self, setting_key, property = "value"):
return ExtruderManager.getInstance().getAllExtruderSettings(setting_key, property)
## Private convenience function to get a setting from the support infill
# extruder.
#
@ -549,11 +701,13 @@ class BuildVolume(SceneNode):
bed_adhesion_size += value
elif adhesion_type == "raft":
bed_adhesion_size = self._getSettingFromAdhesionExtruder("raft_margin")
elif adhesion_type == "none":
bed_adhesion_size = 0
else:
raise Exception("Unknown bed adhesion type. Did you forget to update the build volume calculations for your new bed adhesion type?")
support_expansion = 0
if self._getSettingFromSupportInfillExtruder("support_offset"):
if self._getSettingFromSupportInfillExtruder("support_offset") and self._global_container_stack.getProperty("support_enable", "value"):
support_expansion += self._getSettingFromSupportInfillExtruder("support_offset")
farthest_shield_distance = 0
@ -563,10 +717,12 @@ class BuildVolume(SceneNode):
farthest_shield_distance = max(farthest_shield_distance, container_stack.getProperty("ooze_shield_dist", "value"))
move_from_wall_radius = 0 # Moves that start from outer wall.
if self._getSettingFromAdhesionExtruder("infill_wipe_dist"):
move_from_wall_radius = max(move_from_wall_radius, self._getSettingFromAdhesionExtruder("infill_wipe_dist"))
if self._getSettingFromAdhesionExtruder("travel_avoid_distance"):
move_from_wall_radius = max(move_from_wall_radius, self._getSettingFromAdhesionExtruder("travel_avoid_distance"))
move_from_wall_radius = max(move_from_wall_radius, max(self._getSettingFromAllExtruders("infill_wipe_dist")))
avoid_enabled_per_extruder = self._getSettingFromAllExtruders(("travel_avoid_other_parts"))
avoid_distance_per_extruder = self._getSettingFromAllExtruders("travel_avoid_distance")
for index, avoid_other_parts_enabled in enumerate(avoid_enabled_per_extruder): #For each extruder (or just global).
if avoid_other_parts_enabled:
move_from_wall_radius = max(move_from_wall_radius, avoid_distance_per_extruder[index]) #Index of the same extruder.
#Now combine our different pieces of data to get the final border size.
#Support expansion is added to the bed adhesion, since the bed adhesion goes around support.
@ -582,4 +738,5 @@ class BuildVolume(SceneNode):
_prime_settings = ["extruder_prime_pos_x", "extruder_prime_pos_y", "extruder_prime_pos_z"]
_tower_settings = ["prime_tower_enable", "prime_tower_size", "prime_tower_position_x", "prime_tower_position_y"]
_ooze_shield_settings = ["ooze_shield_enabled", "ooze_shield_dist"]
_distance_settings = ["infill_wipe_dist", "travel_avoid_distance", "support_offset"]
_distance_settings = ["infill_wipe_dist", "travel_avoid_distance", "support_offset", "support_enable", "travel_avoid_other_parts"]
_extruder_settings = ["support_enable", "support_interface_enable", "support_infill_extruder_nr", "support_extruder_nr_layer_0", "support_interface_extruder_nr", "brim_line_count", "adhesion_extruder_nr", "adhesion_type"] #Settings that can affect which extruders are used.

View file

@ -200,6 +200,8 @@ class ConvexHullDecorator(SceneNodeDecorator):
if len(vertex_data) >= 4:
convex_hull = hull.getConvexHull()
offset_hull = self._offsetHull(convex_hull)
else:
return Polygon([]) # Node has no mesh data, so just return an empty Polygon.
# Store the result in the cache
self._2d_convex_hull_mesh = mesh
@ -234,6 +236,8 @@ class ConvexHullDecorator(SceneNodeDecorator):
extra_margin = max(0, self._getSettingProperty("raft_margin", "value"))
elif adhesion_type == "brim":
extra_margin = max(0, self._getSettingProperty("brim_line_count", "value") * self._getSettingProperty("skirt_brim_line_width", "value"))
elif adhesion_type == "none":
extra_margin = 0
elif adhesion_type == "skirt":
extra_margin = max(
0, self._getSettingProperty("skirt_gap", "value") +

View file

@ -7,6 +7,7 @@ from UM.Scene.Camera import Camera
from UM.Math.Vector import Vector
from UM.Math.Quaternion import Quaternion
from UM.Math.AxisAlignedBox import AxisAlignedBox
from UM.Math.Matrix import Matrix
from UM.Resources import Resources
from UM.Scene.ToolHandle import ToolHandle
from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
@ -225,7 +226,7 @@ class CuraApplication(QtApplication):
Preferences.getInstance().setDefault("general/visible_settings", """
machine_settings
resolution
resolution
layer_height
shell
wall_thickness
@ -250,17 +251,17 @@ class CuraApplication(QtApplication):
cool_fan_enabled
support
support_enable
support_extruder_nr
support_type
support_interface_density
platform_adhesion
adhesion_type
adhesion_extruder_nr
brim_width
raft_airgap
layer_0_z_overlap
raft_surface_layers
dual
adhesion_extruder_nr
support_extruder_nr
prime_tower_enable
prime_tower_size
prime_tower_position_x
@ -340,7 +341,7 @@ class CuraApplication(QtApplication):
if path:
instance.setPath(path)
with SaveFile(path, "wt", -1, "utf-8") as f:
with SaveFile(path, "wt") as f:
f.write(data)
for stack in ContainerRegistry.getInstance().findContainerStacks():
@ -367,7 +368,7 @@ class CuraApplication(QtApplication):
path = Resources.getStoragePath(self.ResourceTypes.ExtruderStack, file_name)
if path:
stack.setPath(path)
with SaveFile(path, "wt", -1, "utf-8") as f:
with SaveFile(path, "wt") as f:
f.write(data)
@ -507,15 +508,18 @@ class CuraApplication(QtApplication):
qmlRegisterType(cura.Settings.ExtrudersModel, "Cura", 1, 0, "ExtrudersModel")
qmlRegisterType(cura.Settings.ContainerSettingsModel, "Cura", 1, 0, "ContainerSettingsModel")
qmlRegisterType(cura.Settings.ProfilesModel, "Cura", 1, 0, "ProfilesModel")
qmlRegisterSingletonType(cura.Settings.ProfilesModel, "Cura", 1, 0, "ProfilesModel", cura.Settings.ProfilesModel.createProfilesModel)
qmlRegisterType(cura.Settings.QualityAndUserProfilesModel, "Cura", 1, 0, "QualityAndUserProfilesModel")
qmlRegisterType(cura.Settings.UserProfilesModel, "Cura", 1, 0, "UserProfilesModel")
qmlRegisterType(cura.Settings.MaterialSettingsVisibilityHandler, "Cura", 1, 0, "MaterialSettingsVisibilityHandler")
qmlRegisterType(cura.Settings.QualitySettingsModel, "Cura", 1, 0, "QualitySettingsModel")
qmlRegisterType(cura.Settings.MachineNameValidator, "Cura", 1, 0, "MachineNameValidator")
qmlRegisterSingletonType(cura.Settings.ContainerManager, "Cura", 1, 0, "ContainerManager", cura.Settings.ContainerManager.createContainerManager)
qmlRegisterSingletonType(QUrl.fromLocalFile(Resources.getPath(CuraApplication.ResourceTypes.QmlFiles, "Actions.qml")), "Cura", 1, 0, "Actions")
# As of Qt5.7, it is necessary to get rid of any ".." in the path for the singleton to work.
actions_url = QUrl.fromLocalFile(os.path.abspath(Resources.getPath(CuraApplication.ResourceTypes.QmlFiles, "Actions.qml")))
qmlRegisterSingletonType(actions_url, "Cura", 1, 0, "Actions")
engine.rootContext().setContextProperty("ExtruderManager", cura.Settings.ExtruderManager.getInstance())
@ -528,11 +532,19 @@ class CuraApplication(QtApplication):
def onSelectionChanged(self):
if Selection.hasSelection():
if not self.getController().getActiveTool():
if self.getController().getActiveTool():
# If the tool has been disabled by the new selection
if not self.getController().getActiveTool().getEnabled():
# Default
self.getController().setActiveTool("TranslateTool")
else:
if self._previous_active_tool:
self.getController().setActiveTool(self._previous_active_tool)
if not self.getController().getActiveTool().getEnabled():
self.getController().setActiveTool("TranslateTool")
self._previous_active_tool = None
else:
# Default
self.getController().setActiveTool("TranslateTool")
if Preferences.getInstance().getValue("view/center_on_select"):
self._center_after_select = True
@ -643,10 +655,9 @@ class CuraApplication(QtApplication):
while current_node.getParent() and current_node.getParent().callDecoration("isGroup"):
current_node = current_node.getParent()
new_node = copy.deepcopy(current_node)
op = GroupedOperation()
for _ in range(count):
new_node = copy.deepcopy(current_node)
op.addOperation(AddSceneNodeOperation(new_node, current_node.getParent()))
op.push()
@ -727,7 +738,11 @@ class CuraApplication(QtApplication):
for node in nodes:
# Ensure that the object is above the build platform
node.removeDecorator(ZOffsetDecorator.ZOffsetDecorator)
op.addOperation(SetTransformOperation(node, Vector(0, node.getWorldPosition().y - node.getBoundingBox().bottom, 0)))
if node.getBoundingBox():
center_y = node.getWorldPosition().y - node.getBoundingBox().bottom
else:
center_y = 0
op.addOperation(SetTransformOperation(node, Vector(0, center_y, 0)))
op.push()
## Reset all transformations on nodes with mesh data.
@ -749,11 +764,10 @@ class CuraApplication(QtApplication):
for node in nodes:
# Ensure that the object is above the build platform
node.removeDecorator(ZOffsetDecorator.ZOffsetDecorator)
center_y = 0
if node.callDecoration("isGroup"):
if node.getBoundingBox():
center_y = node.getWorldPosition().y - node.getBoundingBox().bottom
else:
center_y = node.getMeshData().getCenterPosition().y
center_y = 0
op.addOperation(SetTransformOperation(node, Vector(0, center_y, 0), Quaternion(), Vector(1, 1, 1)))
op.push()
@ -822,8 +836,18 @@ class CuraApplication(QtApplication):
Logger.log("d", "mergeSelected: Exception:", e)
return
# Compute the center of the objects when their origins are aligned.
object_centers = [node.getMeshData().getCenterPosition().scale(node.getScale()) for node in group_node.getChildren() if node.getMeshData()]
meshes = [node.getMeshData() for node in group_node.getAllChildren() if node.getMeshData()]
# Compute the center of the objects
object_centers = []
# Forget about the translation that the original objects have
zero_translation = Matrix(data=numpy.zeros(3))
for mesh, node in zip(meshes, group_node.getChildren()):
transformation = node.getLocalTransformation()
transformation.setTranslation(zero_translation)
transformed_mesh = mesh.getTransformed(transformation)
center = transformed_mesh.getCenterPosition()
object_centers.append(center)
if object_centers and len(object_centers) > 0:
middle_x = sum([v.x for v in object_centers]) / len(object_centers)
middle_y = sum([v.y for v in object_centers]) / len(object_centers)
@ -833,9 +857,14 @@ class CuraApplication(QtApplication):
offset = Vector(0, 0, 0)
# Move each node to the same position.
for center, node in zip(object_centers, group_node.getChildren()):
# Align the object and also apply the offset to center it inside the group.
node.setPosition(center - offset)
for mesh, node in zip(meshes, group_node.getChildren()):
transformation = node.getLocalTransformation()
transformation.setTranslation(zero_translation)
transformed_mesh = mesh.getTransformed(transformation)
# Align the object around its zero position
# and also apply the offset to center it inside the group.
node.setPosition(-transformed_mesh.getZeroPosition() - offset)
# Use the previously found center of the group bounding box as the new location of the group
group_node.setPosition(group_node.getBoundingBox().center)
@ -889,15 +918,16 @@ class CuraApplication(QtApplication):
fileLoaded = pyqtSignal(str)
def _onFileLoaded(self, job):
node = job.getResult()
if node != None:
self.fileLoaded.emit(job.getFileName())
node.setSelectable(True)
node.setName(os.path.basename(job.getFileName()))
op = AddSceneNodeOperation(node, self.getController().getScene().getRoot())
op.push()
nodes = job.getResult()
for node in nodes:
if node is not None:
self.fileLoaded.emit(job.getFileName())
node.setSelectable(True)
node.setName(os.path.basename(job.getFileName()))
op = AddSceneNodeOperation(node, self.getController().getScene().getRoot())
op.push()
self.getController().getScene().sceneChanged.emit(node) #Force scene change.
self.getController().getScene().sceneChanged.emit(node) #Force scene change.
def _onJobFinished(self, job):
if type(job) is not ReadMeshJob or not job.getResult():

View file

@ -82,7 +82,7 @@ class PlatformPhysics:
# Move it downwards if bottom is above platform
move_vector = Vector()
if Preferences.getInstance().getValue("physics/automatic_drop_down") and not (node.getParent() and node.getParent().callDecoration("isGroup")): #If an object is grouped, don't move it down
if Preferences.getInstance().getValue("physics/automatic_drop_down") and not (node.getParent() and node.getParent().callDecoration("isGroup")) and node.isEnabled(): #If an object is grouped, don't move it down
z_offset = node.callDecoration("getZOffset") if node.getDecorator(ZOffsetDecorator.ZOffsetDecorator) else 0
move_vector = move_vector.set(y=-bbox.bottom + z_offset)

View file

@ -3,21 +3,22 @@
from UM.Operations.Operation import Operation
from UM.Operations.GroupedOperation import GroupedOperation
from UM.Scene.SceneNode import SceneNode
## A specialised operation designed specifically to modify the previous operation.
class PlatformPhysicsOperation(Operation):
def __init__(self, node, translation):
super().__init__()
self._node = node
self._old_position = node.getPosition()
self._new_position = node.getPosition() + translation
self._old_transformation = node.getLocalTransformation()
self._translation = translation
self._always_merge = True
def undo(self):
self._node.setPosition(self._old_position)
self._node.setTransformation(self._old_transformation)
def redo(self):
self._node.setPosition(self._new_position)
self._node.translate(self._translation, SceneNode.TransformSpace.World)
def mergeWith(self, other):
group = GroupedOperation()
@ -28,4 +29,4 @@ class PlatformPhysicsOperation(Operation):
return group
def __repr__(self):
return "PlatformPhysicsOperation(new_position = {0})".format(self._new_position)
return "PlatformPhysicsOperation(translation = {0})".format(self._translation)

View file

@ -134,6 +134,20 @@ class PrinterOutputDevice(QObject, OutputDevice):
def _setJobState(self, job_state):
Logger.log("w", "_setJobState is not implemented by this output device")
@pyqtSlot()
def startCamera(self):
self._startCamera()
def _startCamera(self):
Logger.log("w", "_startCamera is not implemented by this output device")
@pyqtSlot()
def stopCamera(self):
self._stopCamera()
def _stopCamera(self):
Logger.log("w", "_stopCamera is not implemented by this output device")
@pyqtProperty(str, notify = jobNameChanged)
def jobName(self):
return self._job_name

View file

@ -27,10 +27,17 @@ class QualityManager:
# specified then the currently selected machine definition is used.
# \param material_containers (Optional) \type{List[ContainerInstance]} If nothing is specified then
# the current set of selected materials is used.
# \return the matching quality containers \type{List[ContainerInstance]}
# \return the matching quality container \type{ContainerInstance}
def findQualityByName(self, quality_name, machine_definition=None, material_containers=None):
criteria = {"type": "quality", "name": quality_name}
return self._getFilteredContainersForStack(machine_definition, material_containers, **criteria)
result = self._getFilteredContainersForStack(machine_definition, material_containers, **criteria)
# Fall back to using generic materials and qualities if nothing could be found.
if not result and material_containers and len(material_containers) == 1:
basic_materials = self._getBasicMaterials(material_containers[0])
result = self._getFilteredContainersForStack(machine_definition, basic_materials, **criteria)
return result[0] if result else None
## Find a quality changes container by name.
#
@ -82,8 +89,9 @@ class QualityManager:
# \param material_containers (Optional) \type{List[ContainerInstance]} If nothing is specified then
# the current set of selected materials is used.
# \return the matching quality container \type{ContainerInstance}
def findQualityByQualityType(self, quality_type, machine_definition=None, material_containers=None):
criteria = {"type": "quality"}
def findQualityByQualityType(self, quality_type, machine_definition=None, material_containers=None, **kwargs):
criteria = kwargs
criteria["type"] = "quality"
if quality_type:
criteria["quality_type"] = quality_type
result = self._getFilteredContainersForStack(machine_definition, material_containers, **criteria)
@ -160,7 +168,8 @@ class QualityManager:
# \return \type{List[InstanceContainer]} a list of the basic materials or an empty list if one could not be found.
def _getBasicMaterials(self, material_container):
base_material = material_container.getMetaDataEntry("material")
if material_container.getDefinition().getMetaDataEntry("has_machine_quality"):
material_container_definition = material_container.getDefinition()
if material_container_definition and material_container_definition.getMetaDataEntry("has_machine_quality"):
definition_id = material_container.getDefinition().getMetaDataEntry("quality_definition", material_container.getDefinition().getId())
else:
definition_id = "fdmprinter"
@ -218,7 +227,7 @@ class QualityManager:
result = []
for container in containers:
# If the machine specifies we should filter by material, exclude containers that do not match any active material.
if filter_by_material and container.getMetaDataEntry("material") not in material_ids:
if filter_by_material and container.getMetaDataEntry("material") not in material_ids and not "global_quality" in kwargs:
continue
result.append(container)
return result

View file

@ -32,14 +32,27 @@ class SetParentOperation(Operation.Operation):
# \param new_parent The new parent. Note: this argument can be None, which would hide the node from the scene.
def _set_parent(self, new_parent):
if new_parent:
self._node.setPosition(self._node.getWorldPosition() - new_parent.getWorldPosition())
current_parent = self._node.getParent()
if current_parent:
self._node.scale(current_parent.getScale() / new_parent.getScale())
self._node.rotate(current_parent.getOrientation())
else:
self._node.scale(Vector(1, 1, 1) / new_parent.getScale())
self._node.rotate(new_parent.getOrientation().getInverse())
# Special casing for groups that have been removed.
# In that case we want to put them back where they belong before checking the depth difference.
# If we don't, we always get 0.
old_parent = new_parent.callDecoration("getOldParent")
if old_parent:
new_parent.callDecoration("getNode").setParent(old_parent)
# Based on the depth difference, we need to do something different.
depth_difference = current_parent.getDepth() - new_parent.getDepth()
child_transformation = self._node.getLocalTransformation()
if depth_difference > 0:
parent_transformation = current_parent.getLocalTransformation()
# A node in the chain was removed, so we need to squash the parent info into all the nodes, so positions remain the same.
self._node.setTransformation(parent_transformation.multiply(child_transformation))
else:
# A node is inserted into the chain, so use the inverse of the parent to set the transformation of it's children.
parent_transformation = new_parent.getLocalTransformation()
result = parent_transformation.getInverse().multiply(child_transformation, copy = True)
self._node.setTransformation(result)
self._node.setParent(new_parent)

View file

@ -4,7 +4,7 @@
import os.path
import urllib
from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal, QUrl
from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal, QUrl, QVariant
from PyQt5.QtWidgets import QMessageBox
import UM.PluginRegistry
@ -261,8 +261,9 @@ class ContainerManager(QObject):
@pyqtSlot(str, result = bool)
def isContainerUsed(self, container_id):
UM.Logger.log("d", "Checking if container %s is currently used in the active stacks", container_id)
for stack in cura.Settings.ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks():
UM.Logger.log("d", "Checking if container %s is currently used", container_id)
containers = self._container_registry.findContainerStacks()
for stack in containers:
if container_id in [child.getId() for child in stack.getContainers()]:
UM.Logger.log("d", "The container is in use by %s", stack.getId())
return True
@ -611,13 +612,12 @@ class ContainerManager(QObject):
if base_name is None:
base_name = quality_name
# Try to find a Quality with the name.
containers = QualityManager.getInstance().findQualityByName(quality_name, machine_definition, material_instances)
if containers:
container = containers[0]
container = QualityManager.getInstance().findQualityByName(quality_name, machine_definition, material_instances)
if container:
UM.Logger.log("d", "We found a quality to duplicate.")
return self._duplicateQualityForMachineType(container, base_name, machine_definition)
UM.Logger.log("d", "We found a quality_changes to duplicate.")
# Assume it is a quality changes.
return self._duplicateQualityChangesForMachineType(quality_name, base_name, machine_definition)
@ -650,7 +650,10 @@ class ContainerManager(QObject):
new_change_instances = []
for container in QualityManager.getInstance().findQualityChangesByName(quality_changes_name,
machine_definition):
new_unique_id = self._createUniqueId(container.getId(), base_name)
base_id = container.getMetaDataEntry("extruder")
if not base_id:
base_id = container.getDefinition().getId()
new_unique_id = self._createUniqueId(base_id, base_name)
new_container = container.duplicate(new_unique_id, base_name)
new_change_instances.append(new_container)
self._container_registry.addContainer(new_container)
@ -802,3 +805,50 @@ class ContainerManager(QObject):
else:
quality_changes.setDefinition(QualityManager.getInstance().getParentMachineDefinition(machine_definition))
return quality_changes
## Import profiles from a list of file_urls.
# Each QUrl item must end with .curaprofile, or it will not be imported.
#
# \param QVariant<QUrl>, essentially a list with QUrl objects.
# \return Dict with keys status, text
@pyqtSlot(QVariant, result="QVariantMap")
def importProfiles(self, file_urls):
status = "ok"
results = {"ok": [], "error": []}
for file_url in file_urls:
if not file_url.isValid():
continue
path = file_url.toLocalFile()
if not path:
continue
if not path.endswith(".curaprofile"):
continue
single_result = UM.Settings.ContainerRegistry.getInstance().importProfile(path)
if single_result["status"] == "error":
status = "error"
results[single_result["status"]].append(single_result["message"])
return {
"status": status,
"message": "\n".join(results["ok"] + results["error"])}
## Import single profile, file_url does not have to end with curaprofile
@pyqtSlot(QUrl, result="QVariantMap")
def importProfile(self, file_url):
if not file_url.isValid():
return
path = file_url.toLocalFile()
if not path:
return
return UM.Settings.ContainerRegistry.getInstance().importProfile(path)
@pyqtSlot("QVariantList", QUrl, str)
def exportProfile(self, instance_id, file_url, file_type):
if not file_url.isValid():
return
path = file_url.toLocalFile()
if not path:
return
UM.Settings.ContainerRegistry.getInstance().exportProfile(instance_id, path, file_type)

View file

@ -165,20 +165,19 @@ class CuraContainerRegistry(ContainerRegistry):
profile_or_list = profile_reader.read(file_name) # Try to open the file with the profile reader.
except Exception as e:
# Note that this will fail quickly. That is, if any profile reader throws an exception, it will stop reading. It will only continue reading if the reader returned None.
Logger.log("e", "Failed to import profile from %s: %s while using profile reader", file_name, str(e), profile_reader.getPluginId())
Logger.log("e", "Failed to import profile from %s: %s while using profile reader. Got exception %s", file_name,profile_reader.getPluginId(), str(e))
return { "status": "error", "message": catalog.i18nc("@info:status", "Failed to import profile from <filename>{0}</filename>: <message>{1}</message>", file_name, str(e))}
if profile_or_list: # Success!
name_seed = os.path.splitext(os.path.basename(file_name))[0]
new_name = self.uniqueName(name_seed)
if type(profile_or_list) is not list:
profile = profile_or_list
self._configureProfile(profile, name_seed)
self._configureProfile(profile, name_seed, new_name)
return { "status": "ok", "message": catalog.i18nc("@info:status", "Successfully imported profile {0}", profile.getName()) }
else:
profile_index = -1
global_profile = None
new_name = self.uniqueName(name_seed)
for profile in profile_or_list:
if profile_index >= 0:
if len(machine_extruders) > profile_index:
@ -211,7 +210,7 @@ class CuraContainerRegistry(ContainerRegistry):
return {"status": "ok", "message": catalog.i18nc("@info:status", "Successfully imported profile {0}", profile_or_list[0].getName())}
# If it hasn't returned by now, none of the plugins loaded the profile successfully.
return {"status": "error", "message": catalog.i18nc("@info:status", "Profile {0} has an unknown file type.", file_name)}
return {"status": "error", "message": catalog.i18nc("@info:status", "Profile {0} has an unknown file type or is corrupted.", file_name)}
def _configureProfile(self, profile, id_seed, new_name):
profile.setReadOnly(False)

View file

@ -5,6 +5,8 @@ from PyQt5.QtCore import pyqtSignal, pyqtProperty, pyqtSlot, QObject, QVariant #
import UM.Application #To get the global container stack to find the current machine.
import UM.Logger
from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator #To find which extruders are used in the scene.
from UM.Scene.SceneNode import SceneNode #To find which extruders are used in the scene.
import UM.Settings.ContainerRegistry #Finding containers by ID.
import UM.Settings.SettingFunction
@ -50,8 +52,11 @@ class ExtruderManager(QObject):
@pyqtProperty(int, notify = extrudersChanged)
def extruderCount(self):
if not UM.Application.getInstance().getGlobalContainerStack():
return 0 # No active machine, so no extruders.
return len(self._extruder_trains[UM.Application.getInstance().getGlobalContainerStack().getId()])
return 0 # No active machine, so no extruders.
try:
return len(self._extruder_trains[UM.Application.getInstance().getGlobalContainerStack().getId()])
except KeyError:
return 0
@pyqtProperty("QVariantMap", notify=extrudersChanged)
def extruderIds(self):
@ -265,18 +270,78 @@ class ExtruderManager(QObject):
container_registry.addContainer(container_stack)
def getAllExtruderValues(self, setting_key):
return self.getAllExtruderSettings(setting_key, "value")
## Gets a property of a setting for all extruders.
#
# \param setting_key \type{str} The setting to get the property of.
# \param property \type{str} The property to get.
# \return \type{List} the list of results
def getAllExtruderSettings(self, setting_key, property):
global_container_stack = UM.Application.getInstance().getGlobalContainerStack()
multi_extrusion = global_container_stack.getProperty("machine_extruder_count", "value") > 1
if not multi_extrusion:
return [global_container_stack.getProperty(setting_key, "value")]
if global_container_stack.getProperty("machine_extruder_count", "value") <= 1:
return [global_container_stack.getProperty(setting_key, property)]
result = []
for index in self.extruderIds:
extruder_stack_id = self.extruderIds[str(index)]
stack = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id=extruder_stack_id)[0]
result.append(stack.getProperty(setting_key, "value"))
stack = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id = extruder_stack_id)[0]
result.append(stack.getProperty(setting_key, property))
return result
## Gets the extruder stacks that are actually being used at the moment.
#
# An extruder stack is being used if it is the extruder to print any mesh
# with, or if it is the support infill extruder, the support interface
# extruder, or the bed adhesion extruder.
#
# If there are no extruders, this returns the global stack as a singleton
# list.
#
# \return A list of extruder stacks.
def getUsedExtruderStacks(self):
global_stack = UM.Application.getInstance().getGlobalContainerStack()
container_registry = UM.Settings.ContainerRegistry.getInstance()
if global_stack.getProperty("machine_extruder_count", "value") <= 1: #For single extrusion.
return [global_stack]
used_extruder_stack_ids = set()
#Get the extruders of all meshes in the scene.
support_enabled = False
support_interface_enabled = False
scene_root = UM.Application.getInstance().getController().getScene().getRoot()
meshes = [node for node in DepthFirstIterator(scene_root) if type(node) is SceneNode and node.isSelectable()] #Only use the nodes that will be printed.
for mesh in meshes:
extruder_stack_id = mesh.callDecoration("getActiveExtruder")
if not extruder_stack_id: #No per-object settings for this node.
extruder_stack_id = self.extruderIds["0"]
used_extruder_stack_ids.add(extruder_stack_id)
#Get whether any of them use support.
per_mesh_stack = mesh.callDecoration("getStack")
if per_mesh_stack:
support_enabled |= per_mesh_stack.getProperty("support_enable", "value")
support_interface_enabled |= per_mesh_stack.getProperty("support_interface_enable", "value")
else: #Take the setting from the build extruder stack.
extruder_stack = container_registry.findContainerStacks(id = extruder_stack_id)[0]
support_enabled |= extruder_stack.getProperty("support_enable", "value")
support_interface_enabled |= extruder_stack.getProperty("support_enable", "value")
#The support extruders.
if support_enabled:
used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("support_infill_extruder_nr", "value"))])
used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("support_extruder_nr_layer_0", "value"))])
if support_interface_enabled:
used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("support_interface_extruder_nr", "value"))])
#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"))])
return [container_registry.findContainerStacks(id = stack_id)[0] for stack_id in used_extruder_stack_ids]
## Removes the container stack and user profile for the extruders for a specific machine.
#
# \param machine_id The machine to remove the extruders for.

View file

@ -34,7 +34,7 @@ class MachineManager(QObject):
self.globalContainerChanged.connect(self.activeVariantChanged)
self.globalContainerChanged.connect(self.activeQualityChanged)
self._active_stack_valid = None
self._stacks_have_errors = None
self._onGlobalContainerChanged()
ExtruderManager.getInstance().activeExtruderChanged.connect(self._onActiveExtruderStackChanged)
@ -85,6 +85,7 @@ class MachineManager(QObject):
globalValueChanged = pyqtSignal() # Emitted whenever a value inside global container is changed.
activeStackValueChanged = pyqtSignal() # Emitted whenever a value inside the active stack is changed.
activeStackValidationChanged = pyqtSignal() # Emitted whenever a validation inside active container is changed
stacksValidationChanged = pyqtSignal() # Emitted whenever a validation is changed
blurSettings = pyqtSignal() # Emitted to force fields in the advanced sidebar to un-focus, so they update properly
@ -225,15 +226,36 @@ class MachineManager(QObject):
self._global_container_stack.nameChanged.connect(self._onMachineNameChanged)
self._global_container_stack.containersChanged.connect(self._onInstanceContainersChanged)
self._global_container_stack.propertyChanged.connect(self._onPropertyChanged)
material = self._global_container_stack.findContainer({"type": "material"})
material.nameChanged.connect(self._onMaterialNameChanged)
quality = self._global_container_stack.findContainer({"type": "quality"})
quality.nameChanged.connect(self._onQualityNameChanged)
if self._global_container_stack.getProperty("machine_extruder_count", "value") > 1:
# For multi-extrusion machines, we do not want variant or material profiles in the stack,
# because these are extruder specific and may cause wrong values to be used for extruders
# that did not specify a value in the extruder.
global_variant = self._global_container_stack.findContainer(type = "variant")
if global_variant != self._empty_variant_container:
self._global_container_stack.replaceContainer(self._global_container_stack.getContainerIndex(global_variant), self._empty_variant_container)
global_material = self._global_container_stack.findContainer(type = "material")
if global_material != self._empty_material_container:
self._global_container_stack.replaceContainer(self._global_container_stack.getContainerIndex(global_material), self._empty_material_container)
else:
material = self._global_container_stack.findContainer({"type": "material"})
material.nameChanged.connect(self._onMaterialNameChanged)
quality = self._global_container_stack.findContainer({"type": "quality"})
quality.nameChanged.connect(self._onQualityNameChanged)
## Update self._stacks_valid according to _checkStacksForErrors and emit if change.
def _updateStacksHaveErrors(self):
old_stacks_have_errors = self._stacks_have_errors
self._stacks_have_errors = self._checkStacksHaveErrors()
if old_stacks_have_errors != self._stacks_have_errors:
self.stacksValidationChanged.emit()
def _onActiveExtruderStackChanged(self):
self.blurSettings.emit() # Ensure no-one has focus.
old_active_container_stack = self._active_container_stack
if self._active_container_stack and self._active_container_stack != self._global_container_stack:
@ -246,10 +268,7 @@ class MachineManager(QObject):
else:
self._active_container_stack = self._global_container_stack
old_active_stack_valid = self._active_stack_valid
self._active_stack_valid = not self._checkStackForErrors(self._active_container_stack)
if old_active_stack_valid != self._active_stack_valid:
self.activeStackValidationChanged.emit()
self._updateStacksHaveErrors()
if old_active_container_stack != self._active_container_stack:
# Many methods and properties related to the active quality actually depend
@ -272,18 +291,18 @@ class MachineManager(QObject):
self.activeStackValueChanged.emit()
if property_name == "validationState":
if self._active_stack_valid:
if not self._stacks_have_errors:
# fast update, we only have to look at the current changed property
if self._active_container_stack.getProperty(key, "settable_per_extruder"):
changed_validation_state = self._active_container_stack.getProperty(key, property_name)
else:
changed_validation_state = self._global_container_stack.getProperty(key, property_name)
if changed_validation_state in (UM.Settings.ValidatorState.Exception, UM.Settings.ValidatorState.MaximumError, UM.Settings.ValidatorState.MinimumError):
self._active_stack_valid = False
self.activeStackValidationChanged.emit()
self._stacks_have_errors = True
self.stacksValidationChanged.emit()
else:
if not self._checkStackForErrors(self._active_container_stack) and not self._checkStackForErrors(self._global_container_stack):
self._active_stack_valid = True
self.activeStackValidationChanged.emit()
# Normal check
self._updateStacksHaveErrors()
@pyqtSlot(str)
def setActiveMachine(self, stack_id):
@ -337,15 +356,17 @@ class MachineManager(QObject):
def _createUniqueName(self, container_type, current_name, new_name, fallback_name):
return UM.Settings.ContainerRegistry.getInstance().createUniqueName(container_type, current_name, new_name, fallback_name)
## Convenience function to check if a stack has errors.
def _checkStackForErrors(self, stack):
if stack is None:
return False
def _checkStacksHaveErrors(self):
if self._global_container_stack is not None and self._global_container_stack.hasErrors():
return True
for key in stack.getAllKeys():
validation_state = stack.getProperty(key, "validationState")
if validation_state in (UM.Settings.ValidatorState.Exception, UM.Settings.ValidatorState.MaximumError, UM.Settings.ValidatorState.MinimumError):
if self._global_container_stack is None:
return False
stacks = list(ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId()))
for stack in stacks:
if stack.hasErrors():
return True
return False
## Remove all instances from the top instanceContainer (effectively removing all user-changed settings)
@ -405,12 +426,12 @@ class MachineManager(QObject):
for container in send_emits_containers:
container.sendPostponedEmits()
## Check if the global profile does not contain error states
# Note that the _active_stack_valid is cached due to performance issues
# Calling _checkStackForErrors on every change is simply too expensive
@pyqtProperty(bool, notify = activeStackValidationChanged)
def isActiveStackValid(self):
return bool(self._active_stack_valid)
## Check if none of the stacks contain error states
# Note that the _stacks_have_errors is cached due to performance issues
# Calling _checkStack(s)ForErrors on every change is simply too expensive
@pyqtProperty(bool, notify = stacksValidationChanged)
def stacksHaveErrors(self):
return bool(self._stacks_have_errors)
@pyqtProperty(str, notify = activeStackChanged)
def activeUserProfileId(self):
@ -474,6 +495,32 @@ class MachineManager(QObject):
return result
## Gets the layer height of the currently active quality profile.
#
# This is indicated together with the name of the active quality profile.
#
# \return The layer height of the currently active quality profile. If
# there is no quality profile, this returns 0.
@pyqtProperty(float, notify=activeQualityChanged)
def activeQualityLayerHeight(self):
if not self._global_container_stack:
return 0
quality_changes = self._global_container_stack.findContainer({"type": "quality_changes"})
if quality_changes:
value = self._global_container_stack.getRawProperty("layer_height", "value", skip_until_container = quality_changes.getId())
if isinstance(value, UM.Settings.SettingFunction):
value = value(self._global_container_stack)
return value
quality = self._global_container_stack.findContainer({"type": "quality"})
if quality:
value = self._global_container_stack.getRawProperty("layer_height", "value", skip_until_container = quality.getId())
if isinstance(value, UM.Settings.SettingFunction):
value = value(self._global_container_stack)
return value
return 0 #No quality profile.
## Get the Material ID associated with the currently active material
# \returns MaterialID (string) if found, empty string otherwise
@pyqtProperty(str, notify=activeQualityChanged)
@ -540,7 +587,7 @@ class MachineManager(QObject):
quality = self._active_container_stack.findContainer(type = "quality")
if quality:
return Util.parseBool(quality.getMetaDataEntry("supported", True))
return ""
return False
## Get the Quality ID associated with the currently active extruder
# Note that this only returns the "quality", not the "quality_changes"
@ -687,7 +734,7 @@ class MachineManager(QObject):
# Get quality container and optionally the quality_changes container.
if container_type == "quality":
new_quality_settings_list = self._determineQualityAndQualityChangesForQualityType(quality_type)
new_quality_settings_list = self.determineQualityAndQualityChangesForQualityType(quality_type)
elif container_type == "quality_changes":
new_quality_settings_list = self._determineQualityAndQualityChangesForQualityChanges(quality_name)
else:
@ -723,11 +770,13 @@ class MachineManager(QObject):
#
# \param quality_name \type{str} the name of the quality.
# \return \type{List[Dict]} with keys "stack", "quality" and "quality_changes".
def _determineQualityAndQualityChangesForQualityType(self, quality_type):
def determineQualityAndQualityChangesForQualityType(self, quality_type):
quality_manager = QualityManager.getInstance()
result = []
empty_quality_changes = self._empty_quality_changes_container
global_container_stack = self._global_container_stack
if not global_container_stack:
return []
global_machine_definition = quality_manager.getParentMachineDefinition(global_container_stack.getBottom())
extruder_stacks = ExtruderManager.getInstance().getActiveExtruderStacks()
@ -743,8 +792,13 @@ class MachineManager(QObject):
if extruder_stacks:
# Add an extra entry for the global stack.
result.append({"stack": global_container_stack, "quality": result[0]["quality"],
"quality_changes": empty_quality_changes})
global_quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [], global_quality = "True")
if not global_quality:
global_quality = self._empty_quality_container
result.append({"stack": global_container_stack, "quality": global_quality, "quality_changes": empty_quality_changes})
return result
## Determine the quality and quality changes settings for the current machine for a quality changes name.
@ -767,7 +821,10 @@ class MachineManager(QObject):
# For the global stack, find a quality which matches the quality_type in
# the quality changes profile and also satisfies any material constraints.
quality_type = global_quality_changes.getMetaDataEntry("quality_type")
global_quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material])
if global_container_stack.getProperty("machine_extruder_count", "value") > 1:
global_quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [], global_quality = True)
else:
global_quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material])
# Find the values for each extruder.
extruder_stacks = ExtruderManager.getInstance().getActiveExtruderStacks()
@ -788,9 +845,10 @@ class MachineManager(QObject):
result.append({"stack": stack, "quality": quality, "quality_changes": quality_changes})
if extruder_stacks:
# Duplicate the quality from the 1st extruder into the global stack. If anyone
# then looks in the global stack, they should get a reasonable view.
result.append({"stack": global_container_stack, "quality": result[0]["quality"], "quality_changes": global_quality_changes})
global_quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material], global_quality = "True")
if not global_quality:
global_quality = self._empty_quality_container
result.append({"stack": global_container_stack, "quality": global_quality, "quality_changes": global_quality_changes})
else:
result.append({"stack": global_container_stack, "quality": global_quality, "quality_changes": global_quality_changes})

View file

@ -0,0 +1,66 @@
# Copyright (c) 2016 Ultimaker B.V.
# Cura is released under the terms of the AGPLv3 or higher.
from PyQt5.QtCore import pyqtSlot, pyqtProperty, QObject, pyqtSignal, QRegExp
from PyQt5.QtGui import QValidator
import os #For statvfs.
import urllib #To escape machine names for how they're saved to file.
import UM.Resources
import UM.Settings.ContainerRegistry
import UM.Settings.InstanceContainer
## Are machine names valid?
#
# Performs checks based on the length of the name.
class MachineNameValidator(QObject):
def __init__(self, parent = None):
super().__init__(parent)
#Compute the validation regex for printer names. This is limited by the maximum file name length.
try:
filename_max_length = os.statvfs(UM.Resources.getDataStoragePath()).f_namemax
except AttributeError: #Doesn't support statvfs. Probably because it's not a Unix system.
filename_max_length = 255 #Assume it's Windows on NTFS.
machine_name_max_length = filename_max_length - len("_current_settings.") - len(UM.Settings.ContainerRegistry.getMimeTypeForContainer(UM.Settings.InstanceContainer).preferredSuffix)
# Characters that urllib.parse.quote_plus escapes count for 12! So now
# we must devise a regex that allows only 12 normal characters or 1
# special character, and that up to [machine_name_max_length / 12] times.
maximum_special_characters = int(machine_name_max_length / 12)
unescaped = r"[a-zA-Z0-9_\-\.\/]"
self.machine_name_regex = r"^((" + unescaped + "){0,12}|.){0," + str(maximum_special_characters) + r"}$"
validationChanged = pyqtSignal()
## Check if a specified machine name is allowed.
#
# \param name The machine name to check.
# \param position The current position of the cursor in the text box.
# \return ``QValidator.Invalid`` if it's disallowed, or
# ``QValidator.Acceptable`` if it's allowed.
def validate(self, name, position):
#Check for file name length of the current settings container (which is the longest file we're saving with the name).
try:
filename_max_length = os.statvfs(UM.Resources.getDataStoragePath()).f_namemax
except AttributeError: #Doesn't support statvfs. Probably because it's not a Unix system.
filename_max_length = 255 #Assume it's Windows on NTFS.
escaped_name = urllib.parse.quote_plus(name)
current_settings_filename = escaped_name + "_current_settings." + UM.Settings.ContainerRegistry.getMimeTypeForContainer(UM.Settings.InstanceContainer).preferredSuffix
if len(current_settings_filename) > filename_max_length:
return QValidator.Invalid
return QValidator.Acceptable #All checks succeeded.
## Updates the validation state of a machine name text field.
@pyqtSlot(str)
def updateValidation(self, new_name):
is_valid = self.validate(new_name, 0)
if is_valid == QValidator.Acceptable:
self.validation_regex = "^.*$" #Matches anything.
else:
self.validation_regex = "a^" #Never matches (unless you manage to get "a" before the start of the string... good luck).
self.validationChanged.emit()
@pyqtProperty("QRegExp", notify=validationChanged)
def machineNameRegex(self):
return QRegExp(self.machine_name_regex)

View file

@ -1,18 +1,23 @@
# Copyright (c) 2016 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.
from PyQt5.QtCore import Qt
from UM.Application import Application
from UM.Settings.ContainerRegistry import ContainerRegistry
from UM.Settings.Models.InstanceContainersModel import InstanceContainersModel
from cura.QualityManager import QualityManager
from cura.Settings.ExtruderManager import ExtruderManager
from cura.Settings.MachineManager import MachineManager
## QML Model for listing the current list of valid quality profiles.
#
class ProfilesModel(InstanceContainersModel):
LayerHeightRole = Qt.UserRole + 1001
def __init__(self, parent = None):
super().__init__(parent)
self.addRoleName(self.LayerHeightRole, "layer_height")
Application.getInstance().globalContainerStackChanged.connect(self._update)
@ -20,6 +25,21 @@ class ProfilesModel(InstanceContainersModel):
Application.getInstance().getMachineManager().activeStackChanged.connect(self._update)
Application.getInstance().getMachineManager().activeMaterialChanged.connect(self._update)
# Factory function, used by QML
@staticmethod
def createProfilesModel(engine, js_engine):
return ProfilesModel.getInstance()
## Get the singleton instance for this class.
@classmethod
def getInstance(cls):
# Note: Explicit use of class name to prevent issues with inheritance.
if ProfilesModel.__instance is None:
ProfilesModel.__instance = cls()
return ProfilesModel.__instance
__instance = None
## Fetch the list of containers to display.
#
# See UM.Settings.Models.InstanceContainersModel._fetchInstanceContainers().
@ -40,3 +60,57 @@ class ProfilesModel(InstanceContainersModel):
# The actual list of quality profiles come from the first extruder in the extruder list.
return QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders(global_container_stack,
extruder_stacks)
## Re-computes the items in this model, and adds the layer height role.
def _recomputeItems(self):
#Some globals that we can re-use.
global_container_stack = Application.getInstance().getGlobalContainerStack()
if global_container_stack is None:
return
container_registry = ContainerRegistry.getInstance()
machine_manager = Application.getInstance().getMachineManager()
unit = global_container_stack.getBottom().getProperty("layer_height", "unit")
if not unit:
unit = ""
for item in super()._recomputeItems():
profile = container_registry.findContainers(id = item["id"])
if not profile:
item["layer_height"] = "" #Can't update a profile that is unknown.
yield item
continue
#Easy case: This profile defines its own layer height.
profile = profile[0]
if profile.hasProperty("layer_height", "value"):
item["layer_height"] = str(profile.getProperty("layer_height", "value")) + unit
yield item
continue
#Quality-changes profile that has no value for layer height. Get the corresponding quality profile and ask that profile.
quality_type = profile.getMetaDataEntry("quality_type", None)
if quality_type:
quality_results = machine_manager.determineQualityAndQualityChangesForQualityType(quality_type)
for quality_result in quality_results:
if quality_result["stack"] is global_container_stack:
quality = quality_result["quality"]
break
else: #No global container stack in the results:
if quality_results:
quality = quality_results[0]["quality"] #Take any of the extruders.
else:
quality = None
if quality and quality.hasProperty("layer_height", "value"):
item["layer_height"] = str(quality.getProperty("layer_height", "value")) + unit
yield item
continue
#Quality has no value for layer height either. Get the layer height from somewhere lower in the stack.
skip_until_container = global_container_stack.findContainer({"type": "material"})
if not skip_until_container: #No material in stack.
skip_until_container = global_container_stack.findContainer({"type": "variant"})
if not skip_until_container: #No variant in stack.
skip_until_container = global_container_stack.getBottom()
item["layer_height"] = str(global_container_stack.getRawProperty("layer_height", "value", skip_until_container = skip_until_container.getId())) + unit #Fall through to the currently loaded material.
yield item

View file

@ -5,6 +5,7 @@ from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal
import UM.Settings
from UM.Application import Application
import cura.Settings
from UM.Logger import Logger
## The settingInheritance manager is responsible for checking each setting in order to see if one of the "deeper"
@ -38,6 +39,26 @@ class SettingInheritanceManager(QObject):
result.append(key)
return result
@pyqtSlot(str, str, result = "QStringList")
def getOverridesForExtruder(self, key, extruder_index):
multi_extrusion = self._global_container_stack.getProperty("machine_extruder_count", "value") > 1
if not multi_extrusion:
return self._settings_with_inheritance_warning
extruder = cura.Settings.ExtruderManager.getInstance().getExtruderStack(extruder_index)
if not extruder:
Logger.log("w", "Unable to find extruder for current machine with index %s", extruder_index)
return []
definitions = self._global_container_stack.getBottom().findDefinitions(key=key)
if not definitions:
return
result = []
for key in definitions[0].getAllKeys():
if self._settingIsOverwritingInheritance(key, extruder):
result.append(key)
return result
@pyqtSlot(str)
def manualRemoveOverride(self, key):
if key in self._settings_with_inheritance_warning:
@ -56,9 +77,11 @@ class SettingInheritanceManager(QObject):
if new_active_stack != self._active_container_stack: # Check if changed
if self._active_container_stack: # Disconnect signal from old container (if any)
self._active_container_stack.propertyChanged.disconnect(self._onPropertyChanged)
self._active_container_stack.containersChanged.disconnect(self._onContainersChanged)
self._active_container_stack = new_active_stack
self._active_container_stack.propertyChanged.connect(self._onPropertyChanged)
self._active_container_stack.containersChanged.connect(self._onContainersChanged)
self._update() # Ensure that the settings_with_inheritance_warning list is populated.
def _onPropertyChanged(self, key, property_name):
@ -113,22 +136,23 @@ class SettingInheritanceManager(QObject):
return self._settings_with_inheritance_warning
## Check if a setting has an inheritance function that is overwritten
def _settingIsOverwritingInheritance(self, key):
def _settingIsOverwritingInheritance(self, key, stack = None):
has_setting_function = False
stack = self._active_container_stack
if not stack:
stack = self._active_container_stack
containers = []
## Check if the setting has a user state. If not, it is never overwritten.
has_user_state = self._active_container_stack.getProperty(key, "state") == UM.Settings.InstanceState.User
has_user_state = stack.getProperty(key, "state") == UM.Settings.InstanceState.User
if not has_user_state:
return False
## If a setting is not enabled, don't label it as overwritten (It's never visible anyway).
if not self._active_container_stack.getProperty(key, "enabled"):
if not stack.getProperty(key, "enabled"):
return False
## Also check if the top container is not a setting function (this happens if the inheritance is restored).
if isinstance(self._active_container_stack.getTop().getProperty(key, "value"), UM.Settings.SettingFunction):
if isinstance(stack.getTop().getProperty(key, "value"), UM.Settings.SettingFunction):
return False
## Mash all containers for all the stacks together.
@ -139,13 +163,15 @@ class SettingInheritanceManager(QObject):
for container in containers:
try:
value = container.getProperty(key, "value")
if value is not None:
has_setting_function = isinstance(value, UM.Settings.SettingFunction)
if has_setting_function is False:
has_non_function_value = True
continue
except AttributeError:
continue
if value is not None:
# If a setting doesn't use any keys, it won't change it's value, so treat it as if it's a fixed value
has_setting_function = isinstance(value, UM.Settings.SettingFunction) and len(value.getUsedSettingKeys()) > 0
if has_setting_function is False:
has_non_function_value = True
continue
if has_setting_function:
break # There is a setting function somewhere, stop looking deeper.
return has_setting_function and has_non_function_value
@ -170,11 +196,18 @@ class SettingInheritanceManager(QObject):
def _onGlobalContainerChanged(self):
if self._global_container_stack:
self._global_container_stack.propertyChanged.disconnect(self._onPropertyChanged)
self._global_container_stack.containersChanged.disconnect(self._onContainersChanged)
self._global_container_stack = Application.getInstance().getGlobalContainerStack()
if self._global_container_stack:
self._global_container_stack.containersChanged.connect(self._onContainersChanged)
self._global_container_stack.propertyChanged.connect(self._onPropertyChanged)
self._onActiveExtruderChanged()
def _onContainersChanged(self, container):
# TODO: Multiple container changes in sequence now cause quite a few recalculations.
# This isn't that big of an issue, but it could be in the future.
self._update()
@staticmethod
def createSettingInheritanceManager(engine=None, script_engine=None):
return SettingInheritanceManager()
return SettingInheritanceManager()

View file

@ -61,6 +61,12 @@ class SettingOverrideDecorator(SceneNodeDecorator):
def getActiveExtruder(self):
return self._extruder_stack
## Gets the signal that emits if the active extruder changed.
#
# This can then be accessed via a decorator.
def getActiveExtruderChangedSignal(self):
return self.activeExtruderChanged
## Gets the currently active extruders position
#
# \return An extruder's position, or None if no position info is available.

View file

@ -8,6 +8,7 @@ from .CuraContainerRegistry import CuraContainerRegistry
from .ExtruderManager import ExtruderManager
from .ExtrudersModel import ExtrudersModel
from .MachineManager import MachineManager
from .MachineNameValidator import MachineNameValidator
from .MaterialSettingsVisibilityHandler import MaterialSettingsVisibilityHandler
from .SettingOverrideDecorator import SettingOverrideDecorator
from .QualitySettingsModel import QualitySettingsModel

BIN
docs/Cura_Data_Model.odg Normal file

Binary file not shown.

View file

@ -10,15 +10,18 @@ from UM.Scene.SceneNode import SceneNode
from UM.Scene.GroupDecorator import GroupDecorator
import UM.Application
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
from UM.Math.Quaternion import Quaternion
import math
import os.path
import zipfile
try:
import xml.etree.cElementTree as ET
except ImportError:
Logger.log("w", "Unable to load cElementTree, switching to slower version")
import xml.etree.ElementTree as ET
## Base implementation for reading 3MF files. Has no support for textures. Only loads meshes!
@ -31,9 +34,12 @@ class ThreeMFReader(MeshReader):
"3mf": "http://schemas.microsoft.com/3dmanufacturing/core/2015/02",
"cura": "http://software.ultimaker.com/xml/cura/3mf/2015/10"
}
self._base_name = ""
self._unit = None
def _createNodeFromObject(self, object, name = ""):
node = SceneNode()
node.setName(name)
mesh_builder = MeshBuilder()
vertex_list = []
@ -42,8 +48,7 @@ class ThreeMFReader(MeshReader):
for component in components:
id = component.get("objectid")
new_object = self._root.find("./3mf:resources/3mf:object[@id='{0}']".format(id), self._namespaces)
new_node = self._createNodeFromObject(new_object)
new_node = self._createNodeFromObject(new_object, self._base_name + "_" + str(id))
node.addChild(new_node)
transform = component.get("transform")
if transform is not None:
@ -54,9 +59,45 @@ class ThreeMFReader(MeshReader):
vertex_list.append([vertex.get("x"), vertex.get("y"), vertex.get("z")])
Job.yieldThread()
# If this object has no vertices and just one child, just return the child.
if len(vertex_list) == 0 and len(node.getChildren()) == 1:
return node.getChildren()[0]
xml_settings = list(object.findall(".//cura:setting", self._namespaces))
# Add the setting override decorator, so we can add settings to this node.
if xml_settings:
node.addDecorator(SettingOverrideDecorator())
global_container_stack = Application.getInstance().getGlobalContainerStack()
# Ensure the correct next container for the SettingOverride decorator is set.
if global_container_stack:
multi_extrusion = global_container_stack.getProperty("machine_extruder_count", "value") > 1
# Ensure that all extruder data is reset
if not multi_extrusion:
default_stack_id = global_container_stack.getId()
else:
default_stack = ExtruderManager.getInstance().getExtruderStack(0)
if default_stack:
default_stack_id = default_stack.getId()
else:
default_stack_id = global_container_stack.getId()
node.callDecoration("setActiveExtruder", default_stack_id)
# Get the definition & set it
definition = QualityManager.getInstance().getParentMachineDefinition(global_container_stack.getBottom())
node.callDecoration("getStack").getTop().setDefinition(definition)
setting_container = node.callDecoration("getStack").getTop()
for setting in xml_settings:
setting_key = setting.get("key")
setting_value = setting.text
# Extruder_nr is a special case.
if setting_key == "extruder_nr":
extruder_stack = ExtruderManager.getInstance().getExtruderStack(int(setting_value))
if extruder_stack:
node.callDecoration("setActiveExtruder", extruder_stack.getId())
else:
Logger.log("w", "Unable to find extruder in position %s", setting_value)
continue
setting_container.setProperty(setting_key,"value", setting_value)
if len(node.getChildren()) > 0:
group_decorator = GroupDecorator()
@ -76,20 +117,10 @@ class ThreeMFReader(MeshReader):
Job.yieldThread()
# Rotate the model; We use a different coordinate frame.
rotation = Matrix()
rotation.setByRotationAxis(-0.5 * math.pi, Vector(1, 0, 0))
flip_matrix = Matrix()
flip_matrix._data[1, 1] = 0
flip_matrix._data[1, 2] = 1
flip_matrix._data[2, 1] = 1
flip_matrix._data[2, 2] = 0
# TODO: We currently do not check for normals and simply recalculate them.
mesh_builder.calculateNormals()
mesh_builder.setFileName(name)
mesh_data = mesh_builder.build().getTransformed(flip_matrix)
mesh_data = mesh_builder.build()
if len(mesh_data.getVertices()):
node.setMeshData(mesh_data)
@ -122,45 +153,101 @@ class ThreeMFReader(MeshReader):
temp_mat._data[1, 3] = splitted_transformation[10]
temp_mat._data[2, 3] = splitted_transformation[11]
flip_matrix = Matrix()
flip_matrix._data[1, 1] = 0
flip_matrix._data[1, 2] = 1
flip_matrix._data[2, 1] = 1
flip_matrix._data[2, 2] = 0
temp_mat.multiply(flip_matrix)
return temp_mat
def read(self, file_name):
result = SceneNode()
result = []
# The base object of 3mf is a zipped archive.
archive = zipfile.ZipFile(file_name, "r")
self._base_name = os.path.basename(file_name)
try:
self._root = ET.parse(archive.open("3D/3dmodel.model"))
self._unit = self._root.getroot().get("unit")
build_items = self._root.findall("./3mf:build/3mf:item", self._namespaces)
for build_item in build_items:
id = build_item.get("objectid")
object = self._root.find("./3mf:resources/3mf:object[@id='{0}']".format(id), self._namespaces)
build_item_node = self._createNodeFromObject(object)
if "type" in object.attrib:
if object.attrib["type"] == "support" or object.attrib["type"] == "other":
# Ignore support objects, as cura does not support these.
# We can't guarantee that they wont be made solid.
# We also ignore "other", as I have no idea what to do with them.
Logger.log("w", "3MF file contained an object of type %s which is not supported by Cura", object.attrib["type"])
continue
elif object.attrib["type"] == "solidsupport" or object.attrib["type"] == "model":
pass # Load these as normal
else:
# We should technically fail at this point because it's an invalid 3MF, but try to continue anyway.
Logger.log("e", "3MF file contained an object of type %s which is not supported by the 3mf spec",
object.attrib["type"])
continue
build_item_node = self._createNodeFromObject(object, self._base_name + "_" + str(id))
transform = build_item.get("transform")
if transform is not None:
build_item_node.setTransformation(self._createMatrixFromTransformationString(transform))
result.addChild(build_item_node)
global_container_stack = UM.Application.getInstance().getGlobalContainerStack()
# Create a transformation Matrix to convert from 3mf worldspace into ours.
# First step: flip the y and z axis.
transformation_matrix = Matrix()
transformation_matrix._data[1, 1] = 0
transformation_matrix._data[1, 2] = 1
transformation_matrix._data[2, 1] = -1
transformation_matrix._data[2, 2] = 0
# Second step: 3MF defines the left corner of the machine as center, whereas cura uses the center of the
# build volume.
if global_container_stack:
translation_vector = Vector(x = -global_container_stack.getProperty("machine_width", "value") / 2,
y = -global_container_stack.getProperty("machine_depth", "value") / 2,
z = 0)
translation_matrix = Matrix()
translation_matrix.setByTranslation(translation_vector)
transformation_matrix.multiply(translation_matrix)
# Third step: 3MF also defines a unit, wheras Cura always assumes mm.
scale_matrix = Matrix()
scale_matrix.setByScaleVector(self._getScaleFromUnit(self._unit))
transformation_matrix.multiply(scale_matrix)
# Pre multiply the transformation with the loaded transformation, so the data is handled correctly.
build_item_node.setTransformation(build_item_node.getLocalTransformation().preMultiply(transformation_matrix))
result.append(build_item_node)
except Exception as e:
Logger.log("e", "exception occured in 3mf reader: %s", e)
try: # Selftest - There might be more functions that should fail
bounding_box = result.getBoundingBox()
bounding_box.isValid()
except:
return None
Logger.log("e", "An exception occurred in 3mf reader: %s", e)
global_container_stack = UM.Application.getInstance().getGlobalContainerStack()
if global_container_stack:
translation = Vector(x=-global_container_stack.getProperty("machine_width", "value") / 2, y=0,
z=global_container_stack.getProperty("machine_depth", "value") / 2)
result.translate(translation, SceneNode.TransformSpace.World)
return result
## Create a scale vector based on a unit string.
# The core spec defines the following:
# * micron
# * millimeter (default)
# * centimeter
# * inch
# * foot
# * meter
def _getScaleFromUnit(self, unit):
if unit is None:
unit = "millimeter"
if unit == "micron":
scale = 0.001
elif unit == "millimeter":
scale = 1
elif unit == "centimeter":
scale = 10
elif unit == "inch":
scale = 25.4
elif unit == "foot":
scale = 304.8
elif unit == "meter":
scale = 1000
else:
Logger.log("w", "Unrecognised unit %s used. Assuming mm instead", unit)
scale = 1
return Vector(scale, scale, scale)

View file

@ -1,17 +1,37 @@
[2.3.1]
*Layer Height in Profile Selection
Added the layer height to the profile selection menu.
*Bug fixes
Fixed the option to import g-code from related machines as a profile
Fixed a bug where editing material settings has no effect on 3D prints
Fixed an issue with automatic profile importing on Cura 2.1 on Mac OSX
Fixed an inheritance issue for dual extrusion
Fixed an issue with "i" symbol updates
Fixed a freeze that can occur while printing via Wi-Fi
[2.3.0]
*Multi Extrusion Support
Machines with multiple extruders are now supported. Ultimaker 3 printers and Ultimaker Original printers with dual extrusion upgrade kit are currently supported.
*Network Printing for Ultimaker 3
Sending a print to an Ultimaker 3 remotely via the network is now possible. Requires Wi-Fi or LAN to connect to the printer.
*Print Monitoring for Ultimaker 3
You can monitor your print on an Ultimaker 3 with a live camera feed. Requires Wi-Fi or LAN to connect to the printer.
*Material and Print Core Synchronization
Connecting to an Ultimaker 3 now gives you the option to synchronize the materials in Cura with what is loaded in the printer.
*Speed improvements
The first thing you will notice is the speed. STL loading is now 10 to 20 times faster, layerview is significantly faster and slicing speed is slightly improved.
*Multi Extrusion Support
Machines with multiple extruders are now supported. If youve got the Ultimaker Original with the dual extrusion upgrade kit, weve got you covered.
*Custom Machine Support
Its now much easier to use Cura with custom machines. You can edit the machine settings when you load a new custom machine.
The first thing you will notice is the speed. STL loading is now 10 to 20 times faster, layer view is significantly faster and slicing speed is slightly improved.
*Improved Position Tool
Place objects precisely where you want them by manually entering the values for the position.
*Custom Machine Support
Its now much easier to use Cura with custom machines. You can edit the machine settings when you load a new custom machine.
*Improved Grouping
It's now possible to transform objects that are already grouped.
Select an individual item in a group or merged object and edit as usual. Just Ctrl + Click and edit away.
@ -20,7 +40,7 @@ Select an individual item in a group or merged object and edit as usual. Just Ct
Profile management is improved. You can now easily see and track changes made to your profiles.
*Improved Setting Visibility
Make multiple settings visible at once. The Visibility Overview setting indicates why a setting is not shown in the sidebar even if it is enabled.
Make multiple settings visible at the same time with a checkbox. The Visibility Overview setting indicates why a setting is not shown in the sidebar even if it is enabled.
*Improved time estimation
Time estimations are more accurate. Based on our test time estimations should be within 5% accuracy for Ultimaker printers.
@ -36,10 +56,10 @@ Configurations from older installations of Cura 2.1 are automatically imported i
*Slicing features
*Infill Types
We've introduced two new infill types: Tetrahedral and Cubic. They change along with the Z-axis for more uniform strength in all directions. There are now 7 infill types to choose from.
Two new infill types are now introduced: Tetrahedral and Cubic. They change along with the Z-axis for more uniform strength in all directions. There are now seven infill types to choose from.
*Gradual Infill
Now you can change the density of the infill based on the distance from the top layers. Your objects print faster, use less material, while top surfaces have the same quality.
Gradual infill lets users adjust infill density, based on the distance from the top layers. This offers faster printing and reduced material requirements, whilst maintaining surface quality.
*Set Acceleration and Jerk by Feature
You can now set Jerk and Acceleration by feature-type (infill, walls, top/bottom, etc), for more precision.
@ -56,7 +76,7 @@ Cant avoid previously printed parts by horizontal moves? The Z Hop Only Over
*Skin and Wall Overlap
The Skin Overlap setting allows you to overlap the skin lines with the walls for better adhesion.
*Control Initial Layer Travel Speed
*Adjust Initial Layer Travel Speed
Set the travel speed of the initial layer(s) to reduce risk of extruder pulling the print from the bed.
*Support Interface
@ -66,39 +86,39 @@ It is now possible to print a support bottom as well as a support roof. Support
Deleting grouped objects
Duplicating groups
Bridging
Drag and drop on the first run on Windows
Drag and drop (first Windows run)
Unretraction speeds
Bottom layer in Spiralize mode
Overlap Compensation
Retractions on Raft
Retractions now occur after each object printed in one-at-a-time mode.
Rafts are no longer printed outside of build area.
Spiralize no longer only spiralizes the first printed segment only.
Line distance is now the actual line distance.
Enabling raft doesnt influence at which height the model is sliced any more.
Brim is now always printed just once.
Support roofs now only occur just below overhang.
Raft retractions
Retractions now occur after each object printed in one-at-a-time mode
Rafts are no longer printed outside of build area
Spiralize no longer limited to the first printed segment only
Line distance is now the actual line distance
Enabling raft doesnt influence at which height the model is sliced any more
Brim is now always printed just once
Support roofs now only occur just below overhang
*Minor changes
Messages are now displayed 30 seconds instead of 10, making it less likely that certain messages are missed.
You are now notified if you try to save to a locked SD card.
Engine log is now included in the application log.
Undo and Redo now work correctly with multiple operations.
The last used folder is now remembered (instead of defaulting to home folder).
Import X3D files.
Made it possible to add multiple Per Model Settings at once.
Bed Level and Checkup procedures for UMO+ can now be done without re-adding machine.
Combing is applied in more cases and results in better paths.
Infill thickness now supports Grid infill also for even multiples of the layer height.
Support is no longer removed by unprintable thin parts of the model.
Support is now generated on each layer its supposed to.
Support doesn't go outside overhang areas any more.
Support doesn't remove brim around the object any more.
Brim is now also generated under the support.
Draft shield and Ooze shield get their own brim or raft.
Settings shared between skirt and brim now also activate when brim is selected.
Compensate overlapping wall parts now also works for inner walls.
You can now adjust the speed at which the bed is lowered each layer.
Message display time increased to 30 seconds
Notification if you try to save to a locked SD card
Engine log now included in the application log
Undo and Redo now function with multiple operations
The last used folder is now remembered rather than defaulting to home folder
Import X3D files
Made it possible to add multiple Per Model Settings at once
Bed Level and Checkup procedures for UMO+ can be performed without re-adding machine
Combing applied in more cases and results in better paths
Infill thickness now supports Grid infill also for even multiples of the layer height
Support is no longer removed by unprintable thin parts of the model
Support generated on each appropriate layer
Support no longer goes outside overhang areas
Support no longer removes brim around the object
Brim is now also generated under the support
Draft and Ooze shield get their own brim or raft
Settings shared between skirt and brim now also activate when brim is selected
Compensate overlapping wall parts now also works for inner walls
Bed lowering speed can be adjusted for each layer
[2.1.3]

View file

@ -220,6 +220,9 @@ class CuraEngineBackend(Backend):
#
# \param job The start slice job that was just finished.
def _onStartSliceCompleted(self, job):
if self._error_message:
self._error_message.hide()
# Note that cancelled slice jobs can still call this method.
if self._start_slice_job is job:
self._start_slice_job = None
@ -239,13 +242,33 @@ class CuraEngineBackend(Backend):
if job.getResult() == StartSliceJob.StartJobResult.SettingError:
if Application.getInstance().getPlatformActivity:
self._error_message = Message(catalog.i18nc("@info:status", "Unable to slice with the current settings. Please check your settings for errors."))
extruders = list(ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId()))
error_keys = []
for extruder in extruders:
error_keys.extend(extruder.getErrorKeys())
if not extruders:
error_keys = self._global_container_stack.getErrorKeys()
error_labels = set()
definition_container = self._global_container_stack.getBottom()
for key in error_keys:
error_labels.add(definition_container.findDefinitions(key = key)[0].label)
error_labels = ", ".join(error_labels)
self._error_message = Message(catalog.i18nc("@info:status", "Unable to slice with the current settings. The following settings have errors: {0}".format(error_labels)))
self._error_message.show()
self.backendStateChange.emit(BackendState.Error)
else:
self.backendStateChange.emit(BackendState.NotStarted)
return
if job.getResult() == StartSliceJob.StartJobResult.BuildPlateError:
if Application.getInstance().getPlatformActivity:
self._error_message = Message(catalog.i18nc("@info:status", "Unable to slice because the prime tower or prime position(s) are invalid."))
self._error_message.show()
self.backendStateChange.emit(BackendState.Error)
else:
self.backendStateChange.emit(BackendState.NotStarted)
if job.getResult() == StartSliceJob.StartJobResult.NothingToSlice:
if Application.getInstance().getPlatformActivity:
self._error_message = Message(catalog.i18nc("@info:status", "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit."))
@ -296,7 +319,7 @@ class CuraEngineBackend(Backend):
self._terminate()
if error.getErrorCode() not in [Arcus.ErrorCode.BindFailedError, Arcus.ErrorCode.ConnectionResetError, Arcus.ErrorCode.Debug]:
Logger.log("e", "A socket error caused the connection to be reset")
Logger.log("w", "A socket error caused the connection to be reset")
## A setting has changed, so check if we must reslice.
#

View file

@ -25,6 +25,7 @@ class StartJobResult(IntEnum):
SettingError = 3
NothingToSlice = 4
MaterialIncompatible = 5
BuildPlateError = 6
## Formatter class that handles token expansion in start/end gcod
@ -75,12 +76,12 @@ class StartSliceJob(Job):
return
# Don't slice if there is a setting with an error value.
if not Application.getInstance().getMachineManager().isActiveStackValid:
if Application.getInstance().getMachineManager().stacksHaveErrors:
self.setResult(StartJobResult.SettingError)
return
if Application.getInstance().getBuildVolume().hasErrors():
self.setResult(StartJobResult.SettingError)
self.setResult(StartJobResult.BuildPlateError)
return
for extruder_stack in cura.Settings.ExtruderManager.getInstance().getMachineExtruders(stack.getId()):
@ -164,7 +165,12 @@ class StartSliceJob(Job):
indices = mesh_data.getIndices()
if indices is not None:
#TODO: This is a very slow way of doing it! It also locks up the GUI.
verts = numpy.array([verts[vert_index] for face in indices for vert_index in face])
flat_vert_list = []
for face in indices:
for vert_index in face:
flat_vert_list.append(verts[vert_index])
Job.yieldThread()
verts = numpy.array(flat_vert_list)
else:
verts = numpy.array(verts)
@ -238,6 +244,7 @@ class StartSliceJob(Job):
else:
# Normal case
settings[key] = stack.getProperty(key, "value")
Job.yieldThread()
start_gcode = settings["machine_start_gcode"]
settings["material_bed_temp_prepend"] = "{material_bed_temperature}" not in start_gcode #Pre-compute material material_bed_temp_prepend and material_print_temp_prepend
@ -250,6 +257,7 @@ class StartSliceJob(Job):
setting_message.value = self._expandGcodeTokens(key, value, settings)
else:
setting_message.value = str(value).encode("utf-8")
Job.yieldThread()
## Sends for some settings which extruder they should fallback to if not
# set.
@ -266,6 +274,7 @@ class StartSliceJob(Job):
setting_extruder = self._slice_message.addRepeatedMessage("limit_to_extruder")
setting_extruder.name = key
setting_extruder.extruder = extruder
Job.yieldThread()
## Check if a node has per object settings and ensure that they are set correctly in the message
# \param node \type{SceneNode} Node to check.

View file

@ -99,4 +99,6 @@ class CuraProfileReader(ProfileReader):
return []
filenames, outputs = profile_convert_funcs[0](serialized, profile_id)
if filenames is None and outputs is None:
return []
return list(zip(outputs, filenames))

View file

@ -70,10 +70,19 @@ class GCodeProfileReader(ProfileReader):
json_data = json.loads(serialized)
profile_strings = [json_data["global_quality"]]
profile_strings.extend(json_data.get("extruder_quality", []))
profiles = []
global_profile = readQualityProfileFromString(json_data["global_quality"])
return [readQualityProfileFromString(profile_string) for profile_string in profile_strings]
# This is a fix for profiles created with 2.3.0 For some reason it added the "extruder" property to the
# global profile.
# The fix is simple and safe, as a global profile should never have the extruder entry.
if global_profile.getMetaDataEntry("extruder", None) is not None:
global_profile.setMetaDataEntry("extruder", None)
profiles.append(global_profile)
for profile_string in json_data.get("extruder_quality", []):
profiles.append(readQualityProfileFromString(profile_string))
return profiles
## Unescape a string which has been escaped for use in a gcode comment.
#

View file

@ -13,6 +13,7 @@ from UM.Settings.InstanceContainer import InstanceContainer
import re #For escaping characters in the settings.
import json
import copy
## Writes g-code to a file.
#
@ -80,7 +81,7 @@ class GCodeWriter(MeshWriter):
flat_container.setDefinition(instance_container1.getDefinition())
else:
flat_container.setDefinition(instance_container2.getDefinition())
flat_container.setMetaData(instance_container2.getMetaData())
flat_container.setMetaData(copy.deepcopy(instance_container2.getMetaData()))
for key in instance_container2.getAllKeys():
flat_container.setProperty(key, "value", instance_container2.getProperty(key, "value"))

View file

@ -66,8 +66,11 @@ class LegacyProfileReader(ProfileReader):
def read(self, file_name):
if file_name.split(".")[-1] != "ini":
return None
global_container_stack = Application.getInstance().getGlobalContainerStack()
if not global_container_stack:
return None
multi_extrusion = Application.getInstance().getGlobalContainerStack().getProperty("machine_extruder_count", "value") > 1
multi_extrusion = global_container_stack.getProperty("machine_extruder_count", "value") > 1
if multi_extrusion:
Logger.log("e", "Unable to import legacy profile %s. Multi extrusion is not supported", file_name)
raise Exception("Unable to import legacy profile. Multi extrusion is not supported")
@ -117,7 +120,7 @@ class LegacyProfileReader(ProfileReader):
if "translation" not in dict_of_doom:
Logger.log("e", "Dictionary of Doom has no translation. Is it the correct JSON file?")
return None
current_printer_definition = Application.getInstance().getGlobalContainerStack().getBottom()
current_printer_definition = global_container_stack.getBottom()
profile.setDefinition(current_printer_definition)
for new_setting in dict_of_doom["translation"]: #Evaluate all new settings that would get a value from the translations.
old_setting_expression = dict_of_doom["translation"][new_setting]
@ -137,5 +140,5 @@ class LegacyProfileReader(ProfileReader):
Logger.log("i", "A legacy profile was imported but everything evaluates to the defaults, creating an empty profile.")
profile.setDirty(True)
profile.addMetaDataEntry("type", "quality_changes")
profile.addMetaDataEntry("quality", "normal")
profile.addMetaDataEntry("quality_type", "normal")
return profile

View file

@ -401,7 +401,7 @@ Item {
}
visibilityHandler: UM.SettingPreferenceVisibilityHandler {}
expanded: [ "*" ]
exclude: [ "machine_settings" ]
exclude: [ "machine_settings", "command_line_settings" ]
}
delegate:Loader
{

View file

@ -22,6 +22,7 @@ class PerObjectSettingsTool(Tool):
self._advanced_mode = False
self._multi_extrusion = False
self._single_model_selected = False
Selection.selectionChanged.connect(self.propertyChanged)
@ -30,6 +31,8 @@ class PerObjectSettingsTool(Tool):
Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerChanged)
self._onGlobalContainerChanged()
Selection.selectionChanged.connect(self._updateEnabled)
def event(self, event):
super().event(event)
@ -102,4 +105,11 @@ class PerObjectSettingsTool(Tool):
self._updateEnabled()
def _updateEnabled(self):
Application.getInstance().getController().toolEnabledChanged.emit(self._plugin_id, self._advanced_mode or self._multi_extrusion)
selected_objects = Selection.getAllSelectedObjects()
if len(selected_objects)> 1:
self._single_model_selected = False
elif len(selected_objects) == 1 and selected_objects[0].callDecoration("isGroup"):
self._single_model_selected = False # Group is selected, so tool needs to be disabled
else:
self._single_model_selected = True
Application.getInstance().getController().toolEnabledChanged.emit(self._plugin_id, (self._advanced_mode or self._multi_extrusion) and self._single_model_selected)

View file

@ -20,7 +20,7 @@ class RemovableDriveOutputDevice(OutputDevice):
super().__init__(device_id)
self.setName(device_name)
self.setShortDescription(catalog.i18nc("@action:button", "Save to Removable Drive"))
self.setShortDescription(catalog.i18nc("@action:button Preceded by 'Ready to'.", "Save to Removable Drive"))
self.setDescription(catalog.i18nc("@item:inlistbox", "Save to Removable Drive {0}").format(device_name))
self.setIconName("save_sd")
self.setPriority(1)
@ -71,7 +71,7 @@ class RemovableDriveOutputDevice(OutputDevice):
try:
Logger.log("d", "Writing to %s", file_name)
# Using buffering greatly reduces the write time for many lines of gcode
self._stream = open(file_name, "wt", buffering = 1)
self._stream = open(file_name, "wt", buffering = 1, encoding = "utf-8")
job = WriteMeshJob(writer, self._stream, nodes, MeshWriter.OutputMode.TextMode)
job.setFileName(file_name)
job.progress.connect(self._onProgress)

View file

@ -19,13 +19,12 @@ from PyQt5.QtCore import QUrl, pyqtSlot, pyqtSignal, pyqtProperty
from UM.i18n import i18nCatalog
catalog = i18nCatalog("cura")
class USBPrinterOutputDevice(PrinterOutputDevice):
def __init__(self, serial_port):
super().__init__(serial_port)
self.setName(catalog.i18nc("@item:inmenu", "USB printing"))
self.setShortDescription(catalog.i18nc("@action:button", "Print via USB"))
self.setShortDescription(catalog.i18nc("@action:button Preceded by 'Ready to'.", "Print via USB"))
self.setDescription(catalog.i18nc("@info:tooltip", "Print via USB"))
self.setIconName("print")
self.setConnectionText(catalog.i18nc("@info:status", "Connected via USB"))

View file

@ -5,6 +5,7 @@ See: http://en.wikipedia.org/wiki/Intel_HEX
This is a python 3 conversion of the code created by David Braam for the Cura project.
"""
import io
from UM.Logger import Logger
def readHex(filename):
"""
@ -41,6 +42,6 @@ def readHex(filename):
elif rec_type == 2: #Extended Segment Address Record
extra_addr = int(line[9:13], 16) * 16
else:
print(rec_type, rec_len, addr, check_sum, line)
Logger.log("d", "%s, %s, %s, %s, %s", rec_type, rec_len, addr, check_sum, line)
f.close()
return data

View file

@ -8,6 +8,7 @@ The ISP AVR programmer can load firmware into AVR chips. Which are commonly used
"""
from . import chipDB
from UM.Logger import Logger
class IspBase():
"""
@ -22,11 +23,11 @@ class IspBase():
raise IspError("Chip with signature: " + str(self.getSignature()) + "not found")
self.chipErase()
print("Flashing %i bytes" % len(flash_data))
Logger.log("d", "Flashing %i bytes", len(flash_data))
self.writeFlash(flash_data)
print("Verifying %i bytes" % len(flash_data))
Logger.log("d", "Verifying %i bytes", len(flash_data))
self.verifyFlash(flash_data)
print("Completed")
Logger.log("d", "Completed")
def getSignature(self):
"""

View file

@ -3,7 +3,6 @@ STK500v2 protocol implementation for programming AVR chips.
The STK500v2 protocol is used by the ArduinoMega2560 and a few other Arduino platforms to load firmware.
This is a python 3 conversion of the code created by David Braam for the Cura project.
"""
import os
import struct
import sys
import time
@ -11,6 +10,7 @@ import time
from serial import Serial
from serial import SerialException
from serial import SerialTimeoutException
from UM.Logger import Logger
from . import ispBase, intelHex
@ -27,7 +27,7 @@ class Stk500v2(ispBase.IspBase):
self.close()
try:
self.serial = Serial(str(port), speed, timeout=1, writeTimeout=10000)
except SerialException as e:
except SerialException:
raise ispBase.IspError("Failed to open serial port")
except:
raise ispBase.IspError("Unexpected error while connecting to serial port:" + port + ":" + str(sys.exc_info()[0]))
@ -84,14 +84,14 @@ class Stk500v2(ispBase.IspBase):
#Set load addr to 0, in case we have more then 64k flash we need to enable the address extension
page_size = self.chip["pageSize"] * 2
flash_size = page_size * self.chip["pageCount"]
print("Writing flash")
Logger.log("d", "Writing flash")
if flash_size > 0xFFFF:
self.sendMessage([0x06, 0x80, 0x00, 0x00, 0x00])
else:
self.sendMessage([0x06, 0x00, 0x00, 0x00, 0x00])
load_count = (len(flash_data) + page_size - 1) / page_size
for i in range(0, int(load_count)):
recv = self.sendMessage([0x13, page_size >> 8, page_size & 0xFF, 0xc1, 0x0a, 0x40, 0x4c, 0x20, 0x00, 0x00] + flash_data[(i * page_size):(i * page_size + page_size)])
self.sendMessage([0x13, page_size >> 8, page_size & 0xFF, 0xc1, 0x0a, 0x40, 0x4c, 0x20, 0x00, 0x00] + flash_data[(i * page_size):(i * page_size + page_size)])
if self.progress_callback is not None:
if self._has_checksum:
self.progress_callback(i + 1, load_count)
@ -151,7 +151,6 @@ class Stk500v2(ispBase.IspBase):
raise ispBase.IspError("Timeout")
b = struct.unpack(">B", s)[0]
checksum ^= b
#print(hex(b))
if state == "Start":
if b == 0x1B:
state = "GetSeq"
@ -183,11 +182,11 @@ class Stk500v2(ispBase.IspBase):
def portList():
ret = []
import _winreg
key=_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,"HARDWARE\\DEVICEMAP\\SERIALCOMM")
key=_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,"HARDWARE\\DEVICEMAP\\SERIALCOMM") #@UndefinedVariable
i=0
while True:
try:
values = _winreg.EnumValue(key, i)
values = _winreg.EnumValue(key, i) #@UndefinedVariable
except:
return ret
if "USBSER" in values[0]:
@ -206,7 +205,7 @@ def main():
""" Entry point to call the stk500v2 programmer from the commandline. """
import threading
if sys.argv[1] == "AUTO":
print(portList())
Logger.log("d", "portList(): ", repr(portList()))
for port in portList():
threading.Thread(target=runProgrammer, args=(port,sys.argv[2])).start()
time.sleep(5)

View file

@ -111,7 +111,7 @@ class MachineInstance:
user_profile_file = os.path.join(user_storage, urllib.parse.quote_plus(self._name) + "_current_settings.inst.cfg")
if not os.path.exists(user_storage):
os.makedirs(user_storage)
with open(user_profile_file, "w") as file_handle:
with open(user_profile_file, "w", encoding = "utf-8") as file_handle:
user_profile.write(file_handle)
version_upgrade_manager.upgradeExtraFile(user_storage, urllib.parse.quote_plus(self._name), "user")

View file

@ -5,6 +5,7 @@ import configparser #To read config files.
import io #To write config files to strings as if they were files.
import UM.VersionUpgrade
from UM.Logger import Logger
## Creates a new profile instance by parsing a serialised profile in version 1
# of the file format.

View file

@ -23,6 +23,10 @@ fragment =
uniform vec4 u_outline_color;
uniform vec4 u_error_color;
const vec3 x_axis = vec3(1.0, 0.0, 0.0);
const vec3 y_axis = vec3(0.0, 1.0, 0.0);
const vec3 z_axis = vec3(0.0, 0.0, 1.0);
varying vec2 v_uvs;
float kernel[9];
@ -51,7 +55,15 @@ fragment =
sum += color * (kernel[i] / u_outline_strength);
}
gl_FragColor = mix(result, vec4(abs(sum.a)) * u_outline_color, abs(sum.a));
vec4 layer1 = texture2D(u_layer1, v_uvs);
if((layer1.rgb == x_axis || layer1.rgb == y_axis || layer1.rgb == z_axis))
{
gl_FragColor = result;
}
else
{
gl_FragColor = mix(result, vec4(abs(sum.a)) * u_outline_color, abs(sum.a));
}
}
[defaults]

View file

@ -165,7 +165,7 @@ class XmlMaterialProfile(UM.Settings.InstanceContainer):
machine_container_map = {}
machine_nozzle_map = {}
all_containers = registry.findInstanceContainers(GUID = self.getMetaDataEntry("GUID"))
all_containers = registry.findInstanceContainers(GUID = self.getMetaDataEntry("GUID"), base_file = self._id)
for container in all_containers:
definition_id = container.getDefinition().id
if definition_id == "fdmprinter":
@ -209,7 +209,17 @@ class XmlMaterialProfile(UM.Settings.InstanceContainer):
if not variant_containers:
continue
builder.start("hotend", { "id": variant_containers[0].getName() })
builder.start("hotend", {"id": variant_containers[0].getName()})
# Compatible is a special case, as it's added as a meta data entry (instead of an instance).
compatible = hotend.getMetaDataEntry("compatible")
if compatible is not None:
builder.start("setting", {"key": "hardware compatible"})
if compatible:
builder.data("yes")
else:
builder.data("no")
builder.end("setting")
for instance in hotend.findInstances():
if container.getInstance(instance.definition.key) and container.getProperty(instance.definition.key, "value") == instance.value:
@ -411,6 +421,8 @@ class XmlMaterialProfile(UM.Settings.InstanceContainer):
else:
Logger.log("d", "Unsupported material setting %s", key)
self.addMetaDataEntry("compatible", global_compatibility)
self._dirty = False
machines = data.iterfind("./um:settings/um:machine", self.__namespaces)
@ -447,6 +459,8 @@ class XmlMaterialProfile(UM.Settings.InstanceContainer):
new_material.setName(self.getName())
new_material.setMetaData(copy.deepcopy(self.getMetaData()))
new_material.setDefinition(definition)
# Don't use setMetadata, as that overrides it for all materials with same base file
new_material.getMetaData()["compatible"] = machine_compatibility
for key, value in global_setting_values.items():
new_material.setProperty(key, "value", value, definition)
@ -492,7 +506,8 @@ class XmlMaterialProfile(UM.Settings.InstanceContainer):
new_hotend_material.setMetaData(copy.deepcopy(self.getMetaData()))
new_hotend_material.setDefinition(definition)
new_hotend_material.addMetaDataEntry("variant", variant_containers[0].id)
new_hotend_material.addMetaDataEntry("compatible", hotend_compatibility)
# Don't use setMetadata, as that overrides it for all materials with same base file
new_hotend_material.getMetaData()["compatible"] = hotend_compatibility
for key, value in global_setting_values.items():
new_hotend_material.setProperty(key, "value", value, definition)
@ -506,14 +521,6 @@ class XmlMaterialProfile(UM.Settings.InstanceContainer):
new_hotend_material._dirty = False
UM.Settings.ContainerRegistry.getInstance().addContainer(new_hotend_material)
if not global_compatibility:
# Change the type of this container so it is not shown as an option in menus.
# This uses InstanceContainer.setMetaDataEntry because otherwise all containers that
# share this basefile are also updated.
dirty = self.isDirty()
super().setMetaDataEntry("type", "incompatible_material")
super().setDirty(dirty) # reset dirty flag after setMetaDataEntry
def _addSettingElement(self, builder, instance):
try:
key = UM.Dictionary.findKey(self.__material_property_setting_map, instance.definition.key)

View file

@ -0,0 +1,40 @@
{
"id": "bfb",
"name": "BFB",
"version": 2,
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "Ultimaker",
"manufacturer": "BFB",
"category": "Other",
"file_formats": "text/x-gcode",
"platform_offset": [ 0, 0, 0]
},
"overrides": {
"speed_topbottom": { "default_value": 40 },
"speed_print": { "default_value": 40 },
"machine_extruder_count": { "default_value": 1 },
"prime_tower_size": { "default_value": 7.745966692414834 },
"machine_name": { "default_value": "BFB_Test" },
"machine_heated_bed": { "default_value": false },
"machine_nozzle_size": { "default_value": 0.5 },
"speed_layer_0": { "default_value": 25 },
"machine_width": { "default_value": 275 },
"machine_gcode_flavor": { "default_value": "BFB" },
"machine_depth": { "default_value": 265 },
"speed_infill": { "default_value": 30 },
"material_diameter": { "default_value": 1.7 },
"machine_center_is_zero": { "default_value": true },
"machine_height": { "default_value": 240 },
"layer_height": { "default_value": 0.25 },
"material_print_temperature": { "default_value": 200 },
"retraction_amount": { "default_value": 0.05 },
"speed_wall_0": { "default_value": 25 },
"speed_travel": { "default_value": 50 },
"infill_sparse_density": { "default_value": 10 },
"layer_height_0": { "default_value": 0.5 },
"speed_wall_x": { "default_value": 20 }
}
}

View file

@ -0,0 +1,35 @@
{
"id": "deltabot",
"name": "DeltaBot",
"version": 2,
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "Ultimaker",
"manufacturer": "Danny Lu",
"category": "Other",
"file_formats": "text/x-gcode",
"platform_offset": [ 0, 0, 0]
},
"overrides": {
"speed_travel": { "default_value": 150 },
"prime_tower_size": { "default_value": 8.660254037844387 },
"infill_sparse_density": { "default_value": 10 },
"speed_wall_x": { "default_value": 30 },
"speed_wall_0": { "default_value": 30 },
"speed_topbottom": { "default_value": 30 },
"layer_height": { "default_value": 0.2 },
"machine_nozzle_size": { "default_value": 0.5 },
"speed_print": { "default_value": 30 },
"speed_infill": { "default_value": 30 },
"machine_extruder_count": { "default_value": 1 },
"machine_heated_bed": { "default_value": true },
"machine_center_is_zero": { "default_value": true },
"machine_height": { "default_value": 150 },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_depth": { "default_value": 150 },
"machine_width": { "default_value": 150 },
"machine_name": { "default_value": "DeltaBot style" }
}
}

View file

@ -169,7 +169,7 @@
},
"machine_extruder_count":
{
"label": "Number extruders",
"label": "Number of Extruders",
"description": "Number of extruder trains. An extruder train is the combination of a feeder, bowden tube, and nozzle.",
"default_value": 1,
"minimum_value": "1",
@ -283,6 +283,18 @@
"settable_per_extruder": false,
"settable_per_meshgroup": false
},
"nozzle_disallowed_areas":
{
"label": "Nozzle Disallowed Areas",
"description": "A list of polygons with areas the nozzle is not allowed to enter.",
"type": "polygons",
"default_value":
[
],
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
},
"machine_head_polygon":
{
"label": "Machine head polygon",
@ -756,6 +768,18 @@
}
}
},
"wall_0_wipe_dist":
{
"label": "Outer Wall Wipe Distance",
"description": "Distance of a travel move inserted after the outer wall, to hide the Z seam better.",
"unit": "mm",
"type": "float",
"default_value": 0.2,
"value": "machine_nozzle_size / 2",
"minimum_value": "0",
"maximum_value_warning": "machine_nozzle_size",
"settable_per_mesh": true
},
"top_bottom_thickness":
{
"label": "Top/Bottom Thickness",
@ -897,6 +921,17 @@
}
}
},
"fill_perimeter_gaps": {
"label": "Fill Gaps Between Walls",
"description": "Fills the gaps between walls where no walls fit.",
"type": "enum",
"options": {
"nowhere": "Nowhere",
"everywhere": "Everywhere"
},
"default_value": "everywhere",
"settable_per_mesh": true
},
"xy_offset":
{
"label": "Horizontal Expansion",
@ -979,6 +1014,7 @@
"cubic": "Cubic",
"tetrahedral": "Tetrahedral",
"concentric": "Concentric",
"concentric_3d": "Concentric 3D",
"zigzag": "Zig Zag"
},
"default_value": "grid",
@ -1135,7 +1171,50 @@
"minimum_value": "-273.15",
"minimum_value_warning": "0",
"maximum_value_warning": "260",
"enabled": "not (material_flow_dependent_temperature)",
"enabled": "not (material_flow_dependent_temperature) and machine_gcode_flavor != \"UltiGCode\"",
"settable_per_mesh": false,
"settable_per_extruder": true
},
"material_print_temperature_layer_0":
{
"label": "Printing Temperature Initial Layer",
"description": "The temperature used for printing the first layer. Set at 0 to disable special handling of the initial layer.",
"unit": "°C",
"type": "float",
"default_value": 215,
"value": "material_print_temperature + 5",
"minimum_value": "-273.15",
"minimum_value_warning": "0",
"maximum_value_warning": "260",
"enabled": "machine_gcode_flavor != \"UltiGCode\"",
"settable_per_mesh": false,
"settable_per_extruder": true
},
"material_initial_print_temperature":
{
"label": "Initial Printing Temperature",
"description": "The minimal temperature while heating up to the Printing Temperature at which printing can already start.",
"unit": "°C",
"type": "float",
"default_value": 190,
"minimum_value": "-273.15",
"minimum_value_warning": "material_standby_temperature",
"maximum_value_warning": "material_print_temperature",
"enabled": "machine_gcode_flavor != \"UltiGCode\"",
"settable_per_mesh": false,
"settable_per_extruder": true
},
"material_final_print_temperature":
{
"label": "Final Printing Temperature",
"description": "The temperature to which to already start cooling down just before the end of printing.",
"unit": "°C",
"type": "float",
"default_value": 180,
"minimum_value": "-273.15",
"minimum_value_warning": "material_standby_temperature",
"maximum_value_warning": "material_print_temperature",
"enabled": "machine_gcode_flavor != \"UltiGCode\"",
"settable_per_mesh": false,
"settable_per_extruder": true
},
@ -1160,6 +1239,7 @@
"default_value": 0.5,
"minimum_value": "0",
"maximum_value_warning": "10.0",
"maximum_value": "machine_nozzle_heat_up_speed",
"enabled": "False",
"comments": "old enabled function: material_flow_dependent_temperature or machine_extruder_count > 1",
"settable_per_mesh": false,
@ -1176,7 +1256,23 @@
"minimum_value": "-273.15",
"minimum_value_warning": "0",
"maximum_value_warning": "260",
"enabled": "machine_heated_bed",
"enabled": "machine_heated_bed and machine_gcode_flavor != \"UltiGCode\"",
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
},
"material_bed_temperature_layer_0":
{
"label": "Build Plate Temperature Initial Layer",
"description": "The temperature used for the heated build plate at the first layer.",
"unit": "°C",
"type": "float",
"resolve": "max(extruderValues('material_bed_temperature_layer_0'))",
"default_value": 60,
"minimum_value": "-273.15",
"minimum_value_warning": "0",
"maximum_value_warning": "260",
"enabled": "machine_heated_bed and machine_gcode_flavor != \"UltiGCode\"",
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
@ -1191,6 +1287,7 @@
"minimum_value": "0.0001",
"minimum_value_warning": "0.4",
"maximum_value_warning": "3.5",
"enabled": "machine_gcode_flavor != \"UltiGCode\"",
"settable_per_mesh": false,
"settable_per_extruder": true
},
@ -1204,6 +1301,7 @@
"minimum_value": "5",
"minimum_value_warning": "50",
"maximum_value_warning": "150",
"enabled": "machine_gcode_flavor != \"UltiGCode\"",
"settable_per_mesh": true
},
"retraction_enable":
@ -1215,6 +1313,14 @@
"settable_per_mesh": false,
"settable_per_extruder": true
},
"retract_at_layer_change":{
"label": "Retract at Layer Change",
"description": "Retract the filament when the nozzle is moving to the next layer.",
"type": "bool",
"default_value": false,
"settable_per_mesh": false,
"settable_per_extruder": true
},
"retraction_amount":
{
"label": "Retraction Distance",
@ -1224,7 +1330,7 @@
"default_value": 6.5,
"minimum_value_warning": "-0.0001",
"maximum_value_warning": "10.0",
"enabled": "retraction_enable",
"enabled": "retraction_enable and machine_gcode_flavor != \"UltiGCode\"",
"settable_per_mesh": false,
"settable_per_extruder": true
},
@ -1239,7 +1345,7 @@
"minimum_value_warning": "1",
"maximum_value": "machine_max_feedrate_e",
"maximum_value_warning": "70",
"enabled": "retraction_enable",
"enabled": "retraction_enable and machine_gcode_flavor != \"UltiGCode\"",
"settable_per_mesh": false,
"settable_per_extruder": true,
"children":
@ -1255,7 +1361,7 @@
"maximum_value": "machine_max_feedrate_e",
"minimum_value_warning": "1",
"maximum_value_warning": "70",
"enabled": "retraction_enable",
"enabled": "retraction_enable and machine_gcode_flavor != \"UltiGCode\"",
"value": "retraction_speed",
"settable_per_mesh": false,
"settable_per_extruder": true
@ -1271,7 +1377,7 @@
"maximum_value": "machine_max_feedrate_e",
"minimum_value_warning": "1",
"maximum_value_warning": "70",
"enabled": "retraction_enable",
"enabled": "retraction_enable and machine_gcode_flavor != \"UltiGCode\"",
"value": "retraction_speed",
"settable_per_mesh": false,
"settable_per_extruder": true
@ -1331,39 +1437,6 @@
"settable_per_mesh": false,
"settable_per_extruder": true
},
"retraction_hop_enabled":
{
"label": "Z Hop when Retracted",
"description": "Whenever a retraction is done, the build plate is lowered to create clearance between the nozzle and the print. It prevents the nozzle from hitting the print during travel moves, reducing the chance to knock the print from the build plate.",
"type": "bool",
"default_value": false,
"enabled": "retraction_enable",
"settable_per_mesh": false,
"settable_per_extruder": true
},
"retraction_hop_only_when_collides":
{
"label": "Z Hop Only Over Printed Parts",
"description": "Only perform a Z Hop when moving over printed parts which cannot be avoided by horizontal motion by Avoid Printed Parts when Traveling.",
"type": "bool",
"default_value": false,
"enabled": "retraction_enable and retraction_hop_enabled and travel_avoid_other_parts",
"settable_per_mesh": false,
"settable_per_extruder": true
},
"retraction_hop":
{
"label": "Z Hop Height",
"description": "The height difference when performing a Z Hop.",
"unit": "mm",
"type": "float",
"default_value": 1,
"minimum_value_warning": "0.75 * machine_nozzle_size",
"maximum_value_warning": "10",
"enabled": "retraction_enable and retraction_hop_enabled",
"settable_per_mesh": false,
"settable_per_extruder": true
},
"material_standby_temperature":
{
"label": "Standby Temperature",
@ -1374,6 +1447,7 @@
"minimum_value": "-273.15",
"minimum_value_warning": "0",
"maximum_value_warning": "260",
"enabled": "machine_extruder_count > 1 and machine_gcode_flavor != \"UltiGCode\"",
"settable_per_mesh": false,
"settable_per_extruder": true
},
@ -1440,16 +1514,6 @@
"settable_per_extruder": true
}
}
},
"retraction_hop_after_extruder_switch":
{
"label": "Z Hop After Extruder Switch",
"description": "After the machine switched from one extruder to the other, the build plate is lowered to create clearance between the nozzle and the print. This prevents the nozzle from leaving oozed material on the outside of a print.",
"type": "bool",
"default_value": true,
"enabled": "retraction_hop_enabled",
"settable_per_mesh": false,
"settable_per_extruder": true
}
}
},
@ -2222,7 +2286,7 @@
"retraction_combing":
{
"label": "Combing Mode",
"description": "Combing keeps the nozzle within already printed areas when traveling. This 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.",
"description": "Combing keeps the nozzle within already printed areas when traveling. This 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.",
"type": "enum",
"options":
{
@ -2259,6 +2323,81 @@
"enabled": "resolveOrValue('retraction_combing') != 'off' and travel_avoid_other_parts",
"settable_per_mesh": false,
"settable_per_extruder": true
},
"start_layers_at_same_position":
{
"label": "Start Layers Near Same Point",
"description": "Start printing the objects in each layer 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.",
"type": "bool",
"default_value": false,
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": true
},
"layer_start_x":
{
"label": "Layer Start X",
"description": "The X coordinate of the position near where to start printing objects each layer.",
"unit": "mm",
"type": "float",
"default_value": 0.0,
"minimum_value": "0",
"enabled": "start_layers_at_same_position",
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": true
},
"layer_start_y":
{
"label": "Layer Start Y",
"description": "The Y coordinate of the position near where to start printing objects each layer.",
"unit": "mm",
"type": "float",
"default_value": 0.0,
"minimum_value": "0",
"enabled": "start_layers_at_same_position",
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": true
},
"retraction_hop_enabled": {
"label": "Z Hop when Retracted",
"description": "Whenever a retraction is done, the build plate is lowered to create clearance between the nozzle and the print. It prevents the nozzle from hitting the print during travel moves, reducing the chance to knock the print from the build plate.",
"type": "bool",
"default_value": false,
"enabled": "retraction_enable",
"settable_per_mesh": false,
"settable_per_extruder": true
},
"retraction_hop_only_when_collides": {
"label": "Z Hop Only Over Printed Parts",
"description": "Only perform a Z Hop when moving over printed parts which cannot be avoided by horizontal motion by Avoid Printed Parts when Traveling.",
"type": "bool",
"default_value": false,
"enabled": "retraction_enable and retraction_hop_enabled and travel_avoid_other_parts",
"settable_per_mesh": false,
"settable_per_extruder": true
},
"retraction_hop": {
"label": "Z Hop Height",
"description": "The height difference when performing a Z Hop.",
"unit": "mm",
"type": "float",
"default_value": 1,
"minimum_value_warning": "0.75 * machine_nozzle_size",
"maximum_value_warning": "10",
"enabled": "retraction_enable and retraction_hop_enabled",
"settable_per_mesh": false,
"settable_per_extruder": true
},
"retraction_hop_after_extruder_switch": {
"label": "Z Hop After Extruder Switch",
"description": "After the machine switched from one extruder to the other, the build plate is lowered to create clearance between the nozzle and the print. This prevents the nozzle from leaving oozed material on the outside of a print.",
"type": "bool",
"default_value": true,
"enabled": "retraction_hop_enabled and machine_extruder_count > 1",
"settable_per_mesh": false,
"settable_per_extruder": true
}
}
},
@ -2294,6 +2433,20 @@
"settable_per_extruder": true,
"children":
{
"cool_fan_speed_0":
{
"label": "Initial Fan Speed",
"description": "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.",
"unit": "%",
"type": "float",
"minimum_value": "0",
"maximum_value": "100",
"value": "cool_fan_speed",
"default_value": 100,
"enabled": "cool_fan_enabled",
"settable_per_mesh": false,
"settable_per_extruder": true
},
"cool_fan_speed_min":
{
"label": "Regular Fan Speed",
@ -2339,7 +2492,7 @@
"cool_fan_full_at_height":
{
"label": "Regular Fan Speed at Height",
"description": "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.",
"description": "The height at which the fans spin on regular fan speed. At the layers below the fan speed gradually increases from Initial Fan Speed to Regular Fan Speed.",
"unit": "mm",
"type": "float",
"default_value": 0.5,
@ -2367,7 +2520,7 @@
"cool_min_layer_time":
{
"label": "Minimum Layer Time",
"description": "The minimum time spent in a layer. This forces the printer to slow down, to at least spend the time set here in one layer. This allows the printed material to cool down properly before printing the next layer.",
"description": "The minimum time spent in a layer. This forces the printer to slow down, to at least spend the time set here in one layer. This allows the printed material to cool down properly before printing the next layer. Layers may still take shorter than the minimal layer time if Lift Head is disabled and if the Minimum Speed would otherwise be violated.",
"unit": "s",
"type": "float",
"default_value": 5,
@ -2416,6 +2569,51 @@
"settable_per_mesh": true,
"settable_per_extruder": false
},
"support_extruder_nr":
{
"label": "Support Extruder",
"description": "The extruder train to use for printing the support. This is used in multi-extrusion.",
"type": "extruder",
"default_value": "0",
"enabled": "support_enable and machine_extruder_count > 1",
"settable_per_mesh": false,
"settable_per_extruder": false,
"children": {
"support_infill_extruder_nr":
{
"label": "Support Infill Extruder",
"description": "The extruder train to use for printing the infill of the support. This is used in multi-extrusion.",
"type": "extruder",
"default_value": "0",
"value": "support_extruder_nr",
"enabled": "support_enable and machine_extruder_count > 1",
"settable_per_mesh": false,
"settable_per_extruder": false
},
"support_extruder_nr_layer_0":
{
"label": "First Layer Support Extruder",
"description": "The extruder train to use for printing the first layer of support infill. This is used in multi-extrusion.",
"type": "extruder",
"default_value": "0",
"value": "support_extruder_nr",
"enabled": "support_enable and machine_extruder_count > 1",
"settable_per_mesh": false,
"settable_per_extruder": false
},
"support_interface_extruder_nr":
{
"label": "Support Interface Extruder",
"description": "The extruder train to use for printing the roofs and bottoms of the support. This is used in multi-extrusion.",
"type": "extruder",
"default_value": "0",
"value": "support_extruder_nr",
"enabled": "support_enable and machine_extruder_count > 1",
"settable_per_mesh": false,
"settable_per_extruder": false
}
}
},
"support_type":
{
"label": "Support Placement",
@ -2457,6 +2655,7 @@
"grid": "Grid",
"triangles": "Triangles",
"concentric": "Concentric",
"concentric_3d": "Concentric 3D",
"zigzag": "Zig Zag"
},
"default_value": "zigzag",
@ -2726,7 +2925,7 @@
"type": "float",
"default_value": 0.4,
"minimum_value": "0",
"minimum_value_warning": "support_interface_line_width",
"minimum_value_warning": "support_interface_line_width - 0.0001",
"value": "0 if support_interface_density == 0 else (support_interface_line_width * 100) / support_interface_density * (2 if support_interface_pattern == 'grid' else (3 if support_interface_pattern == 'triangles' else 1))",
"limit_to_extruder": "support_interface_extruder_nr",
"enabled": "extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable",
@ -2746,6 +2945,7 @@
"grid": "Grid",
"triangles": "Triangles",
"concentric": "Concentric",
"concentric_3d": "Concentric 3D",
"zigzag": "Zig Zag"
},
"default_value": "concentric",
@ -2851,13 +3051,24 @@
{
"skirt": "Skirt",
"brim": "Brim",
"raft": "Raft"
"raft": "Raft",
"none": "None"
},
"default_value": "brim",
"resolve": "'raft' if 'raft' in extruderValues('adhesion_type') else ('brim' if 'brim' in extruderValues('adhesion_type') else 'skirt')",
"settable_per_mesh": false,
"settable_per_extruder": false
},
"adhesion_extruder_nr":
{
"label": "Build Plate Adhesion Extruder",
"description": "The extruder train to use for printing the skirt/brim/raft. This is used in multi-extrusion.",
"type": "extruder",
"default_value": "0",
"enabled": "machine_extruder_count > 1 and resolveOrValue('adhesion_type') != 'none'",
"settable_per_mesh": false,
"settable_per_extruder": false
},
"skirt_line_count":
{
"label": "Skirt Line Count",
@ -3407,62 +3618,6 @@
"enabled": "machine_extruder_count > 1",
"children":
{
"adhesion_extruder_nr":
{
"label": "Build Plate Adhesion Extruder",
"description": "The extruder train to use for printing the skirt/brim/raft. This is used in multi-extrusion.",
"type": "extruder",
"default_value": "0",
"enabled": "machine_extruder_count > 1",
"settable_per_mesh": false,
"settable_per_extruder": false
},
"support_extruder_nr":
{
"label": "Support Extruder",
"description": "The extruder train to use for printing the support. This is used in multi-extrusion.",
"type": "extruder",
"default_value": "0",
"enabled": "support_enable and machine_extruder_count > 1",
"settable_per_mesh": false,
"settable_per_extruder": false,
"children":
{
"support_infill_extruder_nr":
{
"label": "Support Infill Extruder",
"description": "The extruder train to use for printing the infill of the support. This is used in multi-extrusion.",
"type": "extruder",
"default_value": "0",
"value": "support_extruder_nr",
"enabled": "support_enable and machine_extruder_count > 1",
"settable_per_mesh": false,
"settable_per_extruder": false
},
"support_extruder_nr_layer_0":
{
"label": "First Layer Support Extruder",
"description": "The extruder train to use for printing the first layer of support infill. This is used in multi-extrusion.",
"type": "extruder",
"default_value": "0",
"value": "support_extruder_nr",
"enabled": "support_enable and machine_extruder_count > 1",
"settable_per_mesh": false,
"settable_per_extruder": false
},
"support_interface_extruder_nr":
{
"label": "Support Interface Extruder",
"description": "The extruder train to use for printing the roofs and bottoms of the support. This is used in multi-extrusion.",
"type": "extruder",
"default_value": "0",
"value": "support_extruder_nr",
"enabled": "support_enable and machine_extruder_count > 1",
"settable_per_mesh": false,
"settable_per_extruder": false
}
}
},
"prime_tower_enable":
{
"label": "Enable Prime Tower",
@ -3636,6 +3791,28 @@
"type": "bool",
"default_value": false,
"settable_per_mesh": true
},
"carve_multiple_volumes":
{
"label": "Remove Mesh Intersection",
"description": "Remove areas where multiple objects are overlapping with each other. This may be used if merged dual material objects overlap with each other.",
"type": "bool",
"default_value": true,
"value": "machine_extruder_count > 1",
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": true
},
"alternate_carve_order":
{
"label": "Alternate Mesh Removal",
"description": "With every layer switch to which model the intersecting volumes will belong, so that the overlapping volumes become interwoven.",
"type": "bool",
"default_value": true,
"enabled": "carve_multiple_volumes",
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": true
}
}
},
@ -3658,6 +3835,7 @@
"one_at_a_time": "One at a Time"
},
"default_value": "all_at_once",
"enabled": "machine_extruder_count == 1",
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
@ -3896,6 +4074,14 @@
"limit_to_extruder": "support_infill_extruder_nr",
"settable_per_mesh": true
},
"infill_hollow":
{
"label": "Hollow Out Objects",
"description": "Remove all infill and make the inside of the object eligible for support.",
"type": "bool",
"default_value": false,
"settable_per_mesh": true
},
"magic_fuzzy_skin_enabled":
{
"label": "Fuzzy Skin",
@ -4303,6 +4489,49 @@
"settable_per_meshgroup": false
}
}
},
"command_line_settings": {
"label": "Command Line Settings",
"description": "Settings which are only used if CuraEngine isn't called from the Cura frontend.",
"type": "category",
"enabled": false,
"children": {
"center_object": {
"description": "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.",
"type": "bool",
"label": "Center object",
"default_value": false,
"enabled": false
},
"mesh_position_x": {
"description": "Offset applied to the object in the x direction.",
"type": "float",
"label": "Mesh position x",
"default_value": 0,
"enabled": false
},
"mesh_position_y": {
"description": "Offset applied to the object in the y direction.",
"type": "float",
"label": "Mesh position y",
"default_value": 0,
"enabled": false
},
"mesh_position_z": {
"description": "Offset applied to the object in the z direction. With this you can perform what was used to be called 'Object Sink'.",
"type": "float",
"label": "Mesh position z",
"default_value": 0,
"enabled": false
},
"mesh_rotation_matrix": {
"label": "Mesh Rotation Matrix",
"description": "Transformation matrix to be applied to the model when loading it from file.",
"type": "str",
"default_value": "[[1,0,0], [0,1,0], [0,0,1]]",
"enabled": false
}
}
}
}
}

View file

@ -54,7 +54,7 @@
"default_value": "RepRap (Marlin/Sprinter)"
},
"machine_start_gcode": {
"default_value": "G28 ; Home extruder\nM107 ; Turn off fan\nG90 ; Absolute positioning\nM82 ; Extruder in absolute mode\n{IF_BED}M190 S{BED}\n{IF_EXT0}M104 T0 S{TEMP0}\n{IF_EXT0}M109 T0 S{TEMP0}\n{IF_EXT1}M104 T1 S{TEMP1}\n{IF_EXT1}M109 T1 S{TEMP1}\nG32 S3 ; auto level\nG92 E0 ; Reset extruder position"
"default_value": "G28 ; Home extruder\nM107 ; Turn off fan\nG90 ; Absolute positioning\nM82 ; Extruder in absolute mode\nM190 S{material_bed_temperature}\nM104 T0 S{material_print_temperature}\nM109 T0 S{material_print_temperature}\nM104 T1 S{material_print_temperature}\nM109 T1 S{material_print_temperature}\nG32 S3 ; auto level\nG92 E0 ; Reset extruder position"
},
"machine_end_gcode": {
"default_value": "M104 S0 ; turn off extruders\nM140 S0 ; heated bed heater off\nG91 ; relative positioning\nG1 E-2 F5000; retract 2mm\nG28 Z; move bed down\nG90 ; absolute positioning\nM84 ; disable motors"

View file

@ -0,0 +1,52 @@
{
"id": "julia",
"name": "Julia",
"version": 2,
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "Ultimaker",
"manufacturer": "Fracktal",
"category": "Other",
"file_formats": "text/x-gcode",
"platform_offset": [ 0, 0, 0]
},
"overrides": {
"machine_start_gcode": {
"default_value": " ;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {infill_sparse_density}\n ;metric values\n M107\n G28\n G29\n G90 ;absolute positioning\n G92 E0; reset extruder distance\n G1 Z5 F300 ;move nozzle up 5mm for safe homing\n G1 X0 Y0 Z0 F5000; move nozzle to home\n M300 S600P200\n M300 S800 P200\n M190 S{material_bed_temperature} ;Uncomment to add your own bed temperature line\n M109 S{material_print_temperature} ;Uncomment to add your own temperature line\n M82 ;set extruder to absolute mode\n M107 ;start with the fan off\n G1 Z15.0 F{speed_travel} ;move the platform down 15mm\n G92 E0 ;zero the extruded length\n G1 F200 E3 ;extrude 3mm of feed stock\n G92 E0 ;zero the extruded length again\n G1 F{speed_travel}\n ;Put printing message on LCD screen\n M117 Printing...\n"
},
"machine_end_gcode": {
"default_value": " M104 S0 ;extruder heater off\n M140 S0 ;heated bed heater off (if you have it)\n G91 ;relative positioning\n G1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\n G1 Z+0.5 E-5 X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\n G28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\n M84 ;steppers off\n G90 ;absolute positioning\n"
},
"material_bed_temperature": { "default_value": 100 },
"layer_height": { "default_value": 0.2 },
"support_angle": { "default_value": 30 },
"infill_overlap": { "default_value": 30 },
"layer_height_0": { "default_value": 0.2 },
"speed_print": { "default_value": 80 },
"speed_wall_0": { "default_value": 30 },
"speed_travel": { "default_value": 150 },
"brim_line_count": { "default_value": 15 },
"skin_overlap": { "default_value": 30 },
"prime_tower_size": { "default_value": 8.660254037844387 },
"material_diameter": { "default_value": 1.75 },
"bottom_thickness": { "default_value": 0.8 },
"retraction_amount": { "default_value": 3 },
"speed_topbottom": { "default_value": 80 },
"material_print_temperature": { "default_value": 230 },
"support_pattern": { "default_value": "grid" },
"speed_infill": { "default_value": 80 },
"infill_sparse_density": { "default_value": 10 },
"top_thickness": { "default_value": 0.8 },
"machine_extruder_count": { "default_value": 1 },
"retraction_combing": { "default_value": "off" },
"machine_heated_bed": { "default_value": true },
"machine_center_is_zero": { "default_value": false },
"machine_height": { "default_value": 260 },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_depth": { "default_value": 250 },
"machine_width": { "default_value": 210 },
"machine_name": { "default_value": "Julia V2" }
}
}

View file

@ -0,0 +1,38 @@
{
"id": "kupido",
"name": "Kupido",
"version": 2,
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "Ultimaker",
"manufacturer": "Kupido",
"category": "Other",
"file_formats": "text/x-gcode",
"platform_offset": [ 0, 0, 0]
},
"overrides": {
"machine_name": { "default_value": "Kupido" },
"machine_start_gcode": {
"default_value": " ;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {infill_sparse_density}\n ;M190 S{material_bed_temperature} ;Uncomment to add your own bed temperature line\n ;M109 S{material_print_temperature} ;Uncomment to add your own temperature line\n G21 ;metric values\n G90 ;absolute positioning\n M82 ;set extruder to absolute mode\n M107 ;start with the fan off\n G28 X0 Y0 ;move X Y to endstops\n G28 Z0 ;move Z to endstops\n G1 Z20.0 F40 ;move the platform down 20mm\n G1 Y0 X170 F{speed_travel}\n G92 E0 ;zero the extruded length\n G1 F200 E10 ;extrude 3mm of feed stock\n G92 E0 ;zero the extruded length again\n G4 P7000\n G1 F{speed_travel}\n ;Put printing message on LCD screen\n M117 Printing...\n"
},
"machine_end_gcode": {
"default_value": " M104 S0 ;extruder heater off\n M140 S0 ;heated bed heater off (if you have it)\n G91 ;relative positioning\n G1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\n G1 Z+0.5 E-5 X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\n G28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\n M84 ;steppers off\n G90 ;absolute positioning\n"
},
"prime_tower_size": { "default_value": 8.660254037844387 },
"retraction_speed": { "default_value": 60 },
"material_bed_temperature": { "default_value": 60 },
"speed_wall_x": { "default_value": 40 },
"skirt_line_count": { "default_value": 2 },
"retraction_min_travel": { "default_value": 2 },
"speed_wall_0": { "default_value": 30 },
"material_print_temperature": { "default_value": 220 },
"brim_line_count": { "default_value": 15 },
"retraction_amount": { "default_value": 3.6 },
"speed_topbottom": { "default_value": 20 },
"layer_height": { "default_value": 0.2 },
"speed_print": { "default_value": 30 },
"speed_infill": { "default_value": 30 }
}
}

View file

@ -0,0 +1,31 @@
{
"id": "makerbotreplicator",
"name": "MakerBotReplicator",
"version": 2,
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "Ultimaker",
"manufacturer": "MakerBot",
"category": "Other",
"file_formats": "application/x3g",
"platform_offset": [ 0, 0, 0]
},
"overrides": {
"prime_tower_size": { "default_value": 10.0 },
"infill_sparse_density": { "default_value": 10 },
"speed_travel": { "default_value": 150 },
"material_diameter": { "default_value": 1.75 },
"layer_height": { "default_value": 0.15 },
"material_print_temperature": { "default_value": 220 },
"machine_extruder_count": { "default_value": 1 },
"machine_heated_bed": { "default_value": true },
"machine_center_is_zero": { "default_value": false },
"machine_height": { "default_value": 150 },
"machine_gcode_flavor": { "default_value": "MakerBot" },
"machine_depth": { "default_value": 145 },
"machine_width": { "default_value": 225 },
"machine_name": { "default_value": "MakerBot Replicator" }
}
}

View file

@ -0,0 +1,41 @@
{
"id": "ord",
"name": "RoVa3D",
"version": 2,
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "Ultimaker",
"manufacturer": "ORD Solutions",
"category": "Other",
"file_formats": "text/x-gcode",
"machine_extruder_trains":
{
"0": "ord_extruder_0",
"1": "ord_extruder_1",
"2": "ord_extruder_2",
"3": "ord_extruder_3",
"4": "ord_extruder_4"
},
"platform_offset": [ 0, 0, 0]
},
"overrides": {
"material_bed_temperature": { "default_value": 60 },
"prime_tower_size": { "default_value": 7.0710678118654755 },
"infill_sparse_density": { "default_value": 15 },
"speed_travel": { "default_value": 150 },
"material_diameter": { "default_value": 1.75 },
"layer_height": { "default_value": 0.3 },
"machine_nozzle_size": { "default_value": 0.35 },
"material_print_temperature": { "default_value": 240 },
"machine_extruder_count": { "default_value": 5 },
"machine_heated_bed": { "default_value": true },
"machine_center_is_zero": { "default_value": false },
"machine_height": { "default_value": 200 },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_depth": { "default_value": 250 },
"machine_width": { "default_value": 215 },
"machine_name": { "default_value": "RoVa3D" }
}
}

View file

@ -0,0 +1,51 @@
{
"id": "printrbot_play",
"version": 2,
"name": "Printrbot Play",
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "Chris Pearson",
"manufacturer": "Printrbot",
"category": "Other",
"file_formats": "text/x-gcode",
"platform": "printrbot_play.stl"
},
"overrides": {
"machine_name": { "default_value": "Printrbot Play" },
"machine_heated_bed": { "default_value": false },
"machine_width": { "default_value": 100 },
"machine_depth": { "default_value": 100 },
"machine_height": { "default_value": 130 },
"machine_center_is_zero": { "default_value": false },
"material_diameter": { "default_value": 1.75 },
"machine_nozzle_size": { "default_value": 0.4 },
"layer_height": { "default_value": 0.2 },
"layer_height_0": { "default_value": 0.3 },
"retraction_amount": { "default_value": 0.7 },
"retraction_speed": { "default_value": 45},
"adhesion_type": { "default_value": "skirt" },
"machine_head_with_fans_polygon": { "default_value": [[-32,999],[37,999],[37,-32],[-32,-32]] },
"gantry_height": { "default_value": 55 },
"speed_print": { "default_value": 50 },
"speed_travel": { "default_value": 55 },
"machine_max_feedrate_x": {"default_value": 125},
"machine_max_feedrate_y": {"default_value": 125},
"machine_max_feedrate_z": { "default_value": 5 },
"machine_max_acceleration_x": { "default_value": 2000 },
"machine_max_acceleration_y": { "default_value": 2000 },
"machine_max_acceleration_z": { "default_value": 30 },
"machine_max_acceleration_e": { "default_value": 10000 },
"machine_max_jerk_xy": { "default_value": 20 },
"machine_max_jerk_z": { "default_value": 0.4 },
"machine_max_jerk_e": { "default_value": 5.0 },
"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\nM106 ;start with the fan on for filament cooling\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG29 ;run auto bed leveling\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E10 ;extrude 10mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..."
},
"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\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning"
}
}
}

View file

@ -0,0 +1,20 @@
{
"id": "printrbot_play_heated",
"version": 2,
"name": "Printrbot Play (Heated Bed)",
"inherits": "printrbot_play",
"metadata": {
"visible": true,
"author": "Chris Pearson",
"manufacturer": "Printrbot",
"category": "Other",
"file_formats": "text/x-gcode",
"platform": ""
},
"overrides": {
"machine_name": { "default_value": "Printrbot Play (Heated Bed)" },
"machine_heated_bed": { "default_value": true },
"machine_depth": { "default_value": 203 }
}
}

View file

@ -9,6 +9,7 @@
"manufacturer": "PrintrBot",
"category": "Other",
"platform": "printrbot_simple_metal_platform.stl",
"platform_offset": [0, -3.45, 0],
"file_formats": "text/x-gcode"
},

View file

@ -0,0 +1,41 @@
{
"id": "punchtec_connect_xl",
"name": "Punchtec Connect XL",
"version": 2,
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "Ultimaker",
"manufacturer": "Punchtec",
"category": "Other",
"file_formats": "text/x-gcode",
"machine_extruder_trains":
{
"0": "punchtec_connect_xl_extruder_0",
"1": "punchtec_connect_xl_extruder_1"
},
"platform_offset": [ 0, 0, 0]
},
"overrides": {
"machine_head_polygon": { "default_value": [[ 0, 0], [ 0, 0], [ 0, 0], [ 0, 0]] },
"speed_travel": { "default_value": 150 },
"prime_tower_size": { "default_value": 8.660254037844387 },
"speed_wall_x": { "default_value": 40 },
"speed_wall_0": { "default_value": 40 },
"material_diameter": { "default_value": 1.75 },
"speed_topbottom": { "default_value": 40 },
"layer_height": { "default_value": 0.2 },
"material_print_temperature": { "default_value": 195 },
"speed_print": { "default_value": 40 },
"speed_infill": { "default_value": 40 },
"machine_extruder_count": { "default_value": 2 },
"machine_heated_bed": { "default_value": true },
"machine_center_is_zero": { "default_value": false },
"machine_height": { "default_value": 200 },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_depth": { "default_value": 304 },
"machine_width": { "default_value": 304 },
"machine_name": { "default_value": "Punchtec Connect XL" }
}
}

View file

@ -0,0 +1,53 @@
{
"id": "rigid3d",
"name": "Rigid3D",
"version": 2,
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "Ultimaker",
"manufacturer": "Rigid3D",
"category": "Other",
"file_formats": "text/x-gcode",
"platform_offset": [ 0, 0, 0]
},
"overrides": {
"machine_start_gcode": {
"default_value": " ; -- START GCODE --\n G21\n G28 ; Home extruder\n G29 ; Autolevel bed\n M107 ; Turn off fan\n G90 ; Absolute positioning\n M82 ; Extruder in absolute mode\n G92 E0 ; Reset extruder position\n ; -- end of START GCODE --\n\n"
},
"machine_end_gcode": {
"default_value": " ; -- END GCODE --\n G1 X0 Y230 ; Get extruder out of way.\n M107 ; Turn off fan\n G91 ; Relative positioning\n G0 Z20 ; Lift extruder up\n T0\n G1 E-1 ; Reduce filament pressure\n M104 T0 S0 ; Turn ectruder heater off\n G90 ; Absolute positioning\n G92 E0 ; Reset extruder position\n M140 S0 ; Disable heated bed\n M84 ; Turn steppers off\n ; -- end of END GCODE --\n"
},
"machine_head_polygon": { "default_value": [[ 22, 67], [ 22, 51], [ 36, 51], [ 36, 67]] },
"skirt_gap": { "default_value": 5.0 },
"cool_min_layer_time": { "default_value": 10 },
"prime_tower_size": { "default_value": 7.745966692414834 },
"speed_wall_x": { "default_value": 40 },
"speed_travel": { "default_value": 100 },
"bottom_thickness": { "default_value": 0.75 },
"material_diameter": { "default_value": 1.75 },
"layer_height_0": { "default_value": 0.25 },
"support_angle": { "default_value": 45 },
"material_bed_temperature": { "default_value": 100 },
"top_thickness": { "default_value": 0.75 },
"material_print_temperature": { "default_value": 235 },
"retraction_speed": { "default_value": 60.0 },
"wall_thickness": { "default_value": 0.8 },
"retraction_min_travel": { "default_value": 2 },
"speed_wall_0": { "default_value": 30 },
"retraction_amount": { "default_value": 1 },
"speed_topbottom": { "default_value": 30 },
"layer_height": { "default_value": 0.25 },
"speed_print": { "default_value": 40 },
"speed_infill": { "default_value": 40 },
"machine_extruder_count": { "default_value": 1 },
"machine_heated_bed": { "default_value": true },
"machine_center_is_zero": { "default_value": false },
"machine_height": { "default_value": 210 },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_depth": { "default_value": 250 },
"machine_width": { "default_value": 250 },
"machine_name": { "default_value": "Rigid3D" }
}
}

View file

@ -0,0 +1,50 @@
{
"id": "rigid3d_3rdgen",
"name": "Rigid3D 3rdGen",
"version": 2,
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "Ultimaker",
"manufacturer": "Rigid3D",
"category": "Other",
"file_formats": "text/x-gcode",
"platform_offset": [ 0, 0, 0]
},
"overrides": {
"machine_start_gcode": {
"default_value": " ; -- START GCODE --\n G21\n G28 ; Home extruder\n G29 ; Autolevel bed\n M107 ; Turn off fan\n G90 ; Absolute positioning\n M82 ; Extruder in absolute mode\n G92 E0 ; Reset extruder position\n ; -- end of START GCODE --\n\n"
},
"machine_end_gcode": {
"default_value": " ; -- END GCODE --\n G1 X0 Y230 ; Get extruder out of way.\n M107 ; Turn off fan\n G91 ; Relative positioning\n G0 Z20 ; Lift extruder up\n T0\n G1 E-1 ; Reduce filament pressure\n M104 T0 S0 ; Turn extruder heater off\n G90 ; Absolute positioning\n G92 E0 ; Reset extruder position\n M140 S0 ; Disable heated bed\n M84 ; Turn steppers off\n ; -- end of END GCODE --\n"
},
"machine_head_polygon": { "default_value": [[ 18, 0], [ 18, 65], [ 32, 65], [ 32, 0]] },
"cool_min_layer_time": { "default_value": 10 },
"prime_tower_size": { "default_value": 7.745966692414834 },
"skirt_gap": { "default_value": 5.0 },
"speed_travel": { "default_value": 120 },
"bottom_thickness": { "default_value": 0.75 },
"material_diameter": { "default_value": 1.75 },
"layer_height_0": { "default_value": 0.25 },
"support_angle": { "default_value": 45 },
"material_bed_temperature": { "default_value": 100 },
"retraction_min_travel": { "default_value": 2 },
"speed_wall_0": { "default_value": 30 },
"retraction_speed": { "default_value": 60.0 },
"wall_thickness": { "default_value": 0.8 },
"material_print_temperature": { "default_value": 235 },
"retraction_amount": { "default_value": 1 },
"speed_topbottom": { "default_value": 25 },
"layer_height": { "default_value": 0.25 },
"top_thickness": { "default_value": 0.75 },
"machine_extruder_count": { "default_value": 1 },
"machine_heated_bed": { "default_value": true },
"machine_center_is_zero": { "default_value": false },
"machine_height": { "default_value": 240 },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_depth": { "default_value": 290 },
"machine_width": { "default_value": 275 },
"machine_name": { "default_value": "Rigid3D 3rd Geneartion" }
}
}

View file

@ -0,0 +1,47 @@
{
"id": "rigid3d_hobby",
"name": "Rigid3D Hobby",
"version": 2,
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "Ultimaker",
"manufacturer": "Rigid3D",
"category": "Other",
"file_formats": "text/x-gcode",
"platform_offset": [ 0, 0, 0]
},
"overrides": {
"machine_head_polygon": { "default_value": [[ 16, 30], [ 16, 45], [ 16, 45], [ 16, 30]] },
"prime_tower_size": { "default_value": 8.660254037844387 },
"speed_travel": { "default_value": 40 },
"skirt_gap": { "default_value": 5.0 },
"cool_min_layer_time": { "default_value": 15 },
"support_pattern": { "default_value": "grid" },
"material_diameter": { "default_value": 1.75 },
"layer_height_0": { "default_value": 0.25 },
"speed_wall_x": { "default_value": 30 },
"skirt_line_count": { "default_value": 2 },
"support_angle": { "default_value": 45 },
"speed_topbottom": { "default_value": 20 },
"material_print_temperature": { "default_value": 205 },
"retraction_speed": { "default_value": 80 },
"wall_thickness": { "default_value": 0.8 },
"retraction_min_travel": { "default_value": 2 },
"speed_wall_0": { "default_value": 20 },
"retraction_amount": { "default_value": 2 },
"speed_layer_0": { "default_value": 15 },
"layer_height": { "default_value": 0.2 },
"speed_print": { "default_value": 30 },
"speed_infill": { "default_value": 30 },
"machine_extruder_count": { "default_value": 1 },
"machine_heated_bed": { "default_value": false },
"machine_center_is_zero": { "default_value": false },
"machine_height": { "default_value": 150 },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_depth": { "default_value": 150 },
"machine_width": { "default_value": 150 },
"machine_name": { "default_value": "Rigid3D Hobby" }
}
}

View file

@ -0,0 +1,53 @@
{
"id": "rigid3d_zero",
"name": "Rigid3D Zero",
"version": 2,
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "Ultimaker",
"manufacturer": "Rigid3D",
"category": "Other",
"file_formats": "text/x-gcode",
"platform_offset": [ 0, 0, 0]
},
"overrides": {
"machine_start_gcode": {
"default_value": " ; -- START GCODE --\n G21\n G28 ; Home extruder\n G29 ; Autolevel bed\n M107 ; Turn off fan\n G90 ; Absolute positioning\n M82 ; Extruder in absolute mode\n G92 E0 ; Reset extruder position\n ; -- end of START GCODE --\n\n"
},
"machine_end_gcode": {
"default_value": " ; -- END GCODE --\n G1 X0 Y230 ; Get extruder out of way.\n M107 ; Turn off fan\n G91 ; Relative positioning\n G0 Z20 ; Lift extruder up\n T0\n G1 E-1 ; Reduce filament pressure\n M104 T0 S0 ; Turn ectruder heater off\n G90 ; Absolute positioning\n G92 E0 ; Reset extruder position\n M140 S0 ; Disable heated bed\n M84 ; Turn steppers off\n ; -- end of END GCODE --\n"
},
"machine_head_polygon": { "default_value": [[ 40, 15], [ 40, 60], [ 30, 60], [ 30, 15]] },
"support_pattern": { "default_value": "grid" },
"cool_min_layer_time": { "default_value": 10 },
"speed_travel": { "default_value": 80 },
"support_angle": { "default_value": 45 },
"retraction_min_travel": { "default_value": 2 },
"speed_wall_0": { "default_value": 20 },
"speed_layer_0": { "default_value": 15 },
"speed_infill": { "default_value": 30 },
"speed_topbottom": { "default_value": 30 },
"prime_tower_size": { "default_value": 7.745966692414834 },
"skirt_line_count": { "default_value": 2 },
"speed_wall_x": { "default_value": 30 },
"material_diameter": { "default_value": 1.75 },
"bottom_thickness": { "default_value": 0.75 },
"layer_height_0": { "default_value": 0.25 },
"top_thickness": { "default_value": 0.75 },
"wall_thickness": { "default_value": 0.8 },
"material_print_temperature": { "default_value": 195 },
"retraction_amount": { "default_value": 1.5 },
"skirt_gap": { "default_value": 5.0 },
"layer_height": { "default_value": 0.25 },
"speed_print": { "default_value": 30 },
"machine_extruder_count": { "default_value": 1 },
"machine_center_is_zero": { "default_value": false },
"machine_height": { "default_value": 190 },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_depth": { "default_value": 250 },
"machine_width": { "default_value": 250 },
"machine_name": { "default_value": "Rigid3D Zero" }
}
}

View file

@ -39,10 +39,10 @@
"default_value": "RepRap (Marlin/Sprinter)"
},
"machine_start_gcode": {
"default_value": ";Sliced at: {day} {date} {time}\n;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {infill_sparse_density}\n;Print time: {print_time}\n;Filament used: {filament_amount}m {filament_weight}g\n;Filament cost: {filament_cost}\n;M190 S{print_bed_temperature} ;Uncomment to add your own bed temperature line\n;M109 S{print_temperature} ;Uncomment to add your own temperature line\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nM205 X8 ;X/Y Jerk settings\nG1 Z15.0 F{travel_speed} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E7 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\n;Put printing message on LCD screen\nM117 Rigibot Printing..."
"default_value": ";Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {infill_sparse_density}\n;M190 S{material_bed_temperature} ;Uncomment to add your own bed temperature line\n;M109 S{material_print_temperature} ;Uncomment to add your own temperature line\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nM205 X8 ;X/Y Jerk settings\nG1 Z15.0 F{travel_speed} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E7 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{speed_travel}\n;Put printing message on LCD screen\nM117 Rigibot Printing..."
},
"machine_end_gcode": {
"default_value": ";End GCode\nM104 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\nG1 Z+10 E-1 X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y230 F3000 ;move Y so the head is out of the way and Plate is moved forward\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}"
"default_value": ";End GCode\nM104 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\nG1 Z+10 E-1 X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y230 F3000 ;move Y so the head is out of the way and Plate is moved forward\nM84 ;steppers off\nG90 ;absolute positioning"
},
"layer_height": {
"default_value": 0.2

View file

@ -42,10 +42,10 @@
"default_value": "RepRap (Marlin/Sprinter)"
},
"machine_start_gcode": {
"default_value": ";Sliced at: {day} {date} {time}\n;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {infill_sparse_density}\n;Print time: {print_time}\n;Filament used: {filament_amount}m {filament_weight}g\n;Filament cost: {filament_cost}\n;M190 S{print_bed_temperature} ;Uncomment to add your own bed temperature line\n;M109 S{print_temperature} ;Uncomment to add your own temperature line\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nM205 X8 ;X/Y Jerk settings\nG1 Z15.0 F{travel_speed} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E7 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\n;Put printing message on LCD screen\nM117 Rigibot Printing..."
"default_value": ";Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {infill_sparse_density}\n;Print time: {print_time}\n;M190 S{material_bed_temperature} ;Uncomment to add your own bed temperature line\n;M109 S{material_print_temperature} ;Uncomment to add your own temperature line\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nM205 X8 ;X/Y Jerk settings\nG1 Z15.0 F{speed_travel} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E7 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{speed_travel}\n;Put printing message on LCD screen\nM117 Rigibot Printing..."
},
"machine_end_gcode": {
"default_value": ";End GCode\nM104 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\nG1 Z+10 E-1 X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y230 F3000 ;move Y so the head is out of the way and Plate is moved forward\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}"
"default_value": ";End GCode\nM104 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\nG1 Z+10 E-1 X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y230 F3000 ;move Y so the head is out of the way and Plate is moved forward\nM84 ;steppers off\nG90 ;absolute positioning"
},
"layer_height": {
"default_value": 0.2

View file

@ -0,0 +1,61 @@
{
"id": "robo_3d_r1",
"name": "Robo 3D R1",
"version": 2,
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "Ultimaker",
"manufacturer": "Robo 3D",
"category": "Other",
"file_formats": "text/x-gcode",
"platform_offset": [ 0, 0, 0]
},
"overrides": {
"machine_start_gcode": {
"default_value": " G92 E0 ;\n M565 Z-1 ;\n G1 Z5 F5000 ;\n G29 ;\n"
},
"machine_end_gcode": {
"default_value": " M104 S0 ;extruder heater off\n M140 S0 ;heated bed heater off (if you have it)\n G91 ;relative positioning\n G1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\n G1 Z+0.5 E-5 X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\n G28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\n M84 ;steppers off\n G90 ;absolute positioning\n"
},
"cool_min_layer_time": { "default_value": 7 },
"speed_topbottom": { "default_value": 40 },
"retraction_speed": { "default_value": 50 },
"layer_0_z_overlap": { "default_value": 0.2 },
"cool_min_speed": { "default_value": 19 },
"material_bed_temperature": { "default_value": 60 },
"support_angle": { "default_value": 50 },
"speed_layer_0": { "default_value": 30 },
"line_width": { "default_value": 0.4 },
"speed_infill": { "default_value": 60 },
"prime_tower_size": { "default_value": 8.660254037844387 },
"support_enable": { "default_value": true },
"cool_fan_full_at_height": { "default_value": 0.1 },
"material_diameter": { "default_value": 1.75 },
"bottom_thickness": { "default_value": 1.2 },
"raft_airgap": { "default_value": 0.2 },
"layer_height_0": { "default_value": 0.15 },
"top_thickness": { "default_value": 1.2 },
"speed_wall_0": { "default_value": 40 },
"retraction_min_travel": { "default_value": 5 },
"material_flow": { "default_value": 100 },
"infill_sparse_density": { "default_value": 10 },
"wall_thickness": { "default_value": 1.2 },
"material_print_temperature": { "default_value": 190 },
"retraction_amount": { "default_value": 3 },
"layer_height": { "default_value": 0.2 },
"speed_print": { "default_value": 40 },
"machine_extruder_count": { "default_value": 1 },
"retraction_combing": { "default_value": "off" },
"machine_heated_bed": { "default_value": true },
"machine_center_is_zero": { "default_value": false },
"machine_height": { "default_value": 210 },
"adhesion_type": { "default_value": "raft" },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_depth": { "default_value": 245 },
"machine_width": { "default_value": 225 },
"support_z_distance": { "default_value": 0.22 },
"machine_name": { "default_value": "ROBO 3D R1" }
}
}

View file

@ -21,7 +21,7 @@
"machine_name": { "default_value": "Ultimaker 2" },
"machine_start_gcode" : {
"default_value": "",
"value": "\"\" if machine_gcode_flavor == \"UltiGCode\" else \"G21 ;metric values\\nG90 ;absolute positioning\\nM82 ;set extruder to absolute mode\\nM107 ;start with the fan off\\nG1 X10 Y0 F4000;move X/Y to min endstops\\nG28 Z0 ;move Z to bottom endstops\\nG1 Z15.0 F9000 ;move the platform to 15mm\\nG92 E0 ;zero the extruded length\\nG1 F200 E10 ;extrude 10 mm of feed stock\\nG92 E0 ;zero the extruded length again\\nG1 F9000\\n;Put printing message on LCD screen\\nM117 Printing...\""
"value": "\"\" if machine_gcode_flavor == \"UltiGCode\" else \"G21 ;metric values\\nG90 ;absolute positioning\\nM82 ;set extruder to absolute mode\\nM107 ;start with the fan off\\nG28 Z0 ;move Z to bottom endstops\\nG28 X0 Y0 ;move X/Y to endstops\\nG1 X15 Y0 F4000 ;move X/Y to front of printer\\nG1 Z15.0 F9000 ;move the platform to 15mm\\nG92 E0 ;zero the extruded length\\nG1 F200 E10 ;extrude 10 mm of feed stock\\nG92 E0 ;zero the extruded length again\\nG1 F9000\\n;Put printing message on LCD screen\\nM117 Printing...\""
},
"machine_end_gcode" : {
"default_value": "",
@ -86,12 +86,6 @@
"machine_nozzle_expansion_angle": {
"default_value": 45
},
"material_print_temperature": {
"enabled": "not (material_flow_dependent_temperature) and machine_gcode_flavor != \"UltiGCode\""
},
"material_bed_temperature": {
"enabled": "machine_heated_bed and machine_gcode_flavor != \"UltiGCode\""
},
"machine_max_feedrate_x": {
"default_value": 300
},
@ -106,24 +100,6 @@
},
"machine_acceleration": {
"default_value": 3000
},
"material_diameter": {
"enabled": "machine_gcode_flavor != \"UltiGCode\""
},
"material_flow": {
"enabled": "machine_gcode_flavor != \"UltiGCode\""
},
"retraction_amount": {
"enabled": "retraction_enable and machine_gcode_flavor != \"UltiGCode\""
},
"retraction_speed": {
"enabled": "retraction_enable and machine_gcode_flavor != \"UltiGCode\""
},
"retraction_retract_speed": {
"enabled": "retraction_enable and machine_gcode_flavor != \"UltiGCode\""
},
"retraction_prime_speed": {
"enabled": "retraction_enable and machine_gcode_flavor != \"UltiGCode\""
}
}
}

View file

@ -40,7 +40,7 @@
"value": "speed_wall_0"
},
"machine_height": {
"default_value": 203
"default_value": 205
},
"machine_show_variants": {
"default_value": true

View file

@ -0,0 +1,154 @@
{
"id": "ultimaker3",
"version": 2,
"name": "Ultimaker 3",
"inherits": "ultimaker",
"metadata": {
"author": "Ultimaker",
"manufacturer": "Ultimaker",
"category": "Ultimaker",
"visible": true,
"file_formats": "text/x-gcode",
"platform": "ultimaker3_platform.obj",
"platform_texture": "Ultimaker3backplate.png",
"platform_offset": [0, 0, 0],
"has_machine_quality": true,
"has_materials": true,
"has_machine_materials": true,
"has_variant_materials": true,
"has_variants": true,
"preferred_variant": "*aa*",
"preferred_quality": "*Normal*",
"variants_name": "Print core",
"machine_extruder_trains":
{
"0": "ultimaker3_extruder_left",
"1": "ultimaker3_extruder_right"
},
"first_start_actions": [ "DiscoverUM3Action" ],
"supported_actions": [ "DiscoverUM3Action" ],
"supports_usb_connection": false
},
"overrides": {
"machine_name": { "default_value": "Ultimaker 3" },
"machine_width": { "default_value": 233 },
"machine_depth": { "default_value": 215 },
"machine_height": { "default_value": 200 },
"machine_heated_bed": { "default_value": true },
"machine_nozzle_heat_up_speed": { "default_value": 1.4 },
"machine_nozzle_cool_down_speed": { "default_value": 0.8 },
"machine_head_with_fans_polygon":
{
"default_value":
[
[ -29, 6.1 ],
[ -29, -33.9 ],
[ 71, 6.1 ],
[ 71, -33.9 ]
]
},
"machine_gcode_flavor": { "default_value": "Griffin" },
"machine_max_feedrate_x": { "default_value": 300 },
"machine_max_feedrate_y": { "default_value": 300 },
"machine_max_feedrate_z": { "default_value": 40 },
"machine_acceleration": { "default_value": 3000 },
"gantry_height": { "default_value": 60 },
"machine_disallowed_areas": { "default_value": [
[[92.8, -53.4], [92.8, -97.5], [116.5, -97.5], [116.5, -53.4]],
[[73.8, 107.5], [73.8, 100.5], [116.5, 100.5], [116.5, 107.5]],
[[74.6, 107.5], [74.6, 100.5], [116.5, 100.5], [116.5, 107.5]],
[[74.9, -97.5], [74.9, -107.5], [116.5, -107.5], [116.5, -97.5]],
[[-116.5, -103.5], [-116.5, -107.5], [-100.9, -107.5], [-100.9, -103.5]],
[[-116.5, 105.8], [-96.9, 105.8], [-96.9, 107.5], [-116.5, 107.5]]
]},
"machine_extruder_count": { "default_value": 2 },
"extruder_prime_pos_abs": { "default_value": true },
"machine_start_gcode": { "default_value": "" },
"machine_end_gcode": { "default_value": "" },
"prime_tower_position_x": { "default_value": 175 },
"prime_tower_position_y": { "default_value": 179 },
"acceleration_enabled": { "value": "True" },
"acceleration_layer_0": { "value": "acceleration_topbottom" },
"acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 2000 / 4000)" },
"acceleration_print": { "value": "4000" },
"acceleration_support": { "value": "math.ceil(acceleration_print * 2000 / 4000)" },
"acceleration_support_interface": { "value": "acceleration_topbottom" },
"acceleration_topbottom": { "value": "math.ceil(acceleration_print * 500 / 4000)" },
"acceleration_wall": { "value": "math.ceil(acceleration_print * 1000 / 4000)" },
"acceleration_wall_0": { "value": "math.ceil(acceleration_wall * 500 / 1000)" },
"brim_width": { "value": "3" },
"cool_fan_full_at_height": { "value": "layer_height_0 + 4 * layer_height" },
"cool_fan_speed": { "value": "50" },
"cool_fan_speed_max": { "value": "100" },
"cool_min_speed": { "value": "5" },
"infill_line_width": { "value": "round(line_width * 0.5 / 0.35, 2)" },
"infill_overlap": { "value": "0" },
"infill_pattern": { "value": "'triangles'" },
"infill_wipe_dist": { "value": "0" },
"jerk_enabled": { "value": "True" },
"jerk_layer_0": { "value": "jerk_topbottom" },
"jerk_prime_tower": { "value": "math.ceil(jerk_print * 15 / 25)" },
"jerk_print": { "value": "25" },
"jerk_support": { "value": "math.ceil(jerk_print * 15 / 25)" },
"jerk_support_interface": { "value": "jerk_topbottom" },
"jerk_topbottom": { "value": "math.ceil(jerk_print * 5 / 25)" },
"jerk_wall": { "value": "math.ceil(jerk_print * 10 / 25)" },
"jerk_wall_0": { "value": "math.ceil(jerk_wall * 5 / 10)" },
"layer_height_0": { "value": "round(machine_nozzle_size / 1.5, 2)" },
"layer_start_x": { "value": "sum(extruderValues('machine_extruder_start_pos_x')) / len(extruderValues('machine_extruder_start_pos_x'))" },
"layer_start_y": { "value": "sum(extruderValues('machine_extruder_start_pos_y')) / len(extruderValues('machine_extruder_start_pos_y'))" },
"line_width": { "value": "machine_nozzle_size * 0.875" },
"machine_min_cool_heat_time_window": { "value": "15" },
"material_print_temperature": { "value": "200" },
"material_standby_temperature": { "value": "100" },
"multiple_mesh_overlap": { "value": "0" },
"prime_tower_enable": { "value": "True" },
"raft_airgap": { "value": "0" },
"raft_base_speed": { "value": "20" },
"raft_base_thickness": { "value": "0.3" },
"raft_interface_line_spacing": { "value": "0.5" },
"raft_interface_line_width": { "value": "0.5" },
"raft_interface_speed": { "value": "20" },
"raft_interface_thickness": { "value": "0.2" },
"raft_jerk": { "value": "jerk_layer_0" },
"raft_margin": { "value": "10" },
"raft_speed": { "value": "25" },
"raft_surface_layers": { "value": "1" },
"retraction_amount": { "value": "2" },
"retraction_count_max": { "value": "10" },
"retraction_extrusion_window": { "value": "1" },
"retraction_hop": { "value": "2" },
"retraction_hop_enabled": { "value": "True" },
"retraction_hop_only_when_collides": { "value": "True" },
"retraction_min_travel": { "value": "5" },
"retraction_prime_speed": { "value": "15" },
"skin_overlap": { "value": "10" },
"speed_layer_0": { "value": "20" },
"speed_prime_tower": { "value": "speed_topbottom" },
"speed_print": { "value": "35" },
"speed_support": { "value": "speed_wall_0" },
"speed_support_interface": { "value": "speed_topbottom" },
"speed_topbottom": { "value": "math.ceil(speed_print * 20 / 35)" },
"speed_travel": { "value": "250" },
"speed_wall": { "value": "math.ceil(speed_print * 30 / 35)" },
"speed_wall_0": { "value": "math.ceil(speed_wall * 20 / 30)" },
"speed_wall_x": { "value": "speed_wall" },
"support_angle": { "value": "45" },
"support_pattern": { "value": "'triangles'" },
"support_use_towers": { "value": "False" },
"support_xy_distance": { "value": "wall_line_width_0 * 2.5" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },
"support_z_distance": { "value": "0" },
"switch_extruder_prime_speed": { "value": "15" },
"switch_extruder_retraction_amount": { "value": "8" },
"top_bottom_thickness": { "value": "1" },
"travel_avoid_distance": { "value": "3" },
"wall_0_inset": { "value": "0" },
"wall_line_width_x": { "value": "round(line_width * 0.3 / 0.35, 2)" },
"wall_thickness": { "value": "1" }
}
}

View file

@ -0,0 +1,36 @@
{
"id": "ultimaker3_extended",
"version": 2,
"name": "Ultimaker 3 Extended",
"inherits": "ultimaker3",
"metadata": {
"author": "Ultimaker",
"manufacturer": "Ultimaker",
"category": "Ultimaker",
"quality_definition": "ultimaker3",
"visible": true,
"file_formats": "text/x-gcode",
"platform": "ultimaker3_platform.obj",
"platform_texture": "Ultimaker3Extendedbackplate.png",
"platform_offset": [0, 0, 0],
"has_machine_quality": true,
"has_machine_materials": true,
"has_variant_materials": true,
"has_materials": true,
"has_variants": true,
"preferred_variant": "*aa*",
"variants_name": "Print core",
"machine_extruder_trains":
{
"0": "ultimaker3_extended_extruder_left",
"1": "ultimaker3_extended_extruder_right"
},
"first_start_actions": [ "DiscoverUM3Action" ],
"supported_actions": [ "DiscoverUM3Action" ]
},
"overrides": {
"machine_name": { "default_value": "Ultimaker 3 Extended" },
"machine_height": { "default_value": 300 }
}
}

View file

@ -72,9 +72,6 @@
"machine_extruder_count": {
"default_value": 2
},
"print_sequence": {
"enabled": false
},
"prime_tower_position_x": {
"default_value": 185
},

View file

@ -0,0 +1,30 @@
{
"id": "zone3d_printer",
"name": "Zone3d Printer",
"version": 2,
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "Ultimaker",
"manufacturer": "Unknown",
"category": "Other",
"file_formats": "text/x-gcode",
"platform_offset": [ 0, 0, 0]
},
"overrides": {
"material_diameter": { "default_value": 1.75 },
"prime_tower_size": { "default_value": 10.350983390135314 },
"material_print_temperature": { "default_value": 260 },
"layer_height": { "default_value": 0.14 },
"speed_travel": { "default_value": 150 },
"machine_extruder_count": { "default_value": 1 },
"machine_heated_bed": { "default_value": true },
"machine_center_is_zero": { "default_value": false },
"machine_height": { "default_value": 210 },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_depth": { "default_value": 220 },
"machine_width": { "default_value": 240 },
"machine_name": { "default_value": "Zone3D Printer" }
}
}

View file

@ -0,0 +1,19 @@
{
"id": "ord_extruder_0",
"version": 2,
"name": "0",
"inherits": "fdmextruder",
"metadata": {
"machine": "ord",
"position": "0"
},
"overrides": {
"extruder_nr": {
"default_value": 0,
"maximum_value": "4"
},
"machine_nozzle_offset_x": { "default_value": 0.0 },
"machine_nozzle_offset_y": { "default_value": 0.0 }
}
}

View file

@ -0,0 +1,19 @@
{
"id": "ord_extruder_1",
"version": 2,
"name": "1",
"inherits": "fdmextruder",
"metadata": {
"machine": "ord",
"position": "1"
},
"overrides": {
"extruder_nr": {
"default_value": 1,
"maximum_value": "4"
},
"machine_nozzle_offset_x": { "default_value": 62.95 },
"machine_nozzle_offset_y": { "default_value": 2.05 }
}
}

View file

@ -0,0 +1,19 @@
{
"id": "ord_extruder_2",
"version": 2,
"name": "2",
"inherits": "fdmextruder",
"metadata": {
"machine": "ord",
"position": "2"
},
"overrides": {
"extruder_nr": {
"default_value": 2,
"maximum_value": "4"
},
"machine_nozzle_offset_x": { "default_value": 0.0 },
"machine_nozzle_offset_y": { "default_value": 27.7 }
}
}

View file

@ -0,0 +1,19 @@
{
"id": "ord_extruder_3",
"version": 2,
"name": "3",
"inherits": "fdmextruder",
"metadata": {
"machine": "ord",
"position": "3"
},
"overrides": {
"extruder_nr": {
"default_value": 3,
"maximum_value": "4"
},
"machine_nozzle_offset_x": { "default_value": 63.18 },
"machine_nozzle_offset_y": { "default_value": 28.65 }
}
}

View file

@ -0,0 +1,19 @@
{
"id": "ord_extruder_4",
"version": 2,
"name": "4",
"inherits": "fdmextruder",
"metadata": {
"machine": "ord",
"position": "4"
},
"overrides": {
"extruder_nr": {
"default_value": 4,
"maximum_value": "4"
},
"machine_nozzle_offset_x": { "default_value": 31.6 },
"machine_nozzle_offset_y": { "default_value": 28.2 }
}
}

View file

@ -0,0 +1,19 @@
{
"id": "punchtec_connect_xl_extruder_0",
"version": 2,
"name": "0",
"inherits": "fdmextruder",
"metadata": {
"machine": "punchtec_connect_xl",
"position": "0"
},
"overrides": {
"extruder_nr": {
"default_value": 0,
"maximum_value": "1"
},
"machine_nozzle_offset_x": { "default_value": 0.0 },
"machine_nozzle_offset_y": { "default_value": 0.0 }
}
}

View file

@ -0,0 +1,19 @@
{
"id": "punchtec_connect_xl_extruder_1",
"version": 2,
"name": "1",
"inherits": "fdmextruder",
"metadata": {
"machine": "punchtec_connect_xl",
"position": "1"
},
"overrides": {
"extruder_nr": {
"default_value": 1,
"maximum_value": "1"
},
"machine_nozzle_offset_x": { "default_value": 0.0 },
"machine_nozzle_offset_y": { "default_value": 0.0 }
}
}

View file

@ -0,0 +1,30 @@
{
"id": "ultimaker3_extended_extruder_left",
"version": 2,
"name": "Print core 1",
"inherits": "fdmextruder",
"metadata": {
"machine": "ultimaker3_extended",
"position": "0"
},
"overrides": {
"extruder_nr": {
"default_value": 0,
"maximum_value": "1"
},
"machine_nozzle_offset_x": { "default_value": 0 },
"machine_nozzle_offset_y": { "default_value": 0 },
"machine_extruder_start_pos_abs": { "default_value": true },
"machine_extruder_start_pos_x": { "default_value": 213 },
"machine_extruder_start_pos_y": { "default_value": 207 },
"machine_extruder_end_pos_abs": { "default_value": true },
"machine_extruder_end_pos_x": { "default_value": 213 },
"machine_extruder_end_pos_y": { "default_value": 207 },
"machine_nozzle_head_distance": { "default_value": 2.7 },
"extruder_prime_pos_x": { "default_value": 170 },
"extruder_prime_pos_y": { "default_value": 6 },
"extruder_prime_pos_z": { "default_value": 2 }
}
}

View file

@ -0,0 +1,30 @@
{
"id": "ultimaker3_extended_extruder_right",
"version": 2,
"name": "Print core 2",
"inherits": "fdmextruder",
"metadata": {
"machine": "ultimaker3_extended",
"position": "1"
},
"overrides": {
"extruder_nr": {
"default_value": 1,
"maximum_value": "1"
},
"machine_nozzle_offset_x": { "default_value": 18 },
"machine_nozzle_offset_y": { "default_value": 0 },
"machine_extruder_start_pos_abs": { "default_value": true },
"machine_extruder_start_pos_x": { "default_value": 213 },
"machine_extruder_start_pos_y": { "default_value": 189 },
"machine_extruder_end_pos_abs": { "default_value": true },
"machine_extruder_end_pos_x": { "default_value": 213 },
"machine_extruder_end_pos_y": { "default_value": 189 },
"machine_nozzle_head_distance": { "default_value": 4.2 },
"extruder_prime_pos_x": { "default_value": 182 },
"extruder_prime_pos_y": { "default_value": 6 },
"extruder_prime_pos_z": { "default_value": 2 }
}
}

View file

@ -0,0 +1,30 @@
{
"id": "ultimaker3_extruder_left",
"version": 2,
"name": "Print core 1",
"inherits": "fdmextruder",
"metadata": {
"machine": "ultimaker3",
"position": "0"
},
"overrides": {
"extruder_nr": {
"default_value": 0,
"maximum_value": "1"
},
"machine_nozzle_offset_x": { "default_value": 0 },
"machine_nozzle_offset_y": { "default_value": 0 },
"machine_extruder_start_pos_abs": { "default_value": true },
"machine_extruder_start_pos_x": { "default_value": 213 },
"machine_extruder_start_pos_y": { "default_value": 207 },
"machine_extruder_end_pos_abs": { "default_value": true },
"machine_extruder_end_pos_x": { "default_value": 213 },
"machine_extruder_end_pos_y": { "default_value": 207 },
"machine_nozzle_head_distance": { "default_value": 2.7 },
"extruder_prime_pos_x": { "default_value": 170 },
"extruder_prime_pos_y": { "default_value": 6 },
"extruder_prime_pos_z": { "default_value": 2 }
}
}

View file

@ -0,0 +1,30 @@
{
"id": "ultimaker3_extruder_right",
"version": 2,
"name": "Print core 2",
"inherits": "fdmextruder",
"metadata": {
"machine": "ultimaker3",
"position": "1"
},
"overrides": {
"extruder_nr": {
"default_value": 1,
"maximum_value": "1"
},
"machine_nozzle_offset_x": { "default_value": 18 },
"machine_nozzle_offset_y": { "default_value": 0 },
"machine_extruder_start_pos_abs": { "default_value": true },
"machine_extruder_start_pos_x": { "default_value": 213 },
"machine_extruder_start_pos_y": { "default_value": 189 },
"machine_extruder_end_pos_abs": { "default_value": true },
"machine_extruder_end_pos_x": { "default_value": 213 },
"machine_extruder_end_pos_y": { "default_value": 189 },
"machine_nozzle_head_distance": { "default_value": 4.2 },
"extruder_prime_pos_x": { "default_value": 182 },
"extruder_prime_pos_y": { "default_value": 6 },
"extruder_prime_pos_z": { "default_value": 2 }
}
}

File diff suppressed because it is too large Load diff

View file

@ -1831,13 +1831,13 @@ msgstr "Druckerbildschirm"
#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:382
msgctxt "@title:tab"
msgid "Simple"
msgstr "Einfach"
msgid "Recommended"
msgstr "Empfohlen"
#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:383
msgctxt "@title:tab"
msgid "Advanced"
msgstr "Erweitert"
msgid "Custom"
msgstr "Benutzerdefiniert"
#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:18
#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:18
@ -2295,25 +2295,6 @@ msgid ""
"Click to open the profile manager."
msgstr "Einige Einstellungswerte unterscheiden sich von den im Profil gespeicherten Werten.\n\nKlicken Sie, um den Profilmanager zu öffnen."
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:24
msgid "Modify G-Code"
msgstr "G-Code ändern"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/__init__.py:12
msgctxt "@label"
msgid "Post Processing"
msgstr "Nachbearbeitung"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/__init__.py:16
msgctxt "Description of plugin"
msgid "Extension that allows for user created scripts for post processing"
msgstr "Erweiterung, die eine Nachbearbeitung von Skripten ermöglicht, die von Benutzern erstellt wurden."
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18
msgctxt "@title:window"
msgid "Post Processing Plugin"
msgstr "Plugin Nachbearbeitung"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:49
msgctxt "@label"
msgid "Post Processing Scripts"
@ -2333,3 +2314,318 @@ msgstr "Einstellungen"
msgctxt "@info:tooltip"
msgid "Change active post-processing scripts"
msgstr "Aktive Skripts Nachbearbeitung ändern"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/__init__.py:13
msgctxt "@info:whatsthis"
msgid "Manages network connections to Ultimaker 3 printers"
msgstr "Verwaltet Netzwerkverbindungen zu Ultimaker 3 Druckern"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:100
msgctxt "@action:button"
msgid "Print over network"
msgstr "Drücken über Netzwerk"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:101
msgctxt "@properties:tooltip"
msgid "Print over network"
msgstr "Drücken über Netzwerk"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:143
msgctxt "@info:status"
msgid ""
"Access to the printer requested. Please approve the request on the printer"
msgstr "Zugriff auf Drucker erforderlich. Bestätigen Sie den Zugriff auf den Drucker"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:144
msgctxt "@info:status"
msgid ""
msgstr ""
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:145
msgctxt "@action:button"
msgid "Retry"
msgstr "Erneut versuchen"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:145
msgctxt "@info:tooltip"
msgid "Re-send the access request"
msgstr "Zugriffanforderung erneut senden"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:147
msgctxt "@info:status"
msgid "Access to the printer accepted"
msgstr "Zugriff auf den Drucker genehmigt"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:148
msgctxt "@info:status"
msgid "No access to print with this printer. Unable to send print job."
msgstr "Kein Zugriff auf das Drucken mit diesem Drucker. Druckauftrag kann nicht gesendet werden."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:149
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:28
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:72
msgctxt "@action:button"
msgid "Request Access"
msgstr "Zugriff anfordern"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:149
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:27
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:71
msgctxt "@info:tooltip"
msgid "Send access request to the printer"
msgstr "Zugriffsanforderung für den Drucker senden"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:232
#, python-brace-format
msgctxt "@info:status"
msgid ""
"Connected over the network to {0}. Please approve the access request on the "
"printer."
msgstr "Über Netzwerk verbunden mit {0}. Geben Sie die Zugriffsanforderung für den Drucker frei."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:239
#, python-brace-format
msgctxt "@info:status"
msgid "Connected over the network to {0}."
msgstr "Über Netzwerk verbunden mit {0}."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:252
#, python-brace-format
msgctxt "@info:status"
msgid "Connected over the network to {0}. No access to control the printer."
msgstr "Über Netzwerk verbunden mit {0}. Kein Zugriff auf die Druckerverwaltung."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:257
msgctxt "@info:status"
msgid "Access request was denied on the printer."
msgstr "Zugriffsanforderung auf den Drucker wurde abgelehnt."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:260
msgctxt "@info:status"
msgid "Access request failed due to a timeout."
msgstr "Zugriffsanforderungen aufgrund von Zeitüberschreitung fehlgeschlagen."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:323
msgctxt "@info:status"
msgid "The connection with the network was lost."
msgstr "Die Verbindung zum Netzwerk ist verlorengegangen."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:354
msgctxt "@info:status"
msgid ""
"The connection with the printer was lost. Check your printer to see if it is "
"connected."
msgstr "Die Verbindung zum Drucker ist verlorengegangen. Überprüfen Sie Ihren Drucker, um festzustellen, ob er verbunden ist."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:466
msgctxt "@info:status"
msgid ""
"Unable to start a new print job because the printer is busy. Please check "
"the printer."
msgstr "Es kann kein neuer Druckauftrag gestartet werden, da der Drucker beschäftigt ist. Überprüfen Sie den Drucker."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:471
#, python-format
msgctxt "@info:status"
msgid ""
"Unable to start a new print job, printer is busy. Current printer status is "
"%s."
msgstr "Es kann kein neuer Druckauftrag gestartet werden, da der Drucker beschäftigt ist. Der aktuelle Druckerstatus lautet %s."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:491
#, python-brace-format
msgctxt "@info:status"
msgid "Unable to start a new print job. No PrinterCore loaded in slot {0}"
msgstr "Es kann kein neuer Druckauftrag gestartet werden. Kein PrinterCore in Steckplatz {0} geladen."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:498
#, python-brace-format
msgctxt "@info:status"
msgid "Unable to start a new print job. No material loaded in slot {0}"
msgstr "Es kann kein neuer Druckauftrag gestartet werden. Kein Material in Steckplatz {0} geladen."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:509
#, python-brace-format
msgctxt "@label"
msgid "Not enough material for spool {0}."
msgstr "Material für Spule {0} unzureichend."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:519
#, python-brace-format
msgctxt "@label"
msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}"
msgstr "Abweichender PrintCore (Cura: {0}, Drucker: {1}) für Extruder {2} gewählt"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:533
#, python-brace-format
msgctxt "@label"
msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}"
msgstr "Abweichendes Material (Cura: {0}, Drucker: {1}) für Extruder {2} gewählt"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:536
msgctxt "@label"
msgid "Are you sure you wish to print with the selected configuration?"
msgstr "Möchten Sie wirklich mit der gewählten Konfiguration drucken?"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:537
msgctxt "@label"
msgid ""
"There is a mismatch between the configuration of the printer and Cura. For "
"the best result, always slice for the PrintCores and materials that are "
"inserted in your printer."
msgstr "Anforderungen zwischen der Druckerkonfiguration und Cura stimmen nicht überein. Für optimale Ergebnisse schneiden Sie stets für die PrintCores und Materialien, die in Ihren Drucker eingelegt wurden."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:543
msgctxt "@window:title"
msgid "Mismatched configuration"
msgstr "Konfiguration nicht übereinstimmend"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:633
msgctxt "@info:status"
msgid "Sending data to printer"
msgstr "Daten werden zum Drucker gesendet"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:680
msgctxt "@info:status"
msgid "Unable to send data to printer. Is another job still active?"
msgstr "Daten können nicht zum Drucker gesendet werden. Ist noch ein weiterer Auftrag in Bearbeitung?"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:804
msgctxt "@label:MonitorStatus"
msgid "Print aborted. Please check the printer"
msgstr "Drucken wurde abgebrochen. Den Drucker überprüfen"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:810
msgctxt "@label:MonitorStatus"
msgid "Pausing print..."
msgstr "Drucken wird pausiert..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:812
msgctxt "@label:MonitorStatus"
msgid "Resuming print..."
msgstr "Drucken wird fortgesetzt..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:920
msgctxt "@window:title"
msgid "Changes on the Printer"
msgstr "Änderungen auf dem Drucker"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:922
msgctxt "@label"
msgid ""
"Do you want to change the PrintCores and materials in Cura to match your "
"printer?"
msgstr "Möchten Sie die PrintCores und Materialien in Cura passend für Ihren Drucker ändern?"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:924
msgctxt "@label"
msgid ""
"The PrintCores and/or materials on your printer were changed. For the best "
"result, always slice for the PrintCores and materials that are inserted in "
"your printer."
msgstr "Die PrintCores und/oder Materialien auf Ihrem Drucker wurden geändert. Für optimale Ergebnisse schneiden Sie stets für die PrintCores und Materialien, die in Ihren Drucker eingelegt wurden."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19
msgctxt "@action"
msgid "Connect via Network"
msgstr "Anschluss über Netzwerk"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:57
msgctxt "@title:window"
msgid "Connect to Networked Printer"
msgstr "Anschluss an vernetzten Drucker"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:67
msgctxt "@label"
msgid ""
"To print directly to your printer over the network, please make sure your "
"printer is connected to the network using a network cable or by connecting "
"your printer to your WIFI network. If you don't connect Cura with your "
"printer, you can still use a USB drive to transfer g-code files to your "
"printer.\n"
"\n"
"Select your printer from the list below:"
msgstr "Um über das Netzwerk direkt auf Ihrem Drucker zu drucken, stellen Sie bitte sicher, dass der Drucker mit dem Netzwerkkabel verbunden ist oder verbinden Sie Ihren Drucker mit Ihrem WLAN-Netzwerk. Wenn Sie Cura nicht mit Ihrem Drucker verbinden, können Sie dennoch ein USB-Laufwerk für die Übertragung von G-Code-Dateien auf Ihren Drucker verwenden.\n\nWählen Sie Ihren Drucker aus der folgenden Liste:"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:106
msgctxt "@action:button"
msgid "Refresh"
msgstr "Aktualisieren"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:198
msgctxt "@label"
msgid ""
"If your printer is not listed, read the <a href='%1'>network-printing "
"troubleshooting guide</a>"
msgstr "Wenn Ihr Drucker nicht aufgeführt ist, lesen Sie die <a href=%1>Anleitung für Fehlerbehebung für Netzwerkdruck</a>"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:225
msgctxt "@label"
msgid "Type"
msgstr "Typ"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:231
msgctxt "@label"
msgid "Ultimaker 3"
msgstr "Ultimaker 3"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:231
msgctxt "@label"
msgid "Ultimaker 3 Extended"
msgstr "Ultimaker 3 Extended"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:237
msgctxt "@label"
msgid "Firmware version"
msgstr "Firmware-Version"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:249
msgctxt "@label"
msgid "Address"
msgstr "Adresse"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:263
msgctxt "@label"
msgid "The printer at this address has not yet responded."
msgstr "Der Drucker unter dieser Adresse hat nicht reagiert."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:268
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38
msgctxt "@action:button"
msgid "Connect"
msgstr "Verbinden"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:280
msgctxt "@label:"
msgid "Print Again"
msgstr "Erneut drucken"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:289
msgctxt "@title:window"
msgid "Printer Address"
msgstr "Druckeradresse"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:319
msgctxt "@alabel"
msgid "Enter the IP address or hostname of your printer on the network."
msgstr "Geben Sie die IP-Adresse oder den Hostnamen Ihres Druckers auf dem Netzwerk ein."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:346
msgctxt "@action:button"
msgid "Ok"
msgstr "Ok"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37
msgctxt "@info:tooltip"
msgid "Connect to a printer"
msgstr "Mit einem Drucker verbinden"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116
msgctxt "@info:tooltip"
msgid "Load the configuration of the printer into Cura"
msgstr "Die Druckerkonfiguration in Cura laden"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117
msgctxt "@action:button"
msgid "Activate Configuration"
msgstr "Konfiguration aktivieren"

View file

@ -535,7 +535,7 @@ msgid ""
"The selected material is imcompatible with the selected machine or "
"configuration."
msgstr ""
"The selected material is imcompatible with the selected machine or "
"The selected material is incompatible with the selected machine or "
"configuration."
#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:666
@ -1911,13 +1911,13 @@ msgstr "Printer Monitor"
#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:382
msgctxt "@title:tab"
msgid "Simple"
msgstr "Simple"
msgid "Recommended"
msgstr "Recommended"
#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:383
msgctxt "@title:tab"
msgid "Advanced"
msgstr "Advanced"
msgid "Custom"
msgstr "Custom"
#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:18
#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:18
@ -2387,3 +2387,37 @@ msgstr ""
"Some setting values are different from the values stored in the profile.\n"
"\n"
"Click to open the profile manager."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:519
#, python-brace-format
msgctxt "@label"
msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}"
msgstr "Different print core (Cura: {0}, Printer: {1}) selected for extruder {2}"
#, python-brace-format
msgctxt "@info:status"
msgid "Unable to start a new print job. No PrinterCore loaded in slot {0}"
msgstr "Unable to start a new print job. No print core loaded in slot {0}"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:537
msgctxt "@label"
msgid ""
"There is a mismatch between the configuration of the printer and Cura. For "
"the best result, always slice for the PrintCores and materials that are "
"inserted in your printer."
msgstr "There is a mismatch between the configuration of the printer and Cura. For the best result, always slice for the print cores and materials that are inserted in your printer."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:922
msgctxt "@label"
msgid ""
"Do you want to change the PrintCores and materials in Cura to match your "
"printer?"
msgstr "Would you like to update your current printer configuration into Cura?"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:924
msgctxt "@label"
msgid ""
"The PrintCores and/or materials on your printer were changed. For the best "
"result, always slice for the PrintCores and materials that are inserted in "
"your printer."
msgstr "The print cores and/or materials on your printer were changed. For the best result, always slice for the print cores and materials that are inserted in your printer."

View file

@ -1831,13 +1831,13 @@ msgstr "Monitor de la impresora"
#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:382
msgctxt "@title:tab"
msgid "Simple"
msgstr "Básica"
msgid "Recommended"
msgstr "Recomendado"
#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:383
msgctxt "@title:tab"
msgid "Advanced"
msgstr "Avanzada"
msgid "Custom"
msgstr "Personalizado"
#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:18
#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:18
@ -2295,25 +2295,6 @@ msgid ""
"Click to open the profile manager."
msgstr "Algunos valores son distintos de los valores almacenados en el perfil.\n\nHaga clic para abrir el administrador de perfiles."
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:24
msgid "Modify G-Code"
msgstr "Modificar GCode"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/__init__.py:12
msgctxt "@label"
msgid "Post Processing"
msgstr "Posprocesamiento"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/__init__.py:16
msgctxt "Description of plugin"
msgid "Extension that allows for user created scripts for post processing"
msgstr "Extensión que permite el posprocesamiento de las secuencias de comandos creadas por los usuarios."
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18
msgctxt "@title:window"
msgid "Post Processing Plugin"
msgstr "Complemento de posprocesamiento"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:49
msgctxt "@label"
msgid "Post Processing Scripts"
@ -2333,3 +2314,318 @@ msgstr "Ajustes"
msgctxt "@info:tooltip"
msgid "Change active post-processing scripts"
msgstr "Cambia las secuencias de comandos de posprocesamiento."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/__init__.py:13
msgctxt "@info:whatsthis"
msgid "Manages network connections to Ultimaker 3 printers"
msgstr "Gestiona las conexiones de red a las impresoras Ultimaker 3."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:100
msgctxt "@action:button"
msgid "Print over network"
msgstr "Imprimir a través de la red"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:101
msgctxt "@properties:tooltip"
msgid "Print over network"
msgstr "Imprime a través de la red."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:143
msgctxt "@info:status"
msgid ""
"Access to the printer requested. Please approve the request on the printer"
msgstr "Acceso a la impresora solicitado. Apruebe la solicitud en la impresora."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:144
msgctxt "@info:status"
msgid ""
msgstr ""
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:145
msgctxt "@action:button"
msgid "Retry"
msgstr "Volver a intentar"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:145
msgctxt "@info:tooltip"
msgid "Re-send the access request"
msgstr "Reenvía la solicitud de acceso."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:147
msgctxt "@info:status"
msgid "Access to the printer accepted"
msgstr "Acceso a la impresora aceptado"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:148
msgctxt "@info:status"
msgid "No access to print with this printer. Unable to send print job."
msgstr "No hay acceso para imprimir con esta impresora. No se puede enviar el trabajo de impresión."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:149
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:28
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:72
msgctxt "@action:button"
msgid "Request Access"
msgstr "Solicitar acceso"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:149
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:27
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:71
msgctxt "@info:tooltip"
msgid "Send access request to the printer"
msgstr "Envía la solicitud de acceso a la impresora."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:232
#, python-brace-format
msgctxt "@info:status"
msgid ""
"Connected over the network to {0}. Please approve the access request on the "
"printer."
msgstr "Conectado a través de la red a {0}. Apruebe la solicitud de acceso en la impresora."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:239
#, python-brace-format
msgctxt "@info:status"
msgid "Connected over the network to {0}."
msgstr "Conectado a través de la red a {0}."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:252
#, python-brace-format
msgctxt "@info:status"
msgid "Connected over the network to {0}. No access to control the printer."
msgstr "Conectado a través de la red a {0}. No hay acceso para controlar la impresora."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:257
msgctxt "@info:status"
msgid "Access request was denied on the printer."
msgstr "Solicitud de acceso denegada en la impresora."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:260
msgctxt "@info:status"
msgid "Access request failed due to a timeout."
msgstr "Se ha producido un error al solicitar acceso porque se ha agotado el tiempo de espera."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:323
msgctxt "@info:status"
msgid "The connection with the network was lost."
msgstr "Se ha perdido la conexión de red."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:354
msgctxt "@info:status"
msgid ""
"The connection with the printer was lost. Check your printer to see if it is "
"connected."
msgstr "Se ha perdido la conexión con la impresora. Compruebe que la impresora está conectada."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:466
msgctxt "@info:status"
msgid ""
"Unable to start a new print job because the printer is busy. Please check "
"the printer."
msgstr "No se puede iniciar un trabajo nuevo de impresión porque la impresora está ocupada. Compruebe la impresora."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:471
#, python-format
msgctxt "@info:status"
msgid ""
"Unable to start a new print job, printer is busy. Current printer status is "
"%s."
msgstr "No se puede iniciar un trabajo nuevo de impresión, la impresora está ocupada. El estado actual de la impresora es %s."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:491
#, python-brace-format
msgctxt "@info:status"
msgid "Unable to start a new print job. No PrinterCore loaded in slot {0}"
msgstr "No se puede iniciar un trabajo nuevo de impresión. No se ha cargado ningún PrintCore en la ranura {0}."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:498
#, python-brace-format
msgctxt "@info:status"
msgid "Unable to start a new print job. No material loaded in slot {0}"
msgstr "No se puede iniciar un trabajo nuevo de impresión. No se ha cargado material en la ranura {0}."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:509
#, python-brace-format
msgctxt "@label"
msgid "Not enough material for spool {0}."
msgstr "No hay suficiente material para la bobina {0}."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:519
#, python-brace-format
msgctxt "@label"
msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}"
msgstr "PrintCore distinto (Cura: {0}, impresora: {1}) seleccionado para extrusor {2}"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:533
#, python-brace-format
msgctxt "@label"
msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}"
msgstr "Material distinto (Cura: {0}, impresora: {1}) seleccionado para extrusor {2}"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:536
msgctxt "@label"
msgid "Are you sure you wish to print with the selected configuration?"
msgstr "¿Seguro que desea imprimir con la configuración seleccionada?"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:537
msgctxt "@label"
msgid ""
"There is a mismatch between the configuration of the printer and Cura. For "
"the best result, always slice for the PrintCores and materials that are "
"inserted in your printer."
msgstr "La configuración de la impresora y de Cura no coinciden. Para obtener el mejor resultado, segmente siempre los PrintCores y materiales que se insertan en la impresora."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:543
msgctxt "@window:title"
msgid "Mismatched configuration"
msgstr "Configuración desajustada"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:633
msgctxt "@info:status"
msgid "Sending data to printer"
msgstr "Enviando datos a la impresora"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:680
msgctxt "@info:status"
msgid "Unable to send data to printer. Is another job still active?"
msgstr "No se puede enviar datos a la impresora. ¿Hay otro trabajo que todavía esté activo?"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:804
msgctxt "@label:MonitorStatus"
msgid "Print aborted. Please check the printer"
msgstr "Impresión cancelada. Compruebe la impresora."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:810
msgctxt "@label:MonitorStatus"
msgid "Pausing print..."
msgstr "Pausando impresión..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:812
msgctxt "@label:MonitorStatus"
msgid "Resuming print..."
msgstr "Reanudando impresión..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:920
msgctxt "@window:title"
msgid "Changes on the Printer"
msgstr "Cambios en la impresora"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:922
msgctxt "@label"
msgid ""
"Do you want to change the PrintCores and materials in Cura to match your "
"printer?"
msgstr "¿Desea cambiar los PrintCores y materiales de Cura para que coincidan con la impresora?"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:924
msgctxt "@label"
msgid ""
"The PrintCores and/or materials on your printer were changed. For the best "
"result, always slice for the PrintCores and materials that are inserted in "
"your printer."
msgstr "Se han modificado los PrintCores y/o materiales de la impresora. Para obtener el mejor resultado, segmente siempre los PrintCores y materiales que se han insertado en la impresora."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19
msgctxt "@action"
msgid "Connect via Network"
msgstr "Conectar a través de la red"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:57
msgctxt "@title:window"
msgid "Connect to Networked Printer"
msgstr "Conectar con la impresora en red"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:67
msgctxt "@label"
msgid ""
"To print directly to your printer over the network, please make sure your "
"printer is connected to the network using a network cable or by connecting "
"your printer to your WIFI network. If you don't connect Cura with your "
"printer, you can still use a USB drive to transfer g-code files to your "
"printer.\n"
"\n"
"Select your printer from the list below:"
msgstr "Para imprimir directamente en la impresora a través de la red, asegúrese de que esta está conectada a la red utilizando un cable de red o conéctela a la red wifi. Si no conecta Cura con la impresora, también puede utilizar una unidad USB para transferir archivos GCode a la impresora.\n\nSeleccione la impresora de la siguiente lista:"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:106
msgctxt "@action:button"
msgid "Refresh"
msgstr "Actualizar"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:198
msgctxt "@label"
msgid ""
"If your printer is not listed, read the <a href='%1'>network-printing "
"troubleshooting guide</a>"
msgstr "Si la impresora no aparece en la lista, lea la <a href='%1'>guía de solución de problemas de impresión y red</a>"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:225
msgctxt "@label"
msgid "Type"
msgstr "Tipo"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:231
msgctxt "@label"
msgid "Ultimaker 3"
msgstr "Ultimaker 3"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:231
msgctxt "@label"
msgid "Ultimaker 3 Extended"
msgstr "Ultimaker 3 Extended"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:237
msgctxt "@label"
msgid "Firmware version"
msgstr "Versión de firmware"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:249
msgctxt "@label"
msgid "Address"
msgstr "Dirección"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:263
msgctxt "@label"
msgid "The printer at this address has not yet responded."
msgstr "La impresora todavía no ha respondido en esta dirección."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:268
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38
msgctxt "@action:button"
msgid "Connect"
msgstr "Conectar"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:280
msgctxt "@label:"
msgid "Print Again"
msgstr "Volver a imprimir"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:289
msgctxt "@title:window"
msgid "Printer Address"
msgstr "Dirección de la impresora"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:319
msgctxt "@alabel"
msgid "Enter the IP address or hostname of your printer on the network."
msgstr "Introduzca la dirección IP o el nombre de host de la impresora en red."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:346
msgctxt "@action:button"
msgid "Ok"
msgstr "Aceptar"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37
msgctxt "@info:tooltip"
msgid "Connect to a printer"
msgstr "Conecta a una impresora."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116
msgctxt "@info:tooltip"
msgid "Load the configuration of the printer into Cura"
msgstr "Carga la configuración de la impresora en Cura."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117
msgctxt "@action:button"
msgid "Activate Configuration"
msgstr "Activar configuración"

View file

@ -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-09-20 14:48+0000\n"
"POT-Creation-Date: 2016-10-27 11:28+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE\n"

View file

@ -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-09-20 14:48+0000\n"
"POT-Creation-Date: 2016-10-27 11:28+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE\n"
@ -815,6 +815,20 @@ msgid ""
"outside of the model."
msgstr ""
#: fdmprinter.def.json
msgctxt "outer_inset_first label"
msgid "Outer Before Inner Walls"
msgstr ""
#: fdmprinter.def.json
msgctxt "outer_inset_first description"
msgid ""
"Prints walls in order of outside to inside when enabled. This can help "
"improve dimensional accuracy in X and Y when using a high viscosity plastic "
"like ABS; however it can decrease outer surface print quality, especially on "
"overhangs."
msgstr ""
#: fdmprinter.def.json
msgctxt "alternate_extra_perimeter label"
msgid "Alternate Extra Wall"
@ -1310,42 +1324,6 @@ msgid ""
"material is limited."
msgstr ""
#: fdmprinter.def.json
msgctxt "retraction_hop_enabled label"
msgid "Z Hop when Retracted"
msgstr ""
#: fdmprinter.def.json
msgctxt "retraction_hop_enabled description"
msgid ""
"Whenever a retraction is done, the build plate is lowered to create "
"clearance between the nozzle and the print. It prevents the nozzle from "
"hitting the print during travel moves, reducing the chance to knock the "
"print from the build plate."
msgstr ""
#: fdmprinter.def.json
msgctxt "retraction_hop_only_when_collides label"
msgid "Z Hop Only Over Printed Parts"
msgstr ""
#: fdmprinter.def.json
msgctxt "retraction_hop_only_when_collides description"
msgid ""
"Only perform a Z Hop when moving over printed parts which cannot be avoided "
"by horizontal motion by Avoid Printed Parts when Traveling."
msgstr ""
#: fdmprinter.def.json
msgctxt "retraction_hop label"
msgid "Z Hop Height"
msgstr ""
#: fdmprinter.def.json
msgctxt "retraction_hop description"
msgid "The height difference when performing a Z Hop."
msgstr ""
#: fdmprinter.def.json
msgctxt "material_standby_temperature label"
msgid "Standby Temperature"
@ -1405,19 +1383,6 @@ msgid ""
"retraction."
msgstr ""
#: fdmprinter.def.json
msgctxt "retraction_hop_after_extruder_switch label"
msgid "Z Hop After Extruder Switch"
msgstr ""
#: fdmprinter.def.json
msgctxt "retraction_hop_after_extruder_switch description"
msgid ""
"After the machine switched from one extruder to the other, the build plate "
"is lowered to create clearance between the nozzle and the print. This "
"prevents the nozzle from leaving oozed material on the outside of a print."
msgstr ""
#: fdmprinter.def.json
msgctxt "speed label"
msgid "Speed"
@ -2070,6 +2035,55 @@ msgid ""
"during travel moves."
msgstr ""
#: fdmprinter.def.json
msgctxt "retraction_hop_enabled label"
msgid "Z Hop when Retracted"
msgstr ""
#: fdmprinter.def.json
msgctxt "retraction_hop_enabled description"
msgid ""
"Whenever a retraction is done, the build plate is lowered to create "
"clearance between the nozzle and the print. It prevents the nozzle from "
"hitting the print during travel moves, reducing the chance to knock the "
"print from the build plate."
msgstr ""
#: fdmprinter.def.json
msgctxt "retraction_hop_only_when_collides label"
msgid "Z Hop Only Over Printed Parts"
msgstr ""
#: fdmprinter.def.json
msgctxt "retraction_hop_only_when_collides description"
msgid ""
"Only perform a Z Hop when moving over printed parts which cannot be avoided "
"by horizontal motion by Avoid Printed Parts when Traveling."
msgstr ""
#: fdmprinter.def.json
msgctxt "retraction_hop label"
msgid "Z Hop Height"
msgstr ""
#: fdmprinter.def.json
msgctxt "retraction_hop description"
msgid "The height difference when performing a Z Hop."
msgstr ""
#: fdmprinter.def.json
msgctxt "retraction_hop_after_extruder_switch label"
msgid "Z Hop After Extruder Switch"
msgstr ""
#: fdmprinter.def.json
msgctxt "retraction_hop_after_extruder_switch description"
msgid ""
"After the machine switched from one extruder to the other, the build plate "
"is lowered to create clearance between the nozzle and the print. This "
"prevents the nozzle from leaving oozed material on the outside of a print."
msgstr ""
#: fdmprinter.def.json
msgctxt "cooling label"
msgid "Cooling"
@ -2176,7 +2190,9 @@ msgctxt "cool_min_layer_time description"
msgid ""
"The minimum time spent in a layer. This forces the printer to slow down, to "
"at least spend the time set here in one layer. This allows the printed "
"material to cool down properly before printing the next layer."
"material to cool down properly before printing the next layer. Layers may "
"still take shorter than the minimal layer time if Lift Head is disabled and "
"if the Minimum Speed would otherwise be violated."
msgstr ""
#: fdmprinter.def.json
@ -2227,6 +2243,54 @@ msgid ""
"severe overhangs."
msgstr ""
#: fdmprinter.def.json
msgctxt "support_extruder_nr label"
msgid "Support Extruder"
msgstr ""
#: fdmprinter.def.json
msgctxt "support_extruder_nr description"
msgid ""
"The extruder train to use for printing the support. This is used in multi-"
"extrusion."
msgstr ""
#: fdmprinter.def.json
msgctxt "support_infill_extruder_nr label"
msgid "Support Infill Extruder"
msgstr ""
#: fdmprinter.def.json
msgctxt "support_infill_extruder_nr description"
msgid ""
"The extruder train to use for printing the infill of the support. This is "
"used in multi-extrusion."
msgstr ""
#: fdmprinter.def.json
msgctxt "support_extruder_nr_layer_0 label"
msgid "First Layer Support Extruder"
msgstr ""
#: fdmprinter.def.json
msgctxt "support_extruder_nr_layer_0 description"
msgid ""
"The extruder train to use for printing the first layer of support infill. "
"This is used in multi-extrusion."
msgstr ""
#: fdmprinter.def.json
msgctxt "support_interface_extruder_nr label"
msgid "Support Interface Extruder"
msgstr ""
#: fdmprinter.def.json
msgctxt "support_interface_extruder_nr description"
msgid ""
"The extruder train to use for printing the roofs and bottoms of the support. "
"This is used in multi-extrusion."
msgstr ""
#: fdmprinter.def.json
msgctxt "support_type label"
msgid "Support Placement"
@ -2687,6 +2751,18 @@ msgctxt "adhesion_type option raft"
msgid "Raft"
msgstr ""
#: fdmprinter.def.json
msgctxt "adhesion_extruder_nr label"
msgid "Build Plate Adhesion Extruder"
msgstr ""
#: fdmprinter.def.json
msgctxt "adhesion_extruder_nr description"
msgid ""
"The extruder train to use for printing the skirt/brim/raft. This is used in "
"multi-extrusion."
msgstr ""
#: fdmprinter.def.json
msgctxt "skirt_line_count label"
msgid "Skirt Line Count"
@ -3100,66 +3176,6 @@ msgctxt "dual description"
msgid "Settings used for printing with multiple extruders."
msgstr ""
#: fdmprinter.def.json
msgctxt "adhesion_extruder_nr label"
msgid "Build Plate Adhesion Extruder"
msgstr ""
#: fdmprinter.def.json
msgctxt "adhesion_extruder_nr description"
msgid ""
"The extruder train to use for printing the skirt/brim/raft. This is used in "
"multi-extrusion."
msgstr ""
#: fdmprinter.def.json
msgctxt "support_extruder_nr label"
msgid "Support Extruder"
msgstr ""
#: fdmprinter.def.json
msgctxt "support_extruder_nr description"
msgid ""
"The extruder train to use for printing the support. This is used in multi-"
"extrusion."
msgstr ""
#: fdmprinter.def.json
msgctxt "support_infill_extruder_nr label"
msgid "Support Infill Extruder"
msgstr ""
#: fdmprinter.def.json
msgctxt "support_infill_extruder_nr description"
msgid ""
"The extruder train to use for printing the infill of the support. This is "
"used in multi-extrusion."
msgstr ""
#: fdmprinter.def.json
msgctxt "support_extruder_nr_layer_0 label"
msgid "First Layer Support Extruder"
msgstr ""
#: fdmprinter.def.json
msgctxt "support_extruder_nr_layer_0 description"
msgid ""
"The extruder train to use for printing the first layer of support infill. "
"This is used in multi-extrusion."
msgstr ""
#: fdmprinter.def.json
msgctxt "support_interface_extruder_nr label"
msgid "Support Interface Extruder"
msgstr ""
#: fdmprinter.def.json
msgctxt "support_interface_extruder_nr description"
msgid ""
"The extruder train to use for printing the roofs and bottoms of the support. "
"This is used in multi-extrusion."
msgstr ""
#: fdmprinter.def.json
msgctxt "prime_tower_enable label"
msgid "Enable Prime Tower"
@ -3336,6 +3352,18 @@ msgid ""
"everything else fails to produce proper GCode."
msgstr ""
#: fdmprinter.def.json
msgctxt "carve_multiple_volumes label"
msgid "Remove Mesh Intersection"
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."
msgstr ""
#: fdmprinter.def.json
msgctxt "blackmagic label"
msgid "Special Modes"

View file

@ -1831,13 +1831,13 @@ msgstr "Tulostimen näyttölaite"
#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:382
msgctxt "@title:tab"
msgid "Simple"
msgstr "Yksinkertainen"
msgid "Recommended"
msgstr "Suositeltu"
#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:383
msgctxt "@title:tab"
msgid "Advanced"
msgstr "Laajennettu"
msgid "Custom"
msgstr "Mukautettu"
#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:18
#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:18
@ -2295,25 +2295,6 @@ msgid ""
"Click to open the profile manager."
msgstr "Jotkut asetusten arvot eroavat profiiliin tallennetuista arvoista.\n\nAvaa profiilin hallinta napsauttamalla."
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:24
msgid "Modify G-Code"
msgstr "Muokkaa GCode-arvoa"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/__init__.py:12
msgctxt "@label"
msgid "Post Processing"
msgstr "Jälkikäsittely"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/__init__.py:16
msgctxt "Description of plugin"
msgid "Extension that allows for user created scripts for post processing"
msgstr "Lisäosa, jonka avulla käyttäjät voivat luoda komentosarjoja jälkikäsittelyä varten"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18
msgctxt "@title:window"
msgid "Post Processing Plugin"
msgstr "Jälkikäsittelylisäosa"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:49
msgctxt "@label"
msgid "Post Processing Scripts"
@ -2333,3 +2314,318 @@ msgstr "Asetukset"
msgctxt "@info:tooltip"
msgid "Change active post-processing scripts"
msgstr "Muuta aktiivisia jälkikäsittelykomentosarjoja"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/__init__.py:13
msgctxt "@info:whatsthis"
msgid "Manages network connections to Ultimaker 3 printers"
msgstr "Ultimaker 3 -tulostimien verkkoyhteyksien hallinta"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:100
msgctxt "@action:button"
msgid "Print over network"
msgstr "Tulosta verkon kautta"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:101
msgctxt "@properties:tooltip"
msgid "Print over network"
msgstr "Tulosta verkon kautta"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:143
msgctxt "@info:status"
msgid ""
"Access to the printer requested. Please approve the request on the printer"
msgstr "Tulostimen käyttöoikeutta pyydetty. Hyväksy tulostimen pyyntö"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:144
msgctxt "@info:status"
msgid ""
msgstr ""
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:145
msgctxt "@action:button"
msgid "Retry"
msgstr "Yritä uudelleen"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:145
msgctxt "@info:tooltip"
msgid "Re-send the access request"
msgstr "Lähetä käyttöoikeuspyyntö uudelleen"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:147
msgctxt "@info:status"
msgid "Access to the printer accepted"
msgstr "Tulostimen käyttöoikeus hyväksytty"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:148
msgctxt "@info:status"
msgid "No access to print with this printer. Unable to send print job."
msgstr "Tällä tulostimella tulostukseen ei ole käyttöoikeutta. Tulostustyön lähetys ei onnistu."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:149
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:28
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:72
msgctxt "@action:button"
msgid "Request Access"
msgstr "Pyydä käyttöoikeutta"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:149
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:27
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:71
msgctxt "@info:tooltip"
msgid "Send access request to the printer"
msgstr "Lähetä tulostimen käyttöoikeuspyyntö"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:232
#, python-brace-format
msgctxt "@info:status"
msgid ""
"Connected over the network to {0}. Please approve the access request on the "
"printer."
msgstr "Yhdistetty verkon kautta tulostimeen {0}. Hyväksy tulostimen käyttöoikeuspyyntö."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:239
#, python-brace-format
msgctxt "@info:status"
msgid "Connected over the network to {0}."
msgstr "Yhdistetty verkon kautta tulostimeen {0}."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:252
#, python-brace-format
msgctxt "@info:status"
msgid "Connected over the network to {0}. No access to control the printer."
msgstr "Yhdistetty verkon kautta tulostimeen {0}. Ei käyttöoikeutta tulostimen hallintaan."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:257
msgctxt "@info:status"
msgid "Access request was denied on the printer."
msgstr "Tulostimen käyttöoikeuspyyntö hylättiin."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:260
msgctxt "@info:status"
msgid "Access request failed due to a timeout."
msgstr "Käyttöoikeuspyyntö epäonnistui aikakatkaisun vuoksi."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:323
msgctxt "@info:status"
msgid "The connection with the network was lost."
msgstr "Yhteys verkkoon menetettiin."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:354
msgctxt "@info:status"
msgid ""
"The connection with the printer was lost. Check your printer to see if it is "
"connected."
msgstr "Yhteys tulostimeen menetettiin. Tarkista, onko tulostin yhdistetty."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:466
msgctxt "@info:status"
msgid ""
"Unable to start a new print job because the printer is busy. Please check "
"the printer."
msgstr "Uuden tulostustyön aloittaminen ei onnistu, koska tulostin on varattu. Tarkista tulostin."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:471
#, python-format
msgctxt "@info:status"
msgid ""
"Unable to start a new print job, printer is busy. Current printer status is "
"%s."
msgstr "Uuden tulostustyön aloittaminen ei onnistu, koska tulostin on varattu. Nykyinen tulostimen tila on %s."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:491
#, python-brace-format
msgctxt "@info:status"
msgid "Unable to start a new print job. No PrinterCore loaded in slot {0}"
msgstr "Uuden tulostustyön aloittaminen ei onnistu. PrinterCorea ei ole ladattu aukkoon {0}"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:498
#, python-brace-format
msgctxt "@info:status"
msgid "Unable to start a new print job. No material loaded in slot {0}"
msgstr "Uuden tulostustyön aloittaminen ei onnistu. Materiaalia ei ole ladattu aukkoon {0}"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:509
#, python-brace-format
msgctxt "@label"
msgid "Not enough material for spool {0}."
msgstr "Kelalle {0} ei ole tarpeeksi materiaalia."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:519
#, python-brace-format
msgctxt "@label"
msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}"
msgstr "Eri PrintCore (Cura: {0}, tulostin: {1}) valittu suulakkeelle {2}"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:533
#, python-brace-format
msgctxt "@label"
msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}"
msgstr "Eri materiaali (Cura: {0}, tulostin: {1}) valittu suulakkeelle {2}"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:536
msgctxt "@label"
msgid "Are you sure you wish to print with the selected configuration?"
msgstr "Haluatko varmasti tulostaa valitulla määrityksellä?"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:537
msgctxt "@label"
msgid ""
"There is a mismatch between the configuration of the printer and Cura. For "
"the best result, always slice for the PrintCores and materials that are "
"inserted in your printer."
msgstr "Tulostimen ja Curan määrityksen välillä on ristiriita. Parhaat tulokset saavutetaan viipaloimalla aina tulostimeen asetetuille PrintCoreille ja materiaaleille."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:543
msgctxt "@window:title"
msgid "Mismatched configuration"
msgstr "Ristiriitainen määritys"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:633
msgctxt "@info:status"
msgid "Sending data to printer"
msgstr "Lähetetään tietoja tulostimeen"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:680
msgctxt "@info:status"
msgid "Unable to send data to printer. Is another job still active?"
msgstr "Tietojen lähetys tulostimeen ei onnistu. Onko toinen työ yhä aktiivinen?"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:804
msgctxt "@label:MonitorStatus"
msgid "Print aborted. Please check the printer"
msgstr "Tulostus keskeytetty. Tarkista tulostin"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:810
msgctxt "@label:MonitorStatus"
msgid "Pausing print..."
msgstr "Tulostus pysäytetään..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:812
msgctxt "@label:MonitorStatus"
msgid "Resuming print..."
msgstr "Tulostusta jatketaan..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:920
msgctxt "@window:title"
msgid "Changes on the Printer"
msgstr "Tulostimen muutokset"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:922
msgctxt "@label"
msgid ""
"Do you want to change the PrintCores and materials in Cura to match your "
"printer?"
msgstr "Haluatko muuttaa Curan PrintCoret ja materiaalit vastaamaan tulostinta?"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:924
msgctxt "@label"
msgid ""
"The PrintCores and/or materials on your printer were changed. For the best "
"result, always slice for the PrintCores and materials that are inserted in "
"your printer."
msgstr "Tulostimen PrintCoreja ja/tai materiaaleja muutettiin. Parhaat tulokset saavutetaan viipaloimalla aina tulostimeen asetetuille PrintCoreille ja materiaaleille."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19
msgctxt "@action"
msgid "Connect via Network"
msgstr "Yhdistä verkon kautta"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:57
msgctxt "@title:window"
msgid "Connect to Networked Printer"
msgstr "Yhdistä verkkotulostimeen"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:67
msgctxt "@label"
msgid ""
"To print directly to your printer over the network, please make sure your "
"printer is connected to the network using a network cable or by connecting "
"your printer to your WIFI network. If you don't connect Cura with your "
"printer, you can still use a USB drive to transfer g-code files to your "
"printer.\n"
"\n"
"Select your printer from the list below:"
msgstr "Tulosta suoraan tulostimeen verkon kautta yhdistämällä tulostin verkkoon verkkokaapelilla tai yhdistämällä tulostin Wi-Fi-verkkoon. Jos Curaa ei yhdistetä tulostimeen, GCode-tiedostot voidaan silti siirtää tulostimeen USB-aseman avulla.\n\nValitse tulostin alla olevasta luettelosta:"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:106
msgctxt "@action:button"
msgid "Refresh"
msgstr "Päivitä"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:198
msgctxt "@label"
msgid ""
"If your printer is not listed, read the <a href='%1'>network-printing "
"troubleshooting guide</a>"
msgstr "Jos tulostinta ei ole luettelossa, lue <a href='%1'>verkkotulostuksen vianetsintäopas</a>"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:225
msgctxt "@label"
msgid "Type"
msgstr "Tyyppi"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:231
msgctxt "@label"
msgid "Ultimaker 3"
msgstr "Ultimaker 3"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:231
msgctxt "@label"
msgid "Ultimaker 3 Extended"
msgstr "Ultimaker 3 Extended"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:237
msgctxt "@label"
msgid "Firmware version"
msgstr "Laiteohjelmistoversio"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:249
msgctxt "@label"
msgid "Address"
msgstr "Osoite"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:263
msgctxt "@label"
msgid "The printer at this address has not yet responded."
msgstr "Tämän osoitteen tulostin ei ole vielä vastannut."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:268
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38
msgctxt "@action:button"
msgid "Connect"
msgstr "Yhdistä"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:280
msgctxt "@label:"
msgid "Print Again"
msgstr "Tulosta uudelleen"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:289
msgctxt "@title:window"
msgid "Printer Address"
msgstr "Tulostimen osoite"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:319
msgctxt "@alabel"
msgid "Enter the IP address or hostname of your printer on the network."
msgstr "Anna verkon tulostimen IP-osoite tai isäntänimi."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:346
msgctxt "@action:button"
msgid "Ok"
msgstr "OK"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37
msgctxt "@info:tooltip"
msgid "Connect to a printer"
msgstr "Yhdistä tulostimeen"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116
msgctxt "@info:tooltip"
msgid "Load the configuration of the printer into Cura"
msgstr "Lataa tulostimen määritys Curaan"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117
msgctxt "@action:button"
msgid "Activate Configuration"
msgstr "Aktivoi määritys"

View file

@ -1831,13 +1831,13 @@ msgstr "Moniteur de l'imprimante"
#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:382
msgctxt "@title:tab"
msgid "Simple"
msgstr "Simple"
msgid "Recommended"
msgstr "Recommandé"
#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:383
msgctxt "@title:tab"
msgid "Advanced"
msgstr "Avancée"
msgid "Custom"
msgstr "Personnalisé"
#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:18
#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:18
@ -2295,25 +2295,6 @@ msgid ""
"Click to open the profile manager."
msgstr "Certaines valeurs de paramètre sont différentes des valeurs enregistrées dans le profil.\n\nCliquez pour ouvrir le gestionnaire de profils."
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:24
msgid "Modify G-Code"
msgstr "Modifier le G-Code"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/__init__.py:12
msgctxt "@label"
msgid "Post Processing"
msgstr "Post-traitement"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/__init__.py:16
msgctxt "Description of plugin"
msgid "Extension that allows for user created scripts for post processing"
msgstr "Extension qui permet le post-traitement des scripts créés par l'utilisateur"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18
msgctxt "@title:window"
msgid "Post Processing Plugin"
msgstr "Plug-in de post-traitement"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:49
msgctxt "@label"
msgid "Post Processing Scripts"
@ -2333,3 +2314,318 @@ msgstr "Paramètres"
msgctxt "@info:tooltip"
msgid "Change active post-processing scripts"
msgstr "Modifier les scripts de post-traitement actifs"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/__init__.py:13
msgctxt "@info:whatsthis"
msgid "Manages network connections to Ultimaker 3 printers"
msgstr "Gère les connexions réseau vers les imprimantes Ultimaker 3"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:100
msgctxt "@action:button"
msgid "Print over network"
msgstr "Imprimer sur le réseau"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:101
msgctxt "@properties:tooltip"
msgid "Print over network"
msgstr "Imprimer sur le réseau"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:143
msgctxt "@info:status"
msgid ""
"Access to the printer requested. Please approve the request on the printer"
msgstr "Accès à l'imprimante demandé. Veuillez approuver la demande sur l'imprimante"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:144
msgctxt "@info:status"
msgid ""
msgstr ""
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:145
msgctxt "@action:button"
msgid "Retry"
msgstr "Réessayer"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:145
msgctxt "@info:tooltip"
msgid "Re-send the access request"
msgstr "Renvoyer la demande d'accès"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:147
msgctxt "@info:status"
msgid "Access to the printer accepted"
msgstr "Accès à l'imprimante accepté"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:148
msgctxt "@info:status"
msgid "No access to print with this printer. Unable to send print job."
msgstr "Aucun accès pour imprimer avec cette imprimante. Impossible d'envoyer la tâche d'impression."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:149
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:28
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:72
msgctxt "@action:button"
msgid "Request Access"
msgstr "Demande d'accès"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:149
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:27
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:71
msgctxt "@info:tooltip"
msgid "Send access request to the printer"
msgstr "Envoyer la demande d'accès à l'imprimante"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:232
#, python-brace-format
msgctxt "@info:status"
msgid ""
"Connected over the network to {0}. Please approve the access request on the "
"printer."
msgstr "Connecté sur le réseau à {0}. Veuillez approuver la demande d'accès sur l'imprimante."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:239
#, python-brace-format
msgctxt "@info:status"
msgid "Connected over the network to {0}."
msgstr "Connecté sur le réseau à {0}."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:252
#, python-brace-format
msgctxt "@info:status"
msgid "Connected over the network to {0}. No access to control the printer."
msgstr "Connecté sur le réseau à {0}. Pas d'accès pour commander l'imprimante."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:257
msgctxt "@info:status"
msgid "Access request was denied on the printer."
msgstr "La demande d'accès a été refusée sur l'imprimante."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:260
msgctxt "@info:status"
msgid "Access request failed due to a timeout."
msgstr "Échec de la demande d'accès à cause de la durée limite."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:323
msgctxt "@info:status"
msgid "The connection with the network was lost."
msgstr "La connexion avec le réseau a été perdue."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:354
msgctxt "@info:status"
msgid ""
"The connection with the printer was lost. Check your printer to see if it is "
"connected."
msgstr "La connexion avec l'imprimante a été perdue. Vérifiez que votre imprimante est connectée."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:466
msgctxt "@info:status"
msgid ""
"Unable to start a new print job because the printer is busy. Please check "
"the printer."
msgstr "Impossible de démarrer une nouvelle tâche d'impression car l'imprimante est occupée. Vérifiez l'imprimante."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:471
#, python-format
msgctxt "@info:status"
msgid ""
"Unable to start a new print job, printer is busy. Current printer status is "
"%s."
msgstr "Impossible de démarrer une nouvelle tâche d'impression car l'imprimante est occupée. L'état actuel de l'imprimante est %s."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:491
#, python-brace-format
msgctxt "@info:status"
msgid "Unable to start a new print job. No PrinterCore loaded in slot {0}"
msgstr "Impossible de démarrer une nouvelle tâche d'impression car l'imprimante est occupée. Pas de PrinterCore inséré dans la fente {0}."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:498
#, python-brace-format
msgctxt "@info:status"
msgid "Unable to start a new print job. No material loaded in slot {0}"
msgstr "Impossible de démarrer une nouvelle tâche d'impression car l'imprimante est occupée. Pas de matériau chargé dans la fente {0}."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:509
#, python-brace-format
msgctxt "@label"
msgid "Not enough material for spool {0}."
msgstr "Pas suffisamment de matériau pour bobine {0}."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:519
#, python-brace-format
msgctxt "@label"
msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}"
msgstr "PrintCore différent (Cura : {0}, Imprimante : {1}) sélectionné pour l'extrudeuse {2}"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:533
#, python-brace-format
msgctxt "@label"
msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}"
msgstr "Matériau différent (Cura : {0}, Imprimante : {1}) sélectionné pour l'extrudeuse {2}"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:536
msgctxt "@label"
msgid "Are you sure you wish to print with the selected configuration?"
msgstr "Êtes-vous sûr(e) de vouloir imprimer avec la configuration sélectionnée ?"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:537
msgctxt "@label"
msgid ""
"There is a mismatch between the configuration of the printer and Cura. For "
"the best result, always slice for the PrintCores and materials that are "
"inserted in your printer."
msgstr "Problème de compatibilité entre la configuration de l'imprimante et Cura. Pour un résultat optimal, découpez toujours pour les PrintCores et matériaux insérés dans votre imprimante."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:543
msgctxt "@window:title"
msgid "Mismatched configuration"
msgstr "Configuration différente"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:633
msgctxt "@info:status"
msgid "Sending data to printer"
msgstr "Envoi des données à l'imprimante"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:680
msgctxt "@info:status"
msgid "Unable to send data to printer. Is another job still active?"
msgstr "Impossible d'envoyer les données à l'imprimante. Une autre tâche est-elle toujours active ?"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:804
msgctxt "@label:MonitorStatus"
msgid "Print aborted. Please check the printer"
msgstr "Abandon de l'impression. Vérifiez l'imprimante"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:810
msgctxt "@label:MonitorStatus"
msgid "Pausing print..."
msgstr "Mise en pause de l'impression..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:812
msgctxt "@label:MonitorStatus"
msgid "Resuming print..."
msgstr "Reprise de l'impression..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:920
msgctxt "@window:title"
msgid "Changes on the Printer"
msgstr "Modifications sur l'imprimante"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:922
msgctxt "@label"
msgid ""
"Do you want to change the PrintCores and materials in Cura to match your "
"printer?"
msgstr "Voulez-vous modifier les PrintCores et matériaux dans Cura pour correspondre à votre imprimante ?"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:924
msgctxt "@label"
msgid ""
"The PrintCores and/or materials on your printer were changed. For the best "
"result, always slice for the PrintCores and materials that are inserted in "
"your printer."
msgstr "Les PrintCores et/ou matériaux sur votre imprimante ont été modifiés. Pour un résultat optimal, découpez toujours pour les PrintCores et matériaux insérés dans votre imprimante."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19
msgctxt "@action"
msgid "Connect via Network"
msgstr "Connecter via le réseau"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:57
msgctxt "@title:window"
msgid "Connect to Networked Printer"
msgstr "Connecter à l'imprimante en réseau"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:67
msgctxt "@label"
msgid ""
"To print directly to your printer over the network, please make sure your "
"printer is connected to the network using a network cable or by connecting "
"your printer to your WIFI network. If you don't connect Cura with your "
"printer, you can still use a USB drive to transfer g-code files to your "
"printer.\n"
"\n"
"Select your printer from the list below:"
msgstr "Pour imprimer directement sur votre imprimante sur le réseau, assurez-vous que votre imprimante est connectée au réseau via un câble réseau ou en connectant votre imprimante à votre réseau Wi-Fi. Si vous ne connectez pas Cura avec votre imprimante, vous pouvez utiliser une clé USB pour transférer les fichiers g-code sur votre imprimante.\n\nSélectionnez votre imprimante dans la liste ci-dessous :"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:106
msgctxt "@action:button"
msgid "Refresh"
msgstr "Rafraîchir"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:198
msgctxt "@label"
msgid ""
"If your printer is not listed, read the <a href='%1'>network-printing "
"troubleshooting guide</a>"
msgstr "Si votre imprimante n'apparaît pas dans la liste, lisez le <a href='%1'>guide de dépannage de l'impression en réseau</a>"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:225
msgctxt "@label"
msgid "Type"
msgstr "Type"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:231
msgctxt "@label"
msgid "Ultimaker 3"
msgstr "Ultimaker 3"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:231
msgctxt "@label"
msgid "Ultimaker 3 Extended"
msgstr "Ultimaker 3 Extended"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:237
msgctxt "@label"
msgid "Firmware version"
msgstr "Version du firmware"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:249
msgctxt "@label"
msgid "Address"
msgstr "Adresse"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:263
msgctxt "@label"
msgid "The printer at this address has not yet responded."
msgstr "L'imprimante à cette adresse n'a pas encore répondu."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:268
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38
msgctxt "@action:button"
msgid "Connect"
msgstr "Connecter"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:280
msgctxt "@label:"
msgid "Print Again"
msgstr "Imprimer à nouveau"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:289
msgctxt "@title:window"
msgid "Printer Address"
msgstr "Adresse de l'imprimante"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:319
msgctxt "@alabel"
msgid "Enter the IP address or hostname of your printer on the network."
msgstr "Saisissez l'adresse IP ou le nom d'hôte de votre imprimante sur le réseau."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:346
msgctxt "@action:button"
msgid "Ok"
msgstr "Ok"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37
msgctxt "@info:tooltip"
msgid "Connect to a printer"
msgstr "Connecter à une imprimante"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116
msgctxt "@info:tooltip"
msgid "Load the configuration of the printer into Cura"
msgstr "Charger la configuration de l'imprimante dans Cura"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117
msgctxt "@action:button"
msgid "Activate Configuration"
msgstr "Activer la configuration"

View file

@ -160,13 +160,13 @@ msgstr "Salvato su unità rimovibile {0} come {1}"
#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:103
msgctxt "@action:button"
msgid "Eject"
msgstr "Espelli"
msgstr "Rimuovi"
#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:103
#, python-brace-format
msgctxt "@action"
msgid "Eject removable device {0}"
msgstr "Espelli il dispositivo rimovibile {0}"
msgstr "Rimuovi il dispositivo rimovibile {0}"
#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:108
#, python-brace-format
@ -1831,13 +1831,13 @@ msgstr "Monitoraggio stampante"
#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:382
msgctxt "@title:tab"
msgid "Simple"
msgstr "Semplice"
msgid "Recommended"
msgstr "Consigliata"
#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:383
msgctxt "@title:tab"
msgid "Advanced"
msgstr "Avanzata"
msgid "Custom"
msgstr "Personalizzata"
#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:18
#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:18
@ -2008,7 +2008,7 @@ msgstr "Sel&eziona tutti i modelli"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:248
msgctxt "@action:inmenu menubar:edit"
msgid "&Clear Build Plate"
msgstr "&Cancella piano di stampa"
msgstr "&Cancellare piano di stampa"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258
msgctxt "@action:inmenu menubar:file"
@ -2295,25 +2295,6 @@ msgid ""
"Click to open the profile manager."
msgstr "Alcuni valori di impostazione sono diversi dai valori memorizzati nel profilo.\n\nFare clic per aprire la gestione profili."
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:24
msgid "Modify G-Code"
msgstr "Modifica il codice G"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/__init__.py:12
msgctxt "@label"
msgid "Post Processing"
msgstr "Post-elaborazione"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/__init__.py:16
msgctxt "Description of plugin"
msgid "Extension that allows for user created scripts for post processing"
msgstr "Estensione che consente la post-elaborazione degli script creati da utente"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18
msgctxt "@title:window"
msgid "Post Processing Plugin"
msgstr "Plug-in di post-elaborazione"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:49
msgctxt "@label"
msgid "Post Processing Scripts"
@ -2333,3 +2314,318 @@ msgstr "Impostazioni"
msgctxt "@info:tooltip"
msgid "Change active post-processing scripts"
msgstr "Modifica script di post-elaborazione attivi"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/__init__.py:13
msgctxt "@info:whatsthis"
msgid "Manages network connections to Ultimaker 3 printers"
msgstr "Gestisce le connessioni di rete alle stampanti Ultimaker 3"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:100
msgctxt "@action:button"
msgid "Print over network"
msgstr "Stampa sulla rete"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:101
msgctxt "@properties:tooltip"
msgid "Print over network"
msgstr "Stampa sulla rete"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:143
msgctxt "@info:status"
msgid ""
"Access to the printer requested. Please approve the request on the printer"
msgstr "Richiesto accesso alla stampante. Approvare la richiesta sulla stampante"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:144
msgctxt "@info:status"
msgid ""
msgstr ""
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:145
msgctxt "@action:button"
msgid "Retry"
msgstr "Riprova"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:145
msgctxt "@info:tooltip"
msgid "Re-send the access request"
msgstr "Invia nuovamente la richiesta di accesso"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:147
msgctxt "@info:status"
msgid "Access to the printer accepted"
msgstr "Accesso alla stampante accettato"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:148
msgctxt "@info:status"
msgid "No access to print with this printer. Unable to send print job."
msgstr "Nessun accesso per stampare con questa stampante. Impossibile inviare il processo di stampa."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:149
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:28
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:72
msgctxt "@action:button"
msgid "Request Access"
msgstr "Richiesta di accesso"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:149
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:27
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:71
msgctxt "@info:tooltip"
msgid "Send access request to the printer"
msgstr "Invia la richiesta di accesso alla stampante"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:232
#, python-brace-format
msgctxt "@info:status"
msgid ""
"Connected over the network to {0}. Please approve the access request on the "
"printer."
msgstr "Collegato alla rete a {0}. Si prega di approvare la richiesta di accesso sulla stampante."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:239
#, python-brace-format
msgctxt "@info:status"
msgid "Connected over the network to {0}."
msgstr "Collegato alla rete a {0}."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:252
#, python-brace-format
msgctxt "@info:status"
msgid "Connected over the network to {0}. No access to control the printer."
msgstr "Collegato alla rete a {0}. Nessun accesso per controllare la stampante."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:257
msgctxt "@info:status"
msgid "Access request was denied on the printer."
msgstr "Richiesta di accesso negata sulla stampante."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:260
msgctxt "@info:status"
msgid "Access request failed due to a timeout."
msgstr "Richiesta di accesso non riuscita per superamento tempo."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:323
msgctxt "@info:status"
msgid "The connection with the network was lost."
msgstr "Il collegamento con la rete si è interrotto."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:354
msgctxt "@info:status"
msgid ""
"The connection with the printer was lost. Check your printer to see if it is "
"connected."
msgstr "Il collegamento con la stampante si è interrotto. Controllare la stampante per verificare se è collegata."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:466
msgctxt "@info:status"
msgid ""
"Unable to start a new print job because the printer is busy. Please check "
"the printer."
msgstr "Impossibile avviare un nuovo processo di stampa perché la stampante è occupata. Controllare la stampante."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:471
#, python-format
msgctxt "@info:status"
msgid ""
"Unable to start a new print job, printer is busy. Current printer status is "
"%s."
msgstr "Impossibile avviare un nuovo processo di stampa perché la stampante è occupata. Stato stampante corrente %s."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:491
#, python-brace-format
msgctxt "@info:status"
msgid "Unable to start a new print job. No PrinterCore loaded in slot {0}"
msgstr "Impossibile avviare un nuovo processo di stampa. Nessun PrinterCore caricato nello slot {0}"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:498
#, python-brace-format
msgctxt "@info:status"
msgid "Unable to start a new print job. No material loaded in slot {0}"
msgstr "Impossibile avviare un nuovo processo di stampa. Nessun materiale caricato nello slot {0}"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:509
#, python-brace-format
msgctxt "@label"
msgid "Not enough material for spool {0}."
msgstr "Materiale per la bobina insufficiente {0}."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:519
#, python-brace-format
msgctxt "@label"
msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}"
msgstr "PrintCore diverso (Cura: {0}, Stampante: {1}) selezionato per lestrusore {2}"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:533
#, python-brace-format
msgctxt "@label"
msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}"
msgstr "Materiale diverso (Cura: {0}, Stampante: {1}) selezionato per lestrusore {2}"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:536
msgctxt "@label"
msgid "Are you sure you wish to print with the selected configuration?"
msgstr "Sei sicuro di voler stampare con la configurazione selezionata?"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:537
msgctxt "@label"
msgid ""
"There is a mismatch between the configuration of the printer and Cura. For "
"the best result, always slice for the PrintCores and materials that are "
"inserted in your printer."
msgstr "Le configurazioni della stampante e di Cura non corrispondono. Per ottenere i migliori risultati, sezionare sempre per i PrintCore e i materiali inseriti nella stampante utilizzata."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:543
msgctxt "@window:title"
msgid "Mismatched configuration"
msgstr "Mancata corrispondenza della configurazione"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:633
msgctxt "@info:status"
msgid "Sending data to printer"
msgstr "Invio dati alla stampante in corso"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:680
msgctxt "@info:status"
msgid "Unable to send data to printer. Is another job still active?"
msgstr "Impossibile inviare i dati alla stampante. Altro processo ancora attivo?"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:804
msgctxt "@label:MonitorStatus"
msgid "Print aborted. Please check the printer"
msgstr "Stampa interrotta. Controllare la stampante"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:810
msgctxt "@label:MonitorStatus"
msgid "Pausing print..."
msgstr "Messa in pausa stampa..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:812
msgctxt "@label:MonitorStatus"
msgid "Resuming print..."
msgstr "Ripresa stampa..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:920
msgctxt "@window:title"
msgid "Changes on the Printer"
msgstr "Modifiche alla stampante."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:922
msgctxt "@label"
msgid ""
"Do you want to change the PrintCores and materials in Cura to match your "
"printer?"
msgstr "Desideri modificare i PrintCore e i materiali in Cura per abbinare la stampante?"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:924
msgctxt "@label"
msgid ""
"The PrintCores and/or materials on your printer were changed. For the best "
"result, always slice for the PrintCores and materials that are inserted in "
"your printer."
msgstr "I PrintCore e/o i materiali della stampante sono stati modificati. Per ottenere i migliori risultati, sezionare sempre per i PrintCore e i materiali inseriti nella stampante utilizzata."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19
msgctxt "@action"
msgid "Connect via Network"
msgstr "Collega tramite rete"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:57
msgctxt "@title:window"
msgid "Connect to Networked Printer"
msgstr "Collega alla stampante in rete"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:67
msgctxt "@label"
msgid ""
"To print directly to your printer over the network, please make sure your "
"printer is connected to the network using a network cable or by connecting "
"your printer to your WIFI network. If you don't connect Cura with your "
"printer, you can still use a USB drive to transfer g-code files to your "
"printer.\n"
"\n"
"Select your printer from the list below:"
msgstr "Per stampare direttamente sulla stampante in rete, verificare che la stampante desiderata sia collegata alla rete mediante un cavo di rete o mediante collegamento alla rete WIFI. Se si collega Cura alla stampante, è comunque possibile utilizzare una chiavetta USB per trasferire i file codice G alla stampante.\n\nSelezionare la stampante dallelenco seguente:"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:106
msgctxt "@action:button"
msgid "Refresh"
msgstr "Aggiorna"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:198
msgctxt "@label"
msgid ""
"If your printer is not listed, read the <a href='%1'>network-printing "
"troubleshooting guide</a>"
msgstr "Se la stampante non è nellelenco, leggere la <a href=%1>guida alla ricerca guasti per la stampa in rete</a>"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:225
msgctxt "@label"
msgid "Type"
msgstr "Tipo"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:231
msgctxt "@label"
msgid "Ultimaker 3"
msgstr "Ultimaker 3"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:231
msgctxt "@label"
msgid "Ultimaker 3 Extended"
msgstr "Ultimaker3 Extended"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:237
msgctxt "@label"
msgid "Firmware version"
msgstr "Versione firmware"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:249
msgctxt "@label"
msgid "Address"
msgstr "Indirizzo"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:263
msgctxt "@label"
msgid "The printer at this address has not yet responded."
msgstr "La stampante a questo indirizzo non ha ancora risposto."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:268
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38
msgctxt "@action:button"
msgid "Connect"
msgstr "Collega"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:280
msgctxt "@label:"
msgid "Print Again"
msgstr "Ripeti stampa"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:289
msgctxt "@title:window"
msgid "Printer Address"
msgstr "Indirizzo stampante"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:319
msgctxt "@alabel"
msgid "Enter the IP address or hostname of your printer on the network."
msgstr "Inserire lindirizzo IP o lhostname della stampante sulla rete."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:346
msgctxt "@action:button"
msgid "Ok"
msgstr "Ok"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37
msgctxt "@info:tooltip"
msgid "Connect to a printer"
msgstr "Collega a una stampante"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116
msgctxt "@info:tooltip"
msgid "Load the configuration of the printer into Cura"
msgstr "Carica la configurazione della stampante in Cura"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117
msgctxt "@action:button"
msgid "Activate Configuration"
msgstr "Attiva la configurazione"

View file

@ -2257,12 +2257,12 @@ msgstr "Regola il posizionamento delle strutture di supporto. Il posizionamento
#: fdmprinter.def.json
msgctxt "support_type option buildplate"
msgid "Touching Buildplate"
msgstr "Sostegno solo delle pareti esterne"
msgstr "Contatto con il Piano di Stampa"
#: fdmprinter.def.json
msgctxt "support_type option everywhere"
msgid "Everywhere"
msgstr "In tutti i possibili punti"
msgstr "In Tutti i Possibili Punti"
#: fdmprinter.def.json
msgctxt "support_angle label"

File diff suppressed because it is too large Load diff

View file

@ -2,11 +2,11 @@
msgid ""
msgstr ""
"Project-Id-Version: Uranium json setting files\n"
"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n"
"Report-Msgid-Bugs-To: http://github.com/Ultimaker/Cura\n"
"POT-Creation-Date: 2016-09-20 17:35+0000\n"
"PO-Revision-Date: 2016-09-29 13:02+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE\n"
"PO-Revision-Date: 2016-10-11 16:05+0200\n"
"Last-Translator: Ruben Dulek <r.dulek@ultimaker.com>\n"
"Language-Team: Ultimaker\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@ -34,7 +34,7 @@ msgstr "De extruder train die voor het printen wordt gebruikt. Deze wordt gebrui
#: fdmextruder.def.json
msgctxt "machine_nozzle_offset_x label"
msgid "Nozzle X Offset"
msgstr "Offset X-nozzle"
msgstr "X-Offset Nozzle"
#: fdmextruder.def.json
msgctxt "machine_nozzle_offset_x description"
@ -44,7 +44,7 @@ msgstr "De X-coördinaat van de offset van de nozzle."
#: fdmextruder.def.json
msgctxt "machine_nozzle_offset_y label"
msgid "Nozzle Y Offset"
msgstr "Offset Y-nozzle"
msgstr "Y-Offset Nozzle"
#: fdmextruder.def.json
msgctxt "machine_nozzle_offset_y description"
@ -54,7 +54,7 @@ msgstr "De Y-coördinaat van de offset van de nozzle."
#: fdmextruder.def.json
msgctxt "machine_extruder_start_code label"
msgid "Extruder Start G-Code"
msgstr "G-code van extruderstart"
msgstr "Start G-code van Extruder"
#: fdmextruder.def.json
msgctxt "machine_extruder_start_code description"
@ -64,7 +64,7 @@ msgstr "Start-g-code die wordt uitgevoerd wanneer de extruder wordt ingeschakeld
#: fdmextruder.def.json
msgctxt "machine_extruder_start_pos_abs label"
msgid "Extruder Start Position Absolute"
msgstr "Absolute startpositie extruder"
msgstr "Absolute Startpositie Extruder"
#: fdmextruder.def.json
msgctxt "machine_extruder_start_pos_abs description"
@ -76,7 +76,7 @@ msgstr "Maak van de startpositie van de extruder de absolute startpositie, in pl
#: fdmextruder.def.json
msgctxt "machine_extruder_start_pos_x label"
msgid "Extruder Start Position X"
msgstr "X-startpositie extruder"
msgstr "X-startpositie Extruder"
#: fdmextruder.def.json
msgctxt "machine_extruder_start_pos_x description"
@ -86,7 +86,7 @@ msgstr "De X-coördinaat van de startpositie wanneer de extruder wordt ingeschak
#: fdmextruder.def.json
msgctxt "machine_extruder_start_pos_y label"
msgid "Extruder Start Position Y"
msgstr "Y-startpositie extruder"
msgstr "Y-startpositie Extruder"
#: fdmextruder.def.json
msgctxt "machine_extruder_start_pos_y description"
@ -96,7 +96,7 @@ msgstr "De Y-coördinaat van de startpositie wanneer de extruder wordt ingeschak
#: fdmextruder.def.json
msgctxt "machine_extruder_end_code label"
msgid "Extruder End G-Code"
msgstr "G-code van extrudereinde"
msgstr "Eind-g-code van Extruder"
#: fdmextruder.def.json
msgctxt "machine_extruder_end_code description"
@ -106,7 +106,7 @@ msgstr "Eind-g-code die wordt uitgevoerd wanneer de extruder wordt uitgeschakeld
#: fdmextruder.def.json
msgctxt "machine_extruder_end_pos_abs label"
msgid "Extruder End Position Absolute"
msgstr "Absolute eindpositie extruder"
msgstr "Absolute Eindpositie Extruder"
#: fdmextruder.def.json
msgctxt "machine_extruder_end_pos_abs description"
@ -118,7 +118,7 @@ msgstr "Maak van de eindpositie van de extruder de absolute eindpositie, in plaa
#: fdmextruder.def.json
msgctxt "machine_extruder_end_pos_x label"
msgid "Extruder End Position X"
msgstr "X-eindpositie extruder"
msgstr "X-eindpositie Extruder"
#: fdmextruder.def.json
msgctxt "machine_extruder_end_pos_x description"
@ -128,7 +128,7 @@ msgstr "De X-coördinaat van de eindpositie wanneer de extruder wordt uitgeschak
#: fdmextruder.def.json
msgctxt "machine_extruder_end_pos_y label"
msgid "Extruder End Position Y"
msgstr "Y-eindpositie extruder"
msgstr "Y-eindpositie Extruder"
#: fdmextruder.def.json
msgctxt "machine_extruder_end_pos_y description"
@ -138,19 +138,19 @@ msgstr "De Y-coördinaat van de eindpositie wanneer de extruder wordt uitgeschak
#: fdmextruder.def.json
msgctxt "extruder_prime_pos_z label"
msgid "Extruder Prime Z Position"
msgstr "Z-positie voor primen extruder"
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."
msgstr "De Z-coördinaat van de positie waar filament in de nozzle wordt teruggeduwd aan het begin van het printen."
msgstr "De Z-coördinaat van de positie waar filament in de nozzle wordt geprimet aan het begin van het printen."
#: fdmextruder.def.json
msgctxt "platform_adhesion label"
msgid "Build Plate Adhesion"
msgstr "Hechting aan platform"
msgstr "Hechting aan Platform"
#: fdmextruder.def.json
msgctxt "platform_adhesion description"
@ -160,23 +160,23 @@ msgstr "Hechting"
#: fdmextruder.def.json
msgctxt "extruder_prime_pos_x label"
msgid "Extruder Prime X Position"
msgstr "X-positie voor primen extruder"
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."
msgstr "De X-coördinaat van de positie waar filament in de nozzle wordt teruggeduwd aan het begin van het printen."
msgstr "De X-coördinaat van de positie waar filament in de nozzle wordt geprimet aan het begin van het printen."
#: fdmextruder.def.json
msgctxt "extruder_prime_pos_y label"
msgid "Extruder Prime Y Position"
msgstr "Y-positie voor primen extruder"
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."
msgstr "De Y-coördinaat van de positie waar filament in de nozzle wordt teruggeduwd aan het begin van het printen."
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

View file

@ -1831,13 +1831,13 @@ msgstr "Yazıcı İzleyici"
#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:382
msgctxt "@title:tab"
msgid "Simple"
msgstr "Basit"
msgid "Recommended"
msgstr "Önerilen Ayarlar"
#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:383
msgctxt "@title:tab"
msgid "Advanced"
msgstr "Gelişmiş"
msgid "Custom"
msgstr "Özel"
#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:18
#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:18
@ -2295,25 +2295,6 @@ msgid ""
"Click to open the profile manager."
msgstr "Bazı ayar değerleri profilinizde saklanan değerlerden farklıdır.\n\nProfil yöneticisini açmak için tıklayın."
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:24
msgid "Modify G-Code"
msgstr "GCode Değiştir"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/__init__.py:12
msgctxt "@label"
msgid "Post Processing"
msgstr "Son İşleme"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/__init__.py:16
msgctxt "Description of plugin"
msgid "Extension that allows for user created scripts for post processing"
msgstr "Kullanıcının oluşturduğu komut dosyalarına son işleme için izin veren uzantı"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18
msgctxt "@title:window"
msgid "Post Processing Plugin"
msgstr "Son İşleme Uzantısı"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:49
msgctxt "@label"
msgid "Post Processing Scripts"
@ -2333,3 +2314,318 @@ msgstr "Ayarlar"
msgctxt "@info:tooltip"
msgid "Change active post-processing scripts"
msgstr "Etkin son işleme dosyalarını değiştir"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/__init__.py:13
msgctxt "@info:whatsthis"
msgid "Manages network connections to Ultimaker 3 printers"
msgstr "Ultimaker 3 yazıcıları için ağ bağlantılarını yönetir"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:100
msgctxt "@action:button"
msgid "Print over network"
msgstr "Ağ üzerinden yazdır"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:101
msgctxt "@properties:tooltip"
msgid "Print over network"
msgstr "Ağ üzerinden yazdır"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:143
msgctxt "@info:status"
msgid ""
"Access to the printer requested. Please approve the request on the printer"
msgstr "İstenen yazıcıya erişim. Lütfen yazıcı isteğini onaylayın"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:144
msgctxt "@info:status"
msgid ""
msgstr ""
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:145
msgctxt "@action:button"
msgid "Retry"
msgstr "Yeniden dene"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:145
msgctxt "@info:tooltip"
msgid "Re-send the access request"
msgstr "Erişim talebini yeniden gönder"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:147
msgctxt "@info:status"
msgid "Access to the printer accepted"
msgstr "Kabul edilen yazıcıya erişim"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:148
msgctxt "@info:status"
msgid "No access to print with this printer. Unable to send print job."
msgstr "Bu yazıcıyla yazdırmaya erişim yok. Yazdırma işi gönderilemedi."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:149
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:28
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:72
msgctxt "@action:button"
msgid "Request Access"
msgstr "Erişim Talep Et"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:149
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:27
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:71
msgctxt "@info:tooltip"
msgid "Send access request to the printer"
msgstr "Yazıcıya erişim talebi gönder"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:232
#, python-brace-format
msgctxt "@info:status"
msgid ""
"Connected over the network to {0}. Please approve the access request on the "
"printer."
msgstr "Ağ üzerinden şuraya bağlandı: {0}. Lütfen yazıcıya erişim isteğini onaylayın."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:239
#, python-brace-format
msgctxt "@info:status"
msgid "Connected over the network to {0}."
msgstr "Ağ üzerinden şuraya bağlandı: {0}."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:252
#, python-brace-format
msgctxt "@info:status"
msgid "Connected over the network to {0}. No access to control the printer."
msgstr "Ağ üzerinden şuraya bağlandı: {0}. Yazıcıyı kontrol etmek için erişim yok."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:257
msgctxt "@info:status"
msgid "Access request was denied on the printer."
msgstr "Yazıcıya erişim talebi reddedildi."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:260
msgctxt "@info:status"
msgid "Access request failed due to a timeout."
msgstr "Erişim talebi zaman aşımı nedeniyle başarısız oldu."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:323
msgctxt "@info:status"
msgid "The connection with the network was lost."
msgstr "Ağ bağlantısı kaybedildi."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:354
msgctxt "@info:status"
msgid ""
"The connection with the printer was lost. Check your printer to see if it is "
"connected."
msgstr "Yazıcı bağlantısı kaybedildi. Yazıcınızın bağlı olup olmadığını kontrol edin."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:466
msgctxt "@info:status"
msgid ""
"Unable to start a new print job because the printer is busy. Please check "
"the printer."
msgstr "Yazıcı meşgul olduğu için yeni bir yazdırma başlatılamıyor. Lütfen yazıcıyı kontrol edin."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:471
#, python-format
msgctxt "@info:status"
msgid ""
"Unable to start a new print job, printer is busy. Current printer status is "
"%s."
msgstr "Yazıcı meşgul, yeni bir yazdırma başlatılamıyor. Geçerli yazıcı durumu: %s."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:491
#, python-brace-format
msgctxt "@info:status"
msgid "Unable to start a new print job. No PrinterCore loaded in slot {0}"
msgstr "Yeni bir yazdırma başlatılamıyor. {0} yuvasına PrinterCore yüklenmedi"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:498
#, python-brace-format
msgctxt "@info:status"
msgid "Unable to start a new print job. No material loaded in slot {0}"
msgstr "Yeni bir yazdırma başlatılamıyor. {0} yuvasına Malzeme yüklenmedi"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:509
#, python-brace-format
msgctxt "@label"
msgid "Not enough material for spool {0}."
msgstr "Biriktirme {0} için yeterli malzeme yok."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:519
#, python-brace-format
msgctxt "@label"
msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}"
msgstr "Farklı PrintCore (Cura: {0}, Yazıcı: {1}), ekstrüder {2} için seçildi"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:533
#, python-brace-format
msgctxt "@label"
msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}"
msgstr "Farklı malzeme (Cura: {0}, Yazıcı: {1}), ekstrüder {2} için seçildi"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:536
msgctxt "@label"
msgid "Are you sure you wish to print with the selected configuration?"
msgstr "Seçilen yapılandırma ile yazdırmak istediğinizden emin misiniz?"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:537
msgctxt "@label"
msgid ""
"There is a mismatch between the configuration of the printer and Cura. For "
"the best result, always slice for the PrintCores and materials that are "
"inserted in your printer."
msgstr "Yazıcı yapılandırması ve Cura arasında uyumsuzluk var. En iyi sonucu almak istiyorsanız, her zaman PrintCore ve yazıcıya eklenen malzemeler için dilimleme yapın."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:543
msgctxt "@window:title"
msgid "Mismatched configuration"
msgstr "Uyumsuz yapılandırma"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:633
msgctxt "@info:status"
msgid "Sending data to printer"
msgstr "Veriler yazıcıya gönderiliyor"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:680
msgctxt "@info:status"
msgid "Unable to send data to printer. Is another job still active?"
msgstr "Veriler yazıcıya gönderilemedi. Hala etkin olan başka bir iş var mı?"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:804
msgctxt "@label:MonitorStatus"
msgid "Print aborted. Please check the printer"
msgstr "Yazdırma durduruldu. Lütfen yazıcıyı kontrol edin"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:810
msgctxt "@label:MonitorStatus"
msgid "Pausing print..."
msgstr "Yazdırma duraklatılıyor..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:812
msgctxt "@label:MonitorStatus"
msgid "Resuming print..."
msgstr "Yazdırma devam ediyor..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:920
msgctxt "@window:title"
msgid "Changes on the Printer"
msgstr "Yazıcıdaki Değişiklikler"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:922
msgctxt "@label"
msgid ""
"Do you want to change the PrintCores and materials in Cura to match your "
"printer?"
msgstr "Yazıcıya uyumlu hale getirmek için PrintCore ve Curadaki malzemeleri değiştirmek istiyor musunuz?"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:924
msgctxt "@label"
msgid ""
"The PrintCores and/or materials on your printer were changed. For the best "
"result, always slice for the PrintCores and materials that are inserted in "
"your printer."
msgstr "PrintCore ve/veya yazıcınızdaki malzemeler değiştirildi. En iyi sonucu almak istiyorsanız, her zaman PrintCore ve yazıcıya eklenen malzemeler için dilimleme yapın."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19
msgctxt "@action"
msgid "Connect via Network"
msgstr "Ağ ile Bağlan"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:57
msgctxt "@title:window"
msgid "Connect to Networked Printer"
msgstr "Ağ Yazıcısına Bağlan"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:67
msgctxt "@label"
msgid ""
"To print directly to your printer over the network, please make sure your "
"printer is connected to the network using a network cable or by connecting "
"your printer to your WIFI network. If you don't connect Cura with your "
"printer, you can still use a USB drive to transfer g-code files to your "
"printer.\n"
"\n"
"Select your printer from the list below:"
msgstr "Yazıcınıza ağ üzerinden doğrudan bağlamak için, lütfen yazıcınızın ağ kablosu kullanan bir ağa bağlı olduğundan emin olun veya yazıcınızı WiFi ağına bağlayın. Cura'ya yazıcınız ile bağlanamıyorsanız g-code dosyalarını yazıcınıza aktarmak için USB sürücüsü kullanabilirsiniz.\n\nAşağıdaki listeden yazıcınızı seçin:"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:106
msgctxt "@action:button"
msgid "Refresh"
msgstr "Yenile"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:198
msgctxt "@label"
msgid ""
"If your printer is not listed, read the <a href='%1'>network-printing "
"troubleshooting guide</a>"
msgstr "Yazıcınız listede yoksa <a href=%1>ağ yazdırma sorun giderme kılavuzunu</a> okuyun"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:225
msgctxt "@label"
msgid "Type"
msgstr "Tür"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:231
msgctxt "@label"
msgid "Ultimaker 3"
msgstr "Ultimaker 3"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:231
msgctxt "@label"
msgid "Ultimaker 3 Extended"
msgstr "Genişletilmiş Ultimaker 3"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:237
msgctxt "@label"
msgid "Firmware version"
msgstr "Üretici yazılımı sürümü"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:249
msgctxt "@label"
msgid "Address"
msgstr "Adres"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:263
msgctxt "@label"
msgid "The printer at this address has not yet responded."
msgstr "Bu adresteki yazıcı henüz yanıt vermedi."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:268
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38
msgctxt "@action:button"
msgid "Connect"
msgstr "Bağlan"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:280
msgctxt "@label:"
msgid "Print Again"
msgstr "Yeniden Yazdır"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:289
msgctxt "@title:window"
msgid "Printer Address"
msgstr "Yazıcı Adresi"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:319
msgctxt "@alabel"
msgid "Enter the IP address or hostname of your printer on the network."
msgstr "IP adresini veya yazıcınızın ağ üzerindeki ana bilgisayar adını girin."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:346
msgctxt "@action:button"
msgid "Ok"
msgstr "Tamam"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37
msgctxt "@info:tooltip"
msgid "Connect to a printer"
msgstr "Yazıcıya Bağlan"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116
msgctxt "@info:tooltip"
msgid "Load the configuration of the printer into Cura"
msgstr "Yazıcı yapılandırmasını Curaya yükle"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117
msgctxt "@action:button"
msgid "Activate Configuration"
msgstr "Yapılandırmayı Etkinleştir"

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View file

@ -1,35 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Generic ABS profile. Serves as an example file, data in this file is not correct.
-->
<fdmmaterial xmlns="http://www.ultimaker.com/material">
<metadata>
<name>
<brand>Generic</brand>
<material>ABS</material>
<color>Generic</color>
</name>
<GUID>60636bb4-518f-42e7-8237-fe77b194ebe0</GUID>
<version>1</version>
<color_code>#8cb219</color_code>
</metadata>
<properties>
<density>1.10</density>
<diameter>2.85</diameter>
</properties>
<settings>
<setting key="print temperature">240</setting>
<setting key="heated bed temperature">80</setting>
<setting key="standby temperature">200</setting>
<machine>
<machine_identifier manufacturer="Ultimaker" product="Ultimaker 2+"/>
<machine_identifier manufacturer="Ultimaker" product="Ultimaker 2 Extended+"/>
<hotend id="0.25 mm" />
<hotend id="0.4 mm" />
<hotend id="0.6 mm" />
<hotend id="0.8 mm" />
</machine>
</settings>
</fdmmaterial>

View file

@ -1,35 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Generic CPE profile. Serves as an example file, data in this file is not correct.
-->
<fdmmaterial xmlns="http://www.ultimaker.com/material">
<metadata>
<name>
<brand>Generic</brand>
<material>CPE</material>
<color>Generic</color>
</name>
<GUID>12f41353-1a33-415e-8b4f-a775a6c70cc6</GUID>
<version>1</version>
<color_code>#159499</color_code>
</metadata>
<properties>
<density>1.27</density>
<diameter>2.85</diameter>
</properties>
<settings>
<setting key="print temperature">250</setting>
<setting key="heated bed temperature">70</setting>
<setting key="standby temperature">175</setting>
<machine>
<machine_identifier manufacturer="Ultimaker" product="Ultimaker 2+"/>
<machine_identifier manufacturer="Ultimaker" product="Ultimaker 2 Extended+"/>
<hotend id="0.25 mm" />
<hotend id="0.4 mm" />
<hotend id="0.6 mm" />
<hotend id="0.8 mm" />
</machine>
</settings>
</fdmmaterial>

View file

@ -1,39 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Generic CPE+ profile. Serves as an example file, data in this file is not correct.
-->
<fdmmaterial xmlns="http://www.ultimaker.com/material">
<metadata>
<name>
<brand>Generic</brand>
<material>CPE+</material>
<color>Generic</color>
</name>
<GUID>e2409626-b5a0-4025-b73e-b58070219259</GUID>
<version>1</version>
<color_code>#3633F2</color_code>
</metadata>
<properties>
<density>1.18</density>
<diameter>2.85</diameter>
</properties>
<settings>
<setting key="hardware compatible">no</setting><!-- This material is not supported on most printers due to high temperatures -->
<setting key="print temperature">260</setting>
<setting key="heated bed temperature">110</setting>
<setting key="standby temperature">175</setting>
<machine>
<machine_identifier manufacturer="Ultimaker" product="Ultimaker 2+"/>
<machine_identifier manufacturer="Ultimaker" product="Ultimaker 2 Extended+"/>
<setting key="hardware compatible">yes</setting>
<hotend id="0.25 mm">
<setting key="hardware compatible">no</setting>
</hotend>
<hotend id="0.4 mm" />
<hotend id="0.6 mm" />
<hotend id="0.8 mm" />
</machine>
</settings>
</fdmmaterial>

View file

@ -1,36 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Generic Nylon profile. Serves as an example file, data in this file is not correct.
-->
<fdmmaterial xmlns="http://www.ultimaker.com/material">
<metadata>
<name>
<brand>Generic</brand>
<material>Nylon</material>
<color>Generic</color>
</name>
<GUID>28fb4162-db74-49e1-9008-d05f1e8bef5c</GUID>
<version>1</version>
<color_code>#3DF266</color_code>
</metadata>
<properties>
<density>1.14</density>
<diameter>2.85</diameter>
</properties>
<settings>
<setting key="print temperature">250</setting>
<setting key="heated bed temperature">60</setting>
<setting key="standby temperature">175</setting>
<machine>
<machine_identifier manufacturer="Ultimaker" product="Ultimaker 2+"/>
<machine_identifier manufacturer="Ultimaker" product="Ultimaker 2 Extended+"/>
<setting key="hardware compatible">yes</setting>
<hotend id="0.25 mm" />
<hotend id="0.4 mm" />
<hotend id="0.6 mm" />
<hotend id="0.8 mm" />
</machine>
</settings>
</fdmmaterial>

View file

@ -1,37 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Generic PC profile. Serves as an example file, data in this file is not correct.
-->
<fdmmaterial xmlns="http://www.ultimaker.com/material">
<metadata>
<name>
<brand>Generic</brand>
<material>PC</material>
<color>Generic</color>
</name>
<GUID>98c05714-bf4e-4455-ba27-57d74fe331e4</GUID>
<version>1</version>
<color_code>#F29030</color_code>
</metadata>
<properties>
<density>1.19</density>
<diameter>2.85</diameter>
</properties>
<settings>
<setting key="hardware compatible">no</setting><!-- This material is not supported on most printers due to high temperatures -->
<setting key="print temperature">260</setting>
<setting key="heated bed temperature">110</setting>
<setting key="standby temperature">175</setting>
<machine>
<machine_identifier manufacturer="Ultimaker" product="Ultimaker 2+"/>
<machine_identifier manufacturer="Ultimaker" product="Ultimaker 2 Extended+"/>
<setting key="hardware compatible">yes</setting>
<hotend id="0.25 mm" />
<hotend id="0.4 mm" />
<hotend id="0.6 mm" />
<hotend id="0.8 mm" />
</machine>
</settings>
</fdmmaterial>

View file

@ -1,51 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Generic PLA profile. Serves as an example file, data in this file is not correct.
-->
<fdmmaterial xmlns="http://www.ultimaker.com/material">
<metadata>
<name>
<brand>Generic</brand>
<material>PLA</material>
<color>Generic</color>
</name>
<GUID>506c9f0d-e3aa-4bd4-b2d2-23e2425b1aa9</GUID>
<version>1</version>
<color_code>#ffc924</color_code>
</metadata>
<properties>
<density>1.24</density>
<diameter>2.85</diameter>
</properties>
<settings>
<setting key="print temperature">200</setting>
<setting key="heated bed temperature">60</setting>
<setting key="standby temperature">175</setting>
<machine>
<machine_identifier manufacturer="Ultimaker" product="Ultimaker 2+"/>
<machine_identifier manufacturer="Ultimaker" product="Ultimaker 2 Extended+"/>
<hotend id="0.25 mm" />
<hotend id="0.4 mm" />
<hotend id="0.6 mm" />
<hotend id="0.8 mm" />
</machine>
<machine>
<machine_identifier manufacturer="Ultimaker" product="Ultimaker 2"/>
<machine_identifier manufacturer="Ultimaker" product="Ultimaker 2 Go"/>
<machine_identifier manufacturer="Ultimaker" product="Ultimaker 2 Extended"/>
<setting key="standby temperature">150</setting>
<setting key="processing temperature graph">
<point flow="2" temperature="180"/>
<point flow="10" temperature="230"/>
</setting>
</machine>
<machine>
<machine_identifier manufacturer="Ultimaker" product="Ultimaker Original"/>
<setting key="standby temperature">150</setting>
</machine>
</settings>
</fdmmaterial>

View file

@ -1,39 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Generic TPU 95A profile. Serves as an example file, data in this file is not correct.
-->
<fdmmaterial xmlns="http://www.ultimaker.com/material">
<metadata>
<name>
<brand>Generic</brand>
<material>TPU 95A</material>
<color>Generic</color>
</name>
<GUID>1d52b2be-a3a2-41de-a8b1-3bcdb5618695</GUID>
<version>1</version>
<color_code>#B22744</color_code>
</metadata>
<properties>
<density>1.22</density>
<diameter>2.85</diameter>
</properties>
<settings>
<setting key="hardware compatible">no</setting><!-- This material is not supported on most printers due to high temperatures -->
<setting key="print temperature">260</setting>
<setting key="heated bed temperature">110</setting>
<setting key="standby temperature">175</setting>
<machine>
<machine_identifier manufacturer="Ultimaker" product="Ultimaker 2+"/>
<machine_identifier manufacturer="Ultimaker" product="Ultimaker 2 Extended+"/>
<setting key="hardware compatible">yes</setting>
<hotend id="0.25 mm" />
<hotend id="0.4 mm" />
<hotend id="0.6 mm" />
<hotend id="0.8 mm">
<setting key="hardware compatible">no</setting>
</hotend>
</machine>
</settings>
</fdmmaterial>

View file

@ -1,35 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Automatically generated ABS profile. Data in this file may not be not correct.
-->
<fdmmaterial xmlns="http://www.ultimaker.com/material">
<metadata>
<name>
<brand>Ultimaker</brand>
<material>ABS</material>
<color>Black</color>
</name>
<GUID>2f9d2279-9b0e-4765-bf9b-d1e1e13f3c49</GUID>
<version>0</version>
<color_code>#2a292a</color_code>
</metadata>
<properties>
<density>1.10</density>
<diameter>2.85</diameter>
</properties>
<settings>
<setting key="print temperature">240</setting>
<setting key="heated bed temperature">80</setting>
<setting key="standby temperature">200</setting>
<machine>
<machine_identifier manufacturer="Ultimaker" product="Ultimaker 2+"/>
<machine_identifier manufacturer="Ultimaker" product="Ultimaker 2 Extended+"/>
<hotend id="0.25 mm" />
<hotend id="0.4 mm" />
<hotend id="0.6 mm" />
<hotend id="0.8 mm" />
</machine>
</settings>
</fdmmaterial>

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