Merge branch 'master' of https://github.com/Ultimaker/Cura
|
@ -6,6 +6,9 @@ include(GNUInstallDirs)
|
||||||
|
|
||||||
set(URANIUM_SCRIPTS_DIR "${CMAKE_SOURCE_DIR}/../uranium/scripts" CACHE DIRECTORY "The location of the scripts directory of the Uranium repository")
|
set(URANIUM_SCRIPTS_DIR "${CMAKE_SOURCE_DIR}/../uranium/scripts" CACHE DIRECTORY "The location of the scripts directory of the Uranium repository")
|
||||||
|
|
||||||
|
set(CURA_VERSION "master" CACHE STRING "Version name of Cura")
|
||||||
|
configure_file(cura/CuraVersion.py.in CuraVersion.py @ONLY)
|
||||||
|
|
||||||
if(NOT ${URANIUM_SCRIPTS_DIR} STREQUAL "")
|
if(NOT ${URANIUM_SCRIPTS_DIR} STREQUAL "")
|
||||||
# Extract Strings
|
# Extract Strings
|
||||||
add_custom_target(extract-messages ${URANIUM_SCRIPTS_DIR}/extract-messages ${CMAKE_SOURCE_DIR} cura)
|
add_custom_target(extract-messages ${URANIUM_SCRIPTS_DIR}/extract-messages ${CMAKE_SOURCE_DIR} cura)
|
||||||
|
@ -60,10 +63,12 @@ install(DIRECTORY resources DESTINATION ${CMAKE_INSTALL_DATADIR}/cura)
|
||||||
install(DIRECTORY plugins DESTINATION lib/cura)
|
install(DIRECTORY plugins DESTINATION lib/cura)
|
||||||
install(FILES cura_app.py DESTINATION ${CMAKE_INSTALL_BINDIR} PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
|
install(FILES cura_app.py DESTINATION ${CMAKE_INSTALL_BINDIR} PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
|
||||||
if(NOT APPLE AND NOT WIN32)
|
if(NOT APPLE AND NOT WIN32)
|
||||||
install(DIRECTORY cura DESTINATION lib/python${PYTHON_VERSION_MAJOR}/dist-packages)
|
install(DIRECTORY cura DESTINATION lib/python${PYTHON_VERSION_MAJOR}/dist-packages FILES_MATCHING PATTERN *.py)
|
||||||
|
install(FILES ${CMAKE_BINARY_DIR}/CuraVersion.py DESTINATION lib/python${PYTHON_VERSION_MAJOR}/dist-packages/cura)
|
||||||
install(FILES cura.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications)
|
install(FILES cura.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications)
|
||||||
else()
|
else()
|
||||||
install(DIRECTORY cura DESTINATION lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages)
|
install(DIRECTORY cura DESTINATION lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages FILES_MATCHING PATTERN *.py)
|
||||||
|
install(FILES ${CMAKE_BINARY_DIR}/CuraVersion.py DESTINATION lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages/cura)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
include(CPackConfig.cmake)
|
include(CPackConfig.cmake)
|
||||||
|
|
|
@ -41,6 +41,7 @@ Third party plugins
|
||||||
-------------
|
-------------
|
||||||
* [Print time calculator](https://github.com/nallath/PrintCostCalculator)
|
* [Print time calculator](https://github.com/nallath/PrintCostCalculator)
|
||||||
* [Post processing plugin](https://github.com/nallath/PostProcessingPlugin)
|
* [Post processing plugin](https://github.com/nallath/PostProcessingPlugin)
|
||||||
|
* [Barbarian Plugin](https://github.com/nallath/BarbarianPlugin) Simple scale tool for imperial to metric.
|
||||||
|
|
||||||
Making profiles for other printers
|
Making profiles for other printers
|
||||||
----------------------------------
|
----------------------------------
|
||||||
|
|
|
@ -12,6 +12,9 @@ from UM.Math.Color import Color
|
||||||
from UM.Math.AxisAlignedBox import AxisAlignedBox
|
from UM.Math.AxisAlignedBox import AxisAlignedBox
|
||||||
from UM.Math.Polygon import Polygon
|
from UM.Math.Polygon import Polygon
|
||||||
|
|
||||||
|
from UM.View.RenderBatch import RenderBatch
|
||||||
|
from UM.View.GL.OpenGL import OpenGL
|
||||||
|
|
||||||
import numpy
|
import numpy
|
||||||
|
|
||||||
class BuildVolume(SceneNode):
|
class BuildVolume(SceneNode):
|
||||||
|
@ -24,20 +27,24 @@ class BuildVolume(SceneNode):
|
||||||
self._height = 0
|
self._height = 0
|
||||||
self._depth = 0
|
self._depth = 0
|
||||||
|
|
||||||
self._material = None
|
self._shader = None
|
||||||
|
|
||||||
self._grid_mesh = None
|
self._grid_mesh = None
|
||||||
self._grid_material = None
|
self._grid_shader = None
|
||||||
|
|
||||||
self._disallowed_areas = []
|
self._disallowed_areas = []
|
||||||
self._disallowed_area_mesh = None
|
self._disallowed_area_mesh = None
|
||||||
|
|
||||||
self.setCalculateBoundingBox(False)
|
self.setCalculateBoundingBox(False)
|
||||||
|
|
||||||
|
self._active_profile = None
|
||||||
self._active_instance = None
|
self._active_instance = None
|
||||||
Application.getInstance().getMachineManager().activeMachineInstanceChanged.connect(self._onActiveInstanceChanged)
|
Application.getInstance().getMachineManager().activeMachineInstanceChanged.connect(self._onActiveInstanceChanged)
|
||||||
self._onActiveInstanceChanged()
|
self._onActiveInstanceChanged()
|
||||||
|
|
||||||
|
Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onActiveProfileChanged)
|
||||||
|
self._onActiveProfileChanged()
|
||||||
|
|
||||||
def setWidth(self, width):
|
def setWidth(self, width):
|
||||||
if width: self._width = width
|
if width: self._width = width
|
||||||
|
|
||||||
|
@ -57,78 +64,72 @@ class BuildVolume(SceneNode):
|
||||||
if not self.getMeshData():
|
if not self.getMeshData():
|
||||||
return True
|
return True
|
||||||
|
|
||||||
if not self._material:
|
if not self._shader:
|
||||||
self._material = renderer.createMaterial(
|
self._shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "default.shader"))
|
||||||
Resources.getPath(Resources.Shaders, "basic.vert"),
|
self._grid_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "grid.shader"))
|
||||||
Resources.getPath(Resources.Shaders, "vertexcolor.frag")
|
|
||||||
)
|
|
||||||
self._grid_material = renderer.createMaterial(
|
|
||||||
Resources.getPath(Resources.Shaders, "basic.vert"),
|
|
||||||
Resources.getPath(Resources.Shaders, "grid.frag")
|
|
||||||
)
|
|
||||||
self._grid_material.setUniformValue("u_gridColor0", Color(245, 245, 245, 255))
|
|
||||||
self._grid_material.setUniformValue("u_gridColor1", Color(205, 202, 201, 255))
|
|
||||||
|
|
||||||
renderer.queueNode(self, material = self._material, mode = Renderer.RenderLines)
|
renderer.queueNode(self, mode = RenderBatch.RenderMode.Lines)
|
||||||
renderer.queueNode(self, mesh = self._grid_mesh, material = self._grid_material, force_single_sided = True)
|
renderer.queueNode(self, mesh = self._grid_mesh, shader = self._grid_shader, backface_cull = True)
|
||||||
if self._disallowed_area_mesh:
|
if self._disallowed_area_mesh:
|
||||||
renderer.queueNode(self, mesh = self._disallowed_area_mesh, material = self._material)
|
renderer.queueNode(self, mesh = self._disallowed_area_mesh, shader = self._shader, transparent = True, backface_cull = True, sort = -9)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def rebuild(self):
|
def rebuild(self):
|
||||||
if self._width == 0 or self._height == 0 or self._depth == 0:
|
if self._width == 0 or self._height == 0 or self._depth == 0:
|
||||||
return
|
return
|
||||||
|
|
||||||
minW = -self._width / 2
|
min_w = -self._width / 2
|
||||||
maxW = self._width / 2
|
max_w = self._width / 2
|
||||||
minH = 0.0
|
min_h = 0.0
|
||||||
maxH = self._height
|
max_h = self._height
|
||||||
minD = -self._depth / 2
|
min_d = -self._depth / 2
|
||||||
maxD = self._depth / 2
|
max_d = self._depth / 2
|
||||||
|
|
||||||
mb = MeshBuilder()
|
mb = MeshBuilder()
|
||||||
|
|
||||||
mb.addLine(Vector(minW, minH, minD), Vector(maxW, minH, minD), color = self.VolumeOutlineColor)
|
mb.addLine(Vector(min_w, min_h, min_d), Vector(max_w, min_h, min_d), color = self.VolumeOutlineColor)
|
||||||
mb.addLine(Vector(minW, minH, minD), Vector(minW, maxH, minD), color = self.VolumeOutlineColor)
|
mb.addLine(Vector(min_w, min_h, min_d), Vector(min_w, max_h, min_d), color = self.VolumeOutlineColor)
|
||||||
mb.addLine(Vector(minW, maxH, minD), Vector(maxW, maxH, minD), color = self.VolumeOutlineColor)
|
mb.addLine(Vector(min_w, max_h, min_d), Vector(max_w, max_h, min_d), color = self.VolumeOutlineColor)
|
||||||
mb.addLine(Vector(maxW, minH, minD), Vector(maxW, maxH, minD), color = self.VolumeOutlineColor)
|
mb.addLine(Vector(max_w, min_h, min_d), Vector(max_w, max_h, min_d), color = self.VolumeOutlineColor)
|
||||||
|
|
||||||
mb.addLine(Vector(minW, minH, maxD), Vector(maxW, minH, maxD), color = self.VolumeOutlineColor)
|
mb.addLine(Vector(min_w, min_h, max_d), Vector(max_w, min_h, max_d), color = self.VolumeOutlineColor)
|
||||||
mb.addLine(Vector(minW, minH, maxD), Vector(minW, maxH, maxD), color = self.VolumeOutlineColor)
|
mb.addLine(Vector(min_w, min_h, max_d), Vector(min_w, max_h, max_d), color = self.VolumeOutlineColor)
|
||||||
mb.addLine(Vector(minW, maxH, maxD), Vector(maxW, maxH, maxD), color = self.VolumeOutlineColor)
|
mb.addLine(Vector(min_w, max_h, max_d), Vector(max_w, max_h, max_d), color = self.VolumeOutlineColor)
|
||||||
mb.addLine(Vector(maxW, minH, maxD), Vector(maxW, maxH, maxD), color = self.VolumeOutlineColor)
|
mb.addLine(Vector(max_w, min_h, max_d), Vector(max_w, max_h, max_d), color = self.VolumeOutlineColor)
|
||||||
|
|
||||||
mb.addLine(Vector(minW, minH, minD), Vector(minW, minH, maxD), color = self.VolumeOutlineColor)
|
mb.addLine(Vector(min_w, min_h, min_d), Vector(min_w, min_h, max_d), color = self.VolumeOutlineColor)
|
||||||
mb.addLine(Vector(maxW, minH, minD), Vector(maxW, minH, maxD), color = self.VolumeOutlineColor)
|
mb.addLine(Vector(max_w, min_h, min_d), Vector(max_w, min_h, max_d), color = self.VolumeOutlineColor)
|
||||||
mb.addLine(Vector(minW, maxH, minD), Vector(minW, maxH, maxD), color = self.VolumeOutlineColor)
|
mb.addLine(Vector(min_w, max_h, min_d), Vector(min_w, max_h, max_d), color = self.VolumeOutlineColor)
|
||||||
mb.addLine(Vector(maxW, maxH, minD), Vector(maxW, maxH, maxD), color = self.VolumeOutlineColor)
|
mb.addLine(Vector(max_w, max_h, min_d), Vector(max_w, max_h, max_d), color = self.VolumeOutlineColor)
|
||||||
|
|
||||||
self.setMeshData(mb.getData())
|
self.setMeshData(mb.getData())
|
||||||
|
|
||||||
mb = MeshBuilder()
|
mb = MeshBuilder()
|
||||||
mb.addQuad(
|
mb.addQuad(
|
||||||
Vector(minW, minH, minD),
|
Vector(min_w, min_h - 0.2, min_d),
|
||||||
Vector(maxW, minH, minD),
|
Vector(max_w, min_h - 0.2, min_d),
|
||||||
Vector(maxW, minH, maxD),
|
Vector(max_w, min_h - 0.2, max_d),
|
||||||
Vector(minW, minH, maxD)
|
Vector(min_w, min_h - 0.2, max_d)
|
||||||
)
|
)
|
||||||
self._grid_mesh = mb.getData()
|
self._grid_mesh = mb.getData()
|
||||||
for n in range(0, 6):
|
for n in range(0, 6):
|
||||||
v = self._grid_mesh.getVertex(n)
|
v = self._grid_mesh.getVertex(n)
|
||||||
self._grid_mesh.setVertexUVCoordinates(n, v[0], v[2])
|
self._grid_mesh.setVertexUVCoordinates(n, v[0], v[2])
|
||||||
|
|
||||||
|
disallowed_area_height = 0.1
|
||||||
disallowed_area_size = 0
|
disallowed_area_size = 0
|
||||||
if self._disallowed_areas:
|
if self._disallowed_areas:
|
||||||
mb = MeshBuilder()
|
mb = MeshBuilder()
|
||||||
|
color = Color(0.0, 0.0, 0.0, 0.15)
|
||||||
for polygon in self._disallowed_areas:
|
for polygon in self._disallowed_areas:
|
||||||
points = polygon.getPoints()
|
points = polygon.getPoints()
|
||||||
mb.addQuad(
|
first = Vector(self._clamp(points[0][0], min_w, max_w), disallowed_area_height, self._clamp(points[0][1], min_d, max_d))
|
||||||
Vector(points[0, 0], 0.1, points[0, 1]),
|
previous_point = Vector(self._clamp(points[0][0], min_w, max_w), disallowed_area_height, self._clamp(points[0][1], min_d, max_d))
|
||||||
Vector(points[1, 0], 0.1, points[1, 1]),
|
for point in points:
|
||||||
Vector(points[2, 0], 0.1, points[2, 1]),
|
new_point = Vector(self._clamp(point[0], min_w, max_w), disallowed_area_height, self._clamp(point[1], min_d, max_d))
|
||||||
Vector(points[3, 0], 0.1, points[3, 1]),
|
mb.addFace(first, previous_point, new_point, color = color)
|
||||||
color = Color(174, 174, 174, 255)
|
previous_point = new_point
|
||||||
)
|
|
||||||
# Find the largest disallowed area to exclude it from the maximum scale bounds
|
# Find the largest disallowed area to exclude it from the maximum scale bounds
|
||||||
size = abs(numpy.max(points[:, 1]) - numpy.min(points[:, 1]))
|
size = abs(numpy.max(points[:, 1]) - numpy.min(points[:, 1]))
|
||||||
disallowed_area_size = max(size, disallowed_area_size)
|
disallowed_area_size = max(size, disallowed_area_size)
|
||||||
|
@ -137,24 +138,17 @@ class BuildVolume(SceneNode):
|
||||||
else:
|
else:
|
||||||
self._disallowed_area_mesh = None
|
self._disallowed_area_mesh = None
|
||||||
|
|
||||||
self._aabb = AxisAlignedBox(minimum = Vector(minW, minH - 1.0, minD), maximum = Vector(maxW, maxH, maxD))
|
self._aabb = AxisAlignedBox(minimum = Vector(min_w, min_h - 1.0, min_d), maximum = Vector(max_w, max_h, max_d))
|
||||||
|
|
||||||
skirt_size = 0.0
|
skirt_size = 0.0
|
||||||
|
|
||||||
#profile = Application.getInstance().getMachineManager().getActiveProfile()
|
profile = Application.getInstance().getMachineManager().getActiveProfile()
|
||||||
#if profile:
|
if profile:
|
||||||
#if profile.getSettingValue("adhesion_type") == "skirt":
|
skirt_size = self._getSkirtSize(profile)
|
||||||
#skirt_size = profile.getSettingValue("skirt_line_count") * profile.getSettingValue("skirt_line_width") + profile.getSettingValue("skirt_gap")
|
|
||||||
#elif profile.getSettingValue("adhesion_type") == "brim":
|
|
||||||
#skirt_size = profile.getSettingValue("brim_line_count") * profile.getSettingValue("skirt_line_width")
|
|
||||||
#else:
|
|
||||||
#skirt_size = profile.getSettingValue("skirt_line_width")
|
|
||||||
|
|
||||||
#skirt_size += profile.getSettingValue("skirt_line_width")
|
|
||||||
|
|
||||||
scale_to_max_bounds = AxisAlignedBox(
|
scale_to_max_bounds = AxisAlignedBox(
|
||||||
minimum = Vector(minW + skirt_size, minH, minD + skirt_size + disallowed_area_size),
|
minimum = Vector(min_w + skirt_size, min_h, min_d + skirt_size + disallowed_area_size),
|
||||||
maximum = Vector(maxW - skirt_size, maxH, maxD - skirt_size - disallowed_area_size)
|
maximum = Vector(max_w - skirt_size, max_h, max_d - skirt_size - disallowed_area_size)
|
||||||
)
|
)
|
||||||
|
|
||||||
Application.getInstance().getController().getScene()._maximum_bounds = scale_to_max_bounds
|
Application.getInstance().getController().getScene()._maximum_bounds = scale_to_max_bounds
|
||||||
|
@ -167,12 +161,107 @@ class BuildVolume(SceneNode):
|
||||||
self._height = self._active_instance.getMachineSettingValue("machine_height")
|
self._height = self._active_instance.getMachineSettingValue("machine_height")
|
||||||
self._depth = self._active_instance.getMachineSettingValue("machine_depth")
|
self._depth = self._active_instance.getMachineSettingValue("machine_depth")
|
||||||
|
|
||||||
disallowed_areas = self._active_instance.getMachineSettingValue("machine_disallowed_areas")
|
self._updateDisallowedAreas()
|
||||||
areas = []
|
|
||||||
if disallowed_areas:
|
|
||||||
for area in disallowed_areas:
|
|
||||||
areas.append(Polygon(numpy.array(area, numpy.float32)))
|
|
||||||
|
|
||||||
self._disallowed_areas = areas
|
|
||||||
|
|
||||||
self.rebuild()
|
self.rebuild()
|
||||||
|
|
||||||
|
def _onActiveProfileChanged(self):
|
||||||
|
if self._active_profile:
|
||||||
|
self._active_profile.settingValueChanged.disconnect(self._onSettingValueChanged)
|
||||||
|
|
||||||
|
self._active_profile = Application.getInstance().getMachineManager().getActiveProfile()
|
||||||
|
if self._active_profile:
|
||||||
|
self._active_profile.settingValueChanged.connect(self._onSettingValueChanged)
|
||||||
|
self._updateDisallowedAreas()
|
||||||
|
self.rebuild()
|
||||||
|
|
||||||
|
def _onSettingValueChanged(self, setting):
|
||||||
|
if setting in self._skirt_settings:
|
||||||
|
self._updateDisallowedAreas()
|
||||||
|
self.rebuild()
|
||||||
|
|
||||||
|
def _updateDisallowedAreas(self):
|
||||||
|
if not self._active_instance or not self._active_profile:
|
||||||
|
return
|
||||||
|
|
||||||
|
disallowed_areas = self._active_instance.getMachineSettingValue("machine_disallowed_areas")
|
||||||
|
areas = []
|
||||||
|
|
||||||
|
skirt_size = 0.0
|
||||||
|
if self._active_profile:
|
||||||
|
skirt_size = self._getSkirtSize(self._active_profile)
|
||||||
|
|
||||||
|
if disallowed_areas:
|
||||||
|
for area in disallowed_areas:
|
||||||
|
poly = Polygon(numpy.array(area, numpy.float32))
|
||||||
|
poly = poly.getMinkowskiHull(Polygon(numpy.array([
|
||||||
|
[-skirt_size, 0],
|
||||||
|
[-skirt_size * 0.707, skirt_size * 0.707],
|
||||||
|
[0, skirt_size],
|
||||||
|
[skirt_size * 0.707, skirt_size * 0.707],
|
||||||
|
[skirt_size, 0],
|
||||||
|
[skirt_size * 0.707, -skirt_size * 0.707],
|
||||||
|
[0, -skirt_size],
|
||||||
|
[-skirt_size * 0.707, -skirt_size * 0.707]
|
||||||
|
], numpy.float32)))
|
||||||
|
|
||||||
|
areas.append(poly)
|
||||||
|
|
||||||
|
if skirt_size > 0:
|
||||||
|
half_machine_width = self._active_instance.getMachineSettingValue("machine_width") / 2
|
||||||
|
half_machine_depth = self._active_instance.getMachineSettingValue("machine_depth") / 2
|
||||||
|
|
||||||
|
areas.append(Polygon(numpy.array([
|
||||||
|
[-half_machine_width, -half_machine_depth],
|
||||||
|
[-half_machine_width, half_machine_depth],
|
||||||
|
[-half_machine_width + skirt_size, half_machine_depth - skirt_size],
|
||||||
|
[-half_machine_width + skirt_size, -half_machine_depth + skirt_size]
|
||||||
|
], numpy.float32)))
|
||||||
|
|
||||||
|
areas.append(Polygon(numpy.array([
|
||||||
|
[half_machine_width, half_machine_depth],
|
||||||
|
[half_machine_width, -half_machine_depth],
|
||||||
|
[half_machine_width - skirt_size, -half_machine_depth + skirt_size],
|
||||||
|
[half_machine_width - skirt_size, half_machine_depth - skirt_size]
|
||||||
|
], numpy.float32)))
|
||||||
|
|
||||||
|
areas.append(Polygon(numpy.array([
|
||||||
|
[-half_machine_width, half_machine_depth],
|
||||||
|
[half_machine_width, half_machine_depth],
|
||||||
|
[half_machine_width - skirt_size, half_machine_depth - skirt_size],
|
||||||
|
[-half_machine_width + skirt_size, half_machine_depth - skirt_size]
|
||||||
|
], numpy.float32)))
|
||||||
|
|
||||||
|
areas.append(Polygon(numpy.array([
|
||||||
|
[half_machine_width, -half_machine_depth],
|
||||||
|
[-half_machine_width, -half_machine_depth],
|
||||||
|
[-half_machine_width + skirt_size, -half_machine_depth + skirt_size],
|
||||||
|
[half_machine_width - skirt_size, -half_machine_depth + skirt_size]
|
||||||
|
], numpy.float32)))
|
||||||
|
|
||||||
|
self._disallowed_areas = areas
|
||||||
|
|
||||||
|
def _getSkirtSize(self, profile):
|
||||||
|
skirt_size = 0.0
|
||||||
|
|
||||||
|
adhesion_type = profile.getSettingValue("adhesion_type")
|
||||||
|
if adhesion_type == "skirt":
|
||||||
|
skirt_distance = profile.getSettingValue("skirt_gap")
|
||||||
|
skirt_line_count = profile.getSettingValue("skirt_line_count")
|
||||||
|
skirt_size = skirt_distance + (skirt_line_count * profile.getSettingValue("skirt_line_width"))
|
||||||
|
elif adhesion_type == "brim":
|
||||||
|
skirt_size = profile.getSettingValue("brim_width")
|
||||||
|
elif adhesion_type == "raft":
|
||||||
|
skirt_size = profile.getSettingValue("raft_margin")
|
||||||
|
|
||||||
|
if profile.getSettingValue("draft_shield_enabled"):
|
||||||
|
skirt_size += profile.getSettingValue("draft_shield_dist")
|
||||||
|
|
||||||
|
skirt_size += profile.getSettingValue("xy_offset")
|
||||||
|
|
||||||
|
return skirt_size
|
||||||
|
|
||||||
|
def _clamp(self, value, min_value, max_value):
|
||||||
|
return max(min(value, max_value), min_value)
|
||||||
|
|
||||||
|
_skirt_settings = ["adhesion_type", "skirt_gap", "skirt_line_count", "skirt_line_width", "brim_width", "brim_line_count", "raft_margin", "draft_shield_enabled", "draft_shield_dist", "xy_offset"]
|
||||||
|
|
|
@ -31,6 +31,8 @@ class ConvexHullJob(Job):
|
||||||
self._node.callDecoration("setConvexHullJob", None)
|
self._node.callDecoration("setConvexHullJob", None)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
Job.yieldThread()
|
||||||
|
|
||||||
else:
|
else:
|
||||||
if not self._node.getMeshData():
|
if not self._node.getMeshData():
|
||||||
return
|
return
|
||||||
|
|
|
@ -7,6 +7,8 @@ from UM.Math.Color import Color
|
||||||
from UM.Math.Vector import Vector
|
from UM.Math.Vector import Vector
|
||||||
from UM.Mesh.MeshData import MeshData
|
from UM.Mesh.MeshData import MeshData
|
||||||
|
|
||||||
|
from UM.View.GL.OpenGL import OpenGL
|
||||||
|
|
||||||
import numpy
|
import numpy
|
||||||
|
|
||||||
class ConvexHullNode(SceneNode):
|
class ConvexHullNode(SceneNode):
|
||||||
|
@ -15,21 +17,21 @@ class ConvexHullNode(SceneNode):
|
||||||
|
|
||||||
self.setCalculateBoundingBox(False)
|
self.setCalculateBoundingBox(False)
|
||||||
|
|
||||||
self._material = None
|
self._shader = None
|
||||||
|
|
||||||
self._original_parent = parent
|
self._original_parent = parent
|
||||||
|
|
||||||
self._inherit_orientation = False
|
self._inherit_orientation = False
|
||||||
self._inherit_scale = False
|
self._inherit_scale = False
|
||||||
|
|
||||||
self._color = Color(35, 35, 35, 0.5)
|
self._color = Color(35, 35, 35, 128)
|
||||||
|
|
||||||
self._node = node
|
self._node = node
|
||||||
self._node.transformationChanged.connect(self._onNodePositionChanged)
|
self._node.transformationChanged.connect(self._onNodePositionChanged)
|
||||||
self._node.parentChanged.connect(self._onNodeParentChanged)
|
self._node.parentChanged.connect(self._onNodeParentChanged)
|
||||||
self._node.decoratorsChanged.connect(self._onNodeDecoratorsChanged)
|
self._node.decoratorsChanged.connect(self._onNodeDecoratorsChanged)
|
||||||
self._onNodeDecoratorsChanged(self._node)
|
self._onNodeDecoratorsChanged(self._node)
|
||||||
self.convexHullHeadMesh = None
|
self._convex_hull_head_mesh = None
|
||||||
self._hull = hull
|
self._hull = hull
|
||||||
|
|
||||||
hull_points = self._hull.getPoints()
|
hull_points = self._hull.getPoints()
|
||||||
|
@ -38,17 +40,17 @@ class ConvexHullNode(SceneNode):
|
||||||
self.setMeshData(hull_mesh)
|
self.setMeshData(hull_mesh)
|
||||||
convex_hull_head = self._node.callDecoration("getConvexHullHead")
|
convex_hull_head = self._node.callDecoration("getConvexHullHead")
|
||||||
if convex_hull_head:
|
if convex_hull_head:
|
||||||
self.convexHullHeadMesh = self.createHullMesh(convex_hull_head.getPoints())
|
self._convex_hull_head_mesh = self.createHullMesh(convex_hull_head.getPoints())
|
||||||
|
|
||||||
def createHullMesh(self, hull_points):
|
def createHullMesh(self, hull_points):
|
||||||
mesh = MeshData()
|
mesh = MeshData()
|
||||||
if len(hull_points) > 3:
|
if len(hull_points) > 3:
|
||||||
center = (hull_points.min(0) + hull_points.max(0)) / 2.0
|
center = (hull_points.min(0) + hull_points.max(0)) / 2.0
|
||||||
mesh.addVertex(center[0], 0.1, center[1])
|
mesh.addVertex(center[0], -0.1, center[1])
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
for point in hull_points:
|
for point in hull_points:
|
||||||
mesh.addVertex(point[0], 0.1, point[1])
|
mesh.addVertex(point[0], -0.1, point[1])
|
||||||
indices = []
|
indices = []
|
||||||
for i in range(len(hull_points) - 1):
|
for i in range(len(hull_points) - 1):
|
||||||
indices.append([0, i + 1, i + 2])
|
indices.append([0, i + 1, i + 2])
|
||||||
|
@ -62,14 +64,14 @@ class ConvexHullNode(SceneNode):
|
||||||
return self._node
|
return self._node
|
||||||
|
|
||||||
def render(self, renderer):
|
def render(self, renderer):
|
||||||
if not self._material:
|
if not self._shader:
|
||||||
self._material = renderer.createMaterial(Resources.getPath(Resources.Shaders, "basic.vert"), Resources.getPath(Resources.Shaders, "color.frag"))
|
self._shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "default.shader"))
|
||||||
|
self._shader.setUniformValue("u_color", self._color)
|
||||||
|
|
||||||
if self.getParent():
|
if self.getParent():
|
||||||
self._material.setUniformValue("u_color", self._color)
|
renderer.queueNode(self, transparent = True, shader = self._shader, backface_cull = True, sort = -8)
|
||||||
renderer.queueNode(self, material = self._material, transparent = True)
|
if self._convex_hull_head_mesh:
|
||||||
if self.convexHullHeadMesh:
|
renderer.queueNode(self, shader = self._shader, transparent = True, mesh = self._convex_hull_head_mesh, backface_cull = True, sort = -8)
|
||||||
renderer.queueNode(self, material = self._material,transparent = True, mesh = self.convexHullHeadMesh)
|
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
|
@ -3,11 +3,6 @@
|
||||||
|
|
||||||
import platform
|
import platform
|
||||||
|
|
||||||
if platform.system() == "Linux": # Needed for platform.linux_distribution, which is not available on Windows and OSX
|
|
||||||
# For Ubuntu: https://bugs.launchpad.net/ubuntu/+source/python-qt4/+bug/941826
|
|
||||||
if platform.linux_distribution()[0] in ("Ubuntu", ): # Just in case it also happens on Debian, so it can be added
|
|
||||||
from OpenGL import GL
|
|
||||||
|
|
||||||
from UM.Qt.QtApplication import QtApplication
|
from UM.Qt.QtApplication import QtApplication
|
||||||
from UM.Scene.SceneNode import SceneNode
|
from UM.Scene.SceneNode import SceneNode
|
||||||
from UM.Scene.Camera import Camera
|
from UM.Scene.Camera import Camera
|
||||||
|
@ -15,6 +10,7 @@ from UM.Scene.Platform import Platform
|
||||||
from UM.Math.Vector import Vector
|
from UM.Math.Vector import Vector
|
||||||
from UM.Math.Matrix import Matrix
|
from UM.Math.Matrix import Matrix
|
||||||
from UM.Math.Quaternion import Quaternion
|
from UM.Math.Quaternion import Quaternion
|
||||||
|
from UM.Math.AxisAlignedBox import AxisAlignedBox
|
||||||
from UM.Resources import Resources
|
from UM.Resources import Resources
|
||||||
from UM.Scene.ToolHandle import ToolHandle
|
from UM.Scene.ToolHandle import ToolHandle
|
||||||
from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
|
from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
|
||||||
|
@ -45,6 +41,7 @@ from . import PrintInformation
|
||||||
from . import CuraActions
|
from . import CuraActions
|
||||||
from . import MultiMaterialDecorator
|
from . import MultiMaterialDecorator
|
||||||
from . import ZOffsetDecorator
|
from . import ZOffsetDecorator
|
||||||
|
from . import CuraSplashScreen
|
||||||
|
|
||||||
from PyQt5.QtCore import pyqtSlot, QUrl, Qt, pyqtSignal, pyqtProperty, QEvent, Q_ENUMS
|
from PyQt5.QtCore import pyqtSlot, QUrl, Qt, pyqtSignal, pyqtProperty, QEvent, Q_ENUMS
|
||||||
from PyQt5.QtGui import QColor, QIcon
|
from PyQt5.QtGui import QColor, QIcon
|
||||||
|
@ -58,6 +55,16 @@ import numpy
|
||||||
import copy
|
import copy
|
||||||
numpy.seterr(all="ignore")
|
numpy.seterr(all="ignore")
|
||||||
|
|
||||||
|
if platform.system() == "Linux": # Needed for platform.linux_distribution, which is not available on Windows and OSX
|
||||||
|
# For Ubuntu: https://bugs.launchpad.net/ubuntu/+source/python-qt4/+bug/941826
|
||||||
|
if platform.linux_distribution()[0] in ("Ubuntu", ): # Just in case it also happens on Debian, so it can be added
|
||||||
|
from OpenGL import GL
|
||||||
|
|
||||||
|
try:
|
||||||
|
from cura.CuraVersion import CuraVersion
|
||||||
|
except ImportError:
|
||||||
|
CuraVersion = "master" # [CodeStyle: Reflecting imported value]
|
||||||
|
|
||||||
class CuraApplication(QtApplication):
|
class CuraApplication(QtApplication):
|
||||||
class ResourceTypes:
|
class ResourceTypes:
|
||||||
QmlFiles = Resources.UserType + 1
|
QmlFiles = Resources.UserType + 1
|
||||||
|
@ -69,7 +76,7 @@ class CuraApplication(QtApplication):
|
||||||
if not hasattr(sys, "frozen"):
|
if not hasattr(sys, "frozen"):
|
||||||
Resources.addSearchPath(os.path.join(os.path.abspath(os.path.dirname(__file__)), ".."))
|
Resources.addSearchPath(os.path.join(os.path.abspath(os.path.dirname(__file__)), ".."))
|
||||||
|
|
||||||
super().__init__(name = "cura", version = "master")
|
super().__init__(name = "cura", version = CuraVersion)
|
||||||
|
|
||||||
self.setWindowIcon(QIcon(Resources.getPath(Resources.Images, "cura-icon.png")))
|
self.setWindowIcon(QIcon(Resources.getPath(Resources.Images, "cura-icon.png")))
|
||||||
|
|
||||||
|
@ -91,6 +98,7 @@ class CuraApplication(QtApplication):
|
||||||
self._i18n_catalog = None
|
self._i18n_catalog = None
|
||||||
self._previous_active_tool = None
|
self._previous_active_tool = None
|
||||||
self._platform_activity = False
|
self._platform_activity = False
|
||||||
|
self._scene_boundingbox = AxisAlignedBox()
|
||||||
self._job_name = None
|
self._job_name = None
|
||||||
|
|
||||||
self.getMachineManager().activeMachineInstanceChanged.connect(self._onActiveMachineChanged)
|
self.getMachineManager().activeMachineInstanceChanged.connect(self._onActiveMachineChanged)
|
||||||
|
@ -136,6 +144,9 @@ class CuraApplication(QtApplication):
|
||||||
parser.add_argument("--debug", dest="debug-mode", action="store_true", default=False, help="Enable detailed crash reports.")
|
parser.add_argument("--debug", dest="debug-mode", action="store_true", default=False, help="Enable detailed crash reports.")
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
|
if "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION" not in os.environ or os.environ["PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION"] != "cpp":
|
||||||
|
Logger.log("w", "Using Python implementation of Protobuf, expect bad performance!")
|
||||||
|
|
||||||
self._i18n_catalog = i18nCatalog("cura");
|
self._i18n_catalog = i18nCatalog("cura");
|
||||||
|
|
||||||
i18nCatalog.setTagReplacements({
|
i18nCatalog.setTagReplacements({
|
||||||
|
@ -147,7 +158,7 @@ class CuraApplication(QtApplication):
|
||||||
|
|
||||||
controller = self.getController()
|
controller = self.getController()
|
||||||
|
|
||||||
controller.setActiveView("MeshView")
|
controller.setActiveView("SolidView")
|
||||||
controller.setCameraTool("CameraTool")
|
controller.setCameraTool("CameraTool")
|
||||||
controller.setSelectionTool("SelectionTool")
|
controller.setSelectionTool("SelectionTool")
|
||||||
|
|
||||||
|
@ -162,13 +173,12 @@ class CuraApplication(QtApplication):
|
||||||
|
|
||||||
self._volume = BuildVolume.BuildVolume(root)
|
self._volume = BuildVolume.BuildVolume(root)
|
||||||
|
|
||||||
self.getRenderer().setLightPosition(Vector(0, 150, 0))
|
|
||||||
self.getRenderer().setBackgroundColor(QColor(245, 245, 245))
|
self.getRenderer().setBackgroundColor(QColor(245, 245, 245))
|
||||||
|
|
||||||
self._physics = PlatformPhysics.PlatformPhysics(controller, self._volume)
|
self._physics = PlatformPhysics.PlatformPhysics(controller, self._volume)
|
||||||
|
|
||||||
camera = Camera("3d", root)
|
camera = Camera("3d", root)
|
||||||
camera.setPosition(Vector(0, 250, 900))
|
camera.setPosition(Vector(-80, 250, 700))
|
||||||
camera.setPerspective(True)
|
camera.setPerspective(True)
|
||||||
camera.lookAt(Vector(0, 0, 0))
|
camera.lookAt(Vector(0, 0, 0))
|
||||||
controller.getScene().setActiveCamera("3d")
|
controller.getScene().setActiveCamera("3d")
|
||||||
|
@ -231,18 +241,29 @@ class CuraApplication(QtApplication):
|
||||||
|
|
||||||
requestAddPrinter = pyqtSignal()
|
requestAddPrinter = pyqtSignal()
|
||||||
activityChanged = pyqtSignal()
|
activityChanged = pyqtSignal()
|
||||||
|
sceneBoundingBoxChanged = pyqtSignal()
|
||||||
|
|
||||||
@pyqtProperty(bool, notify = activityChanged)
|
@pyqtProperty(bool, notify = activityChanged)
|
||||||
def getPlatformActivity(self):
|
def getPlatformActivity(self):
|
||||||
return self._platform_activity
|
return self._platform_activity
|
||||||
|
|
||||||
|
@pyqtProperty(str, notify = sceneBoundingBoxChanged)
|
||||||
|
def getSceneBoundingBoxString(self):
|
||||||
|
return self._i18n_catalog.i18nc("@info", "%.1f x %.1f x %.1f mm") % (self._scene_boundingbox.width.item(), self._scene_boundingbox.depth.item(), self._scene_boundingbox.height.item())
|
||||||
|
|
||||||
def updatePlatformActivity(self, node = None):
|
def updatePlatformActivity(self, node = None):
|
||||||
count = 0
|
count = 0
|
||||||
|
scene_boundingbox = AxisAlignedBox()
|
||||||
for node in DepthFirstIterator(self.getController().getScene().getRoot()):
|
for node in DepthFirstIterator(self.getController().getScene().getRoot()):
|
||||||
if type(node) is not SceneNode or not node.getMeshData():
|
if type(node) is not SceneNode or not node.getMeshData():
|
||||||
continue
|
continue
|
||||||
|
|
||||||
count += 1
|
count += 1
|
||||||
|
scene_boundingbox += node.getBoundingBox()
|
||||||
|
|
||||||
|
if repr(self._scene_boundingbox) != repr(scene_boundingbox):
|
||||||
|
self._scene_boundingbox = scene_boundingbox
|
||||||
|
self.sceneBoundingBoxChanged.emit()
|
||||||
|
|
||||||
self._platform_activity = True if count > 0 else False
|
self._platform_activity = True if count > 0 else False
|
||||||
self.activityChanged.emit()
|
self.activityChanged.emit()
|
||||||
|
@ -254,6 +275,7 @@ class CuraApplication(QtApplication):
|
||||||
self.jobNameChanged.emit()
|
self.jobNameChanged.emit()
|
||||||
|
|
||||||
jobNameChanged = pyqtSignal()
|
jobNameChanged = pyqtSignal()
|
||||||
|
|
||||||
@pyqtProperty(str, notify = jobNameChanged)
|
@pyqtProperty(str, notify = jobNameChanged)
|
||||||
def jobName(self):
|
def jobName(self):
|
||||||
return self._job_name
|
return self._job_name
|
||||||
|
@ -418,6 +440,7 @@ class CuraApplication(QtApplication):
|
||||||
return log
|
return log
|
||||||
|
|
||||||
recentFilesChanged = pyqtSignal()
|
recentFilesChanged = pyqtSignal()
|
||||||
|
|
||||||
@pyqtProperty("QVariantList", notify = recentFilesChanged)
|
@pyqtProperty("QVariantList", notify = recentFilesChanged)
|
||||||
def recentFiles(self):
|
def recentFiles(self):
|
||||||
return self._recent_files
|
return self._recent_files
|
||||||
|
@ -432,6 +455,7 @@ class CuraApplication(QtApplication):
|
||||||
self.expandedCategoriesChanged.emit()
|
self.expandedCategoriesChanged.emit()
|
||||||
|
|
||||||
expandedCategoriesChanged = pyqtSignal()
|
expandedCategoriesChanged = pyqtSignal()
|
||||||
|
|
||||||
@pyqtProperty("QStringList", notify = expandedCategoriesChanged)
|
@pyqtProperty("QStringList", notify = expandedCategoriesChanged)
|
||||||
def expandedCategories(self):
|
def expandedCategories(self):
|
||||||
return Preferences.getInstance().getValue("cura/categories_expanded").split(";")
|
return Preferences.getInstance().getValue("cura/categories_expanded").split(";")
|
||||||
|
@ -514,6 +538,9 @@ class CuraApplication(QtApplication):
|
||||||
for node in ungrouped_nodes:
|
for node in ungrouped_nodes:
|
||||||
Selection.remove(node)
|
Selection.remove(node)
|
||||||
|
|
||||||
|
def _createSplashScreen(self):
|
||||||
|
return CuraSplashScreen.CuraSplashScreen()
|
||||||
|
|
||||||
def _onActiveMachineChanged(self):
|
def _onActiveMachineChanged(self):
|
||||||
machine = self.getMachineManager().getActiveMachineInstance()
|
machine = self.getMachineManager().getActiveMachineInstance()
|
||||||
if machine:
|
if machine:
|
||||||
|
|
29
cura/CuraSplashScreen.py
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
# Copyright (c) 2015 Ultimaker B.V.
|
||||||
|
# Uranium is released under the terms of the AGPLv3 or higher.
|
||||||
|
|
||||||
|
from PyQt5.QtCore import Qt
|
||||||
|
from PyQt5.QtGui import QPixmap, QColor, QFont
|
||||||
|
from PyQt5.QtWidgets import QSplashScreen
|
||||||
|
|
||||||
|
from UM.Resources import Resources
|
||||||
|
from UM.Application import Application
|
||||||
|
|
||||||
|
class CuraSplashScreen(QSplashScreen):
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__()
|
||||||
|
self.setPixmap(QPixmap(Resources.getPath(Resources.Images, "cura.png")))
|
||||||
|
|
||||||
|
def drawContents(self, painter):
|
||||||
|
painter.save()
|
||||||
|
painter.setPen(QColor(0, 0, 0, 255))
|
||||||
|
|
||||||
|
version = Application.getInstance().getVersion().split("-")
|
||||||
|
|
||||||
|
painter.setFont(QFont("Proxima Nova Rg", 20))
|
||||||
|
painter.drawText(0, 0, 203, 230, Qt.AlignRight | Qt.AlignBottom, version[0])
|
||||||
|
if len(version) > 1:
|
||||||
|
painter.setFont(QFont("Proxima Nova Rg", 12))
|
||||||
|
painter.drawText(0, 0, 203, 255, Qt.AlignRight | Qt.AlignBottom, version[1])
|
||||||
|
|
||||||
|
painter.restore()
|
||||||
|
super().drawContents(painter)
|
4
cura/CuraVersion.py.in
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
# Copyright (c) 2015 Ultimaker B.V.
|
||||||
|
# Cura is released under the terms of the AGPLv3 or higher.
|
||||||
|
|
||||||
|
CuraVersion = "@CURA_VERSION@"
|
|
@ -63,6 +63,7 @@ class LayerData(MeshData):
|
||||||
offset = data.build(offset, vertices, colors, indices)
|
offset = data.build(offset, vertices, colors, indices)
|
||||||
self._element_counts[layer] = data.elementCount
|
self._element_counts[layer] = data.elementCount
|
||||||
|
|
||||||
|
self.clear()
|
||||||
self.addVertices(vertices)
|
self.addVertices(vertices)
|
||||||
self.addColors(colors)
|
self.addColors(colors)
|
||||||
self.addIndices(indices.flatten())
|
self.addIndices(indices.flatten())
|
||||||
|
@ -200,18 +201,14 @@ class Polygon():
|
||||||
|
|
||||||
def build(self, offset, vertices, colors, indices):
|
def build(self, offset, vertices, colors, indices):
|
||||||
self._begin = offset
|
self._begin = offset
|
||||||
|
self._end = self._begin + len(self._data) - 1
|
||||||
|
|
||||||
color = self.getColor()
|
color = self.getColor()
|
||||||
color.setValues(color.r * 0.5, color.g * 0.5, color.b * 0.5, color.a)
|
color.setValues(color.r * 0.5, color.g * 0.5, color.b * 0.5, color.a)
|
||||||
|
color = numpy.array([color.r, color.g, color.b, color.a], numpy.float32)
|
||||||
|
|
||||||
for i in range(len(self._data)):
|
vertices[self._begin:self._end + 1, :] = self._data[:, :]
|
||||||
vertices[offset + i, :] = self._data[i, :]
|
colors[self._begin:self._end + 1, :] = color
|
||||||
colors[offset + i, 0] = color.r
|
|
||||||
colors[offset + i, 1] = color.g
|
|
||||||
colors[offset + i, 2] = color.b
|
|
||||||
colors[offset + i, 3] = color.a
|
|
||||||
|
|
||||||
self._end = self._begin + len(self._data) - 1
|
|
||||||
|
|
||||||
for i in range(self._begin, self._end):
|
for i in range(self._begin, self._end):
|
||||||
indices[i, 0] = i
|
indices[i, 0] = i
|
||||||
|
|
|
@ -45,7 +45,7 @@ class OneAtATimeIterator(Iterator.Iterator):
|
||||||
# This does not decrease the worst case running time, but should improve it in most cases.
|
# This does not decrease the worst case running time, but should improve it in most cases.
|
||||||
sorted(node_list, key = cmp_to_key(self._calculateScore))
|
sorted(node_list, key = cmp_to_key(self._calculateScore))
|
||||||
|
|
||||||
todo_node_list = [_objectOrder([], node_list)]
|
todo_node_list = [_ObjectOrder([], node_list)]
|
||||||
while len(todo_node_list) > 0:
|
while len(todo_node_list) > 0:
|
||||||
current = todo_node_list.pop()
|
current = todo_node_list.pop()
|
||||||
for node in current.todo:
|
for node in current.todo:
|
||||||
|
@ -61,7 +61,7 @@ class OneAtATimeIterator(Iterator.Iterator):
|
||||||
self._node_stack = new_order
|
self._node_stack = new_order
|
||||||
|
|
||||||
return
|
return
|
||||||
todo_node_list.append(_objectOrder(new_order, new_todo_list))
|
todo_node_list.append(_ObjectOrder(new_order, new_todo_list))
|
||||||
self._node_stack = [] #No result found!
|
self._node_stack = [] #No result found!
|
||||||
|
|
||||||
|
|
||||||
|
@ -99,7 +99,7 @@ class OneAtATimeIterator(Iterator.Iterator):
|
||||||
|
|
||||||
|
|
||||||
## Internal object used to keep track of a possible order in which to print objects.
|
## Internal object used to keep track of a possible order in which to print objects.
|
||||||
class _objectOrder():
|
class _ObjectOrder():
|
||||||
def __init__(self, order, todo):
|
def __init__(self, order, todo):
|
||||||
"""
|
"""
|
||||||
:param order: List of indexes in which to print objects, ordered by printing order.
|
:param order: List of indexes in which to print objects, ordered by printing order.
|
||||||
|
|
11
cura_app.py
|
@ -4,6 +4,7 @@
|
||||||
# Cura is released under the terms of the AGPLv3 or higher.
|
# Cura is released under the terms of the AGPLv3 or higher.
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
import os
|
||||||
|
|
||||||
def exceptHook(type, value, traceback):
|
def exceptHook(type, value, traceback):
|
||||||
import cura.CrashHandler
|
import cura.CrashHandler
|
||||||
|
@ -11,7 +12,15 @@ def exceptHook(type, value, traceback):
|
||||||
|
|
||||||
sys.excepthook = exceptHook
|
sys.excepthook = exceptHook
|
||||||
|
|
||||||
import cura.CuraApplication
|
try:
|
||||||
|
from google.protobuf.pyext import _message
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
os.environ["PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION"] = "cpp"
|
||||||
|
|
||||||
|
if True: # To make the code style checker stop complaining
|
||||||
|
import cura.CuraApplication
|
||||||
|
|
||||||
if sys.platform == "win32" and hasattr(sys, "frozen"):
|
if sys.platform == "win32" and hasattr(sys, "frozen"):
|
||||||
import os
|
import os
|
||||||
|
|
|
@ -10,6 +10,7 @@ from UM.Scene.SceneNode import SceneNode
|
||||||
from UM.Scene.GroupDecorator import GroupDecorator
|
from UM.Scene.GroupDecorator import GroupDecorator
|
||||||
from UM.Math.Quaternion import Quaternion
|
from UM.Math.Quaternion import Quaternion
|
||||||
|
|
||||||
|
from UM.Job import Job
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import struct
|
import struct
|
||||||
|
@ -36,7 +37,7 @@ class ThreeMFReader(MeshReader):
|
||||||
if extension.lower() == self._supported_extension:
|
if extension.lower() == self._supported_extension:
|
||||||
result = SceneNode()
|
result = SceneNode()
|
||||||
# The base object of 3mf is a zipped archive.
|
# The base object of 3mf is a zipped archive.
|
||||||
archive = zipfile.ZipFile(file_name, 'r')
|
archive = zipfile.ZipFile(file_name, "r")
|
||||||
try:
|
try:
|
||||||
root = ET.parse(archive.open("3D/3dmodel.model"))
|
root = ET.parse(archive.open("3D/3dmodel.model"))
|
||||||
|
|
||||||
|
@ -53,6 +54,7 @@ class ThreeMFReader(MeshReader):
|
||||||
#for vertex in object.mesh.vertices.vertex:
|
#for vertex in object.mesh.vertices.vertex:
|
||||||
for vertex in object.findall(".//3mf:vertex", self._namespaces):
|
for vertex in object.findall(".//3mf:vertex", self._namespaces):
|
||||||
vertex_list.append([vertex.get("x"), vertex.get("y"), vertex.get("z")])
|
vertex_list.append([vertex.get("x"), vertex.get("y"), vertex.get("z")])
|
||||||
|
Job.yieldThread()
|
||||||
|
|
||||||
triangles = object.findall(".//3mf:triangle", self._namespaces)
|
triangles = object.findall(".//3mf:triangle", self._namespaces)
|
||||||
|
|
||||||
|
@ -64,6 +66,8 @@ class ThreeMFReader(MeshReader):
|
||||||
v2 = int(triangle.get("v2"))
|
v2 = int(triangle.get("v2"))
|
||||||
v3 = int(triangle.get("v3"))
|
v3 = int(triangle.get("v3"))
|
||||||
mesh.addFace(vertex_list[v1][0],vertex_list[v1][1],vertex_list[v1][2],vertex_list[v2][0],vertex_list[v2][1],vertex_list[v2][2],vertex_list[v3][0],vertex_list[v3][1],vertex_list[v3][2])
|
mesh.addFace(vertex_list[v1][0],vertex_list[v1][1],vertex_list[v1][2],vertex_list[v2][0],vertex_list[v2][1],vertex_list[v2][2],vertex_list[v3][0],vertex_list[v3][1],vertex_list[v3][2])
|
||||||
|
Job.yieldThread()
|
||||||
|
|
||||||
#TODO: We currently do not check for normals and simply recalculate them.
|
#TODO: We currently do not check for normals and simply recalculate them.
|
||||||
mesh.calculateNormals()
|
mesh.calculateNormals()
|
||||||
node.setMeshData(mesh)
|
node.setMeshData(mesh)
|
||||||
|
@ -105,10 +109,10 @@ class ThreeMFReader(MeshReader):
|
||||||
node.setOrientation(temp_quaternion)
|
node.setOrientation(temp_quaternion)
|
||||||
|
|
||||||
# Magical scale extraction
|
# Magical scale extraction
|
||||||
S2 = temp_mat.getTransposed().multiply(temp_mat)
|
scale = temp_mat.getTransposed().multiply(temp_mat)
|
||||||
scale_x = math.sqrt(S2.at(0,0))
|
scale_x = math.sqrt(scale.at(0,0))
|
||||||
scale_y = math.sqrt(S2.at(1,1))
|
scale_y = math.sqrt(scale.at(1,1))
|
||||||
scale_z = math.sqrt(S2.at(2,2))
|
scale_z = math.sqrt(scale.at(2,2))
|
||||||
node.setScale(Vector(scale_x,scale_y,scale_z))
|
node.setScale(Vector(scale_x,scale_y,scale_z))
|
||||||
|
|
||||||
# We use a different coordinate frame, so rotate.
|
# We use a different coordinate frame, so rotate.
|
||||||
|
@ -116,6 +120,8 @@ class ThreeMFReader(MeshReader):
|
||||||
#node.rotate(rotation)
|
#node.rotate(rotation)
|
||||||
result.addChild(node)
|
result.addChild(node)
|
||||||
|
|
||||||
|
Job.yieldThread()
|
||||||
|
|
||||||
#If there is more then one object, group them.
|
#If there is more then one object, group them.
|
||||||
try:
|
try:
|
||||||
if len(objects) > 1:
|
if len(objects) > 1:
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
# Copyright (c) 2015 Ultimaker B.V.
|
# Copyright (c) 2015 Ultimaker B.V.
|
||||||
# Cura is released under the terms of the AGPLv3 or higher.
|
# Cura is released under the terms of the AGPLv3 or higher.
|
||||||
|
|
||||||
|
from . import ThreeMFReader
|
||||||
|
|
||||||
from UM.i18n import i18nCatalog
|
from UM.i18n import i18nCatalog
|
||||||
catalog = i18nCatalog("cura")
|
catalog = i18nCatalog("cura")
|
||||||
|
|
||||||
from . import ThreeMFReader
|
|
||||||
|
|
||||||
def getMetaData():
|
def getMetaData():
|
||||||
return {
|
return {
|
||||||
"plugin": {
|
"plugin": {
|
||||||
|
|
|
@ -58,7 +58,7 @@ class ChangeLog(Extension, QObject,):
|
||||||
|
|
||||||
def loadChangeLogs(self):
|
def loadChangeLogs(self):
|
||||||
self._change_logs = collections.OrderedDict()
|
self._change_logs = collections.OrderedDict()
|
||||||
with open(os.path.join(PluginRegistry.getInstance().getPluginPath("ChangeLogPlugin"), "ChangeLog.txt"), 'r',-1, "utf-8") as f:
|
with open(os.path.join(PluginRegistry.getInstance().getPluginPath("ChangeLogPlugin"), "ChangeLog.txt"), "r",-1, "utf-8") as f:
|
||||||
open_version = None
|
open_version = None
|
||||||
open_header = None
|
open_header = None
|
||||||
for line in f:
|
for line in f:
|
||||||
|
|
|
@ -11,8 +11,8 @@ import UM 1.1 as UM
|
||||||
UM.Dialog
|
UM.Dialog
|
||||||
{
|
{
|
||||||
id: base
|
id: base
|
||||||
width: 300 * Screen.devicePixelRatio;
|
minimumWidth: 400
|
||||||
height: 500 * Screen.devicePixelRatio;
|
minimumHeight: 300;
|
||||||
title: "Changelog"
|
title: "Changelog"
|
||||||
|
|
||||||
ScrollView
|
ScrollView
|
||||||
|
|
|
@ -1,4 +1,15 @@
|
||||||
[15.10.0]
|
[2.0.0]
|
||||||
|
|
||||||
|
*Naming changes
|
||||||
|
Infill prints after perimeters → Infill Before Walls
|
||||||
|
Initial layer thickness → Initial Layer Height
|
||||||
|
Structure type → Pattern
|
||||||
|
Cool head lift → Lift Head
|
||||||
|
Combine everything (Type-A) → Union Overlapping Volumes
|
||||||
|
Combine everything (Type-B) → Remove All Holes
|
||||||
|
Keep open faces Keep Disconnected → Faces
|
||||||
|
Only follow mesh surface → Surface Mode
|
||||||
|
|
||||||
*All at Once/One at a Time
|
*All at Once/One at a Time
|
||||||
Cura’s default mode is set to All At Once. You can print multiple objects faster with the option print objects One At A Time. This can be changed in Advanced Settings. Please note that in One At A Time mode, grouped objects will still be printed as a single object.
|
Cura’s default mode is set to All At Once. You can print multiple objects faster with the option print objects One At A Time. This can be changed in Advanced Settings. Please note that in One At A Time mode, grouped objects will still be printed as a single object.
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,7 @@ from cura.OneAtATimeIterator import OneAtATimeIterator
|
||||||
from . import Cura_pb2
|
from . import Cura_pb2
|
||||||
from . import ProcessSlicedObjectListJob
|
from . import ProcessSlicedObjectListJob
|
||||||
from . import ProcessGCodeJob
|
from . import ProcessGCodeJob
|
||||||
|
from . import StartSliceJob
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
@ -49,6 +50,7 @@ class CuraEngineBackend(Backend):
|
||||||
self._onActiveViewChanged()
|
self._onActiveViewChanged()
|
||||||
self._stored_layer_data = None
|
self._stored_layer_data = None
|
||||||
|
|
||||||
|
Application.getInstance().getMachineManager().activeMachineInstanceChanged.connect(self._onChanged)
|
||||||
|
|
||||||
self._profile = None
|
self._profile = None
|
||||||
Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onActiveProfileChanged)
|
Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onActiveProfileChanged)
|
||||||
|
@ -67,12 +69,8 @@ class CuraEngineBackend(Backend):
|
||||||
|
|
||||||
self._slicing = False
|
self._slicing = False
|
||||||
self._restart = False
|
self._restart = False
|
||||||
|
|
||||||
self._save_gcode = True
|
|
||||||
self._save_polygons = True
|
|
||||||
self._report_progress = True
|
|
||||||
|
|
||||||
self._enabled = True
|
self._enabled = True
|
||||||
|
self._always_restart = True
|
||||||
|
|
||||||
self._message = None
|
self._message = None
|
||||||
|
|
||||||
|
@ -103,24 +101,12 @@ class CuraEngineBackend(Backend):
|
||||||
## Emitted whne the slicing process is aborted forcefully.
|
## Emitted whne the slicing process is aborted forcefully.
|
||||||
slicingCancelled = Signal()
|
slicingCancelled = Signal()
|
||||||
|
|
||||||
## Perform a slice of the scene with the given set of settings.
|
## Perform a slice of the scene.
|
||||||
#
|
def slice(self):
|
||||||
# \param kwargs Keyword arguments.
|
|
||||||
# Valid values are:
|
|
||||||
# - settings: The settings to use for the slice. The default is the active machine.
|
|
||||||
# - save_gcode: True if the generated gcode should be saved, False if not. True by default.
|
|
||||||
# - save_polygons: True if the generated polygon data should be saved, False if not. True by default.
|
|
||||||
# - force_restart: True if the slicing process should be forcefully restarted if it is already slicing.
|
|
||||||
# If False, this method will do nothing when already slicing. True by default.
|
|
||||||
# - report_progress: True if the slicing progress should be reported, False if not. Default is True.
|
|
||||||
def slice(self, **kwargs):
|
|
||||||
if not self._enabled:
|
if not self._enabled:
|
||||||
return
|
return
|
||||||
|
|
||||||
if self._slicing:
|
if self._slicing:
|
||||||
if not kwargs.get("force_restart", True):
|
|
||||||
return
|
|
||||||
|
|
||||||
self._slicing = False
|
self._slicing = False
|
||||||
self._restart = True
|
self._restart = True
|
||||||
if self._process is not None:
|
if self._process is not None:
|
||||||
|
@ -129,105 +115,44 @@ class CuraEngineBackend(Backend):
|
||||||
self._process.terminate()
|
self._process.terminate()
|
||||||
except: # terminating a process that is already terminating causes an exception, silently ignore this.
|
except: # terminating a process that is already terminating causes an exception, silently ignore this.
|
||||||
pass
|
pass
|
||||||
self.slicingCancelled.emit()
|
|
||||||
return
|
|
||||||
|
|
||||||
Logger.log("d", "Preparing to send slice data to engine.")
|
|
||||||
object_groups = []
|
|
||||||
if self._profile.getSettingValue("print_sequence") == "one_at_a_time":
|
|
||||||
for node in OneAtATimeIterator(self._scene.getRoot()):
|
|
||||||
temp_list = []
|
|
||||||
children = node.getAllChildren()
|
|
||||||
children.append(node)
|
|
||||||
for child_node in children:
|
|
||||||
if type(child_node) is SceneNode and child_node.getMeshData() and child_node.getMeshData().getVertices() is not None:
|
|
||||||
temp_list.append(child_node)
|
|
||||||
object_groups.append(temp_list)
|
|
||||||
else:
|
|
||||||
temp_list = []
|
|
||||||
for node in DepthFirstIterator(self._scene.getRoot()):
|
|
||||||
if type(node) is SceneNode and node.getMeshData() and node.getMeshData().getVertices() is not None:
|
|
||||||
if not getattr(node, "_outside_buildarea", False):
|
|
||||||
temp_list.append(node)
|
|
||||||
if len(temp_list) == 0:
|
|
||||||
self.processingProgress.emit(0.0)
|
|
||||||
return
|
|
||||||
object_groups.append(temp_list)
|
|
||||||
#for node in DepthFirstIterator(self._scene.getRoot()):
|
|
||||||
# if type(node) is SceneNode and node.getMeshData() and node.getMeshData().getVertices() is not None:
|
|
||||||
# if not getattr(node, "_outside_buildarea", False):
|
|
||||||
# objects.append(node)
|
|
||||||
|
|
||||||
if len(object_groups) == 0:
|
|
||||||
if self._message:
|
if self._message:
|
||||||
self._message.hide()
|
self._message.hide()
|
||||||
self._message = None
|
self._message = None
|
||||||
return #No point in slicing an empty build plate
|
|
||||||
|
|
||||||
if kwargs.get("profile", self._profile).hasErrorValue():
|
self.slicingCancelled.emit()
|
||||||
Logger.log('w', "Profile has error values. Aborting slicing")
|
return
|
||||||
|
|
||||||
|
if self._profile.hasErrorValue():
|
||||||
|
Logger.log("w", "Profile has error values. Aborting slicing")
|
||||||
if self._message:
|
if self._message:
|
||||||
self._message.hide()
|
self._message.hide()
|
||||||
self._message = None
|
self._message = None
|
||||||
self._message = Message(catalog.i18nc("@info:status", "Unable to slice. Please check your setting values for errors."))
|
self._message = Message(catalog.i18nc("@info:status", "Unable to slice. Please check your setting values for errors."))
|
||||||
self._message.show()
|
self._message.show()
|
||||||
return #No slicing if we have error values since those are by definition illegal values.
|
return #No slicing if we have error values since those are by definition illegal values.
|
||||||
# Remove existing layer data (if any)
|
|
||||||
for node in DepthFirstIterator(self._scene.getRoot()):
|
self.processingProgress.emit(0.0)
|
||||||
if type(node) is SceneNode and node.getMeshData():
|
if self._message:
|
||||||
if node.callDecoration("getLayerData"):
|
self._message.setProgress(-1)
|
||||||
Application.getInstance().getController().getScene().getRoot().removeChild(node)
|
#else:
|
||||||
break
|
# self._message = Message(catalog.i18nc("@info:status", "Slicing..."), 0, False, -1)
|
||||||
Application.getInstance().getController().getScene().gcode_list = None
|
# self._message.show()
|
||||||
|
|
||||||
|
self._scene.gcode_list = []
|
||||||
self._slicing = True
|
self._slicing = True
|
||||||
self.slicingStarted.emit()
|
|
||||||
|
|
||||||
self._report_progress = kwargs.get("report_progress", True)
|
job = StartSliceJob.StartSliceJob(self._profile, self._socket)
|
||||||
if self._report_progress:
|
job.start()
|
||||||
self.processingProgress.emit(0.0)
|
job.finished.connect(self._onStartSliceCompleted)
|
||||||
if not self._message:
|
|
||||||
self._message = Message(catalog.i18nc("@info:status", "Slicing..."), 0, False, -1)
|
|
||||||
self._message.show()
|
|
||||||
else:
|
|
||||||
self._message.setProgress(-1)
|
|
||||||
|
|
||||||
self._sendSettings(kwargs.get("profile", self._profile))
|
def _onStartSliceCompleted(self, job):
|
||||||
|
if job.getError() or job.getResult() != True:
|
||||||
self._scene.acquireLock()
|
if self._message:
|
||||||
|
self._message.hide()
|
||||||
# Set the gcode as an empty list. This will be filled with strings by GCodeLayer messages.
|
self._message = None
|
||||||
# This is done so the gcode can be fragmented in memory and does not need a continues memory space.
|
return
|
||||||
# (AKA. This prevents MemoryErrors)
|
|
||||||
self._save_gcode = kwargs.get("save_gcode", True)
|
|
||||||
if self._save_gcode:
|
|
||||||
setattr(self._scene, "gcode_list", [])
|
|
||||||
|
|
||||||
self._save_polygons = kwargs.get("save_polygons", True)
|
|
||||||
|
|
||||||
slice_message = Cura_pb2.Slice()
|
|
||||||
|
|
||||||
for group in object_groups:
|
|
||||||
group_message = slice_message.object_lists.add()
|
|
||||||
for object in group:
|
|
||||||
mesh_data = object.getMeshData().getTransformed(object.getWorldTransformation())
|
|
||||||
|
|
||||||
obj = group_message.objects.add()
|
|
||||||
obj.id = id(object)
|
|
||||||
|
|
||||||
verts = numpy.array(mesh_data.getVertices())
|
|
||||||
verts[:,[1,2]] = verts[:,[2,1]]
|
|
||||||
verts[:,1] *= -1
|
|
||||||
obj.vertices = verts.tostring()
|
|
||||||
|
|
||||||
self._handlePerObjectSettings(object, obj)
|
|
||||||
|
|
||||||
# Hack to add per-object settings also to the "MeshGroup" in CuraEngine
|
|
||||||
# We really should come up with a better solution for this.
|
|
||||||
self._handlePerObjectSettings(group[0], group_message)
|
|
||||||
|
|
||||||
self._scene.releaseLock()
|
|
||||||
Logger.log("d", "Sending data to engine for slicing.")
|
|
||||||
self._socket.sendMessage(slice_message)
|
|
||||||
|
|
||||||
def _onSceneChanged(self, source):
|
def _onSceneChanged(self, source):
|
||||||
if type(source) is not SceneNode:
|
if type(source) is not SceneNode:
|
||||||
|
@ -257,41 +182,42 @@ class CuraEngineBackend(Backend):
|
||||||
self._onChanged()
|
self._onChanged()
|
||||||
|
|
||||||
def _onSlicedObjectListMessage(self, message):
|
def _onSlicedObjectListMessage(self, message):
|
||||||
if self._save_polygons:
|
if self._layer_view_active:
|
||||||
if self._layer_view_active:
|
job = ProcessSlicedObjectListJob.ProcessSlicedObjectListJob(message)
|
||||||
job = ProcessSlicedObjectListJob.ProcessSlicedObjectListJob(message)
|
job.start()
|
||||||
job.start()
|
else :
|
||||||
else :
|
self._stored_layer_data = message
|
||||||
self._stored_layer_data = message
|
|
||||||
|
|
||||||
def _onProgressMessage(self, message):
|
def _onProgressMessage(self, message):
|
||||||
if message.amount >= 0.99:
|
|
||||||
self._slicing = False
|
|
||||||
|
|
||||||
if self._message:
|
|
||||||
self._message.setProgress(100)
|
|
||||||
self._message.hide()
|
|
||||||
self._message = None
|
|
||||||
|
|
||||||
if self._message:
|
if self._message:
|
||||||
self._message.setProgress(round(message.amount * 100))
|
self._message.setProgress(round(message.amount * 100))
|
||||||
|
|
||||||
if self._report_progress:
|
self.processingProgress.emit(message.amount)
|
||||||
self.processingProgress.emit(message.amount)
|
|
||||||
|
|
||||||
def _onGCodeLayerMessage(self, message):
|
def _onGCodeLayerMessage(self, message):
|
||||||
if self._save_gcode:
|
self._scene.gcode_list.append(message.data.decode("utf-8", "replace"))
|
||||||
job = ProcessGCodeJob.ProcessGCodeLayerJob(message)
|
|
||||||
job.start()
|
|
||||||
|
|
||||||
def _onGCodePrefixMessage(self, message):
|
def _onGCodePrefixMessage(self, message):
|
||||||
if self._save_gcode:
|
self._scene.gcode_list.insert(0, message.data.decode("utf-8", "replace"))
|
||||||
self._scene.gcode_list.insert(0, message.data.decode("utf-8", "replace"))
|
|
||||||
|
|
||||||
def _onObjectPrintTimeMessage(self, message):
|
def _onObjectPrintTimeMessage(self, message):
|
||||||
self.printDurationMessage.emit(message.time, message.material_amount)
|
self.printDurationMessage.emit(message.time, message.material_amount)
|
||||||
self.processingProgress.emit(1.0)
|
self.processingProgress.emit(1.0)
|
||||||
|
|
||||||
|
self._slicing = False
|
||||||
|
|
||||||
|
if self._message:
|
||||||
|
self._message.setProgress(100)
|
||||||
|
self._message.hide()
|
||||||
|
self._message = None
|
||||||
|
|
||||||
|
if self._always_restart:
|
||||||
|
try:
|
||||||
|
self._process.terminate()
|
||||||
|
self._createSocket()
|
||||||
|
except: # terminating a process that is already terminating causes an exception, silently ignore this.
|
||||||
|
pass
|
||||||
|
|
||||||
def _createSocket(self):
|
def _createSocket(self):
|
||||||
super()._createSocket()
|
super()._createSocket()
|
||||||
|
|
||||||
|
@ -313,15 +239,6 @@ class CuraEngineBackend(Backend):
|
||||||
|
|
||||||
self._change_timer.start()
|
self._change_timer.start()
|
||||||
|
|
||||||
def _sendSettings(self, profile):
|
|
||||||
msg = Cura_pb2.SettingList()
|
|
||||||
for key, value in profile.getAllSettingValues(include_machine = True).items():
|
|
||||||
s = msg.settings.add()
|
|
||||||
s.name = key
|
|
||||||
s.value = str(value).encode("utf-8")
|
|
||||||
|
|
||||||
self._socket.sendMessage(msg)
|
|
||||||
|
|
||||||
def _onBackendConnected(self):
|
def _onBackendConnected(self):
|
||||||
if self._restart:
|
if self._restart:
|
||||||
self._onChanged()
|
self._onChanged()
|
||||||
|
@ -346,22 +263,6 @@ class CuraEngineBackend(Backend):
|
||||||
else:
|
else:
|
||||||
self._layer_view_active = False
|
self._layer_view_active = False
|
||||||
|
|
||||||
def _handlePerObjectSettings(self, node, message):
|
|
||||||
profile = node.callDecoration("getProfile")
|
|
||||||
if profile:
|
|
||||||
for key, value in profile.getChangedSettingValues().items():
|
|
||||||
setting = message.settings.add()
|
|
||||||
setting.name = key
|
|
||||||
setting.value = str(value).encode()
|
|
||||||
|
|
||||||
object_settings = node.callDecoration("getAllSettingValues")
|
|
||||||
if not object_settings:
|
|
||||||
return
|
|
||||||
|
|
||||||
for key, value in object_settings.items():
|
|
||||||
setting = message.settings.add()
|
|
||||||
setting.name = key
|
|
||||||
setting.value = str(value).encode()
|
|
||||||
|
|
||||||
def _onInstanceChanged(self):
|
def _onInstanceChanged(self):
|
||||||
self._slicing = False
|
self._slicing = False
|
||||||
|
|
|
@ -32,19 +32,18 @@ class ProcessSlicedObjectListJob(Job):
|
||||||
|
|
||||||
Application.getInstance().getController().activeViewChanged.connect(self._onActiveViewChanged)
|
Application.getInstance().getController().activeViewChanged.connect(self._onActiveViewChanged)
|
||||||
|
|
||||||
objectIdMap = {}
|
object_id_map = {}
|
||||||
new_node = SceneNode()
|
new_node = SceneNode()
|
||||||
## Put all nodes in a dict identified by ID
|
## Put all nodes in a dict identified by ID
|
||||||
for node in DepthFirstIterator(self._scene.getRoot()):
|
for node in DepthFirstIterator(self._scene.getRoot()):
|
||||||
if type(node) is SceneNode and node.getMeshData():
|
if type(node) is SceneNode and node.getMeshData():
|
||||||
if node.callDecoration("getLayerData"):
|
if node.callDecoration("getLayerData"):
|
||||||
#if hasattr(node.getMeshData(), "layerData"):
|
|
||||||
self._scene.getRoot().removeChild(node)
|
self._scene.getRoot().removeChild(node)
|
||||||
else:
|
else:
|
||||||
objectIdMap[id(node)] = node
|
object_id_map[id(node)] = node
|
||||||
|
Job.yieldThread()
|
||||||
|
|
||||||
settings = Application.getInstance().getMachineManager().getActiveProfile()
|
settings = Application.getInstance().getMachineManager().getActiveProfile()
|
||||||
layerHeight = settings.getSettingValue("layer_height")
|
|
||||||
|
|
||||||
center = None
|
center = None
|
||||||
if not settings.getSettingValue("machine_center_is_zero"):
|
if not settings.getSettingValue("machine_center_is_zero"):
|
||||||
|
@ -54,9 +53,15 @@ class ProcessSlicedObjectListJob(Job):
|
||||||
|
|
||||||
mesh = MeshData()
|
mesh = MeshData()
|
||||||
layer_data = LayerData.LayerData()
|
layer_data = LayerData.LayerData()
|
||||||
|
|
||||||
|
layer_count = 0
|
||||||
|
for object in self._message.objects:
|
||||||
|
layer_count += len(object.layers)
|
||||||
|
|
||||||
|
current_layer = 0
|
||||||
for object in self._message.objects:
|
for object in self._message.objects:
|
||||||
try:
|
try:
|
||||||
node = objectIdMap[object.id]
|
node = object_id_map[object.id]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
@ -73,15 +78,23 @@ class ProcessSlicedObjectListJob(Job):
|
||||||
|
|
||||||
points[:,2] *= -1
|
points[:,2] *= -1
|
||||||
|
|
||||||
points -= numpy.array(center)
|
points -= center
|
||||||
|
|
||||||
layer_data.addPolygon(layer.id, polygon.type, points, polygon.line_width)
|
layer_data.addPolygon(layer.id, polygon.type, points, polygon.line_width)
|
||||||
|
|
||||||
|
Job.yieldThread()
|
||||||
|
|
||||||
|
current_layer += 1
|
||||||
|
progress = (current_layer / layer_count) * 100
|
||||||
|
# TODO: Rebuild the layer data mesh once the layer has been processed.
|
||||||
|
# This needs some work in LayerData so we can add the new layers instead of recreating the entire mesh.
|
||||||
|
|
||||||
|
if self._progress:
|
||||||
|
self._progress.setProgress(progress)
|
||||||
|
|
||||||
# We are done processing all the layers we got from the engine, now create a mesh out of the data
|
# We are done processing all the layers we got from the engine, now create a mesh out of the data
|
||||||
layer_data.build()
|
layer_data.build()
|
||||||
|
|
||||||
|
|
||||||
#Add layerdata decorator to scene node to indicate that the node has layerdata
|
#Add layerdata decorator to scene node to indicate that the node has layerdata
|
||||||
decorator = LayerDataDecorator.LayerDataDecorator()
|
decorator = LayerDataDecorator.LayerDataDecorator()
|
||||||
decorator.setLayerData(layer_data)
|
decorator.setLayerData(layer_data)
|
||||||
|
@ -90,6 +103,9 @@ class ProcessSlicedObjectListJob(Job):
|
||||||
new_node.setMeshData(mesh)
|
new_node.setMeshData(mesh)
|
||||||
new_node.setParent(self._scene.getRoot())
|
new_node.setParent(self._scene.getRoot())
|
||||||
|
|
||||||
|
if self._progress:
|
||||||
|
self._progress.setProgress(100)
|
||||||
|
|
||||||
view = Application.getInstance().getController().getActiveView()
|
view = Application.getInstance().getController().getActiveView()
|
||||||
if view.getPluginId() == "LayerView":
|
if view.getPluginId() == "LayerView":
|
||||||
view.resetLayerData()
|
view.resetLayerData()
|
||||||
|
|
152
plugins/CuraEngineBackend/StartSliceJob.py
Normal file
|
@ -0,0 +1,152 @@
|
||||||
|
# Copyright (c) 2015 Ultimaker B.V.
|
||||||
|
# Cura is released under the terms of the AGPLv3 or higher.
|
||||||
|
|
||||||
|
import numpy
|
||||||
|
from string import Formatter
|
||||||
|
import traceback
|
||||||
|
|
||||||
|
from UM.Job import Job
|
||||||
|
from UM.Application import Application
|
||||||
|
from UM.Logger import Logger
|
||||||
|
|
||||||
|
from UM.Scene.SceneNode import SceneNode
|
||||||
|
from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
|
||||||
|
|
||||||
|
from cura.OneAtATimeIterator import OneAtATimeIterator
|
||||||
|
|
||||||
|
from . import Cura_pb2
|
||||||
|
|
||||||
|
## Formatter class that handles token expansion in start/end gcod
|
||||||
|
class GcodeStartEndFormatter(Formatter):
|
||||||
|
def get_value(self, key, args, kwargs): # [CodeStyle: get_value is an overridden function from the Formatter class]
|
||||||
|
if isinstance(key, str):
|
||||||
|
try:
|
||||||
|
return kwargs[key]
|
||||||
|
except KeyError:
|
||||||
|
Logger.log("w", "Unable to replace '%s' placeholder in start/end gcode", key)
|
||||||
|
return "{" + key + "}"
|
||||||
|
else:
|
||||||
|
Logger.log("w", "Incorrectly formatted placeholder '%s' in start/end gcode", key)
|
||||||
|
return "{" + str(key) + "}"
|
||||||
|
|
||||||
|
## Job class that handles sending the current scene data to CuraEngine
|
||||||
|
class StartSliceJob(Job):
|
||||||
|
def __init__(self, profile, socket):
|
||||||
|
super().__init__()
|
||||||
|
|
||||||
|
self._scene = Application.getInstance().getController().getScene()
|
||||||
|
self._profile = profile
|
||||||
|
self._socket = socket
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
self._scene.acquireLock()
|
||||||
|
|
||||||
|
for node in DepthFirstIterator(self._scene.getRoot()):
|
||||||
|
if node.callDecoration("getLayerData"):
|
||||||
|
node.getParent().removeChild(node)
|
||||||
|
break
|
||||||
|
|
||||||
|
object_groups = []
|
||||||
|
if self._profile.getSettingValue("print_sequence") == "one_at_a_time":
|
||||||
|
for node in OneAtATimeIterator(self._scene.getRoot()):
|
||||||
|
temp_list = []
|
||||||
|
|
||||||
|
if getattr(node, "_outside_buildarea", False):
|
||||||
|
continue
|
||||||
|
|
||||||
|
children = node.getAllChildren()
|
||||||
|
children.append(node)
|
||||||
|
for child_node in children:
|
||||||
|
if type(child_node) is SceneNode and child_node.getMeshData() and child_node.getMeshData().getVertices() is not None:
|
||||||
|
temp_list.append(child_node)
|
||||||
|
|
||||||
|
if temp_list:
|
||||||
|
object_groups.append(temp_list)
|
||||||
|
Job.yieldThread()
|
||||||
|
else:
|
||||||
|
temp_list = []
|
||||||
|
for node in DepthFirstIterator(self._scene.getRoot()):
|
||||||
|
if type(node) is SceneNode and node.getMeshData() and node.getMeshData().getVertices() is not None:
|
||||||
|
if not getattr(node, "_outside_buildarea", False):
|
||||||
|
temp_list.append(node)
|
||||||
|
Job.yieldThread()
|
||||||
|
|
||||||
|
if temp_list:
|
||||||
|
object_groups.append(temp_list)
|
||||||
|
|
||||||
|
self._scene.releaseLock()
|
||||||
|
|
||||||
|
if not object_groups:
|
||||||
|
return
|
||||||
|
|
||||||
|
self._sendSettings(self._profile)
|
||||||
|
|
||||||
|
slice_message = Cura_pb2.Slice()
|
||||||
|
|
||||||
|
for group in object_groups:
|
||||||
|
group_message = slice_message.object_lists.add()
|
||||||
|
for object in group:
|
||||||
|
mesh_data = object.getMeshData().getTransformed(object.getWorldTransformation())
|
||||||
|
|
||||||
|
obj = group_message.objects.add()
|
||||||
|
obj.id = id(object)
|
||||||
|
|
||||||
|
verts = numpy.array(mesh_data.getVertices())
|
||||||
|
verts[:,[1,2]] = verts[:,[2,1]]
|
||||||
|
verts[:,1] *= -1
|
||||||
|
obj.vertices = verts.tostring()
|
||||||
|
|
||||||
|
self._handlePerObjectSettings(object, obj)
|
||||||
|
|
||||||
|
Job.yieldThread()
|
||||||
|
|
||||||
|
Logger.log("d", "Sending data to engine for slicing.")
|
||||||
|
self._socket.sendMessage(slice_message)
|
||||||
|
|
||||||
|
self.setResult(True)
|
||||||
|
|
||||||
|
def _expandGcodeTokens(self, key, value, settings):
|
||||||
|
try:
|
||||||
|
# any setting can be used as a token
|
||||||
|
fmt = GcodeStartEndFormatter()
|
||||||
|
return str(fmt.format(value, **settings)).encode("utf-8")
|
||||||
|
except:
|
||||||
|
Logger.log("w", "Unabled to do token replacement on start/end gcode %s", traceback.format_exc())
|
||||||
|
return str(value).encode("utf-8")
|
||||||
|
|
||||||
|
def _sendSettings(self, profile):
|
||||||
|
msg = Cura_pb2.SettingList()
|
||||||
|
settings = profile.getAllSettingValues(include_machine = True)
|
||||||
|
start_gcode = settings["machine_start_gcode"]
|
||||||
|
settings["material_bed_temp_prepend"] = "{material_bed_temperature}" not in start_gcode
|
||||||
|
settings["material_print_temp_prepend"] = "{material_print_temperature}" not in start_gcode
|
||||||
|
for key, value in settings.items():
|
||||||
|
s = msg.settings.add()
|
||||||
|
s.name = key
|
||||||
|
if key == "machine_start_gcode" or key == "machine_end_gcode":
|
||||||
|
s.value = self._expandGcodeTokens(key, value, settings)
|
||||||
|
else:
|
||||||
|
s.value = str(value).encode("utf-8")
|
||||||
|
|
||||||
|
self._socket.sendMessage(msg)
|
||||||
|
|
||||||
|
def _handlePerObjectSettings(self, node, message):
|
||||||
|
profile = node.callDecoration("getProfile")
|
||||||
|
if profile:
|
||||||
|
for key, value in profile.getAllSettingValues().items():
|
||||||
|
setting = message.settings.add()
|
||||||
|
setting.name = key
|
||||||
|
setting.value = str(value).encode()
|
||||||
|
|
||||||
|
Job.yieldThread()
|
||||||
|
|
||||||
|
object_settings = node.callDecoration("getAllSettingValues")
|
||||||
|
if not object_settings:
|
||||||
|
return
|
||||||
|
|
||||||
|
for key, value in object_settings.items():
|
||||||
|
setting = message.settings.add()
|
||||||
|
setting.name = key
|
||||||
|
setting.value = str(value).encode()
|
||||||
|
|
||||||
|
Job.yieldThread()
|
|
@ -1,11 +1,11 @@
|
||||||
# Copyright (c) 2015 Ultimaker B.V.
|
# Copyright (c) 2015 Ultimaker B.V.
|
||||||
# Cura is released under the terms of the AGPLv3 or higher.
|
# Cura is released under the terms of the AGPLv3 or higher.
|
||||||
|
|
||||||
|
from . import GCodeReader
|
||||||
|
|
||||||
from UM.i18n import i18nCatalog
|
from UM.i18n import i18nCatalog
|
||||||
catalog = i18nCatalog("cura")
|
catalog = i18nCatalog("cura")
|
||||||
|
|
||||||
from . import GCodeReader
|
|
||||||
|
|
||||||
def getMetaData():
|
def getMetaData():
|
||||||
return {
|
return {
|
||||||
"plugin": {
|
"plugin": {
|
||||||
|
|
|
@ -11,6 +11,9 @@ from UM.Scene.Selection import Selection
|
||||||
from UM.Math.Color import Color
|
from UM.Math.Color import Color
|
||||||
from UM.Mesh.MeshData import MeshData
|
from UM.Mesh.MeshData import MeshData
|
||||||
|
|
||||||
|
from UM.View.RenderBatch import RenderBatch
|
||||||
|
from UM.View.GL.OpenGL import OpenGL
|
||||||
|
|
||||||
from cura.ConvexHullNode import ConvexHullNode
|
from cura.ConvexHullNode import ConvexHullNode
|
||||||
|
|
||||||
from PyQt5 import QtCore, QtWidgets
|
from PyQt5 import QtCore, QtWidgets
|
||||||
|
@ -21,7 +24,8 @@ from . import LayerViewProxy
|
||||||
class LayerView(View):
|
class LayerView(View):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self._material = None
|
self._shader = None
|
||||||
|
self._selection_shader = None
|
||||||
self._num_layers = 0
|
self._num_layers = 0
|
||||||
self._layer_percentage = 0 # what percentage of layers need to be shown (SLider gives value between 0 - 100)
|
self._layer_percentage = 0 # what percentage of layers need to be shown (SLider gives value between 0 - 100)
|
||||||
self._proxy = LayerViewProxy.LayerViewProxy()
|
self._proxy = LayerViewProxy.LayerViewProxy()
|
||||||
|
@ -53,14 +57,10 @@ class LayerView(View):
|
||||||
def beginRendering(self):
|
def beginRendering(self):
|
||||||
scene = self.getController().getScene()
|
scene = self.getController().getScene()
|
||||||
renderer = self.getRenderer()
|
renderer = self.getRenderer()
|
||||||
renderer.setRenderSelection(False)
|
|
||||||
|
|
||||||
if not self._material:
|
if not self._selection_shader:
|
||||||
self._material = renderer.createMaterial(Resources.getPath(Resources.Shaders, "basic.vert"), Resources.getPath(Resources.Shaders, "vertexcolor.frag"))
|
self._selection_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "default.shader"))
|
||||||
self._material.setUniformValue("u_color", [1.0, 0.0, 0.0, 1.0])
|
self._selection_shader.setUniformValue("u_color", Color(32, 32, 32, 128))
|
||||||
|
|
||||||
self._selection_material = renderer.createMaterial(Resources.getPath(Resources.Shaders, "basic.vert"), Resources.getPath(Resources.Shaders, "color.frag"))
|
|
||||||
self._selection_material.setUniformValue("u_color", Color(35, 35, 35, 128))
|
|
||||||
|
|
||||||
for node in DepthFirstIterator(scene.getRoot()):
|
for node in DepthFirstIterator(scene.getRoot()):
|
||||||
# We do not want to render ConvexHullNode as it conflicts with the bottom layers.
|
# We do not want to render ConvexHullNode as it conflicts with the bottom layers.
|
||||||
|
@ -71,7 +71,7 @@ class LayerView(View):
|
||||||
if not node.render(renderer):
|
if not node.render(renderer):
|
||||||
if node.getMeshData() and node.isVisible():
|
if node.getMeshData() and node.isVisible():
|
||||||
if Selection.isSelected(node):
|
if Selection.isSelected(node):
|
||||||
renderer.queueNode(node, material = self._selection_material, transparent = True)
|
renderer.queueNode(node, transparent = True, shader = self._selection_shader)
|
||||||
layer_data = node.callDecoration("getLayerData")
|
layer_data = node.callDecoration("getLayerData")
|
||||||
if not layer_data:
|
if not layer_data:
|
||||||
continue
|
continue
|
||||||
|
@ -87,7 +87,7 @@ class LayerView(View):
|
||||||
end += counts
|
end += counts
|
||||||
|
|
||||||
# This uses glDrawRangeElements internally to only draw a certain range of lines.
|
# This uses glDrawRangeElements internally to only draw a certain range of lines.
|
||||||
renderer.queueNode(node, mesh = layer_data, material = self._material, mode = Renderer.RenderLines, start = start, end = end)
|
renderer.queueNode(node, mesh = layer_data, mode = RenderBatch.RenderMode.Lines, range = (start, end))
|
||||||
|
|
||||||
# We currently recreate the current "solid" layers every time a
|
# We currently recreate the current "solid" layers every time a
|
||||||
if not self._current_layer_mesh:
|
if not self._current_layer_mesh:
|
||||||
|
@ -111,7 +111,7 @@ class LayerView(View):
|
||||||
if self._current_layer_mesh:
|
if self._current_layer_mesh:
|
||||||
self._current_layer_mesh.addColors(layer_mesh.getColors() * brightness)
|
self._current_layer_mesh.addColors(layer_mesh.getColors() * brightness)
|
||||||
if self._current_layer_mesh:
|
if self._current_layer_mesh:
|
||||||
renderer.queueNode(node, mesh = self._current_layer_mesh, material = self._material)
|
renderer.queueNode(node, mesh = self._current_layer_mesh)
|
||||||
|
|
||||||
if not self._current_layer_jumps:
|
if not self._current_layer_jumps:
|
||||||
self._current_layer_jumps = MeshData()
|
self._current_layer_jumps = MeshData()
|
||||||
|
@ -133,7 +133,7 @@ class LayerView(View):
|
||||||
brightness = (2.0 - (i / self._solid_layers)) / 2.0
|
brightness = (2.0 - (i / self._solid_layers)) / 2.0
|
||||||
self._current_layer_jumps.addColors(layer_mesh.getColors() * brightness)
|
self._current_layer_jumps.addColors(layer_mesh.getColors() * brightness)
|
||||||
|
|
||||||
renderer.queueNode(node, mesh = self._current_layer_jumps, material = self._material)
|
renderer.queueNode(node, mesh = self._current_layer_jumps)
|
||||||
|
|
||||||
def setLayer(self, value):
|
def setLayer(self, value):
|
||||||
if self._current_layer_num != value:
|
if self._current_layer_num != value:
|
||||||
|
@ -152,31 +152,27 @@ class LayerView(View):
|
||||||
def calculateMaxLayers(self):
|
def calculateMaxLayers(self):
|
||||||
scene = self.getController().getScene()
|
scene = self.getController().getScene()
|
||||||
renderer = self.getRenderer()
|
renderer = self.getRenderer()
|
||||||
if renderer and self._material:
|
self._activity = True
|
||||||
self._activity = True
|
|
||||||
renderer.setRenderSelection(False)
|
|
||||||
self._old_max_layers = self._max_layers
|
|
||||||
## Recalculate num max layers
|
|
||||||
new_max_layers = 0
|
|
||||||
for node in DepthFirstIterator(scene.getRoot()):
|
|
||||||
if not node.render(renderer):
|
|
||||||
if node.getMeshData() and node.isVisible():
|
|
||||||
|
|
||||||
layer_data = node.callDecoration("getLayerData")
|
self._old_max_layers = self._max_layers
|
||||||
if not layer_data:
|
## Recalculate num max layers
|
||||||
continue
|
new_max_layers = 0
|
||||||
|
for node in DepthFirstIterator(scene.getRoot()):
|
||||||
|
layer_data = node.callDecoration("getLayerData")
|
||||||
|
if not layer_data:
|
||||||
|
continue
|
||||||
|
|
||||||
if new_max_layers < len(layer_data.getLayers()):
|
if new_max_layers < len(layer_data.getLayers()):
|
||||||
new_max_layers = len(layer_data.getLayers()) - 1
|
new_max_layers = len(layer_data.getLayers()) - 1
|
||||||
|
|
||||||
if new_max_layers > 0 and new_max_layers != self._old_max_layers:
|
if new_max_layers > 0 and new_max_layers != self._old_max_layers:
|
||||||
self._max_layers = new_max_layers
|
self._max_layers = new_max_layers
|
||||||
self.maxLayersChanged.emit()
|
self.maxLayersChanged.emit()
|
||||||
self._current_layer_num = self._max_layers
|
self._current_layer_num = self._max_layers
|
||||||
|
|
||||||
# This makes sure we update the current layer
|
# This makes sure we update the current layer
|
||||||
self.setLayer(int(self._max_layers))
|
self.setLayer(int(self._max_layers))
|
||||||
self.currentLayerNumChanged.emit()
|
self.currentLayerNumChanged.emit()
|
||||||
|
|
||||||
maxLayersChanged = Signal()
|
maxLayersChanged = Signal()
|
||||||
currentLayerNumChanged = Signal()
|
currentLayerNumChanged = Signal()
|
||||||
|
|
|
@ -10,16 +10,16 @@ import UM 1.0 as UM
|
||||||
|
|
||||||
Item
|
Item
|
||||||
{
|
{
|
||||||
width: 250
|
width: UM.Theme.sizes.button.width
|
||||||
height: 250
|
height: UM.Theme.sizes.slider_layerview_size.height
|
||||||
|
|
||||||
Slider
|
Slider
|
||||||
{
|
{
|
||||||
id: slider
|
id: slider
|
||||||
width: 10
|
width: UM.Theme.sizes.slider_layerview_size.width
|
||||||
height: 250
|
height: UM.Theme.sizes.slider_layerview_size.height
|
||||||
anchors.right : parent.right
|
anchors.left: parent.left
|
||||||
anchors.rightMargin: UM.Theme.sizes.slider_layerview_margin.width/2
|
anchors.leftMargin: UM.Theme.sizes.slider_layerview_margin.width/2
|
||||||
orientation: Qt.Vertical
|
orientation: Qt.Vertical
|
||||||
minimumValue: 0;
|
minimumValue: 0;
|
||||||
maximumValue: UM.LayerView.numLayers;
|
maximumValue: UM.LayerView.numLayers;
|
||||||
|
@ -31,15 +31,7 @@ Item
|
||||||
style: UM.Theme.styles.layerViewSlider
|
style: UM.Theme.styles.layerViewSlider
|
||||||
}
|
}
|
||||||
Rectangle {
|
Rectangle {
|
||||||
anchors.right: parent.right
|
anchors.left: parent.left
|
||||||
y: -UM.Theme.sizes.slider_layerview_background_extension.height
|
|
||||||
z: slider.z - 1
|
|
||||||
width: UM.Theme.sizes.button.width
|
|
||||||
height: UM.Theme.sizes.slider_layerview_background_extension.height
|
|
||||||
color: UM.Theme.colors.slider_text_background
|
|
||||||
}
|
|
||||||
Rectangle {
|
|
||||||
anchors.right : parent.right
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
z: slider.z - 1
|
z: slider.z - 1
|
||||||
width: UM.Theme.sizes.slider_layerview_background.width
|
width: UM.Theme.sizes.slider_layerview_background.width
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot, pyqtProperty
|
from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot, pyqtProperty
|
||||||
from UM.Application import Application
|
from UM.Application import Application
|
||||||
|
|
||||||
import LayerView
|
import LayerView
|
||||||
|
|
||||||
class LayerViewProxy(QObject):
|
class LayerViewProxy(QObject):
|
||||||
def __init__(self, parent = None):
|
def __init__(self, parent = None):
|
||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
|
|
|
@ -10,67 +10,53 @@ import UM 1.1 as UM
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
id: base;
|
id: base;
|
||||||
|
property int currentIndex: UM.ActiveTool.properties.SelectedIndex;
|
||||||
|
property string printSequence: UM.ActiveTool.properties.PrintSequence;
|
||||||
|
|
||||||
width: 0;
|
width: childrenRect.width;
|
||||||
height: 0;
|
height: childrenRect.height;
|
||||||
|
|
||||||
property variant position: mapToItem(null, 0, 0)
|
Column {
|
||||||
|
id: items
|
||||||
|
anchors.top: parent.top;
|
||||||
|
anchors.left: parent.left;
|
||||||
|
|
||||||
property real viewportWidth: UM.Application.mainWindow.width * UM.Application.mainWindow.viewportRect.width;
|
spacing: UM.Theme.sizes.default_margin.height;
|
||||||
property real viewportHeight: UM.Application.mainWindow.height * UM.Application.mainWindow.viewportRect.height;
|
|
||||||
|
|
||||||
property int currentIndex;
|
Label {
|
||||||
|
width: UM.Theme.sizes.setting.width;
|
||||||
|
wrapMode: Text.Wrap;
|
||||||
|
text: catalog.i18nc("@label", "Per Object Settings behavior may be unexpected when 'Print sequence' is set to 'All at Once'.")
|
||||||
|
color: UM.Theme.colors.text;
|
||||||
|
visible: base.printSequence == "all_at_once"
|
||||||
|
}
|
||||||
|
|
||||||
Rectangle {
|
UM.SettingItem {
|
||||||
id: settingsPanel;
|
id: profileSelection
|
||||||
|
|
||||||
z: 3;
|
width: UM.Theme.sizes.setting.width;
|
||||||
|
height: UM.Theme.sizes.setting.height;
|
||||||
|
|
||||||
width: UM.Theme.sizes.per_object_settings_panel.width;
|
name: catalog.i18nc("@label", "Object profile")
|
||||||
height: items.height + UM.Theme.sizes.default_margin.height * 2;
|
type: "enum"
|
||||||
|
indent: false
|
||||||
|
|
||||||
opacity: 0;
|
style: UM.Theme.styles.setting_item;
|
||||||
Behavior on opacity { NumberAnimation { } }
|
|
||||||
|
|
||||||
border.width: UM.Theme.sizes.per_object_settings_panel_border.width;
|
options: UM.ProfilesModel { addUseGlobal: true }
|
||||||
border.color: UM.Theme.colors.per_object_settings_panel_border;
|
|
||||||
|
|
||||||
color: UM.Theme.colors.per_object_settings_panel_background;
|
value: UM.ActiveTool.properties.Model.getItem(base.currentIndex).profile
|
||||||
|
|
||||||
DropArea {
|
onItemValueChanged: {
|
||||||
anchors.fill: parent;
|
var item = UM.ActiveTool.properties.Model.getItem(base.currentIndex);
|
||||||
|
UM.ActiveTool.properties.Model.setObjectProfile(item.id, value)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Column {
|
Column {
|
||||||
id: items
|
id: customisedSettings
|
||||||
anchors.top: parent.top;
|
|
||||||
anchors.topMargin: UM.Theme.sizes.default_margin.height;
|
|
||||||
|
|
||||||
spacing: UM.Theme.sizes.default_lining.height;
|
spacing: UM.Theme.sizes.default_lining.height;
|
||||||
|
width: UM.Theme.sizes.setting.width + UM.Theme.sizes.setting.height/2;
|
||||||
UM.SettingItem {
|
|
||||||
id: profileSelection
|
|
||||||
|
|
||||||
x: UM.Theme.sizes.per_object_settings_panel_border.width + 1
|
|
||||||
|
|
||||||
width: UM.Theme.sizes.setting.width;
|
|
||||||
height: UM.Theme.sizes.setting.height;
|
|
||||||
|
|
||||||
name: catalog.i18nc("@label", "Profile")
|
|
||||||
type: "enum"
|
|
||||||
perObjectSetting: true
|
|
||||||
|
|
||||||
style: UM.Theme.styles.setting_item;
|
|
||||||
|
|
||||||
options: UM.ProfilesModel { addUseGlobal: true }
|
|
||||||
|
|
||||||
value: UM.ActiveTool.properties.Model.getItem(base.currentIndex).profile
|
|
||||||
|
|
||||||
onItemValueChanged: {
|
|
||||||
var item = UM.ActiveTool.properties.Model.getItem(base.currentIndex);
|
|
||||||
UM.ActiveTool.properties.Model.setObjectProfile(item.id, value)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Repeater {
|
Repeater {
|
||||||
id: settings;
|
id: settings;
|
||||||
|
@ -80,7 +66,6 @@ Item {
|
||||||
UM.SettingItem {
|
UM.SettingItem {
|
||||||
width: UM.Theme.sizes.setting.width;
|
width: UM.Theme.sizes.setting.width;
|
||||||
height: UM.Theme.sizes.setting.height;
|
height: UM.Theme.sizes.setting.height;
|
||||||
x: UM.Theme.sizes.per_object_settings_panel_border.width + 1
|
|
||||||
|
|
||||||
name: model.label;
|
name: model.label;
|
||||||
type: model.type;
|
type: model.type;
|
||||||
|
@ -88,9 +73,8 @@ Item {
|
||||||
description: model.description;
|
description: model.description;
|
||||||
unit: model.unit;
|
unit: model.unit;
|
||||||
valid: model.valid;
|
valid: model.valid;
|
||||||
perObjectSetting: true
|
|
||||||
dismissable: true
|
|
||||||
options: model.options
|
options: model.options
|
||||||
|
indent: false
|
||||||
|
|
||||||
style: UM.Theme.styles.setting_item;
|
style: UM.Theme.styles.setting_item;
|
||||||
|
|
||||||
|
@ -98,87 +82,46 @@ Item {
|
||||||
settings.model.setSettingValue(model.key, value)
|
settings.model.setSettingValue(model.key, value)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Button {
|
Button
|
||||||
// anchors.left: parent.right;
|
|
||||||
// text: "x";
|
|
||||||
//
|
|
||||||
// width: UM.Theme.sizes.setting.height;
|
|
||||||
// height: UM.Theme.sizes.setting.height;
|
|
||||||
//
|
|
||||||
// opacity: parent.hovered || hovered ? 1 : 0;
|
|
||||||
// onClicked: UM.ActiveTool.properties.Model.removeSettingOverride(UM.ActiveTool.properties.Model.getItem(base.currentIndex).id, model.key)
|
|
||||||
//
|
|
||||||
// style: ButtonStyle { }
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Item
|
|
||||||
{
|
|
||||||
height: UM.Theme.sizes.default_margin.height / 2
|
|
||||||
width: parent.width
|
|
||||||
}
|
|
||||||
|
|
||||||
Button
|
|
||||||
{
|
|
||||||
id: customise_settings_button;
|
|
||||||
anchors.right: profileSelection.right;
|
|
||||||
visible: parseInt(UM.Preferences.getValue("cura/active_mode")) == 1
|
|
||||||
|
|
||||||
text: catalog.i18nc("@action:button", "Customize Settings");
|
|
||||||
|
|
||||||
style: ButtonStyle
|
|
||||||
{
|
|
||||||
background: Rectangle
|
|
||||||
{
|
{
|
||||||
width: control.width;
|
anchors.left: parent.right;
|
||||||
height: control.height;
|
|
||||||
color: control.hovered ? UM.Theme.colors.load_save_button_hover : UM.Theme.colors.load_save_button;
|
|
||||||
}
|
|
||||||
label: Label
|
|
||||||
{
|
|
||||||
text: control.text;
|
|
||||||
color: UM.Theme.colors.load_save_button_text;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
onClicked: settingPickDialog.visible = true;
|
width: UM.Theme.sizes.setting.height;
|
||||||
|
height: UM.Theme.sizes.setting.height;
|
||||||
|
|
||||||
Connections
|
onClicked: UM.ActiveTool.properties.Model.removeSettingOverride(UM.ActiveTool.properties.Model.getItem(base.currentIndex).id, model.key)
|
||||||
{
|
|
||||||
target: UM.Preferences;
|
|
||||||
|
|
||||||
onPreferenceChanged:
|
style: ButtonStyle
|
||||||
{
|
{
|
||||||
customise_settings_button.visible = parseInt(UM.Preferences.getValue("cura/active_mode"))
|
background: Rectangle
|
||||||
|
{
|
||||||
|
color: control.hovered ? control.parent.style.controlHighlightColor : control.parent.style.controlColor;
|
||||||
|
UM.RecolorImage
|
||||||
|
{
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
width: parent.width/2
|
||||||
|
height: parent.height/2
|
||||||
|
sourceSize.width: width
|
||||||
|
sourceSize.height: width
|
||||||
|
color: UM.Theme.colors.setting_control_revert
|
||||||
|
source: UM.Theme.icons.cross1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
UM.I18nCatalog { id: catalog; name: "uranium"; }
|
Button
|
||||||
}
|
{
|
||||||
|
id: customise_settings_button;
|
||||||
|
anchors.right: profileSelection.right;
|
||||||
|
height: UM.Theme.sizes.setting.height;
|
||||||
|
visible: parseInt(UM.Preferences.getValue("cura/active_mode")) == 1
|
||||||
|
|
||||||
Repeater {
|
text: catalog.i18nc("@action:button", "Add Setting");
|
||||||
model: UM.ActiveTool.properties.Model;
|
|
||||||
delegate: Button {
|
|
||||||
x: ((model.x + 1.0) / 2.0) * base.viewportWidth - base.position.x - width / 2
|
|
||||||
y: -((model.y + 1.0) / 2.0) * base.viewportHeight + (base.viewportHeight - base.position.y) + height / 2
|
|
||||||
|
|
||||||
width: UM.Theme.sizes.per_object_settings_button.width
|
|
||||||
height: UM.Theme.sizes.per_object_settings_button.height
|
|
||||||
|
|
||||||
tooltip: catalog.i18nc("@info:tooltip", "Customise settings for this object");
|
|
||||||
|
|
||||||
checkable: true;
|
|
||||||
onClicked: {
|
|
||||||
base.currentIndex = index;
|
|
||||||
|
|
||||||
settingsPanel.anchors.left = right;
|
|
||||||
settingsPanel.anchors.top = top;
|
|
||||||
|
|
||||||
settingsPanel.opacity = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
style: ButtonStyle
|
style: ButtonStyle
|
||||||
{
|
{
|
||||||
|
@ -186,20 +129,36 @@ Item {
|
||||||
{
|
{
|
||||||
width: control.width;
|
width: control.width;
|
||||||
height: control.height;
|
height: control.height;
|
||||||
|
border.width: UM.Theme.sizes.default_lining.width;
|
||||||
color: control.hovered ? UM.Theme.colors.button_active : UM.Theme.colors.button_hover;
|
border.color: control.pressed ? UM.Theme.colors.action_button_active_border :
|
||||||
|
control.hovered ? UM.Theme.colors.action_button_hovered_border : UM.Theme.colors.action_button_border
|
||||||
|
color: control.pressed ? UM.Theme.colors.action_button_active :
|
||||||
|
control.hovered ? UM.Theme.colors.action_button_hovered : UM.Theme.colors.action_button
|
||||||
}
|
}
|
||||||
label: Image {
|
label: Label
|
||||||
width: control.width;
|
{
|
||||||
height: control.height;
|
text: control.text;
|
||||||
sourceSize.width: width;
|
color: UM.Theme.colors.setting_control_text;
|
||||||
sourceSize.height: height;
|
anchors.centerIn: parent
|
||||||
source: UM.Theme.icons.plus;
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onClicked: settingPickDialog.visible = true;
|
||||||
|
|
||||||
|
Connections
|
||||||
|
{
|
||||||
|
target: UM.Preferences;
|
||||||
|
|
||||||
|
onPreferenceChanged:
|
||||||
|
{
|
||||||
|
customise_settings_button.visible = parseInt(UM.Preferences.getValue("cura/active_mode"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UM.I18nCatalog { id: catalog; name: "uranium"; }
|
||||||
|
|
||||||
UM.Dialog {
|
UM.Dialog {
|
||||||
id: settingPickDialog
|
id: settingPickDialog
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
# Uranium is released under the terms of the AGPLv3 or higher.
|
# Uranium is released under the terms of the AGPLv3 or higher.
|
||||||
|
|
||||||
from UM.Tool import Tool
|
from UM.Tool import Tool
|
||||||
|
from UM.Scene.Selection import Selection
|
||||||
|
from UM.Application import Application
|
||||||
|
|
||||||
from . import PerObjectSettingsModel
|
from . import PerObjectSettingsModel
|
||||||
|
|
||||||
|
@ -9,10 +11,19 @@ class PerObjectSettingsTool(Tool):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
||||||
self.setExposedProperties("Model")
|
self.setExposedProperties("Model", "SelectedIndex", "PrintSequence")
|
||||||
|
|
||||||
def event(self, event):
|
def event(self, event):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def getModel(self):
|
def getModel(self):
|
||||||
return PerObjectSettingsModel.PerObjectSettingsModel()
|
return PerObjectSettingsModel.PerObjectSettingsModel()
|
||||||
|
|
||||||
|
def getSelectedIndex(self):
|
||||||
|
selected_object_id = id(Selection.getSelectedObject(0))
|
||||||
|
index = self.getModel().find("id", selected_object_id)
|
||||||
|
return index
|
||||||
|
|
||||||
|
def getPrintSequence(self):
|
||||||
|
settings = Application.getInstance().getMachineManager().getActiveProfile()
|
||||||
|
return settings.getSettingValue("print_sequence")
|
|
@ -44,9 +44,7 @@ class SettingOverrideModel(ListModel):
|
||||||
if not self._decorator:
|
if not self._decorator:
|
||||||
return
|
return
|
||||||
|
|
||||||
self._ignore_setting_change = key
|
|
||||||
self._decorator.setSettingValue(key, value)
|
self._decorator.setSettingValue(key, value)
|
||||||
self._ignore_setting_change = None
|
|
||||||
|
|
||||||
def _onDecoratorsChanged(self, node):
|
def _onDecoratorsChanged(self, node):
|
||||||
if not self._node.getDecorator(SettingOverrideDecorator):
|
if not self._node.getDecorator(SettingOverrideDecorator):
|
||||||
|
@ -97,6 +95,6 @@ class SettingOverrideModel(ListModel):
|
||||||
def _onSettingValueChanged(self, setting):
|
def _onSettingValueChanged(self, setting):
|
||||||
index = self.find("key", setting.getKey())
|
index = self.find("key", setting.getKey())
|
||||||
value = self._decorator.getSettingValue(setting.getKey())
|
value = self._decorator.getSettingValue(setting.getKey())
|
||||||
if index != -1 and self._ignore_setting_change != setting.getKey():
|
if index != -1:
|
||||||
self.setProperty(index, "value", str(value))
|
self.setProperty(index, "value", str(value))
|
||||||
self.setProperty(index, "valid", setting.validate(value))
|
self.setProperty(index, "valid", setting.validate(value))
|
||||||
|
|
|
@ -19,7 +19,8 @@ def getMetaData():
|
||||||
"name": i18n_catalog.i18nc("@label", "Per Object Settings"),
|
"name": i18n_catalog.i18nc("@label", "Per Object Settings"),
|
||||||
"description": i18n_catalog.i18nc("@info:tooltip", "Configure Per Object Settings"),
|
"description": i18n_catalog.i18nc("@info:tooltip", "Configure Per Object Settings"),
|
||||||
"icon": "setting_per_object",
|
"icon": "setting_per_object",
|
||||||
"tool_panel": "PerObjectSettingsPanel.qml"
|
"tool_panel": "PerObjectSettingsPanel.qml",
|
||||||
|
"weight": 3
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,12 @@ class RemovableDriveOutputDevice(OutputDevice):
|
||||||
self.setIconName("save_sd")
|
self.setIconName("save_sd")
|
||||||
self.setPriority(1)
|
self.setPriority(1)
|
||||||
|
|
||||||
|
self._writing = False
|
||||||
|
|
||||||
def requestWrite(self, node, file_name = None):
|
def requestWrite(self, node, file_name = None):
|
||||||
|
if self._writing:
|
||||||
|
raise OutputDeviceError.DeviceBusyError()
|
||||||
|
|
||||||
gcode_writer = Application.getInstance().getMeshFileHandler().getWriterByMimeType("text/x-gcode")
|
gcode_writer = Application.getInstance().getMeshFileHandler().getWriterByMimeType("text/x-gcode")
|
||||||
if not gcode_writer:
|
if not gcode_writer:
|
||||||
Logger.log("e", "Could not find GCode writer, not writing to removable drive %s", self.getName())
|
Logger.log("e", "Could not find GCode writer, not writing to removable drive %s", self.getName())
|
||||||
|
@ -52,11 +57,16 @@ class RemovableDriveOutputDevice(OutputDevice):
|
||||||
message = Message(catalog.i18nc("@info:progress", "Saving to Removable Drive <filename>{0}</filename>").format(self.getName()), 0, False, -1)
|
message = Message(catalog.i18nc("@info:progress", "Saving to Removable Drive <filename>{0}</filename>").format(self.getName()), 0, False, -1)
|
||||||
message.show()
|
message.show()
|
||||||
|
|
||||||
|
self.writeStarted.emit(self)
|
||||||
|
|
||||||
job._message = message
|
job._message = message
|
||||||
|
self._writing = True
|
||||||
job.start()
|
job.start()
|
||||||
except PermissionError as e:
|
except PermissionError as e:
|
||||||
|
Logger.log("e", "Permission denied when trying to write to %s: %s", file_name, str(e))
|
||||||
raise OutputDeviceError.PermissionDeniedError() from e
|
raise OutputDeviceError.PermissionDeniedError() from e
|
||||||
except OSError as e:
|
except OSError as e:
|
||||||
|
Logger.log("e", "Operating system would not let us write to %s: %s", file_name, str(e))
|
||||||
raise OutputDeviceError.WriteRequestFailedError() from e
|
raise OutputDeviceError.WriteRequestFailedError() from e
|
||||||
|
|
||||||
def _onProgress(self, job, progress):
|
def _onProgress(self, job, progress):
|
||||||
|
@ -68,6 +78,8 @@ class RemovableDriveOutputDevice(OutputDevice):
|
||||||
if hasattr(job, "_message"):
|
if hasattr(job, "_message"):
|
||||||
job._message.hide()
|
job._message.hide()
|
||||||
job._message = None
|
job._message = None
|
||||||
|
|
||||||
|
self._writing = False
|
||||||
self.writeFinished.emit(self)
|
self.writeFinished.emit(self)
|
||||||
if job.getResult():
|
if job.getResult():
|
||||||
message = Message(catalog.i18nc("@info:status", "Saved to Removable Drive {0} as {1}").format(self.getName(), os.path.basename(job.getFileName())))
|
message = Message(catalog.i18nc("@info:status", "Saved to Removable Drive {0} as {1}").format(self.getName(), os.path.basename(job.getFileName())))
|
||||||
|
|
|
@ -20,17 +20,17 @@ catalog = i18nCatalog("cura")
|
||||||
|
|
||||||
# WinAPI Constants that we need
|
# WinAPI Constants that we need
|
||||||
# Hardcoded here due to stupid WinDLL stuff that does not give us access to these values.
|
# Hardcoded here due to stupid WinDLL stuff that does not give us access to these values.
|
||||||
DRIVE_REMOVABLE = 2
|
DRIVE_REMOVABLE = 2 # [CodeStyle: Windows Enum value]
|
||||||
|
|
||||||
GENERIC_READ = 2147483648
|
GENERIC_READ = 2147483648 # [CodeStyle: Windows Enum value]
|
||||||
GENERIC_WRITE = 1073741824
|
GENERIC_WRITE = 1073741824 # [CodeStyle: Windows Enum value]
|
||||||
|
|
||||||
FILE_SHARE_READ = 1
|
FILE_SHARE_READ = 1 # [CodeStyle: Windows Enum value]
|
||||||
FILE_SHARE_WRITE = 2
|
FILE_SHARE_WRITE = 2 # [CodeStyle: Windows Enum value]
|
||||||
|
|
||||||
IOCTL_STORAGE_EJECT_MEDIA = 2967560
|
IOCTL_STORAGE_EJECT_MEDIA = 2967560 # [CodeStyle: Windows Enum value]
|
||||||
|
|
||||||
OPEN_EXISTING = 3
|
OPEN_EXISTING = 3 # [CodeStyle: Windows Enum value]
|
||||||
|
|
||||||
## Removable drive support for windows
|
## Removable drive support for windows
|
||||||
class WindowsRemovableDrivePlugin(RemovableDrivePlugin.RemovableDrivePlugin):
|
class WindowsRemovableDrivePlugin(RemovableDrivePlugin.RemovableDrivePlugin):
|
||||||
|
@ -65,11 +65,11 @@ class WindowsRemovableDrivePlugin(RemovableDrivePlugin.RemovableDrivePlugin):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# Check for the free space. Some card readers show up as a drive with 0 space free when there is no card inserted.
|
# Check for the free space. Some card readers show up as a drive with 0 space free when there is no card inserted.
|
||||||
freeBytes = ctypes.c_longlong(0)
|
free_bytes = ctypes.c_longlong(0)
|
||||||
if windll.kernel32.GetDiskFreeSpaceExA(drive.encode("ascii"), ctypes.byref(freeBytes), None, None) == 0:
|
if windll.kernel32.GetDiskFreeSpaceExA(drive.encode("ascii"), ctypes.byref(free_bytes), None, None) == 0:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if freeBytes.value < 1:
|
if free_bytes.value < 1:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
drives[drive] = "{0} ({1}:)".format(volume_name, letter)
|
drives[drive] = "{0} ({1}:)".format(volume_name, letter)
|
||||||
|
|
|
@ -110,7 +110,7 @@ class SliceInfo(Extension):
|
||||||
|
|
||||||
# Convert data to bytes
|
# Convert data to bytes
|
||||||
submitted_data = urllib.parse.urlencode(submitted_data)
|
submitted_data = urllib.parse.urlencode(submitted_data)
|
||||||
binary_data = submitted_data.encode('utf-8')
|
binary_data = submitted_data.encode("utf-8")
|
||||||
|
|
||||||
# Submit data
|
# Submit data
|
||||||
try:
|
try:
|
||||||
|
|
68
plugins/SolidView/SolidView.py
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
# Copyright (c) 2015 Ultimaker B.V.
|
||||||
|
# Cura is released under the terms of the AGPLv3 or higher.
|
||||||
|
|
||||||
|
from UM.View.View import View
|
||||||
|
from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
|
||||||
|
from UM.Resources import Resources
|
||||||
|
from UM.Application import Application
|
||||||
|
from UM.Math.Color import Color
|
||||||
|
from UM.Preferences import Preferences
|
||||||
|
from UM.View.Renderer import Renderer
|
||||||
|
|
||||||
|
from UM.View.GL.OpenGL import OpenGL
|
||||||
|
|
||||||
|
import math
|
||||||
|
|
||||||
|
## Standard view for mesh models.
|
||||||
|
class SolidView(View):
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__()
|
||||||
|
|
||||||
|
Preferences.getInstance().addPreference("view/show_overhang", True)
|
||||||
|
|
||||||
|
self._enabled_shader = None
|
||||||
|
self._disabled_shader = None
|
||||||
|
|
||||||
|
def beginRendering(self):
|
||||||
|
scene = self.getController().getScene()
|
||||||
|
renderer = self.getRenderer()
|
||||||
|
|
||||||
|
if not self._enabled_shader:
|
||||||
|
self._enabled_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "overhang.shader"))
|
||||||
|
|
||||||
|
if not self._disabled_shader:
|
||||||
|
self._disabled_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "overhang.shader"))
|
||||||
|
self._disabled_shader.setUniformValue("u_diffuseColor", [0.68, 0.68, 0.68, 1.0])
|
||||||
|
|
||||||
|
if Application.getInstance().getMachineManager().getActiveProfile():
|
||||||
|
profile = Application.getInstance().getMachineManager().getActiveProfile()
|
||||||
|
|
||||||
|
if profile.getSettingValue("support_enable") or not Preferences.getInstance().getValue("view/show_overhang"):
|
||||||
|
angle = profile.getSettingValue("support_angle")
|
||||||
|
if angle != None:
|
||||||
|
self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(90 - angle)))
|
||||||
|
else:
|
||||||
|
self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(0)))
|
||||||
|
|
||||||
|
for node in DepthFirstIterator(scene.getRoot()):
|
||||||
|
if not node.render(renderer):
|
||||||
|
if node.getMeshData() and node.isVisible():
|
||||||
|
# TODO: Find a better way to handle this
|
||||||
|
#if node.getBoundingBoxMesh():
|
||||||
|
# renderer.queueNode(scene.getRoot(), mesh = node.getBoundingBoxMesh(),mode = Renderer.RenderLines)
|
||||||
|
if hasattr(node, "_outside_buildarea"):
|
||||||
|
if node._outside_buildarea:
|
||||||
|
renderer.queueNode(node, shader = self._disabled_shader)
|
||||||
|
else:
|
||||||
|
renderer.queueNode(node, shader = self._enabled_shader)
|
||||||
|
else:
|
||||||
|
renderer.queueNode(node, material = self._enabled_shader)
|
||||||
|
if node.callDecoration("isGroup"):
|
||||||
|
renderer.queueNode(scene.getRoot(), mesh = node.getBoundingBoxMesh(),mode = Renderer.RenderLines)
|
||||||
|
|
||||||
|
def endRendering(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
#def _onPreferenceChanged(self, preference):
|
||||||
|
#if preference == "view/show_overhang": ## Todo: This a printer only setting. Should be removed from Uranium.
|
||||||
|
#self._enabled_material = None
|
24
plugins/SolidView/__init__.py
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
# Copyright (c) 2015 Ultimaker B.V.
|
||||||
|
# Cura is released under the terms of the AGPLv3 or higher.
|
||||||
|
|
||||||
|
from . import SolidView
|
||||||
|
|
||||||
|
from UM.i18n import i18nCatalog
|
||||||
|
i18n_catalog = i18nCatalog("cura")
|
||||||
|
|
||||||
|
def getMetaData():
|
||||||
|
return {
|
||||||
|
"plugin": {
|
||||||
|
"name": i18n_catalog.i18nc("@label", "Solid View"),
|
||||||
|
"author": "Ultimaker",
|
||||||
|
"version": "1.0",
|
||||||
|
"decription": i18n_catalog.i18nc("@info:whatsthis", "Provides a normal solid mesh view."),
|
||||||
|
"api": 2
|
||||||
|
},
|
||||||
|
"view": {
|
||||||
|
"name": i18n_catalog.i18nc("@item:inmenu", "Solid")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def register(app):
|
||||||
|
return { "view": SolidView.SolidView() }
|
|
@ -45,7 +45,7 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
|
||||||
self._connect_thread.daemon = True
|
self._connect_thread.daemon = True
|
||||||
|
|
||||||
self._end_stop_thread = threading.Thread(target = self._pollEndStop)
|
self._end_stop_thread = threading.Thread(target = self._pollEndStop)
|
||||||
self._end_stop_thread.deamon = True
|
self._end_stop_thread.daemon = True
|
||||||
self._poll_endstop = -1
|
self._poll_endstop = -1
|
||||||
|
|
||||||
# Printer is connected
|
# Printer is connected
|
||||||
|
@ -65,6 +65,7 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
|
||||||
|
|
||||||
self._update_firmware_thread = threading.Thread(target= self._updateFirmware)
|
self._update_firmware_thread = threading.Thread(target= self._updateFirmware)
|
||||||
self._update_firmware_thread.daemon = True
|
self._update_firmware_thread.daemon = True
|
||||||
|
self.firmwareUpdateComplete.connect(self._onFirmwareUpdateComplete)
|
||||||
|
|
||||||
self._heatup_wait_start_time = time.time()
|
self._heatup_wait_start_time = time.time()
|
||||||
|
|
||||||
|
@ -197,6 +198,8 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
|
||||||
|
|
||||||
## Private fuction (threaded) that actually uploads the firmware.
|
## Private fuction (threaded) that actually uploads the firmware.
|
||||||
def _updateFirmware(self):
|
def _updateFirmware(self):
|
||||||
|
self.setProgress(0, 100)
|
||||||
|
|
||||||
if self._is_connecting or self._is_connected:
|
if self._is_connecting or self._is_connected:
|
||||||
self.close()
|
self.close()
|
||||||
hex_file = intelHex.readHex(self._firmware_file_name)
|
hex_file = intelHex.readHex(self._firmware_file_name)
|
||||||
|
@ -207,7 +210,11 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
|
||||||
|
|
||||||
programmer = stk500v2.Stk500v2()
|
programmer = stk500v2.Stk500v2()
|
||||||
programmer.progressCallback = self.setProgress
|
programmer.progressCallback = self.setProgress
|
||||||
programmer.connect(self._serial_port)
|
|
||||||
|
try:
|
||||||
|
programmer.connect(self._serial_port)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
time.sleep(1) # Give programmer some time to connect. Might need more in some cases, but this worked in all tested cases.
|
time.sleep(1) # Give programmer some time to connect. Might need more in some cases, but this worked in all tested cases.
|
||||||
|
|
||||||
|
@ -336,8 +343,8 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
|
||||||
self._connect_thread = threading.Thread(target=self._connect)
|
self._connect_thread = threading.Thread(target=self._connect)
|
||||||
self._connect_thread.daemon = True
|
self._connect_thread.daemon = True
|
||||||
|
|
||||||
|
self.setIsConnected(False)
|
||||||
if self._serial is not None:
|
if self._serial is not None:
|
||||||
self.setIsConnected(False)
|
|
||||||
try:
|
try:
|
||||||
self._listen_thread.join()
|
self._listen_thread.join()
|
||||||
except:
|
except:
|
||||||
|
@ -464,17 +471,17 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
|
||||||
self.showControlInterface()
|
self.showControlInterface()
|
||||||
|
|
||||||
def _setEndstopState(self, endstop_key, value):
|
def _setEndstopState(self, endstop_key, value):
|
||||||
if endstop_key == b'x_min':
|
if endstop_key == b"x_min":
|
||||||
if self._x_min_endstop_pressed != value:
|
if self._x_min_endstop_pressed != value:
|
||||||
self.endstopStateChanged.emit('x_min', value)
|
self.endstopStateChanged.emit("x_min", value)
|
||||||
self._x_min_endstop_pressed = value
|
self._x_min_endstop_pressed = value
|
||||||
elif endstop_key == b'y_min':
|
elif endstop_key == b"y_min":
|
||||||
if self._y_min_endstop_pressed != value:
|
if self._y_min_endstop_pressed != value:
|
||||||
self.endstopStateChanged.emit('y_min', value)
|
self.endstopStateChanged.emit("y_min", value)
|
||||||
self._y_min_endstop_pressed = value
|
self._y_min_endstop_pressed = value
|
||||||
elif endstop_key == b'z_min':
|
elif endstop_key == b"z_min":
|
||||||
if self._z_min_endstop_pressed != value:
|
if self._z_min_endstop_pressed != value:
|
||||||
self.endstopStateChanged.emit('z_min', value)
|
self.endstopStateChanged.emit("z_min", value)
|
||||||
self._z_min_endstop_pressed = value
|
self._z_min_endstop_pressed = value
|
||||||
|
|
||||||
## Listen thread function.
|
## Listen thread function.
|
||||||
|
@ -521,8 +528,8 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
|
||||||
pass
|
pass
|
||||||
#TODO: temperature changed callback
|
#TODO: temperature changed callback
|
||||||
elif b"_min" in line or b"_max" in line:
|
elif b"_min" in line or b"_max" in line:
|
||||||
tag, value = line.split(b':', 1)
|
tag, value = line.split(b":", 1)
|
||||||
self._setEndstopState(tag,(b'H' in value or b'TRIGGERED' in value))
|
self._setEndstopState(tag,(b"H" in value or b"TRIGGERED" in value))
|
||||||
|
|
||||||
if self._is_printing:
|
if self._is_printing:
|
||||||
if line == b"" and time.time() > ok_timeout:
|
if line == b"" and time.time() > ok_timeout:
|
||||||
|
|
|
@ -11,6 +11,7 @@ from UM.Logger import Logger
|
||||||
from UM.PluginRegistry import PluginRegistry
|
from UM.PluginRegistry import PluginRegistry
|
||||||
from UM.OutputDevice.OutputDevicePlugin import OutputDevicePlugin
|
from UM.OutputDevice.OutputDevicePlugin import OutputDevicePlugin
|
||||||
from UM.Qt.ListModel import ListModel
|
from UM.Qt.ListModel import ListModel
|
||||||
|
from UM.Message import Message
|
||||||
|
|
||||||
from cura.CuraApplication import CuraApplication
|
from cura.CuraApplication import CuraApplication
|
||||||
|
|
||||||
|
@ -55,6 +56,7 @@ class USBPrinterManager(QObject, SignalEmitter, OutputDevicePlugin, Extension):
|
||||||
printerConnectionStateChanged = pyqtSignal()
|
printerConnectionStateChanged = pyqtSignal()
|
||||||
|
|
||||||
progressChanged = pyqtSignal()
|
progressChanged = pyqtSignal()
|
||||||
|
|
||||||
@pyqtProperty(float, notify = progressChanged)
|
@pyqtProperty(float, notify = progressChanged)
|
||||||
def progress(self):
|
def progress(self):
|
||||||
progress = 0
|
progress = 0
|
||||||
|
@ -95,6 +97,10 @@ class USBPrinterManager(QObject, SignalEmitter, OutputDevicePlugin, Extension):
|
||||||
|
|
||||||
@pyqtSlot()
|
@pyqtSlot()
|
||||||
def updateAllFirmware(self):
|
def updateAllFirmware(self):
|
||||||
|
if not self._printer_connections:
|
||||||
|
Message("Cannot update firmware, there were no connected printers found.").show()
|
||||||
|
return
|
||||||
|
|
||||||
self.spawnFirmwareInterface("")
|
self.spawnFirmwareInterface("")
|
||||||
for printer_connection in self._printer_connections:
|
for printer_connection in self._printer_connections:
|
||||||
try:
|
try:
|
||||||
|
@ -159,6 +165,16 @@ class USBPrinterManager(QObject, SignalEmitter, OutputDevicePlugin, Extension):
|
||||||
continue
|
continue
|
||||||
self._serial_port_list = list(serial_ports)
|
self._serial_port_list = list(serial_ports)
|
||||||
|
|
||||||
|
connections_to_remove = []
|
||||||
|
for port, connection in self._printer_connections.items():
|
||||||
|
if port not in self._serial_port_list:
|
||||||
|
connection.close()
|
||||||
|
connections_to_remove.append(port)
|
||||||
|
|
||||||
|
for port in connections_to_remove:
|
||||||
|
del self._printer_connections[port]
|
||||||
|
|
||||||
|
|
||||||
## Because the model needs to be created in the same thread as the QMLEngine, we use a signal.
|
## Because the model needs to be created in the same thread as the QMLEngine, we use a signal.
|
||||||
def addConnection(self, serial_port):
|
def addConnection(self, serial_port):
|
||||||
connection = PrinterConnection.PrinterConnection(serial_port)
|
connection = PrinterConnection.PrinterConnection(serial_port)
|
||||||
|
|
|
@ -4,22 +4,22 @@ To support more chips add the relevant data to the avrChipDB list.
|
||||||
This is a python 3 conversion of the code created by David Braam for the Cura project.
|
This is a python 3 conversion of the code created by David Braam for the Cura project.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
avrChipDB = {
|
avr_chip_db = {
|
||||||
'ATMega1280': {
|
"ATMega1280": {
|
||||||
'signature': [0x1E, 0x97, 0x03],
|
"signature": [0x1E, 0x97, 0x03],
|
||||||
'pageSize': 128,
|
"pageSize": 128,
|
||||||
'pageCount': 512,
|
"pageCount": 512,
|
||||||
},
|
},
|
||||||
'ATMega2560': {
|
"ATMega2560": {
|
||||||
'signature': [0x1E, 0x98, 0x01],
|
"signature": [0x1E, 0x98, 0x01],
|
||||||
'pageSize': 128,
|
"pageSize": 128,
|
||||||
'pageCount': 1024,
|
"pageCount": 1024,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
def getChipFromDB(sig):
|
def getChipFromDB(sig):
|
||||||
for chip in avrChipDB.values():
|
for chip in avr_chip_db.values():
|
||||||
if chip['signature'] == sig:
|
if chip["signature"] == sig:
|
||||||
return chip
|
return chip
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
|
@ -11,36 +11,36 @@ def readHex(filename):
|
||||||
Read an verify an intel hex file. Return the data as an list of bytes.
|
Read an verify an intel hex file. Return the data as an list of bytes.
|
||||||
"""
|
"""
|
||||||
data = []
|
data = []
|
||||||
extraAddr = 0
|
extra_addr = 0
|
||||||
f = io.open(filename, "r")
|
f = io.open(filename, "r")
|
||||||
for line in f:
|
for line in f:
|
||||||
line = line.strip()
|
line = line.strip()
|
||||||
if len(line) < 1:
|
if len(line) < 1:
|
||||||
continue
|
continue
|
||||||
if line[0] != ':':
|
if line[0] != ":":
|
||||||
raise Exception("Hex file has a line not starting with ':'")
|
raise Exception("Hex file has a line not starting with ':'")
|
||||||
recLen = int(line[1:3], 16)
|
rec_len = int(line[1:3], 16)
|
||||||
addr = int(line[3:7], 16) + extraAddr
|
addr = int(line[3:7], 16) + extra_addr
|
||||||
recType = int(line[7:9], 16)
|
rec_type = int(line[7:9], 16)
|
||||||
if len(line) != recLen * 2 + 11:
|
if len(line) != rec_len * 2 + 11:
|
||||||
raise Exception("Error in hex file: " + line)
|
raise Exception("Error in hex file: " + line)
|
||||||
checkSum = 0
|
check_sum = 0
|
||||||
for i in range(0, recLen + 5):
|
for i in range(0, rec_len + 5):
|
||||||
checkSum += int(line[i*2+1:i*2+3], 16)
|
check_sum += int(line[i*2+1:i*2+3], 16)
|
||||||
checkSum &= 0xFF
|
check_sum &= 0xFF
|
||||||
if checkSum != 0:
|
if check_sum != 0:
|
||||||
raise Exception("Checksum error in hex file: " + line)
|
raise Exception("Checksum error in hex file: " + line)
|
||||||
|
|
||||||
if recType == 0:#Data record
|
if rec_type == 0:#Data record
|
||||||
while len(data) < addr + recLen:
|
while len(data) < addr + rec_len:
|
||||||
data.append(0)
|
data.append(0)
|
||||||
for i in range(0, recLen):
|
for i in range(0, rec_len):
|
||||||
data[addr + i] = int(line[i*2+9:i*2+11], 16)
|
data[addr + i] = int(line[i*2+9:i*2+11], 16)
|
||||||
elif recType == 1: #End Of File record
|
elif rec_type == 1: #End Of File record
|
||||||
pass
|
pass
|
||||||
elif recType == 2: #Extended Segment Address Record
|
elif rec_type == 2: #Extended Segment Address Record
|
||||||
extraAddr = int(line[9:13], 16) * 16
|
extra_addr = int(line[9:13], 16) * 16
|
||||||
else:
|
else:
|
||||||
print(recType, recLen, addr, checkSum, line)
|
print(rec_type, rec_len, addr, check_sum, line)
|
||||||
f.close()
|
f.close()
|
||||||
return data
|
return data
|
||||||
|
|
|
@ -14,18 +14,18 @@ class IspBase():
|
||||||
Base class for ISP based AVR programmers.
|
Base class for ISP based AVR programmers.
|
||||||
Functions in this class raise an IspError when something goes wrong.
|
Functions in this class raise an IspError when something goes wrong.
|
||||||
"""
|
"""
|
||||||
def programChip(self, flashData):
|
def programChip(self, flash_data):
|
||||||
""" Program a chip with the given flash data. """
|
""" Program a chip with the given flash data. """
|
||||||
self.curExtAddr = -1
|
self.cur_ext_addr = -1
|
||||||
self.chip = chipDB.getChipFromDB(self.getSignature())
|
self.chip = chipDB.getChipFromDB(self.getSignature())
|
||||||
if not self.chip:
|
if not self.chip:
|
||||||
raise IspError("Chip with signature: " + str(self.getSignature()) + "not found")
|
raise IspError("Chip with signature: " + str(self.getSignature()) + "not found")
|
||||||
self.chipErase()
|
self.chipErase()
|
||||||
|
|
||||||
print("Flashing %i bytes" % len(flashData))
|
print("Flashing %i bytes" % len(flash_data))
|
||||||
self.writeFlash(flashData)
|
self.writeFlash(flash_data)
|
||||||
print("Verifying %i bytes" % len(flashData))
|
print("Verifying %i bytes" % len(flash_data))
|
||||||
self.verifyFlash(flashData)
|
self.verifyFlash(flash_data)
|
||||||
print("Completed")
|
print("Completed")
|
||||||
|
|
||||||
def getSignature(self):
|
def getSignature(self):
|
||||||
|
@ -45,20 +45,20 @@ class IspBase():
|
||||||
"""
|
"""
|
||||||
self.sendISP([0xAC, 0x80, 0x00, 0x00])
|
self.sendISP([0xAC, 0x80, 0x00, 0x00])
|
||||||
|
|
||||||
def writeFlash(self, flashData):
|
def writeFlash(self, flash_data):
|
||||||
"""
|
"""
|
||||||
Write the flash data, needs to be implemented in a subclass.
|
Write the flash data, needs to be implemented in a subclass.
|
||||||
"""
|
"""
|
||||||
raise IspError("Called undefined writeFlash")
|
raise IspError("Called undefined writeFlash")
|
||||||
|
|
||||||
def verifyFlash(self, flashData):
|
def verifyFlash(self, flash_data):
|
||||||
"""
|
"""
|
||||||
Verify the flash data, needs to be implemented in a subclass.
|
Verify the flash data, needs to be implemented in a subclass.
|
||||||
"""
|
"""
|
||||||
raise IspError("Called undefined verifyFlash")
|
raise IspError("Called undefined verifyFlash")
|
||||||
|
|
||||||
|
|
||||||
class IspError(BaseException):
|
class IspError(Exception):
|
||||||
def __init__(self, value):
|
def __init__(self, value):
|
||||||
self.value = value
|
self.value = value
|
||||||
|
|
||||||
|
|
|
@ -19,10 +19,10 @@ class Stk500v2(ispBase.IspBase):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.serial = None
|
self.serial = None
|
||||||
self.seq = 1
|
self.seq = 1
|
||||||
self.lastAddr = -1
|
self.last_addr = -1
|
||||||
self.progressCallback = None
|
self.progress_callback = None
|
||||||
|
|
||||||
def connect(self, port = 'COM22', speed = 115200):
|
def connect(self, port = "COM22", speed = 115200):
|
||||||
if self.serial is not None:
|
if self.serial is not None:
|
||||||
self.close()
|
self.close()
|
||||||
try:
|
try:
|
||||||
|
@ -82,49 +82,49 @@ class Stk500v2(ispBase.IspBase):
|
||||||
|
|
||||||
def writeFlash(self, flash_data):
|
def writeFlash(self, flash_data):
|
||||||
#Set load addr to 0, in case we have more then 64k flash we need to enable the address extension
|
#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
|
page_size = self.chip["pageSize"] * 2
|
||||||
flashSize = page_size * self.chip['pageCount']
|
flash_size = page_size * self.chip["pageCount"]
|
||||||
print("Writing flash")
|
print("Writing flash")
|
||||||
if flashSize > 0xFFFF:
|
if flash_size > 0xFFFF:
|
||||||
self.sendMessage([0x06, 0x80, 0x00, 0x00, 0x00])
|
self.sendMessage([0x06, 0x80, 0x00, 0x00, 0x00])
|
||||||
else:
|
else:
|
||||||
self.sendMessage([0x06, 0x00, 0x00, 0x00, 0x00])
|
self.sendMessage([0x06, 0x00, 0x00, 0x00, 0x00])
|
||||||
load_count = (len(flash_data) + page_size - 1) / page_size
|
load_count = (len(flash_data) + page_size - 1) / page_size
|
||||||
for i in range(0, int(load_count)):
|
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)])
|
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)])
|
||||||
if self.progressCallback is not None:
|
if self.progress_callback is not None:
|
||||||
if self._has_checksum:
|
if self._has_checksum:
|
||||||
self.progressCallback(i + 1, load_count)
|
self.progress_callback(i + 1, load_count)
|
||||||
else:
|
else:
|
||||||
self.progressCallback(i + 1, load_count*2)
|
self.progress_callback(i + 1, load_count*2)
|
||||||
|
|
||||||
def verifyFlash(self, flashData):
|
def verifyFlash(self, flash_data):
|
||||||
if self._has_checksum:
|
if self._has_checksum:
|
||||||
self.sendMessage([0x06, 0x00, (len(flashData) >> 17) & 0xFF, (len(flashData) >> 9) & 0xFF, (len(flashData) >> 1) & 0xFF])
|
self.sendMessage([0x06, 0x00, (len(flash_data) >> 17) & 0xFF, (len(flash_data) >> 9) & 0xFF, (len(flash_data) >> 1) & 0xFF])
|
||||||
res = self.sendMessage([0xEE])
|
res = self.sendMessage([0xEE])
|
||||||
checksum_recv = res[2] | (res[3] << 8)
|
checksum_recv = res[2] | (res[3] << 8)
|
||||||
checksum = 0
|
checksum = 0
|
||||||
for d in flashData:
|
for d in flash_data:
|
||||||
checksum += d
|
checksum += d
|
||||||
checksum &= 0xFFFF
|
checksum &= 0xFFFF
|
||||||
if hex(checksum) != hex(checksum_recv):
|
if hex(checksum) != hex(checksum_recv):
|
||||||
raise ispBase.IspError('Verify checksum mismatch: 0x%x != 0x%x' % (checksum & 0xFFFF, checksum_recv))
|
raise ispBase.IspError("Verify checksum mismatch: 0x%x != 0x%x" % (checksum & 0xFFFF, checksum_recv))
|
||||||
else:
|
else:
|
||||||
#Set load addr to 0, in case we have more then 64k flash we need to enable the address extension
|
#Set load addr to 0, in case we have more then 64k flash we need to enable the address extension
|
||||||
flashSize = self.chip['pageSize'] * 2 * self.chip['pageCount']
|
flash_size = self.chip["pageSize"] * 2 * self.chip["pageCount"]
|
||||||
if flashSize > 0xFFFF:
|
if flash_size > 0xFFFF:
|
||||||
self.sendMessage([0x06, 0x80, 0x00, 0x00, 0x00])
|
self.sendMessage([0x06, 0x80, 0x00, 0x00, 0x00])
|
||||||
else:
|
else:
|
||||||
self.sendMessage([0x06, 0x00, 0x00, 0x00, 0x00])
|
self.sendMessage([0x06, 0x00, 0x00, 0x00, 0x00])
|
||||||
|
|
||||||
loadCount = (len(flashData) + 0xFF) / 0x100
|
load_count = (len(flash_data) + 0xFF) / 0x100
|
||||||
for i in range(0, int(loadCount)):
|
for i in range(0, int(load_count)):
|
||||||
recv = self.sendMessage([0x14, 0x01, 0x00, 0x20])[2:0x102]
|
recv = self.sendMessage([0x14, 0x01, 0x00, 0x20])[2:0x102]
|
||||||
if self.progressCallback is not None:
|
if self.progress_callback is not None:
|
||||||
self.progressCallback(loadCount + i + 1, loadCount*2)
|
self.progress_callback(load_count + i + 1, load_count*2)
|
||||||
for j in range(0, 0x100):
|
for j in range(0, 0x100):
|
||||||
if i * 0x100 + j < len(flashData) and flashData[i * 0x100 + j] != recv[j]:
|
if i * 0x100 + j < len(flash_data) and flash_data[i * 0x100 + j] != recv[j]:
|
||||||
raise ispBase.IspError('Verify error at: 0x%x' % (i * 0x100 + j))
|
raise ispBase.IspError("Verify error at: 0x%x" % (i * 0x100 + j))
|
||||||
|
|
||||||
def sendMessage(self, data):
|
def sendMessage(self, data):
|
||||||
message = struct.pack(">BBHB", 0x1B, self.seq, len(data), 0x0E)
|
message = struct.pack(">BBHB", 0x1B, self.seq, len(data), 0x0E)
|
||||||
|
@ -138,12 +138,12 @@ class Stk500v2(ispBase.IspBase):
|
||||||
self.serial.write(message)
|
self.serial.write(message)
|
||||||
self.serial.flush()
|
self.serial.flush()
|
||||||
except SerialTimeoutException:
|
except SerialTimeoutException:
|
||||||
raise ispBase.IspError('Serial send timeout')
|
raise ispBase.IspError("Serial send timeout")
|
||||||
self.seq = (self.seq + 1) & 0xFF
|
self.seq = (self.seq + 1) & 0xFF
|
||||||
return self.recvMessage()
|
return self.recvMessage()
|
||||||
|
|
||||||
def recvMessage(self):
|
def recvMessage(self):
|
||||||
state = 'Start'
|
state = "Start"
|
||||||
checksum = 0
|
checksum = 0
|
||||||
while True:
|
while True:
|
||||||
s = self.serial.read()
|
s = self.serial.read()
|
||||||
|
@ -152,31 +152,31 @@ class Stk500v2(ispBase.IspBase):
|
||||||
b = struct.unpack(">B", s)[0]
|
b = struct.unpack(">B", s)[0]
|
||||||
checksum ^= b
|
checksum ^= b
|
||||||
#print(hex(b))
|
#print(hex(b))
|
||||||
if state == 'Start':
|
if state == "Start":
|
||||||
if b == 0x1B:
|
if b == 0x1B:
|
||||||
state = 'GetSeq'
|
state = "GetSeq"
|
||||||
checksum = 0x1B
|
checksum = 0x1B
|
||||||
elif state == 'GetSeq':
|
elif state == "GetSeq":
|
||||||
state = 'MsgSize1'
|
state = "MsgSize1"
|
||||||
elif state == 'MsgSize1':
|
elif state == "MsgSize1":
|
||||||
msgSize = b << 8
|
msg_size = b << 8
|
||||||
state = 'MsgSize2'
|
state = "MsgSize2"
|
||||||
elif state == 'MsgSize2':
|
elif state == "MsgSize2":
|
||||||
msgSize |= b
|
msg_size |= b
|
||||||
state = 'Token'
|
state = "Token"
|
||||||
elif state == 'Token':
|
elif state == "Token":
|
||||||
if b != 0x0E:
|
if b != 0x0E:
|
||||||
state = 'Start'
|
state = "Start"
|
||||||
else:
|
else:
|
||||||
state = 'Data'
|
state = "Data"
|
||||||
data = []
|
data = []
|
||||||
elif state == 'Data':
|
elif state == "Data":
|
||||||
data.append(b)
|
data.append(b)
|
||||||
if len(data) == msgSize:
|
if len(data) == msg_size:
|
||||||
state = 'Checksum'
|
state = "Checksum"
|
||||||
elif state == 'Checksum':
|
elif state == "Checksum":
|
||||||
if checksum != 0:
|
if checksum != 0:
|
||||||
state = 'Start'
|
state = "Start"
|
||||||
else:
|
else:
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
@ -190,7 +190,7 @@ def portList():
|
||||||
values = _winreg.EnumValue(key, i)
|
values = _winreg.EnumValue(key, i)
|
||||||
except:
|
except:
|
||||||
return ret
|
return ret
|
||||||
if 'USBSER' in values[0]:
|
if "USBSER" in values[0]:
|
||||||
ret.append(values[1])
|
ret.append(values[1])
|
||||||
i+=1
|
i+=1
|
||||||
return ret
|
return ret
|
||||||
|
@ -205,7 +205,7 @@ def runProgrammer(port, filename):
|
||||||
def main():
|
def main():
|
||||||
""" Entry point to call the stk500v2 programmer from the commandline. """
|
""" Entry point to call the stk500v2 programmer from the commandline. """
|
||||||
import threading
|
import threading
|
||||||
if sys.argv[1] == 'AUTO':
|
if sys.argv[1] == "AUTO":
|
||||||
print(portList())
|
print(portList())
|
||||||
for port in portList():
|
for port in portList():
|
||||||
threading.Thread(target=runProgrammer, args=(port,sys.argv[2])).start()
|
threading.Thread(target=runProgrammer, args=(port,sys.argv[2])).start()
|
||||||
|
@ -216,5 +216,5 @@ def main():
|
||||||
programmer.programChip(intelHex.readHex(sys.argv[2]))
|
programmer.programChip(intelHex.readHex(sys.argv[2]))
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
|
39
plugins/XRayView/XRayPass.py
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
# Copyright (c) 2015 Ultimaker B.V.
|
||||||
|
# Cura is released under the terms of the AGPLv3 or higher.
|
||||||
|
|
||||||
|
import os.path
|
||||||
|
|
||||||
|
from UM.Application import Application
|
||||||
|
from UM.PluginRegistry import PluginRegistry
|
||||||
|
|
||||||
|
from UM.View.RenderPass import RenderPass
|
||||||
|
from UM.View.RenderBatch import RenderBatch
|
||||||
|
from UM.View.GL.OpenGL import OpenGL
|
||||||
|
|
||||||
|
from UM.Scene.SceneNode import SceneNode
|
||||||
|
from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
|
||||||
|
|
||||||
|
class XRayPass(RenderPass):
|
||||||
|
def __init__(self, width, height):
|
||||||
|
super().__init__("xray", width, height)
|
||||||
|
|
||||||
|
self._shader = None
|
||||||
|
self._gl = OpenGL.getInstance().getBindingsObject()
|
||||||
|
self._scene = Application.getInstance().getController().getScene()
|
||||||
|
|
||||||
|
def render(self):
|
||||||
|
if not self._shader:
|
||||||
|
self._shader = OpenGL.getInstance().createShaderProgram(os.path.join(PluginRegistry.getInstance().getPluginPath("XRayView"), "xray.shader"))
|
||||||
|
|
||||||
|
batch = RenderBatch(self._shader, type = RenderBatch.RenderType.NoType, backface_cull = False, blend_mode = RenderBatch.BlendMode.Additive)
|
||||||
|
for node in DepthFirstIterator(self._scene.getRoot()):
|
||||||
|
if type(node) is SceneNode and node.getMeshData() and node.isVisible():
|
||||||
|
batch.addItem(node.getWorldTransformation(), node.getMeshData())
|
||||||
|
|
||||||
|
self.bind()
|
||||||
|
|
||||||
|
self._gl.glDisable(self._gl.GL_DEPTH_TEST)
|
||||||
|
batch.render(self._scene.getActiveCamera())
|
||||||
|
self._gl.glEnable(self._gl.GL_DEPTH_TEST)
|
||||||
|
|
||||||
|
self.release()
|
72
plugins/XRayView/XRayView.py
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
# Copyright (c) 2015 Ultimaker B.V.
|
||||||
|
# Cura is released under the terms of the AGPLv3 or higher.
|
||||||
|
|
||||||
|
import os.path
|
||||||
|
|
||||||
|
from UM.PluginRegistry import PluginRegistry
|
||||||
|
from UM.Event import Event
|
||||||
|
from UM.View.View import View
|
||||||
|
from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator
|
||||||
|
|
||||||
|
from UM.View.RenderBatch import RenderBatch
|
||||||
|
from UM.View.GL.OpenGL import OpenGL
|
||||||
|
|
||||||
|
from . import XRayPass
|
||||||
|
|
||||||
|
## View used to display a see-through version of objects with errors highlighted.
|
||||||
|
class XRayView(View):
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__()
|
||||||
|
|
||||||
|
self._xray_shader = None
|
||||||
|
self._xray_pass = None
|
||||||
|
self._xray_composite_shader = None
|
||||||
|
self._composite_pass = None
|
||||||
|
self._old_composite_shader = None
|
||||||
|
self._old_layer_bindings = None
|
||||||
|
|
||||||
|
def beginRendering(self):
|
||||||
|
scene = self.getController().getScene()
|
||||||
|
renderer = self.getRenderer()
|
||||||
|
|
||||||
|
if not self._xray_shader:
|
||||||
|
self._xray_shader = OpenGL.getInstance().createShaderProgram(os.path.join(PluginRegistry.getInstance().getPluginPath("XRayView"), "xray.shader"))
|
||||||
|
self._xray_shader.setUniformValue("u_color", [0.1, 0.1, 0.2, 1.0])
|
||||||
|
|
||||||
|
for node in BreadthFirstIterator(scene.getRoot()):
|
||||||
|
if not node.render(renderer):
|
||||||
|
if node.getMeshData() and node.isVisible():
|
||||||
|
renderer.queueNode(node,
|
||||||
|
shader = self._xray_shader,
|
||||||
|
type = RenderBatch.RenderType.Solid,
|
||||||
|
blend_mode = RenderBatch.BlendMode.Additive,
|
||||||
|
sort = -10,
|
||||||
|
state_setup_callback = lambda gl: gl.glDepthFunc(gl.GL_ALWAYS),
|
||||||
|
state_teardown_callback = lambda gl: gl.glDepthFunc(gl.GL_LESS)
|
||||||
|
)
|
||||||
|
|
||||||
|
def endRendering(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def event(self, event):
|
||||||
|
if event.type == Event.ViewActivateEvent:
|
||||||
|
if not self._xray_pass:
|
||||||
|
# Currently the RenderPass constructor requires a size > 0
|
||||||
|
# This should be fixed in RenderPass's constructor.
|
||||||
|
self._xray_pass = XRayPass.XRayPass(1, 1)
|
||||||
|
self.getRenderer().addRenderPass(self._xray_pass)
|
||||||
|
|
||||||
|
if not self._xray_composite_shader:
|
||||||
|
self._xray_composite_shader = OpenGL.getInstance().createShaderProgram(os.path.join(PluginRegistry.getInstance().getPluginPath("XRayView"), "xray_composite.shader"))
|
||||||
|
|
||||||
|
if not self._composite_pass:
|
||||||
|
self._composite_pass = self.getRenderer().getRenderPass("composite")
|
||||||
|
|
||||||
|
self._old_layer_bindings = self._composite_pass.getLayerBindings()
|
||||||
|
self._composite_pass.setLayerBindings(["default", "selection", "xray"])
|
||||||
|
self._old_composite_shader = self._composite_pass.getCompositeShader()
|
||||||
|
self._composite_pass.setCompositeShader(self._xray_composite_shader)
|
||||||
|
|
||||||
|
if event.type == Event.ViewDeactivateEvent:
|
||||||
|
self._composite_pass.setLayerBindings(self._old_layer_bindings)
|
||||||
|
self._composite_pass.setCompositeShader(self._old_composite_shader)
|
24
plugins/XRayView/__init__.py
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
# Copyright (c) 2015 Ultimaker B.V.
|
||||||
|
# Cura is released under the terms of the AGPLv3 or higher.
|
||||||
|
|
||||||
|
from . import XRayView
|
||||||
|
|
||||||
|
from UM.i18n import i18nCatalog
|
||||||
|
catalog = i18nCatalog("cura")
|
||||||
|
|
||||||
|
def getMetaData():
|
||||||
|
return {
|
||||||
|
"plugin": {
|
||||||
|
"name": catalog.i18nc("@label", "X-Ray View"),
|
||||||
|
"author": "Ultimaker",
|
||||||
|
"version": "1.0",
|
||||||
|
"description": catalog.i18nc("@info:whatsthis", "Provides the X-Ray view."),
|
||||||
|
"api": 2
|
||||||
|
},
|
||||||
|
"view": {
|
||||||
|
"name": catalog.i18nc("@item:inlistbox", "X-Ray")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def register(app):
|
||||||
|
return { "view": XRayView.XRayView() }
|
27
plugins/XRayView/xray.shader
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
[shaders]
|
||||||
|
vertex =
|
||||||
|
uniform highp mat4 u_modelViewProjectionMatrix;
|
||||||
|
|
||||||
|
attribute highp vec4 a_vertex;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_Position = u_modelViewProjectionMatrix * a_vertex;
|
||||||
|
}
|
||||||
|
|
||||||
|
fragment =
|
||||||
|
uniform lowp vec4 u_color;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_FragColor = u_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
[defaults]
|
||||||
|
u_color = [0.02, 0.02, 0.02, 1.0]
|
||||||
|
|
||||||
|
[bindings]
|
||||||
|
u_modelViewProjectionMatrix = model_view_projection_matrix
|
||||||
|
|
||||||
|
[attributes]
|
||||||
|
a_vertex = vertex
|
75
plugins/XRayView/xray_composite.shader
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
[shaders]
|
||||||
|
vertex =
|
||||||
|
uniform highp mat4 u_modelViewProjectionMatrix;
|
||||||
|
attribute highp vec4 a_vertex;
|
||||||
|
attribute highp vec2 a_uvs;
|
||||||
|
|
||||||
|
varying highp vec2 v_uvs;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_Position = u_modelViewProjectionMatrix * a_vertex;
|
||||||
|
v_uvs = a_uvs;
|
||||||
|
}
|
||||||
|
|
||||||
|
fragment =
|
||||||
|
uniform sampler2D u_layer0;
|
||||||
|
uniform sampler2D u_layer1;
|
||||||
|
uniform sampler2D u_layer2;
|
||||||
|
uniform sampler2D u_layer3;
|
||||||
|
|
||||||
|
uniform float u_imageWidth;
|
||||||
|
uniform float u_imageHeight;
|
||||||
|
|
||||||
|
uniform vec2 u_offset[9];
|
||||||
|
|
||||||
|
uniform float u_outline_strength;
|
||||||
|
uniform vec4 u_outline_color;
|
||||||
|
uniform vec4 u_error_color;
|
||||||
|
|
||||||
|
varying vec2 v_uvs;
|
||||||
|
|
||||||
|
float kernel[9];
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
kernel[0] = 0.0; kernel[1] = 1.0; kernel[2] = 0.0;
|
||||||
|
kernel[3] = 1.0; kernel[4] = -4.0; kernel[5] = 1.0;
|
||||||
|
kernel[6] = 0.0; kernel[7] = 1.0; kernel[8] = 0.0;
|
||||||
|
|
||||||
|
vec4 result = vec4(0.965, 0.965, 0.965, 1.0);
|
||||||
|
vec4 layer0 = texture2D(u_layer0, v_uvs);
|
||||||
|
|
||||||
|
result = layer0 * layer0.a + result * (1.0 - layer0.a);
|
||||||
|
|
||||||
|
float intersection_count = (texture2D(u_layer2, v_uvs).r * 255.0) / 5.0;
|
||||||
|
if(mod(intersection_count, 2.0) == 1.0)
|
||||||
|
{
|
||||||
|
result = u_error_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec4 sum = vec4(0.0);
|
||||||
|
for (int i = 0; i < 9; i++)
|
||||||
|
{
|
||||||
|
vec4 color = vec4(texture2D(u_layer1, v_uvs.xy + u_offset[i]).a);
|
||||||
|
sum += color * (kernel[i] / u_outline_strength);
|
||||||
|
}
|
||||||
|
|
||||||
|
gl_FragColor = mix(result, vec4(abs(sum.a)) * u_outline_color, abs(sum.a));
|
||||||
|
}
|
||||||
|
|
||||||
|
[defaults]
|
||||||
|
u_layer0 = 0
|
||||||
|
u_layer1 = 1
|
||||||
|
u_layer2 = 2
|
||||||
|
u_layer3 = 3
|
||||||
|
u_outline_strength = 1.0
|
||||||
|
u_outline_color = [0.05, 0.66, 0.89, 1.0]
|
||||||
|
u_error_color = [1.0, 0.0, 0.0, 1.0]
|
||||||
|
|
||||||
|
[bindings]
|
||||||
|
|
||||||
|
[attributes]
|
||||||
|
a_vertex = vertex
|
||||||
|
a_uvs = uv
|
||||||
|
|
270
resources/i18n/de/cura.po
Normal file → Executable file
|
@ -9,7 +9,7 @@ msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2015-09-12 20:10+0200\n"
|
"POT-Creation-Date: 2015-09-12 20:10+0200\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: 2015-09-30 11:41+0200\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
"Language: \n"
|
"Language: \n"
|
||||||
|
@ -20,7 +20,7 @@ msgstr ""
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/cura/CrashHandler.py:20
|
#: /home/ahiemstra/dev/15.10/src/cura/cura/CrashHandler.py:20
|
||||||
msgctxt "@title:window"
|
msgctxt "@title:window"
|
||||||
msgid "Oops!"
|
msgid "Oops!"
|
||||||
msgstr ""
|
msgstr "Hoppla!"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/cura/CrashHandler.py:26
|
#: /home/ahiemstra/dev/15.10/src/cura/cura/CrashHandler.py:26
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
|
@ -28,12 +28,12 @@ msgid ""
|
||||||
"<p>An uncaught exception has occurred!</p><p>Please use the information "
|
"<p>An uncaught exception has occurred!</p><p>Please use the information "
|
||||||
"below to post a bug report at <a href=\"http://github.com/Ultimaker/Cura/"
|
"below to post a bug report at <a href=\"http://github.com/Ultimaker/Cura/"
|
||||||
"issues\">http://github.com/Ultimaker/Cura/issues</a></p>"
|
"issues\">http://github.com/Ultimaker/Cura/issues</a></p>"
|
||||||
msgstr ""
|
msgstr "<p>Ein unerwarteter Ausnahmezustand ist aufgetreten!</p><p>Bitte senden Sie einen Fehlerbericht an untenstehende URL.<a href=\"http://github.com/Ultimaker/Cura/issues\">http://github.com/Ultimaker/Cura/issues</a></p>"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/cura/CrashHandler.py:46
|
#: /home/ahiemstra/dev/15.10/src/cura/cura/CrashHandler.py:46
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Open Web Page"
|
msgid "Open Web Page"
|
||||||
msgstr ""
|
msgstr "Webseite öffnen"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/cura/CuraApplication.py:135
|
#: /home/ahiemstra/dev/15.10/src/cura/cura/CuraApplication.py:135
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -50,111 +50,111 @@ msgstr "Die Benutzeroberfläche wird geladen..."
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/3MFReader/__init__.py:12
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/3MFReader/__init__.py:12
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "3MF Reader"
|
msgid "3MF Reader"
|
||||||
msgstr ""
|
msgstr "3MF-Reader"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/3MFReader/__init__.py:15
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/3MFReader/__init__.py:15
|
||||||
msgctxt "@info:whatsthis"
|
msgctxt "@info:whatsthis"
|
||||||
msgid "Provides support for reading 3MF files."
|
msgid "Provides support for reading 3MF files."
|
||||||
msgstr ""
|
msgstr "Bietet Unterstützung für das Lesen von 3MF-Dateien."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/3MFReader/__init__.py:20
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/3MFReader/__init__.py:20
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@item:inlistbox"
|
msgctxt "@item:inlistbox"
|
||||||
msgid "3MF File"
|
msgid "3MF File"
|
||||||
msgstr "&Datei"
|
msgstr "3MF-Datei"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/ChangeLogPlugin/__init__.py:12
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/ChangeLogPlugin/__init__.py:12
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Change Log"
|
msgid "Change Log"
|
||||||
msgstr "Engine-Protokoll"
|
msgstr "Änderungs-Protokoll"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/ChangeLogPlugin/__init__.py:15
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/ChangeLogPlugin/__init__.py:15
|
||||||
msgctxt "@info:whatsthis"
|
msgctxt "@info:whatsthis"
|
||||||
msgid "Shows changes since latest checked version"
|
msgid "Shows changes since latest checked version"
|
||||||
msgstr ""
|
msgstr "Zeigt die Änderungen seit der letzten aktivierten Version an"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/CuraEngineBackend/__init__.py:13
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/CuraEngineBackend/__init__.py:13
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "CuraEngine Backend"
|
msgid "CuraEngine Backend"
|
||||||
msgstr ""
|
msgstr "CuraEngine Backend"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/CuraEngineBackend/__init__.py:15
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/CuraEngineBackend/__init__.py:15
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@info:whatsthis"
|
msgctxt "@info:whatsthis"
|
||||||
msgid "Provides the link to the CuraEngine slicing backend"
|
msgid "Provides the link to the CuraEngine slicing backend"
|
||||||
msgstr "Gibt den Link für das Slicing-Backend der CuraEngine an."
|
msgstr "Gibt den Link für das Slicing-Backend der CuraEngine an"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/CuraEngineBackend/ProcessSlicedObjectListJob.py:30
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/CuraEngineBackend/ProcessSlicedObjectListJob.py:30
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/CuraEngineBackend/ProcessSlicedObjectListJob.py:111
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/CuraEngineBackend/ProcessSlicedObjectListJob.py:111
|
||||||
msgctxt "@info:status"
|
msgctxt "@info:status"
|
||||||
msgid "Processing Layers"
|
msgid "Processing Layers"
|
||||||
msgstr ""
|
msgstr "Die Schichten werden verarbeitet"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/CuraEngineBackend/CuraEngineBackend.py:169
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/CuraEngineBackend/CuraEngineBackend.py:169
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@info:status"
|
msgctxt "@info:status"
|
||||||
msgid "Slicing..."
|
msgid "Slicing..."
|
||||||
msgstr "Die Berechnung läuft..."
|
msgstr "Das Slicing läuft..."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/GCodeWriter/__init__.py:12
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/GCodeWriter/__init__.py:12
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "GCode Writer"
|
msgid "GCode Writer"
|
||||||
msgstr "GCode-Datei"
|
msgstr "G-Code-Writer"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/GCodeWriter/__init__.py:15
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/GCodeWriter/__init__.py:15
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@info:whatsthis"
|
msgctxt "@info:whatsthis"
|
||||||
msgid "Writes GCode to a file"
|
msgid "Writes GCode to a file"
|
||||||
msgstr "Schreibt GCode in eine Datei"
|
msgstr "Schreibt G-Code in eine Datei"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/GCodeWriter/__init__.py:22
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/GCodeWriter/__init__.py:22
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@item:inlistbox"
|
msgctxt "@item:inlistbox"
|
||||||
msgid "GCode File"
|
msgid "GCode File"
|
||||||
msgstr "GCode-Datei"
|
msgstr "G-Code-Datei"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/LayerView/__init__.py:13
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/LayerView/__init__.py:13
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Layer View"
|
msgid "Layer View"
|
||||||
msgstr "Ebenen"
|
msgstr "Schichten-Ansicht"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/LayerView/__init__.py:16
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/LayerView/__init__.py:16
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@info:whatsthis"
|
msgctxt "@info:whatsthis"
|
||||||
msgid "Provides the Layer view."
|
msgid "Provides the Layer view."
|
||||||
msgstr "Zeigt die Ebenen-Ansicht an."
|
msgstr "Zeigt die Schichten-Ansicht an."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/LayerView/__init__.py:20
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/LayerView/__init__.py:20
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@item:inlistbox"
|
msgctxt "@item:inlistbox"
|
||||||
msgid "Layers"
|
msgid "Layers"
|
||||||
msgstr "Ebenen"
|
msgstr "Schichten"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:20
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:20
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Save to Removable Drive"
|
msgid "Save to Removable Drive"
|
||||||
msgstr ""
|
msgstr "Auf Wechseldatenträger speichern"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:21
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:21
|
||||||
#, fuzzy, python-brace-format
|
#, fuzzy, python-brace-format
|
||||||
msgctxt "@item:inlistbox"
|
msgctxt "@item:inlistbox"
|
||||||
msgid "Save to Removable Drive {0}"
|
msgid "Save to Removable Drive {0}"
|
||||||
msgstr "Auf SD-Karte speichern {0}"
|
msgstr "Auf Wechseldatenträger speichern {0}"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:52
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:52
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgctxt "@info:progress"
|
msgctxt "@info:progress"
|
||||||
msgid "Saving to Removable Drive <filename>{0}</filename>"
|
msgid "Saving to Removable Drive <filename>{0}</filename>"
|
||||||
msgstr ""
|
msgstr "Wird auf Wechseldatenträger gespeichert <filename>{0}</filename>"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:73
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:73
|
||||||
#, fuzzy, python-brace-format
|
#, fuzzy, python-brace-format
|
||||||
msgctxt "@info:status"
|
msgctxt "@info:status"
|
||||||
msgid "Saved to Removable Drive {0} as {1}"
|
msgid "Saved to Removable Drive {0} as {1}"
|
||||||
msgstr "Auf SD-Karte gespeichert {0} als {1}"
|
msgstr "Auf Wechseldatenträger gespeichert {0} als {1}"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:74
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:74
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -166,96 +166,94 @@ msgstr "Auswerfen"
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgctxt "@action"
|
msgctxt "@action"
|
||||||
msgid "Eject removable device {0}"
|
msgid "Eject removable device {0}"
|
||||||
msgstr ""
|
msgstr "Wechseldatenträger auswerfen {0}"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:79
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:79
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgctxt "@info:status"
|
msgctxt "@info:status"
|
||||||
msgid "Could not save to removable drive {0}: {1}"
|
msgid "Could not save to removable drive {0}: {1}"
|
||||||
msgstr ""
|
msgstr "Konnte nicht auf dem Wechseldatenträger gespeichert werden {0}: {1}"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py:58
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py:58
|
||||||
msgctxt "@item:intext"
|
msgctxt "@item:intext"
|
||||||
msgid "Removable Drive"
|
msgid "Removable Drive"
|
||||||
msgstr ""
|
msgstr "Wechseldatenträger"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDrivePlugin.py:42
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDrivePlugin.py:42
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgctxt "@info:status"
|
msgctxt "@info:status"
|
||||||
msgid "Ejected {0}. You can now safely remove the drive."
|
msgid "Ejected {0}. You can now safely remove the drive."
|
||||||
msgstr ""
|
msgstr "Auswerfen {0}. Sie können den Datenträger jetzt sicher entfernen."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDrivePlugin.py:45
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDrivePlugin.py:45
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgctxt "@info:status"
|
msgctxt "@info:status"
|
||||||
msgid "Failed to eject {0}. Maybe it is still in use?"
|
msgid "Failed to eject {0}. Maybe it is still in use?"
|
||||||
msgstr ""
|
msgstr "Auswerfen nicht möglich. {0} Vielleicht wird der Datenträger noch verwendet?"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/__init__.py:12
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/__init__.py:12
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Removable Drive Output Device Plugin"
|
msgid "Removable Drive Output Device Plugin"
|
||||||
msgstr ""
|
msgstr "Ausgabegerät-Plugin für Wechseldatenträger"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/__init__.py:14
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/__init__.py:14
|
||||||
msgctxt "@info:whatsthis"
|
msgctxt "@info:whatsthis"
|
||||||
msgid "Provides removable drive hotplugging and writing support"
|
msgid "Provides removable drive hotplugging and writing support"
|
||||||
msgstr ""
|
msgstr "Ermöglicht Hot-Plug des Wechseldatenträgers und Support beim Beschreiben"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/SliceInfoPlugin/__init__.py:10
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/SliceInfoPlugin/__init__.py:10
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Slice info"
|
msgid "Slice info"
|
||||||
msgstr ""
|
msgstr "Slice-Informationen"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/SliceInfoPlugin/__init__.py:13
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/SliceInfoPlugin/__init__.py:13
|
||||||
msgctxt "@info:whatsthis"
|
msgctxt "@info:whatsthis"
|
||||||
msgid "Submits anonymous slice info. Can be disabled through preferences."
|
msgid "Submits anonymous slice info. Can be disabled through preferences."
|
||||||
msgstr ""
|
msgstr "Sendet anonymisierte Slice-Informationen. Kann in den Einstellungen deaktiviert werden."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/SliceInfoPlugin/SliceInfo.py:35
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/SliceInfoPlugin/SliceInfo.py:35
|
||||||
msgctxt "@info"
|
msgctxt "@info"
|
||||||
msgid ""
|
msgid ""
|
||||||
"Cura automatically sends slice info. You can disable this in preferences"
|
"Cura automatically sends slice info. You can disable this in preferences"
|
||||||
msgstr ""
|
msgstr "Cura sendet automatisch Slice-Informationen. Sie können dies in den Einstellungen deaktivieren."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/SliceInfoPlugin/SliceInfo.py:36
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/SliceInfoPlugin/SliceInfo.py:36
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Dismiss"
|
msgid "Dismiss"
|
||||||
msgstr ""
|
msgstr "Verwerfen"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/PrinterConnection.py:35
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/PrinterConnection.py:35
|
||||||
msgctxt "@item:inmenu"
|
msgctxt "@item:inmenu"
|
||||||
msgid "USB printing"
|
msgid "USB printing"
|
||||||
msgstr ""
|
msgstr "USB-Drucken"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/PrinterConnection.py:36
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/PrinterConnection.py:36
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Print with USB"
|
msgid "Print with USB"
|
||||||
msgstr ""
|
msgstr "Über USB drucken"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/PrinterConnection.py:37
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/PrinterConnection.py:37
|
||||||
msgctxt "@info:tooltip"
|
msgctxt "@info:tooltip"
|
||||||
msgid "Print with USB"
|
msgid "Print with USB"
|
||||||
msgstr ""
|
msgstr "Über USB drucken"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/__init__.py:13
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/__init__.py:13
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "USB printing"
|
msgid "USB printing"
|
||||||
msgstr ""
|
msgstr "USB-Drucken"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/__init__.py:17
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/__init__.py:17
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@info:whatsthis"
|
msgctxt "@info:whatsthis"
|
||||||
msgid ""
|
msgid ""
|
||||||
"Accepts G-Code and sends them to a printer. Plugin can also update firmware."
|
"Accepts G-Code and sends them to a printer. Plugin can also update firmware."
|
||||||
msgstr ""
|
msgstr "Akzeptiert den G-Code und sendet diesen an einen Drucker. Das Plugin kann auch die Firmware aktualisieren."
|
||||||
"Akzeptiert den G-Code und sendet diesen an einen Drucker. Das Plug-In kann "
|
|
||||||
"auch die Firmware aktualisieren"
|
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/USBPrinterManager.py:46
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/USBPrinterManager.py:46
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@title:menu"
|
msgctxt "@title:menu"
|
||||||
msgid "Firmware"
|
msgid "Firmware"
|
||||||
msgstr "Firmware aktualisieren"
|
msgstr "Firmware"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/USBPrinterManager.py:47
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/USBPrinterManager.py:47
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -266,7 +264,7 @@ msgstr "Firmware aktualisieren"
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/ControlWindow.qml:17
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/ControlWindow.qml:17
|
||||||
msgctxt "@title:window"
|
msgctxt "@title:window"
|
||||||
msgid "Print with USB"
|
msgid "Print with USB"
|
||||||
msgstr ""
|
msgstr "Über USB drucken"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/ControlWindow.qml:28
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/ControlWindow.qml:28
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -296,7 +294,7 @@ msgstr "Abbrechen"
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@title:window"
|
msgctxt "@title:window"
|
||||||
msgid "Firmware Update"
|
msgid "Firmware Update"
|
||||||
msgstr "Firmware-Update abgeschlossen."
|
msgstr "Firmware-Update"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:38
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:38
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -346,12 +344,12 @@ msgstr "Engine-Protokoll"
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/ProfileSetup.qml:31
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/ProfileSetup.qml:31
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Variant:"
|
msgid "Variant:"
|
||||||
msgstr ""
|
msgstr "Variante:"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/ProfileSetup.qml:82
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/ProfileSetup.qml:82
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Global Profile:"
|
msgid "Global Profile:"
|
||||||
msgstr ""
|
msgstr "Globales Profil:"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/AddMachine.qml:60
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/AddMachine.qml:60
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -369,7 +367,7 @@ msgstr "Druckername:"
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/SelectUpgradedParts.qml:29
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/SelectUpgradedParts.qml:29
|
||||||
msgctxt "@title"
|
msgctxt "@title"
|
||||||
msgid "Select Upgraded Parts"
|
msgid "Select Upgraded Parts"
|
||||||
msgstr ""
|
msgstr "Wählen Sie die aktualisierten Teile"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/AddMachine.qml:214
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/AddMachine.qml:214
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UpgradeFirmware.qml:29
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UpgradeFirmware.qml:29
|
||||||
|
@ -383,17 +381,17 @@ msgstr "Firmware aktualisieren"
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@title"
|
msgctxt "@title"
|
||||||
msgid "Check Printer"
|
msgid "Check Printer"
|
||||||
msgstr "Drucker hinzufügen"
|
msgstr "Drucker prüfen"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/AddMachine.qml:220
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/AddMachine.qml:220
|
||||||
msgctxt "@title"
|
msgctxt "@title"
|
||||||
msgid "Bed Levelling"
|
msgid "Bed Levelling"
|
||||||
msgstr ""
|
msgstr "Druckbett-Nivellierung"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/Bedleveling.qml:25
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/Bedleveling.qml:25
|
||||||
msgctxt "@title"
|
msgctxt "@title"
|
||||||
msgid "Bed Leveling"
|
msgid "Bed Leveling"
|
||||||
msgstr ""
|
msgstr "Druckbett-Nivellierung"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/Bedleveling.qml:34
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/Bedleveling.qml:34
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
|
@ -401,7 +399,7 @@ msgid ""
|
||||||
"To make sure your prints will come out great, you can now adjust your "
|
"To make sure your prints will come out great, you can now adjust your "
|
||||||
"buildplate. When you click 'Move to Next Position' the nozzle will move to "
|
"buildplate. When you click 'Move to Next Position' the nozzle will move to "
|
||||||
"the different positions that can be adjusted."
|
"the different positions that can be adjusted."
|
||||||
msgstr ""
|
msgstr "Um sicherzustellen, dass Ihre Drucke hervorragend werden, können Sie nun Ihre Bauplatte justieren. Wenn Sie auf „Gehe zur nächsten Position“ klicken, bewegt sich die Düse zu den verschiedenen Positionen, die justiert werden können."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/Bedleveling.qml:40
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/Bedleveling.qml:40
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
|
@ -409,45 +407,45 @@ msgid ""
|
||||||
"For every postition; insert a piece of paper under the nozzle and adjust the "
|
"For every postition; insert a piece of paper under the nozzle and adjust the "
|
||||||
"print bed height. The print bed height is right when the paper is slightly "
|
"print bed height. The print bed height is right when the paper is slightly "
|
||||||
"gripped by the tip of the nozzle."
|
"gripped by the tip of the nozzle."
|
||||||
msgstr ""
|
msgstr "Für jede Position; legen Sie ein Blatt Papier unter die Düse und stellen Sie die Höhe des Druckbetts ein. Die Höhe des Druckbetts ist korrekt, wenn das Papier von der Spitze der Düse leicht berührt wird."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/Bedleveling.qml:44
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/Bedleveling.qml:44
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Move to Next Position"
|
msgid "Move to Next Position"
|
||||||
msgstr ""
|
msgstr "Gehe zur nächsten Position"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/Bedleveling.qml:66
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/Bedleveling.qml:66
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Skip Bedleveling"
|
msgid "Skip Bedleveling"
|
||||||
msgstr ""
|
msgstr "Druckbett-Nivellierung überspringen"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/SelectUpgradedParts.qml:39
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/SelectUpgradedParts.qml:39
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid ""
|
msgid ""
|
||||||
"To assist you in having better default settings for your Ultimaker. Cura "
|
"To assist you in having better default settings for your Ultimaker. Cura "
|
||||||
"would like to know which upgrades you have in your machine:"
|
"would like to know which upgrades you have in your machine:"
|
||||||
msgstr ""
|
msgstr "Um Ihnen dabei zu helfen, bessere Standardeinstellungen für Ihren Ultimaker festzulegen, würde Cura gerne erfahren, welche Upgrades auf Ihrem Gerät vorhanden sind:"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/SelectUpgradedParts.qml:49
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/SelectUpgradedParts.qml:49
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@option:check"
|
msgctxt "@option:check"
|
||||||
msgid "Extruder driver ugrades"
|
msgid "Extruder driver ugrades"
|
||||||
msgstr "Extruder-Temperatur %1"
|
msgstr "Upgrades des Extruderantriebs"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/SelectUpgradedParts.qml:54
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/SelectUpgradedParts.qml:54
|
||||||
msgctxt "@option:check"
|
msgctxt "@option:check"
|
||||||
msgid "Heated printer bed (standard kit)"
|
msgid "Heated printer bed (standard kit)"
|
||||||
msgstr ""
|
msgstr "Heizbares Druckbett (Standard-Kit)"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/SelectUpgradedParts.qml:58
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/SelectUpgradedParts.qml:58
|
||||||
msgctxt "@option:check"
|
msgctxt "@option:check"
|
||||||
msgid "Heated printer bed (self built)"
|
msgid "Heated printer bed (self built)"
|
||||||
msgstr ""
|
msgstr "Heizbares Druckbett (Selbst gebaut)"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/SelectUpgradedParts.qml:62
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/SelectUpgradedParts.qml:62
|
||||||
msgctxt "@option:check"
|
msgctxt "@option:check"
|
||||||
msgid "Dual extrusion (experimental)"
|
msgid "Dual extrusion (experimental)"
|
||||||
msgstr ""
|
msgstr "Dual-Extruder (experimental)"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/SelectUpgradedParts.qml:70
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/SelectUpgradedParts.qml:70
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
|
@ -456,44 +454,44 @@ msgid ""
|
||||||
"drive upgrade. If you do not have this upgrade, it is highly recommended to "
|
"drive upgrade. If you do not have this upgrade, it is highly recommended to "
|
||||||
"improve reliability. This upgrade can be bought from the Ultimaker webshop "
|
"improve reliability. This upgrade can be bought from the Ultimaker webshop "
|
||||||
"or found on thingiverse as thing:26094"
|
"or found on thingiverse as thing:26094"
|
||||||
msgstr ""
|
msgstr "Wenn Sie Ihren Ultimaker nach Oktober 2012 erworben haben, besitzen Sie das Upgrade des Extruderantriebs. Dieses Upgrade ist äußerst empfehlenswert, um die Zuverlässigkeit zu erhöhen. Falls Sie es noch nicht besitzen, können Sie es im Ultimaker-Webshop kaufen. Außerdem finden Sie es im Thingiverse als Thing: 26094"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:44
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:44
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid ""
|
msgid ""
|
||||||
"It's a good idea to do a few sanity checks on your Ultimaker. You can skip "
|
"It's a good idea to do a few sanity checks on your Ultimaker. You can skip "
|
||||||
"this step if you know your machine is functional"
|
"this step if you know your machine is functional"
|
||||||
msgstr ""
|
msgstr "Sie sollten einige Sanity-Checks bei Ihrem Ultimaker durchzuführen. Sie können diesen Schritt überspringen, wenn Sie wissen, dass Ihr Gerät funktionsfähig ist."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:49
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:49
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Start Printer Check"
|
msgid "Start Printer Check"
|
||||||
msgstr ""
|
msgstr "Überprüfung des Druckers starten"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:56
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:56
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Skip Printer Check"
|
msgid "Skip Printer Check"
|
||||||
msgstr ""
|
msgstr "Überprüfung des Druckers überspringen"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:65
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:65
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Connection: "
|
msgid "Connection: "
|
||||||
msgstr ""
|
msgstr "Verbindung: "
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:69
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:69
|
||||||
msgctxt "@info:status"
|
msgctxt "@info:status"
|
||||||
msgid "Done"
|
msgid "Done"
|
||||||
msgstr ""
|
msgstr "Fertig"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:69
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:69
|
||||||
msgctxt "@info:status"
|
msgctxt "@info:status"
|
||||||
msgid "Incomplete"
|
msgid "Incomplete"
|
||||||
msgstr ""
|
msgstr "Unvollständig"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:76
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:76
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Min endstop X: "
|
msgid "Min endstop X: "
|
||||||
msgstr ""
|
msgstr "Min. Endstop X: "
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:80
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:80
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:91
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:91
|
||||||
|
@ -502,7 +500,7 @@ msgstr ""
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:201
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:201
|
||||||
msgctxt "@info:status"
|
msgctxt "@info:status"
|
||||||
msgid "Works"
|
msgid "Works"
|
||||||
msgstr ""
|
msgstr "Funktioniert"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:80
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:80
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:91
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:91
|
||||||
|
@ -511,40 +509,40 @@ msgstr ""
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:163
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:163
|
||||||
msgctxt "@info:status"
|
msgctxt "@info:status"
|
||||||
msgid "Not checked"
|
msgid "Not checked"
|
||||||
msgstr ""
|
msgstr "Nicht überprüft"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:87
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:87
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Min endstop Y: "
|
msgid "Min endstop Y: "
|
||||||
msgstr ""
|
msgstr "Min. Endstop Y: "
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:99
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:99
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Min endstop Z: "
|
msgid "Min endstop Z: "
|
||||||
msgstr ""
|
msgstr "Min. Endstop Z: "
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:111
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:111
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Nozzle temperature check: "
|
msgid "Nozzle temperature check: "
|
||||||
msgstr ""
|
msgstr "Temperaturprüfung der Düse: "
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:119
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:119
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:149
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:149
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Start Heating"
|
msgid "Start Heating"
|
||||||
msgstr ""
|
msgstr "Aufheizen starten"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:124
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:124
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:154
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:154
|
||||||
msgctxt "@info:progress"
|
msgctxt "@info:progress"
|
||||||
msgid "Checking"
|
msgid "Checking"
|
||||||
msgstr ""
|
msgstr "Wird überprüft"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:141
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:141
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "bed temperature check:"
|
msgid "bed temperature check:"
|
||||||
msgstr "Druckbett-Temperatur %1"
|
msgstr "Temperaturprüfung des Druckbetts:"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UpgradeFirmware.qml:38
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UpgradeFirmware.qml:38
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
|
@ -552,32 +550,32 @@ msgid ""
|
||||||
"Firmware is the piece of software running directly on your 3D printer. This "
|
"Firmware is the piece of software running directly on your 3D printer. This "
|
||||||
"firmware controls the step motors, regulates the temperature and ultimately "
|
"firmware controls the step motors, regulates the temperature and ultimately "
|
||||||
"makes your printer work."
|
"makes your printer work."
|
||||||
msgstr ""
|
msgstr "Die Firmware ist der Teil der Software, der direkt auf Ihrem 3D-Drucker läuft. Diese Firmware kontrolliert die Schrittmotoren, reguliert die Temperatur und sorgt letztlich dafür, dass Ihr Drucker funktioniert."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UpgradeFirmware.qml:45
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UpgradeFirmware.qml:45
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid ""
|
msgid ""
|
||||||
"The firmware shipping with new Ultimakers works, but upgrades have been made "
|
"The firmware shipping with new Ultimakers works, but upgrades have been made "
|
||||||
"to make better prints, and make calibration easier."
|
"to make better prints, and make calibration easier."
|
||||||
msgstr ""
|
msgstr "Die Firmware, die mit neuen Ultimakers ausgeliefert wird funktioniert, aber es gibt bereits Upgrades, um bessere Drucke zu erzeugen und die Kalibrierung zu vereinfachen."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UpgradeFirmware.qml:52
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UpgradeFirmware.qml:52
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid ""
|
msgid ""
|
||||||
"Cura requires these new features and thus your firmware will most likely "
|
"Cura requires these new features and thus your firmware will most likely "
|
||||||
"need to be upgraded. You can do so now."
|
"need to be upgraded. You can do so now."
|
||||||
msgstr ""
|
msgstr "Cura benötigt diese neuen Funktionen und daher ist es sehr wahrscheinlich, dass Ihre Firmware aktualisiert werden muss. Sie können dies jetzt erledigen."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UpgradeFirmware.qml:55
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UpgradeFirmware.qml:55
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Upgrade to Marlin Firmware"
|
msgid "Upgrade to Marlin Firmware"
|
||||||
msgstr "Firmware aktualisieren"
|
msgstr "Auf Marlin-Firmware aktualisieren"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UpgradeFirmware.qml:58
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UpgradeFirmware.qml:58
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Skip Upgrade"
|
msgid "Skip Upgrade"
|
||||||
msgstr ""
|
msgstr "Aktualisierung überspringen"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/AboutDialog.qml:15
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/AboutDialog.qml:15
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -596,9 +594,7 @@ msgstr "Komplettlösung für den 3D-Druck mit geschmolzenem Filament."
|
||||||
msgctxt "@info:credit"
|
msgctxt "@info:credit"
|
||||||
msgid ""
|
msgid ""
|
||||||
"Cura has been developed by Ultimaker B.V. in cooperation with the community."
|
"Cura has been developed by Ultimaker B.V. in cooperation with the community."
|
||||||
msgstr ""
|
msgstr "Cura wurde von Ultimaker B.V. in Zusammenarbeit mit der Community entwickelt."
|
||||||
"Cura wurde von Ultimaker B.V. in Zusammenarbeit mit der Gemeinschaft "
|
|
||||||
"entwickelt."
|
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/ViewPage.qml:16
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/ViewPage.qml:16
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -617,24 +613,24 @@ msgctxt "@info:tooltip"
|
||||||
msgid ""
|
msgid ""
|
||||||
"Highlight unsupported areas of the model in red. Without support these areas "
|
"Highlight unsupported areas of the model in red. Without support these areas "
|
||||||
"will nog print properly."
|
"will nog print properly."
|
||||||
msgstr ""
|
msgstr "Nicht gestützte Bereiche des Modells in rot hervorheben. Ohne Stützstruktur werden diese Bereiche nicht korrekt gedruckt."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/ViewPage.qml:74
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/ViewPage.qml:74
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Center camera when item is selected"
|
msgid "Center camera when item is selected"
|
||||||
msgstr ""
|
msgstr "Zentrieren Sie die Kamera, wenn das Element ausgewählt wurde"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/ViewPage.qml:78
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/ViewPage.qml:78
|
||||||
msgctxt "@info:tooltip"
|
msgctxt "@info:tooltip"
|
||||||
msgid ""
|
msgid ""
|
||||||
"Moves the camera so the object is in the center of the view when an object "
|
"Moves the camera so the object is in the center of the view when an object "
|
||||||
"is selected"
|
"is selected"
|
||||||
msgstr ""
|
msgstr "Bewegen Sie die Kamera bis sich das Objekt im Mittelpunkt der Ansicht befindet, wenn ein Objekt ausgewählt ist"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:51
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:51
|
||||||
msgctxt "@action:inmenu"
|
msgctxt "@action:inmenu"
|
||||||
msgid "Toggle Fu&ll Screen"
|
msgid "Toggle Fu&ll Screen"
|
||||||
msgstr ""
|
msgstr "Umschalten auf Vo&llbild-Modus"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:58
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:58
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -670,12 +666,12 @@ msgstr "&Drucker hinzufügen..."
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@action:inmenu"
|
msgctxt "@action:inmenu"
|
||||||
msgid "Manage Pr&inters..."
|
msgid "Manage Pr&inters..."
|
||||||
msgstr "&Drucker hinzufügen..."
|
msgstr "Dr&ucker verwalten..."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:102
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:102
|
||||||
msgctxt "@action:inmenu"
|
msgctxt "@action:inmenu"
|
||||||
msgid "Manage Profiles..."
|
msgid "Manage Profiles..."
|
||||||
msgstr ""
|
msgstr "Profile verwalten..."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:109
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:109
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -699,7 +695,7 @@ msgstr "&Über..."
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@action:inmenu"
|
msgctxt "@action:inmenu"
|
||||||
msgid "Delete &Selection"
|
msgid "Delete &Selection"
|
||||||
msgstr "Auswahl löschen"
|
msgstr "&Auswahl löschen"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:138
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:138
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -711,41 +707,41 @@ msgstr "Objekt löschen"
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@action:inmenu"
|
msgctxt "@action:inmenu"
|
||||||
msgid "Ce&nter Object on Platform"
|
msgid "Ce&nter Object on Platform"
|
||||||
msgstr "Objekt auf Plattform zentrieren"
|
msgstr "Objekt auf Druckplatte ze&ntrieren"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:152
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:152
|
||||||
msgctxt "@action:inmenu"
|
msgctxt "@action:inmenu"
|
||||||
msgid "&Group Objects"
|
msgid "&Group Objects"
|
||||||
msgstr ""
|
msgstr "Objekte &gruppieren"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:160
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:160
|
||||||
msgctxt "@action:inmenu"
|
msgctxt "@action:inmenu"
|
||||||
msgid "Ungroup Objects"
|
msgid "Ungroup Objects"
|
||||||
msgstr ""
|
msgstr "Gruppierung für Objekte aufheben"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:168
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:168
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@action:inmenu"
|
msgctxt "@action:inmenu"
|
||||||
msgid "&Merge Objects"
|
msgid "&Merge Objects"
|
||||||
msgstr "Objekt löschen"
|
msgstr "Objekt &zusammenführen"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:176
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:176
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@action:inmenu"
|
msgctxt "@action:inmenu"
|
||||||
msgid "&Duplicate Object"
|
msgid "&Duplicate Object"
|
||||||
msgstr "Objekt duplizieren"
|
msgstr "Objekt &duplizieren"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:183
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:183
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@action:inmenu"
|
msgctxt "@action:inmenu"
|
||||||
msgid "&Clear Build Platform"
|
msgid "&Clear Build Platform"
|
||||||
msgstr "Druckplatte reinigen"
|
msgstr "Druckplatte &reinigen"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:190
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:190
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@action:inmenu"
|
msgctxt "@action:inmenu"
|
||||||
msgid "Re&load All Objects"
|
msgid "Re&load All Objects"
|
||||||
msgstr "Alle Objekte neu laden"
|
msgstr "Alle Objekte neu &laden"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:197
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:197
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -757,13 +753,13 @@ msgstr "Alle Objektpositionen zurücksetzen"
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@action:inmenu"
|
msgctxt "@action:inmenu"
|
||||||
msgid "Reset All Object &Transformations"
|
msgid "Reset All Object &Transformations"
|
||||||
msgstr "Alle Objektumwandlungen zurücksetzen"
|
msgstr "Alle Objekte & Umwandlungen zurücksetzen"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:209
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:209
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@action:inmenu"
|
msgctxt "@action:inmenu"
|
||||||
msgid "&Open File..."
|
msgid "&Open File..."
|
||||||
msgstr "Datei öffnen"
|
msgstr "&Datei öffnen..."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:217
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:217
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -775,84 +771,84 @@ msgstr "Engine-&Protokoll anzeigen..."
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:461
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:461
|
||||||
msgctxt "@title:tab"
|
msgctxt "@title:tab"
|
||||||
msgid "General"
|
msgid "General"
|
||||||
msgstr ""
|
msgstr "Allgemein"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:36
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:36
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr ""
|
msgstr "Sprache"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:47
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:47
|
||||||
msgctxt "@item:inlistbox"
|
msgctxt "@item:inlistbox"
|
||||||
msgid "Bulgarian"
|
msgid "Bulgarian"
|
||||||
msgstr ""
|
msgstr "Bulgarisch"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:48
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:48
|
||||||
msgctxt "@item:inlistbox"
|
msgctxt "@item:inlistbox"
|
||||||
msgid "Czech"
|
msgid "Czech"
|
||||||
msgstr ""
|
msgstr "Tschechisch"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:49
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:49
|
||||||
msgctxt "@item:inlistbox"
|
msgctxt "@item:inlistbox"
|
||||||
msgid "English"
|
msgid "English"
|
||||||
msgstr ""
|
msgstr "Englisch"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:50
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:50
|
||||||
msgctxt "@item:inlistbox"
|
msgctxt "@item:inlistbox"
|
||||||
msgid "Finnish"
|
msgid "Finnish"
|
||||||
msgstr ""
|
msgstr "Finnisch"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:51
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:51
|
||||||
msgctxt "@item:inlistbox"
|
msgctxt "@item:inlistbox"
|
||||||
msgid "French"
|
msgid "French"
|
||||||
msgstr ""
|
msgstr "Französisch"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:52
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:52
|
||||||
msgctxt "@item:inlistbox"
|
msgctxt "@item:inlistbox"
|
||||||
msgid "German"
|
msgid "German"
|
||||||
msgstr ""
|
msgstr "Deutsch"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:53
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:53
|
||||||
msgctxt "@item:inlistbox"
|
msgctxt "@item:inlistbox"
|
||||||
msgid "Italian"
|
msgid "Italian"
|
||||||
msgstr ""
|
msgstr "Italienisch"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:54
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:54
|
||||||
msgctxt "@item:inlistbox"
|
msgctxt "@item:inlistbox"
|
||||||
msgid "Polish"
|
msgid "Polish"
|
||||||
msgstr ""
|
msgstr "Polnisch"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:55
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:55
|
||||||
msgctxt "@item:inlistbox"
|
msgctxt "@item:inlistbox"
|
||||||
msgid "Russian"
|
msgid "Russian"
|
||||||
msgstr ""
|
msgstr "Russisch"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:56
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:56
|
||||||
msgctxt "@item:inlistbox"
|
msgctxt "@item:inlistbox"
|
||||||
msgid "Spanish"
|
msgid "Spanish"
|
||||||
msgstr ""
|
msgstr "Spanisch"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:98
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:98
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid ""
|
msgid ""
|
||||||
"You will need to restart the application for language changes to have effect."
|
"You will need to restart the application for language changes to have effect."
|
||||||
msgstr ""
|
msgstr "Die Anwendung muss neu gestartet werden, um die Spracheinstellungen zu übernehmen."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:114
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:114
|
||||||
msgctxt "@option:check"
|
msgctxt "@option:check"
|
||||||
msgid "Ensure objects are kept apart"
|
msgid "Ensure objects are kept apart"
|
||||||
msgstr ""
|
msgstr "Stellen Sie sicher, dass die Objekte getrennt gehalten werden"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:118
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:118
|
||||||
msgctxt "@info:tooltip"
|
msgctxt "@info:tooltip"
|
||||||
msgid ""
|
msgid ""
|
||||||
"Should objects on the platform be moved so that they no longer intersect."
|
"Should objects on the platform be moved so that they no longer intersect."
|
||||||
msgstr ""
|
msgstr "Objekte auf der Druckplatte sollten so verschoben werden, dass sie sich nicht länger überschneiden."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:147
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:147
|
||||||
msgctxt "@option:check"
|
msgctxt "@option:check"
|
||||||
msgid "Send (Anonymous) Print Information"
|
msgid "Send (Anonymous) Print Information"
|
||||||
msgstr ""
|
msgstr "Druck-Informationen (anonym) senden"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:151
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:151
|
||||||
msgctxt "@info:tooltip"
|
msgctxt "@info:tooltip"
|
||||||
|
@ -860,80 +856,80 @@ msgid ""
|
||||||
"Should anonymous data about your print be sent to Ultimaker? Note, no "
|
"Should anonymous data about your print be sent to Ultimaker? Note, no "
|
||||||
"models, IP addresses or other personally identifiable information is sent or "
|
"models, IP addresses or other personally identifiable information is sent or "
|
||||||
"stored."
|
"stored."
|
||||||
msgstr ""
|
msgstr "Sollen anonyme Daten über Ihren Drucker an Ultimaker gesendet werden? Beachten Sie, dass keine Modelle, IP-Adressen oder andere personenbezogene Daten gesendet oder gespeichert werden."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:179
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:179
|
||||||
msgctxt "@option:check"
|
msgctxt "@option:check"
|
||||||
msgid "Scale Too Large Files"
|
msgid "Scale Too Large Files"
|
||||||
msgstr ""
|
msgstr "Zu große Dateien anpassen"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:183
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:183
|
||||||
msgctxt "@info:tooltip"
|
msgctxt "@info:tooltip"
|
||||||
msgid ""
|
msgid ""
|
||||||
"Should opened files be scaled to the build volume when they are too large?"
|
"Should opened files be scaled to the build volume when they are too large?"
|
||||||
msgstr ""
|
msgstr "Sollen offene Dateien an das Erstellungsvolumen angepasste werden, wenn Sie zu groß sind?"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SaveButton.qml:70
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SaveButton.qml:70
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@label:textbox"
|
msgctxt "@label:textbox"
|
||||||
msgid "Printjob Name"
|
msgid "Printjob Name"
|
||||||
msgstr "Druckername:"
|
msgstr "Name des Druckauftrags"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SaveButton.qml:167
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SaveButton.qml:167
|
||||||
msgctxt "@label %1 is length of filament"
|
msgctxt "@label %1 is length of filament"
|
||||||
msgid "%1 m"
|
msgid "%1 m"
|
||||||
msgstr ""
|
msgstr "%1 m"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SaveButton.qml:229
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SaveButton.qml:229
|
||||||
msgctxt "@info:tooltip"
|
msgctxt "@info:tooltip"
|
||||||
msgid "Select the active output device"
|
msgid "Select the active output device"
|
||||||
msgstr ""
|
msgstr "Wählen Sie das aktive Ausgabegerät"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:34
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:34
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Infill:"
|
msgid "Infill:"
|
||||||
msgstr ""
|
msgstr "Füllung:"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:119
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:119
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Sparse"
|
msgid "Sparse"
|
||||||
msgstr ""
|
msgstr "Dünn"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:121
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:121
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Sparse (20%) infill will give your model an average strength"
|
msgid "Sparse (20%) infill will give your model an average strength"
|
||||||
msgstr ""
|
msgstr "Eine dünne (20 %) Füllung gibt Ihrem Modell eine durchschnittliche Festigkeit"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:125
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:125
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Dense"
|
msgid "Dense"
|
||||||
msgstr ""
|
msgstr "Dicht"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:127
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:127
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Dense (50%) infill will give your model an above average strength"
|
msgid "Dense (50%) infill will give your model an above average strength"
|
||||||
msgstr ""
|
msgstr "Eine dichte (50 %) Füllung gibt Ihrem Modell eine überdurchschnittliche Festigkeit"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:131
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:131
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Solid"
|
msgid "Solid"
|
||||||
msgstr ""
|
msgstr "Solide"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:133
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:133
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Solid (100%) infill will make your model completely solid"
|
msgid "Solid (100%) infill will make your model completely solid"
|
||||||
msgstr ""
|
msgstr "Eine solide (100 %) Füllung macht Ihr Modell vollständig massiv"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:151
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:151
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@label:listbox"
|
msgctxt "@label:listbox"
|
||||||
msgid "Helpers:"
|
msgid "Helpers:"
|
||||||
msgstr "&Hilfe"
|
msgstr "Helfer:"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:169
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:169
|
||||||
msgctxt "@option:check"
|
msgctxt "@option:check"
|
||||||
msgid "Enable Skirt Adhesion"
|
msgid "Enable Skirt Adhesion"
|
||||||
msgstr ""
|
msgstr "Adhäsion der Unterlage aktivieren"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:187
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:187
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -963,7 +959,7 @@ msgstr "Druckkonfiguration"
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@label:listbox"
|
msgctxt "@label:listbox"
|
||||||
msgid "Machine:"
|
msgid "Machine:"
|
||||||
msgstr "Maschine:"
|
msgstr "Gerät:"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:16
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:16
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -980,18 +976,18 @@ msgstr "&Datei"
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:43
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:43
|
||||||
msgctxt "@title:menu"
|
msgctxt "@title:menu"
|
||||||
msgid "Open &Recent"
|
msgid "Open &Recent"
|
||||||
msgstr ""
|
msgstr "&Zuletzt geöffnet"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:72
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:72
|
||||||
msgctxt "@action:inmenu"
|
msgctxt "@action:inmenu"
|
||||||
msgid "&Save Selection to File"
|
msgid "&Save Selection to File"
|
||||||
msgstr ""
|
msgstr "Auswahl als Datei &speichern"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:80
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:80
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@title:menu"
|
msgctxt "@title:menu"
|
||||||
msgid "Save &All"
|
msgid "Save &All"
|
||||||
msgstr "Datei speichern"
|
msgstr "&Alles speichern"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:108
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:108
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -1003,18 +999,18 @@ msgstr "&Bearbeiten"
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@title:menu"
|
msgctxt "@title:menu"
|
||||||
msgid "&View"
|
msgid "&View"
|
||||||
msgstr "Ansicht"
|
msgstr "&Ansicht"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:151
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:151
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgctxt "@title:menu"
|
msgctxt "@title:menu"
|
||||||
msgid "&Machine"
|
msgid "&Machine"
|
||||||
msgstr "&Maschine"
|
msgstr "&Gerät"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:197
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:197
|
||||||
msgctxt "@title:menu"
|
msgctxt "@title:menu"
|
||||||
msgid "&Profile"
|
msgid "&Profile"
|
||||||
msgstr ""
|
msgstr "&Profil"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:224
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:224
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
|
985
resources/i18n/de/fdmprinter.json.po
Normal file → Executable file
325
resources/i18n/fi/cura.po
Normal file → Executable file
|
@ -8,20 +8,20 @@ msgstr ""
|
||||||
"Project-Id-Version: \n"
|
"Project-Id-Version: \n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2015-09-12 20:10+0200\n"
|
"POT-Creation-Date: 2015-09-12 20:10+0200\n"
|
||||||
"PO-Revision-Date: 2015-06-30 18:02+0300\n"
|
"PO-Revision-Date: 2015-09-28 14:08+0300\n"
|
||||||
"Last-Translator: Tapio <info@tapimex.fi>\n"
|
"Last-Translator: Tapio <info@tapimex.fi>\n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
"Language: fi_FI\n"
|
"Language: fi_FI\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Generator: Poedit 1.8.2\n"
|
"X-Generator: Poedit 1.8.5\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/cura/CrashHandler.py:20
|
#: /home/ahiemstra/dev/15.10/src/cura/cura/CrashHandler.py:20
|
||||||
msgctxt "@title:window"
|
msgctxt "@title:window"
|
||||||
msgid "Oops!"
|
msgid "Oops!"
|
||||||
msgstr ""
|
msgstr "Hups!"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/cura/CrashHandler.py:26
|
#: /home/ahiemstra/dev/15.10/src/cura/cura/CrashHandler.py:26
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
|
@ -30,11 +30,14 @@ msgid ""
|
||||||
"below to post a bug report at <a href=\"http://github.com/Ultimaker/Cura/"
|
"below to post a bug report at <a href=\"http://github.com/Ultimaker/Cura/"
|
||||||
"issues\">http://github.com/Ultimaker/Cura/issues</a></p>"
|
"issues\">http://github.com/Ultimaker/Cura/issues</a></p>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"<p>Tapahtui epätavallinen poikkeus!</p><p>Lähetä virheraportti alla olevin "
|
||||||
|
"tiedoin osoitteella <a href=\"http://github.com/Ultimaker/Cura/issues"
|
||||||
|
"\">http://github.com/Ultimaker/Cura/issues</a></p>"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/cura/CrashHandler.py:46
|
#: /home/ahiemstra/dev/15.10/src/cura/cura/CrashHandler.py:46
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Open Web Page"
|
msgid "Open Web Page"
|
||||||
msgstr ""
|
msgstr "Avaa verkkosivu"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/cura/CuraApplication.py:135
|
#: /home/ahiemstra/dev/15.10/src/cura/cura/CuraApplication.py:135
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -51,34 +54,32 @@ msgstr "Ladataan käyttöliittymää..."
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/3MFReader/__init__.py:12
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/3MFReader/__init__.py:12
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "3MF Reader"
|
msgid "3MF Reader"
|
||||||
msgstr ""
|
msgstr "3MF Reader"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/3MFReader/__init__.py:15
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/3MFReader/__init__.py:15
|
||||||
msgctxt "@info:whatsthis"
|
msgctxt "@info:whatsthis"
|
||||||
msgid "Provides support for reading 3MF files."
|
msgid "Provides support for reading 3MF files."
|
||||||
msgstr ""
|
msgstr "Tukee 3MF-tiedostojen lukemista."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/3MFReader/__init__.py:20
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/3MFReader/__init__.py:20
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@item:inlistbox"
|
msgctxt "@item:inlistbox"
|
||||||
msgid "3MF File"
|
msgid "3MF File"
|
||||||
msgstr "&Tiedosto"
|
msgstr "3MF-tiedosto"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/ChangeLogPlugin/__init__.py:12
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/ChangeLogPlugin/__init__.py:12
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Change Log"
|
msgid "Change Log"
|
||||||
msgstr "Moottorin loki"
|
msgstr "Muutosloki"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/ChangeLogPlugin/__init__.py:15
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/ChangeLogPlugin/__init__.py:15
|
||||||
msgctxt "@info:whatsthis"
|
msgctxt "@info:whatsthis"
|
||||||
msgid "Shows changes since latest checked version"
|
msgid "Shows changes since latest checked version"
|
||||||
msgstr ""
|
msgstr "Näyttää viimeisimmän tarkistetun version jälkeen tapahtuneet muutokset"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/CuraEngineBackend/__init__.py:13
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/CuraEngineBackend/__init__.py:13
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "CuraEngine Backend"
|
msgid "CuraEngine Backend"
|
||||||
msgstr ""
|
msgstr "CuraEngine-taustaosa"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/CuraEngineBackend/__init__.py:15
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/CuraEngineBackend/__init__.py:15
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -90,25 +91,22 @@ msgstr "Linkki CuraEngine-viipalointiin taustalla"
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/CuraEngineBackend/ProcessSlicedObjectListJob.py:111
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/CuraEngineBackend/ProcessSlicedObjectListJob.py:111
|
||||||
msgctxt "@info:status"
|
msgctxt "@info:status"
|
||||||
msgid "Processing Layers"
|
msgid "Processing Layers"
|
||||||
msgstr ""
|
msgstr "Käsitellään kerroksia"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/CuraEngineBackend/CuraEngineBackend.py:169
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/CuraEngineBackend/CuraEngineBackend.py:169
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@info:status"
|
msgctxt "@info:status"
|
||||||
msgid "Slicing..."
|
msgid "Slicing..."
|
||||||
msgstr "Lasketaan..."
|
msgstr "Viipaloidaan..."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/GCodeWriter/__init__.py:12
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/GCodeWriter/__init__.py:12
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "GCode Writer"
|
msgid "GCode Writer"
|
||||||
msgstr "GCode-tiedosto"
|
msgstr "GCode Writer"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/GCodeWriter/__init__.py:15
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/GCodeWriter/__init__.py:15
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@info:whatsthis"
|
msgctxt "@info:whatsthis"
|
||||||
msgid "Writes GCode to a file"
|
msgid "Writes GCode to a file"
|
||||||
msgstr "Kirjoittaa GCoden tiedostoon"
|
msgstr "Kirjoittaa GCodea tiedostoon"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/GCodeWriter/__init__.py:22
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/GCodeWriter/__init__.py:22
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -117,19 +115,16 @@ msgid "GCode File"
|
||||||
msgstr "GCode-tiedosto"
|
msgstr "GCode-tiedosto"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/LayerView/__init__.py:13
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/LayerView/__init__.py:13
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Layer View"
|
msgid "Layer View"
|
||||||
msgstr "Kerrokset"
|
msgstr "Kerrosnäkymä"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/LayerView/__init__.py:16
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/LayerView/__init__.py:16
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@info:whatsthis"
|
msgctxt "@info:whatsthis"
|
||||||
msgid "Provides the Layer view."
|
msgid "Provides the Layer view."
|
||||||
msgstr "Kerrosnäkymä."
|
msgstr "Näyttää kerrosnäkymän."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/LayerView/__init__.py:20
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/LayerView/__init__.py:20
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@item:inlistbox"
|
msgctxt "@item:inlistbox"
|
||||||
msgid "Layers"
|
msgid "Layers"
|
||||||
msgstr "Kerrokset"
|
msgstr "Kerrokset"
|
||||||
|
@ -137,28 +132,27 @@ msgstr "Kerrokset"
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:20
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:20
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Save to Removable Drive"
|
msgid "Save to Removable Drive"
|
||||||
msgstr ""
|
msgstr "Tallenna siirrettävälle asemalle"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:21
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:21
|
||||||
#, fuzzy, python-brace-format
|
#, python-brace-format
|
||||||
msgctxt "@item:inlistbox"
|
msgctxt "@item:inlistbox"
|
||||||
msgid "Save to Removable Drive {0}"
|
msgid "Save to Removable Drive {0}"
|
||||||
msgstr "Tallenna SD-kortille {0}"
|
msgstr "Tallenna siirrettävälle asemalle {0}"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:52
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:52
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgctxt "@info:progress"
|
msgctxt "@info:progress"
|
||||||
msgid "Saving to Removable Drive <filename>{0}</filename>"
|
msgid "Saving to Removable Drive <filename>{0}</filename>"
|
||||||
msgstr ""
|
msgstr "Tallennetaan siirrettävälle asemalle <filename>{0}</filename>"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:73
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:73
|
||||||
#, fuzzy, python-brace-format
|
#, python-brace-format
|
||||||
msgctxt "@info:status"
|
msgctxt "@info:status"
|
||||||
msgid "Saved to Removable Drive {0} as {1}"
|
msgid "Saved to Removable Drive {0} as {1}"
|
||||||
msgstr "Tallennettu SD-kortille {0} nimellä {1}"
|
msgstr "Tallennettu siirrettävälle asemalle {0} nimellä {1}"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:74
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:74
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Eject"
|
msgid "Eject"
|
||||||
msgstr "Poista"
|
msgstr "Poista"
|
||||||
|
@ -167,96 +161,98 @@ msgstr "Poista"
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgctxt "@action"
|
msgctxt "@action"
|
||||||
msgid "Eject removable device {0}"
|
msgid "Eject removable device {0}"
|
||||||
msgstr ""
|
msgstr "Poista siirrettävä asema {0}"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:79
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:79
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgctxt "@info:status"
|
msgctxt "@info:status"
|
||||||
msgid "Could not save to removable drive {0}: {1}"
|
msgid "Could not save to removable drive {0}: {1}"
|
||||||
msgstr ""
|
msgstr "Ei voitu tallentaa siirrettävälle asemalle {0}: {1}"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py:58
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py:58
|
||||||
msgctxt "@item:intext"
|
msgctxt "@item:intext"
|
||||||
msgid "Removable Drive"
|
msgid "Removable Drive"
|
||||||
msgstr ""
|
msgstr "Siirrettävä asema"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDrivePlugin.py:42
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDrivePlugin.py:42
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgctxt "@info:status"
|
msgctxt "@info:status"
|
||||||
msgid "Ejected {0}. You can now safely remove the drive."
|
msgid "Ejected {0}. You can now safely remove the drive."
|
||||||
msgstr ""
|
msgstr "Poistettu {0}. Voit nyt poistaa aseman turvallisesti."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDrivePlugin.py:45
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDrivePlugin.py:45
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgctxt "@info:status"
|
msgctxt "@info:status"
|
||||||
msgid "Failed to eject {0}. Maybe it is still in use?"
|
msgid "Failed to eject {0}. Maybe it is still in use?"
|
||||||
msgstr ""
|
msgstr "{0} poisto epäonnistui. Onko se vielä käytössä?"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/__init__.py:12
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/__init__.py:12
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Removable Drive Output Device Plugin"
|
msgid "Removable Drive Output Device Plugin"
|
||||||
msgstr ""
|
msgstr "Irrotettavan aseman lisäosa"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/__init__.py:14
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/__init__.py:14
|
||||||
msgctxt "@info:whatsthis"
|
msgctxt "@info:whatsthis"
|
||||||
msgid "Provides removable drive hotplugging and writing support"
|
msgid "Provides removable drive hotplugging and writing support"
|
||||||
msgstr ""
|
msgstr "Tukee irrotettavan aseman kytkemistä lennossa ja sille kirjoittamista"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/SliceInfoPlugin/__init__.py:10
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/SliceInfoPlugin/__init__.py:10
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Slice info"
|
msgid "Slice info"
|
||||||
msgstr ""
|
msgstr "Viipalointitiedot"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/SliceInfoPlugin/__init__.py:13
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/SliceInfoPlugin/__init__.py:13
|
||||||
msgctxt "@info:whatsthis"
|
msgctxt "@info:whatsthis"
|
||||||
msgid "Submits anonymous slice info. Can be disabled through preferences."
|
msgid "Submits anonymous slice info. Can be disabled through preferences."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Lähettää anonyymiä viipalointitietoa. Voidaan lisäasetuksista kytkeä pois "
|
||||||
|
"käytöstä."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/SliceInfoPlugin/SliceInfo.py:35
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/SliceInfoPlugin/SliceInfo.py:35
|
||||||
msgctxt "@info"
|
msgctxt "@info"
|
||||||
msgid ""
|
msgid ""
|
||||||
"Cura automatically sends slice info. You can disable this in preferences"
|
"Cura automatically sends slice info. You can disable this in preferences"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Cura lähettää automaattisesti viipalointitietoa. Voit lisäasetuksista kytkeä "
|
||||||
|
"sen pois käytöstä"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/SliceInfoPlugin/SliceInfo.py:36
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/SliceInfoPlugin/SliceInfo.py:36
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Dismiss"
|
msgid "Dismiss"
|
||||||
msgstr ""
|
msgstr "Ohita"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/PrinterConnection.py:35
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/PrinterConnection.py:35
|
||||||
msgctxt "@item:inmenu"
|
msgctxt "@item:inmenu"
|
||||||
msgid "USB printing"
|
msgid "USB printing"
|
||||||
msgstr ""
|
msgstr "USB-tulostus"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/PrinterConnection.py:36
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/PrinterConnection.py:36
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Print with USB"
|
msgid "Print with USB"
|
||||||
msgstr ""
|
msgstr "Tulosta USB:llä"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/PrinterConnection.py:37
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/PrinterConnection.py:37
|
||||||
msgctxt "@info:tooltip"
|
msgctxt "@info:tooltip"
|
||||||
msgid "Print with USB"
|
msgid "Print with USB"
|
||||||
msgstr ""
|
msgstr "Tulostus USB:n kautta"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/__init__.py:13
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/__init__.py:13
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "USB printing"
|
msgid "USB printing"
|
||||||
msgstr ""
|
msgstr "USB-tulostus"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/__init__.py:17
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/__init__.py:17
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@info:whatsthis"
|
msgctxt "@info:whatsthis"
|
||||||
msgid ""
|
msgid ""
|
||||||
"Accepts G-Code and sends them to a printer. Plugin can also update firmware."
|
"Accepts G-Code and sends them to a printer. Plugin can also update firmware."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Hyväksyy G-Coden ja lähettää ne tulostimeen. Lisäosa voi myös päivittää "
|
"Hyväksyy G-Code-määrittelyt ja lähettää ne tulostimeen. Lisäosa voi myös "
|
||||||
"laiteohjelmiston"
|
"päivittää laiteohjelmiston."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/USBPrinterManager.py:46
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/USBPrinterManager.py:46
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@title:menu"
|
msgctxt "@title:menu"
|
||||||
msgid "Firmware"
|
msgid "Firmware"
|
||||||
msgstr "Päivitä laiteohjelmisto"
|
msgstr "Laiteohjelmisto"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/USBPrinterManager.py:47
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/USBPrinterManager.py:47
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -267,7 +263,7 @@ msgstr "Päivitä laiteohjelmisto"
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/ControlWindow.qml:17
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/ControlWindow.qml:17
|
||||||
msgctxt "@title:window"
|
msgctxt "@title:window"
|
||||||
msgid "Print with USB"
|
msgid "Print with USB"
|
||||||
msgstr ""
|
msgstr "Tulostus USB:n kautta"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/ControlWindow.qml:28
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/ControlWindow.qml:28
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -294,10 +290,9 @@ msgid "Cancel"
|
||||||
msgstr "Peruuta"
|
msgstr "Peruuta"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:20
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:20
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@title:window"
|
msgctxt "@title:window"
|
||||||
msgid "Firmware Update"
|
msgid "Firmware Update"
|
||||||
msgstr "Laiteohjelmiston päivitys suoritettu."
|
msgstr "Laiteohjelmiston päivitys"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:38
|
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:38
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -347,12 +342,12 @@ msgstr "Moottorin loki"
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/ProfileSetup.qml:31
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/ProfileSetup.qml:31
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Variant:"
|
msgid "Variant:"
|
||||||
msgstr ""
|
msgstr "Variantti:"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/ProfileSetup.qml:82
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/ProfileSetup.qml:82
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Global Profile:"
|
msgid "Global Profile:"
|
||||||
msgstr ""
|
msgstr "Yleisprofiili:"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/AddMachine.qml:60
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/AddMachine.qml:60
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -370,31 +365,29 @@ msgstr "Tulostimen nimi:"
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/SelectUpgradedParts.qml:29
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/SelectUpgradedParts.qml:29
|
||||||
msgctxt "@title"
|
msgctxt "@title"
|
||||||
msgid "Select Upgraded Parts"
|
msgid "Select Upgraded Parts"
|
||||||
msgstr ""
|
msgstr "Valitse päivitettävät osat"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/AddMachine.qml:214
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/AddMachine.qml:214
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UpgradeFirmware.qml:29
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UpgradeFirmware.qml:29
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@title"
|
msgctxt "@title"
|
||||||
msgid "Upgrade Firmware"
|
msgid "Upgrade Firmware"
|
||||||
msgstr "Päivitä laiteohjelmisto"
|
msgstr "Laiteohjelmiston päivitys"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/AddMachine.qml:217
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/AddMachine.qml:217
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:37
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:37
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@title"
|
msgctxt "@title"
|
||||||
msgid "Check Printer"
|
msgid "Check Printer"
|
||||||
msgstr "Lisää tulostin"
|
msgstr "Tarkista tulostin"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/AddMachine.qml:220
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/AddMachine.qml:220
|
||||||
msgctxt "@title"
|
msgctxt "@title"
|
||||||
msgid "Bed Levelling"
|
msgid "Bed Levelling"
|
||||||
msgstr ""
|
msgstr "Pöydän tasaaminen"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/Bedleveling.qml:25
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/Bedleveling.qml:25
|
||||||
msgctxt "@title"
|
msgctxt "@title"
|
||||||
msgid "Bed Leveling"
|
msgid "Bed Leveling"
|
||||||
msgstr ""
|
msgstr "Pöydän tasaaminen"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/Bedleveling.qml:34
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/Bedleveling.qml:34
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
|
@ -403,6 +396,8 @@ msgid ""
|
||||||
"buildplate. When you click 'Move to Next Position' the nozzle will move to "
|
"buildplate. When you click 'Move to Next Position' the nozzle will move to "
|
||||||
"the different positions that can be adjusted."
|
"the different positions that can be adjusted."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Voit säätää alustaa, jotta tulosteista tulisi hyviä. Kun napsautat 'Siirry "
|
||||||
|
"seuraavaan positioon', suutin siirtyy eri positioihin, joita voidaan säätää."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/Bedleveling.qml:40
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/Bedleveling.qml:40
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
|
@ -411,16 +406,19 @@ msgid ""
|
||||||
"print bed height. The print bed height is right when the paper is slightly "
|
"print bed height. The print bed height is right when the paper is slightly "
|
||||||
"gripped by the tip of the nozzle."
|
"gripped by the tip of the nozzle."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Laita paperinpala kussakin positiossa suuttimen alle ja säädä tulostuspöydän "
|
||||||
|
"korkeus. Tulostuspöydän korkeus on oikea, kun suuttimen kärki juuri ja juuri "
|
||||||
|
"osuu paperiin."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/Bedleveling.qml:44
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/Bedleveling.qml:44
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Move to Next Position"
|
msgid "Move to Next Position"
|
||||||
msgstr ""
|
msgstr "Siirry seuraavaan positioon"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/Bedleveling.qml:66
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/Bedleveling.qml:66
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Skip Bedleveling"
|
msgid "Skip Bedleveling"
|
||||||
msgstr ""
|
msgstr "Ohita pöydän tasaus"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/SelectUpgradedParts.qml:39
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/SelectUpgradedParts.qml:39
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
|
@ -428,27 +426,28 @@ msgid ""
|
||||||
"To assist you in having better default settings for your Ultimaker. Cura "
|
"To assist you in having better default settings for your Ultimaker. Cura "
|
||||||
"would like to know which upgrades you have in your machine:"
|
"would like to know which upgrades you have in your machine:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Saat paremmat oletusasetukset Ultimakeriin. Cura haluaisi tietää, mitä "
|
||||||
|
"päivityksiä laitteessasi on:"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/SelectUpgradedParts.qml:49
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/SelectUpgradedParts.qml:49
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@option:check"
|
msgctxt "@option:check"
|
||||||
msgid "Extruder driver ugrades"
|
msgid "Extruder driver ugrades"
|
||||||
msgstr "Suulakkeen lämpötila %1"
|
msgstr "Suulakekäytön päivitykset"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/SelectUpgradedParts.qml:54
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/SelectUpgradedParts.qml:54
|
||||||
msgctxt "@option:check"
|
msgctxt "@option:check"
|
||||||
msgid "Heated printer bed (standard kit)"
|
msgid "Heated printer bed (standard kit)"
|
||||||
msgstr ""
|
msgstr "Lämmitetty tulostinpöytä (normaali sarja)"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/SelectUpgradedParts.qml:58
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/SelectUpgradedParts.qml:58
|
||||||
msgctxt "@option:check"
|
msgctxt "@option:check"
|
||||||
msgid "Heated printer bed (self built)"
|
msgid "Heated printer bed (self built)"
|
||||||
msgstr ""
|
msgstr "Lämmitetty tulostinpöytä (itse rakennettu)"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/SelectUpgradedParts.qml:62
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/SelectUpgradedParts.qml:62
|
||||||
msgctxt "@option:check"
|
msgctxt "@option:check"
|
||||||
msgid "Dual extrusion (experimental)"
|
msgid "Dual extrusion (experimental)"
|
||||||
msgstr ""
|
msgstr "Kaksoispursotus (kokeellinen)"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/SelectUpgradedParts.qml:70
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/SelectUpgradedParts.qml:70
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
|
@ -458,6 +457,11 @@ msgid ""
|
||||||
"improve reliability. This upgrade can be bought from the Ultimaker webshop "
|
"improve reliability. This upgrade can be bought from the Ultimaker webshop "
|
||||||
"or found on thingiverse as thing:26094"
|
"or found on thingiverse as thing:26094"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Jos olet hankkinut Ultimakerin lokakuun 2012 jälkeen, sinulla on "
|
||||||
|
"suulakekäytön päivityspaketti (Extruder drive). Ellei sinulla ole tätä "
|
||||||
|
"päivitystä, sitä suositellaan kovasti luotettavuuden parantamiseksi. Tämä "
|
||||||
|
"päivityspaketti voidaan ostaa Ultimakerin verkkokaupasta tai se löytyy "
|
||||||
|
"thingiverse-sivustolta numerolla: 26094"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:44
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:44
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
|
@ -465,36 +469,38 @@ msgid ""
|
||||||
"It's a good idea to do a few sanity checks on your Ultimaker. You can skip "
|
"It's a good idea to do a few sanity checks on your Ultimaker. You can skip "
|
||||||
"this step if you know your machine is functional"
|
"this step if you know your machine is functional"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Ultimakerille on hyvä tehdä muutamia toimintatarkastuksia. Voit jättää tämän "
|
||||||
|
"vaiheen väliin, jos tiedät laitteesi olevan toimintakunnossa"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:49
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:49
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Start Printer Check"
|
msgid "Start Printer Check"
|
||||||
msgstr ""
|
msgstr "Aloita tulostintarkistus"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:56
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:56
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Skip Printer Check"
|
msgid "Skip Printer Check"
|
||||||
msgstr ""
|
msgstr "Ohita tulostintarkistus"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:65
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:65
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Connection: "
|
msgid "Connection: "
|
||||||
msgstr ""
|
msgstr "Yhteys:"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:69
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:69
|
||||||
msgctxt "@info:status"
|
msgctxt "@info:status"
|
||||||
msgid "Done"
|
msgid "Done"
|
||||||
msgstr ""
|
msgstr "Valmis"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:69
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:69
|
||||||
msgctxt "@info:status"
|
msgctxt "@info:status"
|
||||||
msgid "Incomplete"
|
msgid "Incomplete"
|
||||||
msgstr ""
|
msgstr "Kesken"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:76
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:76
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Min endstop X: "
|
msgid "Min endstop X: "
|
||||||
msgstr ""
|
msgstr "Min. päätyraja X:"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:80
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:80
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:91
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:91
|
||||||
|
@ -503,7 +509,7 @@ msgstr ""
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:201
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:201
|
||||||
msgctxt "@info:status"
|
msgctxt "@info:status"
|
||||||
msgid "Works"
|
msgid "Works"
|
||||||
msgstr ""
|
msgstr "Toimii"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:80
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:80
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:91
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:91
|
||||||
|
@ -512,40 +518,39 @@ msgstr ""
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:163
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:163
|
||||||
msgctxt "@info:status"
|
msgctxt "@info:status"
|
||||||
msgid "Not checked"
|
msgid "Not checked"
|
||||||
msgstr ""
|
msgstr "Ei tarkistettu"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:87
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:87
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Min endstop Y: "
|
msgid "Min endstop Y: "
|
||||||
msgstr ""
|
msgstr "Min. päätyraja Y:"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:99
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:99
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Min endstop Z: "
|
msgid "Min endstop Z: "
|
||||||
msgstr ""
|
msgstr "Min. päätyraja Z:"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:111
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:111
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Nozzle temperature check: "
|
msgid "Nozzle temperature check: "
|
||||||
msgstr ""
|
msgstr "Suuttimen lämpötilatarkistus:"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:119
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:119
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:149
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:149
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Start Heating"
|
msgid "Start Heating"
|
||||||
msgstr ""
|
msgstr "Aloita lämmitys"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:124
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:124
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:154
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:154
|
||||||
msgctxt "@info:progress"
|
msgctxt "@info:progress"
|
||||||
msgid "Checking"
|
msgid "Checking"
|
||||||
msgstr ""
|
msgstr "Tarkistetaan"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:141
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:141
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "bed temperature check:"
|
msgid "bed temperature check:"
|
||||||
msgstr "Pöydän lämpötila %1"
|
msgstr "Pöydän lämpötilan tarkistus:"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UpgradeFirmware.qml:38
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UpgradeFirmware.qml:38
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
|
@ -554,6 +559,9 @@ msgid ""
|
||||||
"firmware controls the step motors, regulates the temperature and ultimately "
|
"firmware controls the step motors, regulates the temperature and ultimately "
|
||||||
"makes your printer work."
|
"makes your printer work."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Laiteohjelmisto on suoraan 3D-tulostimessa toimiva ohjelma. Laiteohjelmisto "
|
||||||
|
"ohjaa askelmoottoreita, säätää lämpötilaa ja loppujen lopuksi saa tulostimen "
|
||||||
|
"toimimaan."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UpgradeFirmware.qml:45
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UpgradeFirmware.qml:45
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
|
@ -561,6 +569,8 @@ msgid ""
|
||||||
"The firmware shipping with new Ultimakers works, but upgrades have been made "
|
"The firmware shipping with new Ultimakers works, but upgrades have been made "
|
||||||
"to make better prints, and make calibration easier."
|
"to make better prints, and make calibration easier."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Uusien Ultimakerien mukana toimitettu laiteohjelmisto toimii, mutta "
|
||||||
|
"päivityksillä saadaan parempia tulosteita ja kalibrointi helpottuu."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UpgradeFirmware.qml:52
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UpgradeFirmware.qml:52
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
|
@ -568,37 +578,36 @@ msgid ""
|
||||||
"Cura requires these new features and thus your firmware will most likely "
|
"Cura requires these new features and thus your firmware will most likely "
|
||||||
"need to be upgraded. You can do so now."
|
"need to be upgraded. You can do so now."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Cura tarvitsee näitä uusia ominaisuuksia ja siten laiteohjelmisto on "
|
||||||
|
"todennäköisesti päivitettävä. Voit tehdä sen nyt."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UpgradeFirmware.qml:55
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UpgradeFirmware.qml:55
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Upgrade to Marlin Firmware"
|
msgid "Upgrade to Marlin Firmware"
|
||||||
msgstr "Päivitä laiteohjelmisto"
|
msgstr "Päivitä Marlin-laiteohjelmistoon"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UpgradeFirmware.qml:58
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UpgradeFirmware.qml:58
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Skip Upgrade"
|
msgid "Skip Upgrade"
|
||||||
msgstr ""
|
msgstr "Ohita päivitys"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/AboutDialog.qml:15
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/AboutDialog.qml:15
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@title:window"
|
msgctxt "@title:window"
|
||||||
msgid "About Cura"
|
msgid "About Cura"
|
||||||
msgstr "Tietoja Curasta"
|
msgstr "Tietoja Curasta"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/AboutDialog.qml:54
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/AboutDialog.qml:54
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "End-to-end solution for fused filament 3D printing."
|
msgid "End-to-end solution for fused filament 3D printing."
|
||||||
msgstr "Kokonaisvaltainen sulatettavan tulostuslangan 3D-tulostusratkaisu."
|
msgstr "Kokonaisvaltainen sulatettavan tulostuslangan 3D-tulostusratkaisu."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/AboutDialog.qml:66
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/AboutDialog.qml:66
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@info:credit"
|
msgctxt "@info:credit"
|
||||||
msgid ""
|
msgid ""
|
||||||
"Cura has been developed by Ultimaker B.V. in cooperation with the community."
|
"Cura has been developed by Ultimaker B.V. in cooperation with the community."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Cura-ohjelman on kehittänyt Ultimaker B.V. yhteistyössä yhteisön kanssa."
|
"Cura-ohjelman on kehittänyt Ultimaker B.V. yhteistyössä käyttäjäyhteisön "
|
||||||
|
"kanssa."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/ViewPage.qml:16
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/ViewPage.qml:16
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -618,11 +627,13 @@ msgid ""
|
||||||
"Highlight unsupported areas of the model in red. Without support these areas "
|
"Highlight unsupported areas of the model in red. Without support these areas "
|
||||||
"will nog print properly."
|
"will nog print properly."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Korostaa mallin vailla tukea olevat alueet punaisella. Ilman tukea nämä "
|
||||||
|
"alueet eivät tulostu kunnolla."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/ViewPage.qml:74
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/ViewPage.qml:74
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Center camera when item is selected"
|
msgid "Center camera when item is selected"
|
||||||
msgstr ""
|
msgstr "Keskitä kamera kun kohde on valittu"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/ViewPage.qml:78
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/ViewPage.qml:78
|
||||||
msgctxt "@info:tooltip"
|
msgctxt "@info:tooltip"
|
||||||
|
@ -630,11 +641,13 @@ msgid ""
|
||||||
"Moves the camera so the object is in the center of the view when an object "
|
"Moves the camera so the object is in the center of the view when an object "
|
||||||
"is selected"
|
"is selected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Siirtää kameraa siten, että kappale on näkymän keskellä, kun kappale on "
|
||||||
|
"valittu"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:51
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:51
|
||||||
msgctxt "@action:inmenu"
|
msgctxt "@action:inmenu"
|
||||||
msgid "Toggle Fu&ll Screen"
|
msgid "Toggle Fu&ll Screen"
|
||||||
msgstr ""
|
msgstr "Vaihda &koko näyttöön"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:58
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:58
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -655,10 +668,9 @@ msgid "&Quit"
|
||||||
msgstr "&Lopeta"
|
msgstr "&Lopeta"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:82
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:82
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@action:inmenu"
|
msgctxt "@action:inmenu"
|
||||||
msgid "&Preferences..."
|
msgid "&Preferences..."
|
||||||
msgstr "&Suosikkiasetukset..."
|
msgstr "&Lisäasetukset..."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:89
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:89
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -667,15 +679,14 @@ msgid "&Add Printer..."
|
||||||
msgstr "L&isää tulostin..."
|
msgstr "L&isää tulostin..."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:95
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:95
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@action:inmenu"
|
msgctxt "@action:inmenu"
|
||||||
msgid "Manage Pr&inters..."
|
msgid "Manage Pr&inters..."
|
||||||
msgstr "L&isää tulostin..."
|
msgstr "Tulostinten &hallinta..."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:102
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:102
|
||||||
msgctxt "@action:inmenu"
|
msgctxt "@action:inmenu"
|
||||||
msgid "Manage Profiles..."
|
msgid "Manage Profiles..."
|
||||||
msgstr ""
|
msgstr "Profiilien hallinta..."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:109
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:109
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -696,74 +707,64 @@ msgid "&About..."
|
||||||
msgstr "Ti&etoja..."
|
msgstr "Ti&etoja..."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:130
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:130
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@action:inmenu"
|
msgctxt "@action:inmenu"
|
||||||
msgid "Delete &Selection"
|
msgid "Delete &Selection"
|
||||||
msgstr "Poista valinta"
|
msgstr "&Poista valinta"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:138
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:138
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@action:inmenu"
|
msgctxt "@action:inmenu"
|
||||||
msgid "Delete Object"
|
msgid "Delete Object"
|
||||||
msgstr "Poista kohde"
|
msgstr "Poista kappale"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:146
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:146
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@action:inmenu"
|
msgctxt "@action:inmenu"
|
||||||
msgid "Ce&nter Object on Platform"
|
msgid "Ce&nter Object on Platform"
|
||||||
msgstr "Keskitä kohde alustalle"
|
msgstr "K&eskitä kappale alustalle"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:152
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:152
|
||||||
msgctxt "@action:inmenu"
|
msgctxt "@action:inmenu"
|
||||||
msgid "&Group Objects"
|
msgid "&Group Objects"
|
||||||
msgstr ""
|
msgstr "&Ryhmitä kappaleet"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:160
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:160
|
||||||
msgctxt "@action:inmenu"
|
msgctxt "@action:inmenu"
|
||||||
msgid "Ungroup Objects"
|
msgid "Ungroup Objects"
|
||||||
msgstr ""
|
msgstr "Pura kappaleiden ryhmitys"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:168
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:168
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@action:inmenu"
|
msgctxt "@action:inmenu"
|
||||||
msgid "&Merge Objects"
|
msgid "&Merge Objects"
|
||||||
msgstr "Poista kohde"
|
msgstr "&Yhdistä kappaleet"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:176
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:176
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@action:inmenu"
|
msgctxt "@action:inmenu"
|
||||||
msgid "&Duplicate Object"
|
msgid "&Duplicate Object"
|
||||||
msgstr "Monista kohde"
|
msgstr "&Monista kappale"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:183
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:183
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@action:inmenu"
|
msgctxt "@action:inmenu"
|
||||||
msgid "&Clear Build Platform"
|
msgid "&Clear Build Platform"
|
||||||
msgstr "Tyhjennä alusta"
|
msgstr "&Tyhjennä alusta"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:190
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:190
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@action:inmenu"
|
msgctxt "@action:inmenu"
|
||||||
msgid "Re&load All Objects"
|
msgid "Re&load All Objects"
|
||||||
msgstr "Lataa kaikki kohteet uudelleen"
|
msgstr "&Lataa kaikki kappaleet uudelleen"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:197
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:197
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@action:inmenu"
|
msgctxt "@action:inmenu"
|
||||||
msgid "Reset All Object Positions"
|
msgid "Reset All Object Positions"
|
||||||
msgstr "Nollaa kaikki kohteiden sijainnit"
|
msgstr "Nollaa kaikkien kappaleiden sijainnit"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:203
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:203
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@action:inmenu"
|
msgctxt "@action:inmenu"
|
||||||
msgid "Reset All Object &Transformations"
|
msgid "Reset All Object &Transformations"
|
||||||
msgstr "Nollaa kaikkien kohteiden muunnokset"
|
msgstr "Nollaa kaikkien kappaleiden m&uunnokset"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:209
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:209
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@action:inmenu"
|
msgctxt "@action:inmenu"
|
||||||
msgid "&Open File..."
|
msgid "&Open File..."
|
||||||
msgstr "Avaa tiedosto"
|
msgstr "&Avaa tiedosto..."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:217
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:217
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -775,84 +776,87 @@ msgstr "Näytä moottorin l&oki"
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:461
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:461
|
||||||
msgctxt "@title:tab"
|
msgctxt "@title:tab"
|
||||||
msgid "General"
|
msgid "General"
|
||||||
msgstr ""
|
msgstr "Yleiset"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:36
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:36
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr ""
|
msgstr "Kieli"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:47
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:47
|
||||||
msgctxt "@item:inlistbox"
|
msgctxt "@item:inlistbox"
|
||||||
msgid "Bulgarian"
|
msgid "Bulgarian"
|
||||||
msgstr ""
|
msgstr "bulgaria"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:48
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:48
|
||||||
msgctxt "@item:inlistbox"
|
msgctxt "@item:inlistbox"
|
||||||
msgid "Czech"
|
msgid "Czech"
|
||||||
msgstr ""
|
msgstr "tsekki"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:49
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:49
|
||||||
msgctxt "@item:inlistbox"
|
msgctxt "@item:inlistbox"
|
||||||
msgid "English"
|
msgid "English"
|
||||||
msgstr ""
|
msgstr "englanti"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:50
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:50
|
||||||
msgctxt "@item:inlistbox"
|
msgctxt "@item:inlistbox"
|
||||||
msgid "Finnish"
|
msgid "Finnish"
|
||||||
msgstr ""
|
msgstr "suomi"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:51
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:51
|
||||||
msgctxt "@item:inlistbox"
|
msgctxt "@item:inlistbox"
|
||||||
msgid "French"
|
msgid "French"
|
||||||
msgstr ""
|
msgstr "ranska"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:52
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:52
|
||||||
msgctxt "@item:inlistbox"
|
msgctxt "@item:inlistbox"
|
||||||
msgid "German"
|
msgid "German"
|
||||||
msgstr ""
|
msgstr "saksa"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:53
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:53
|
||||||
msgctxt "@item:inlistbox"
|
msgctxt "@item:inlistbox"
|
||||||
msgid "Italian"
|
msgid "Italian"
|
||||||
msgstr ""
|
msgstr "italia"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:54
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:54
|
||||||
msgctxt "@item:inlistbox"
|
msgctxt "@item:inlistbox"
|
||||||
msgid "Polish"
|
msgid "Polish"
|
||||||
msgstr ""
|
msgstr "puola"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:55
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:55
|
||||||
msgctxt "@item:inlistbox"
|
msgctxt "@item:inlistbox"
|
||||||
msgid "Russian"
|
msgid "Russian"
|
||||||
msgstr ""
|
msgstr "venäjä"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:56
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:56
|
||||||
msgctxt "@item:inlistbox"
|
msgctxt "@item:inlistbox"
|
||||||
msgid "Spanish"
|
msgid "Spanish"
|
||||||
msgstr ""
|
msgstr "espanja"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:98
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:98
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid ""
|
msgid ""
|
||||||
"You will need to restart the application for language changes to have effect."
|
"You will need to restart the application for language changes to have effect."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Sovellus on käynnistettävä uudelleen, jotta kielimuutokset tulevat voimaan."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:114
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:114
|
||||||
msgctxt "@option:check"
|
msgctxt "@option:check"
|
||||||
msgid "Ensure objects are kept apart"
|
msgid "Ensure objects are kept apart"
|
||||||
msgstr ""
|
msgstr "Pidä kappaleet erillään"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:118
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:118
|
||||||
msgctxt "@info:tooltip"
|
msgctxt "@info:tooltip"
|
||||||
msgid ""
|
msgid ""
|
||||||
"Should objects on the platform be moved so that they no longer intersect."
|
"Should objects on the platform be moved so that they no longer intersect."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Pitäisikö kappaleita alustalla siirtää niin, etteivät ne enää leikkaa "
|
||||||
|
"toisiaan?"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:147
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:147
|
||||||
msgctxt "@option:check"
|
msgctxt "@option:check"
|
||||||
msgid "Send (Anonymous) Print Information"
|
msgid "Send (Anonymous) Print Information"
|
||||||
msgstr ""
|
msgstr "Lähetä (anonyymit) tulostustiedot"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:151
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:151
|
||||||
msgctxt "@info:tooltip"
|
msgctxt "@info:tooltip"
|
||||||
|
@ -861,103 +865,102 @@ msgid ""
|
||||||
"models, IP addresses or other personally identifiable information is sent or "
|
"models, IP addresses or other personally identifiable information is sent or "
|
||||||
"stored."
|
"stored."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Pitäisikö anonyymejä tietoja tulosteesta lähettää Ultimakerille? Huomaa, "
|
||||||
|
"että malleja, IP-osoitteita tai muita henkilökohtaisia tietoja ei lähetetä "
|
||||||
|
"eikä tallenneta."
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:179
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:179
|
||||||
msgctxt "@option:check"
|
msgctxt "@option:check"
|
||||||
msgid "Scale Too Large Files"
|
msgid "Scale Too Large Files"
|
||||||
msgstr ""
|
msgstr "Skaalaa liian isot tiedostot"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:183
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:183
|
||||||
msgctxt "@info:tooltip"
|
msgctxt "@info:tooltip"
|
||||||
msgid ""
|
msgid ""
|
||||||
"Should opened files be scaled to the build volume when they are too large?"
|
"Should opened files be scaled to the build volume when they are too large?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Pitäisikö avoimia tiedostoja skaalata rakennustilavuuteen, jos ne ovat liian "
|
||||||
|
"isoja?"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SaveButton.qml:70
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SaveButton.qml:70
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@label:textbox"
|
msgctxt "@label:textbox"
|
||||||
msgid "Printjob Name"
|
msgid "Printjob Name"
|
||||||
msgstr "Tulostimen nimi:"
|
msgstr "Tulostustyön nimi"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SaveButton.qml:167
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SaveButton.qml:167
|
||||||
msgctxt "@label %1 is length of filament"
|
msgctxt "@label %1 is length of filament"
|
||||||
msgid "%1 m"
|
msgid "%1 m"
|
||||||
msgstr ""
|
msgstr "%1 m"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SaveButton.qml:229
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SaveButton.qml:229
|
||||||
msgctxt "@info:tooltip"
|
msgctxt "@info:tooltip"
|
||||||
msgid "Select the active output device"
|
msgid "Select the active output device"
|
||||||
msgstr ""
|
msgstr "Valitse aktiivinen oheislaite"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:34
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:34
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Infill:"
|
msgid "Infill:"
|
||||||
msgstr ""
|
msgstr "Täyttö:"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:119
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:119
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Sparse"
|
msgid "Sparse"
|
||||||
msgstr ""
|
msgstr "Harva"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:121
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:121
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Sparse (20%) infill will give your model an average strength"
|
msgid "Sparse (20%) infill will give your model an average strength"
|
||||||
msgstr ""
|
msgstr "Harva (20 %) täyttö antaa mallille keskimääräistä lujuutta"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:125
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:125
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Dense"
|
msgid "Dense"
|
||||||
msgstr ""
|
msgstr "Tiheä"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:127
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:127
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Dense (50%) infill will give your model an above average strength"
|
msgid "Dense (50%) infill will give your model an above average strength"
|
||||||
msgstr ""
|
msgstr "Tiheä (50 %) täyttö antaa mallille keskimääräistä paremman lujuuden"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:131
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:131
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Solid"
|
msgid "Solid"
|
||||||
msgstr ""
|
msgstr "Kiinteä"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:133
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:133
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Solid (100%) infill will make your model completely solid"
|
msgid "Solid (100%) infill will make your model completely solid"
|
||||||
msgstr ""
|
msgstr "Kiinteä (100 %) täyttö tekee mallista täysin umpinaisen"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:151
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:151
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@label:listbox"
|
msgctxt "@label:listbox"
|
||||||
msgid "Helpers:"
|
msgid "Helpers:"
|
||||||
msgstr "&Ohje"
|
msgstr "Avustimet:"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:169
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:169
|
||||||
msgctxt "@option:check"
|
msgctxt "@option:check"
|
||||||
msgid "Enable Skirt Adhesion"
|
msgid "Enable Skirt Adhesion"
|
||||||
msgstr ""
|
msgstr "Ota helman tarttuvuus käyttöön"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:187
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:187
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@option:check"
|
msgctxt "@option:check"
|
||||||
msgid "Enable Support"
|
msgid "Enable Support"
|
||||||
msgstr "Ota tuki käyttöön"
|
msgstr "Ota tuki käyttöön"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Sidebar.qml:123
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Sidebar.qml:123
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@title:tab"
|
msgctxt "@title:tab"
|
||||||
msgid "Simple"
|
msgid "Simple"
|
||||||
msgstr "Perusasetukset"
|
msgstr "Suppea"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Sidebar.qml:124
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Sidebar.qml:124
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@title:tab"
|
msgctxt "@title:tab"
|
||||||
msgid "Advanced"
|
msgid "Advanced"
|
||||||
msgstr "Lisäasetukset"
|
msgstr "Laajennettu"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarHeader.qml:30
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarHeader.qml:30
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@label:listbox"
|
msgctxt "@label:listbox"
|
||||||
msgid "Print Setup"
|
msgid "Print Setup"
|
||||||
msgstr "Tulostimen asennus"
|
msgstr "Tulostusasetukset"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarHeader.qml:100
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarHeader.qml:100
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -980,18 +983,17 @@ msgstr "&Tiedosto"
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:43
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:43
|
||||||
msgctxt "@title:menu"
|
msgctxt "@title:menu"
|
||||||
msgid "Open &Recent"
|
msgid "Open &Recent"
|
||||||
msgstr ""
|
msgstr "Avaa &viimeisin"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:72
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:72
|
||||||
msgctxt "@action:inmenu"
|
msgctxt "@action:inmenu"
|
||||||
msgid "&Save Selection to File"
|
msgid "&Save Selection to File"
|
||||||
msgstr ""
|
msgstr "&Tallenna valinta tiedostoon"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:80
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:80
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@title:menu"
|
msgctxt "@title:menu"
|
||||||
msgid "Save &All"
|
msgid "Save &All"
|
||||||
msgstr "Tallenna tiedosto"
|
msgstr "Tallenna &kaikki"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:108
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:108
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -1000,10 +1002,9 @@ msgid "&Edit"
|
||||||
msgstr "&Muokkaa"
|
msgstr "&Muokkaa"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:125
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:125
|
||||||
#, fuzzy
|
|
||||||
msgctxt "@title:menu"
|
msgctxt "@title:menu"
|
||||||
msgid "&View"
|
msgid "&View"
|
||||||
msgstr "Näytä"
|
msgstr "&Näytä"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:151
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:151
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -1014,7 +1015,7 @@ msgstr "&Laite"
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:197
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:197
|
||||||
msgctxt "@title:menu"
|
msgctxt "@title:menu"
|
||||||
msgid "&Profile"
|
msgid "&Profile"
|
||||||
msgstr ""
|
msgstr "&Profiili"
|
||||||
|
|
||||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:224
|
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:224
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
|
1771
resources/i18n/fi/fdmprinter.json.po
Normal file → Executable file
Before Width: | Height: | Size: 9.9 KiB After Width: | Height: | Size: 20 KiB |
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
"inherits": "fdmprinter.json",
|
"inherits": "fdmprinter.json",
|
||||||
|
|
||||||
"machine_settings": {
|
"overrides": {
|
||||||
|
|
||||||
"machine_width": { "default": 254 },
|
"machine_width": { "default": 254 },
|
||||||
"machine_depth": { "default": 254 },
|
"machine_depth": { "default": 254 },
|
||||||
|
@ -28,14 +28,12 @@
|
||||||
"machine_gcode_flavor": { "default": "RepRap (Marlin/Sprinter)" },
|
"machine_gcode_flavor": { "default": "RepRap (Marlin/Sprinter)" },
|
||||||
|
|
||||||
"machine_start_gcode": {
|
"machine_start_gcode": {
|
||||||
"default": ";Sliced at: {day} {date} {time}\n;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {infill_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": ";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..."
|
||||||
},
|
},
|
||||||
"machine_end_gcode": {
|
"machine_end_gcode": {
|
||||||
"default": ";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": ";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}"
|
||||||
}
|
},
|
||||||
},
|
|
||||||
|
|
||||||
"overrides": {
|
|
||||||
"layer_height": { "default": 0.2 },
|
"layer_height": { "default": 0.2 },
|
||||||
"shell_thickness": { "default": 0.8 },
|
"shell_thickness": { "default": 0.8 },
|
||||||
"wall_thickness": { "default": 0.8 },
|
"wall_thickness": { "default": 0.8 },
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
"inherits": "fdmprinter.json",
|
"inherits": "fdmprinter.json",
|
||||||
|
|
||||||
"machine_settings": {
|
"overrides": {
|
||||||
|
|
||||||
"machine_width": { "default": 400 },
|
"machine_width": { "default": 400 },
|
||||||
"machine_depth": { "default": 300 },
|
"machine_depth": { "default": 300 },
|
||||||
|
@ -26,14 +26,12 @@
|
||||||
"machine_gcode_flavor": { "default": "RepRap (Marlin/Sprinter)" },
|
"machine_gcode_flavor": { "default": "RepRap (Marlin/Sprinter)" },
|
||||||
|
|
||||||
"machine_start_gcode": {
|
"machine_start_gcode": {
|
||||||
"default": ";Sliced at: {day} {date} {time}\n;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {infill_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": ";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..."
|
||||||
},
|
},
|
||||||
"machine_end_gcode": {
|
"machine_end_gcode": {
|
||||||
"default": ";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": ";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}"
|
||||||
}
|
},
|
||||||
},
|
|
||||||
|
|
||||||
"overrides": {
|
|
||||||
"layer_height": { "default": 0.2 },
|
"layer_height": { "default": 0.2 },
|
||||||
"shell_thickness": { "default": 0.8},
|
"shell_thickness": { "default": 0.8},
|
||||||
"wall_thickness": { "default": 0.8 },
|
"wall_thickness": { "default": 0.8 },
|
||||||
|
|
|
@ -4,10 +4,10 @@
|
||||||
"name": "BQ Prusa i3 Hephestos",
|
"name": "BQ Prusa i3 Hephestos",
|
||||||
"manufacturer": "Other",
|
"manufacturer": "Other",
|
||||||
"author": "BQ",
|
"author": "BQ",
|
||||||
"platform": "hephestos_platform.stl",
|
"platform": "bq_hephestos_platform.stl",
|
||||||
"inherits": "fdmprinter.json",
|
"inherits": "fdmprinter.json",
|
||||||
|
|
||||||
"machine_settings": {
|
"overrides": {
|
||||||
"machine_start_gcode": {
|
"machine_start_gcode": {
|
||||||
"default": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --"
|
"default": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --"
|
||||||
},
|
},
|
||||||
|
@ -33,10 +33,8 @@
|
||||||
"default": "RepRap"
|
"default": "RepRap"
|
||||||
},
|
},
|
||||||
"machine_platform_offset": {
|
"machine_platform_offset": {
|
||||||
"default": [0, 100, 0]
|
"default": [0, -82, 0]
|
||||||
}
|
},
|
||||||
},
|
|
||||||
"overrides": {
|
|
||||||
"layer_height": { "default": 0.2 },
|
"layer_height": { "default": 0.2 },
|
||||||
"layer_height_0": { "default": 0.2, "visible": false },
|
"layer_height_0": { "default": 0.2, "visible": false },
|
||||||
"shell_thickness": { "default": 1.0 },
|
"shell_thickness": { "default": 1.0 },
|
||||||
|
|
|
@ -4,10 +4,10 @@
|
||||||
"name": "BQ Hephestos 2",
|
"name": "BQ Hephestos 2",
|
||||||
"manufacturer": "Other",
|
"manufacturer": "Other",
|
||||||
"author": "BQ",
|
"author": "BQ",
|
||||||
"platform": "bq_hephestos_2.stl",
|
"platform": "bq_hephestos_2_platform.stl",
|
||||||
"inherits": "fdmprinter.json",
|
"inherits": "fdmprinter.json",
|
||||||
|
|
||||||
"machine_settings": {
|
"overrides": {
|
||||||
"machine_start_gcode": {
|
"machine_start_gcode": {
|
||||||
"default": "; -- START GCODE --\nM800 ; Custom GCODE to fire start print procedure\n; -- end of START GCODE --"
|
"default": "; -- START GCODE --\nM800 ; Custom GCODE to fire start print procedure\n; -- end of START GCODE --"
|
||||||
},
|
},
|
||||||
|
@ -35,37 +35,31 @@
|
||||||
"machine_platform_offset": {
|
"machine_platform_offset": {
|
||||||
"default": [-6, 1320, 0]
|
"default": [-6, 1320, 0]
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"overrides": {
|
|
||||||
"bottom_thickness": { "default": 1.2, "visible": true },
|
|
||||||
"cool_fan_full_at_height": { "default": 0.8, "visible": false },
|
|
||||||
"speed_wall_0": { "default": 30.0, "visible": false },
|
|
||||||
"material_diameter": { "default": 1.75 },
|
|
||||||
"layer_height_0": { "default": 0.2, "visible": true },
|
|
||||||
"speed_layer_0": { "default": 35.0, "visible": true },
|
|
||||||
"infill_overlap": { "default": 15.0, "visible": false },
|
|
||||||
"layer_height": { "default": 0.2 },
|
|
||||||
"cool_min_speed": { "default": 20.0, "visible": false },
|
|
||||||
"speed_wall_x": { "default": 35.0, "visible": false },
|
|
||||||
"wall_line_count": { "default": 3, "visible": false },
|
|
||||||
"retraction_amount": { "default": 4.0, "visible": false },
|
|
||||||
"retract_hop": { "default": 0.075, "visible": false },
|
|
||||||
"retraction_speed": { "default": 45.0, "visible": false },
|
|
||||||
"skirt_gap": { "default": 7.0 },
|
|
||||||
"skirt_line_count": { "default": 4 },
|
|
||||||
"speed_infill": { "default": 60.0, "visible": true },
|
|
||||||
"material_print_temperature": { "default": 210.0, "visible": true },
|
"material_print_temperature": { "default": 210.0, "visible": true },
|
||||||
"speed_topbottom": { "default": 35.0, "visible": false },
|
"material_bed_temperature": { "default": 0 },
|
||||||
"top_thickness": { "default": 1.2, "visible": false },
|
"material_diameter": { "default": 1.75 },
|
||||||
"top_layers": { "default": 6, "visible": false },
|
"layer_height": { "default": 0.2 },
|
||||||
"speed_travel": { "default": 150.0 },
|
"layer_height_0": { "default": 0.2, "visible": true },
|
||||||
"shell_thickness": { "default": 1.2 },
|
"shell_thickness": { "default": 1.2 },
|
||||||
|
"wall_line_count": { "default": 3, "visible": false },
|
||||||
"wall_thickness": { "default": 1.2, "visible": false },
|
"wall_thickness": { "default": 1.2, "visible": false },
|
||||||
"top_bottom_thickness": { "default": 1.2, "visible": false },
|
"top_bottom_thickness": { "default": 1.2, "visible": false },
|
||||||
"material_bed_temperature": { "default": 0 },
|
"infill_sparse_density": { "default": 20.0 },
|
||||||
"support_enable": { "default": false },
|
"infill_overlap": { "default": 15.0, "visible": false },
|
||||||
"speed_print": { "default": 50.0 },
|
"speed_print": { "default": 60.0 },
|
||||||
|
"speed_travel": { "default": 160.0 },
|
||||||
|
"speed_layer_0": { "default": 30.0, "visible": true },
|
||||||
|
"speed_wall_x": { "default": 35.0, "visible": false },
|
||||||
|
"speed_wall_0": { "default": 30.0, "visible": false },
|
||||||
|
"speed_infill": { "default": 80.0, "visible": true },
|
||||||
|
"speed_topbottom": { "default": 35.0, "visible": false },
|
||||||
"skirt_speed": { "default": 35.0, "visible": false },
|
"skirt_speed": { "default": 35.0, "visible": false },
|
||||||
"skirt_minimal_length": { "default": 30.0, "visible": false }
|
"retraction_amount": { "default": 2.0, "visible": false },
|
||||||
|
"retraction_speed": { "default": 45.0, "visible": false },
|
||||||
|
"skirt_line_count": { "default": 4 },
|
||||||
|
"skirt_minimal_length": { "default": 30.0, "visible": false },
|
||||||
|
"skirt_gap": { "default": 6.0 },
|
||||||
|
"cool_fan_full_at_height": { "default": 0.4, "visible": false },
|
||||||
|
"support_enable": { "default": false }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,10 +4,10 @@
|
||||||
"name": "BQ Prusa i3 Hephestos XL",
|
"name": "BQ Prusa i3 Hephestos XL",
|
||||||
"manufacturer": "Other",
|
"manufacturer": "Other",
|
||||||
"author": "BQ",
|
"author": "BQ",
|
||||||
"platform": "hephestos_platform.stl",
|
"platform": "bq_hephestos_platform.stl",
|
||||||
"inherits": "fdmprinter.json",
|
"inherits": "fdmprinter.json",
|
||||||
|
|
||||||
"machine_settings": {
|
"overrides": {
|
||||||
"machine_start_gcode": {
|
"machine_start_gcode": {
|
||||||
"default": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --"
|
"default": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --"
|
||||||
},
|
},
|
||||||
|
@ -33,10 +33,8 @@
|
||||||
"default": "RepRap"
|
"default": "RepRap"
|
||||||
},
|
},
|
||||||
"machine_platform_offset": {
|
"machine_platform_offset": {
|
||||||
"default": [0, 100, 0]
|
"default": [0, -82, 0]
|
||||||
}
|
},
|
||||||
},
|
|
||||||
"overrides": {
|
|
||||||
"layer_height": { "default": 0.2 },
|
"layer_height": { "default": 0.2 },
|
||||||
"layer_height_0": { "default": 0.2, "visible": false },
|
"layer_height_0": { "default": 0.2, "visible": false },
|
||||||
"shell_thickness": { "default": 1.0 },
|
"shell_thickness": { "default": 1.0 },
|
||||||
|
|
|
@ -4,10 +4,10 @@
|
||||||
"name": "BQ Witbox",
|
"name": "BQ Witbox",
|
||||||
"manufacturer": "Other",
|
"manufacturer": "Other",
|
||||||
"author": "BQ",
|
"author": "BQ",
|
||||||
"platform": "witbox_platform.stl",
|
"platform": "bq_witbox_platform.stl",
|
||||||
"inherits": "fdmprinter.json",
|
"inherits": "fdmprinter.json",
|
||||||
|
|
||||||
"machine_settings": {
|
"overrides": {
|
||||||
"machine_start_gcode": {
|
"machine_start_gcode": {
|
||||||
"default": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --"
|
"default": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --"
|
||||||
},
|
},
|
||||||
|
@ -34,9 +34,7 @@
|
||||||
},
|
},
|
||||||
"machine_platform_offset": {
|
"machine_platform_offset": {
|
||||||
"default": [0, -145, -38]
|
"default": [0, -145, -38]
|
||||||
}
|
},
|
||||||
},
|
|
||||||
"overrides": {
|
|
||||||
"layer_height": { "default": 0.2 },
|
"layer_height": { "default": 0.2 },
|
||||||
"layer_height_0": { "default": 0.2, "visible": false },
|
"layer_height_0": { "default": 0.2, "visible": false },
|
||||||
"shell_thickness": { "default": 1.0 },
|
"shell_thickness": { "default": 1.0 },
|
||||||
|
|
|
@ -4,10 +4,10 @@
|
||||||
"name": "BQ Witbox 2",
|
"name": "BQ Witbox 2",
|
||||||
"manufacturer": "Other",
|
"manufacturer": "Other",
|
||||||
"author": "BQ",
|
"author": "BQ",
|
||||||
"platform": "witbox_platform.stl",
|
"platform": "bq_witbox_platform.stl",
|
||||||
"inherits": "fdmprinter.json",
|
"inherits": "fdmprinter.json",
|
||||||
|
|
||||||
"machine_settings": {
|
"overrides": {
|
||||||
"machine_start_gcode": {
|
"machine_start_gcode": {
|
||||||
"default": "; -- START GCODE --\nM800 ; Custom GCODE to fire start print procedure\n; -- end of START GCODE --"
|
"default": "; -- START GCODE --\nM800 ; Custom GCODE to fire start print procedure\n; -- end of START GCODE --"
|
||||||
},
|
},
|
||||||
|
@ -34,38 +34,32 @@
|
||||||
},
|
},
|
||||||
"machine_platform_offset": {
|
"machine_platform_offset": {
|
||||||
"default": [0, -145, -38]
|
"default": [0, -145, -38]
|
||||||
}
|
},
|
||||||
},
|
|
||||||
"overrides": {
|
|
||||||
"bottom_thickness": { "default": 1.2, "visible": true },
|
|
||||||
"cool_fan_full_at_height": { "default": 0.8, "visible": false },
|
|
||||||
"speed_wall_0": { "default": 30.0, "visible": false },
|
|
||||||
"material_diameter": { "default": 1.75 },
|
|
||||||
"layer_height_0": { "default": 0.2, "visible": true },
|
|
||||||
"speed_layer_0": { "default": 35.0, "visible": true },
|
|
||||||
"infill_overlap": { "default": 15.0, "visible": false },
|
|
||||||
"layer_height": { "default": 0.2 },
|
|
||||||
"cool_min_speed": { "default": 20.0, "visible": false },
|
|
||||||
"speed_wall_x": { "default": 35.0, "visible": false },
|
|
||||||
"wall_line_count": { "default": 3, "visible": false },
|
|
||||||
"retraction_amount": { "default": 4.0, "visible": false },
|
|
||||||
"retract_hop": { "default": 0.075, "visible": false },
|
|
||||||
"retraction_speed": { "default": 45.0, "visible": false },
|
|
||||||
"skirt_gap": { "default": 7.0 },
|
|
||||||
"skirt_line_count": { "default": 4 },
|
|
||||||
"speed_infill": { "default": 60.0, "visible": true },
|
|
||||||
"material_print_temperature": { "default": 210.0, "visible": true },
|
"material_print_temperature": { "default": 210.0, "visible": true },
|
||||||
"speed_topbottom": { "default": 35.0, "visible": false },
|
"material_bed_temperature": { "default": 0 },
|
||||||
"top_thickness": { "default": 1.2, "visible": false },
|
"material_diameter": { "default": 1.75 },
|
||||||
"top_layers": { "default": 6, "visible": false },
|
"layer_height": { "default": 0.2 },
|
||||||
"speed_travel": { "default": 150.0 },
|
"layer_height_0": { "default": 0.2, "visible": true },
|
||||||
"shell_thickness": { "default": 1.2 },
|
"shell_thickness": { "default": 1.2 },
|
||||||
|
"wall_line_count": { "default": 3, "visible": false },
|
||||||
"wall_thickness": { "default": 1.2, "visible": false },
|
"wall_thickness": { "default": 1.2, "visible": false },
|
||||||
"top_bottom_thickness": { "default": 1.2, "visible": false },
|
"top_bottom_thickness": { "default": 1.2, "visible": false },
|
||||||
"material_bed_temperature": { "default": 0 },
|
"infill_sparse_density": { "default": 20.0 },
|
||||||
"support_enable": { "default": false },
|
"infill_overlap": { "default": 15.0, "visible": false },
|
||||||
"speed_print": { "default": 50.0 },
|
"speed_print": { "default": 60.0 },
|
||||||
|
"speed_travel": { "default": 160.0 },
|
||||||
|
"speed_layer_0": { "default": 30.0, "visible": true },
|
||||||
|
"speed_wall_x": { "default": 35.0, "visible": false },
|
||||||
|
"speed_wall_0": { "default": 30.0, "visible": false },
|
||||||
|
"speed_infill": { "default": 80.0, "visible": true },
|
||||||
|
"speed_topbottom": { "default": 35.0, "visible": false },
|
||||||
"skirt_speed": { "default": 35.0, "visible": false },
|
"skirt_speed": { "default": 35.0, "visible": false },
|
||||||
"skirt_minimal_length": { "default": 30.0, "visible": false }
|
"retraction_amount": { "default": 2.0, "visible": false },
|
||||||
|
"retraction_speed": { "default": 45.0, "visible": false },
|
||||||
|
"skirt_line_count": { "default": 4 },
|
||||||
|
"skirt_minimal_length": { "default": 30.0, "visible": false },
|
||||||
|
"skirt_gap": { "default": 6.0 },
|
||||||
|
"cool_fan_full_at_height": { "default": 0.4, "visible": false },
|
||||||
|
"support_enable": { "default": false }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,18 @@
|
||||||
|
|
||||||
"visible": false,
|
"visible": false,
|
||||||
|
|
||||||
|
|
||||||
|
"machine_extruder_trains": {
|
||||||
|
"0": {
|
||||||
|
"extruder_nr": { "default": 0 },
|
||||||
|
"machine_nozzle_offset_x": { "default": 0.0 },
|
||||||
|
"machine_nozzle_offset_y": { "default": 0.0 }
|
||||||
|
},
|
||||||
|
"1": {
|
||||||
|
"extruder_nr": { "default": 1 }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
"machine_settings": {
|
"machine_settings": {
|
||||||
"machine_use_extruder_offset_to_offset_coords": { "default": false },
|
"machine_use_extruder_offset_to_offset_coords": { "default": false },
|
||||||
|
|
||||||
|
@ -31,7 +43,7 @@
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"min_value": "0.1",
|
"min_value": "0.1",
|
||||||
"max_value_warning": "150",
|
"max_value_warning": "150",
|
||||||
"default": 50,
|
"default": 60,
|
||||||
"visible": false,
|
"visible": false,
|
||||||
"enabled": "prime_tower_enable"
|
"enabled": "prime_tower_enable"
|
||||||
}
|
}
|
||||||
|
@ -86,17 +98,25 @@
|
||||||
"min_value": "0",
|
"min_value": "0",
|
||||||
"max_value": "16",
|
"max_value": "16",
|
||||||
"children": {
|
"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": "int",
|
||||||
|
"default": 0,
|
||||||
|
"min_value": "0",
|
||||||
|
"max_value": "16"
|
||||||
|
},
|
||||||
"support_extruder_nr_layer_0": {
|
"support_extruder_nr_layer_0": {
|
||||||
"label": "First Layer Support Extruder",
|
"label": "First Layer Support Extruder",
|
||||||
"description": "The extruder train to use for printing the first layer of support. This is used in multi-extrusion.",
|
"description": "The extruder train to use for printing the first layer of support infill. This is used in multi-extrusion.",
|
||||||
"type": "int",
|
"type": "int",
|
||||||
"default": 0,
|
"default": 0,
|
||||||
"min_value": "0",
|
"min_value": "0",
|
||||||
"max_value": "16"
|
"max_value": "16"
|
||||||
},
|
},
|
||||||
"support_roof_extruder_nr": {
|
"support_roof_extruder_nr": {
|
||||||
"label": "Hammock Extruder",
|
"label": "Support Roof Extruder",
|
||||||
"description": "The extruder train to use for printing the hammock. This is used in multi-extrusion.",
|
"description": "The extruder train to use for printing the roof of the support. This is used in multi-extrusion.",
|
||||||
"type": "int",
|
"type": "int",
|
||||||
"default": 0,
|
"default": 0,
|
||||||
"min_value": "0",
|
"min_value": "0",
|
||||||
|
@ -111,6 +131,7 @@
|
||||||
"label": "Enable Prime Tower",
|
"label": "Enable Prime Tower",
|
||||||
"description": "Print a tower next to the print which serves to prime the material after each nozzle switch.",
|
"description": "Print a tower next to the print which serves to prime the material after each nozzle switch.",
|
||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
|
"visible": true,
|
||||||
"default": false
|
"default": false
|
||||||
},
|
},
|
||||||
"prime_tower_size": {
|
"prime_tower_size": {
|
||||||
|
@ -122,7 +143,7 @@
|
||||||
"default": 15,
|
"default": 15,
|
||||||
"min_value": "0",
|
"min_value": "0",
|
||||||
"max_value_warning": "20",
|
"max_value_warning": "20",
|
||||||
"inherit_function": "0 if prime_tower_enable else 15",
|
"inherit_function": "15 if prime_tower_enable else 0",
|
||||||
"enabled": "prime_tower_enable"
|
"enabled": "prime_tower_enable"
|
||||||
},
|
},
|
||||||
"prime_tower_position_x": {
|
"prime_tower_position_x": {
|
||||||
|
@ -162,6 +183,16 @@
|
||||||
"default": false,
|
"default": false,
|
||||||
"enabled": "prime_tower_enable"
|
"enabled": "prime_tower_enable"
|
||||||
},
|
},
|
||||||
|
"multiple_mesh_overlap": {
|
||||||
|
"label": "Dual Extrusion Overlap",
|
||||||
|
"description": "Make the objects printed with different extruder trains overlap a bit. This makes the different materials bond together better.",
|
||||||
|
"visible": false,
|
||||||
|
"type": "float",
|
||||||
|
"unit": "mm",
|
||||||
|
"default": 0.15,
|
||||||
|
"min_value": "0",
|
||||||
|
"max_value_warning": "1.0"
|
||||||
|
},
|
||||||
"ooze_shield_enabled": {
|
"ooze_shield_enabled": {
|
||||||
"label": "Enable Ooze Shield",
|
"label": "Enable Ooze Shield",
|
||||||
"description": "Enable exterior ooze shield. This will create a shell around the object which is likely to wipe a second nozzle if it's at the same height as the first nozzle.",
|
"description": "Enable exterior ooze shield. This will create a shell around the object which is likely to wipe a second nozzle if it's at the same height as the first nozzle.",
|
||||||
|
|
|
@ -9,45 +9,90 @@
|
||||||
"add_pages": [],
|
"add_pages": [],
|
||||||
|
|
||||||
"machine_settings": {
|
"machine_settings": {
|
||||||
|
"machine_show_variants": {
|
||||||
|
"description": "Wether to show the different variants of this machine, which are described in separate json files.",
|
||||||
|
"default": false
|
||||||
|
},
|
||||||
"machine_start_gcode": {
|
"machine_start_gcode": {
|
||||||
|
"description": "Gcode commands to be executed at the very start - separated by \\n.",
|
||||||
"default": "G28 ; Home\nG1 Z15.0 F6000 ;move the platform down 15mm\n;Prime the extruder\nG92 E0\nG1 F200 E3\nG92 E0"
|
"default": "G28 ; Home\nG1 Z15.0 F6000 ;move the platform down 15mm\n;Prime the extruder\nG92 E0\nG1 F200 E3\nG92 E0"
|
||||||
},
|
},
|
||||||
"machine_end_gcode": {
|
"machine_end_gcode": {
|
||||||
|
"description": "Gcode commands to be executed at the very end - separated by \\n.",
|
||||||
"default": "M104 S0\nM140 S0\n;Retract the filament\nG92 E1\nG1 E-1 F300\nG28 X0 Y0\nM84"
|
"default": "M104 S0\nM140 S0\n;Retract the filament\nG92 E1\nG1 E-1 F300\nG28 X0 Y0\nM84"
|
||||||
},
|
},
|
||||||
|
"material_bed_temp_wait": {
|
||||||
|
"description": "Whether to insert a command to wait until the bed temperature is reached at the start.",
|
||||||
|
"default": true
|
||||||
|
},
|
||||||
|
"material_print_temp_wait": {
|
||||||
|
"description": "Whether to insert a command to wait until the nozzle temperatures are reached at the start.",
|
||||||
|
"default": true
|
||||||
|
},
|
||||||
|
"material_print_temp_prepend": {
|
||||||
|
"description": "Whether to include nozzle temperature commands at the start of the gcode. When the start_gcode already contains nozzle temperature commands Cura frontend will automatically disable this setting.",
|
||||||
|
"default": true
|
||||||
|
},
|
||||||
|
"material_bed_temp_prepend": {
|
||||||
|
"description": "Whether to include bed temperature commands at the start of the gcode. When the start_gcode already contains bed temperature commands Cura frontend will automatically disable this setting.",
|
||||||
|
"default": true
|
||||||
|
},
|
||||||
"machine_width": {
|
"machine_width": {
|
||||||
|
"description": "The width (X-direction) of the printable area.",
|
||||||
"default": 100
|
"default": 100
|
||||||
},
|
},
|
||||||
"machine_depth": {
|
"machine_depth": {
|
||||||
|
"description": "The depth (Y-direction) of the printable area.",
|
||||||
"default": 100
|
"default": 100
|
||||||
},
|
},
|
||||||
"machine_height": {
|
"machine_height": {
|
||||||
|
"description": "The height (Z-direction) of the printable area.",
|
||||||
"default": 100
|
"default": 100
|
||||||
},
|
},
|
||||||
"machine_heated_bed": {
|
"machine_heated_bed": {
|
||||||
|
"description": "Whether the machine has a heated bed present.",
|
||||||
"default": false
|
"default": false
|
||||||
},
|
},
|
||||||
"machine_center_is_zero": {
|
"machine_center_is_zero": {
|
||||||
|
"description": "Whether the X/Y coordinates of the zero position of the printer is at the center of the printable area.",
|
||||||
"default": false
|
"default": false
|
||||||
},
|
},
|
||||||
"machine_extruder_count": {
|
"machine_extruder_count": {
|
||||||
|
"description": "Number of extruder trains. An extruder train is the combination of a feeder, bowden tube, and nozzle.",
|
||||||
"default": 1
|
"default": 1
|
||||||
},
|
},
|
||||||
"machine_nozzle_size": { "default": 0.4, "SEE_machine_extruder_trains": true },
|
"machine_nozzle_size": {
|
||||||
"machine_nozzle_tip_outer_diameter": { "default": 1, "SEE_machine_extruder_trains": true },
|
"description": "The inner diameter of the hole in the nozzle.",
|
||||||
"machine_nozzle_head_distance": { "default": 3, "SEE_machine_extruder_trains": true },
|
"default": 0.4, "SEE_machine_extruder_trains": true },
|
||||||
"machine_nozzle_expansion_angle": { "default": 45, "SEE_machine_extruder_trains": true },
|
"machine_nozzle_tip_outer_diameter": {
|
||||||
"machine_heat_zone_length": { "default": 16, "SEE_machine_extruder_trains": true },
|
"description": "The outer diameter of the tip of the nozzle.",
|
||||||
"machine_nozzle_heat_up_speed": { "default": 2.0, "SEE_machine_extruder_trains": true },
|
"default": 1, "SEE_machine_extruder_trains": true },
|
||||||
"machine_nozzle_cool_down_speed": { "default": 2.0, "SEE_machine_extruder_trains": true },
|
"machine_nozzle_head_distance": {
|
||||||
|
"description": "The height difference between the tip of the nozzle and the lowest part of the print head.",
|
||||||
|
"default": 3, "SEE_machine_extruder_trains": true },
|
||||||
|
"machine_nozzle_expansion_angle": {
|
||||||
|
"description": "The angle between the horizontal plane and the conical part right above the tip of the nozzle.",
|
||||||
|
"default": 45, "SEE_machine_extruder_trains": true },
|
||||||
|
"machine_heat_zone_length": {
|
||||||
|
"description": "The distance from the tip of the nozzle in which heat from the nozzle is transfered to the filament.",
|
||||||
|
"default": 16, "SEE_machine_extruder_trains": true },
|
||||||
|
"machine_nozzle_heat_up_speed": {
|
||||||
|
"description": "The speed (°C/s) by which the nozzle heats up averaged over the window of normal printing temperatures and the standby temperature.",
|
||||||
|
"default": 2.0, "SEE_machine_extruder_trains": true },
|
||||||
|
"machine_nozzle_cool_down_speed": {
|
||||||
|
"description": "The speed (°C/s) by which the nozzle cools down averaged over the window of normal printing temperatures and the standby temperature.",
|
||||||
|
"default": 2.0, "SEE_machine_extruder_trains": true },
|
||||||
"machine_gcode_flavor": {
|
"machine_gcode_flavor": {
|
||||||
|
"description": "The type of gcode to be generated.",
|
||||||
"default": "RepRap"
|
"default": "RepRap"
|
||||||
},
|
},
|
||||||
"machine_disallowed_areas": {
|
"machine_disallowed_areas": {
|
||||||
|
"description": "A list of polygons with areas the print head is not allowed to enter.",
|
||||||
"type": "polygons",
|
"type": "polygons",
|
||||||
"default": []
|
"default": []
|
||||||
},
|
},
|
||||||
"machine_platform_offset": {
|
"machine_platform_offset": {
|
||||||
|
"description": "Where to display the platform mesh.",
|
||||||
"default": [
|
"default": [
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
@ -55,6 +100,7 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"machine_head_polygon": {
|
"machine_head_polygon": {
|
||||||
|
"description": "A 2D silhouette of the print head (fan caps excluded).",
|
||||||
"type": "polygon",
|
"type": "polygon",
|
||||||
"default": [
|
"default": [
|
||||||
[
|
[
|
||||||
|
@ -75,8 +121,8 @@
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"machine_head_with_fans_polygon":
|
"machine_head_with_fans_polygon": {
|
||||||
{
|
"description": "A 2D silhouette of the print head (fan caps included).",
|
||||||
"type": "polygon",
|
"type": "polygon",
|
||||||
"default": [
|
"default": [
|
||||||
[
|
[
|
||||||
|
@ -97,8 +143,8 @@
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"gantry_height":
|
"gantry_height": {
|
||||||
{
|
"description": "The height difference between the tip of the nozzle and the gantry system (X and Y axes).",
|
||||||
"default":99999999999
|
"default":99999999999
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -114,9 +160,10 @@
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 0.1,
|
"default": 0.1,
|
||||||
"min_value": "0.0001",
|
"min_value": "0.001",
|
||||||
"min_value_warning": "0.04",
|
"min_value_warning": "0.04",
|
||||||
"max_value_warning": "0.32"
|
"max_value_warning": "0.32",
|
||||||
|
"global_only": "print_sequence != \"one_at_a_time\""
|
||||||
},
|
},
|
||||||
"layer_height_0": {
|
"layer_height_0": {
|
||||||
"label": "Initial Layer Height",
|
"label": "Initial Layer Height",
|
||||||
|
@ -124,14 +171,14 @@
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 0.3,
|
"default": 0.3,
|
||||||
"min_value": "0.0001",
|
"min_value": "0.001",
|
||||||
"min_value_warning": "0.04",
|
"min_value_warning": "0.04",
|
||||||
"max_value_warning": "0.32",
|
"max_value_warning": "0.32",
|
||||||
"visible": false
|
"visible": false
|
||||||
},
|
},
|
||||||
"line_width": {
|
"line_width": {
|
||||||
"label": "Line Width",
|
"label": "Nozzle Diameter",
|
||||||
"description": "Width of a single line. Each line will be printed with this width in mind. Generally the width of each line should correspond to the width of your nozzle, but for the outer wall and top/bottom surface smaller line widths may be chosen, for higher quality.",
|
"description": "The inner diameter of your printer's nozzle. Each line will be printed with this width in mind. The outer wall and top/bottom surface line widths may be set to a smaller value for higher surface quality. This field was previously named Line Width.",
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"min_value": "0.0001",
|
"min_value": "0.0001",
|
||||||
"min_value_warning": "0.2",
|
"min_value_warning": "0.2",
|
||||||
|
@ -143,7 +190,7 @@
|
||||||
"children": {
|
"children": {
|
||||||
"wall_line_width": {
|
"wall_line_width": {
|
||||||
"label": "Wall Line Width",
|
"label": "Wall Line Width",
|
||||||
"description": "Width of a single shell line. Each line of the shell will be printed with this width in mind.",
|
"description": "Width of a single shell line. This value will be used instead of Nozzle Diameter when printing shell lines.",
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"min_value": "0.0001",
|
"min_value": "0.0001",
|
||||||
"min_value_warning": "0.2",
|
"min_value_warning": "0.2",
|
||||||
|
@ -154,7 +201,7 @@
|
||||||
"children": {
|
"children": {
|
||||||
"wall_line_width_0": {
|
"wall_line_width_0": {
|
||||||
"label": "Outer Wall Line Width",
|
"label": "Outer Wall Line Width",
|
||||||
"description": "Width of the outermost shell line. By printing a thinner outermost wall line you can print higher details with a larger nozzle.",
|
"description": "Width of the outermost shell line. By printing a thinner outermost wall line you can print higher details with a larger nozzle. This value will be used instead of Nozzle Diameter when printing outermost shell lines.",
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"min_value": "0.0001",
|
"min_value": "0.0001",
|
||||||
"min_value_warning": "0.2",
|
"min_value_warning": "0.2",
|
||||||
|
@ -165,7 +212,7 @@
|
||||||
},
|
},
|
||||||
"wall_line_width_x": {
|
"wall_line_width_x": {
|
||||||
"label": "Other Walls Line Width",
|
"label": "Other Walls Line Width",
|
||||||
"description": "Width of a single shell line for all shell lines except the outermost one.",
|
"description": "Width of a single shell line for all shell lines except the outermost one. This value will be used instead of Nozzle Diameter when printing all shell lines except the outermost one.",
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"min_value": "0.0001",
|
"min_value": "0.0001",
|
||||||
"min_value_warning": "0.2",
|
"min_value_warning": "0.2",
|
||||||
|
@ -178,7 +225,7 @@
|
||||||
},
|
},
|
||||||
"skirt_line_width": {
|
"skirt_line_width": {
|
||||||
"label": "Skirt line width",
|
"label": "Skirt line width",
|
||||||
"description": "Width of a single skirt line.",
|
"description": "Width of a single skirt line. This value will be used instead of Nozzle Diameter when printing skirts.",
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"min_value": "0.0001",
|
"min_value": "0.0001",
|
||||||
"min_value_warning": "0.2",
|
"min_value_warning": "0.2",
|
||||||
|
@ -189,7 +236,7 @@
|
||||||
},
|
},
|
||||||
"skin_line_width": {
|
"skin_line_width": {
|
||||||
"label": "Top/bottom line width",
|
"label": "Top/bottom line width",
|
||||||
"description": "Width of a single top/bottom printed line, used to fill up the top/bottom areas of a print.",
|
"description": "Width of a single top/bottom printed line, used to fill up the top/bottom areas of a print. This value will be used instead of Nozzle Diameter when printing top/bottom lines.",
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"min_value": "0.0001",
|
"min_value": "0.0001",
|
||||||
"min_value_warning": "0.2",
|
"min_value_warning": "0.2",
|
||||||
|
@ -200,7 +247,7 @@
|
||||||
},
|
},
|
||||||
"infill_line_width": {
|
"infill_line_width": {
|
||||||
"label": "Infill line width",
|
"label": "Infill line width",
|
||||||
"description": "Width of the inner infill printed lines.",
|
"description": "Width of the inner infill printed lines. This value will be used instead of Nozzle Diameter when infill lines.",
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"min_value": "0.0001",
|
"min_value": "0.0001",
|
||||||
"min_value_warning": "0.2",
|
"min_value_warning": "0.2",
|
||||||
|
@ -211,7 +258,7 @@
|
||||||
},
|
},
|
||||||
"support_line_width": {
|
"support_line_width": {
|
||||||
"label": "Support line width",
|
"label": "Support line width",
|
||||||
"description": "Width of the printed support structures lines.",
|
"description": "Width of the printed support structures lines. This value will be used instead of Nozzle Diameter when printing support structure lines.",
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"min_value": "0.0001",
|
"min_value": "0.0001",
|
||||||
"min_value_warning": "0.2",
|
"min_value_warning": "0.2",
|
||||||
|
@ -223,7 +270,7 @@
|
||||||
},
|
},
|
||||||
"support_roof_line_width": {
|
"support_roof_line_width": {
|
||||||
"label": "Support Roof line width",
|
"label": "Support Roof line width",
|
||||||
"description": "Width of a single support roof line, used to fill the top of the support.",
|
"description": "Width of a single support roof line, used to fill the top of the support. This value will be used instead of Nozzle Diameter when printing support roof lines.",
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"default": 0.4,
|
"default": 0.4,
|
||||||
"type": "float",
|
"type": "float",
|
||||||
|
@ -262,7 +309,7 @@
|
||||||
"children": {
|
"children": {
|
||||||
"wall_line_count": {
|
"wall_line_count": {
|
||||||
"label": "Wall Line Count",
|
"label": "Wall Line Count",
|
||||||
"description": "Number of shell lines. This these lines are called perimeter lines in other tools and impact the strength and structural integrity of your print.",
|
"description": "Number of shell lines. These lines are called perimeter lines in other tools and impact the strength and structural integrity of your print.",
|
||||||
"min_value": "0",
|
"min_value": "0",
|
||||||
"default": 2,
|
"default": 2,
|
||||||
"type": "int",
|
"type": "int",
|
||||||
|
@ -281,7 +328,7 @@
|
||||||
},
|
},
|
||||||
"top_bottom_thickness": {
|
"top_bottom_thickness": {
|
||||||
"label": "Bottom/Top Thickness",
|
"label": "Bottom/Top Thickness",
|
||||||
"description": "This controls the thickness of the bottom and top layers, the amount of solid layers put down is calculated by the layer thickness and this value. Having this value a multiple of the layer thickness makes sense. And keep it near your wall thickness to make an evenly strong part.",
|
"description": "This controls the thickness of the bottom and top layers. The number of solid layers put down is calculated from the layer thickness and this value. Having this value a multiple of the layer thickness makes sense. Keep it near your wall thickness to make an evenly strong part.",
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"default": 0.8,
|
"default": 0.8,
|
||||||
"min_value": "0",
|
"min_value": "0",
|
||||||
|
@ -292,7 +339,7 @@
|
||||||
"children": {
|
"children": {
|
||||||
"top_thickness": {
|
"top_thickness": {
|
||||||
"label": "Top Thickness",
|
"label": "Top Thickness",
|
||||||
"description": "This controls the thickness of the top layers. The number of solid layers printed is calculated from the layer thickness and this value. Having this value be a multiple of the layer thickness makes sense. And keep it nearto your wall thickness to make an evenly strong part.",
|
"description": "This controls the thickness of the top layers. The number of solid layers printed is calculated from the layer thickness and this value. Having this value be a multiple of the layer thickness makes sense. Keep it near your wall thickness to make an evenly strong part.",
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"min_value": "0",
|
"min_value": "0",
|
||||||
"default": 0.8,
|
"default": 0.8,
|
||||||
|
@ -301,7 +348,7 @@
|
||||||
"children": {
|
"children": {
|
||||||
"top_layers": {
|
"top_layers": {
|
||||||
"label": "Top Layers",
|
"label": "Top Layers",
|
||||||
"description": "This controls the amount of top layers.",
|
"description": "This controls the number of top layers.",
|
||||||
"min_value": "0",
|
"min_value": "0",
|
||||||
"default": 8,
|
"default": 8,
|
||||||
"type": "int",
|
"type": "int",
|
||||||
|
@ -381,7 +428,7 @@
|
||||||
},
|
},
|
||||||
"top_bottom_pattern": {
|
"top_bottom_pattern": {
|
||||||
"label": "Bottom/Top Pattern",
|
"label": "Bottom/Top Pattern",
|
||||||
"description": "Pattern of the top/bottom solid fill. This normally is done with lines to get the best possible finish, but in some cases a concentric fill gives a nicer end result.",
|
"description": "Pattern of the top/bottom solid fill. This is normally done with lines to get the best possible finish, but in some cases a concentric fill gives a nicer end result.",
|
||||||
"type": "enum",
|
"type": "enum",
|
||||||
"options": {
|
"options": {
|
||||||
"lines": "Lines",
|
"lines": "Lines",
|
||||||
|
@ -392,29 +439,29 @@
|
||||||
"visible": false
|
"visible": false
|
||||||
},
|
},
|
||||||
"skin_no_small_gaps_heuristic": {
|
"skin_no_small_gaps_heuristic": {
|
||||||
"label": "Ingore small Z gaps",
|
"label": "Ignore small Z gaps",
|
||||||
"description": "When the model has small vertical gaps about 5% extra computation time can be spent on generating top and bottom skin in these narrow spaces. In such a case set this setting to false.",
|
"description": "When the model has small vertical gaps, about 5% extra computation time can be spent on generating top and bottom skin in these narrow spaces. In such a case set this setting to false.",
|
||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"default": true,
|
"default": true,
|
||||||
"visible": false
|
"visible": false
|
||||||
},
|
},
|
||||||
"skin_alternate_rotation": {
|
"skin_alternate_rotation": {
|
||||||
"label": "Alternate Skin Rotation",
|
"label": "Alternate Skin Rotation",
|
||||||
"description": "Alternate between diagonal skin fill and horizontal + vertical skin fill. Although the diagonal directions can print quicker, this option can improve on the printing quality by reducing the pillowing effect.",
|
"description": "Alternate between diagonal skin fill and horizontal + vertical skin fill. Although the diagonal directions can print quicker, this option can improve the printing quality by reducing the pillowing effect.",
|
||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"default": false,
|
"default": false,
|
||||||
"visible": false
|
"visible": false
|
||||||
},
|
},
|
||||||
"skin_outline_count": {
|
"skin_outline_count": {
|
||||||
"label": "Skin Perimeter Line Count",
|
"label": "Extra Skin Wall Count",
|
||||||
"description": "Number of lines around skin regions. Using one or two skin perimeter lines can greatly improve on roofs which would start in the middle of infill cells.",
|
"description": "Number of lines around skin regions. Using one or two skin perimeter lines can greatly improve roofs which would start in the middle of infill cells.",
|
||||||
"default": 0,
|
"default": 0,
|
||||||
"type": "int",
|
"type": "int",
|
||||||
"visible": false
|
"visible": false
|
||||||
},
|
},
|
||||||
"xy_offset": {
|
"xy_offset": {
|
||||||
"label": "Horizontal expansion",
|
"label": "Horizontal expansion",
|
||||||
"description": "Amount of offset applied all polygons in each layer. Positive values can compensate for too big holes; negative values can compensate for too small holes.",
|
"description": "Amount of offset applied to all polygons in each layer. Positive values can compensate for too big holes; negative values can compensate for too small holes.",
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 0,
|
"default": 0,
|
||||||
|
@ -422,7 +469,7 @@
|
||||||
},
|
},
|
||||||
"z_seam_type": {
|
"z_seam_type": {
|
||||||
"label": "Z Seam Alignment",
|
"label": "Z Seam Alignment",
|
||||||
"description": "Starting point of each part in a layer. When parts in consecutive layers start at the same point a vertical seam may show on the print. When aligning these at the back, the seam is easiest to remove. When placed randomly the inaccuracies at the part start will be less noticable. When taking the shortest path the print will be more quick.",
|
"description": "Starting point of each path in a layer. When paths in consecutive layers start at the same point a vertical seam may show on the print. When aligning these at the back, the seam is easiest to remove. When placed randomly the inaccuracies at the paths' start will be less noticeable. When taking the shortest path the print will be quicker.",
|
||||||
"type": "enum",
|
"type": "enum",
|
||||||
"options": {
|
"options": {
|
||||||
"back": "Back",
|
"back": "Back",
|
||||||
|
@ -441,7 +488,7 @@
|
||||||
"settings": {
|
"settings": {
|
||||||
"infill_sparse_density": {
|
"infill_sparse_density": {
|
||||||
"label": "Infill Density",
|
"label": "Infill Density",
|
||||||
"description": "This controls how densely filled the insides of your print will be. For a solid part use 100%, for an hollow part use 0%. A value around 20% is usually enough. This won't affect the outside of the print and only adjusts how strong the part becomes.",
|
"description": "This controls how densely filled the insides of your print will be. For a solid part use 100%, for a hollow part use 0%. A value around 20% is usually enough. This setting won't affect the outside of the print and only adjusts how strong the part becomes.",
|
||||||
"unit": "%",
|
"unit": "%",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 20,
|
"default": 20,
|
||||||
|
@ -461,12 +508,13 @@
|
||||||
},
|
},
|
||||||
"infill_pattern": {
|
"infill_pattern": {
|
||||||
"label": "Infill Pattern",
|
"label": "Infill Pattern",
|
||||||
"description": "Cura defaults to switching between grid and line infill. But with this setting visible you can control this yourself. The line infill swaps direction on alternate layers of infill, while the grid prints the full cross-hatching on each layer of infill.",
|
"description": "Cura defaults to switching between grid and line infill, but with this setting visible you can control this yourself. The line infill swaps direction on alternate layers of infill, while the grid prints the full cross-hatching on each layer of infill.",
|
||||||
"type": "enum",
|
"type": "enum",
|
||||||
"visible": false,
|
"visible": false,
|
||||||
"options": {
|
"options": {
|
||||||
"grid": "Grid",
|
"grid": "Grid",
|
||||||
"lines": "Lines",
|
"lines": "Lines",
|
||||||
|
"triangles": "Triangles",
|
||||||
"concentric": "Concentric",
|
"concentric": "Concentric",
|
||||||
"zigzag": "Zig Zag"
|
"zigzag": "Zig Zag"
|
||||||
},
|
},
|
||||||
|
@ -486,7 +534,7 @@
|
||||||
},
|
},
|
||||||
"infill_wipe_dist": {
|
"infill_wipe_dist": {
|
||||||
"label": "Infill Wipe Distance",
|
"label": "Infill Wipe Distance",
|
||||||
"description": "Distance of a travel move inserted after every infill line, to make the infill stick to the walls better. This option is imilar to infill overlap, but without extrusion and only on one end of the infill line.",
|
"description": "Distance of a travel move inserted after every infill line, to make the infill stick to the walls better. This option is similar to infill overlap, but without extrusion and only on one end of the infill line.",
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 0.04,
|
"default": 0.04,
|
||||||
|
@ -517,9 +565,9 @@
|
||||||
"settings": {
|
"settings": {
|
||||||
"material_flow_dependent_temperature": {
|
"material_flow_dependent_temperature": {
|
||||||
"label": "Auto Temperature",
|
"label": "Auto Temperature",
|
||||||
"description": "Change the temperature each layer automatically with the average flow speed of that layer.",
|
"description": "Change the temperature for each layer automatically with the average flow speed of that layer.",
|
||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"default": true,
|
"default": false,
|
||||||
"visible": true
|
"visible": true
|
||||||
},
|
},
|
||||||
"material_print_temperature": {
|
"material_print_temperature": {
|
||||||
|
@ -537,7 +585,7 @@
|
||||||
"description": "Data linking material flow (in mm³/s) to temperature (°C).",
|
"description": "Data linking material flow (in mm³/s) to temperature (°C).",
|
||||||
"unit": "",
|
"unit": "",
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"default": "[[0.1,180],[20,230]]",
|
"default": "[[3.5,200],[7.0,240]]",
|
||||||
"enabled": "material_flow_dependent_temperature"
|
"enabled": "material_flow_dependent_temperature"
|
||||||
},
|
},
|
||||||
"material_standby_temperature": {
|
"material_standby_temperature": {
|
||||||
|
@ -551,7 +599,7 @@
|
||||||
},
|
},
|
||||||
"material_extrusion_cool_down_speed": {
|
"material_extrusion_cool_down_speed": {
|
||||||
"label": "Extrusion Cool Down Speed Modifier",
|
"label": "Extrusion Cool Down Speed Modifier",
|
||||||
"description": "The extra speed by which the nozzle cools when while extruding. The same value is used to signify the heat up speed lost when heating up while extruding.",
|
"description": "The extra speed by which the nozzle cools while extruding. The same value is used to signify the heat up speed lost when heating up while extruding.",
|
||||||
"unit": "°C/s",
|
"unit": "°C/s",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 0.5,
|
"default": 0.5,
|
||||||
|
@ -570,7 +618,7 @@
|
||||||
},
|
},
|
||||||
"material_diameter": {
|
"material_diameter": {
|
||||||
"label": "Diameter",
|
"label": "Diameter",
|
||||||
"description": "The diameter of your filament needs to be measured as accurately as possible.\nIf you cannot measure this value you will have to calibrate it, a higher number means less extrusion, a smaller number generates more extrusion.",
|
"description": "The diameter of your filament needs to be measured as accurately as possible.\nIf you cannot measure this value you will have to calibrate it; a higher number means less extrusion, a smaller number generates more extrusion.",
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 2.85,
|
"default": 2.85,
|
||||||
|
@ -596,7 +644,7 @@
|
||||||
},
|
},
|
||||||
"retraction_amount": {
|
"retraction_amount": {
|
||||||
"label": "Retraction Distance",
|
"label": "Retraction Distance",
|
||||||
"description": "The amount of retraction: Set at 0 for no retraction at all. A value of 4.5mm seems to generate good results for 3mm filament in Bowden-tube fed printers.",
|
"description": "The amount of retraction: Set at 0 for no retraction at all. A value of 4.5mm seems to generate good results for 3mm filament in bowden tube fed printers.",
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 4.5,
|
"default": 4.5,
|
||||||
|
@ -636,8 +684,8 @@
|
||||||
},
|
},
|
||||||
"retraction_extra_prime_amount": {
|
"retraction_extra_prime_amount": {
|
||||||
"label": "Retraction Extra Prime Amount",
|
"label": "Retraction Extra Prime Amount",
|
||||||
"description": "The amount of material extruded after unretracting. During a retracted travel material might get lost and so we need to compensate for this.",
|
"description": "The amount of material extruded after a retraction. During a travel move, some material might get lost and so we need to compensate for this.",
|
||||||
"unit": "mm",
|
"unit": "mm³",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 0,
|
"default": 0,
|
||||||
"visible": false,
|
"visible": false,
|
||||||
|
@ -646,7 +694,7 @@
|
||||||
},
|
},
|
||||||
"retraction_min_travel": {
|
"retraction_min_travel": {
|
||||||
"label": "Retraction Minimum Travel",
|
"label": "Retraction Minimum Travel",
|
||||||
"description": "The minimum distance of travel needed for a retraction to happen at all. This helps ensure you do not get a lot of retractions in a small area.",
|
"description": "The minimum distance of travel needed for a retraction to happen at all. This helps to get fewer retractions in a small area.",
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 1.5,
|
"default": 1.5,
|
||||||
|
@ -655,27 +703,29 @@
|
||||||
"enabled": "retraction_enable"
|
"enabled": "retraction_enable"
|
||||||
},
|
},
|
||||||
"retraction_count_max": {
|
"retraction_count_max": {
|
||||||
"label": "Maximal Retraction Count",
|
"label": "Maximum Retraction Count",
|
||||||
"description": "This settings limits the number of retractions occuring within the Minimal Extrusion Distance Window. Further retractions within this window will be ignored. This avoids retracting repeatedly on the same piece of filament as that can flatten the filament and cause grinding issues.",
|
"description": "This setting limits the number of retractions occurring within the Minimum Extrusion Distance Window. Further retractions within this window will be ignored. This avoids retracting repeatedly on the same piece of filament, as that can flatten the filament and cause grinding issues.",
|
||||||
"default": 6,
|
"default": 8,
|
||||||
"type": "int",
|
"type": "int",
|
||||||
|
"min_value": "1",
|
||||||
"visible": false,
|
"visible": false,
|
||||||
"inherit": false,
|
"inherit": false,
|
||||||
"enabled": "retraction_enable"
|
"enabled": "retraction_enable"
|
||||||
},
|
},
|
||||||
"retraction_extrusion_window": {
|
"retraction_extrusion_window": {
|
||||||
"label": "Minimal Extrusion Distance Window",
|
"label": "Minimum Extrusion Distance Window",
|
||||||
"description": "The window in which the Maximal Retraction Count is enforced. This window should be approximately the size of the Retraction distance, so that effectively the number of times a retraction passes the same patch of material is limited.",
|
"description": "The window in which the Maximum Retraction Count is enforced. This value should be approximately the same as the Retraction distance, so that effectively the number of times a retraction passes the same patch of material is limited.",
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 4.5,
|
"default": 4.5,
|
||||||
|
"min_value": "0.0",
|
||||||
"visible": false,
|
"visible": false,
|
||||||
"inherit_function": "retraction_amount",
|
"inherit_function": "retraction_amount",
|
||||||
"enabled": "retraction_enable"
|
"enabled": "retraction_enable"
|
||||||
},
|
},
|
||||||
"retraction_hop": {
|
"retraction_hop": {
|
||||||
"label": "Z Hop when Retracting",
|
"label": "Z Hop when Retracting",
|
||||||
"description": "Whenever a retraction is done, the head is lifted by this amount to travel over the print. A value of 0.075 works well. This feature has a lot of positive effect on delta towers.",
|
"description": "Whenever a retraction is done, the head is lifted by this amount to travel over the print. A value of 0.075 works well. This feature has a large positive effect on delta towers.",
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 0,
|
"default": 0,
|
||||||
|
@ -697,7 +747,7 @@
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"min_value": "0.1",
|
"min_value": "0.1",
|
||||||
"max_value_warning": "150",
|
"max_value_warning": "150",
|
||||||
"default": 50,
|
"default": 60,
|
||||||
"children": {
|
"children": {
|
||||||
"speed_infill": {
|
"speed_infill": {
|
||||||
"label": "Infill Speed",
|
"label": "Infill Speed",
|
||||||
|
@ -706,38 +756,40 @@
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"min_value": "0.1",
|
"min_value": "0.1",
|
||||||
"max_value_warning": "150",
|
"max_value_warning": "150",
|
||||||
"default": 50,
|
"default": 60,
|
||||||
"visible": false
|
"visible": false
|
||||||
},
|
},
|
||||||
"speed_wall": {
|
"speed_wall": {
|
||||||
"label": "Shell Speed",
|
"label": "Shell Speed",
|
||||||
"description": "The speed at which shell is printed. Printing the outer shell at a lower speed improves the final skin quality.",
|
"description": "The speed at which the shell is printed. Printing the outer shell at a lower speed improves the final skin quality.",
|
||||||
"unit": "mm/s",
|
"unit": "mm/s",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"min_value": "0.1",
|
"min_value": "0.1",
|
||||||
"max_value_warning": "150",
|
"max_value_warning": "150",
|
||||||
"default": 50,
|
"default": 30,
|
||||||
"visible": false,
|
"visible": false,
|
||||||
|
"inherit_function": "parent_value / 60 * 30",
|
||||||
"children": {
|
"children": {
|
||||||
"speed_wall_0": {
|
"speed_wall_0": {
|
||||||
"label": "Outer Shell Speed",
|
"label": "Outer Shell Speed",
|
||||||
"description": "The speed at which outer shell is printed. Printing the outer shell at a lower speed improves the final skin quality. However, having a large difference between the inner shell speed and the outer shell speed will effect quality in a negative way.",
|
"description": "The speed at which the outer shell is printed. Printing the outer shell at a lower speed improves the final skin quality. However, having a large difference between the inner shell speed and the outer shell speed will effect quality in a negative way.",
|
||||||
"unit": "mm/s",
|
"unit": "mm/s",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"min_value": "0.1",
|
"min_value": "0.1",
|
||||||
"max_value_warning": "150",
|
"max_value_warning": "150",
|
||||||
"default": 50,
|
"default": 30,
|
||||||
"visible": false
|
"visible": false
|
||||||
},
|
},
|
||||||
"speed_wall_x": {
|
"speed_wall_x": {
|
||||||
"label": "Inner Shell Speed",
|
"label": "Inner Shell Speed",
|
||||||
"description": "The speed at which all inner shells are printed. Printing the inner shell fasster than the outer shell will reduce printing time. It is good to set this in between the outer shell speed and the infill speed.",
|
"description": "The speed at which all inner shells are printed. Printing the inner shell faster than the outer shell will reduce printing time. It works well to set this in between the outer shell speed and the infill speed.",
|
||||||
"unit": "mm/s",
|
"unit": "mm/s",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"min_value": "0.1",
|
"min_value": "0.1",
|
||||||
"max_value_warning": "150",
|
"max_value_warning": "150",
|
||||||
"default": 50,
|
"default": 60,
|
||||||
"visible": false
|
"visible": false,
|
||||||
|
"inherit_function": "speed_print"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -748,40 +800,42 @@
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"min_value": "0.1",
|
"min_value": "0.1",
|
||||||
"max_value_warning": "150",
|
"max_value_warning": "150",
|
||||||
"default": 50,
|
"default": 30,
|
||||||
"visible": false
|
"visible": false,
|
||||||
|
"inherit_function": "parent_value / 60 * 30"
|
||||||
},
|
},
|
||||||
"speed_support": {
|
"speed_support": {
|
||||||
"label": "Support Speed",
|
"label": "Support Speed",
|
||||||
"description": "The speed at which exterior support is printed. Printing exterior supports at higher speeds can greatly improve printing time. And the surface quality of exterior support is usually not important, so higher speeds can be used.",
|
"description": "The speed at which exterior support is printed. Printing exterior supports at higher speeds can greatly improve printing time. The surface quality of exterior support is usually not important anyway, so higher speeds can be used.",
|
||||||
"unit": "mm/s",
|
"unit": "mm/s",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"min_value": "0.1",
|
"min_value": "0.1",
|
||||||
"max_value_warning": "150",
|
"max_value_warning": "150",
|
||||||
"default": 50,
|
"default": 60,
|
||||||
"visible": false,
|
"visible": false,
|
||||||
"inherit_function": "speed_wall_0",
|
"inherit_function": "speed_print",
|
||||||
"enabled": "support_enable",
|
"enabled": "support_enable",
|
||||||
"children": {
|
"children": {
|
||||||
"speed_support_lines": {
|
"speed_support_infill": {
|
||||||
"label": "Support Wall Speed",
|
"label": "Support Infill Speed",
|
||||||
"description": "The speed at which the walls of exterior support are printed. Printing the walls at higher speeds can improve on the overall duration. ",
|
"description": "The speed at which the infill of exterior support is printed. Printing the infill at higher speeds can improve the overall print time.",
|
||||||
"unit": "mm/s",
|
"unit": "mm/s",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 50,
|
"default": 60,
|
||||||
"visible": false,
|
"visible": false,
|
||||||
"inherit": true,
|
"inherit": true,
|
||||||
"enabled": "support_roof_enable"
|
"enabled": "support_roof_enable"
|
||||||
},
|
},
|
||||||
"speed_support_roof": {
|
"speed_support_roof": {
|
||||||
"label": "Support Roof Speed",
|
"label": "Support Roof Speed",
|
||||||
"description": "The speed at which the roofs of exterior support are printed. Printing the support roof at lower speeds can improve on overhang quality. ",
|
"description": "The speed at which the roofs of exterior support are printed. Printing the support roof at lower speeds can improve overhang quality.",
|
||||||
"unit": "mm/s",
|
"unit": "mm/s",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 40,
|
"default": 40,
|
||||||
"visible": false,
|
"visible": false,
|
||||||
"inherit": false,
|
"inherit": false,
|
||||||
"enabled": "support_roof_enable"
|
"enabled": "support_roof_enable",
|
||||||
|
"inherit_function": "parent_value / 60 * 40"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -789,35 +843,36 @@
|
||||||
},
|
},
|
||||||
"speed_travel": {
|
"speed_travel": {
|
||||||
"label": "Travel Speed",
|
"label": "Travel Speed",
|
||||||
"description": "The speed at which travel moves are done. A well-built Ultimaker can reach speeds of 250mm/s. But some machines might have misaligned layers then.",
|
"description": "The speed at which travel moves are done. A well-built Ultimaker can reach speeds of 250mm/s, but some machines might have misaligned layers then.",
|
||||||
"unit": "mm/s",
|
"unit": "mm/s",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"min_value": "0.1",
|
"min_value": "0.1",
|
||||||
"max_value_warning": "300",
|
"max_value_warning": "300",
|
||||||
"default": 150
|
"default": 120,
|
||||||
|
"inherit_function": "speed_print if magic_spiralize else 120"
|
||||||
},
|
},
|
||||||
"speed_layer_0": {
|
"speed_layer_0": {
|
||||||
"label": "Bottom Layer Speed",
|
"label": "Bottom Layer Speed",
|
||||||
"description": "The print speed for the bottom layer: You want to print the first layer slower so it sticks to the printer bed better.",
|
"description": "The print speed for the bottom layer: You want to print the first layer slower so it sticks better to the printer bed.",
|
||||||
"unit": "mm/s",
|
"unit": "mm/s",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"min_value": "0.1",
|
"min_value": "0.1",
|
||||||
"default": 15,
|
"default": 30,
|
||||||
"visible": false
|
"visible": false
|
||||||
},
|
},
|
||||||
"skirt_speed": {
|
"skirt_speed": {
|
||||||
"label": "Skirt Speed",
|
"label": "Skirt Speed",
|
||||||
"description": "The speed at which the skirt and brim are printed. Normally this is done at the initial layer speed. But sometimes you want to print the skirt at a different speed.",
|
"description": "The speed at which the skirt and brim are printed. Normally this is done at the initial layer speed, but sometimes you might want to print the skirt at a different speed.",
|
||||||
"unit": "mm/s",
|
"unit": "mm/s",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"min_value": "0.1",
|
"min_value": "0.1",
|
||||||
"default": 15,
|
"default": 30,
|
||||||
"visible": false,
|
"visible": false,
|
||||||
"inherit_function": "speed_layer_0"
|
"inherit_function": "speed_layer_0"
|
||||||
},
|
},
|
||||||
"speed_slowdown_layers": {
|
"speed_slowdown_layers": {
|
||||||
"label": "Amount of Slower Layers",
|
"label": "Number of Slower Layers",
|
||||||
"description": "The first few layers are printed slower then the rest of the object, this to get better adhesion to the printer bed and improve the overall success rate of prints. The speed is gradually increased over these layers. 4 layers of speed-up is generally right for most materials and printers.",
|
"description": "The first few layers are printed slower than the rest of the object, this to get better adhesion to the printer bed and improve the overall success rate of prints. The speed is gradually increased over these layers. 4 layers of speed-up is generally right for most materials and printers.",
|
||||||
"type": "int",
|
"type": "int",
|
||||||
"min_value": "0",
|
"min_value": "0",
|
||||||
"default": 4,
|
"default": 4,
|
||||||
|
@ -832,7 +887,7 @@
|
||||||
"settings": {
|
"settings": {
|
||||||
"retraction_combing": {
|
"retraction_combing": {
|
||||||
"label": "Enable Combing",
|
"label": "Enable Combing",
|
||||||
"description": "Combing keeps the head within the interior of the print whenever possible when traveling from one part of the print to another, and does not use retraction. If combing is disabled the printer head moves straight from the start point to the end point and it will always retract.",
|
"description": "Combing keeps the head within the interior of the print whenever possible when traveling from one part of the print to another and does not use retraction. If combing is disabled, the print head moves straight from the start point to the end point and it will always retract.",
|
||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"default": true,
|
"default": true,
|
||||||
"visible": false
|
"visible": false
|
||||||
|
@ -872,93 +927,27 @@
|
||||||
"default": 0.064,
|
"default": 0.064,
|
||||||
"visible": false,
|
"visible": false,
|
||||||
"inherit": false,
|
"inherit": false,
|
||||||
"enabled": "coasting_enable",
|
"enabled": "coasting_enable"
|
||||||
"children": {
|
|
||||||
"coasting_volume_retract": {
|
|
||||||
"label": "Retract-Coasting Volume",
|
|
||||||
"description": "The volume otherwise oozed in a travel move with retraction.",
|
|
||||||
"unit": "mm³",
|
|
||||||
"type": "float",
|
|
||||||
"default": 0.064,
|
|
||||||
"visible": false,
|
|
||||||
"inherit": true,
|
|
||||||
"enabled": "coasting_enable"
|
|
||||||
},
|
|
||||||
"coasting_volume_move": {
|
|
||||||
"label": "Move-Coasting Volume",
|
|
||||||
"description": "The volume otherwise oozed in a travel move without retraction.",
|
|
||||||
"unit": "mm³",
|
|
||||||
"type": "float",
|
|
||||||
"default": 0.096,
|
|
||||||
"visible": false,
|
|
||||||
"inherit": true,
|
|
||||||
"enabled": "coasting_enable"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"coasting_min_volume": {
|
"coasting_min_volume": {
|
||||||
"label": "Minimal Volume Before Coasting",
|
"label": "Minimal Volume Before Coasting",
|
||||||
"description": "The least volume an extrusion path should have to coast the full amount. For smaller extrusion paths, less pressure has been built up in the bowden tube and so the coasted volume is scaled linearly.",
|
"description": "The least volume an extrusion path should have to coast the full amount. For smaller extrusion paths, less pressure has been built up in the bowden tube and so the coasted volume is scaled linearly. This value should always be larger than the Coasting Volume.",
|
||||||
"unit": "mm³",
|
"unit": "mm³",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 0.8,
|
"default": 0.8,
|
||||||
|
"min_value": "0",
|
||||||
"visible": false,
|
"visible": false,
|
||||||
"inherit": false,
|
"enabled": "coasting_enable"
|
||||||
"enabled": "coasting_enable",
|
|
||||||
"children": {
|
|
||||||
"coasting_min_volume_retract": {
|
|
||||||
"label": "Min Volume Retract-Coasting",
|
|
||||||
"description": "The minimal volume an extrusion path must have in order to coast the full amount before doing a retraction.",
|
|
||||||
"unit": "mm³",
|
|
||||||
"type": "float",
|
|
||||||
"default": 0.6,
|
|
||||||
"visible": false,
|
|
||||||
"inherit": true,
|
|
||||||
"enabled": "coasting_enable"
|
|
||||||
},
|
|
||||||
"coasting_min_volume_move": {
|
|
||||||
"label": "Min Volume Move-Coasting",
|
|
||||||
"description": "The minimal volume an extrusion path must have in order to coast the full amount before doing a travel move without retraction.",
|
|
||||||
"unit": "mm³",
|
|
||||||
"type": "float",
|
|
||||||
"default": 0.8,
|
|
||||||
"visible": false,
|
|
||||||
"inherit": true,
|
|
||||||
"enabled": "coasting_enable"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"coasting_speed": {
|
"coasting_speed": {
|
||||||
"label": "Coasting Speed",
|
"label": "Coasting Speed",
|
||||||
"description": "The speed by which to move during coasting, relative to the speed of the extrusion path. A value slightly under 100% is advised, since during the coasting move, the pressure in the bowden tube drops.",
|
"description": "The speed by which to move during coasting, relative to the speed of the extrusion path. A value slightly under 100% is advised, since during the coasting move the pressure in the bowden tube drops.",
|
||||||
"unit": "%",
|
"unit": "%",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 90,
|
"default": 90,
|
||||||
"visible": false,
|
"visible": false,
|
||||||
"inherit": false,
|
"inherit": false,
|
||||||
"enabled": "coasting_enable",
|
"enabled": "coasting_enable"
|
||||||
"children": {
|
|
||||||
"coasting_speed_retract": {
|
|
||||||
"label": "Retract-Coasting Speed",
|
|
||||||
"description": "The speed by which to move during coasting before a retraction, relative to the speed of the extrusion path.",
|
|
||||||
"unit": "%",
|
|
||||||
"type": "float",
|
|
||||||
"default": 90,
|
|
||||||
"visible": false,
|
|
||||||
"inherit": true,
|
|
||||||
"enabled": "coasting_enable"
|
|
||||||
},
|
|
||||||
"coasting_speed_move": {
|
|
||||||
"label": "Move-Coasting Speed",
|
|
||||||
"description": "The speed by which to move during coasting before a travel move without retraction, relative to the speed of the extrusion path.",
|
|
||||||
"unit": "%",
|
|
||||||
"type": "float",
|
|
||||||
"default": 90,
|
|
||||||
"visible": false,
|
|
||||||
"inherit": true,
|
|
||||||
"enabled": "coasting_enable"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -1029,7 +1018,7 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"cool_min_layer_time": {
|
"cool_min_layer_time": {
|
||||||
"label": "Minimal Layer Time",
|
"label": "Minimum Layer Time",
|
||||||
"description": "The minimum time spent in a layer: Gives the layer time to cool down before the next one is put on top. If a layer would print in less time, then the printer will slow down to make sure it has spent at least this many seconds printing the layer.",
|
"description": "The minimum time spent in a layer: Gives the layer time to cool down before the next one is put on top. If a layer would print in less time, then the printer will slow down to make sure it has spent at least this many seconds printing the layer.",
|
||||||
"unit": "sec",
|
"unit": "sec",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
|
@ -1038,8 +1027,8 @@
|
||||||
"visible": false
|
"visible": false
|
||||||
},
|
},
|
||||||
"cool_min_layer_time_fan_speed_max": {
|
"cool_min_layer_time_fan_speed_max": {
|
||||||
"label": "Minimal Layer Time Full Fan Speed",
|
"label": "Minimum Layer Time Full Fan Speed",
|
||||||
"description": "The minimum time spent in a layer which will cause the fan to be at maximum speed. The fan speed increases linearly from minimal fan speed for layers taking minimal layer time to maximum fan speed for layers taking the time specified here.",
|
"description": "The minimum time spent in a layer which will cause the fan to be at maximum speed. The fan speed increases linearly from minimum fan speed for layers taking the minimum layer time to maximum fan speed for layers taking the time specified here.",
|
||||||
"unit": "sec",
|
"unit": "sec",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"min_value": "0",
|
"min_value": "0",
|
||||||
|
@ -1076,7 +1065,7 @@
|
||||||
},
|
},
|
||||||
"support_type": {
|
"support_type": {
|
||||||
"label": "Placement",
|
"label": "Placement",
|
||||||
"description": "Where to place support structures. The placement can be restricted such that the support structures won't rest on the model, which could otherwise cause scarring.",
|
"description": "Where to place support structures. The placement can be restricted so that the support structures won't rest on the model, which could otherwise cause scarring.",
|
||||||
"type": "enum",
|
"type": "enum",
|
||||||
"options": {
|
"options": {
|
||||||
"buildplate": "Touching Buildplate",
|
"buildplate": "Touching Buildplate",
|
||||||
|
@ -1098,7 +1087,7 @@
|
||||||
},
|
},
|
||||||
"support_xy_distance": {
|
"support_xy_distance": {
|
||||||
"label": "X/Y Distance",
|
"label": "X/Y Distance",
|
||||||
"description": "Distance of the support structure from the print, in the X/Y directions. 0.7mm typically gives a nice distance from the print so the support does not stick to the surface.",
|
"description": "Distance of the support structure from the print in the X/Y directions. 0.7mm typically gives a nice distance from the print so the support does not stick to the surface.",
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"min_value": "0",
|
"min_value": "0",
|
||||||
|
@ -1136,7 +1125,7 @@
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"min_value": "0",
|
"min_value": "0",
|
||||||
"max_value_warning": "10",
|
"max_value_warning": "10",
|
||||||
"default": 0.15,
|
"default": 0.1,
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"visible": false,
|
"visible": false,
|
||||||
"enabled": "support_enable"
|
"enabled": "support_enable"
|
||||||
|
@ -1164,7 +1153,7 @@
|
||||||
},
|
},
|
||||||
"support_conical_min_width": {
|
"support_conical_min_width": {
|
||||||
"label": "Minimal Width",
|
"label": "Minimal Width",
|
||||||
"description": "Minimal width to which conical support reduces the support areas. Small widths can cause the base of the support to not act well as fundament for support above.",
|
"description": "Minimal width to which conical support reduces the support areas. Small widths can cause the base of the support to not act well as foundation for support above.",
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"min_value": "0",
|
"min_value": "0",
|
||||||
"default": 3.0,
|
"default": 3.0,
|
||||||
|
@ -1177,13 +1166,13 @@
|
||||||
"description": "The height of the steps of the stair-like bottom of support resting on the model. Small steps can cause the support to be hard to remove from the top of the model.",
|
"description": "The height of the steps of the stair-like bottom of support resting on the model. Small steps can cause the support to be hard to remove from the top of the model.",
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 2,
|
"default": 0.3,
|
||||||
"visible": false,
|
"visible": false,
|
||||||
"enabled": "support_enable"
|
"enabled": "support_enable"
|
||||||
},
|
},
|
||||||
"support_join_distance": {
|
"support_join_distance": {
|
||||||
"label": "Join Distance",
|
"label": "Join Distance",
|
||||||
"description": "The maximum distance between support blocks, in the X/Y directions, such that the blocks will merge into a single block.",
|
"description": "The maximum distance between support blocks in the X/Y directions, so that the blocks will merge into a single block.",
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 2,
|
"default": 2,
|
||||||
|
@ -1201,7 +1190,7 @@
|
||||||
},
|
},
|
||||||
"support_area_smoothing": {
|
"support_area_smoothing": {
|
||||||
"label": "Area Smoothing",
|
"label": "Area Smoothing",
|
||||||
"description": "Maximal distance in the X/Y directions of a line segment which is to be smoothed out. Ragged lines are introduced by the join distance and support bridge, which cause the machine to resonate. Smoothing the support areas won't cause them to break with the constraints, except it might change the overhang.",
|
"description": "Maximum distance in the X/Y directions of a line segment which is to be smoothed out. Ragged lines are introduced by the join distance and support bridge, which cause the machine to resonate. Smoothing the support areas won't cause them to break with the constraints, except it might change the overhang.",
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 0.6,
|
"default": 0.6,
|
||||||
|
@ -1218,7 +1207,7 @@
|
||||||
},
|
},
|
||||||
"support_roof_height": {
|
"support_roof_height": {
|
||||||
"label": "Support Roof Thickness",
|
"label": "Support Roof Thickness",
|
||||||
"description": "The height of the support roofs. ",
|
"description": "The height of the support roofs.",
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 1,
|
"default": 1,
|
||||||
|
@ -1227,7 +1216,7 @@
|
||||||
},
|
},
|
||||||
"support_roof_density": {
|
"support_roof_density": {
|
||||||
"label": "Support Roof Density",
|
"label": "Support Roof Density",
|
||||||
"description": "This controls how densely filled the roofs of the support will be. A higher percentage results in better overhangs, which are more difficult to remove.",
|
"description": "This controls how densely filled the roofs of the support will be. A higher percentage results in better overhangs, but makes the support more difficult to remove.",
|
||||||
"unit": "%",
|
"unit": "%",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 100,
|
"default": 100,
|
||||||
|
@ -1261,7 +1250,7 @@
|
||||||
"enabled": "support_roof_enable"
|
"enabled": "support_roof_enable"
|
||||||
},
|
},
|
||||||
"support_use_towers": {
|
"support_use_towers": {
|
||||||
"label": "Use towers.",
|
"label": "Use towers",
|
||||||
"description": "Use specialized towers to support tiny overhang areas. These towers have a larger diameter than the region they support. Near the overhang the towers' diameter decreases, forming a roof.",
|
"description": "Use specialized towers to support tiny overhang areas. These towers have a larger diameter than the region they support. Near the overhang the towers' diameter decreases, forming a roof.",
|
||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"default": true,
|
"default": true,
|
||||||
|
@ -1269,8 +1258,8 @@
|
||||||
"enabled": "support_enable"
|
"enabled": "support_enable"
|
||||||
},
|
},
|
||||||
"support_minimal_diameter": {
|
"support_minimal_diameter": {
|
||||||
"label": "Minimal Diameter",
|
"label": "Minimum Diameter",
|
||||||
"description": "Maximal diameter in the X/Y directions of a small area which is to be supported by a specialized support tower. ",
|
"description": "Minimum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower.",
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 1,
|
"default": 1,
|
||||||
|
@ -1279,7 +1268,7 @@
|
||||||
},
|
},
|
||||||
"support_tower_diameter": {
|
"support_tower_diameter": {
|
||||||
"label": "Tower Diameter",
|
"label": "Tower Diameter",
|
||||||
"description": "The diameter of a special tower. ",
|
"description": "The diameter of a special tower.",
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 1,
|
"default": 1,
|
||||||
|
@ -1288,7 +1277,7 @@
|
||||||
},
|
},
|
||||||
"support_tower_roof_angle": {
|
"support_tower_roof_angle": {
|
||||||
"label": "Tower Roof Angle",
|
"label": "Tower Roof Angle",
|
||||||
"description": "The angle of the rooftop of a tower. Larger angles mean more pointy towers. ",
|
"description": "The angle of the rooftop of a tower. Larger angles mean more pointy towers.",
|
||||||
"unit": "°",
|
"unit": "°",
|
||||||
"type": "int",
|
"type": "int",
|
||||||
"min_value": "0",
|
"min_value": "0",
|
||||||
|
@ -1299,7 +1288,7 @@
|
||||||
},
|
},
|
||||||
"support_pattern": {
|
"support_pattern": {
|
||||||
"label": "Pattern",
|
"label": "Pattern",
|
||||||
"description": "Cura supports 3 distinct types of support structure. First is a grid based support structure which is quite solid and can be removed as 1 piece. The second is a line based support structure which has to be peeled off line by line. The third is a structure in between the other two; it consists of lines which are connected in an accordeon fashion.",
|
"description": "Cura can generate 3 distinct types of support structure. First is a grid based support structure which is quite solid and can be removed in one piece. The second is a line based support structure which has to be peeled off line by line. The third is a structure in between the other two; it consists of lines which are connected in an accordion fashion.",
|
||||||
"type": "enum",
|
"type": "enum",
|
||||||
"options": {
|
"options": {
|
||||||
"lines": "Lines",
|
"lines": "Lines",
|
||||||
|
@ -1322,7 +1311,7 @@
|
||||||
},
|
},
|
||||||
"support_infill_rate": {
|
"support_infill_rate": {
|
||||||
"label": "Fill Amount",
|
"label": "Fill Amount",
|
||||||
"description": "The amount of infill structure in the support, less infill gives weaker support which is easier to remove.",
|
"description": "The amount of infill structure in the support; less infill gives weaker support which is easier to remove.",
|
||||||
"unit": "%",
|
"unit": "%",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"min_value": "0",
|
"min_value": "0",
|
||||||
|
@ -1354,7 +1343,7 @@
|
||||||
"settings": {
|
"settings": {
|
||||||
"adhesion_type": {
|
"adhesion_type": {
|
||||||
"label": "Type",
|
"label": "Type",
|
||||||
"description": "Different options that help in preventing corners from lifting due to warping. Brim adds a single-layer-thick flat area around your object which is easy to cut off afterwards, and it is the recommended option. Raft adds a thick grid below the object and a thin interface between this and your object. (Note that enabling the brim or raft disables the skirt.)",
|
"description": "Different options that help to improve priming your extrusion.\nBrim and Raft help in preventing corners from lifting due to warping. Brim adds a single-layer-thick flat area around your object which is easy to cut off afterwards, and it is the recommended option.\nRaft adds a thick grid below the object and a thin interface between this and your object.\nThe skirt is a line drawn around the first layer of the print, this helps to prime your extrusion and to see if the object fits on your platform.",
|
||||||
"type": "enum",
|
"type": "enum",
|
||||||
"options": {
|
"options": {
|
||||||
"skirt": "Skirt",
|
"skirt": "Skirt",
|
||||||
|
@ -1365,7 +1354,7 @@
|
||||||
},
|
},
|
||||||
"skirt_line_count": {
|
"skirt_line_count": {
|
||||||
"label": "Skirt Line Count",
|
"label": "Skirt Line Count",
|
||||||
"description": "The skirt is a line drawn around the first layer of the print. This helps to prime your extruder, and to see if the object fits on your platform. Setting this to 0 will disable the skirt. Multiple skirt lines can help to prime your extruder better for small objects.",
|
"description": "Multiple skirt lines help to prime your extrusion better for small objects. Setting this to 0 will disable the skirt.",
|
||||||
"type": "int",
|
"type": "int",
|
||||||
"default": 1,
|
"default": 1,
|
||||||
"enabled": "adhesion_type == \"skirt\""
|
"enabled": "adhesion_type == \"skirt\""
|
||||||
|
@ -1386,12 +1375,23 @@
|
||||||
"default": 250,
|
"default": 250,
|
||||||
"enabled": "adhesion_type == \"skirt\""
|
"enabled": "adhesion_type == \"skirt\""
|
||||||
},
|
},
|
||||||
"brim_line_count": {
|
"brim_width": {
|
||||||
"label": "Brim Line Count",
|
"label": "Brim Width",
|
||||||
"description": "The amount of lines used for a brim: More lines means a larger brim which sticks better, but this also makes your effective print area smaller.",
|
"description": "The distance from the model to the end of the brim. A larger brim sticks better to the build platform, but also makes your effective print area smaller.",
|
||||||
"type": "int",
|
"type": "float",
|
||||||
"default": 10,
|
"unit": "mm",
|
||||||
"enabled": "adhesion_type == \"brim\""
|
"default": 5.0,
|
||||||
|
"enabled": "adhesion_type == \"brim\"",
|
||||||
|
"children": {
|
||||||
|
"brim_line_count": {
|
||||||
|
"label": "Brim Line Count",
|
||||||
|
"description": "The number of lines used for a brim. More lines means a larger brim which sticks better to the build plate, but this also makes your effective print area smaller.",
|
||||||
|
"type": "int",
|
||||||
|
"default": 13,
|
||||||
|
"inherit_function": "math.ceil(parent_value / skirt_line_width)",
|
||||||
|
"enabled": "adhesion_type == \"brim\""
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"raft_margin": {
|
"raft_margin": {
|
||||||
"label": "Raft Extra Margin",
|
"label": "Raft Extra Margin",
|
||||||
|
@ -1496,11 +1496,11 @@
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 30,
|
"default": 30,
|
||||||
"enabled": "adhesion_type == \"raft\"",
|
"enabled": "adhesion_type == \"raft\"",
|
||||||
"inherit_function": "0.6 * speed_print",
|
"inherit_function": "speed_print / 60 * 30",
|
||||||
"children": {
|
"children": {
|
||||||
"raft_surface_speed": {
|
"raft_surface_speed": {
|
||||||
"label": "Raft Surface Print Speed",
|
"label": "Raft Surface Print Speed",
|
||||||
"description": "The speed at which the surface raft layers are printed. This should be printed a bit slower, so that the nozzle can slowly smooth out adjacent surface lines.",
|
"description": "The speed at which the surface raft layers are printed. These should be printed a bit slower, so that the nozzle can slowly smooth out adjacent surface lines.",
|
||||||
"unit": "mm/s",
|
"unit": "mm/s",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 30,
|
"default": 30,
|
||||||
|
@ -1509,7 +1509,7 @@
|
||||||
},
|
},
|
||||||
"raft_interface_speed": {
|
"raft_interface_speed": {
|
||||||
"label": "Raft Interface Print Speed",
|
"label": "Raft Interface Print Speed",
|
||||||
"description": "The speed at which the interface raft layer is printed. This should be printed quite slowly, as the amount of material coming out of the nozzle is quite high.",
|
"description": "The speed at which the interface raft layer is printed. This should be printed quite slowly, as the volume of material coming out of the nozzle is quite high.",
|
||||||
"unit": "mm/s",
|
"unit": "mm/s",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 15,
|
"default": 15,
|
||||||
|
@ -1518,7 +1518,7 @@
|
||||||
},
|
},
|
||||||
"raft_base_speed": {
|
"raft_base_speed": {
|
||||||
"label": "Raft Base Print Speed",
|
"label": "Raft Base Print Speed",
|
||||||
"description": "The speed at which the base raft layer is printed. This should be printed quite slowly, as the amount of material coming out of the nozzle is quite high.",
|
"description": "The speed at which the base raft layer is printed. This should be printed quite slowly, as the volume of material coming out of the nozzle is quite high.",
|
||||||
"unit": "mm/s",
|
"unit": "mm/s",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 15,
|
"default": 15,
|
||||||
|
@ -1595,7 +1595,7 @@
|
||||||
},
|
},
|
||||||
"draft_shield_height_limitation": {
|
"draft_shield_height_limitation": {
|
||||||
"label": "Draft Shield Limitation",
|
"label": "Draft Shield Limitation",
|
||||||
"description": "Whether to limit the height of the draft shield",
|
"description": "Whether or not to limit the height of the draft shield.",
|
||||||
"type": "enum",
|
"type": "enum",
|
||||||
"options": {
|
"options": {
|
||||||
"full": "Full",
|
"full": "Full",
|
||||||
|
@ -1626,7 +1626,7 @@
|
||||||
"settings": {
|
"settings": {
|
||||||
"meshfix_union_all": {
|
"meshfix_union_all": {
|
||||||
"label": "Union Overlapping Volumes",
|
"label": "Union Overlapping Volumes",
|
||||||
"description": "Ignore the internal geometry arising from overlapping volumes and print the volumes as one. This may cause internal cavaties to disappear.",
|
"description": "Ignore the internal geometry arising from overlapping volumes and print the volumes as one. This may cause internal cavities to disappear.",
|
||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"default": true,
|
"default": true,
|
||||||
"visible": false
|
"visible": false
|
||||||
|
@ -1647,7 +1647,7 @@
|
||||||
},
|
},
|
||||||
"meshfix_keep_open_polygons": {
|
"meshfix_keep_open_polygons": {
|
||||||
"label": "Keep Disconnected Faces",
|
"label": "Keep Disconnected Faces",
|
||||||
"description": "Normally Cura tries to stitch up small holes in the mesh and remove parts of a layer with big holes. Enabling this option keeps those parts which cannot be stitched. This option should be used as a last resort option when all else doesn produce proper GCode.",
|
"description": "Normally Cura tries to stitch up small holes in the mesh and remove parts of a layer with big holes. Enabling this option keeps those parts which cannot be stitched. This option should be used as a last resort option when everything else fails to produce proper GCode.",
|
||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"default": false,
|
"default": false,
|
||||||
"visible": false
|
"visible": false
|
||||||
|
@ -1661,14 +1661,15 @@
|
||||||
"settings": {
|
"settings": {
|
||||||
"print_sequence": {
|
"print_sequence": {
|
||||||
"label": "Print sequence",
|
"label": "Print sequence",
|
||||||
"description": "Whether to print all objects one layer at a time or to wait for one object to finish, before moving on to the next. One at a time mode is only possible if all models are separated such that the whole print head can move between and all models are lower than the distance between the nozzle and the X/Y axles.",
|
"description": "Whether to print all objects one layer at a time or to wait for one object to finish, before moving on to the next. One at a time mode is only possible if all models are separated in such a way that the whole print head can move in between and all models are lower than the distance between the nozzle and the X/Y axes.",
|
||||||
"type": "enum",
|
"type": "enum",
|
||||||
"options": {
|
"options": {
|
||||||
"all_at_once": "All at Once",
|
"all_at_once": "All at Once",
|
||||||
"one_at_a_time": "One at a Time"
|
"one_at_a_time": "One at a Time"
|
||||||
},
|
},
|
||||||
"default": "all_at_once",
|
"default": "all_at_once",
|
||||||
"visible": true
|
"visible": true,
|
||||||
|
"global_only": true
|
||||||
},
|
},
|
||||||
"magic_mesh_surface_mode": {
|
"magic_mesh_surface_mode": {
|
||||||
"label": "Surface Mode",
|
"label": "Surface Mode",
|
||||||
|
@ -1808,7 +1809,7 @@
|
||||||
"description": "Flow compensation: the amount of material extruded is multiplied by this value. Only applies to Wire Printing.",
|
"description": "Flow compensation: the amount of material extruded is multiplied by this value. Only applies to Wire Printing.",
|
||||||
"unit": "%",
|
"unit": "%",
|
||||||
"default": 100,
|
"default": 100,
|
||||||
"min_value": "0",
|
"min_value": "0",
|
||||||
"max_value": "100",
|
"max_value": "100",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"visible": false,
|
"visible": false,
|
||||||
|
@ -1845,7 +1846,7 @@
|
||||||
},
|
},
|
||||||
"wireframe_bottom_delay": {
|
"wireframe_bottom_delay": {
|
||||||
"label": "WP Bottom Delay",
|
"label": "WP Bottom Delay",
|
||||||
"description": "Delay time after a downward move. Only applies to Wire Printing. Only applies to Wire Printing.",
|
"description": "Delay time after a downward move. Only applies to Wire Printing.",
|
||||||
"unit": "sec",
|
"unit": "sec",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 0,
|
"default": 0,
|
||||||
|
@ -1854,7 +1855,7 @@
|
||||||
},
|
},
|
||||||
"wireframe_flat_delay": {
|
"wireframe_flat_delay": {
|
||||||
"label": "WP Flat Delay",
|
"label": "WP Flat Delay",
|
||||||
"description": "Delay time between two horizontal segments. Introducing such a delay can cause better adhesion to previous layers at the connection points, while too large delay times cause sagging. Only applies to Wire Printing.",
|
"description": "Delay time between two horizontal segments. Introducing such a delay can cause better adhesion to previous layers at the connection points, while too long delays cause sagging. Only applies to Wire Printing.",
|
||||||
"unit": "sec",
|
"unit": "sec",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default": 0.1,
|
"default": 0.1,
|
||||||
|
@ -1899,7 +1900,7 @@
|
||||||
},
|
},
|
||||||
"wireframe_strategy": {
|
"wireframe_strategy": {
|
||||||
"label": "WP Strategy",
|
"label": "WP Strategy",
|
||||||
"description": "Strategy for making sure two consecutive layers connect at each connection point. Retraction lets the upward lines harden in the right position, but may cause filament grinding. A knot can be made at the end of an upward line to heighten the chance of connecting to it and to let the line cool; however it may require slow printing speeds. Another strategy is to compensate for the sagging of the top of an upward line; however, the lines won't always fall down as predicted.",
|
"description": "Strategy for making sure two consecutive layers connect at each connection point. Retraction lets the upward lines harden in the right position, but may cause filament grinding. A knot can be made at the end of an upward line to heighten the chance of connecting to it and to let the line cool; however, it may require slow printing speeds. Another strategy is to compensate for the sagging of the top of an upward line; however, the lines won't always fall down as predicted.",
|
||||||
"type": "enum",
|
"type": "enum",
|
||||||
"options": {
|
"options": {
|
||||||
"compensate": "Compensate",
|
"compensate": "Compensate",
|
||||||
|
@ -1941,7 +1942,7 @@
|
||||||
},
|
},
|
||||||
"wireframe_roof_outer_delay": {
|
"wireframe_roof_outer_delay": {
|
||||||
"label": "WP Roof Outer Delay",
|
"label": "WP Roof Outer Delay",
|
||||||
"description": "Time spent at the outer perimeters of hole which is to become a roof. Larger times can ensure a better connection. Only applies to Wire Printing.",
|
"description": "Time spent at the outer perimeters of hole which is to become a roof. Longer times can ensure a better connection. Only applies to Wire Printing.",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"unit": "sec",
|
"unit": "sec",
|
||||||
"default": 0.2,
|
"default": 0.2,
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
"inherits": "fdmprinter.json",
|
"inherits": "fdmprinter.json",
|
||||||
"visible": "true",
|
"visible": "true",
|
||||||
|
|
||||||
"machine_settings": {
|
"overrides": {
|
||||||
"machine_width": { "default": 150 },
|
"machine_width": { "default": 150 },
|
||||||
"machine_height": { "default": 150 },
|
"machine_height": { "default": 150 },
|
||||||
"machine_depth": { "default": 150 },
|
"machine_depth": { "default": 150 },
|
||||||
|
@ -30,10 +30,8 @@
|
||||||
},
|
},
|
||||||
"machine_end_gcode": {
|
"machine_end_gcode": {
|
||||||
"default": "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"
|
"default": "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"
|
||||||
}
|
},
|
||||||
},
|
|
||||||
|
|
||||||
"overrides": {
|
|
||||||
"material_bed_temperature": { "visible": false }
|
"material_bed_temperature": { "visible": false }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
|
|
||||||
"inherits": "fdmprinter.json",
|
"inherits": "fdmprinter.json",
|
||||||
|
|
||||||
"machine_settings": {
|
"overrides": {
|
||||||
"machine_width": { "default": 210 },
|
"machine_width": { "default": 210 },
|
||||||
"machine_depth": { "default": 185 },
|
"machine_depth": { "default": 185 },
|
||||||
"machine_height": { "default": 200 },
|
"machine_height": { "default": 200 },
|
||||||
|
@ -30,10 +30,8 @@
|
||||||
|
|
||||||
"machine_nozzle_tip_outer_diameter": { "default": 1.0 },
|
"machine_nozzle_tip_outer_diameter": { "default": 1.0 },
|
||||||
"machine_nozzle_head_distance": { "default": 3.0 },
|
"machine_nozzle_head_distance": { "default": 3.0 },
|
||||||
"machine_nozzle_expansion_angle": { "default": 45 }
|
"machine_nozzle_expansion_angle": { "default": 45 },
|
||||||
},
|
|
||||||
|
|
||||||
"overrides": {
|
|
||||||
"layer_height": { "default": 0.2 },
|
"layer_height": { "default": 0.2 },
|
||||||
"layer_height_0": { "default": 0.2, "visible": false },
|
"layer_height_0": { "default": 0.2, "visible": false },
|
||||||
"wall_line_count": { "default": 2, "visible": true },
|
"wall_line_count": { "default": 2, "visible": true },
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
|
|
||||||
"inherits": "fdmprinter.json",
|
"inherits": "fdmprinter.json",
|
||||||
|
|
||||||
"machine_settings": {
|
"overrides": {
|
||||||
"machine_heated_bed": { "default": true },
|
"machine_heated_bed": { "default": true },
|
||||||
"machine_width": { "default": 200 },
|
"machine_width": { "default": 200 },
|
||||||
"machine_height": { "default": 200 },
|
"machine_height": { "default": 200 },
|
||||||
|
|
|
@ -11,8 +11,8 @@
|
||||||
"inherits": "fdmprinter.json",
|
"inherits": "fdmprinter.json",
|
||||||
|
|
||||||
|
|
||||||
"machine_extruder_trains": [
|
"machine_extruder_trains": {
|
||||||
{
|
"0": {
|
||||||
"machine_nozzle_size": {
|
"machine_nozzle_size": {
|
||||||
"default": 0.4
|
"default": 0.4
|
||||||
},
|
},
|
||||||
|
@ -35,8 +35,8 @@
|
||||||
"default": 16
|
"default": 16
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
},
|
||||||
"machine_settings": {
|
"overrides": {
|
||||||
"machine_start_gcode" : { "default": "" },
|
"machine_start_gcode" : { "default": "" },
|
||||||
"machine_end_gcode" : { "default": "" },
|
"machine_end_gcode" : { "default": "" },
|
||||||
"machine_width": { "default": 230 },
|
"machine_width": { "default": 230 },
|
||||||
|
@ -48,20 +48,20 @@
|
||||||
{
|
{
|
||||||
"default": [
|
"default": [
|
||||||
[
|
[
|
||||||
-40,
|
-42,
|
||||||
10
|
12
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
-40,
|
-42,
|
||||||
-30
|
-32
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
60,
|
62,
|
||||||
10
|
12
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
60,
|
62,
|
||||||
-30
|
-32
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -82,13 +82,12 @@
|
||||||
|
|
||||||
"machine_nozzle_tip_outer_diameter": { "default": 1.0 },
|
"machine_nozzle_tip_outer_diameter": { "default": 1.0 },
|
||||||
"machine_nozzle_head_distance": { "default": 3.0 },
|
"machine_nozzle_head_distance": { "default": 3.0 },
|
||||||
"machine_nozzle_expansion_angle": { "default": 45 }
|
"machine_nozzle_expansion_angle": { "default": 45 },
|
||||||
},
|
|
||||||
|
|
||||||
"overrides": {
|
|
||||||
"material_print_temperature": { "enabled": "False" },
|
"material_print_temperature": { "enabled": "False" },
|
||||||
"material_bed_temperature": { "enabled": "False" },
|
"material_bed_temperature": { "enabled": "False" },
|
||||||
"material_diameter": { "enabled": "False" },
|
"material_diameter": { "enabled": "False" },
|
||||||
"material_flow": { "enabled": "False" }
|
"material_flow": { "enabled": "False" },
|
||||||
|
"line_width": { "description": "The inner diameter of your printer's nozzle. If you are using an Olsson Block with a non-standard nozzle size then change this field to match the nozzle size you are using. Each line will be printed with this width in mind. The outer wall and top/bottom surface line widths may be set to a smaller value for higher surface quality. This field was previously named Line Width." }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
|
|
||||||
"inherits": "ultimaker2.json",
|
"inherits": "ultimaker2.json",
|
||||||
|
|
||||||
"machine_settings": {
|
"overrides": {
|
||||||
"machine_width": { "default": 230 },
|
"machine_width": { "default": 230 },
|
||||||
"machine_depth": { "default": 225 },
|
"machine_depth": { "default": 225 },
|
||||||
"machine_height": { "default": 315 }
|
"machine_height": { "default": 315 }
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
|
|
||||||
"inherits": "ultimaker2.json",
|
"inherits": "ultimaker2.json",
|
||||||
|
|
||||||
"machine_settings": {
|
"overrides": {
|
||||||
"machine_width": { "default": 120 },
|
"machine_width": { "default": 120 },
|
||||||
"machine_depth": { "default": 120 },
|
"machine_depth": { "default": 120 },
|
||||||
"machine_height": { "default": 115 },
|
"machine_height": { "default": 115 },
|
||||||
|
|
|
@ -16,8 +16,8 @@
|
||||||
"BedLeveling"
|
"BedLeveling"
|
||||||
],
|
],
|
||||||
|
|
||||||
"machine_extruder_trains": [
|
"machine_extruder_trains": {
|
||||||
{
|
"0": {
|
||||||
"machine_nozzle_size": {
|
"machine_nozzle_size": {
|
||||||
"default": 0.4
|
"default": 0.4
|
||||||
},
|
},
|
||||||
|
@ -40,8 +40,8 @@
|
||||||
"default": 16
|
"default": 16
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
},
|
||||||
"machine_settings": {
|
"overrides": {
|
||||||
"machine_width": { "default": 205 },
|
"machine_width": { "default": 205 },
|
||||||
"machine_height": { "default": 200 },
|
"machine_height": { "default": 200 },
|
||||||
"machine_depth": { "default": 205 },
|
"machine_depth": { "default": 205 },
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
"BedLeveling"
|
"BedLeveling"
|
||||||
],
|
],
|
||||||
|
|
||||||
"machine_settings": {
|
"overrides": {
|
||||||
"machine_heated_bed": { "default": true }
|
"machine_heated_bed": { "default": true }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
BIN
resources/meshes/bq_hephestos_platform.stl
Normal file
|
@ -3,4 +3,6 @@ version = 1
|
||||||
name = High Quality
|
name = High Quality
|
||||||
|
|
||||||
[settings]
|
[settings]
|
||||||
layer_height = 0.08
|
layer_height = 0.06
|
||||||
|
infill_sparse_density = 12
|
||||||
|
|
||||||
|
|
|
@ -4,3 +4,12 @@ name = Low Quality
|
||||||
|
|
||||||
[settings]
|
[settings]
|
||||||
layer_height = 0.15
|
layer_height = 0.15
|
||||||
|
shell_thickness = 0.8
|
||||||
|
infill_sparse_density = 8
|
||||||
|
speed_print = 60
|
||||||
|
speed_wall_0 = 40
|
||||||
|
speed_wall_x = 50
|
||||||
|
speed_topbottom = 30
|
||||||
|
speed_travel = 150
|
||||||
|
speed_layer_0 = 30
|
||||||
|
skirt_speed = 30
|
||||||
|
|
|
@ -3,4 +3,3 @@ version = 1
|
||||||
name = Normal Quality
|
name = Normal Quality
|
||||||
|
|
||||||
[settings]
|
[settings]
|
||||||
layer_height = 0.1
|
|
||||||
|
|
|
@ -3,4 +3,7 @@ version = 1
|
||||||
name = Ulti Quality
|
name = Ulti Quality
|
||||||
|
|
||||||
[settings]
|
[settings]
|
||||||
layer_height = 0.06
|
layer_height = 0.04
|
||||||
|
shell_thickness = 1.6
|
||||||
|
top_bottom_thickness = 0.8
|
||||||
|
infill_sparse_density = 14
|
||||||
|
|
|
@ -310,14 +310,24 @@ UM.MainWindow
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JobSpecs
|
||||||
|
{
|
||||||
|
anchors
|
||||||
|
{
|
||||||
|
bottom: parent.bottom;
|
||||||
|
right: sidebar.left;
|
||||||
|
bottomMargin: UM.Theme.sizes.default_margin.height;
|
||||||
|
rightMargin: UM.Theme.sizes.default_margin.width;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
UM.MessageStack
|
UM.MessageStack
|
||||||
{
|
{
|
||||||
anchors
|
anchors
|
||||||
{
|
{
|
||||||
horizontalCenter: parent.horizontalCenter
|
horizontalCenter: parent.horizontalCenter
|
||||||
horizontalCenterOffset: -(UM.Theme.sizes.logo.width/ 2)
|
horizontalCenterOffset: -(UM.Theme.sizes.sidebar.width/ 2)
|
||||||
top: parent.verticalCenter;
|
verticalCenter: parent.verticalCenter;
|
||||||
bottom: parent.bottom;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -330,8 +340,7 @@ UM.MainWindow
|
||||||
//anchors.bottom: parent.bottom
|
//anchors.bottom: parent.bottom
|
||||||
anchors.top: viewModeButton.bottom
|
anchors.top: viewModeButton.bottom
|
||||||
anchors.topMargin: UM.Theme.sizes.default_margin.height;
|
anchors.topMargin: UM.Theme.sizes.default_margin.height;
|
||||||
anchors.right: sidebar.left;
|
anchors.left: viewModeButton.left;
|
||||||
anchors.rightMargin: UM.Theme.sizes.window_margin.width;
|
|
||||||
//anchors.bottom: buttons.top;
|
//anchors.bottom: buttons.top;
|
||||||
//anchors.bottomMargin: UM.Theme.sizes.default_margin.height;
|
//anchors.bottomMargin: UM.Theme.sizes.default_margin.height;
|
||||||
|
|
||||||
|
@ -344,10 +353,9 @@ UM.MainWindow
|
||||||
{
|
{
|
||||||
id: openFileButton;
|
id: openFileButton;
|
||||||
//style: UM.Backend.progress < 0 ? UM.Theme.styles.open_file_button : UM.Theme.styles.tool_button;
|
//style: UM.Backend.progress < 0 ? UM.Theme.styles.open_file_button : UM.Theme.styles.tool_button;
|
||||||
//style: UM.Theme.styles.open_file_button
|
|
||||||
text: catalog.i18nc("@action:button","Open File");
|
text: catalog.i18nc("@action:button","Open File");
|
||||||
iconSource: UM.Theme.icons.load
|
iconSource: UM.Theme.icons.load
|
||||||
style: UM.Theme.styles.open_file_button
|
style: UM.Theme.styles.tool_button
|
||||||
tooltip: '';
|
tooltip: '';
|
||||||
anchors
|
anchors
|
||||||
{
|
{
|
||||||
|
@ -373,6 +381,7 @@ UM.MainWindow
|
||||||
source: UM.Theme.images.logo;
|
source: UM.Theme.images.logo;
|
||||||
width: UM.Theme.sizes.logo.width;
|
width: UM.Theme.sizes.logo.width;
|
||||||
height: UM.Theme.sizes.logo.height;
|
height: UM.Theme.sizes.logo.height;
|
||||||
|
z: -1;
|
||||||
|
|
||||||
sourceSize.width: width;
|
sourceSize.width: width;
|
||||||
sourceSize.height: height;
|
sourceSize.height: height;
|
||||||
|
@ -381,13 +390,12 @@ UM.MainWindow
|
||||||
Button
|
Button
|
||||||
{
|
{
|
||||||
id: viewModeButton
|
id: viewModeButton
|
||||||
property bool verticalTooltip: true
|
|
||||||
|
|
||||||
anchors
|
anchors
|
||||||
{
|
{
|
||||||
top: parent.top;
|
top: toolbar.bottom;
|
||||||
right: sidebar.left;
|
topMargin: UM.Theme.sizes.window_margin.height;
|
||||||
rightMargin: UM.Theme.sizes.window_margin.width;
|
left: parent.left;
|
||||||
}
|
}
|
||||||
text: catalog.i18nc("@action:button","View Mode");
|
text: catalog.i18nc("@action:button","View Mode");
|
||||||
iconSource: UM.Theme.icons.viewmode;
|
iconSource: UM.Theme.icons.viewmode;
|
||||||
|
@ -422,12 +430,9 @@ UM.MainWindow
|
||||||
id: toolbar;
|
id: toolbar;
|
||||||
|
|
||||||
anchors {
|
anchors {
|
||||||
left: parent.left
|
top: openFileButton.bottom;
|
||||||
top: parent.top
|
topMargin: UM.Theme.sizes.window_margin.height;
|
||||||
topMargin: UM.Theme.sizes.window_margin.height + UM.Theme.sizes.button.height
|
left: parent.left;
|
||||||
//horizontalCenter: parent.horizontalCenter
|
|
||||||
//horizontalCenterOffset: -(UM.Theme.sizes.sidebar.width / 2)
|
|
||||||
//top: parent.top;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -567,7 +572,7 @@ UM.MainWindow
|
||||||
|
|
||||||
addMachine.onTriggered: addMachineWizard.visible = true;
|
addMachine.onTriggered: addMachineWizard.visible = true;
|
||||||
|
|
||||||
preferences.onTriggered: { preferences.visible = true; }
|
preferences.onTriggered: { preferences.visible = true; preferences.setPage(0); }
|
||||||
configureMachines.onTriggered: { preferences.visible = true; preferences.setPage(3); }
|
configureMachines.onTriggered: { preferences.visible = true; preferences.setPage(3); }
|
||||||
manageProfiles.onTriggered: { preferences.visible = true; preferences.setPage(4); }
|
manageProfiles.onTriggered: { preferences.visible = true; preferences.setPage(4); }
|
||||||
|
|
||||||
|
@ -629,7 +634,7 @@ UM.MainWindow
|
||||||
id: openDialog;
|
id: openDialog;
|
||||||
|
|
||||||
//: File open dialog title
|
//: File open dialog title
|
||||||
title: catalog.i18nc("@title:window","Open File")
|
title: catalog.i18nc("@title:window","Open file")
|
||||||
modality: UM.Application.platform == "linux" ? Qt.NonModal : Qt.WindowModal;
|
modality: UM.Application.platform == "linux" ? Qt.NonModal : Qt.WindowModal;
|
||||||
//TODO: Support multiple file selection, workaround bug in KDE file dialog
|
//TODO: Support multiple file selection, workaround bug in KDE file dialog
|
||||||
//selectMultiple: true
|
//selectMultiple: true
|
||||||
|
|
|
@ -13,6 +13,18 @@ UM.PreferencesPage
|
||||||
//: General configuration page title
|
//: General configuration page title
|
||||||
title: catalog.i18nc("@title:tab","General");
|
title: catalog.i18nc("@title:tab","General");
|
||||||
|
|
||||||
|
function setDefaultLanguage(languageCode)
|
||||||
|
{
|
||||||
|
//loops trough the languageList and sets the language using the languageCode
|
||||||
|
for(var i = 0; i < languageList.count; i++)
|
||||||
|
{
|
||||||
|
if (languageComboBox.model.get(i).code == languageCode)
|
||||||
|
{
|
||||||
|
languageComboBox.currentIndex = i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function reset()
|
function reset()
|
||||||
{
|
{
|
||||||
UM.Preferences.resetPreference("general/language")
|
UM.Preferences.resetPreference("general/language")
|
||||||
|
@ -22,7 +34,8 @@ UM.PreferencesPage
|
||||||
pushFreeCheckbox.checked = boolCheck(UM.Preferences.getValue("physics/automatic_push_free"))
|
pushFreeCheckbox.checked = boolCheck(UM.Preferences.getValue("physics/automatic_push_free"))
|
||||||
sendDataCheckbox.checked = boolCheck(UM.Preferences.getValue("info/send_slice_info"))
|
sendDataCheckbox.checked = boolCheck(UM.Preferences.getValue("info/send_slice_info"))
|
||||||
scaleToFitCheckbox.checked = boolCheck(UM.Preferences.getValue("mesh/scale_to_fit"))
|
scaleToFitCheckbox.checked = boolCheck(UM.Preferences.getValue("mesh/scale_to_fit"))
|
||||||
languageComboBox.currentIndex = 0
|
var defaultLanguage = UM.Preferences.getValue("general/language")
|
||||||
|
setDefaultLanguage(defaultLanguage)
|
||||||
}
|
}
|
||||||
|
|
||||||
GridLayout
|
GridLayout
|
||||||
|
@ -44,16 +57,16 @@ UM.PreferencesPage
|
||||||
id: languageList
|
id: languageList
|
||||||
|
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
append({ text: catalog.i18nc("@item:inlistbox", "Bulgarian"), code: "bg" })
|
// append({ text: catalog.i18nc("@item:inlistbox", "Bulgarian"), code: "bg" })
|
||||||
append({ text: catalog.i18nc("@item:inlistbox", "Czech"), code: "cs" })
|
// append({ text: catalog.i18nc("@item:inlistbox", "Czech"), code: "cs" })
|
||||||
append({ text: catalog.i18nc("@item:inlistbox", "English"), code: "en" })
|
append({ text: catalog.i18nc("@item:inlistbox", "English"), code: "en" })
|
||||||
append({ text: catalog.i18nc("@item:inlistbox", "Finnish"), code: "fi" })
|
append({ text: catalog.i18nc("@item:inlistbox", "Finnish"), code: "fi" })
|
||||||
append({ text: catalog.i18nc("@item:inlistbox", "French"), code: "fr" })
|
append({ text: catalog.i18nc("@item:inlistbox", "French"), code: "fr" })
|
||||||
append({ text: catalog.i18nc("@item:inlistbox", "German"), code: "de" })
|
append({ text: catalog.i18nc("@item:inlistbox", "German"), code: "de" })
|
||||||
append({ text: catalog.i18nc("@item:inlistbox", "Italian"), code: "it" })
|
// append({ text: catalog.i18nc("@item:inlistbox", "Italian"), code: "it" })
|
||||||
append({ text: catalog.i18nc("@item:inlistbox", "Polish"), code: "pl" })
|
append({ text: catalog.i18nc("@item:inlistbox", "Polish"), code: "pl" })
|
||||||
append({ text: catalog.i18nc("@item:inlistbox", "Russian"), code: "ru" })
|
// append({ text: catalog.i18nc("@item:inlistbox", "Russian"), code: "ru" })
|
||||||
append({ text: catalog.i18nc("@item:inlistbox", "Spanish"), code: "es" })
|
// append({ text: catalog.i18nc("@item:inlistbox", "Spanish"), code: "es" })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
165
resources/qml/JobSpecs.qml
Normal file
|
@ -0,0 +1,165 @@
|
||||||
|
// Copyright (c) 2015 Ultimaker B.V.
|
||||||
|
// Cura is released under the terms of the AGPLv3 or higher.
|
||||||
|
|
||||||
|
import QtQuick 2.2
|
||||||
|
import QtQuick.Controls 1.1
|
||||||
|
import QtQuick.Controls.Styles 1.1
|
||||||
|
import QtQuick.Layouts 1.1
|
||||||
|
|
||||||
|
import UM 1.1 as UM
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: base;
|
||||||
|
|
||||||
|
property bool activity: Printer.getPlatformActivity;
|
||||||
|
property string fileBaseName
|
||||||
|
property variant activeMachineInstance: UM.MachineManager.activeMachineInstance
|
||||||
|
|
||||||
|
onActiveMachineInstanceChanged:
|
||||||
|
{
|
||||||
|
base.createFileName()
|
||||||
|
}
|
||||||
|
|
||||||
|
UM.I18nCatalog { id: catalog; name:"cura"}
|
||||||
|
|
||||||
|
property variant printDuration: PrintInformation.currentPrintTime;
|
||||||
|
property real printMaterialAmount: PrintInformation.materialAmount;
|
||||||
|
|
||||||
|
width: UM.Theme.sizes.jobspecs.width
|
||||||
|
height: childrenRect.height
|
||||||
|
color: "transparent"
|
||||||
|
|
||||||
|
function createFileName(){
|
||||||
|
var splitMachineName = UM.MachineManager.activeMachineInstance.split(" ")
|
||||||
|
var abbrMachine = ''
|
||||||
|
for (var i = 0; i < splitMachineName.length; i++){
|
||||||
|
if (splitMachineName[i].search(/ultimaker/i) != -1){
|
||||||
|
abbrMachine += 'UM'
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
if (splitMachineName[i].charAt(0).search(/[0-9]/g) == -1)
|
||||||
|
abbrMachine += splitMachineName[i].charAt(0)
|
||||||
|
}
|
||||||
|
var regExpAdditives = /[0-9\+]/g;
|
||||||
|
var resultAdditives = splitMachineName[i].match(regExpAdditives);
|
||||||
|
if (resultAdditives != null){
|
||||||
|
for (var j = 0; j < resultAdditives.length; j++){
|
||||||
|
abbrMachine += resultAdditives[j]
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printJobTextfield.text = abbrMachine + '_' + base.fileBaseName
|
||||||
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: openDialog
|
||||||
|
onHasMesh: {
|
||||||
|
if(base.fileBaseName == ''){
|
||||||
|
base.fileBaseName = name
|
||||||
|
base.createFileName()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onActivityChanged: {
|
||||||
|
if (activity == false){
|
||||||
|
base.fileBaseName = ''
|
||||||
|
base.createFileName()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TextField {
|
||||||
|
id: printJobTextfield
|
||||||
|
anchors.right: parent.right
|
||||||
|
height: UM.Theme.sizes.jobspecs_line.height
|
||||||
|
width: base.width
|
||||||
|
property int unremovableSpacing: 5
|
||||||
|
text: ''
|
||||||
|
horizontalAlignment: TextInput.AlignRight
|
||||||
|
onTextChanged: Printer.setJobName(text)
|
||||||
|
visible: base.activity
|
||||||
|
onEditingFinished: {
|
||||||
|
if (printJobTextfield.text != ''){
|
||||||
|
printJobTextfield.focus = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
validator: RegExpValidator {
|
||||||
|
regExp: /^[^\\ \/ \.]*$/
|
||||||
|
}
|
||||||
|
style: TextFieldStyle{
|
||||||
|
textColor: UM.Theme.colors.setting_control_text;
|
||||||
|
font: UM.Theme.fonts.default;
|
||||||
|
background: Rectangle {
|
||||||
|
opacity: 0
|
||||||
|
border.width: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Label{
|
||||||
|
id: boundingSpec
|
||||||
|
anchors.top: printJobTextfield.bottom
|
||||||
|
anchors.right: parent.right
|
||||||
|
height: UM.Theme.sizes.jobspecs_line.height
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
font: UM.Theme.fonts.small
|
||||||
|
color: UM.Theme.colors.text_subtext
|
||||||
|
text: Printer.getSceneBoundingBoxString
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: specsRow
|
||||||
|
anchors.top: boundingSpec.bottom
|
||||||
|
anchors.right: parent.right
|
||||||
|
height: UM.Theme.sizes.jobspecs_line.height
|
||||||
|
|
||||||
|
Item{
|
||||||
|
width: parent.width
|
||||||
|
height: parent.height
|
||||||
|
|
||||||
|
UM.RecolorImage {
|
||||||
|
id: timeIcon
|
||||||
|
anchors.right: timeSpec.left
|
||||||
|
anchors.rightMargin: UM.Theme.sizes.default_margin.width/2
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
width: UM.Theme.sizes.save_button_specs_icons.width
|
||||||
|
height: UM.Theme.sizes.save_button_specs_icons.height
|
||||||
|
sourceSize.width: width
|
||||||
|
sourceSize.height: width
|
||||||
|
color: UM.Theme.colors.text_subtext
|
||||||
|
source: UM.Theme.icons.print_time;
|
||||||
|
}
|
||||||
|
Label{
|
||||||
|
id: timeSpec
|
||||||
|
anchors.right: lengthIcon.left
|
||||||
|
anchors.rightMargin: UM.Theme.sizes.default_margin.width
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
font: UM.Theme.fonts.small
|
||||||
|
color: UM.Theme.colors.text_subtext
|
||||||
|
text: (!base.printDuration || !base.printDuration.valid) ? "00h 00min" : base.printDuration.getDisplayString(UM.DurationFormat.Short)
|
||||||
|
}
|
||||||
|
UM.RecolorImage {
|
||||||
|
id: lengthIcon
|
||||||
|
anchors.right: lengthSpec.left
|
||||||
|
anchors.rightMargin: UM.Theme.sizes.default_margin.width/2
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
width: UM.Theme.sizes.save_button_specs_icons.width
|
||||||
|
height: UM.Theme.sizes.save_button_specs_icons.height
|
||||||
|
sourceSize.width: width
|
||||||
|
sourceSize.height: width
|
||||||
|
color: UM.Theme.colors.text_subtext
|
||||||
|
source: UM.Theme.icons.category_material;
|
||||||
|
}
|
||||||
|
Label{
|
||||||
|
id: lengthSpec
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
font: UM.Theme.fonts.small
|
||||||
|
color: UM.Theme.colors.text_subtext
|
||||||
|
text: base.printMaterialAmount <= 0 ? "0.0 m" : catalog.i18nc("@label %1 is length of filament","%1 m").arg(base.printMaterialAmount)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -48,14 +48,14 @@ Item{
|
||||||
id: variantsSelectionMenu
|
id: variantsSelectionMenu
|
||||||
Instantiator
|
Instantiator
|
||||||
{
|
{
|
||||||
model: UM.MachineVariantsModel { }
|
model: UM.MachineVariantsModel { id: variantsModel }
|
||||||
MenuItem
|
MenuItem
|
||||||
{
|
{
|
||||||
text: model.name;
|
text: model.name;
|
||||||
checkable: true;
|
checkable: true;
|
||||||
checked: model.active;
|
checked: model.active;
|
||||||
exclusiveGroup: variantSelectionMenuGroup;
|
exclusiveGroup: variantSelectionMenuGroup;
|
||||||
onTriggered: UM.MachineManager.setActiveMachineVariant(model.getItem(index).name)
|
onTriggered: UM.MachineManager.setActiveMachineVariant(variantsModel.getItem(index).name)
|
||||||
}
|
}
|
||||||
onObjectAdded: variantsSelectionMenu.insertItem(index, object)
|
onObjectAdded: variantsSelectionMenu.insertItem(index, object)
|
||||||
onObjectRemoved: variantsSelectionMenu.removeItem(object)
|
onObjectRemoved: variantsSelectionMenu.removeItem(object)
|
||||||
|
@ -81,6 +81,7 @@ Item{
|
||||||
text: catalog.i18nc("@label","Global Profile:");
|
text: catalog.i18nc("@label","Global Profile:");
|
||||||
width: parent.width/100*45
|
width: parent.width/100*45
|
||||||
font: UM.Theme.fonts.default;
|
font: UM.Theme.fonts.default;
|
||||||
|
color: UM.Theme.colors.text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -10,187 +10,71 @@ import UM 1.1 as UM
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
id: base;
|
id: base;
|
||||||
|
UM.I18nCatalog { id: catalog; name:"cura"}
|
||||||
|
|
||||||
property real progress: UM.Backend.progress;
|
property real progress: UM.Backend.progress;
|
||||||
property bool activity: Printer.getPlatformActivity;
|
property bool activity: Printer.getPlatformActivity;
|
||||||
Behavior on progress { NumberAnimation { duration: 250; } }
|
//Behavior on progress { NumberAnimation { duration: 250; } }
|
||||||
property int totalHeight: childrenRect.height
|
property int totalHeight: childrenRect.height + UM.Theme.sizes.default_margin.height
|
||||||
property string fileBaseName
|
property string fileBaseName
|
||||||
property variant activeMachineInstance: UM.MachineManager.activeMachineInstance
|
property string statusText: {
|
||||||
|
if(progress == 0) {
|
||||||
onActiveMachineInstanceChanged:
|
if(!activity) {
|
||||||
{
|
return catalog.i18nc("@label:PrintjobStatus","Please load a 3d model");
|
||||||
base.createFileName()
|
} else {
|
||||||
}
|
return catalog.i18nc("@label:PrintjobStatus","Preparing to slice...");
|
||||||
|
|
||||||
UM.I18nCatalog { id: catalog; name:"cura"}
|
|
||||||
|
|
||||||
property variant printDuration: PrintInformation.currentPrintTime;
|
|
||||||
property real printMaterialAmount: PrintInformation.materialAmount;
|
|
||||||
|
|
||||||
function createFileName(){
|
|
||||||
var splitMachineName = UM.MachineManager.activeMachineInstance.split(" ")
|
|
||||||
var abbrMachine = ''
|
|
||||||
for (var i = 0; i < splitMachineName.length; i++){
|
|
||||||
if (splitMachineName[i].search(/ultimaker/i) != -1){
|
|
||||||
abbrMachine += 'UM'
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
if (splitMachineName[i].charAt(0).search(/[0-9]/g) == -1)
|
|
||||||
abbrMachine += splitMachineName[i].charAt(0)
|
|
||||||
}
|
|
||||||
var regExpAdditives = /[0-9\+]/g;
|
|
||||||
var resultAdditives = splitMachineName[i].match(regExpAdditives);
|
|
||||||
if (resultAdditives != null){
|
|
||||||
for (var j = 0; j < resultAdditives.length; j++){
|
|
||||||
abbrMachine += resultAdditives[j]
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
printJobTextfield.text = abbrMachine + '_' + base.fileBaseName
|
|
||||||
}
|
|
||||||
|
|
||||||
Connections {
|
|
||||||
target: openDialog
|
|
||||||
onHasMesh: {
|
|
||||||
if(base.fileBaseName == ''){
|
|
||||||
base.fileBaseName = name
|
|
||||||
base.createFileName()
|
|
||||||
}
|
}
|
||||||
|
} else if(base.progress < 0.99) {
|
||||||
|
return catalog.i18nc("@label:PrintjobStatus","Slicing...");
|
||||||
|
} else {
|
||||||
|
return catalog.i18nc("@label:PrintjobStatus","Ready to ") + UM.OutputDeviceManager.activeDeviceShortDescription;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onActivityChanged: {
|
Label {
|
||||||
if (activity == false){
|
id: statusLabel
|
||||||
base.fileBaseName = ''
|
width: parent.width - 2 * UM.Theme.sizes.default_margin.width
|
||||||
base.createFileName()
|
anchors.top: parent.top
|
||||||
}
|
anchors.left: parent.left
|
||||||
|
anchors.leftMargin: UM.Theme.sizes.default_margin.width
|
||||||
|
|
||||||
|
color: UM.Theme.colors.text
|
||||||
|
font: UM.Theme.fonts.large
|
||||||
|
text: statusText;
|
||||||
}
|
}
|
||||||
|
|
||||||
Rectangle{
|
Rectangle{
|
||||||
id: printJobRow
|
id: progressBar
|
||||||
implicitWidth: base.width;
|
width: parent.width - 2 * UM.Theme.sizes.default_margin.width
|
||||||
implicitHeight: UM.Theme.sizes.save_button_header.height
|
height: UM.Theme.sizes.progressbar.height
|
||||||
anchors.top: parent.top
|
anchors.top: statusLabel.bottom
|
||||||
color: UM.Theme.colors.sidebar_header_bar
|
anchors.topMargin: UM.Theme.sizes.default_margin.height/4
|
||||||
Label{
|
anchors.left: parent.left
|
||||||
id: printJobTextfieldLabel
|
anchors.leftMargin: UM.Theme.sizes.default_margin.width
|
||||||
text: catalog.i18nc("@label:textbox", "Printjob Name");
|
radius: UM.Theme.sizes.progressbar_radius.width
|
||||||
anchors.left: parent.left
|
color: UM.Theme.colors.progressbar_background
|
||||||
anchors.leftMargin: UM.Theme.sizes.default_margin.width;
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
font: UM.Theme.fonts.default;
|
|
||||||
color: UM.Theme.colors.text_white
|
|
||||||
}
|
|
||||||
TextField {
|
|
||||||
id: printJobTextfield
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.rightMargin: UM.Theme.sizes.default_margin.width;
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
width: parent.width/100*55
|
|
||||||
height: UM.Theme.sizes.sidebar_inputFields.height
|
|
||||||
property int unremovableSpacing: 5
|
|
||||||
text: ''
|
|
||||||
onTextChanged: Printer.setJobName(text)
|
|
||||||
onEditingFinished: {
|
|
||||||
if (printJobTextfield.text != ''){
|
|
||||||
printJobTextfield.focus = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
validator: RegExpValidator {
|
|
||||||
regExp: /^[^\\ \/ \.]*$/
|
|
||||||
}
|
|
||||||
style: TextFieldStyle{
|
|
||||||
textColor: UM.Theme.colors.setting_control_text;
|
|
||||||
font: UM.Theme.fonts.default;
|
|
||||||
background: Rectangle {
|
|
||||||
radius: 0
|
|
||||||
implicitWidth: parent.width
|
|
||||||
implicitHeight: parent.height
|
|
||||||
border.width: 1;
|
|
||||||
border.color: UM.Theme.colors.slider_groove_border;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
Rectangle{
|
||||||
id: specsRow
|
width: Math.max(parent.width * base.progress)
|
||||||
implicitWidth: base.width
|
|
||||||
implicitHeight: UM.Theme.sizes.sidebar_specs_bar.height
|
|
||||||
anchors.top: printJobRow.bottom
|
|
||||||
visible: base.progress > 0.99 && base.activity == true
|
|
||||||
Item{
|
|
||||||
id: time
|
|
||||||
width: childrenRect.width;
|
|
||||||
height: parent.height
|
height: parent.height
|
||||||
anchors.left: parent.left
|
color: UM.Theme.colors.progressbar_control
|
||||||
anchors.leftMargin: UM.Theme.sizes.default_margin.width
|
radius: UM.Theme.sizes.progressbar_radius.width
|
||||||
anchors.top: parent.top
|
visible: base.progress > 0.99 ? false : true
|
||||||
visible: base.printMaterialAmount > 0 ? true : false
|
|
||||||
UM.RecolorImage {
|
|
||||||
id: timeIcon
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
anchors.left: parent.left
|
|
||||||
width: UM.Theme.sizes.save_button_specs_icons.width
|
|
||||||
height: UM.Theme.sizes.save_button_specs_icons.height
|
|
||||||
sourceSize.width: width
|
|
||||||
sourceSize.height: width
|
|
||||||
color: UM.Theme.colors.text_hover
|
|
||||||
source: UM.Theme.icons.print_time;
|
|
||||||
}
|
|
||||||
Label{
|
|
||||||
id: timeSpec
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
anchors.left: timeIcon.right
|
|
||||||
anchors.leftMargin: UM.Theme.sizes.default_margin.width/2
|
|
||||||
font: UM.Theme.fonts.default
|
|
||||||
color: UM.Theme.colors.text
|
|
||||||
text: (!base.printDuration || !base.printDuration.valid) ? "" : base.printDuration.getDisplayString(UM.DurationFormat.Short)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Item{
|
|
||||||
width: parent.width / 100 * 55
|
|
||||||
height: parent.height
|
|
||||||
anchors.left: time.right
|
|
||||||
anchors.leftMargin: UM.Theme.sizes.default_margin.width;
|
|
||||||
anchors.top: parent.top
|
|
||||||
visible: base.printMaterialAmount > 0 ? true : false
|
|
||||||
UM.RecolorImage {
|
|
||||||
id: lengthIcon
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
anchors.left: parent.left
|
|
||||||
width: UM.Theme.sizes.save_button_specs_icons.width
|
|
||||||
height: UM.Theme.sizes.save_button_specs_icons.height
|
|
||||||
sourceSize.width: width
|
|
||||||
sourceSize.height: width
|
|
||||||
color: UM.Theme.colors.text_hover
|
|
||||||
source: UM.Theme.icons.category_material;
|
|
||||||
}
|
|
||||||
Label{
|
|
||||||
id: lengthSpec
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
anchors.left: lengthIcon.right
|
|
||||||
anchors.leftMargin: UM.Theme.sizes.default_margin.width/2
|
|
||||||
font: UM.Theme.fonts.default
|
|
||||||
color: UM.Theme.colors.text
|
|
||||||
text: base.printMaterialAmount <= 0 ? "" : catalog.i18nc("@label %1 is length of filament","%1 m").arg(base.printMaterialAmount)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Rectangle{
|
Rectangle{
|
||||||
id: saveRow
|
id: saveRow
|
||||||
width: base.width
|
width: base.width
|
||||||
height: saveToButton.height + (UM.Theme.sizes.default_margin.height / 2) // height + bottomMargin
|
height: saveToButton.height
|
||||||
anchors.top: specsRow.bottom
|
anchors.top: progressBar.bottom
|
||||||
|
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
|
|
||||||
Button {
|
Button {
|
||||||
id: saveToButton
|
id: saveToButton
|
||||||
property int resizedWidth
|
property int resizedWidth
|
||||||
x: base.width - saveToButton.resizedWidth - UM.Theme.sizes.default_margin.width - UM.Theme.sizes.save_button_save_to_button.height
|
x: base.width - saveToButton.resizedWidth - UM.Theme.sizes.default_margin.width - UM.Theme.sizes.save_button_save_to_button.height + 3
|
||||||
tooltip: UM.OutputDeviceManager.activeDeviceDescription;
|
tooltip: UM.OutputDeviceManager.activeDeviceDescription;
|
||||||
enabled: base.progress > 0.99 && base.activity == true
|
enabled: base.progress > 0.99 && base.activity == true
|
||||||
height: UM.Theme.sizes.save_button_save_to_button.height
|
height: UM.Theme.sizes.save_button_save_to_button.height
|
||||||
|
@ -206,39 +90,25 @@ Rectangle {
|
||||||
background: Rectangle {
|
background: Rectangle {
|
||||||
//opacity: control.enabled ? 1.0 : 0.5
|
//opacity: control.enabled ? 1.0 : 0.5
|
||||||
//Behavior on opacity { NumberAnimation { duration: 50; } }
|
//Behavior on opacity { NumberAnimation { duration: 50; } }
|
||||||
color: {
|
border.color: !control.enabled ? UM.Theme.colors.action_button_disabled_border :
|
||||||
if(!control.enabled){
|
control.pressed ? UM.Theme.colors.action_button_active_border :
|
||||||
return UM.Theme.colors.button;
|
control.hovered ? UM.Theme.colors.action_button_hovered_border : UM.Theme.colors.action_button_border
|
||||||
}
|
color: !control.enabled ? UM.Theme.colors.action_button_disabled :
|
||||||
else if(control.enabled && control.hovered) {
|
control.pressed ? UM.Theme.colors.action_button_active :
|
||||||
return UM.Theme.colors.load_save_button_hover
|
control.hovered ? UM.Theme.colors.action_button_hovered : UM.Theme.colors.action_button
|
||||||
} else {
|
|
||||||
return UM.Theme.colors.load_save_button
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Behavior on color { ColorAnimation { duration: 50; } }
|
Behavior on color { ColorAnimation { duration: 50; } }
|
||||||
width: {
|
width: {
|
||||||
var w = 0;
|
saveToButton.resizedWidth = actualLabel.width + (UM.Theme.sizes.default_margin.width * 2)
|
||||||
if (base.width*0.55 > actualLabel.width + (UM.Theme.sizes.default_margin.width * 2)){
|
return saveToButton.resizedWidth
|
||||||
saveToButton.resizedWidth = base.width*0.55
|
|
||||||
w = base.width*0.55
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
saveToButton.resizedWidth = actualLabel.width + (UM.Theme.sizes.default_margin.width * 2)
|
|
||||||
w = actualLabel.width + (UM.Theme.sizes.default_margin.width * 2)
|
|
||||||
}
|
|
||||||
if(w < base.width * 0.55) {
|
|
||||||
w = base.width * 0.55;
|
|
||||||
}
|
|
||||||
return w;
|
|
||||||
}
|
}
|
||||||
Label {
|
Label {
|
||||||
id: actualLabel
|
id: actualLabel
|
||||||
opacity: control.enabled ? 1.0 : 0.4
|
|
||||||
//Behavior on opacity { NumberAnimation { duration: 50; } }
|
//Behavior on opacity { NumberAnimation { duration: 50; } }
|
||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
color: UM.Theme.colors.load_save_button_text
|
color: !control.enabled ? UM.Theme.colors.action_button_disabled_text :
|
||||||
font: UM.Theme.fonts.default
|
control.pressed ? UM.Theme.colors.action_button_active_text :
|
||||||
|
control.hovered ? UM.Theme.colors.action_button_hovered_text : UM.Theme.colors.action_button_text
|
||||||
|
font: UM.Theme.fonts.action_button
|
||||||
text: control.text;
|
text: control.text;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -260,16 +130,12 @@ Rectangle {
|
||||||
style: ButtonStyle {
|
style: ButtonStyle {
|
||||||
background: Rectangle {
|
background: Rectangle {
|
||||||
id: deviceSelectionIcon
|
id: deviceSelectionIcon
|
||||||
color: {
|
border.color: !control.enabled ? UM.Theme.colors.action_button_disabled_border :
|
||||||
if(!control.enabled){
|
control.pressed ? UM.Theme.colors.action_button_active_border :
|
||||||
return UM.Theme.colors.button;
|
control.hovered ? UM.Theme.colors.action_button_hovered_border : UM.Theme.colors.action_button_border
|
||||||
}
|
color: !control.enabled ? UM.Theme.colors.action_button_disabled :
|
||||||
else if(control.enabled && control.hovered) {
|
control.pressed ? UM.Theme.colors.action_button_active :
|
||||||
return UM.Theme.colors.load_save_button_hover
|
control.hovered ? UM.Theme.colors.action_button_hovered : UM.Theme.colors.action_button
|
||||||
} else {
|
|
||||||
return UM.Theme.colors.load_save_button
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Behavior on color { ColorAnimation { duration: 50; } }
|
Behavior on color { ColorAnimation { duration: 50; } }
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.leftMargin: UM.Theme.sizes.save_button_text_margin.width / 2;
|
anchors.leftMargin: UM.Theme.sizes.save_button_text_margin.width / 2;
|
||||||
|
@ -282,9 +148,11 @@ Rectangle {
|
||||||
width: UM.Theme.sizes.standard_arrow.width
|
width: UM.Theme.sizes.standard_arrow.width
|
||||||
height: UM.Theme.sizes.standard_arrow.height
|
height: UM.Theme.sizes.standard_arrow.height
|
||||||
sourceSize.width: width
|
sourceSize.width: width
|
||||||
sourceSize.height: width
|
sourceSize.height: height
|
||||||
color: UM.Theme.colors.load_save_button_text
|
color: !control.enabled ? UM.Theme.colors.action_button_disabled_text :
|
||||||
source: UM.Theme.icons.arrow_bottom
|
control.pressed ? UM.Theme.colors.action_button_active_text :
|
||||||
|
control.hovered ? UM.Theme.colors.action_button_hovered_text : UM.Theme.colors.action_button_text;
|
||||||
|
source: UM.Theme.icons.arrow_bottom;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
label: Label{ }
|
label: Label{ }
|
||||||
|
|
|
@ -15,6 +15,7 @@ Rectangle
|
||||||
property Action addMachineAction;
|
property Action addMachineAction;
|
||||||
property Action configureMachinesAction;
|
property Action configureMachinesAction;
|
||||||
property Action manageProfilesAction;
|
property Action manageProfilesAction;
|
||||||
|
property int currentModeIndex;
|
||||||
|
|
||||||
color: UM.Theme.colors.sidebar;
|
color: UM.Theme.colors.sidebar;
|
||||||
UM.I18nCatalog { id: catalog; name:"cura"}
|
UM.I18nCatalog { id: catalog; name:"cura"}
|
||||||
|
@ -49,38 +50,118 @@ Rectangle
|
||||||
|
|
||||||
addMachineAction: base.addMachineAction;
|
addMachineAction: base.addMachineAction;
|
||||||
configureMachinesAction: base.configureMachinesAction;
|
configureMachinesAction: base.configureMachinesAction;
|
||||||
modesModel: modesListModel;
|
}
|
||||||
|
|
||||||
currentModeIndex:
|
Rectangle {
|
||||||
{
|
id: headerSeparator
|
||||||
var index = parseInt(UM.Preferences.getValue("cura/active_mode"))
|
width: parent.width
|
||||||
if(index)
|
height: UM.Theme.sizes.sidebar_lining.height
|
||||||
{
|
color: UM.Theme.colors.sidebar_lining
|
||||||
return index;
|
anchors.top: header.bottom
|
||||||
}
|
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
onCurrentModeIndexChanged: UM.Preferences.setValue("cura/active_mode", currentModeIndex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ProfileSetup {
|
ProfileSetup {
|
||||||
id: profileItem
|
id: profileItem
|
||||||
manageProfilesAction: base.manageProfilesAction
|
manageProfilesAction: base.manageProfilesAction
|
||||||
anchors.top: header.bottom
|
anchors.top: settingsModeSelection.bottom
|
||||||
|
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||||
width: parent.width
|
width: parent.width
|
||||||
height: totalHeightProfileSetup
|
height: totalHeightProfileSetup
|
||||||
}
|
}
|
||||||
|
|
||||||
|
currentModeIndex:
|
||||||
|
{
|
||||||
|
var index = parseInt(UM.Preferences.getValue("cura/active_mode"))
|
||||||
|
if(index)
|
||||||
|
{
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
onCurrentModeIndexChanged:
|
||||||
|
{
|
||||||
|
UM.Preferences.setValue("cura/active_mode", currentModeIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
Label {
|
||||||
|
id: settingsModeLabel
|
||||||
|
text: catalog.i18nc("@label:listbox","Setup");
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.leftMargin: UM.Theme.sizes.default_margin.width;
|
||||||
|
anchors.top: headerSeparator.bottom
|
||||||
|
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||||
|
width: parent.width/100*45
|
||||||
|
font: UM.Theme.fonts.large;
|
||||||
|
color: UM.Theme.colors.text
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: settingsModeSelection
|
||||||
|
width: parent.width/100*55
|
||||||
|
height: UM.Theme.sizes.sidebar_header_mode_toggle.height
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.rightMargin: UM.Theme.sizes.default_margin.width
|
||||||
|
anchors.top: headerSeparator.bottom
|
||||||
|
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||||
|
Component{
|
||||||
|
id: wizardDelegate
|
||||||
|
Button {
|
||||||
|
height: settingsModeSelection.height
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.leftMargin: model.index * (settingsModeSelection.width / 2)
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
width: parent.width / 2
|
||||||
|
text: model.text
|
||||||
|
exclusiveGroup: modeMenuGroup;
|
||||||
|
checkable: true;
|
||||||
|
checked: base.currentModeIndex == index
|
||||||
|
onClicked: base.currentModeIndex = index
|
||||||
|
|
||||||
|
style: ButtonStyle {
|
||||||
|
background: Rectangle {
|
||||||
|
border.color: control.checked ? UM.Theme.colors.toggle_checked_border :
|
||||||
|
control.pressed ? UM.Theme.colors.toggle_active_border :
|
||||||
|
control.hovered ? UM.Theme.colors.toggle_hovered_border : UM.Theme.colors.toggle_unchecked_border
|
||||||
|
color: control.checked ? UM.Theme.colors.toggle_checked :
|
||||||
|
control.pressed ? UM.Theme.colors.toggle_active :
|
||||||
|
control.hovered ? UM.Theme.colors.toggle_hovered : UM.Theme.colors.toggle_unchecked
|
||||||
|
Behavior on color { ColorAnimation { duration: 50; } }
|
||||||
|
Label {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
color: control.checked ? UM.Theme.colors.toggle_checked_text :
|
||||||
|
control.pressed ? UM.Theme.colors.toggle_active_text :
|
||||||
|
control.hovered ? UM.Theme.colors.toggle_hovered_text : UM.Theme.colors.toggle_unchecked_text
|
||||||
|
font: UM.Theme.fonts.default
|
||||||
|
text: control.text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
label: Item { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ExclusiveGroup { id: modeMenuGroup; }
|
||||||
|
ListView{
|
||||||
|
id: modesList
|
||||||
|
property var index: 0
|
||||||
|
model: modesListModel
|
||||||
|
delegate: wizardDelegate
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.left: parent.left
|
||||||
|
width: parent.width
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Loader
|
Loader
|
||||||
{
|
{
|
||||||
id: sidebarContents;
|
id: sidebarContents;
|
||||||
anchors.bottom: saveButton.top
|
anchors.bottom: footerSeparator.top
|
||||||
anchors.top: profileItem.bottom
|
anchors.top: profileItem.bottom
|
||||||
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||||
anchors.left: base.left
|
anchors.left: base.left
|
||||||
anchors.right: base.right
|
anchors.right: base.right
|
||||||
|
|
||||||
source: modesListModel.count > header.currentModeIndex ? modesListModel.get(header.currentModeIndex).file : "";
|
source: modesListModel.count > base.currentModeIndex ? modesListModel.get(base.currentModeIndex).file : "";
|
||||||
|
|
||||||
property Item sidebar: base;
|
property Item sidebar: base;
|
||||||
|
|
||||||
|
@ -101,6 +182,15 @@ Rectangle
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: footerSeparator
|
||||||
|
width: parent.width
|
||||||
|
height: UM.Theme.sizes.sidebar_lining.height
|
||||||
|
color: UM.Theme.colors.sidebar_lining
|
||||||
|
anchors.bottom: saveButton.top
|
||||||
|
anchors.bottomMargin: UM.Theme.sizes.default_margin.height
|
||||||
|
}
|
||||||
|
|
||||||
SaveButton
|
SaveButton
|
||||||
{
|
{
|
||||||
id: saveButton;
|
id: saveButton;
|
||||||
|
@ -123,6 +213,6 @@ Rectangle
|
||||||
{
|
{
|
||||||
modesListModel.append({ text: catalog.i18nc("@title:tab", "Simple"), file: "SidebarSimple.qml" })
|
modesListModel.append({ text: catalog.i18nc("@title:tab", "Simple"), file: "SidebarSimple.qml" })
|
||||||
modesListModel.append({ text: catalog.i18nc("@title:tab", "Advanced"), file: "SidebarAdvanced.qml" })
|
modesListModel.append({ text: catalog.i18nc("@title:tab", "Advanced"), file: "SidebarAdvanced.qml" })
|
||||||
sidebarContents.setSource(modesListModel.get(header.currentModeIndex).file)
|
sidebarContents.setSource(modesListModel.get(base.currentModeIndex).file)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,8 +11,6 @@ Item
|
||||||
{
|
{
|
||||||
id: base;
|
id: base;
|
||||||
// Machine Setup
|
// Machine Setup
|
||||||
property variant modesModel;
|
|
||||||
property int currentModeIndex: 0;
|
|
||||||
property Action addMachineAction;
|
property Action addMachineAction;
|
||||||
property Action configureMachinesAction;
|
property Action configureMachinesAction;
|
||||||
UM.I18nCatalog { id: catalog; name:"cura"}
|
UM.I18nCatalog { id: catalog; name:"cura"}
|
||||||
|
@ -21,74 +19,28 @@ Item
|
||||||
Rectangle {
|
Rectangle {
|
||||||
id: settingsModeRow
|
id: settingsModeRow
|
||||||
width: base.width
|
width: base.width
|
||||||
height: UM.Theme.sizes.sidebar_header.height
|
height: 0
|
||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
color: UM.Theme.colors.sidebar_header_bar
|
color: UM.Theme.colors.sidebar_header_bar
|
||||||
|
}
|
||||||
|
|
||||||
Label{
|
Label{
|
||||||
id: settingsModeLabel
|
id: printjobTabLabel
|
||||||
text: catalog.i18nc("@label:listbox","Print Setup");
|
text: catalog.i18nc("@label:listbox","Print Job");
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.leftMargin: UM.Theme.sizes.default_margin.width;
|
anchors.leftMargin: UM.Theme.sizes.default_margin.width;
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.top: settingsModeRow.bottom
|
||||||
width: parent.width/100*45
|
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||||
font: UM.Theme.fonts.default;
|
width: parent.width/100*45
|
||||||
color: UM.Theme.colors.text_white
|
font: UM.Theme.fonts.large;
|
||||||
}
|
color: UM.Theme.colors.text
|
||||||
|
|
||||||
Rectangle{
|
|
||||||
id: settingsModeSelection
|
|
||||||
width: parent.width/100*55
|
|
||||||
height: UM.Theme.sizes.sidebar_header_mode_toggle.height
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.rightMargin: UM.Theme.sizes.default_margin.width;
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
Component{
|
|
||||||
id: wizardDelegate
|
|
||||||
Button {
|
|
||||||
height: settingsModeSelection.height
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.leftMargin: model.index * (settingsModeSelection.width / 2)
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
width: parent.width / 2
|
|
||||||
text: model.text
|
|
||||||
exclusiveGroup: modeMenuGroup;
|
|
||||||
checkable: true;
|
|
||||||
checked: base.currentModeIndex == index
|
|
||||||
onClicked: base.currentModeIndex = index
|
|
||||||
style: ButtonStyle {
|
|
||||||
background: Rectangle {
|
|
||||||
color: control.checked ? UM.Theme.colors.toggle_active : UM.Theme.colors.toggle_disabled
|
|
||||||
Behavior on color { ColorAnimation { duration: 50; } }
|
|
||||||
Label {
|
|
||||||
anchors.centerIn: parent
|
|
||||||
color: control.checked ? UM.Theme.colors.toggle_active_text : UM.Theme.colors.toggle_disabled_text
|
|
||||||
font: UM.Theme.fonts.default
|
|
||||||
text: control.text;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
label: Item { }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ExclusiveGroup { id: modeMenuGroup; }
|
|
||||||
ListView{
|
|
||||||
id: modesList
|
|
||||||
property var index: 0
|
|
||||||
model: base.modesModel
|
|
||||||
delegate: wizardDelegate
|
|
||||||
anchors.top: parent.top
|
|
||||||
anchors.left: parent.left
|
|
||||||
width: parent.width
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
id: machineSelectionRow
|
id: machineSelectionRow
|
||||||
width: base.width
|
width: base.width
|
||||||
height: UM.Theme.sizes.sidebar_setup.height
|
height: UM.Theme.sizes.sidebar_setup.height
|
||||||
anchors.top: settingsModeRow.bottom
|
anchors.top: printjobTabLabel.bottom
|
||||||
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
|
||||||
|
@ -100,6 +52,7 @@ Item
|
||||||
anchors.leftMargin: UM.Theme.sizes.default_margin.width
|
anchors.leftMargin: UM.Theme.sizes.default_margin.width
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
font: UM.Theme.fonts.default;
|
font: UM.Theme.fonts.default;
|
||||||
|
color: UM.Theme.colors.text;
|
||||||
}
|
}
|
||||||
|
|
||||||
ToolButton {
|
ToolButton {
|
||||||
|
|
|
@ -13,6 +13,9 @@ Item
|
||||||
id: base;
|
id: base;
|
||||||
anchors.fill: parent;
|
anchors.fill: parent;
|
||||||
|
|
||||||
|
signal showTooltip(Item item, point location, string text);
|
||||||
|
signal hideTooltip();
|
||||||
|
|
||||||
property Action configureSettings;
|
property Action configureSettings;
|
||||||
property variant minimumPrintTime: PrintInformation.minimumPrintTime;
|
property variant minimumPrintTime: PrintInformation.minimumPrintTime;
|
||||||
property variant maximumPrintTime: PrintInformation.maximumPrintTime;
|
property variant maximumPrintTime: PrintInformation.maximumPrintTime;
|
||||||
|
@ -20,12 +23,110 @@ Item
|
||||||
Component.onCompleted: PrintInformation.enabled = true
|
Component.onCompleted: PrintInformation.enabled = true
|
||||||
Component.onDestruction: PrintInformation.enabled = false
|
Component.onDestruction: PrintInformation.enabled = false
|
||||||
UM.I18nCatalog { id: catalog; name:"cura"}
|
UM.I18nCatalog { id: catalog; name:"cura"}
|
||||||
|
/*
|
||||||
|
Rectangle{
|
||||||
|
id: speedCellLeft
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.left: parent.left
|
||||||
|
width: base.width/100*35 - UM.Theme.sizes.default_margin.width
|
||||||
|
height: childrenRect.height
|
||||||
|
|
||||||
|
Label{
|
||||||
|
id: speedLabel
|
||||||
|
//: Speed selection label
|
||||||
|
text: catalog.i18nc("@label","Speed:");
|
||||||
|
font: UM.Theme.fonts.default;
|
||||||
|
color: UM.Theme.colors.text;
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.leftMargin: UM.Theme.sizes.default_margin.width
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: speedCellRight
|
||||||
|
anchors.left: speedCellLeft.right
|
||||||
|
anchors.top: speedCellLeft.top
|
||||||
|
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||||
|
width: parent.width/100*65 - UM.Theme.sizes.default_margin.width
|
||||||
|
height: childrenRect.height
|
||||||
|
|
||||||
|
CheckBox{
|
||||||
|
id: normalSpeedCheckBox
|
||||||
|
property bool hovered_ex: false
|
||||||
|
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.left: parent.left
|
||||||
|
|
||||||
|
//: Normal speed checkbox
|
||||||
|
text: catalog.i18nc("@option:check","Normal");
|
||||||
|
style: UM.Theme.styles.checkbox;
|
||||||
|
|
||||||
|
exclusiveGroup: speedCheckBoxGroup
|
||||||
|
checked: UM.ActiveProfile.valid ? UM.ActiveProfile.settingValues.speed_print <= 60 : true;
|
||||||
|
MouseArea {
|
||||||
|
anchors.fill: parent
|
||||||
|
hoverEnabled: true
|
||||||
|
onClicked:
|
||||||
|
{
|
||||||
|
UM.MachineManager.setSettingValue("speed_print", 60)
|
||||||
|
}
|
||||||
|
onEntered:
|
||||||
|
{
|
||||||
|
parent.hovered_ex = true
|
||||||
|
base.showTooltip(normalSpeedCheckBox, Qt.point(-speedCellRight.x, parent.height),
|
||||||
|
catalog.i18nc("@label", "Use normal printing speed. This will result in high quality prints."));
|
||||||
|
}
|
||||||
|
onExited:
|
||||||
|
{
|
||||||
|
parent.hovered_ex = false
|
||||||
|
base.hideTooltip();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CheckBox{
|
||||||
|
id: highSpeedCheckBox
|
||||||
|
property bool hovered_ex: false
|
||||||
|
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.left: normalSpeedCheckBox.right
|
||||||
|
anchors.leftMargin: UM.Theme.sizes.default_margin.width
|
||||||
|
|
||||||
|
//: High speed checkbox
|
||||||
|
text: catalog.i18nc("@option:check","Fast");
|
||||||
|
style: UM.Theme.styles.checkbox;
|
||||||
|
|
||||||
|
exclusiveGroup: speedCheckBoxGroup
|
||||||
|
checked: UM.ActiveProfile.valid ? UM.ActiveProfile.settingValues.speed_print > 60 : true;
|
||||||
|
MouseArea {
|
||||||
|
anchors.fill: parent
|
||||||
|
hoverEnabled: true
|
||||||
|
onClicked:
|
||||||
|
{
|
||||||
|
UM.MachineManager.setSettingValue("speed_print", 100)
|
||||||
|
}
|
||||||
|
onEntered:
|
||||||
|
{
|
||||||
|
parent.hovered_ex = true
|
||||||
|
base.showTooltip(normalSpeedCheckBox, Qt.point(-speedCellRight.x, parent.height),
|
||||||
|
catalog.i18nc("@label", "Use high printing speed. This will reduce printing time, but may affect the quality of the print."));
|
||||||
|
}
|
||||||
|
onExited:
|
||||||
|
{
|
||||||
|
parent.hovered_ex = false
|
||||||
|
base.hideTooltip();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ExclusiveGroup { id: speedCheckBoxGroup; }
|
||||||
|
}
|
||||||
|
*/
|
||||||
Rectangle{
|
Rectangle{
|
||||||
id: infillCellLeft
|
id: infillCellLeft
|
||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
width: base.width/100* 55 - UM.Theme.sizes.default_margin.width
|
width: base.width/100* 35 - UM.Theme.sizes.default_margin.width
|
||||||
height: childrenRect.height < UM.Theme.sizes.simple_mode_infill_caption.height ? UM.Theme.sizes.simple_mode_infill_caption.height : childrenRect.height
|
height: childrenRect.height < UM.Theme.sizes.simple_mode_infill_caption.height ? UM.Theme.sizes.simple_mode_infill_caption.height : childrenRect.height
|
||||||
|
|
||||||
Label{
|
Label{
|
||||||
|
@ -33,33 +134,34 @@ Item
|
||||||
//: Infill selection label
|
//: Infill selection label
|
||||||
text: catalog.i18nc("@label","Infill:");
|
text: catalog.i18nc("@label","Infill:");
|
||||||
font: UM.Theme.fonts.default;
|
font: UM.Theme.fonts.default;
|
||||||
|
color: UM.Theme.colors.text;
|
||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.leftMargin: UM.Theme.sizes.default_margin.width
|
anchors.leftMargin: UM.Theme.sizes.default_margin.width
|
||||||
}
|
}
|
||||||
Label{
|
/* Label{
|
||||||
id: infillCaption
|
id: infillCaption
|
||||||
width: infillCellLeft.width - UM.Theme.sizes.default_margin.width
|
width: infillCellLeft.width - UM.Theme.sizes.default_margin.width * 2
|
||||||
text: infillModel.count > 0 && infillListView.activeIndex != -1 ? infillModel.get(infillListView.activeIndex).text : ""
|
text: infillModel.count > 0 && infillListView.activeIndex != -1 ? infillModel.get(infillListView.activeIndex).text : ""
|
||||||
font: UM.Theme.fonts.caption
|
font: UM.Theme.fonts.caption
|
||||||
wrapMode: Text.Wrap
|
wrapMode: Text.Wrap
|
||||||
color: UM.Theme.colors.text
|
color: UM.Theme.colors.text_subtext
|
||||||
anchors.top: infillLabel.bottom
|
anchors.top: infillLabel.bottom
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.leftMargin: UM.Theme.sizes.default_margin.width
|
anchors.leftMargin: UM.Theme.sizes.default_margin.width
|
||||||
}
|
} */
|
||||||
}
|
}
|
||||||
|
|
||||||
Flow {
|
Flow {
|
||||||
id: infillCellRight
|
id: infillCellRight
|
||||||
|
|
||||||
height: childrenRect.height;
|
height: childrenRect.height;
|
||||||
width: base.width / 100 * 45
|
width: base.width / 100 * 65
|
||||||
|
spacing: UM.Theme.sizes.default_margin.width
|
||||||
|
|
||||||
anchors.right: parent.right
|
anchors.left: infillCellLeft.right
|
||||||
anchors.rightMargin: UM.Theme.sizes.default_margin.width - (UM.Theme.sizes.default_margin.width/4)
|
anchors.top: infillCellLeft.top
|
||||||
anchors.top: parent.top
|
|
||||||
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||||
|
|
||||||
Repeater {
|
Repeater {
|
||||||
|
@ -90,28 +192,41 @@ Item
|
||||||
Rectangle{
|
Rectangle{
|
||||||
id: infillIconLining
|
id: infillIconLining
|
||||||
|
|
||||||
width: infillCellRight.width / 3 - UM.Theme.sizes.default_margin.width;
|
width: (infillCellRight.width - 3 * UM.Theme.sizes.default_margin.width) / 4;
|
||||||
height: width
|
height: width
|
||||||
|
|
||||||
border.color: infillListView.activeIndex == index ? UM.Theme.colors.setting_control_text : UM.Theme.colors.setting_control_border
|
border.color: (infillListView.activeIndex == index) ? UM.Theme.colors.setting_control_selected :
|
||||||
border.width: infillListView.activeIndex == index ? 2 : 1
|
(mousearea.containsMouse ? UM.Theme.colors.setting_control_border_highlight : UM.Theme.colors.setting_control_border)
|
||||||
color: infillListView.activeIndex == index ? UM.Theme.colors.setting_category_active : "transparent"
|
border.width: UM.Theme.sizes.default_lining.width
|
||||||
|
color: infillListView.activeIndex == index ? UM.Theme.colors.setting_control_selected : "transparent"
|
||||||
|
|
||||||
Image {
|
UM.RecolorImage {
|
||||||
id: infillIcon
|
id: infillIcon
|
||||||
anchors.fill: parent;
|
anchors.fill: parent;
|
||||||
anchors.margins: UM.Theme.sizes.default_margin.width / 2
|
anchors.margins: UM.Theme.sizes.infill_button_margin.width
|
||||||
|
|
||||||
sourceSize.width: width
|
sourceSize.width: width
|
||||||
sourceSize.height: width
|
sourceSize.height: width
|
||||||
source: UM.Theme.icons[model.icon];
|
source: UM.Theme.icons[model.icon];
|
||||||
|
color: (infillListView.activeIndex == index) ? UM.Theme.colors.text_white : UM.Theme.colors.text
|
||||||
}
|
}
|
||||||
|
|
||||||
MouseArea {
|
MouseArea {
|
||||||
|
id: mousearea
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
hoverEnabled: true
|
||||||
onClicked: {
|
onClicked: {
|
||||||
infillListView.activeIndex = index
|
if (infillListView.activeIndex != index)
|
||||||
UM.MachineManager.setSettingValue("infill_sparse_density", model.percentage)
|
{
|
||||||
|
infillListView.activeIndex = index
|
||||||
|
UM.MachineManager.setSettingValue("infill_sparse_density", model.percentage)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
onEntered: {
|
||||||
|
base.showTooltip(infillCellRight, Qt.point(-infillCellRight.x, parent.height), model.text);
|
||||||
|
}
|
||||||
|
onExited: {
|
||||||
|
base.hideTooltip();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -131,9 +246,15 @@ Item
|
||||||
Component.onCompleted:
|
Component.onCompleted:
|
||||||
{
|
{
|
||||||
infillModel.append({
|
infillModel.append({
|
||||||
name: catalog.i18nc("@label", "Sparse"),
|
name: catalog.i18nc("@label", "Hollow"),
|
||||||
|
percentage: 0,
|
||||||
|
text: catalog.i18nc("@label", "No (0%) infill will leave your model hollow at the cost of low strength"),
|
||||||
|
icon: "hollow"
|
||||||
|
})
|
||||||
|
infillModel.append({
|
||||||
|
name: catalog.i18nc("@label", "Light"),
|
||||||
percentage: 20,
|
percentage: 20,
|
||||||
text: catalog.i18nc("@label", "Sparse (20%) infill will give your model an average strength"),
|
text: catalog.i18nc("@label", "Light (20%) infill will give your model an average strength"),
|
||||||
icon: "sparse"
|
icon: "sparse"
|
||||||
})
|
})
|
||||||
infillModel.append({
|
infillModel.append({
|
||||||
|
@ -157,7 +278,7 @@ Item
|
||||||
anchors.top: infillCellRight.bottom
|
anchors.top: infillCellRight.bottom
|
||||||
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
width: parent.width/100*45 - UM.Theme.sizes.default_margin.width
|
width: parent.width/100*35 - UM.Theme.sizes.default_margin.width
|
||||||
height: childrenRect.height
|
height: childrenRect.height
|
||||||
|
|
||||||
Label{
|
Label{
|
||||||
|
@ -166,44 +287,81 @@ Item
|
||||||
//: Helpers selection label
|
//: Helpers selection label
|
||||||
text: catalog.i18nc("@label:listbox","Helpers:");
|
text: catalog.i18nc("@label:listbox","Helpers:");
|
||||||
font: UM.Theme.fonts.default;
|
font: UM.Theme.fonts.default;
|
||||||
|
color: UM.Theme.colors.text;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Rectangle {
|
Rectangle {
|
||||||
id: helpersCellRight
|
id: helpersCellRight
|
||||||
anchors.top: helpersCellLeft.top
|
anchors.top: helpersCellLeft.top
|
||||||
anchors.left: helpersCellLeft.right
|
anchors.left: helpersCellLeft.right
|
||||||
width: parent.width/100*55 - UM.Theme.sizes.default_margin.width
|
width: parent.width/100*65 - UM.Theme.sizes.default_margin.width
|
||||||
height: childrenRect.height
|
height: childrenRect.height
|
||||||
|
|
||||||
CheckBox{
|
CheckBox{
|
||||||
id: skirtCheckBox
|
id: brimCheckBox
|
||||||
|
property bool hovered_ex: false
|
||||||
|
|
||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
|
|
||||||
//: Setting enable skirt adhesion checkbox
|
//: Setting enable skirt adhesion checkbox
|
||||||
text: catalog.i18nc("@option:check","Enable Skirt Adhesion");
|
text: catalog.i18nc("@option:check","Generate Brim");
|
||||||
style: UM.Theme.styles.checkbox;
|
style: UM.Theme.styles.checkbox;
|
||||||
|
|
||||||
checked: UM.ActiveProfile.valid ? UM.ActiveProfile.settingValues.adhesion_type == "brim" : false;
|
checked: UM.ActiveProfile.valid ? UM.ActiveProfile.settingValues.adhesion_type == "brim" : false;
|
||||||
onClicked:
|
MouseArea {
|
||||||
{
|
anchors.fill: parent
|
||||||
UM.MachineManager.setSettingValue("adhesion_type", "brim")
|
hoverEnabled: true
|
||||||
|
onClicked:
|
||||||
|
{
|
||||||
|
parent.checked = !parent.checked
|
||||||
|
UM.MachineManager.setSettingValue("adhesion_type", parent.checked?"brim":"skirt")
|
||||||
|
}
|
||||||
|
onEntered:
|
||||||
|
{
|
||||||
|
parent.hovered_ex = true
|
||||||
|
base.showTooltip(brimCheckBox, Qt.point(-helpersCellRight.x, parent.height),
|
||||||
|
catalog.i18nc("@label", "Enable printing a brim. This will add a single-layer-thick flat area around your object which is easy to cut off afterwards."));
|
||||||
|
}
|
||||||
|
onExited:
|
||||||
|
{
|
||||||
|
parent.hovered_ex = false
|
||||||
|
base.hideTooltip();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CheckBox{
|
CheckBox{
|
||||||
anchors.top: skirtCheckBox.bottom
|
id: supportCheckBox
|
||||||
|
property bool hovered_ex: false
|
||||||
|
|
||||||
|
anchors.top: brimCheckBox.bottom
|
||||||
anchors.topMargin: UM.Theme.sizes.default_lining.height
|
anchors.topMargin: UM.Theme.sizes.default_lining.height
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
|
|
||||||
//: Setting enable support checkbox
|
//: Setting enable support checkbox
|
||||||
text: catalog.i18nc("@option:check","Enable Support");
|
text: catalog.i18nc("@option:check","Generate Support Structure");
|
||||||
|
|
||||||
style: UM.Theme.styles.checkbox;
|
style: UM.Theme.styles.checkbox;
|
||||||
|
|
||||||
checked: UM.ActiveProfile.valid ? UM.ActiveProfile.settingValues.support_enable : false;
|
checked: UM.ActiveProfile.valid ? UM.ActiveProfile.settingValues.support_enable : false;
|
||||||
onClicked:
|
MouseArea {
|
||||||
{
|
anchors.fill: parent
|
||||||
UM.MachineManager.setSettingValue("support_enable", checked)
|
hoverEnabled: true
|
||||||
|
onClicked:
|
||||||
|
{
|
||||||
|
parent.checked = !parent.checked
|
||||||
|
UM.MachineManager.setSettingValue("support_enable", parent.checked)
|
||||||
|
}
|
||||||
|
onEntered:
|
||||||
|
{
|
||||||
|
parent.hovered_ex = true
|
||||||
|
base.showTooltip(supportCheckBox, Qt.point(-helpersCellRight.x, parent.height),
|
||||||
|
catalog.i18nc("@label", "Enable printing support structures. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air."));
|
||||||
|
}
|
||||||
|
onExited:
|
||||||
|
{
|
||||||
|
parent.hovered_ex = false
|
||||||
|
base.hideTooltip();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,13 +8,15 @@ import QtQuick.Layouts 1.1
|
||||||
|
|
||||||
import UM 1.0 as UM
|
import UM 1.0 as UM
|
||||||
|
|
||||||
Rectangle {
|
UM.PointingRectangle {
|
||||||
id: base;
|
id: base;
|
||||||
|
|
||||||
width: UM.Theme.sizes.tooltip.width;
|
width: UM.Theme.sizes.tooltip.width;
|
||||||
height: label.height + UM.Theme.sizes.tooltip_margins.height * 2;
|
height: label.height + UM.Theme.sizes.tooltip_margins.height * 2;
|
||||||
color: UM.Theme.colors.tooltip;
|
color: UM.Theme.colors.tooltip;
|
||||||
|
|
||||||
|
arrowSize: UM.Theme.sizes.default_arrow.width
|
||||||
|
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
Behavior on opacity { NumberAnimation { duration: 100; } }
|
Behavior on opacity { NumberAnimation { duration: 100; } }
|
||||||
|
|
||||||
|
@ -26,9 +28,10 @@ Rectangle {
|
||||||
y = parent.height - base.height;
|
y = parent.height - base.height;
|
||||||
} else {
|
} else {
|
||||||
x = position.x - base.width;
|
x = position.x - base.width;
|
||||||
y = position.y;
|
y = position.y - UM.Theme.sizes.tooltip_arrow_margins.height;
|
||||||
}
|
}
|
||||||
base.opacity = 1;
|
base.opacity = 1;
|
||||||
|
target = Qt.point(40 , position.y)
|
||||||
}
|
}
|
||||||
|
|
||||||
function hide() {
|
function hide() {
|
||||||
|
@ -47,5 +50,6 @@ Rectangle {
|
||||||
}
|
}
|
||||||
wrapMode: Text.Wrap;
|
wrapMode: Text.Wrap;
|
||||||
font: UM.Theme.fonts.default;
|
font: UM.Theme.fonts.default;
|
||||||
|
color: UM.Theme.colors.tooltip_text;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ Item {
|
||||||
|
|
||||||
anchors.bottom: parent.bottom;
|
anchors.bottom: parent.bottom;
|
||||||
anchors.left: parent.left;
|
anchors.left: parent.left;
|
||||||
spacing: UM.Theme.sizes.default_lining.width
|
spacing: UM.Theme.sizes.button_lining.width
|
||||||
|
|
||||||
Repeater {
|
Repeater {
|
||||||
id: repeat
|
id: repeat
|
||||||
|
@ -50,20 +50,17 @@ Item {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Rectangle {
|
UM.PointingRectangle {
|
||||||
width: base.width
|
id: panelBorder;
|
||||||
height: base.height
|
|
||||||
z: parent.z - 1
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
|
||||||
color: UM.Theme.colors.lining
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: panelBackground;
|
|
||||||
|
|
||||||
anchors.left: parent.right;
|
anchors.left: parent.right;
|
||||||
y: base.activeY
|
anchors.leftMargin: UM.Theme.sizes.default_margin.width;
|
||||||
|
anchors.top: base.top;
|
||||||
|
anchors.topMargin: base.activeY
|
||||||
|
z: buttons.z -1
|
||||||
|
|
||||||
|
target: Qt.point(parent.right, base.activeY + UM.Theme.sizes.button.height/2)
|
||||||
|
arrowSize: UM.Theme.sizes.default_arrow.width
|
||||||
|
|
||||||
width: {
|
width: {
|
||||||
if (panel.item && panel.width > 0){
|
if (panel.item && panel.width > 0){
|
||||||
|
@ -78,9 +75,20 @@ Item {
|
||||||
opacity: panel.item ? 1 : 0
|
opacity: panel.item ? 1 : 0
|
||||||
Behavior on opacity { NumberAnimation { duration: 100 } }
|
Behavior on opacity { NumberAnimation { duration: 100 } }
|
||||||
|
|
||||||
color: UM.Theme.colors.tool_panel_background;
|
color: UM.Theme.colors.lining;
|
||||||
border.width: UM.Theme.sizes.default_lining.width
|
//border.width: UM.Theme.sizes.default_lining.width
|
||||||
border.color: UM.Theme.colors.lining
|
//border.color: UM.Theme.colors.lining
|
||||||
|
|
||||||
|
UM.PointingRectangle {
|
||||||
|
id: panelBackground;
|
||||||
|
|
||||||
|
color: UM.Theme.colors.tool_panel_background;
|
||||||
|
anchors.fill: parent
|
||||||
|
anchors.margins: UM.Theme.sizes.default_lining.width
|
||||||
|
|
||||||
|
target: Qt.point(-UM.Theme.sizes.default_margin.width, UM.Theme.sizes.button.height/2)
|
||||||
|
arrowSize: parent.arrowSize
|
||||||
|
}
|
||||||
|
|
||||||
Loader {
|
Loader {
|
||||||
id: panel
|
id: panel
|
||||||
|
|
|
@ -7,8 +7,6 @@ import QtQuick.Window 2.1
|
||||||
import QtQuick.Controls.Styles 1.1
|
import QtQuick.Controls.Styles 1.1
|
||||||
|
|
||||||
import UM 1.1 as UM
|
import UM 1.1 as UM
|
||||||
import Cura 1.0 as Cura
|
|
||||||
import ".."
|
|
||||||
|
|
||||||
Item
|
Item
|
||||||
{
|
{
|
||||||
|
@ -18,18 +16,69 @@ Item
|
||||||
|
|
||||||
property variant wizard: null;
|
property variant wizard: null;
|
||||||
|
|
||||||
|
property bool visibility: base.wizard.visible
|
||||||
|
onVisibilityChanged:
|
||||||
|
{
|
||||||
|
machineName.text = getMachineName()
|
||||||
|
errorMessage.show = false
|
||||||
|
}
|
||||||
|
|
||||||
|
function editMachineName(word)
|
||||||
|
{
|
||||||
|
//Adds '#2' at the end or increases the number by 1 if the word ends with '#' and 1 or more digits
|
||||||
|
var regEx = /[#][\d]+$///ends with '#' and then 1 or more digit
|
||||||
|
var result = word.match(regEx)
|
||||||
|
|
||||||
|
if (result != null)
|
||||||
|
{
|
||||||
|
result = result[0].split('')
|
||||||
|
|
||||||
|
var numberString = ''
|
||||||
|
for (var i = 1; i < result.length; i++){//starting at 1, makes it ignore the '#'
|
||||||
|
numberString += result[i]
|
||||||
|
}
|
||||||
|
var newNumber = Number(numberString) + 1
|
||||||
|
|
||||||
|
var newWord = word.replace(/[\d]+$/, newNumber)//replaces the last digits in the string by the same number + 1
|
||||||
|
return newWord
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return word + ' #2'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getMachineName()
|
||||||
|
{
|
||||||
|
var name = machineList.model.getItem(machineList.currentIndex).name
|
||||||
|
|
||||||
|
//if the automatically assigned name is not unique, the editMachineName function keeps editing it untill it is.
|
||||||
|
while (UM.MachineManager.checkInstanceExists(name) != false)
|
||||||
|
{
|
||||||
|
name = editMachineName(name)
|
||||||
|
}
|
||||||
|
return name
|
||||||
|
}
|
||||||
|
|
||||||
Connections
|
Connections
|
||||||
{
|
{
|
||||||
target: base.wizard
|
target: base.wizard
|
||||||
onNextClicked: //You can add functions here that get triggered when the final button is clicked in the wizard-element
|
onNextClicked: //You can add functions here that get triggered when the final button is clicked in the wizard-element
|
||||||
{
|
{
|
||||||
var old_page_count = base.wizard.getPageCount()
|
var name = machineName.text
|
||||||
// Delete old pages (if any)
|
if (UM.MachineManager.checkInstanceExists(name) != false)
|
||||||
for (var i = old_page_count - 1; i > 0; i--)
|
|
||||||
{
|
{
|
||||||
base.wizard.removePage(i)
|
errorMessage.show = true
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var old_page_count = base.wizard.getPageCount()
|
||||||
|
// Delete old pages (if any)
|
||||||
|
for (var i = old_page_count - 1; i > 0; i--)
|
||||||
|
{
|
||||||
|
base.wizard.removePage(i)
|
||||||
|
}
|
||||||
|
saveMachine()
|
||||||
}
|
}
|
||||||
saveMachine()
|
|
||||||
}
|
}
|
||||||
onBackClicked:
|
onBackClicked:
|
||||||
{
|
{
|
||||||
|
@ -63,7 +112,8 @@ Item
|
||||||
{
|
{
|
||||||
id: machinesHolder
|
id: machinesHolder
|
||||||
|
|
||||||
anchors{
|
anchors
|
||||||
|
{
|
||||||
left: parent.left;
|
left: parent.left;
|
||||||
top: subTitle.bottom;
|
top: subTitle.bottom;
|
||||||
right: parent.right;
|
right: parent.right;
|
||||||
|
@ -110,6 +160,7 @@ Item
|
||||||
onClicked: {
|
onClicked: {
|
||||||
base.activeManufacturer = section;
|
base.activeManufacturer = section;
|
||||||
machineList.currentIndex = machineList.model.find("manufacturer", section)
|
machineList.currentIndex = machineList.model.find("manufacturer", section)
|
||||||
|
machineName.text = getMachineName()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -128,7 +179,10 @@ Item
|
||||||
|
|
||||||
text: model.name
|
text: model.name
|
||||||
|
|
||||||
onClicked: ListView.view.currentIndex = index;
|
onClicked: {
|
||||||
|
ListView.view.currentIndex = index;
|
||||||
|
machineName.text = getMachineName()
|
||||||
|
}
|
||||||
|
|
||||||
Label
|
Label
|
||||||
{
|
{
|
||||||
|
@ -169,11 +223,33 @@ Item
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Item
|
|
||||||
|
|
||||||
|
Column
|
||||||
{
|
{
|
||||||
id: machineNameHolder
|
id: machineNameHolder
|
||||||
height: childrenRect.height
|
|
||||||
anchors.bottom: parent.bottom;
|
anchors.bottom: parent.bottom;
|
||||||
|
//height: insertNameLabel.lineHeight * (2 + errorMessage.lineCount)
|
||||||
|
|
||||||
|
Item
|
||||||
|
{
|
||||||
|
height: errorMessage.lineHeight
|
||||||
|
anchors.bottom: insertNameLabel.top
|
||||||
|
anchors.bottomMargin: insertNameLabel.height * errorMessage.lineCount
|
||||||
|
Label
|
||||||
|
{
|
||||||
|
id: errorMessage
|
||||||
|
property bool show: false
|
||||||
|
width: base.width
|
||||||
|
height: errorMessage.show ? errorMessage.lineHeight : 0
|
||||||
|
visible: errorMessage.show
|
||||||
|
text: catalog.i18nc("@label", "This printer name has already been used. Please choose a different printer name.");
|
||||||
|
wrapMode: Text.WordWrap
|
||||||
|
Behavior on height {NumberAnimation {duration: 75; }}
|
||||||
|
color: UM.Theme.colors.error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Label
|
Label
|
||||||
{
|
{
|
||||||
id: insertNameLabel
|
id: insertNameLabel
|
||||||
|
@ -182,8 +258,7 @@ Item
|
||||||
TextField
|
TextField
|
||||||
{
|
{
|
||||||
id: machineName;
|
id: machineName;
|
||||||
anchors.top: insertNameLabel.bottom
|
text: getMachineName()
|
||||||
text: machineList.model.getItem(machineList.currentIndex).name
|
|
||||||
implicitWidth: UM.Theme.sizes.standard_list_input.width
|
implicitWidth: UM.Theme.sizes.standard_list_input.width
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -218,6 +293,9 @@ Item
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(base.wizard.lastPage == true){
|
||||||
|
base.wizard.visible = false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,8 @@ import QtQuick.Layouts 1.1
|
||||||
import QtQuick.Window 2.1
|
import QtQuick.Window 2.1
|
||||||
|
|
||||||
import UM 1.1 as UM
|
import UM 1.1 as UM
|
||||||
|
import Cura 1.0 as Cura
|
||||||
|
import ".."
|
||||||
|
|
||||||
Item
|
Item
|
||||||
{
|
{
|
||||||
|
@ -15,11 +17,22 @@ Item
|
||||||
property bool three_point_leveling: true
|
property bool three_point_leveling: true
|
||||||
property int platform_width: UM.MachineManager.getSettingValue("machine_width")
|
property int platform_width: UM.MachineManager.getSettingValue("machine_width")
|
||||||
property int platform_height: UM.MachineManager.getSettingValue("machine_depth")
|
property int platform_height: UM.MachineManager.getSettingValue("machine_depth")
|
||||||
property bool alreadyTested: base.addOriginalProgress.bedLeveling
|
|
||||||
anchors.fill: parent;
|
anchors.fill: parent;
|
||||||
property variant printer_connection: UM.USBPrinterManager.connectedPrinterList.getItem(0).printer
|
property variant printer_connection: UM.USBPrinterManager.connectedPrinterList.getItem(0).printer
|
||||||
Component.onCompleted: printer_connection.homeHead()
|
Component.onCompleted: printer_connection.homeHead()
|
||||||
UM.I18nCatalog { id: catalog; name:"cura"}
|
UM.I18nCatalog { id: catalog; name:"cura"}
|
||||||
|
property variant wizard: null;
|
||||||
|
|
||||||
|
Connections
|
||||||
|
{
|
||||||
|
target: wizardPage.wizard
|
||||||
|
onNextClicked: //You can add functions here that get triggered when the final button is clicked in the wizard-element
|
||||||
|
{
|
||||||
|
if(wizardPage.wizard.lastPage == true){
|
||||||
|
wizardPage.wizard.visible = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Label
|
Label
|
||||||
{
|
{
|
||||||
|
@ -61,7 +74,6 @@ Item
|
||||||
id: bedlevelingButton
|
id: bedlevelingButton
|
||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
enabled: !alreadyTested
|
|
||||||
text: catalog.i18nc("@action:button","Move to Next Position");
|
text: catalog.i18nc("@action:button","Move to Next Position");
|
||||||
onClicked:
|
onClicked:
|
||||||
{
|
{
|
||||||
|
@ -79,7 +91,6 @@ Item
|
||||||
}
|
}
|
||||||
wizardPage.leveling_state++
|
wizardPage.leveling_state++
|
||||||
if (wizardPage.leveling_state >= 3){
|
if (wizardPage.leveling_state >= 3){
|
||||||
base.addOriginalProgress.bedLeveling = true
|
|
||||||
resultText.visible = true
|
resultText.visible = true
|
||||||
skipBedlevelingButton.enabled = false
|
skipBedlevelingButton.enabled = false
|
||||||
bedlevelingButton.enabled = false
|
bedlevelingButton.enabled = false
|
||||||
|
@ -91,7 +102,6 @@ Item
|
||||||
Button
|
Button
|
||||||
{
|
{
|
||||||
id: skipBedlevelingButton
|
id: skipBedlevelingButton
|
||||||
enabled: !alreadyTested
|
|
||||||
anchors.top: parent.width < wizardPage.width ? parent.top : bedlevelingButton.bottom
|
anchors.top: parent.width < wizardPage.width ? parent.top : bedlevelingButton.bottom
|
||||||
anchors.topMargin: parent.width < wizardPage.width ? 0 : UM.Theme.sizes.default_margin.height/2
|
anchors.topMargin: parent.width < wizardPage.width ? 0 : UM.Theme.sizes.default_margin.height/2
|
||||||
anchors.left: parent.width < wizardPage.width ? bedlevelingButton.right : parent.left
|
anchors.left: parent.width < wizardPage.width ? bedlevelingButton.right : parent.left
|
||||||
|
@ -104,13 +114,13 @@ Item
|
||||||
Label
|
Label
|
||||||
{
|
{
|
||||||
id: resultText
|
id: resultText
|
||||||
visible: alreadyTested
|
visible: false
|
||||||
anchors.top: bedlevelingWrapper.bottom
|
anchors.top: bedlevelingWrapper.bottom
|
||||||
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
width: parent.width
|
width: parent.width
|
||||||
wrapMode: Text.WordWrap
|
wrapMode: Text.WordWrap
|
||||||
text: catalog.i18nc("@label", "Everythink is in order! You're done with bedeleveling.")
|
text: catalog.i18nc("@label", "Everything is in order! You're done with bedleveling.")
|
||||||
}
|
}
|
||||||
|
|
||||||
function threePointLeveling(width, height)
|
function threePointLeveling(width, height)
|
||||||
|
|
|
@ -17,11 +17,8 @@ Item
|
||||||
|
|
||||||
Component.onDestruction:
|
Component.onDestruction:
|
||||||
{
|
{
|
||||||
base.addOriginalProgress.upgrades[0] = extruderCheckBox.checked
|
|
||||||
base.addOriginalProgress.upgrades[1] = heatedBedCheckBox1.checked
|
|
||||||
base.addOriginalProgress.upgrades[2] = heatedBedCheckBox2.checked
|
|
||||||
if (extruderCheckBox.checked == true){
|
if (extruderCheckBox.checked == true){
|
||||||
UM.MachineManager.setMachineSettingValue("machine_extruder_drive_upgrade", true);
|
UM.MachineManager.setMachineSettingValue("machine_extruder_drive_upgrade", true)
|
||||||
}
|
}
|
||||||
if (heatedBedCheckBox1.checked == true || heatedBedCheckBox2.checked == true){
|
if (heatedBedCheckBox1.checked == true || heatedBedCheckBox2.checked == true){
|
||||||
UM.MachineManager.setMachineSettingValue("machine_heated_bed", true)
|
UM.MachineManager.setMachineSettingValue("machine_heated_bed", true)
|
||||||
|
@ -58,14 +55,14 @@ Item
|
||||||
{
|
{
|
||||||
id: extruderCheckBox
|
id: extruderCheckBox
|
||||||
text: catalog.i18nc("@option:check","Extruder driver ugrades")
|
text: catalog.i18nc("@option:check","Extruder driver ugrades")
|
||||||
checked: base.addOriginalProgress.upgrades[0]
|
checked: true
|
||||||
}
|
}
|
||||||
CheckBox
|
CheckBox
|
||||||
{
|
{
|
||||||
id: heatedBedCheckBox1
|
id: heatedBedCheckBox1
|
||||||
text: catalog.i18nc("@option:check","Heated printer bed (standard kit)")
|
text: catalog.i18nc("@option:check","Heated printer bed")
|
||||||
y: extruderCheckBox.height * 1
|
y: extruderCheckBox.height * 1
|
||||||
checked: base.addOriginalProgress.upgrades[1]
|
checked: false
|
||||||
onClicked: {
|
onClicked: {
|
||||||
if (heatedBedCheckBox2.checked == true)
|
if (heatedBedCheckBox2.checked == true)
|
||||||
heatedBedCheckBox2.checked = false
|
heatedBedCheckBox2.checked = false
|
||||||
|
@ -76,7 +73,7 @@ Item
|
||||||
id: heatedBedCheckBox2
|
id: heatedBedCheckBox2
|
||||||
text: catalog.i18nc("@option:check","Heated printer bed (self built)")
|
text: catalog.i18nc("@option:check","Heated printer bed (self built)")
|
||||||
y: extruderCheckBox.height * 2
|
y: extruderCheckBox.height * 2
|
||||||
checked: base.addOriginalProgress.upgrades[2]
|
checked: false
|
||||||
onClicked: {
|
onClicked: {
|
||||||
if (heatedBedCheckBox1.checked == true)
|
if (heatedBedCheckBox1.checked == true)
|
||||||
heatedBedCheckBox1.checked = false
|
heatedBedCheckBox1.checked = false
|
||||||
|
|
|
@ -14,35 +14,40 @@ Item
|
||||||
property int leftRow: wizardPage.width*0.40
|
property int leftRow: wizardPage.width*0.40
|
||||||
property int rightRow: wizardPage.width*0.60
|
property int rightRow: wizardPage.width*0.60
|
||||||
anchors.fill: parent;
|
anchors.fill: parent;
|
||||||
property bool alreadyTested: base.addOriginalProgress.checkUp[base.addOriginalProgress.checkUp.length-1]
|
|
||||||
property bool x_min_pressed: false
|
property bool x_min_pressed: false
|
||||||
property bool y_min_pressed: false
|
property bool y_min_pressed: false
|
||||||
property bool z_min_pressed: false
|
property bool z_min_pressed: false
|
||||||
property bool heater_works: false
|
property bool heater_works: false
|
||||||
property int extruder_target_temp: 0
|
property int extruder_target_temp: 0
|
||||||
property int bed_target_temp: 0
|
property int bed_target_temp: 0
|
||||||
|
UM.I18nCatalog { id: catalog; name:"cura"}
|
||||||
|
property var checkupProgress: {
|
||||||
|
"connection": false,
|
||||||
|
"endstopX": wizardPage.x_min_pressed,
|
||||||
|
"endstopY": wizardPage.y_min_pressed,
|
||||||
|
"endstopZ": wizardPage.z_min_pressed,
|
||||||
|
"nozzleTemp": false,
|
||||||
|
"bedTemp": false
|
||||||
|
}
|
||||||
|
|
||||||
property variant printer_connection: {
|
property variant printer_connection: {
|
||||||
if (UM.USBPrinterManager.connectedPrinterList.rowCount() != 0){
|
if (UM.USBPrinterManager.connectedPrinterList.rowCount() != 0){
|
||||||
base.addOriginalProgress.checkUp[0] = true
|
wizardPage.checkupProgress.connection = true
|
||||||
checkTotalCheckUp()
|
|
||||||
return UM.USBPrinterManager.connectedPrinterList.getItem(0).printer
|
return UM.USBPrinterManager.connectedPrinterList.getItem(0).printer
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//property variant printer_connection: UM.USBPrinterManager.connectedPrinterList.getItem(0).printer
|
|
||||||
UM.I18nCatalog { id: catalog; name:"cura"}
|
|
||||||
|
|
||||||
function checkTotalCheckUp(){
|
function checkTotalCheckUp(){
|
||||||
var allDone = true
|
var allDone = true
|
||||||
for (var i = 0; i < (base.addOriginalProgress.checkUp.length - 1); i++){
|
for(var property in checkupProgress){
|
||||||
if (base.addOriginalProgress.checkUp[i] == false){
|
if (checkupProgress[property] == false){
|
||||||
allDone = false
|
allDone = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (allDone == true){
|
if (allDone == true){
|
||||||
base.addOriginalProgress.checkUp[base.addOriginalProgress.checkUp.length] = true
|
|
||||||
skipCheckButton.enabled = false
|
skipCheckButton.enabled = false
|
||||||
resultText.visible = true
|
resultText.visible = true
|
||||||
}
|
}
|
||||||
|
@ -91,7 +96,7 @@ Item
|
||||||
id: startCheckButton
|
id: startCheckButton
|
||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
enabled: !alreadyTested
|
//enabled: !alreadyTested
|
||||||
text: catalog.i18nc("@action:button","Start Printer Check");
|
text: catalog.i18nc("@action:button","Start Printer Check");
|
||||||
onClicked: {
|
onClicked: {
|
||||||
checkupContent.visible = true
|
checkupContent.visible = true
|
||||||
|
@ -107,7 +112,7 @@ Item
|
||||||
anchors.topMargin: parent.width < wizardPage.width ? 0 : UM.Theme.sizes.default_margin.height/2
|
anchors.topMargin: parent.width < wizardPage.width ? 0 : UM.Theme.sizes.default_margin.height/2
|
||||||
anchors.left: parent.width < wizardPage.width ? startCheckButton.right : parent.left
|
anchors.left: parent.width < wizardPage.width ? startCheckButton.right : parent.left
|
||||||
anchors.leftMargin: parent.width < wizardPage.width ? UM.Theme.sizes.default_margin.width : 0
|
anchors.leftMargin: parent.width < wizardPage.width ? UM.Theme.sizes.default_margin.width : 0
|
||||||
enabled: !alreadyTested
|
//enabled: !alreadyTested
|
||||||
text: catalog.i18nc("@action:button","Skip Printer Check");
|
text: catalog.i18nc("@action:button","Skip Printer Check");
|
||||||
onClicked: {
|
onClicked: {
|
||||||
base.currentPage += 1
|
base.currentPage += 1
|
||||||
|
@ -119,7 +124,7 @@ Item
|
||||||
id: checkupContent
|
id: checkupContent
|
||||||
anchors.top: startStopButtons.bottom
|
anchors.top: startStopButtons.bottom
|
||||||
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||||
visible: alreadyTested
|
visible: false
|
||||||
//////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////
|
||||||
Label
|
Label
|
||||||
{
|
{
|
||||||
|
@ -156,7 +161,7 @@ Item
|
||||||
anchors.left: endstopXLabel.right
|
anchors.left: endstopXLabel.right
|
||||||
anchors.top: connectionLabel.bottom
|
anchors.top: connectionLabel.bottom
|
||||||
wrapMode: Text.WordWrap
|
wrapMode: Text.WordWrap
|
||||||
text: x_min_pressed || base.addOriginalProgress.checkUp[1] ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked")
|
text: x_min_pressed ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked")
|
||||||
}
|
}
|
||||||
//////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////
|
||||||
Label
|
Label
|
||||||
|
@ -175,7 +180,7 @@ Item
|
||||||
anchors.left: endstopYLabel.right
|
anchors.left: endstopYLabel.right
|
||||||
anchors.top: endstopXLabel.bottom
|
anchors.top: endstopXLabel.bottom
|
||||||
wrapMode: Text.WordWrap
|
wrapMode: Text.WordWrap
|
||||||
text: y_min_pressed || base.addOriginalProgress.checkUp[2] ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked")
|
text: y_min_pressed ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked")
|
||||||
}
|
}
|
||||||
/////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////
|
||||||
Label
|
Label
|
||||||
|
@ -194,7 +199,7 @@ Item
|
||||||
anchors.left: endstopZLabel.right
|
anchors.left: endstopZLabel.right
|
||||||
anchors.top: endstopYLabel.bottom
|
anchors.top: endstopYLabel.bottom
|
||||||
wrapMode: Text.WordWrap
|
wrapMode: Text.WordWrap
|
||||||
text: z_min_pressed || base.addOriginalProgress.checkUp[3] ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked")
|
text: z_min_pressed ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked")
|
||||||
}
|
}
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
Label
|
Label
|
||||||
|
@ -233,14 +238,9 @@ Item
|
||||||
{
|
{
|
||||||
if(printer_connection != null)
|
if(printer_connection != null)
|
||||||
{
|
{
|
||||||
if (alreadyTested){
|
nozzleTempStatus.text = catalog.i18nc("@info:progress","Checking")
|
||||||
nozzleTempStatus.text = catalog.i18nc("@info:status","Works")
|
printer_connection.heatupNozzle(190)
|
||||||
}
|
wizardPage.extruder_target_temp = 190
|
||||||
else {
|
|
||||||
nozzleTempStatus.text = catalog.i18nc("@info:progress","Checking")
|
|
||||||
printer_connection.heatupNozzle(190)
|
|
||||||
wizardPage.extruder_target_temp = 190
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -294,14 +294,9 @@ Item
|
||||||
{
|
{
|
||||||
if(printer_connection != null)
|
if(printer_connection != null)
|
||||||
{
|
{
|
||||||
if (alreadyTested){
|
bedTempStatus.text = catalog.i18nc("@info:progress","Checking")
|
||||||
bedTempStatus.text = catalog.i18nc("@info:status","Works")
|
printer_connection.heatupBed(60)
|
||||||
}
|
wizardPage.bed_target_temp = 60
|
||||||
else {
|
|
||||||
bedTempStatus.text = catalog.i18nc("@info:progress","Checking")
|
|
||||||
printer_connection.heatupBed(60)
|
|
||||||
wizardPage.bed_target_temp = 60
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -320,7 +315,7 @@ Item
|
||||||
Label
|
Label
|
||||||
{
|
{
|
||||||
id: resultText
|
id: resultText
|
||||||
visible: base.addOriginalProgress.checkUp[base.addOriginalProgress.checkUp.length-1]
|
visible: false
|
||||||
anchors.top: bedTemp.bottom
|
anchors.top: bedTemp.bottom
|
||||||
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
|
@ -338,19 +333,16 @@ Item
|
||||||
{
|
{
|
||||||
if(key == "x_min")
|
if(key == "x_min")
|
||||||
{
|
{
|
||||||
base.addOriginalProgress.checkUp[1] = true
|
|
||||||
x_min_pressed = true
|
x_min_pressed = true
|
||||||
checkTotalCheckUp()
|
checkTotalCheckUp()
|
||||||
}
|
}
|
||||||
if(key == "y_min")
|
if(key == "y_min")
|
||||||
{
|
{
|
||||||
base.addOriginalProgress.checkUp[2] = true
|
|
||||||
y_min_pressed = true
|
y_min_pressed = true
|
||||||
checkTotalCheckUp()
|
checkTotalCheckUp()
|
||||||
}
|
}
|
||||||
if(key == "z_min")
|
if(key == "z_min")
|
||||||
{
|
{
|
||||||
base.addOriginalProgress.checkUp[3] = true
|
|
||||||
z_min_pressed = true
|
z_min_pressed = true
|
||||||
checkTotalCheckUp()
|
checkTotalCheckUp()
|
||||||
}
|
}
|
||||||
|
@ -363,7 +355,7 @@ Item
|
||||||
if(printer_connection != null)
|
if(printer_connection != null)
|
||||||
{
|
{
|
||||||
nozzleTempStatus.text = catalog.i18nc("@info:status","Works")
|
nozzleTempStatus.text = catalog.i18nc("@info:status","Works")
|
||||||
base.addOriginalProgress.checkUp[4] = true
|
wizardPage.checkupProgress.nozzleTemp = true
|
||||||
checkTotalCheckUp()
|
checkTotalCheckUp()
|
||||||
printer_connection.heatupNozzle(0)
|
printer_connection.heatupNozzle(0)
|
||||||
}
|
}
|
||||||
|
@ -374,7 +366,7 @@ Item
|
||||||
if(printer_connection.bedTemperature > wizardPage.bed_target_temp - 5 && printer_connection.bedTemperature < wizardPage.bed_target_temp + 5)
|
if(printer_connection.bedTemperature > wizardPage.bed_target_temp - 5 && printer_connection.bedTemperature < wizardPage.bed_target_temp + 5)
|
||||||
{
|
{
|
||||||
bedTempStatus.text = catalog.i18nc("@info:status","Works")
|
bedTempStatus.text = catalog.i18nc("@info:status","Works")
|
||||||
base.addOriginalProgress.checkUp[5] = true
|
wizardPage.checkupProgress.bedTemp = true
|
||||||
checkTotalCheckUp()
|
checkTotalCheckUp()
|
||||||
printer_connection.heatupBed(0)
|
printer_connection.heatupBed(0)
|
||||||
}
|
}
|
||||||
|
|
39
resources/shaders/grid.shader
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
[shaders]
|
||||||
|
vertex =
|
||||||
|
uniform highp mat4 u_modelViewProjectionMatrix;
|
||||||
|
|
||||||
|
attribute highp vec4 a_vertex;
|
||||||
|
attribute lowp vec2 a_uvs;
|
||||||
|
|
||||||
|
varying lowp vec2 v_uvs;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_Position = u_modelViewProjectionMatrix * a_vertex;
|
||||||
|
v_uvs = a_uvs;
|
||||||
|
}
|
||||||
|
|
||||||
|
fragment =
|
||||||
|
uniform lowp vec4 u_gridColor0;
|
||||||
|
uniform lowp vec4 u_gridColor1;
|
||||||
|
|
||||||
|
varying lowp vec2 v_uvs;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
if (mod(floor(v_uvs.x / 10.0) - floor(v_uvs.y / 10.0), 2.0) < 1.0)
|
||||||
|
gl_FragColor = u_gridColor0;
|
||||||
|
else
|
||||||
|
gl_FragColor = u_gridColor1;
|
||||||
|
}
|
||||||
|
|
||||||
|
[defaults]
|
||||||
|
u_gridColor0 = [0.96, 0.96, 0.96, 1.0]
|
||||||
|
u_gridColor1 = [0.8, 0.8, 0.8, 1.0]
|
||||||
|
|
||||||
|
[bindings]
|
||||||
|
u_modelViewProjectionMatrix = model_view_projection_matrix
|
||||||
|
|
||||||
|
[attributes]
|
||||||
|
a_vertex = vertex
|
||||||
|
a_uvs = uv0
|
80
resources/shaders/overhang.shader
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
[shaders]
|
||||||
|
vertex =
|
||||||
|
uniform highp mat4 u_modelMatrix;
|
||||||
|
uniform highp mat4 u_viewProjectionMatrix;
|
||||||
|
uniform highp mat4 u_normalMatrix;
|
||||||
|
|
||||||
|
attribute highp vec4 a_vertex;
|
||||||
|
attribute highp vec4 a_normal;
|
||||||
|
attribute highp vec2 a_uvs;
|
||||||
|
|
||||||
|
varying highp vec3 v_vertex;
|
||||||
|
varying highp vec3 v_normal;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec4 world_space_vert = u_modelMatrix * a_vertex;
|
||||||
|
gl_Position = u_viewProjectionMatrix * world_space_vert;
|
||||||
|
|
||||||
|
v_vertex = world_space_vert.xyz;
|
||||||
|
v_normal = (u_normalMatrix * normalize(a_normal)).xyz;
|
||||||
|
}
|
||||||
|
|
||||||
|
fragment =
|
||||||
|
uniform mediump vec4 u_ambientColor;
|
||||||
|
uniform mediump vec4 u_diffuseColor;
|
||||||
|
uniform mediump vec4 u_specularColor;
|
||||||
|
uniform highp vec3 u_lightPosition;
|
||||||
|
uniform mediump float u_shininess;
|
||||||
|
uniform highp vec3 u_viewPosition;
|
||||||
|
|
||||||
|
uniform lowp float u_overhangAngle;
|
||||||
|
uniform lowp vec4 u_overhangColor;
|
||||||
|
|
||||||
|
varying highp vec3 v_vertex;
|
||||||
|
varying highp vec3 v_normal;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
mediump vec4 finalColor = vec4(0.0);
|
||||||
|
|
||||||
|
/* Ambient Component */
|
||||||
|
finalColor += u_ambientColor;
|
||||||
|
|
||||||
|
highp vec3 normal = normalize(v_normal);
|
||||||
|
highp vec3 lightDir = normalize(u_lightPosition - v_vertex);
|
||||||
|
|
||||||
|
/* Diffuse Component */
|
||||||
|
highp float NdotL = clamp(abs(dot(normal, lightDir)), 0.0, 1.0);
|
||||||
|
finalColor += (NdotL * u_diffuseColor);
|
||||||
|
|
||||||
|
/* Specular Component */
|
||||||
|
/* TODO: We should not do specularity for fragments facing away from the light.*/
|
||||||
|
highp vec3 reflectedLight = reflect(-lightDir, normal);
|
||||||
|
highp vec3 viewVector = normalize(u_viewPosition - v_vertex);
|
||||||
|
highp float NdotR = clamp(dot(viewVector, reflectedLight), 0.0, 1.0);
|
||||||
|
finalColor += pow(NdotR, u_shininess) * u_specularColor;
|
||||||
|
|
||||||
|
finalColor = (-normal.y > u_overhangAngle) ? u_overhangColor : finalColor;
|
||||||
|
|
||||||
|
gl_FragColor = finalColor;
|
||||||
|
gl_FragColor.a = 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
[defaults]
|
||||||
|
u_ambientColor = [0.3, 0.3, 0.3, 1.0]
|
||||||
|
u_diffuseColor = [1.0, 0.79, 0.14, 1.0]
|
||||||
|
u_specularColor = [0.4, 0.4, 0.4, 1.0]
|
||||||
|
u_overhangColor = [1.0, 0.0, 0.0, 1.0]
|
||||||
|
u_shininess = 20.0
|
||||||
|
|
||||||
|
[bindings]
|
||||||
|
u_modelMatrix = model_matrix
|
||||||
|
u_viewProjectionMatrix = view_projection_matrix
|
||||||
|
u_normalMatrix = normal_matrix
|
||||||
|
u_viewPosition = view_position
|
||||||
|
u_lightPosition = light_0_position
|
||||||
|
|
||||||
|
[attributes]
|
||||||
|
a_vertex = vertex
|
||||||
|
a_normal = normal
|
50
resources/themes/cura/icons/check.svg
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
version="1.1"
|
||||||
|
id="Capa_1"
|
||||||
|
x="0px"
|
||||||
|
y="0px"
|
||||||
|
width="415.582px"
|
||||||
|
height="415.582px"
|
||||||
|
viewBox="0 0 415.582 415.582"
|
||||||
|
style="enable-background:new 0 0 415.582 415.582;"
|
||||||
|
xml:space="preserve"
|
||||||
|
inkscape:version="0.91 r13725"
|
||||||
|
sodipodi:docname="check.svg"><metadata
|
||||||
|
id="metadata11"><rdf:RDF><cc:Work
|
||||||
|
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
|
||||||
|
id="defs9" /><sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1134"
|
||||||
|
id="namedview7"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="1.61"
|
||||||
|
inkscape:cx="211.31288"
|
||||||
|
inkscape:cy="137.35337"
|
||||||
|
inkscape:window-x="1440"
|
||||||
|
inkscape:window-y="27"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="Capa_1" /><g
|
||||||
|
id="g3"><path
|
||||||
|
d="m 411.47,96.426 -34.319,-34.32 c -5.48192,-5.482079 -14.34421,-5.455083 -19.853,0 L 152.348,265.058 56.282,174.994 c -5.48,-5.482 -14.37,-5.482 -19.851,0 l -32.319,32.32 c -5.482,5.481 -5.482,14.37 0,19.852 l 138.311,138.31 c 2.741,2.742 6.334,4.112 9.926,4.112 3.593,0 7.186,-1.37 9.926,-4.112 L 411.47,116.277 c 2.633,-2.632 4.111,-6.203 4.111,-9.925 10e-4,-3.724 -1.47804,-7.29296 -4.111,-9.926 z"
|
||||||
|
id="path5"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="sssccccscscccs" /></g></svg>
|
After Width: | Height: | Size: 2.1 KiB |
|
@ -3,17 +3,12 @@
|
||||||
<svg version="1.2" baseProfile="tiny" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
<svg version="1.2" baseProfile="tiny" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
x="0px" y="0px" viewBox="0 0 30 30" xml:space="preserve">
|
x="0px" y="0px" viewBox="0 0 30 30" xml:space="preserve">
|
||||||
<g>
|
<g>
|
||||||
<g>
|
<path d="M30,0L30,0L0,0v30h0h30V0z M12.4,28.8L1.2,17.6v-0.2L12.5,6.1l11.4,11.4L12.6,28.8H12.4z M1.2,7l4.4,4.4l-4.4,4.4V7z
|
||||||
<rect x="0" y="0" width="1.2" height="30"/>
|
M1.2,19.3l4.4,4.4L1.2,28V19.3z M28.8,8.6l-7.4-7.4h7.4L28.8,8.6z M19.8,1.2l4.1,4.1l-5.3,5.3l-5.3-5.3l4.2-4.2H19.8z M15.8,1.2
|
||||||
<rect x="28.8" y="0" width="1.2" height="30"/>
|
l-3.3,3.3L9.2,1.2H15.8z M1.2,1.2h6.4l4.2,4.2l-5.3,5.3L1.2,5.4V1.2z M2,28.8l4.4-4.4l4.4,4.4H2z M14.2,28.8l4.4-4.4l4.4,4.4H14.2z
|
||||||
<rect x="0" y="28.8" width="30" height="1.2"/>
|
M28.8,28.8h-4.2l-5.2-5.2l5.3-5.3l4.1,4.1V28.8z M28.8,20.8l-3.3-3.3l3.3-3.3V20.8z M24.7,16.7l-5.3-5.3l5.3-5.3l4.1,4.1v2.3
|
||||||
<rect x="0" y="0" width="30" height="1.2"/>
|
L24.7,16.7z"/>
|
||||||
</g>
|
<rect x="12.7" y="3.3" transform="matrix(0.7071 -0.7071 0.7071 0.7071 -9.0598 14.7879)" width="1.2" height="30"/>
|
||||||
<rect x="14.4" y="-5.4" transform="matrix(0.7071 0.7071 -0.7071 0.7071 14.9999 -6.2122)" width="1.2" height="40.8"/>
|
<rect x="15.1" y="-5.1" transform="matrix(0.7071 0.7071 -0.7071 0.7071 14.7286 -6.8835)" width="1.2" height="38.9"/>
|
||||||
<polygon points="0.7,10 0.1,8.9 9,0.1 9.8,0.9 "/>
|
|
||||||
<rect x="24.5" y="19" transform="matrix(0.7071 0.7071 -0.7071 0.7071 25.0689 -10.4098)" width="1.2" height="12.2"/>
|
|
||||||
<rect x="14.4" y="-5.4" transform="matrix(0.7071 -0.7071 0.7071 0.7071 -6.2136 14.9987)" width="1.2" height="40.8"/>
|
|
||||||
<polyline points="0.8,20.1 9.6,29 8.8,29.8 0,21 "/>
|
|
||||||
<rect x="24.5" y="-1.2" transform="matrix(0.7071 -0.7071 0.7071 0.7071 3.8484 19.2136)" width="1.2" height="12.2"/>
|
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
11
resources/themes/cura/icons/dot.svg
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 16.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<svg version="1.1"
|
||||||
|
id="Capa_1" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" sodipodi:docname="check.svg" inkscape:version="0.91 r13725"
|
||||||
|
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="415.582px"
|
||||||
|
height="415.582px" viewBox="0 0 415.582 415.582" enable-background="new 0 0 415.582 415.582" xml:space="preserve">
|
||||||
|
<sodipodi:namedview inkscape:cy="137.35337" inkscape:cx="211.31288" inkscape:zoom="1.61" showgrid="false" guidetolerance="10" gridtolerance="10" objecttolerance="10" bordercolor="#666666" pagecolor="#ffffff" borderopacity="1" id="namedview7" inkscape:current-layer="Capa_1" inkscape:window-maximized="1" inkscape:window-y="27" inkscape:window-x="1440" inkscape:window-height="1134" inkscape:window-width="1920" inkscape:pageopacity="0" inkscape:pageshadow="2">
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<circle fill="#231F20" cx="207.791" cy="207.791" r="207.791"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.4 KiB |
13
resources/themes/cura/icons/hollow.svg
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
<svg version="1.2" baseProfile="tiny" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
x="0px" y="0px" viewBox="0 0 30 30" xml:space="preserve">
|
||||||
|
<g>
|
||||||
|
<g>
|
||||||
|
<rect x="0" y="0" width="1.2" height="30"/>
|
||||||
|
<rect x="28.8" y="0" width="1.2" height="30"/>
|
||||||
|
<rect x="0" y="28.8" width="30" height="1.2"/>
|
||||||
|
<rect x="0" y="0" width="30" height="1.2"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 540 B |
|
@ -1,14 +1,171 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
<svg version="1.2" baseProfile="tiny" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
<svg version="1.2" baseProfile="tiny" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="-282 405.9 30 30" xml:space="preserve">
|
||||||
x="0px" y="0px" viewBox="0 0 30 30" xml:space="preserve">
|
|
||||||
<g>
|
<g>
|
||||||
<path d="M30,0L30,0L0,0v30h0h30V0z M12.4,28.8L1.2,17.6v-0.2L12.5,6.1l11.4,11.4L12.6,28.8H12.4z M1.2,7l4.4,4.4l-4.4,4.4V7z
|
<polygon fill="none" points="-253.2,421.1 -266.8,434.7 -266.4,434.7 -253.2,421.5 "/>
|
||||||
M1.2,19.3l4.4,4.4L1.2,28V19.3z M28.8,8.6l-7.4-7.4h7.4L28.8,8.6z M19.8,1.2l4.1,4.1l-5.3,5.3l-5.3-5.3l4.2-4.2H19.8z M15.8,1.2
|
<polygon fill="none" points="-253.2,418.9 -269,434.7 -268.6,434.7 -253.2,419.3 "/>
|
||||||
l-3.3,3.3L9.2,1.2H15.8z M1.2,1.2h6.4l4.2,4.2l-5.3,5.3L1.2,5.4V1.2z M2,28.8l4.4-4.4l4.4,4.4H2z M14.2,28.8l4.4-4.4l4.4,4.4H14.2z
|
<polygon fill="none" points="-253.2,423.3 -264.6,434.7 -264.2,434.7 -253.2,423.7 "/>
|
||||||
M28.8,28.8h-4.2l-5.2-5.2l5.3-5.3l4.1,4.1V28.8z M28.8,20.8l-3.3-3.3l3.3-3.3V20.8z M24.7,16.7l-5.3-5.3l5.3-5.3l4.1,4.1v2.3
|
<polygon fill="none" points="-253.2,425.5 -262.4,434.7 -262,434.7 -253.2,425.9 "/>
|
||||||
L24.7,16.7z"/>
|
<polygon fill="none" points="-253.2,434.7 -253.2,434.3 -253.6,434.7 "/>
|
||||||
<rect x="12.7" y="3.3" transform="matrix(0.7071 -0.7071 0.7071 0.7071 -9.0598 14.7879)" width="1.2" height="30"/>
|
<polygon fill="none" points="-253.2,429.9 -258,434.7 -257.6,434.7 -253.2,430.3 "/>
|
||||||
<rect x="15.1" y="-5.1" transform="matrix(0.7071 0.7071 -0.7071 0.7071 14.7286 -6.8835)" width="1.2" height="38.9"/>
|
<polygon fill="none" points="-253.2,432.1 -255.8,434.7 -255.4,434.7 -253.2,432.5 "/>
|
||||||
|
<polygon fill="none" points="-253.2,427.7 -260.2,434.7 -259.8,434.7 -253.2,428.1 "/>
|
||||||
|
<polygon fill="none" points="-267.7,407.1 -280.8,420.2 -280.8,420.6 -267.3,407.1 "/>
|
||||||
|
<polygon fill="none" points="-261.1,407.1 -280.8,426.8 -280.8,427.2 -260.7,407.1 "/>
|
||||||
|
<polygon fill="none" points="-272,407.1 -280.8,415.8 -280.8,416.2 -271.7,407.1 "/>
|
||||||
|
<polygon fill="none" points="-269.9,407.1 -280.8,418 -280.8,418.4 -269.5,407.1 "/>
|
||||||
|
<polygon fill="none" points="-265.5,407.1 -280.8,422.4 -280.8,422.8 -265.1,407.1 "/>
|
||||||
|
<polygon fill="none" points="-274.2,407.1 -280.8,413.7 -280.8,414 -273.8,407.1 "/>
|
||||||
|
<polygon fill="none" points="-278.6,407.1 -280.8,409.3 -280.8,409.7 -278.2,407.1 "/>
|
||||||
|
<polygon fill="none" points="-280.8,407.1 -280.8,407.5 -280.4,407.1 "/>
|
||||||
|
<polygon fill="none" points="-276.4,407.1 -280.8,411.5 -280.8,411.9 -276,407.1 "/>
|
||||||
|
<polygon fill="none" points="-253.2,408 -279.9,434.7 -279.5,434.7 -253.2,408.4 "/>
|
||||||
|
<polygon fill="none" points="-253.2,412.3 -275.5,434.7 -275.2,434.7 -253.2,412.7 "/>
|
||||||
|
<polygon fill="none" points="-253.2,414.5 -273.4,434.7 -273,434.7 -253.2,414.9 "/>
|
||||||
|
<polygon fill="none" points="-253.2,410.2 -277.7,434.7 -277.3,434.7 -253.2,410.5 "/>
|
||||||
|
<polygon fill="none" points="-258.9,407.1 -280.8,429 -280.8,429.4 -258.5,407.1 "/>
|
||||||
|
<polygon fill="none" points="-253.2,416.7 -271.2,434.7 -270.8,434.7 -253.2,417.1 "/>
|
||||||
|
<polygon fill="none" points="-254.5,407.1 -280.8,433.4 -280.8,433.8 -254.1,407.1 "/>
|
||||||
|
<polygon fill="none" points="-256.7,407.1 -280.8,431.2 -280.8,431.6 -256.3,407.1 "/>
|
||||||
|
<polygon fill="none" points="-263.3,407.1 -280.8,424.6 -280.8,425 -262.9,407.1 "/>
|
||||||
|
<polygon points="-280.4,407.1 -280.8,407.5 -280.8,409.3 -278.6,407.1 "/>
|
||||||
|
<polygon points="-278.2,407.1 -280.8,409.7 -280.8,411.5 -276.4,407.1 "/>
|
||||||
|
<polygon points="-276,407.1 -280.8,411.9 -280.8,413.7 -274.2,407.1 "/>
|
||||||
|
<polygon points="-273.8,407.1 -280.8,414 -280.8,415.8 -272,407.1 "/>
|
||||||
|
<polygon points="-271.7,407.1 -280.8,416.2 -280.8,418 -269.9,407.1 "/>
|
||||||
|
<polygon points="-269.5,407.1 -280.8,418.4 -280.8,420.2 -267.7,407.1 "/>
|
||||||
|
<polygon points="-267.3,407.1 -280.8,420.6 -280.8,422.4 -265.5,407.1 "/>
|
||||||
|
<polygon points="-265.1,407.1 -280.8,422.8 -280.8,424.6 -263.3,407.1 "/>
|
||||||
|
<polygon points="-262.9,407.1 -280.8,425 -280.8,426.8 -261.1,407.1 "/>
|
||||||
|
<polygon points="-260.7,407.1 -280.8,427.2 -280.8,429 -258.9,407.1 "/>
|
||||||
|
<polygon points="-258.5,407.1 -280.8,429.4 -280.8,431.2 -256.7,407.1 "/>
|
||||||
|
<polygon points="-256.3,407.1 -280.8,431.6 -280.8,433.4 -254.5,407.1 "/>
|
||||||
|
<polygon points="-282,435 -282,435 -282,435 "/>
|
||||||
|
<polygon points="-253.2,407.1 -254.1,407.1 -280.8,433.8 -280.8,434.7 -279.9,434.7 -253.2,408 "/>
|
||||||
|
<polygon points="-253.2,408.4 -279.5,434.7 -277.7,434.7 -253.2,410.2 "/>
|
||||||
|
<polygon points="-253.2,410.5 -277.3,434.7 -275.5,434.7 -253.2,412.3 "/>
|
||||||
|
<polygon points="-253.2,412.7 -275.2,434.7 -273.4,434.7 -253.2,414.5 "/>
|
||||||
|
<polygon points="-253.2,414.9 -273,434.7 -271.2,434.7 -253.2,416.7 "/>
|
||||||
|
<polygon points="-253.2,417.1 -270.8,434.7 -269,434.7 -253.2,418.9 "/>
|
||||||
|
<polygon points="-253.2,419.3 -268.6,434.7 -266.8,434.7 -253.2,421.1 "/>
|
||||||
|
<polygon points="-253.2,421.5 -266.4,434.7 -264.6,434.7 -253.2,423.3 "/>
|
||||||
|
<polygon points="-253.2,423.7 -264.2,434.7 -262.4,434.7 -253.2,425.5 "/>
|
||||||
|
<polygon points="-253.2,425.9 -262,434.7 -260.2,434.7 -253.2,427.7 "/>
|
||||||
|
<polygon points="-253.2,428.1 -259.8,434.7 -258,434.7 -253.2,429.9 "/>
|
||||||
|
<polygon points="-253.2,430.3 -257.6,434.7 -255.8,434.7 -253.2,432.1 "/>
|
||||||
|
<polygon points="-255.4,434.7 -253.6,434.7 -253.2,434.3 -253.2,432.5 "/>
|
||||||
|
<polygon points="-280.8,407.1 -282,407.1 -282,408.7 -280.8,407.5 "/>
|
||||||
|
<polygon points="-280.8,415.8 -282,417 -282,417.4 -280.8,416.2 "/>
|
||||||
|
<polygon points="-280.8,422.4 -282,423.6 -282,424 -280.8,422.8 "/>
|
||||||
|
<polygon points="-280.8,413.7 -282,414.9 -282,415.2 -280.8,414 "/>
|
||||||
|
<polygon points="-280.8,418 -282,419.2 -282,419.6 -280.8,418.4 "/>
|
||||||
|
<polygon points="-280.8,409.3 -282,410.5 -282,410.9 -280.8,409.7 "/>
|
||||||
|
<polygon points="-280.8,411.5 -282,412.7 -282,413.1 -280.8,411.9 "/>
|
||||||
|
<polygon points="-280.8,420.2 -282,421.4 -282,421.8 -280.8,420.6 "/>
|
||||||
|
<polygon points="-280.8,433.8 -280.8,433.4 -282,434.6 -282,434.7 -281.7,434.7 "/>
|
||||||
|
<polygon points="-280.8,429 -282,430.2 -282,430.6 -280.8,429.4 "/>
|
||||||
|
<polygon points="-280.8,431.2 -282,432.4 -282,432.8 -280.8,431.6 "/>
|
||||||
|
<polygon points="-280.8,424.6 -282,425.8 -282,426.2 -280.8,425 "/>
|
||||||
|
<polygon points="-280.8,426.8 -282,428 -282,428.4 -280.8,427.2 "/>
|
||||||
|
<polygon points="-280.8,407.5 -282,408.7 -282,410.5 -280.8,409.3 "/>
|
||||||
|
<polygon points="-280.8,409.7 -282,410.9 -282,412.7 -280.8,411.5 "/>
|
||||||
|
<polygon points="-280.8,411.9 -282,413.1 -282,414.9 -280.8,413.7 "/>
|
||||||
|
<polygon points="-280.8,414 -282,415.2 -282,417 -280.8,415.8 "/>
|
||||||
|
<polygon points="-280.8,416.2 -282,417.4 -282,419.2 -280.8,418 "/>
|
||||||
|
<polygon points="-280.8,418.4 -282,419.6 -282,421.4 -280.8,420.2 "/>
|
||||||
|
<polygon points="-280.8,420.6 -282,421.8 -282,423.6 -280.8,422.4 "/>
|
||||||
|
<polygon points="-280.8,422.8 -282,424 -282,425.8 -280.8,424.6 "/>
|
||||||
|
<polygon points="-280.8,425 -282,426.2 -282,428 -280.8,426.8 "/>
|
||||||
|
<polygon points="-280.8,427.2 -282,428.4 -282,430.2 -280.8,429 "/>
|
||||||
|
<polygon points="-280.8,429.4 -282,430.6 -282,432.4 -280.8,431.2 "/>
|
||||||
|
<polygon points="-280.8,431.6 -282,432.8 -282,434.6 -280.8,433.4 "/>
|
||||||
|
<polygon points="-281.7,434.7 -280.8,434.7 -280.8,433.8 "/>
|
||||||
|
<polygon points="-253.2,414.9 -252,413.7 -252,413.3 -253.2,414.5 "/>
|
||||||
|
<polygon points="-253.2,419.3 -252,418.1 -252,417.7 -253.2,418.9 "/>
|
||||||
|
<polygon points="-253.2,408 -253.2,408.4 -252,407.2 -252,407.1 -252.3,407.1 "/>
|
||||||
|
<polygon points="-253.2,423.7 -252,422.5 -252,422.1 -253.2,423.3 "/>
|
||||||
|
<polygon points="-253.2,417.1 -252,415.9 -252,415.5 -253.2,416.7 "/>
|
||||||
|
<polygon points="-253.2,410.5 -252,409.3 -252,409 -253.2,410.2 "/>
|
||||||
|
<polygon points="-253.2,412.7 -252,411.5 -252,411.1 -253.2,412.3 "/>
|
||||||
|
<polygon points="-253.2,421.5 -252,420.3 -252,419.9 -253.2,421.1 "/>
|
||||||
|
<polygon points="-253.2,434.3 -253.2,434.7 -252,434.7 -252,433.1 "/>
|
||||||
|
<polygon points="-253.2,425.9 -252,424.7 -252,424.3 -253.2,425.5 "/>
|
||||||
|
<polygon points="-253.2,428.1 -252,426.9 -252,426.5 -253.2,427.7 "/>
|
||||||
|
<polygon points="-253.2,432.5 -252,431.3 -252,430.9 -253.2,432.1 "/>
|
||||||
|
<polygon points="-253.2,430.3 -252,429.1 -252,428.7 -253.2,429.9 "/>
|
||||||
|
<polygon points="-252.3,407.1 -253.2,407.1 -253.2,408 "/>
|
||||||
|
<polygon points="-253.2,410.2 -252,409 -252,407.2 -253.2,408.4 "/>
|
||||||
|
<polygon points="-253.2,412.3 -252,411.1 -252,409.3 -253.2,410.5 "/>
|
||||||
|
<polygon points="-253.2,414.5 -252,413.3 -252,411.5 -253.2,412.7 "/>
|
||||||
|
<polygon points="-253.2,416.7 -252,415.5 -252,413.7 -253.2,414.9 "/>
|
||||||
|
<polygon points="-253.2,418.9 -252,417.7 -252,415.9 -253.2,417.1 "/>
|
||||||
|
<polygon points="-253.2,421.1 -252,419.9 -252,418.1 -253.2,419.3 "/>
|
||||||
|
<polygon points="-253.2,423.3 -252,422.1 -252,420.3 -253.2,421.5 "/>
|
||||||
|
<polygon points="-253.2,425.5 -252,424.3 -252,422.5 -253.2,423.7 "/>
|
||||||
|
<polygon points="-253.2,427.7 -252,426.5 -252,424.7 -253.2,425.9 "/>
|
||||||
|
<polygon points="-253.2,429.9 -252,428.7 -252,426.9 -253.2,428.1 "/>
|
||||||
|
<polygon points="-253.2,432.1 -252,430.9 -252,429.1 -253.2,430.3 "/>
|
||||||
|
<polygon points="-253.2,434.3 -252,433.1 -252,431.3 -253.2,432.5 "/>
|
||||||
|
<polygon points="-263.3,407.1 -262.9,407.1 -261.7,405.9 -263.9,405.9 -263,406.8 "/>
|
||||||
|
<polygon points="-265.5,407.1 -265.1,407.1 -263.9,405.9 -266.1,405.9 -265.2,406.8 "/>
|
||||||
|
<polygon points="-269.9,407.1 -269.5,407.1 -268.3,405.9 -270.5,405.9 -269.6,406.8 "/>
|
||||||
|
<polygon points="-256.7,407.1 -256.3,407.1 -255.1,405.9 -257.3,405.9 -256.4,406.8 "/>
|
||||||
|
<polygon points="-254.5,407.1 -254.1,407.1 -253.2,406.2 -253.2,405.9 -255.1,405.9 -254.2,406.8 "/>
|
||||||
|
<polygon points="-258.9,407.1 -258.5,407.1 -257.3,405.9 -259.5,405.9 -258.6,406.8 "/>
|
||||||
|
<polygon points="-261.1,407.1 -260.7,407.1 -259.5,405.9 -261.7,405.9 -260.8,406.8 "/>
|
||||||
|
<polygon points="-280.4,407.1 -279.2,405.9 -280.8,405.9 -280.8,407.1 "/>
|
||||||
|
<polygon points="-276.4,407.1 -276,407.1 -274.8,405.9 -277,405.9 -276.1,406.8 "/>
|
||||||
|
<polygon points="-278.6,407.1 -278.2,407.1 -277,405.9 -279.2,405.9 -278.3,406.8 "/>
|
||||||
|
<polygon points="-274.2,407.1 -273.8,407.1 -272.6,405.9 -274.8,405.9 -273.9,406.8 "/>
|
||||||
|
<polygon points="-272,407.1 -271.7,407.1 -270.5,405.9 -272.6,405.9 -271.7,406.8 "/>
|
||||||
|
<polygon points="-267.7,407.1 -267.3,407.1 -266.1,405.9 -268.3,405.9 -267.4,406.8 "/>
|
||||||
|
<polygon points="-278.6,407.1 -278.3,406.8 -279.2,405.9 -280.4,407.1 "/>
|
||||||
|
<polygon points="-276.4,407.1 -276.1,406.8 -277,405.9 -278.2,407.1 "/>
|
||||||
|
<polygon points="-274.2,407.1 -273.9,406.8 -274.8,405.9 -276,407.1 "/>
|
||||||
|
<polygon points="-272,407.1 -271.7,406.8 -272.6,405.9 -273.8,407.1 "/>
|
||||||
|
<polygon points="-269.9,407.1 -269.6,406.8 -270.5,405.9 -271.7,407.1 "/>
|
||||||
|
<polygon points="-267.7,407.1 -267.4,406.8 -268.3,405.9 -269.5,407.1 "/>
|
||||||
|
<polygon points="-265.5,407.1 -265.2,406.8 -266.1,405.9 -267.3,407.1 "/>
|
||||||
|
<polygon points="-263.3,407.1 -263,406.8 -263.9,405.9 -265.1,407.1 "/>
|
||||||
|
<polygon points="-261.1,407.1 -260.8,406.8 -261.7,405.9 -262.9,407.1 "/>
|
||||||
|
<polygon points="-258.9,407.1 -258.6,406.8 -259.5,405.9 -260.7,407.1 "/>
|
||||||
|
<polygon points="-256.7,407.1 -256.4,406.8 -257.3,405.9 -258.5,407.1 "/>
|
||||||
|
<polygon points="-254.5,407.1 -254.2,406.8 -255.1,405.9 -256.3,407.1 "/>
|
||||||
|
<polygon points="-253.2,406.2 -254.1,407.1 -253.2,407.1 "/>
|
||||||
|
<rect x="-282" y="405.9" width="1.2" height="1.2"/>
|
||||||
|
<polygon points="-252.3,407.1 -252,407.1 -252,405.9 -252.9,405.9 -252,406.8 "/>
|
||||||
|
<polygon points="-252.9,405.9 -253.2,405.9 -253.2,406.2 "/>
|
||||||
|
<polygon points="-253.2,407.1 -252.3,407.1 -252,406.8 -252.9,405.9 -253.2,406.2 "/>
|
||||||
|
<polygon points="-266.4,434.7 -266.8,434.7 -268,435.9 -265.8,435.9 -266.7,435 "/>
|
||||||
|
<polygon points="-264.2,434.7 -264.6,434.7 -265.8,435.9 -263.6,435.9 -264.5,435 "/>
|
||||||
|
<polygon points="-270.8,434.7 -271.2,434.7 -272.4,435.9 -270.2,435.9 -271.1,435 "/>
|
||||||
|
<polygon points="-268.6,434.7 -269,434.7 -270.2,435.9 -268,435.9 -268.9,435 "/>
|
||||||
|
<polygon points="-253.6,434.7 -254.8,435.9 -253.2,435.9 -253.2,434.7 "/>
|
||||||
|
<polygon points="-257.6,434.7 -258,434.7 -259.2,435.9 -257,435.9 -257.9,435 "/>
|
||||||
|
<polygon points="-259.8,434.7 -260.2,434.7 -261.4,435.9 -259.2,435.9 -260.1,435 "/>
|
||||||
|
<polygon points="-255.4,434.7 -255.8,434.7 -257,435.9 -254.8,435.9 -255.7,435 "/>
|
||||||
|
<polygon points="-273,434.7 -273.4,434.7 -274.6,435.9 -272.4,435.9 -273.3,435 "/>
|
||||||
|
<polygon points="-262,434.7 -262.4,434.7 -263.6,435.9 -261.4,435.9 -262.3,435 "/>
|
||||||
|
<polygon points="-277.3,434.7 -277.7,434.7 -278.9,435.9 -276.7,435.9 -277.6,435 "/>
|
||||||
|
<polygon points="-275.2,434.7 -275.5,434.7 -276.7,435.9 -274.6,435.9 -275.5,435 "/>
|
||||||
|
<polygon points="-279.5,434.7 -279.9,434.7 -280.8,435.6 -280.8,435.9 -278.9,435.9 -279.8,435 "/>
|
||||||
|
<polygon points="-280.8,435.6 -279.9,434.7 -280.8,434.7 "/>
|
||||||
|
<polygon points="-279.5,434.7 -279.8,435 -278.9,435.9 -277.7,434.7 "/>
|
||||||
|
<polygon points="-277.3,434.7 -277.6,435 -276.7,435.9 -275.5,434.7 "/>
|
||||||
|
<polygon points="-275.2,434.7 -275.5,435 -274.6,435.9 -273.4,434.7 "/>
|
||||||
|
<polygon points="-273,434.7 -273.3,435 -272.4,435.9 -271.2,434.7 "/>
|
||||||
|
<polygon points="-270.8,434.7 -271.1,435 -270.2,435.9 -269,434.7 "/>
|
||||||
|
<polygon points="-268.6,434.7 -268.9,435 -268,435.9 -266.8,434.7 "/>
|
||||||
|
<polygon points="-266.4,434.7 -266.7,435 -265.8,435.9 -264.6,434.7 "/>
|
||||||
|
<polygon points="-264.2,434.7 -264.5,435 -263.6,435.9 -262.4,434.7 "/>
|
||||||
|
<polygon points="-262,434.7 -262.3,435 -261.4,435.9 -260.2,434.7 "/>
|
||||||
|
<polygon points="-259.8,434.7 -260.1,435 -259.2,435.9 -258,434.7 "/>
|
||||||
|
<polygon points="-257.6,434.7 -257.9,435 -257,435.9 -255.8,434.7 "/>
|
||||||
|
<polygon points="-255.4,434.7 -255.7,435 -254.8,435.9 -253.6,434.7 "/>
|
||||||
|
<polygon points="-282,435.9 -281.1,435.9 -282,435 "/>
|
||||||
|
<polygon points="-282,434.7 -282,435 -281.7,434.7 "/>
|
||||||
|
<polygon points="-281.1,435.9 -280.8,435.9 -280.8,435.6 "/>
|
||||||
|
<polygon points="-280.8,434.7 -281.7,434.7 -282,435 -282,435 -281.1,435.9 -280.8,435.6 "/>
|
||||||
|
<rect x="-253.2" y="434.7" width="1.2" height="1.2"/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 13 KiB |