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(CURA_VERSION "master" CACHE STRING "Version name of Cura")
|
||||
configure_file(cura/CuraVersion.py.in CuraVersion.py @ONLY)
|
||||
|
||||
if(NOT ${URANIUM_SCRIPTS_DIR} STREQUAL "")
|
||||
# Extract Strings
|
||||
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(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)
|
||||
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)
|
||||
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()
|
||||
|
||||
include(CPackConfig.cmake)
|
||||
|
@ -41,6 +41,7 @@ Third party plugins
|
||||
-------------
|
||||
* [Print time calculator](https://github.com/nallath/PrintCostCalculator)
|
||||
* [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
|
||||
----------------------------------
|
||||
|
@ -12,6 +12,9 @@ from UM.Math.Color import Color
|
||||
from UM.Math.AxisAlignedBox import AxisAlignedBox
|
||||
from UM.Math.Polygon import Polygon
|
||||
|
||||
from UM.View.RenderBatch import RenderBatch
|
||||
from UM.View.GL.OpenGL import OpenGL
|
||||
|
||||
import numpy
|
||||
|
||||
class BuildVolume(SceneNode):
|
||||
@ -24,20 +27,24 @@ class BuildVolume(SceneNode):
|
||||
self._height = 0
|
||||
self._depth = 0
|
||||
|
||||
self._material = None
|
||||
self._shader = None
|
||||
|
||||
self._grid_mesh = None
|
||||
self._grid_material = None
|
||||
self._grid_shader = None
|
||||
|
||||
self._disallowed_areas = []
|
||||
self._disallowed_area_mesh = None
|
||||
|
||||
self.setCalculateBoundingBox(False)
|
||||
|
||||
self._active_profile = None
|
||||
self._active_instance = None
|
||||
Application.getInstance().getMachineManager().activeMachineInstanceChanged.connect(self._onActiveInstanceChanged)
|
||||
self._onActiveInstanceChanged()
|
||||
|
||||
Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onActiveProfileChanged)
|
||||
self._onActiveProfileChanged()
|
||||
|
||||
def setWidth(self, width):
|
||||
if width: self._width = width
|
||||
|
||||
@ -57,78 +64,72 @@ class BuildVolume(SceneNode):
|
||||
if not self.getMeshData():
|
||||
return True
|
||||
|
||||
if not self._material:
|
||||
self._material = renderer.createMaterial(
|
||||
Resources.getPath(Resources.Shaders, "basic.vert"),
|
||||
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))
|
||||
if not self._shader:
|
||||
self._shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "default.shader"))
|
||||
self._grid_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "grid.shader"))
|
||||
|
||||
renderer.queueNode(self, material = self._material, mode = Renderer.RenderLines)
|
||||
renderer.queueNode(self, mesh = self._grid_mesh, material = self._grid_material, force_single_sided = True)
|
||||
renderer.queueNode(self, mode = RenderBatch.RenderMode.Lines)
|
||||
renderer.queueNode(self, mesh = self._grid_mesh, shader = self._grid_shader, backface_cull = True)
|
||||
if self._disallowed_area_mesh:
|
||||
renderer.queueNode(self, mesh = self._disallowed_area_mesh, material = self._material)
|
||||
renderer.queueNode(self, mesh = self._disallowed_area_mesh, shader = self._shader, transparent = True, backface_cull = True, sort = -9)
|
||||
return True
|
||||
|
||||
def rebuild(self):
|
||||
if self._width == 0 or self._height == 0 or self._depth == 0:
|
||||
return
|
||||
|
||||
minW = -self._width / 2
|
||||
maxW = self._width / 2
|
||||
minH = 0.0
|
||||
maxH = self._height
|
||||
minD = -self._depth / 2
|
||||
maxD = self._depth / 2
|
||||
min_w = -self._width / 2
|
||||
max_w = self._width / 2
|
||||
min_h = 0.0
|
||||
max_h = self._height
|
||||
min_d = -self._depth / 2
|
||||
max_d = self._depth / 2
|
||||
|
||||
mb = MeshBuilder()
|
||||
|
||||
mb.addLine(Vector(minW, minH, minD), Vector(maxW, minH, minD), color = self.VolumeOutlineColor)
|
||||
mb.addLine(Vector(minW, minH, minD), Vector(minW, maxH, minD), color = self.VolumeOutlineColor)
|
||||
mb.addLine(Vector(minW, maxH, minD), Vector(maxW, maxH, minD), color = self.VolumeOutlineColor)
|
||||
mb.addLine(Vector(maxW, minH, minD), Vector(maxW, maxH, 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(min_w, min_h, min_d), Vector(min_w, max_h, min_d), 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(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(minW, minH, maxD), Vector(minW, maxH, maxD), color = self.VolumeOutlineColor)
|
||||
mb.addLine(Vector(minW, maxH, maxD), Vector(maxW, maxH, maxD), color = self.VolumeOutlineColor)
|
||||
mb.addLine(Vector(maxW, minH, maxD), Vector(maxW, maxH, 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(min_w, min_h, max_d), Vector(min_w, max_h, max_d), 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(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(maxW, minH, minD), Vector(maxW, minH, maxD), color = self.VolumeOutlineColor)
|
||||
mb.addLine(Vector(minW, maxH, minD), Vector(minW, maxH, maxD), color = self.VolumeOutlineColor)
|
||||
mb.addLine(Vector(maxW, maxH, minD), Vector(maxW, maxH, 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(max_w, min_h, min_d), Vector(max_w, min_h, max_d), 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(max_w, max_h, min_d), Vector(max_w, max_h, max_d), color = self.VolumeOutlineColor)
|
||||
|
||||
self.setMeshData(mb.getData())
|
||||
|
||||
mb = MeshBuilder()
|
||||
mb.addQuad(
|
||||
Vector(minW, minH, minD),
|
||||
Vector(maxW, minH, minD),
|
||||
Vector(maxW, minH, maxD),
|
||||
Vector(minW, minH, maxD)
|
||||
Vector(min_w, min_h - 0.2, min_d),
|
||||
Vector(max_w, min_h - 0.2, min_d),
|
||||
Vector(max_w, min_h - 0.2, max_d),
|
||||
Vector(min_w, min_h - 0.2, max_d)
|
||||
)
|
||||
self._grid_mesh = mb.getData()
|
||||
for n in range(0, 6):
|
||||
v = self._grid_mesh.getVertex(n)
|
||||
self._grid_mesh.setVertexUVCoordinates(n, v[0], v[2])
|
||||
|
||||
disallowed_area_height = 0.1
|
||||
disallowed_area_size = 0
|
||||
if self._disallowed_areas:
|
||||
mb = MeshBuilder()
|
||||
color = Color(0.0, 0.0, 0.0, 0.15)
|
||||
for polygon in self._disallowed_areas:
|
||||
points = polygon.getPoints()
|
||||
mb.addQuad(
|
||||
Vector(points[0, 0], 0.1, points[0, 1]),
|
||||
Vector(points[1, 0], 0.1, points[1, 1]),
|
||||
Vector(points[2, 0], 0.1, points[2, 1]),
|
||||
Vector(points[3, 0], 0.1, points[3, 1]),
|
||||
color = Color(174, 174, 174, 255)
|
||||
)
|
||||
first = Vector(self._clamp(points[0][0], min_w, max_w), disallowed_area_height, self._clamp(points[0][1], min_d, max_d))
|
||||
previous_point = Vector(self._clamp(points[0][0], min_w, max_w), disallowed_area_height, self._clamp(points[0][1], min_d, max_d))
|
||||
for point in points:
|
||||
new_point = Vector(self._clamp(point[0], min_w, max_w), disallowed_area_height, self._clamp(point[1], min_d, max_d))
|
||||
mb.addFace(first, previous_point, new_point, color = color)
|
||||
previous_point = new_point
|
||||
|
||||
# Find the largest disallowed area to exclude it from the maximum scale bounds
|
||||
size = abs(numpy.max(points[:, 1]) - numpy.min(points[:, 1]))
|
||||
disallowed_area_size = max(size, disallowed_area_size)
|
||||
@ -137,24 +138,17 @@ class BuildVolume(SceneNode):
|
||||
else:
|
||||
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
|
||||
|
||||
#profile = Application.getInstance().getMachineManager().getActiveProfile()
|
||||
#if profile:
|
||||
#if profile.getSettingValue("adhesion_type") == "skirt":
|
||||
#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")
|
||||
profile = Application.getInstance().getMachineManager().getActiveProfile()
|
||||
if profile:
|
||||
skirt_size = self._getSkirtSize(profile)
|
||||
|
||||
scale_to_max_bounds = AxisAlignedBox(
|
||||
minimum = Vector(minW + skirt_size, minH, minD + skirt_size + disallowed_area_size),
|
||||
maximum = Vector(maxW - skirt_size, maxH, maxD - skirt_size - disallowed_area_size)
|
||||
minimum = Vector(min_w + skirt_size, min_h, min_d + 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
|
||||
@ -167,12 +161,107 @@ class BuildVolume(SceneNode):
|
||||
self._height = self._active_instance.getMachineSettingValue("machine_height")
|
||||
self._depth = self._active_instance.getMachineSettingValue("machine_depth")
|
||||
|
||||
disallowed_areas = self._active_instance.getMachineSettingValue("machine_disallowed_areas")
|
||||
areas = []
|
||||
if disallowed_areas:
|
||||
for area in disallowed_areas:
|
||||
areas.append(Polygon(numpy.array(area, numpy.float32)))
|
||||
|
||||
self._disallowed_areas = areas
|
||||
self._updateDisallowedAreas()
|
||||
|
||||
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)
|
||||
return
|
||||
|
||||
Job.yieldThread()
|
||||
|
||||
else:
|
||||
if not self._node.getMeshData():
|
||||
return
|
||||
|
@ -7,6 +7,8 @@ from UM.Math.Color import Color
|
||||
from UM.Math.Vector import Vector
|
||||
from UM.Mesh.MeshData import MeshData
|
||||
|
||||
from UM.View.GL.OpenGL import OpenGL
|
||||
|
||||
import numpy
|
||||
|
||||
class ConvexHullNode(SceneNode):
|
||||
@ -15,21 +17,21 @@ class ConvexHullNode(SceneNode):
|
||||
|
||||
self.setCalculateBoundingBox(False)
|
||||
|
||||
self._material = None
|
||||
self._shader = None
|
||||
|
||||
self._original_parent = parent
|
||||
|
||||
self._inherit_orientation = 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.transformationChanged.connect(self._onNodePositionChanged)
|
||||
self._node.parentChanged.connect(self._onNodeParentChanged)
|
||||
self._node.decoratorsChanged.connect(self._onNodeDecoratorsChanged)
|
||||
self._onNodeDecoratorsChanged(self._node)
|
||||
self.convexHullHeadMesh = None
|
||||
self._convex_hull_head_mesh = None
|
||||
self._hull = hull
|
||||
|
||||
hull_points = self._hull.getPoints()
|
||||
@ -38,17 +40,17 @@ class ConvexHullNode(SceneNode):
|
||||
self.setMeshData(hull_mesh)
|
||||
convex_hull_head = self._node.callDecoration("getConvexHullHead")
|
||||
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):
|
||||
mesh = MeshData()
|
||||
if len(hull_points) > 3:
|
||||
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:
|
||||
return None
|
||||
for point in hull_points:
|
||||
mesh.addVertex(point[0], 0.1, point[1])
|
||||
mesh.addVertex(point[0], -0.1, point[1])
|
||||
indices = []
|
||||
for i in range(len(hull_points) - 1):
|
||||
indices.append([0, i + 1, i + 2])
|
||||
@ -62,14 +64,14 @@ class ConvexHullNode(SceneNode):
|
||||
return self._node
|
||||
|
||||
def render(self, renderer):
|
||||
if not self._material:
|
||||
self._material = renderer.createMaterial(Resources.getPath(Resources.Shaders, "basic.vert"), Resources.getPath(Resources.Shaders, "color.frag"))
|
||||
if not self._shader:
|
||||
self._shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "default.shader"))
|
||||
self._shader.setUniformValue("u_color", self._color)
|
||||
|
||||
if self.getParent():
|
||||
self._material.setUniformValue("u_color", self._color)
|
||||
renderer.queueNode(self, material = self._material, transparent = True)
|
||||
if self.convexHullHeadMesh:
|
||||
renderer.queueNode(self, material = self._material,transparent = True, mesh = self.convexHullHeadMesh)
|
||||
renderer.queueNode(self, transparent = True, shader = self._shader, backface_cull = True, sort = -8)
|
||||
if self._convex_hull_head_mesh:
|
||||
renderer.queueNode(self, shader = self._shader, transparent = True, mesh = self._convex_hull_head_mesh, backface_cull = True, sort = -8)
|
||||
|
||||
return True
|
||||
|
||||
|
@ -3,11 +3,6 @@
|
||||
|
||||
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.Scene.SceneNode import SceneNode
|
||||
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.Matrix import Matrix
|
||||
from UM.Math.Quaternion import Quaternion
|
||||
from UM.Math.AxisAlignedBox import AxisAlignedBox
|
||||
from UM.Resources import Resources
|
||||
from UM.Scene.ToolHandle import ToolHandle
|
||||
from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
|
||||
@ -45,6 +41,7 @@ from . import PrintInformation
|
||||
from . import CuraActions
|
||||
from . import MultiMaterialDecorator
|
||||
from . import ZOffsetDecorator
|
||||
from . import CuraSplashScreen
|
||||
|
||||
from PyQt5.QtCore import pyqtSlot, QUrl, Qt, pyqtSignal, pyqtProperty, QEvent, Q_ENUMS
|
||||
from PyQt5.QtGui import QColor, QIcon
|
||||
@ -58,6 +55,16 @@ import numpy
|
||||
import copy
|
||||
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 ResourceTypes:
|
||||
QmlFiles = Resources.UserType + 1
|
||||
@ -69,7 +76,7 @@ class CuraApplication(QtApplication):
|
||||
if not hasattr(sys, "frozen"):
|
||||
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")))
|
||||
|
||||
@ -91,6 +98,7 @@ class CuraApplication(QtApplication):
|
||||
self._i18n_catalog = None
|
||||
self._previous_active_tool = None
|
||||
self._platform_activity = False
|
||||
self._scene_boundingbox = AxisAlignedBox()
|
||||
self._job_name = None
|
||||
|
||||
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.")
|
||||
|
||||
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");
|
||||
|
||||
i18nCatalog.setTagReplacements({
|
||||
@ -147,7 +158,7 @@ class CuraApplication(QtApplication):
|
||||
|
||||
controller = self.getController()
|
||||
|
||||
controller.setActiveView("MeshView")
|
||||
controller.setActiveView("SolidView")
|
||||
controller.setCameraTool("CameraTool")
|
||||
controller.setSelectionTool("SelectionTool")
|
||||
|
||||
@ -162,13 +173,12 @@ class CuraApplication(QtApplication):
|
||||
|
||||
self._volume = BuildVolume.BuildVolume(root)
|
||||
|
||||
self.getRenderer().setLightPosition(Vector(0, 150, 0))
|
||||
self.getRenderer().setBackgroundColor(QColor(245, 245, 245))
|
||||
|
||||
self._physics = PlatformPhysics.PlatformPhysics(controller, self._volume)
|
||||
|
||||
camera = Camera("3d", root)
|
||||
camera.setPosition(Vector(0, 250, 900))
|
||||
camera.setPosition(Vector(-80, 250, 700))
|
||||
camera.setPerspective(True)
|
||||
camera.lookAt(Vector(0, 0, 0))
|
||||
controller.getScene().setActiveCamera("3d")
|
||||
@ -231,18 +241,29 @@ class CuraApplication(QtApplication):
|
||||
|
||||
requestAddPrinter = pyqtSignal()
|
||||
activityChanged = pyqtSignal()
|
||||
sceneBoundingBoxChanged = pyqtSignal()
|
||||
|
||||
@pyqtProperty(bool, notify = activityChanged)
|
||||
def getPlatformActivity(self):
|
||||
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):
|
||||
count = 0
|
||||
scene_boundingbox = AxisAlignedBox()
|
||||
for node in DepthFirstIterator(self.getController().getScene().getRoot()):
|
||||
if type(node) is not SceneNode or not node.getMeshData():
|
||||
continue
|
||||
|
||||
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.activityChanged.emit()
|
||||
@ -254,6 +275,7 @@ class CuraApplication(QtApplication):
|
||||
self.jobNameChanged.emit()
|
||||
|
||||
jobNameChanged = pyqtSignal()
|
||||
|
||||
@pyqtProperty(str, notify = jobNameChanged)
|
||||
def jobName(self):
|
||||
return self._job_name
|
||||
@ -418,6 +440,7 @@ class CuraApplication(QtApplication):
|
||||
return log
|
||||
|
||||
recentFilesChanged = pyqtSignal()
|
||||
|
||||
@pyqtProperty("QVariantList", notify = recentFilesChanged)
|
||||
def recentFiles(self):
|
||||
return self._recent_files
|
||||
@ -432,6 +455,7 @@ class CuraApplication(QtApplication):
|
||||
self.expandedCategoriesChanged.emit()
|
||||
|
||||
expandedCategoriesChanged = pyqtSignal()
|
||||
|
||||
@pyqtProperty("QStringList", notify = expandedCategoriesChanged)
|
||||
def expandedCategories(self):
|
||||
return Preferences.getInstance().getValue("cura/categories_expanded").split(";")
|
||||
@ -514,6 +538,9 @@ class CuraApplication(QtApplication):
|
||||
for node in ungrouped_nodes:
|
||||
Selection.remove(node)
|
||||
|
||||
def _createSplashScreen(self):
|
||||
return CuraSplashScreen.CuraSplashScreen()
|
||||
|
||||
def _onActiveMachineChanged(self):
|
||||
machine = self.getMachineManager().getActiveMachineInstance()
|
||||
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)
|
||||
self._element_counts[layer] = data.elementCount
|
||||
|
||||
self.clear()
|
||||
self.addVertices(vertices)
|
||||
self.addColors(colors)
|
||||
self.addIndices(indices.flatten())
|
||||
@ -200,18 +201,14 @@ class Polygon():
|
||||
|
||||
def build(self, offset, vertices, colors, indices):
|
||||
self._begin = offset
|
||||
self._end = self._begin + len(self._data) - 1
|
||||
|
||||
color = self.getColor()
|
||||
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[offset + i, :] = self._data[i, :]
|
||||
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
|
||||
vertices[self._begin:self._end + 1, :] = self._data[:, :]
|
||||
colors[self._begin:self._end + 1, :] = color
|
||||
|
||||
for i in range(self._begin, self._end):
|
||||
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.
|
||||
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:
|
||||
current = todo_node_list.pop()
|
||||
for node in current.todo:
|
||||
@ -61,7 +61,7 @@ class OneAtATimeIterator(Iterator.Iterator):
|
||||
self._node_stack = new_order
|
||||
|
||||
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!
|
||||
|
||||
|
||||
@ -99,7 +99,7 @@ class OneAtATimeIterator(Iterator.Iterator):
|
||||
|
||||
|
||||
## Internal object used to keep track of a possible order in which to print objects.
|
||||
class _objectOrder():
|
||||
class _ObjectOrder():
|
||||
def __init__(self, order, todo):
|
||||
"""
|
||||
: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.
|
||||
|
||||
import sys
|
||||
import os
|
||||
|
||||
def exceptHook(type, value, traceback):
|
||||
import cura.CrashHandler
|
||||
@ -11,7 +12,15 @@ def exceptHook(type, value, traceback):
|
||||
|
||||
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"):
|
||||
import os
|
||||
|
@ -10,6 +10,7 @@ from UM.Scene.SceneNode import SceneNode
|
||||
from UM.Scene.GroupDecorator import GroupDecorator
|
||||
from UM.Math.Quaternion import Quaternion
|
||||
|
||||
from UM.Job import Job
|
||||
|
||||
import os
|
||||
import struct
|
||||
@ -36,7 +37,7 @@ class ThreeMFReader(MeshReader):
|
||||
if extension.lower() == self._supported_extension:
|
||||
result = SceneNode()
|
||||
# The base object of 3mf is a zipped archive.
|
||||
archive = zipfile.ZipFile(file_name, 'r')
|
||||
archive = zipfile.ZipFile(file_name, "r")
|
||||
try:
|
||||
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.findall(".//3mf:vertex", self._namespaces):
|
||||
vertex_list.append([vertex.get("x"), vertex.get("y"), vertex.get("z")])
|
||||
Job.yieldThread()
|
||||
|
||||
triangles = object.findall(".//3mf:triangle", self._namespaces)
|
||||
|
||||
@ -64,6 +66,8 @@ class ThreeMFReader(MeshReader):
|
||||
v2 = int(triangle.get("v2"))
|
||||
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])
|
||||
Job.yieldThread()
|
||||
|
||||
#TODO: We currently do not check for normals and simply recalculate them.
|
||||
mesh.calculateNormals()
|
||||
node.setMeshData(mesh)
|
||||
@ -105,10 +109,10 @@ class ThreeMFReader(MeshReader):
|
||||
node.setOrientation(temp_quaternion)
|
||||
|
||||
# Magical scale extraction
|
||||
S2 = temp_mat.getTransposed().multiply(temp_mat)
|
||||
scale_x = math.sqrt(S2.at(0,0))
|
||||
scale_y = math.sqrt(S2.at(1,1))
|
||||
scale_z = math.sqrt(S2.at(2,2))
|
||||
scale = temp_mat.getTransposed().multiply(temp_mat)
|
||||
scale_x = math.sqrt(scale.at(0,0))
|
||||
scale_y = math.sqrt(scale.at(1,1))
|
||||
scale_z = math.sqrt(scale.at(2,2))
|
||||
node.setScale(Vector(scale_x,scale_y,scale_z))
|
||||
|
||||
# We use a different coordinate frame, so rotate.
|
||||
@ -116,6 +120,8 @@ class ThreeMFReader(MeshReader):
|
||||
#node.rotate(rotation)
|
||||
result.addChild(node)
|
||||
|
||||
Job.yieldThread()
|
||||
|
||||
#If there is more then one object, group them.
|
||||
try:
|
||||
if len(objects) > 1:
|
||||
|
@ -1,11 +1,11 @@
|
||||
# Copyright (c) 2015 Ultimaker B.V.
|
||||
# Cura is released under the terms of the AGPLv3 or higher.
|
||||
|
||||
from . import ThreeMFReader
|
||||
|
||||
from UM.i18n import i18nCatalog
|
||||
catalog = i18nCatalog("cura")
|
||||
|
||||
from . import ThreeMFReader
|
||||
|
||||
def getMetaData():
|
||||
return {
|
||||
"plugin": {
|
||||
|
@ -58,7 +58,7 @@ class ChangeLog(Extension, QObject,):
|
||||
|
||||
def loadChangeLogs(self):
|
||||
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_header = None
|
||||
for line in f:
|
||||
|
@ -11,8 +11,8 @@ import UM 1.1 as UM
|
||||
UM.Dialog
|
||||
{
|
||||
id: base
|
||||
width: 300 * Screen.devicePixelRatio;
|
||||
height: 500 * Screen.devicePixelRatio;
|
||||
minimumWidth: 400
|
||||
minimumHeight: 300;
|
||||
title: "Changelog"
|
||||
|
||||
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
|
||||
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 ProcessSlicedObjectListJob
|
||||
from . import ProcessGCodeJob
|
||||
from . import StartSliceJob
|
||||
|
||||
import os
|
||||
import sys
|
||||
@ -49,6 +50,7 @@ class CuraEngineBackend(Backend):
|
||||
self._onActiveViewChanged()
|
||||
self._stored_layer_data = None
|
||||
|
||||
Application.getInstance().getMachineManager().activeMachineInstanceChanged.connect(self._onChanged)
|
||||
|
||||
self._profile = None
|
||||
Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onActiveProfileChanged)
|
||||
@ -67,12 +69,8 @@ class CuraEngineBackend(Backend):
|
||||
|
||||
self._slicing = False
|
||||
self._restart = False
|
||||
|
||||
self._save_gcode = True
|
||||
self._save_polygons = True
|
||||
self._report_progress = True
|
||||
|
||||
self._enabled = True
|
||||
self._always_restart = True
|
||||
|
||||
self._message = None
|
||||
|
||||
@ -103,24 +101,12 @@ class CuraEngineBackend(Backend):
|
||||
## Emitted whne the slicing process is aborted forcefully.
|
||||
slicingCancelled = Signal()
|
||||
|
||||
## Perform a slice of the scene with the given set of settings.
|
||||
#
|
||||
# \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):
|
||||
## Perform a slice of the scene.
|
||||
def slice(self):
|
||||
if not self._enabled:
|
||||
return
|
||||
|
||||
if self._slicing:
|
||||
if not kwargs.get("force_restart", True):
|
||||
return
|
||||
|
||||
self._slicing = False
|
||||
self._restart = True
|
||||
if self._process is not None:
|
||||
@ -129,105 +115,44 @@ class CuraEngineBackend(Backend):
|
||||
self._process.terminate()
|
||||
except: # terminating a process that is already terminating causes an exception, silently ignore this.
|
||||
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:
|
||||
self._message.hide()
|
||||
self._message = None
|
||||
return #No point in slicing an empty build plate
|
||||
|
||||
if kwargs.get("profile", self._profile).hasErrorValue():
|
||||
Logger.log('w', "Profile has error values. Aborting slicing")
|
||||
self.slicingCancelled.emit()
|
||||
return
|
||||
|
||||
if self._profile.hasErrorValue():
|
||||
Logger.log("w", "Profile has error values. Aborting slicing")
|
||||
if self._message:
|
||||
self._message.hide()
|
||||
self._message = None
|
||||
self._message = Message(catalog.i18nc("@info:status", "Unable to slice. Please check your setting values for errors."))
|
||||
self._message.show()
|
||||
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()):
|
||||
if type(node) is SceneNode and node.getMeshData():
|
||||
if node.callDecoration("getLayerData"):
|
||||
Application.getInstance().getController().getScene().getRoot().removeChild(node)
|
||||
break
|
||||
Application.getInstance().getController().getScene().gcode_list = None
|
||||
|
||||
self.processingProgress.emit(0.0)
|
||||
if self._message:
|
||||
self._message.setProgress(-1)
|
||||
#else:
|
||||
# self._message = Message(catalog.i18nc("@info:status", "Slicing..."), 0, False, -1)
|
||||
# self._message.show()
|
||||
|
||||
self._scene.gcode_list = []
|
||||
self._slicing = True
|
||||
self.slicingStarted.emit()
|
||||
|
||||
self._report_progress = kwargs.get("report_progress", True)
|
||||
if self._report_progress:
|
||||
self.processingProgress.emit(0.0)
|
||||
if not self._message:
|
||||
self._message = Message(catalog.i18nc("@info:status", "Slicing..."), 0, False, -1)
|
||||
self._message.show()
|
||||
else:
|
||||
self._message.setProgress(-1)
|
||||
job = StartSliceJob.StartSliceJob(self._profile, self._socket)
|
||||
job.start()
|
||||
job.finished.connect(self._onStartSliceCompleted)
|
||||
|
||||
self._sendSettings(kwargs.get("profile", self._profile))
|
||||
|
||||
self._scene.acquireLock()
|
||||
|
||||
# Set the gcode as an empty list. This will be filled with strings by GCodeLayer messages.
|
||||
# This is done so the gcode can be fragmented in memory and does not need a continues memory space.
|
||||
# (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 _onStartSliceCompleted(self, job):
|
||||
if job.getError() or job.getResult() != True:
|
||||
if self._message:
|
||||
self._message.hide()
|
||||
self._message = None
|
||||
return
|
||||
|
||||
def _onSceneChanged(self, source):
|
||||
if type(source) is not SceneNode:
|
||||
@ -257,41 +182,42 @@ class CuraEngineBackend(Backend):
|
||||
self._onChanged()
|
||||
|
||||
def _onSlicedObjectListMessage(self, message):
|
||||
if self._save_polygons:
|
||||
if self._layer_view_active:
|
||||
job = ProcessSlicedObjectListJob.ProcessSlicedObjectListJob(message)
|
||||
job.start()
|
||||
else :
|
||||
self._stored_layer_data = message
|
||||
if self._layer_view_active:
|
||||
job = ProcessSlicedObjectListJob.ProcessSlicedObjectListJob(message)
|
||||
job.start()
|
||||
else :
|
||||
self._stored_layer_data = 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:
|
||||
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):
|
||||
if self._save_gcode:
|
||||
job = ProcessGCodeJob.ProcessGCodeLayerJob(message)
|
||||
job.start()
|
||||
self._scene.gcode_list.append(message.data.decode("utf-8", "replace"))
|
||||
|
||||
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):
|
||||
self.printDurationMessage.emit(message.time, message.material_amount)
|
||||
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):
|
||||
super()._createSocket()
|
||||
|
||||
@ -313,15 +239,6 @@ class CuraEngineBackend(Backend):
|
||||
|
||||
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):
|
||||
if self._restart:
|
||||
self._onChanged()
|
||||
@ -346,22 +263,6 @@ class CuraEngineBackend(Backend):
|
||||
else:
|
||||
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):
|
||||
self._slicing = False
|
||||
|
@ -32,19 +32,18 @@ class ProcessSlicedObjectListJob(Job):
|
||||
|
||||
Application.getInstance().getController().activeViewChanged.connect(self._onActiveViewChanged)
|
||||
|
||||
objectIdMap = {}
|
||||
object_id_map = {}
|
||||
new_node = SceneNode()
|
||||
## Put all nodes in a dict identified by ID
|
||||
for node in DepthFirstIterator(self._scene.getRoot()):
|
||||
if type(node) is SceneNode and node.getMeshData():
|
||||
if node.callDecoration("getLayerData"):
|
||||
#if hasattr(node.getMeshData(), "layerData"):
|
||||
self._scene.getRoot().removeChild(node)
|
||||
else:
|
||||
objectIdMap[id(node)] = node
|
||||
object_id_map[id(node)] = node
|
||||
Job.yieldThread()
|
||||
|
||||
settings = Application.getInstance().getMachineManager().getActiveProfile()
|
||||
layerHeight = settings.getSettingValue("layer_height")
|
||||
|
||||
center = None
|
||||
if not settings.getSettingValue("machine_center_is_zero"):
|
||||
@ -54,9 +53,15 @@ class ProcessSlicedObjectListJob(Job):
|
||||
|
||||
mesh = MeshData()
|
||||
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:
|
||||
try:
|
||||
node = objectIdMap[object.id]
|
||||
node = object_id_map[object.id]
|
||||
except KeyError:
|
||||
continue
|
||||
|
||||
@ -73,23 +78,34 @@ class ProcessSlicedObjectListJob(Job):
|
||||
|
||||
points[:,2] *= -1
|
||||
|
||||
points -= numpy.array(center)
|
||||
points -= center
|
||||
|
||||
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
|
||||
layer_data.build()
|
||||
|
||||
|
||||
#Add layerdata decorator to scene node to indicate that the node has layerdata
|
||||
decorator = LayerDataDecorator.LayerDataDecorator()
|
||||
decorator.setLayerData(layer_data)
|
||||
new_node.addDecorator(decorator)
|
||||
|
||||
|
||||
new_node.setMeshData(mesh)
|
||||
new_node.setParent(self._scene.getRoot())
|
||||
|
||||
|
||||
if self._progress:
|
||||
self._progress.setProgress(100)
|
||||
|
||||
view = Application.getInstance().getController().getActiveView()
|
||||
if view.getPluginId() == "LayerView":
|
||||
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.
|
||||
# Cura is released under the terms of the AGPLv3 or higher.
|
||||
|
||||
from . import GCodeReader
|
||||
|
||||
from UM.i18n import i18nCatalog
|
||||
catalog = i18nCatalog("cura")
|
||||
|
||||
from . import GCodeReader
|
||||
|
||||
def getMetaData():
|
||||
return {
|
||||
"plugin": {
|
||||
|
@ -11,6 +11,9 @@ from UM.Scene.Selection import Selection
|
||||
from UM.Math.Color import Color
|
||||
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 PyQt5 import QtCore, QtWidgets
|
||||
@ -21,7 +24,8 @@ from . import LayerViewProxy
|
||||
class LayerView(View):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self._material = None
|
||||
self._shader = None
|
||||
self._selection_shader = None
|
||||
self._num_layers = 0
|
||||
self._layer_percentage = 0 # what percentage of layers need to be shown (SLider gives value between 0 - 100)
|
||||
self._proxy = LayerViewProxy.LayerViewProxy()
|
||||
@ -53,14 +57,10 @@ class LayerView(View):
|
||||
def beginRendering(self):
|
||||
scene = self.getController().getScene()
|
||||
renderer = self.getRenderer()
|
||||
renderer.setRenderSelection(False)
|
||||
|
||||
if not self._material:
|
||||
self._material = renderer.createMaterial(Resources.getPath(Resources.Shaders, "basic.vert"), Resources.getPath(Resources.Shaders, "vertexcolor.frag"))
|
||||
self._material.setUniformValue("u_color", [1.0, 0.0, 0.0, 1.0])
|
||||
|
||||
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))
|
||||
if not self._selection_shader:
|
||||
self._selection_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "default.shader"))
|
||||
self._selection_shader.setUniformValue("u_color", Color(32, 32, 32, 128))
|
||||
|
||||
for node in DepthFirstIterator(scene.getRoot()):
|
||||
# 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 node.getMeshData() and node.isVisible():
|
||||
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")
|
||||
if not layer_data:
|
||||
continue
|
||||
@ -87,7 +87,7 @@ class LayerView(View):
|
||||
end += counts
|
||||
|
||||
# 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
|
||||
if not self._current_layer_mesh:
|
||||
@ -111,7 +111,7 @@ class LayerView(View):
|
||||
if self._current_layer_mesh:
|
||||
self._current_layer_mesh.addColors(layer_mesh.getColors() * brightness)
|
||||
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:
|
||||
self._current_layer_jumps = MeshData()
|
||||
@ -133,7 +133,7 @@ class LayerView(View):
|
||||
brightness = (2.0 - (i / self._solid_layers)) / 2.0
|
||||
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):
|
||||
if self._current_layer_num != value:
|
||||
@ -152,31 +152,27 @@ class LayerView(View):
|
||||
def calculateMaxLayers(self):
|
||||
scene = self.getController().getScene()
|
||||
renderer = self.getRenderer()
|
||||
if renderer and self._material:
|
||||
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")
|
||||
if not layer_data:
|
||||
continue
|
||||
self._activity = True
|
||||
|
||||
if new_max_layers < len(layer_data.getLayers()):
|
||||
new_max_layers = len(layer_data.getLayers()) - 1
|
||||
self._old_max_layers = self._max_layers
|
||||
## Recalculate num max layers
|
||||
new_max_layers = 0
|
||||
for node in DepthFirstIterator(scene.getRoot()):
|
||||
layer_data = node.callDecoration("getLayerData")
|
||||
if not layer_data:
|
||||
continue
|
||||
|
||||
if new_max_layers > 0 and new_max_layers != self._old_max_layers:
|
||||
self._max_layers = new_max_layers
|
||||
self.maxLayersChanged.emit()
|
||||
self._current_layer_num = self._max_layers
|
||||
if new_max_layers < len(layer_data.getLayers()):
|
||||
new_max_layers = len(layer_data.getLayers()) - 1
|
||||
|
||||
# This makes sure we update the current layer
|
||||
self.setLayer(int(self._max_layers))
|
||||
self.currentLayerNumChanged.emit()
|
||||
if new_max_layers > 0 and new_max_layers != self._old_max_layers:
|
||||
self._max_layers = new_max_layers
|
||||
self.maxLayersChanged.emit()
|
||||
self._current_layer_num = self._max_layers
|
||||
|
||||
# This makes sure we update the current layer
|
||||
self.setLayer(int(self._max_layers))
|
||||
self.currentLayerNumChanged.emit()
|
||||
|
||||
maxLayersChanged = Signal()
|
||||
currentLayerNumChanged = Signal()
|
||||
|
@ -10,16 +10,16 @@ import UM 1.0 as UM
|
||||
|
||||
Item
|
||||
{
|
||||
width: 250
|
||||
height: 250
|
||||
width: UM.Theme.sizes.button.width
|
||||
height: UM.Theme.sizes.slider_layerview_size.height
|
||||
|
||||
Slider
|
||||
{
|
||||
id: slider
|
||||
width: 10
|
||||
height: 250
|
||||
anchors.right : parent.right
|
||||
anchors.rightMargin: UM.Theme.sizes.slider_layerview_margin.width/2
|
||||
width: UM.Theme.sizes.slider_layerview_size.width
|
||||
height: UM.Theme.sizes.slider_layerview_size.height
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: UM.Theme.sizes.slider_layerview_margin.width/2
|
||||
orientation: Qt.Vertical
|
||||
minimumValue: 0;
|
||||
maximumValue: UM.LayerView.numLayers;
|
||||
@ -31,15 +31,7 @@ Item
|
||||
style: UM.Theme.styles.layerViewSlider
|
||||
}
|
||||
Rectangle {
|
||||
anchors.right: parent.right
|
||||
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.left: parent.left
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
z: slider.z - 1
|
||||
width: UM.Theme.sizes.slider_layerview_background.width
|
||||
|
@ -1,6 +1,8 @@
|
||||
from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot, pyqtProperty
|
||||
from UM.Application import Application
|
||||
|
||||
import LayerView
|
||||
|
||||
class LayerViewProxy(QObject):
|
||||
def __init__(self, parent = None):
|
||||
super().__init__(parent)
|
||||
@ -52,4 +54,4 @@ class LayerViewProxy(QObject):
|
||||
active_view = self._controller.getActiveView()
|
||||
if type(active_view) == LayerView.LayerView.LayerView:
|
||||
active_view.currentLayerNumChanged.connect(self._onLayerChanged)
|
||||
active_view.maxLayersChanged.connect(self._onMaxLayersChanged)
|
||||
active_view.maxLayersChanged.connect(self._onMaxLayersChanged)
|
||||
|
@ -10,67 +10,53 @@ import UM 1.1 as UM
|
||||
|
||||
Item {
|
||||
id: base;
|
||||
property int currentIndex: UM.ActiveTool.properties.SelectedIndex;
|
||||
property string printSequence: UM.ActiveTool.properties.PrintSequence;
|
||||
|
||||
width: 0;
|
||||
height: 0;
|
||||
width: childrenRect.width;
|
||||
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;
|
||||
property real viewportHeight: UM.Application.mainWindow.height * UM.Application.mainWindow.viewportRect.height;
|
||||
spacing: UM.Theme.sizes.default_margin.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 {
|
||||
id: settingsPanel;
|
||||
UM.SettingItem {
|
||||
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;
|
||||
height: items.height + UM.Theme.sizes.default_margin.height * 2;
|
||||
name: catalog.i18nc("@label", "Object profile")
|
||||
type: "enum"
|
||||
indent: false
|
||||
|
||||
opacity: 0;
|
||||
Behavior on opacity { NumberAnimation { } }
|
||||
style: UM.Theme.styles.setting_item;
|
||||
|
||||
border.width: UM.Theme.sizes.per_object_settings_panel_border.width;
|
||||
border.color: UM.Theme.colors.per_object_settings_panel_border;
|
||||
options: UM.ProfilesModel { addUseGlobal: true }
|
||||
|
||||
color: UM.Theme.colors.per_object_settings_panel_background;
|
||||
value: UM.ActiveTool.properties.Model.getItem(base.currentIndex).profile
|
||||
|
||||
DropArea {
|
||||
anchors.fill: parent;
|
||||
onItemValueChanged: {
|
||||
var item = UM.ActiveTool.properties.Model.getItem(base.currentIndex);
|
||||
UM.ActiveTool.properties.Model.setObjectProfile(item.id, value)
|
||||
}
|
||||
}
|
||||
|
||||
Column {
|
||||
id: items
|
||||
anchors.top: parent.top;
|
||||
anchors.topMargin: UM.Theme.sizes.default_margin.height;
|
||||
|
||||
id: customisedSettings
|
||||
spacing: UM.Theme.sizes.default_lining.height;
|
||||
|
||||
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)
|
||||
}
|
||||
}
|
||||
width: UM.Theme.sizes.setting.width + UM.Theme.sizes.setting.height/2;
|
||||
|
||||
Repeater {
|
||||
id: settings;
|
||||
@ -80,7 +66,6 @@ Item {
|
||||
UM.SettingItem {
|
||||
width: UM.Theme.sizes.setting.width;
|
||||
height: UM.Theme.sizes.setting.height;
|
||||
x: UM.Theme.sizes.per_object_settings_panel_border.width + 1
|
||||
|
||||
name: model.label;
|
||||
type: model.type;
|
||||
@ -88,9 +73,8 @@ Item {
|
||||
description: model.description;
|
||||
unit: model.unit;
|
||||
valid: model.valid;
|
||||
perObjectSetting: true
|
||||
dismissable: true
|
||||
options: model.options
|
||||
indent: false
|
||||
|
||||
style: UM.Theme.styles.setting_item;
|
||||
|
||||
@ -98,87 +82,46 @@ Item {
|
||||
settings.model.setSettingValue(model.key, value)
|
||||
}
|
||||
|
||||
// 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
|
||||
Button
|
||||
{
|
||||
width: control.width;
|
||||
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;
|
||||
}
|
||||
}
|
||||
anchors.left: parent.right;
|
||||
|
||||
onClicked: settingPickDialog.visible = true;
|
||||
width: UM.Theme.sizes.setting.height;
|
||||
height: UM.Theme.sizes.setting.height;
|
||||
|
||||
Connections
|
||||
{
|
||||
target: UM.Preferences;
|
||||
onClicked: UM.ActiveTool.properties.Model.removeSettingOverride(UM.ActiveTool.properties.Model.getItem(base.currentIndex).id, model.key)
|
||||
|
||||
onPreferenceChanged:
|
||||
{
|
||||
customise_settings_button.visible = parseInt(UM.Preferences.getValue("cura/active_mode"))
|
||||
style: ButtonStyle
|
||||
{
|
||||
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 {
|
||||
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;
|
||||
}
|
||||
text: catalog.i18nc("@action:button", "Add Setting");
|
||||
|
||||
style: ButtonStyle
|
||||
{
|
||||
@ -186,20 +129,36 @@ Item {
|
||||
{
|
||||
width: control.width;
|
||||
height: control.height;
|
||||
|
||||
color: control.hovered ? UM.Theme.colors.button_active : UM.Theme.colors.button_hover;
|
||||
border.width: UM.Theme.sizes.default_lining.width;
|
||||
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 {
|
||||
width: control.width;
|
||||
height: control.height;
|
||||
sourceSize.width: width;
|
||||
sourceSize.height: height;
|
||||
source: UM.Theme.icons.plus;
|
||||
label: Label
|
||||
{
|
||||
text: control.text;
|
||||
color: UM.Theme.colors.setting_control_text;
|
||||
anchors.centerIn: parent
|
||||
}
|
||||
}
|
||||
|
||||
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 {
|
||||
id: settingPickDialog
|
||||
|
||||
|
@ -2,6 +2,8 @@
|
||||
# Uranium is released under the terms of the AGPLv3 or higher.
|
||||
|
||||
from UM.Tool import Tool
|
||||
from UM.Scene.Selection import Selection
|
||||
from UM.Application import Application
|
||||
|
||||
from . import PerObjectSettingsModel
|
||||
|
||||
@ -9,10 +11,19 @@ class PerObjectSettingsTool(Tool):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
self.setExposedProperties("Model")
|
||||
self.setExposedProperties("Model", "SelectedIndex", "PrintSequence")
|
||||
|
||||
def event(self, event):
|
||||
return False
|
||||
|
||||
def getModel(self):
|
||||
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:
|
||||
return
|
||||
|
||||
self._ignore_setting_change = key
|
||||
self._decorator.setSettingValue(key, value)
|
||||
self._ignore_setting_change = None
|
||||
|
||||
def _onDecoratorsChanged(self, node):
|
||||
if not self._node.getDecorator(SettingOverrideDecorator):
|
||||
@ -97,6 +95,6 @@ class SettingOverrideModel(ListModel):
|
||||
def _onSettingValueChanged(self, setting):
|
||||
index = self.find("key", 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, "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"),
|
||||
"description": i18n_catalog.i18nc("@info:tooltip", "Configure Per Object Settings"),
|
||||
"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.setPriority(1)
|
||||
|
||||
self._writing = False
|
||||
|
||||
def requestWrite(self, node, file_name = None):
|
||||
if self._writing:
|
||||
raise OutputDeviceError.DeviceBusyError()
|
||||
|
||||
gcode_writer = Application.getInstance().getMeshFileHandler().getWriterByMimeType("text/x-gcode")
|
||||
if not gcode_writer:
|
||||
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.show()
|
||||
|
||||
self.writeStarted.emit(self)
|
||||
|
||||
job._message = message
|
||||
self._writing = True
|
||||
job.start()
|
||||
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
|
||||
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
|
||||
|
||||
def _onProgress(self, job, progress):
|
||||
@ -68,6 +78,8 @@ class RemovableDriveOutputDevice(OutputDevice):
|
||||
if hasattr(job, "_message"):
|
||||
job._message.hide()
|
||||
job._message = None
|
||||
|
||||
self._writing = False
|
||||
self.writeFinished.emit(self)
|
||||
if job.getResult():
|
||||
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
|
||||
# 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_WRITE = 1073741824
|
||||
GENERIC_READ = 2147483648 # [CodeStyle: Windows Enum value]
|
||||
GENERIC_WRITE = 1073741824 # [CodeStyle: Windows Enum value]
|
||||
|
||||
FILE_SHARE_READ = 1
|
||||
FILE_SHARE_WRITE = 2
|
||||
FILE_SHARE_READ = 1 # [CodeStyle: Windows Enum value]
|
||||
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
|
||||
class WindowsRemovableDrivePlugin(RemovableDrivePlugin.RemovableDrivePlugin):
|
||||
@ -65,11 +65,11 @@ class WindowsRemovableDrivePlugin(RemovableDrivePlugin.RemovableDrivePlugin):
|
||||
continue
|
||||
|
||||
# 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)
|
||||
if windll.kernel32.GetDiskFreeSpaceExA(drive.encode("ascii"), ctypes.byref(freeBytes), None, None) == 0:
|
||||
free_bytes = ctypes.c_longlong(0)
|
||||
if windll.kernel32.GetDiskFreeSpaceExA(drive.encode("ascii"), ctypes.byref(free_bytes), None, None) == 0:
|
||||
continue
|
||||
|
||||
if freeBytes.value < 1:
|
||||
if free_bytes.value < 1:
|
||||
continue
|
||||
|
||||
drives[drive] = "{0} ({1}:)".format(volume_name, letter)
|
||||
|
@ -110,7 +110,7 @@ class SliceInfo(Extension):
|
||||
|
||||
# Convert data to bytes
|
||||
submitted_data = urllib.parse.urlencode(submitted_data)
|
||||
binary_data = submitted_data.encode('utf-8')
|
||||
binary_data = submitted_data.encode("utf-8")
|
||||
|
||||
# Submit data
|
||||
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._end_stop_thread = threading.Thread(target = self._pollEndStop)
|
||||
self._end_stop_thread.deamon = True
|
||||
self._end_stop_thread.daemon = True
|
||||
self._poll_endstop = -1
|
||||
|
||||
# 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.daemon = True
|
||||
self.firmwareUpdateComplete.connect(self._onFirmwareUpdateComplete)
|
||||
|
||||
self._heatup_wait_start_time = time.time()
|
||||
|
||||
@ -197,6 +198,8 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
|
||||
|
||||
## Private fuction (threaded) that actually uploads the firmware.
|
||||
def _updateFirmware(self):
|
||||
self.setProgress(0, 100)
|
||||
|
||||
if self._is_connecting or self._is_connected:
|
||||
self.close()
|
||||
hex_file = intelHex.readHex(self._firmware_file_name)
|
||||
@ -207,7 +210,11 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
|
||||
|
||||
programmer = stk500v2.Stk500v2()
|
||||
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.
|
||||
|
||||
@ -336,8 +343,8 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
|
||||
self._connect_thread = threading.Thread(target=self._connect)
|
||||
self._connect_thread.daemon = True
|
||||
|
||||
self.setIsConnected(False)
|
||||
if self._serial is not None:
|
||||
self.setIsConnected(False)
|
||||
try:
|
||||
self._listen_thread.join()
|
||||
except:
|
||||
@ -464,17 +471,17 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
|
||||
self.showControlInterface()
|
||||
|
||||
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:
|
||||
self.endstopStateChanged.emit('x_min', value)
|
||||
self.endstopStateChanged.emit("x_min", 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:
|
||||
self.endstopStateChanged.emit('y_min', value)
|
||||
self.endstopStateChanged.emit("y_min", 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:
|
||||
self.endstopStateChanged.emit('z_min', value)
|
||||
self.endstopStateChanged.emit("z_min", value)
|
||||
self._z_min_endstop_pressed = value
|
||||
|
||||
## Listen thread function.
|
||||
@ -521,8 +528,8 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
|
||||
pass
|
||||
#TODO: temperature changed callback
|
||||
elif b"_min" in line or b"_max" in line:
|
||||
tag, value = line.split(b':', 1)
|
||||
self._setEndstopState(tag,(b'H' in value or b'TRIGGERED' in value))
|
||||
tag, value = line.split(b":", 1)
|
||||
self._setEndstopState(tag,(b"H" in value or b"TRIGGERED" in value))
|
||||
|
||||
if self._is_printing:
|
||||
if line == b"" and time.time() > ok_timeout:
|
||||
|
@ -11,6 +11,7 @@ from UM.Logger import Logger
|
||||
from UM.PluginRegistry import PluginRegistry
|
||||
from UM.OutputDevice.OutputDevicePlugin import OutputDevicePlugin
|
||||
from UM.Qt.ListModel import ListModel
|
||||
from UM.Message import Message
|
||||
|
||||
from cura.CuraApplication import CuraApplication
|
||||
|
||||
@ -55,6 +56,7 @@ class USBPrinterManager(QObject, SignalEmitter, OutputDevicePlugin, Extension):
|
||||
printerConnectionStateChanged = pyqtSignal()
|
||||
|
||||
progressChanged = pyqtSignal()
|
||||
|
||||
@pyqtProperty(float, notify = progressChanged)
|
||||
def progress(self):
|
||||
progress = 0
|
||||
@ -95,6 +97,10 @@ class USBPrinterManager(QObject, SignalEmitter, OutputDevicePlugin, Extension):
|
||||
|
||||
@pyqtSlot()
|
||||
def updateAllFirmware(self):
|
||||
if not self._printer_connections:
|
||||
Message("Cannot update firmware, there were no connected printers found.").show()
|
||||
return
|
||||
|
||||
self.spawnFirmwareInterface("")
|
||||
for printer_connection in self._printer_connections:
|
||||
try:
|
||||
@ -159,6 +165,16 @@ class USBPrinterManager(QObject, SignalEmitter, OutputDevicePlugin, Extension):
|
||||
continue
|
||||
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.
|
||||
def addConnection(self, 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.
|
||||
"""
|
||||
|
||||
avrChipDB = {
|
||||
'ATMega1280': {
|
||||
'signature': [0x1E, 0x97, 0x03],
|
||||
'pageSize': 128,
|
||||
'pageCount': 512,
|
||||
avr_chip_db = {
|
||||
"ATMega1280": {
|
||||
"signature": [0x1E, 0x97, 0x03],
|
||||
"pageSize": 128,
|
||||
"pageCount": 512,
|
||||
},
|
||||
'ATMega2560': {
|
||||
'signature': [0x1E, 0x98, 0x01],
|
||||
'pageSize': 128,
|
||||
'pageCount': 1024,
|
||||
"ATMega2560": {
|
||||
"signature": [0x1E, 0x98, 0x01],
|
||||
"pageSize": 128,
|
||||
"pageCount": 1024,
|
||||
},
|
||||
}
|
||||
|
||||
def getChipFromDB(sig):
|
||||
for chip in avrChipDB.values():
|
||||
if chip['signature'] == sig:
|
||||
for chip in avr_chip_db.values():
|
||||
if chip["signature"] == sig:
|
||||
return chip
|
||||
return False
|
||||
|
||||
|
@ -11,36 +11,36 @@ def readHex(filename):
|
||||
Read an verify an intel hex file. Return the data as an list of bytes.
|
||||
"""
|
||||
data = []
|
||||
extraAddr = 0
|
||||
extra_addr = 0
|
||||
f = io.open(filename, "r")
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if len(line) < 1:
|
||||
continue
|
||||
if line[0] != ':':
|
||||
if line[0] != ":":
|
||||
raise Exception("Hex file has a line not starting with ':'")
|
||||
recLen = int(line[1:3], 16)
|
||||
addr = int(line[3:7], 16) + extraAddr
|
||||
recType = int(line[7:9], 16)
|
||||
if len(line) != recLen * 2 + 11:
|
||||
rec_len = int(line[1:3], 16)
|
||||
addr = int(line[3:7], 16) + extra_addr
|
||||
rec_type = int(line[7:9], 16)
|
||||
if len(line) != rec_len * 2 + 11:
|
||||
raise Exception("Error in hex file: " + line)
|
||||
checkSum = 0
|
||||
for i in range(0, recLen + 5):
|
||||
checkSum += int(line[i*2+1:i*2+3], 16)
|
||||
checkSum &= 0xFF
|
||||
if checkSum != 0:
|
||||
check_sum = 0
|
||||
for i in range(0, rec_len + 5):
|
||||
check_sum += int(line[i*2+1:i*2+3], 16)
|
||||
check_sum &= 0xFF
|
||||
if check_sum != 0:
|
||||
raise Exception("Checksum error in hex file: " + line)
|
||||
|
||||
if recType == 0:#Data record
|
||||
while len(data) < addr + recLen:
|
||||
if rec_type == 0:#Data record
|
||||
while len(data) < addr + rec_len:
|
||||
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)
|
||||
elif recType == 1: #End Of File record
|
||||
elif rec_type == 1: #End Of File record
|
||||
pass
|
||||
elif recType == 2: #Extended Segment Address Record
|
||||
extraAddr = int(line[9:13], 16) * 16
|
||||
elif rec_type == 2: #Extended Segment Address Record
|
||||
extra_addr = int(line[9:13], 16) * 16
|
||||
else:
|
||||
print(recType, recLen, addr, checkSum, line)
|
||||
print(rec_type, rec_len, addr, check_sum, line)
|
||||
f.close()
|
||||
return data
|
||||
|
@ -14,18 +14,18 @@ class IspBase():
|
||||
Base class for ISP based AVR programmers.
|
||||
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. """
|
||||
self.curExtAddr = -1
|
||||
self.cur_ext_addr = -1
|
||||
self.chip = chipDB.getChipFromDB(self.getSignature())
|
||||
if not self.chip:
|
||||
raise IspError("Chip with signature: " + str(self.getSignature()) + "not found")
|
||||
self.chipErase()
|
||||
|
||||
print("Flashing %i bytes" % len(flashData))
|
||||
self.writeFlash(flashData)
|
||||
print("Verifying %i bytes" % len(flashData))
|
||||
self.verifyFlash(flashData)
|
||||
print("Flashing %i bytes" % len(flash_data))
|
||||
self.writeFlash(flash_data)
|
||||
print("Verifying %i bytes" % len(flash_data))
|
||||
self.verifyFlash(flash_data)
|
||||
print("Completed")
|
||||
|
||||
def getSignature(self):
|
||||
@ -45,20 +45,20 @@ class IspBase():
|
||||
"""
|
||||
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.
|
||||
"""
|
||||
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.
|
||||
"""
|
||||
raise IspError("Called undefined verifyFlash")
|
||||
|
||||
|
||||
class IspError(BaseException):
|
||||
class IspError(Exception):
|
||||
def __init__(self, value):
|
||||
self.value = value
|
||||
|
||||
|
@ -19,10 +19,10 @@ class Stk500v2(ispBase.IspBase):
|
||||
def __init__(self):
|
||||
self.serial = None
|
||||
self.seq = 1
|
||||
self.lastAddr = -1
|
||||
self.progressCallback = None
|
||||
self.last_addr = -1
|
||||
self.progress_callback = None
|
||||
|
||||
def connect(self, port = 'COM22', speed = 115200):
|
||||
def connect(self, port = "COM22", speed = 115200):
|
||||
if self.serial is not None:
|
||||
self.close()
|
||||
try:
|
||||
@ -82,49 +82,49 @@ class Stk500v2(ispBase.IspBase):
|
||||
|
||||
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
|
||||
page_size = self.chip['pageSize'] * 2
|
||||
flashSize = page_size * self.chip['pageCount']
|
||||
page_size = self.chip["pageSize"] * 2
|
||||
flash_size = page_size * self.chip["pageCount"]
|
||||
print("Writing flash")
|
||||
if flashSize > 0xFFFF:
|
||||
if flash_size > 0xFFFF:
|
||||
self.sendMessage([0x06, 0x80, 0x00, 0x00, 0x00])
|
||||
else:
|
||||
self.sendMessage([0x06, 0x00, 0x00, 0x00, 0x00])
|
||||
load_count = (len(flash_data) + page_size - 1) / page_size
|
||||
for i in range(0, int(load_count)):
|
||||
recv = self.sendMessage([0x13, page_size >> 8, page_size & 0xFF, 0xc1, 0x0a, 0x40, 0x4c, 0x20, 0x00, 0x00] + flash_data[(i * page_size):(i * page_size + page_size)])
|
||||
if self.progressCallback is not None:
|
||||
if self.progress_callback is not None:
|
||||
if self._has_checksum:
|
||||
self.progressCallback(i + 1, load_count)
|
||||
self.progress_callback(i + 1, load_count)
|
||||
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:
|
||||
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])
|
||||
checksum_recv = res[2] | (res[3] << 8)
|
||||
checksum = 0
|
||||
for d in flashData:
|
||||
for d in flash_data:
|
||||
checksum += d
|
||||
checksum &= 0xFFFF
|
||||
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:
|
||||
#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']
|
||||
if flashSize > 0xFFFF:
|
||||
flash_size = self.chip["pageSize"] * 2 * self.chip["pageCount"]
|
||||
if flash_size > 0xFFFF:
|
||||
self.sendMessage([0x06, 0x80, 0x00, 0x00, 0x00])
|
||||
else:
|
||||
self.sendMessage([0x06, 0x00, 0x00, 0x00, 0x00])
|
||||
|
||||
loadCount = (len(flashData) + 0xFF) / 0x100
|
||||
for i in range(0, int(loadCount)):
|
||||
load_count = (len(flash_data) + 0xFF) / 0x100
|
||||
for i in range(0, int(load_count)):
|
||||
recv = self.sendMessage([0x14, 0x01, 0x00, 0x20])[2:0x102]
|
||||
if self.progressCallback is not None:
|
||||
self.progressCallback(loadCount + i + 1, loadCount*2)
|
||||
if self.progress_callback is not None:
|
||||
self.progress_callback(load_count + i + 1, load_count*2)
|
||||
for j in range(0, 0x100):
|
||||
if i * 0x100 + j < len(flashData) and flashData[i * 0x100 + j] != recv[j]:
|
||||
raise ispBase.IspError('Verify error at: 0x%x' % (i * 0x100 + 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))
|
||||
|
||||
def sendMessage(self, data):
|
||||
message = struct.pack(">BBHB", 0x1B, self.seq, len(data), 0x0E)
|
||||
@ -138,12 +138,12 @@ class Stk500v2(ispBase.IspBase):
|
||||
self.serial.write(message)
|
||||
self.serial.flush()
|
||||
except SerialTimeoutException:
|
||||
raise ispBase.IspError('Serial send timeout')
|
||||
raise ispBase.IspError("Serial send timeout")
|
||||
self.seq = (self.seq + 1) & 0xFF
|
||||
return self.recvMessage()
|
||||
|
||||
def recvMessage(self):
|
||||
state = 'Start'
|
||||
state = "Start"
|
||||
checksum = 0
|
||||
while True:
|
||||
s = self.serial.read()
|
||||
@ -152,31 +152,31 @@ class Stk500v2(ispBase.IspBase):
|
||||
b = struct.unpack(">B", s)[0]
|
||||
checksum ^= b
|
||||
#print(hex(b))
|
||||
if state == 'Start':
|
||||
if state == "Start":
|
||||
if b == 0x1B:
|
||||
state = 'GetSeq'
|
||||
state = "GetSeq"
|
||||
checksum = 0x1B
|
||||
elif state == 'GetSeq':
|
||||
state = 'MsgSize1'
|
||||
elif state == 'MsgSize1':
|
||||
msgSize = b << 8
|
||||
state = 'MsgSize2'
|
||||
elif state == 'MsgSize2':
|
||||
msgSize |= b
|
||||
state = 'Token'
|
||||
elif state == 'Token':
|
||||
elif state == "GetSeq":
|
||||
state = "MsgSize1"
|
||||
elif state == "MsgSize1":
|
||||
msg_size = b << 8
|
||||
state = "MsgSize2"
|
||||
elif state == "MsgSize2":
|
||||
msg_size |= b
|
||||
state = "Token"
|
||||
elif state == "Token":
|
||||
if b != 0x0E:
|
||||
state = 'Start'
|
||||
state = "Start"
|
||||
else:
|
||||
state = 'Data'
|
||||
state = "Data"
|
||||
data = []
|
||||
elif state == 'Data':
|
||||
elif state == "Data":
|
||||
data.append(b)
|
||||
if len(data) == msgSize:
|
||||
state = 'Checksum'
|
||||
elif state == 'Checksum':
|
||||
if len(data) == msg_size:
|
||||
state = "Checksum"
|
||||
elif state == "Checksum":
|
||||
if checksum != 0:
|
||||
state = 'Start'
|
||||
state = "Start"
|
||||
else:
|
||||
return data
|
||||
|
||||
@ -190,7 +190,7 @@ def portList():
|
||||
values = _winreg.EnumValue(key, i)
|
||||
except:
|
||||
return ret
|
||||
if 'USBSER' in values[0]:
|
||||
if "USBSER" in values[0]:
|
||||
ret.append(values[1])
|
||||
i+=1
|
||||
return ret
|
||||
@ -205,7 +205,7 @@ def runProgrammer(port, filename):
|
||||
def main():
|
||||
""" Entry point to call the stk500v2 programmer from the commandline. """
|
||||
import threading
|
||||
if sys.argv[1] == 'AUTO':
|
||||
if sys.argv[1] == "AUTO":
|
||||
print(portList())
|
||||
for port in portList():
|
||||
threading.Thread(target=runProgrammer, args=(port,sys.argv[2])).start()
|
||||
@ -216,5 +216,5 @@ def main():
|
||||
programmer.programChip(intelHex.readHex(sys.argv[2]))
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
if __name__ == "__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
|
||||
|
2130
resources/i18n/de/cura.po
Normal file → Executable file
5649
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"
|
||||
"Report-Msgid-Bugs-To: \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"
|
||||
"Language-Team: \n"
|
||||
"Language: fi_FI\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\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"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/cura/CrashHandler.py:20
|
||||
msgctxt "@title:window"
|
||||
msgid "Oops!"
|
||||
msgstr ""
|
||||
msgstr "Hups!"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/cura/CrashHandler.py:26
|
||||
msgctxt "@label"
|
||||
@ -30,11 +30,14 @@ msgid ""
|
||||
"below to post a bug report at <a href=\"http://github.com/Ultimaker/Cura/"
|
||||
"issues\">http://github.com/Ultimaker/Cura/issues</a></p>"
|
||||
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
|
||||
msgctxt "@action:button"
|
||||
msgid "Open Web Page"
|
||||
msgstr ""
|
||||
msgstr "Avaa verkkosivu"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/cura/CuraApplication.py:135
|
||||
#, fuzzy
|
||||
@ -51,34 +54,32 @@ msgstr "Ladataan käyttöliittymää..."
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/3MFReader/__init__.py:12
|
||||
msgctxt "@label"
|
||||
msgid "3MF Reader"
|
||||
msgstr ""
|
||||
msgstr "3MF Reader"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/3MFReader/__init__.py:15
|
||||
msgctxt "@info:whatsthis"
|
||||
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
|
||||
#, fuzzy
|
||||
msgctxt "@item:inlistbox"
|
||||
msgid "3MF File"
|
||||
msgstr "&Tiedosto"
|
||||
msgstr "3MF-tiedosto"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/ChangeLogPlugin/__init__.py:12
|
||||
#, fuzzy
|
||||
msgctxt "@label"
|
||||
msgid "Change Log"
|
||||
msgstr "Moottorin loki"
|
||||
msgstr "Muutosloki"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/ChangeLogPlugin/__init__.py:15
|
||||
msgctxt "@info:whatsthis"
|
||||
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
|
||||
msgctxt "@label"
|
||||
msgid "CuraEngine Backend"
|
||||
msgstr ""
|
||||
msgstr "CuraEngine-taustaosa"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/CuraEngineBackend/__init__.py:15
|
||||
#, fuzzy
|
||||
@ -90,25 +91,22 @@ msgstr "Linkki CuraEngine-viipalointiin taustalla"
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/CuraEngineBackend/ProcessSlicedObjectListJob.py:111
|
||||
msgctxt "@info:status"
|
||||
msgid "Processing Layers"
|
||||
msgstr ""
|
||||
msgstr "Käsitellään kerroksia"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/CuraEngineBackend/CuraEngineBackend.py:169
|
||||
#, fuzzy
|
||||
msgctxt "@info:status"
|
||||
msgid "Slicing..."
|
||||
msgstr "Lasketaan..."
|
||||
msgstr "Viipaloidaan..."
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/GCodeWriter/__init__.py:12
|
||||
#, fuzzy
|
||||
msgctxt "@label"
|
||||
msgid "GCode Writer"
|
||||
msgstr "GCode-tiedosto"
|
||||
msgstr "GCode Writer"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/GCodeWriter/__init__.py:15
|
||||
#, fuzzy
|
||||
msgctxt "@info:whatsthis"
|
||||
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
|
||||
#, fuzzy
|
||||
@ -117,19 +115,16 @@ msgid "GCode File"
|
||||
msgstr "GCode-tiedosto"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/LayerView/__init__.py:13
|
||||
#, fuzzy
|
||||
msgctxt "@label"
|
||||
msgid "Layer View"
|
||||
msgstr "Kerrokset"
|
||||
msgstr "Kerrosnäkymä"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/LayerView/__init__.py:16
|
||||
#, fuzzy
|
||||
msgctxt "@info:whatsthis"
|
||||
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
|
||||
#, fuzzy
|
||||
msgctxt "@item:inlistbox"
|
||||
msgid "Layers"
|
||||
msgstr "Kerrokset"
|
||||
@ -137,28 +132,27 @@ msgstr "Kerrokset"
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:20
|
||||
msgctxt "@action:button"
|
||||
msgid "Save to Removable Drive"
|
||||
msgstr ""
|
||||
msgstr "Tallenna siirrettävälle asemalle"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:21
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgctxt "@item:inlistbox"
|
||||
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
|
||||
#, python-brace-format
|
||||
msgctxt "@info:progress"
|
||||
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
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgctxt "@info:status"
|
||||
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
|
||||
#, fuzzy
|
||||
msgctxt "@action:button"
|
||||
msgid "Eject"
|
||||
msgstr "Poista"
|
||||
@ -167,96 +161,98 @@ msgstr "Poista"
|
||||
#, python-brace-format
|
||||
msgctxt "@action"
|
||||
msgid "Eject removable device {0}"
|
||||
msgstr ""
|
||||
msgstr "Poista siirrettävä asema {0}"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:79
|
||||
#, python-brace-format
|
||||
msgctxt "@info:status"
|
||||
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
|
||||
msgctxt "@item:intext"
|
||||
msgid "Removable Drive"
|
||||
msgstr ""
|
||||
msgstr "Siirrettävä asema"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/RemovableDrivePlugin.py:42
|
||||
#, python-brace-format
|
||||
msgctxt "@info:status"
|
||||
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
|
||||
#, python-brace-format
|
||||
msgctxt "@info:status"
|
||||
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
|
||||
msgctxt "@label"
|
||||
msgid "Removable Drive Output Device Plugin"
|
||||
msgstr ""
|
||||
msgstr "Irrotettavan aseman lisäosa"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/RemovableDriveOutputDevice/__init__.py:14
|
||||
msgctxt "@info:whatsthis"
|
||||
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
|
||||
msgctxt "@label"
|
||||
msgid "Slice info"
|
||||
msgstr ""
|
||||
msgstr "Viipalointitiedot"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/SliceInfoPlugin/__init__.py:13
|
||||
msgctxt "@info:whatsthis"
|
||||
msgid "Submits anonymous slice info. Can be disabled through preferences."
|
||||
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
|
||||
msgctxt "@info"
|
||||
msgid ""
|
||||
"Cura automatically sends slice info. You can disable this in preferences"
|
||||
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
|
||||
msgctxt "@action:button"
|
||||
msgid "Dismiss"
|
||||
msgstr ""
|
||||
msgstr "Ohita"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/PrinterConnection.py:35
|
||||
msgctxt "@item:inmenu"
|
||||
msgid "USB printing"
|
||||
msgstr ""
|
||||
msgstr "USB-tulostus"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/PrinterConnection.py:36
|
||||
msgctxt "@action:button"
|
||||
msgid "Print with USB"
|
||||
msgstr ""
|
||||
msgstr "Tulosta USB:llä"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/PrinterConnection.py:37
|
||||
msgctxt "@info:tooltip"
|
||||
msgid "Print with USB"
|
||||
msgstr ""
|
||||
msgstr "Tulostus USB:n kautta"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/__init__.py:13
|
||||
msgctxt "@label"
|
||||
msgid "USB printing"
|
||||
msgstr ""
|
||||
msgstr "USB-tulostus"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/__init__.py:17
|
||||
#, fuzzy
|
||||
msgctxt "@info:whatsthis"
|
||||
msgid ""
|
||||
"Accepts G-Code and sends them to a printer. Plugin can also update firmware."
|
||||
msgstr ""
|
||||
"Hyväksyy G-Coden ja lähettää ne tulostimeen. Lisäosa voi myös päivittää "
|
||||
"laiteohjelmiston"
|
||||
"Hyväksyy G-Code-määrittelyt ja lähettää ne tulostimeen. Lisäosa voi myös "
|
||||
"päivittää laiteohjelmiston."
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/USBPrinterManager.py:46
|
||||
#, fuzzy
|
||||
msgctxt "@title:menu"
|
||||
msgid "Firmware"
|
||||
msgstr "Päivitä laiteohjelmisto"
|
||||
msgstr "Laiteohjelmisto"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/USBPrinterManager.py:47
|
||||
#, fuzzy
|
||||
@ -267,7 +263,7 @@ msgstr "Päivitä laiteohjelmisto"
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/ControlWindow.qml:17
|
||||
msgctxt "@title:window"
|
||||
msgid "Print with USB"
|
||||
msgstr ""
|
||||
msgstr "Tulostus USB:n kautta"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/ControlWindow.qml:28
|
||||
#, fuzzy
|
||||
@ -294,10 +290,9 @@ msgid "Cancel"
|
||||
msgstr "Peruuta"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:20
|
||||
#, fuzzy
|
||||
msgctxt "@title:window"
|
||||
msgid "Firmware Update"
|
||||
msgstr "Laiteohjelmiston päivitys suoritettu."
|
||||
msgstr "Laiteohjelmiston päivitys"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:38
|
||||
#, fuzzy
|
||||
@ -347,12 +342,12 @@ msgstr "Moottorin loki"
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/ProfileSetup.qml:31
|
||||
msgctxt "@label"
|
||||
msgid "Variant:"
|
||||
msgstr ""
|
||||
msgstr "Variantti:"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/ProfileSetup.qml:82
|
||||
msgctxt "@label"
|
||||
msgid "Global Profile:"
|
||||
msgstr ""
|
||||
msgstr "Yleisprofiili:"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/AddMachine.qml:60
|
||||
#, fuzzy
|
||||
@ -370,31 +365,29 @@ msgstr "Tulostimen nimi:"
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/SelectUpgradedParts.qml:29
|
||||
msgctxt "@title"
|
||||
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/UpgradeFirmware.qml:29
|
||||
#, fuzzy
|
||||
msgctxt "@title"
|
||||
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/UltimakerCheckup.qml:37
|
||||
#, fuzzy
|
||||
msgctxt "@title"
|
||||
msgid "Check Printer"
|
||||
msgstr "Lisää tulostin"
|
||||
msgstr "Tarkista tulostin"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/AddMachine.qml:220
|
||||
msgctxt "@title"
|
||||
msgid "Bed Levelling"
|
||||
msgstr ""
|
||||
msgstr "Pöydän tasaaminen"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/Bedleveling.qml:25
|
||||
msgctxt "@title"
|
||||
msgid "Bed Leveling"
|
||||
msgstr ""
|
||||
msgstr "Pöydän tasaaminen"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/Bedleveling.qml:34
|
||||
msgctxt "@label"
|
||||
@ -403,6 +396,8 @@ msgid ""
|
||||
"buildplate. When you click 'Move to Next Position' the nozzle will move to "
|
||||
"the different positions that can be adjusted."
|
||||
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
|
||||
msgctxt "@label"
|
||||
@ -411,16 +406,19 @@ msgid ""
|
||||
"print bed height. The print bed height is right when the paper is slightly "
|
||||
"gripped by the tip of the nozzle."
|
||||
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
|
||||
msgctxt "@action:button"
|
||||
msgid "Move to Next Position"
|
||||
msgstr ""
|
||||
msgstr "Siirry seuraavaan positioon"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/Bedleveling.qml:66
|
||||
msgctxt "@action:button"
|
||||
msgid "Skip Bedleveling"
|
||||
msgstr ""
|
||||
msgstr "Ohita pöydän tasaus"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/SelectUpgradedParts.qml:39
|
||||
msgctxt "@label"
|
||||
@ -428,27 +426,28 @@ msgid ""
|
||||
"To assist you in having better default settings for your Ultimaker. Cura "
|
||||
"would like to know which upgrades you have in your machine:"
|
||||
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
|
||||
#, fuzzy
|
||||
msgctxt "@option:check"
|
||||
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
|
||||
msgctxt "@option:check"
|
||||
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
|
||||
msgctxt "@option:check"
|
||||
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
|
||||
msgctxt "@option:check"
|
||||
msgid "Dual extrusion (experimental)"
|
||||
msgstr ""
|
||||
msgstr "Kaksoispursotus (kokeellinen)"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/SelectUpgradedParts.qml:70
|
||||
msgctxt "@label"
|
||||
@ -458,6 +457,11 @@ msgid ""
|
||||
"improve reliability. This upgrade can be bought from the Ultimaker webshop "
|
||||
"or found on thingiverse as thing:26094"
|
||||
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
|
||||
msgctxt "@label"
|
||||
@ -465,36 +469,38 @@ msgid ""
|
||||
"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"
|
||||
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
|
||||
msgctxt "@action:button"
|
||||
msgid "Start Printer Check"
|
||||
msgstr ""
|
||||
msgstr "Aloita tulostintarkistus"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:56
|
||||
msgctxt "@action:button"
|
||||
msgid "Skip Printer Check"
|
||||
msgstr ""
|
||||
msgstr "Ohita tulostintarkistus"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:65
|
||||
msgctxt "@label"
|
||||
msgid "Connection: "
|
||||
msgstr ""
|
||||
msgstr "Yhteys:"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:69
|
||||
msgctxt "@info:status"
|
||||
msgid "Done"
|
||||
msgstr ""
|
||||
msgstr "Valmis"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:69
|
||||
msgctxt "@info:status"
|
||||
msgid "Incomplete"
|
||||
msgstr ""
|
||||
msgstr "Kesken"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:76
|
||||
msgctxt "@label"
|
||||
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:91
|
||||
@ -503,7 +509,7 @@ msgstr ""
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:201
|
||||
msgctxt "@info:status"
|
||||
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:91
|
||||
@ -512,40 +518,39 @@ msgstr ""
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:163
|
||||
msgctxt "@info:status"
|
||||
msgid "Not checked"
|
||||
msgstr ""
|
||||
msgstr "Ei tarkistettu"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:87
|
||||
msgctxt "@label"
|
||||
msgid "Min endstop Y: "
|
||||
msgstr ""
|
||||
msgstr "Min. päätyraja Y:"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:99
|
||||
msgctxt "@label"
|
||||
msgid "Min endstop Z: "
|
||||
msgstr ""
|
||||
msgstr "Min. päätyraja Z:"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:111
|
||||
msgctxt "@label"
|
||||
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:149
|
||||
msgctxt "@action:button"
|
||||
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:154
|
||||
msgctxt "@info:progress"
|
||||
msgid "Checking"
|
||||
msgstr ""
|
||||
msgstr "Tarkistetaan"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/WizardPages/UltimakerCheckup.qml:141
|
||||
#, fuzzy
|
||||
msgctxt "@label"
|
||||
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
|
||||
msgctxt "@label"
|
||||
@ -554,6 +559,9 @@ msgid ""
|
||||
"firmware controls the step motors, regulates the temperature and ultimately "
|
||||
"makes your printer work."
|
||||
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
|
||||
msgctxt "@label"
|
||||
@ -561,6 +569,8 @@ msgid ""
|
||||
"The firmware shipping with new Ultimakers works, but upgrades have been made "
|
||||
"to make better prints, and make calibration easier."
|
||||
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
|
||||
msgctxt "@label"
|
||||
@ -568,37 +578,36 @@ msgid ""
|
||||
"Cura requires these new features and thus your firmware will most likely "
|
||||
"need to be upgraded. You can do so now."
|
||||
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
|
||||
#, fuzzy
|
||||
msgctxt "@action:button"
|
||||
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
|
||||
msgctxt "@action:button"
|
||||
msgid "Skip Upgrade"
|
||||
msgstr ""
|
||||
msgstr "Ohita päivitys"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/AboutDialog.qml:15
|
||||
#, fuzzy
|
||||
msgctxt "@title:window"
|
||||
msgid "About Cura"
|
||||
msgstr "Tietoja Curasta"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/AboutDialog.qml:54
|
||||
#, fuzzy
|
||||
msgctxt "@label"
|
||||
msgid "End-to-end solution for fused filament 3D printing."
|
||||
msgstr "Kokonaisvaltainen sulatettavan tulostuslangan 3D-tulostusratkaisu."
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/AboutDialog.qml:66
|
||||
#, fuzzy
|
||||
msgctxt "@info:credit"
|
||||
msgid ""
|
||||
"Cura has been developed by Ultimaker B.V. in cooperation with the community."
|
||||
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
|
||||
#, fuzzy
|
||||
@ -618,11 +627,13 @@ msgid ""
|
||||
"Highlight unsupported areas of the model in red. Without support these areas "
|
||||
"will nog print properly."
|
||||
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
|
||||
msgctxt "@action:button"
|
||||
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
|
||||
msgctxt "@info:tooltip"
|
||||
@ -630,11 +641,13 @@ msgid ""
|
||||
"Moves the camera so the object is in the center of the view when an object "
|
||||
"is selected"
|
||||
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
|
||||
msgctxt "@action:inmenu"
|
||||
msgid "Toggle Fu&ll Screen"
|
||||
msgstr ""
|
||||
msgstr "Vaihda &koko näyttöön"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:58
|
||||
#, fuzzy
|
||||
@ -655,10 +668,9 @@ msgid "&Quit"
|
||||
msgstr "&Lopeta"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:82
|
||||
#, fuzzy
|
||||
msgctxt "@action:inmenu"
|
||||
msgid "&Preferences..."
|
||||
msgstr "&Suosikkiasetukset..."
|
||||
msgstr "&Lisäasetukset..."
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:89
|
||||
#, fuzzy
|
||||
@ -667,15 +679,14 @@ msgid "&Add Printer..."
|
||||
msgstr "L&isää tulostin..."
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:95
|
||||
#, fuzzy
|
||||
msgctxt "@action:inmenu"
|
||||
msgid "Manage Pr&inters..."
|
||||
msgstr "L&isää tulostin..."
|
||||
msgstr "Tulostinten &hallinta..."
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:102
|
||||
msgctxt "@action:inmenu"
|
||||
msgid "Manage Profiles..."
|
||||
msgstr ""
|
||||
msgstr "Profiilien hallinta..."
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:109
|
||||
#, fuzzy
|
||||
@ -696,74 +707,64 @@ msgid "&About..."
|
||||
msgstr "Ti&etoja..."
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:130
|
||||
#, fuzzy
|
||||
msgctxt "@action:inmenu"
|
||||
msgid "Delete &Selection"
|
||||
msgstr "Poista valinta"
|
||||
msgstr "&Poista valinta"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:138
|
||||
#, fuzzy
|
||||
msgctxt "@action:inmenu"
|
||||
msgid "Delete Object"
|
||||
msgstr "Poista kohde"
|
||||
msgstr "Poista kappale"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:146
|
||||
#, fuzzy
|
||||
msgctxt "@action:inmenu"
|
||||
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
|
||||
msgctxt "@action:inmenu"
|
||||
msgid "&Group Objects"
|
||||
msgstr ""
|
||||
msgstr "&Ryhmitä kappaleet"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:160
|
||||
msgctxt "@action:inmenu"
|
||||
msgid "Ungroup Objects"
|
||||
msgstr ""
|
||||
msgstr "Pura kappaleiden ryhmitys"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:168
|
||||
#, fuzzy
|
||||
msgctxt "@action:inmenu"
|
||||
msgid "&Merge Objects"
|
||||
msgstr "Poista kohde"
|
||||
msgstr "&Yhdistä kappaleet"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:176
|
||||
#, fuzzy
|
||||
msgctxt "@action:inmenu"
|
||||
msgid "&Duplicate Object"
|
||||
msgstr "Monista kohde"
|
||||
msgstr "&Monista kappale"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:183
|
||||
#, fuzzy
|
||||
msgctxt "@action:inmenu"
|
||||
msgid "&Clear Build Platform"
|
||||
msgstr "Tyhjennä alusta"
|
||||
msgstr "&Tyhjennä alusta"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:190
|
||||
#, fuzzy
|
||||
msgctxt "@action:inmenu"
|
||||
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
|
||||
#, fuzzy
|
||||
msgctxt "@action:inmenu"
|
||||
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
|
||||
#, fuzzy
|
||||
msgctxt "@action:inmenu"
|
||||
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
|
||||
#, fuzzy
|
||||
msgctxt "@action:inmenu"
|
||||
msgid "&Open File..."
|
||||
msgstr "Avaa tiedosto"
|
||||
msgstr "&Avaa tiedosto..."
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Actions.qml:217
|
||||
#, fuzzy
|
||||
@ -775,84 +776,87 @@ msgstr "Näytä moottorin l&oki"
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:461
|
||||
msgctxt "@title:tab"
|
||||
msgid "General"
|
||||
msgstr ""
|
||||
msgstr "Yleiset"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:36
|
||||
msgctxt "@label"
|
||||
msgid "Language"
|
||||
msgstr ""
|
||||
msgstr "Kieli"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:47
|
||||
msgctxt "@item:inlistbox"
|
||||
msgid "Bulgarian"
|
||||
msgstr ""
|
||||
msgstr "bulgaria"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:48
|
||||
msgctxt "@item:inlistbox"
|
||||
msgid "Czech"
|
||||
msgstr ""
|
||||
msgstr "tsekki"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:49
|
||||
msgctxt "@item:inlistbox"
|
||||
msgid "English"
|
||||
msgstr ""
|
||||
msgstr "englanti"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:50
|
||||
msgctxt "@item:inlistbox"
|
||||
msgid "Finnish"
|
||||
msgstr ""
|
||||
msgstr "suomi"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:51
|
||||
msgctxt "@item:inlistbox"
|
||||
msgid "French"
|
||||
msgstr ""
|
||||
msgstr "ranska"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:52
|
||||
msgctxt "@item:inlistbox"
|
||||
msgid "German"
|
||||
msgstr ""
|
||||
msgstr "saksa"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:53
|
||||
msgctxt "@item:inlistbox"
|
||||
msgid "Italian"
|
||||
msgstr ""
|
||||
msgstr "italia"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:54
|
||||
msgctxt "@item:inlistbox"
|
||||
msgid "Polish"
|
||||
msgstr ""
|
||||
msgstr "puola"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:55
|
||||
msgctxt "@item:inlistbox"
|
||||
msgid "Russian"
|
||||
msgstr ""
|
||||
msgstr "venäjä"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:56
|
||||
msgctxt "@item:inlistbox"
|
||||
msgid "Spanish"
|
||||
msgstr ""
|
||||
msgstr "espanja"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:98
|
||||
msgctxt "@label"
|
||||
msgid ""
|
||||
"You will need to restart the application for language changes to have effect."
|
||||
msgstr ""
|
||||
"Sovellus on käynnistettävä uudelleen, jotta kielimuutokset tulevat voimaan."
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:114
|
||||
msgctxt "@option:check"
|
||||
msgid "Ensure objects are kept apart"
|
||||
msgstr ""
|
||||
msgstr "Pidä kappaleet erillään"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:118
|
||||
msgctxt "@info:tooltip"
|
||||
msgid ""
|
||||
"Should objects on the platform be moved so that they no longer intersect."
|
||||
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
|
||||
msgctxt "@option:check"
|
||||
msgid "Send (Anonymous) Print Information"
|
||||
msgstr ""
|
||||
msgstr "Lähetä (anonyymit) tulostustiedot"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:151
|
||||
msgctxt "@info:tooltip"
|
||||
@ -861,103 +865,102 @@ msgid ""
|
||||
"models, IP addresses or other personally identifiable information is sent or "
|
||||
"stored."
|
||||
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
|
||||
msgctxt "@option:check"
|
||||
msgid "Scale Too Large Files"
|
||||
msgstr ""
|
||||
msgstr "Skaalaa liian isot tiedostot"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/GeneralPage.qml:183
|
||||
msgctxt "@info:tooltip"
|
||||
msgid ""
|
||||
"Should opened files be scaled to the build volume when they are too large?"
|
||||
msgstr ""
|
||||
"Pitäisikö avoimia tiedostoja skaalata rakennustilavuuteen, jos ne ovat liian "
|
||||
"isoja?"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SaveButton.qml:70
|
||||
#, fuzzy
|
||||
msgctxt "@label:textbox"
|
||||
msgid "Printjob Name"
|
||||
msgstr "Tulostimen nimi:"
|
||||
msgstr "Tulostustyön nimi"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SaveButton.qml:167
|
||||
msgctxt "@label %1 is length of filament"
|
||||
msgid "%1 m"
|
||||
msgstr ""
|
||||
msgstr "%1 m"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SaveButton.qml:229
|
||||
msgctxt "@info:tooltip"
|
||||
msgid "Select the active output device"
|
||||
msgstr ""
|
||||
msgstr "Valitse aktiivinen oheislaite"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:34
|
||||
msgctxt "@label"
|
||||
msgid "Infill:"
|
||||
msgstr ""
|
||||
msgstr "Täyttö:"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:119
|
||||
msgctxt "@label"
|
||||
msgid "Sparse"
|
||||
msgstr ""
|
||||
msgstr "Harva"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:121
|
||||
msgctxt "@label"
|
||||
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
|
||||
msgctxt "@label"
|
||||
msgid "Dense"
|
||||
msgstr ""
|
||||
msgstr "Tiheä"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:127
|
||||
msgctxt "@label"
|
||||
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
|
||||
msgctxt "@label"
|
||||
msgid "Solid"
|
||||
msgstr ""
|
||||
msgstr "Kiinteä"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:133
|
||||
msgctxt "@label"
|
||||
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
|
||||
#, fuzzy
|
||||
msgctxt "@label:listbox"
|
||||
msgid "Helpers:"
|
||||
msgstr "&Ohje"
|
||||
msgstr "Avustimet:"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:169
|
||||
msgctxt "@option:check"
|
||||
msgid "Enable Skirt Adhesion"
|
||||
msgstr ""
|
||||
msgstr "Ota helman tarttuvuus käyttöön"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarSimple.qml:187
|
||||
#, fuzzy
|
||||
msgctxt "@option:check"
|
||||
msgid "Enable Support"
|
||||
msgstr "Ota tuki käyttöön"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Sidebar.qml:123
|
||||
#, fuzzy
|
||||
msgctxt "@title:tab"
|
||||
msgid "Simple"
|
||||
msgstr "Perusasetukset"
|
||||
msgstr "Suppea"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Sidebar.qml:124
|
||||
#, fuzzy
|
||||
msgctxt "@title:tab"
|
||||
msgid "Advanced"
|
||||
msgstr "Lisäasetukset"
|
||||
msgstr "Laajennettu"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarHeader.qml:30
|
||||
#, fuzzy
|
||||
msgctxt "@label:listbox"
|
||||
msgid "Print Setup"
|
||||
msgstr "Tulostimen asennus"
|
||||
msgstr "Tulostusasetukset"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/SidebarHeader.qml:100
|
||||
#, fuzzy
|
||||
@ -980,18 +983,17 @@ msgstr "&Tiedosto"
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:43
|
||||
msgctxt "@title:menu"
|
||||
msgid "Open &Recent"
|
||||
msgstr ""
|
||||
msgstr "Avaa &viimeisin"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:72
|
||||
msgctxt "@action:inmenu"
|
||||
msgid "&Save Selection to File"
|
||||
msgstr ""
|
||||
msgstr "&Tallenna valinta tiedostoon"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:80
|
||||
#, fuzzy
|
||||
msgctxt "@title:menu"
|
||||
msgid "Save &All"
|
||||
msgstr "Tallenna tiedosto"
|
||||
msgstr "Tallenna &kaikki"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:108
|
||||
#, fuzzy
|
||||
@ -1000,10 +1002,9 @@ msgid "&Edit"
|
||||
msgstr "&Muokkaa"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:125
|
||||
#, fuzzy
|
||||
msgctxt "@title:menu"
|
||||
msgid "&View"
|
||||
msgstr "Näytä"
|
||||
msgstr "&Näytä"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:151
|
||||
#, fuzzy
|
||||
@ -1014,7 +1015,7 @@ msgstr "&Laite"
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:197
|
||||
msgctxt "@title:menu"
|
||||
msgid "&Profile"
|
||||
msgstr ""
|
||||
msgstr "&Profiili"
|
||||
|
||||
#: /home/ahiemstra/dev/15.10/src/cura/resources/qml/Cura.qml:224
|
||||
#, 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",
|
||||
|
||||
"machine_settings": {
|
||||
"overrides": {
|
||||
|
||||
"machine_width": { "default": 254 },
|
||||
"machine_depth": { "default": 254 },
|
||||
@ -28,14 +28,12 @@
|
||||
"machine_gcode_flavor": { "default": "RepRap (Marlin/Sprinter)" },
|
||||
|
||||
"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": {
|
||||
"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 },
|
||||
"shell_thickness": { "default": 0.8 },
|
||||
"wall_thickness": { "default": 0.8 },
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
"inherits": "fdmprinter.json",
|
||||
|
||||
"machine_settings": {
|
||||
"overrides": {
|
||||
|
||||
"machine_width": { "default": 400 },
|
||||
"machine_depth": { "default": 300 },
|
||||
@ -26,14 +26,12 @@
|
||||
"machine_gcode_flavor": { "default": "RepRap (Marlin/Sprinter)" },
|
||||
|
||||
"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": {
|
||||
"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 },
|
||||
"shell_thickness": { "default": 0.8},
|
||||
"wall_thickness": { "default": 0.8 },
|
||||
|
@ -4,10 +4,10 @@
|
||||
"name": "BQ Prusa i3 Hephestos",
|
||||
"manufacturer": "Other",
|
||||
"author": "BQ",
|
||||
"platform": "hephestos_platform.stl",
|
||||
"platform": "bq_hephestos_platform.stl",
|
||||
"inherits": "fdmprinter.json",
|
||||
|
||||
"machine_settings": {
|
||||
"overrides": {
|
||||
"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 --"
|
||||
},
|
||||
@ -33,10 +33,8 @@
|
||||
"default": "RepRap"
|
||||
},
|
||||
"machine_platform_offset": {
|
||||
"default": [0, 100, 0]
|
||||
}
|
||||
},
|
||||
"overrides": {
|
||||
"default": [0, -82, 0]
|
||||
},
|
||||
"layer_height": { "default": 0.2 },
|
||||
"layer_height_0": { "default": 0.2, "visible": false },
|
||||
"shell_thickness": { "default": 1.0 },
|
||||
|
@ -4,10 +4,10 @@
|
||||
"name": "BQ Hephestos 2",
|
||||
"manufacturer": "Other",
|
||||
"author": "BQ",
|
||||
"platform": "bq_hephestos_2.stl",
|
||||
"platform": "bq_hephestos_2_platform.stl",
|
||||
"inherits": "fdmprinter.json",
|
||||
|
||||
"machine_settings": {
|
||||
"overrides": {
|
||||
"machine_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": {
|
||||
"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 },
|
||||
"speed_topbottom": { "default": 35.0, "visible": false },
|
||||
"top_thickness": { "default": 1.2, "visible": false },
|
||||
"top_layers": { "default": 6, "visible": false },
|
||||
"speed_travel": { "default": 150.0 },
|
||||
"material_bed_temperature": { "default": 0 },
|
||||
"material_diameter": { "default": 1.75 },
|
||||
"layer_height": { "default": 0.2 },
|
||||
"layer_height_0": { "default": 0.2, "visible": true },
|
||||
"shell_thickness": { "default": 1.2 },
|
||||
"wall_line_count": { "default": 3, "visible": false },
|
||||
"wall_thickness": { "default": 1.2, "visible": false },
|
||||
"top_bottom_thickness": { "default": 1.2, "visible": false },
|
||||
"material_bed_temperature": { "default": 0 },
|
||||
"support_enable": { "default": false },
|
||||
"speed_print": { "default": 50.0 },
|
||||
"infill_sparse_density": { "default": 20.0 },
|
||||
"infill_overlap": { "default": 15.0, "visible": false },
|
||||
"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_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",
|
||||
"manufacturer": "Other",
|
||||
"author": "BQ",
|
||||
"platform": "hephestos_platform.stl",
|
||||
"platform": "bq_hephestos_platform.stl",
|
||||
"inherits": "fdmprinter.json",
|
||||
|
||||
"machine_settings": {
|
||||
"overrides": {
|
||||
"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 --"
|
||||
},
|
||||
@ -33,10 +33,8 @@
|
||||
"default": "RepRap"
|
||||
},
|
||||
"machine_platform_offset": {
|
||||
"default": [0, 100, 0]
|
||||
}
|
||||
},
|
||||
"overrides": {
|
||||
"default": [0, -82, 0]
|
||||
},
|
||||
"layer_height": { "default": 0.2 },
|
||||
"layer_height_0": { "default": 0.2, "visible": false },
|
||||
"shell_thickness": { "default": 1.0 },
|
||||
|
@ -4,10 +4,10 @@
|
||||
"name": "BQ Witbox",
|
||||
"manufacturer": "Other",
|
||||
"author": "BQ",
|
||||
"platform": "witbox_platform.stl",
|
||||
"platform": "bq_witbox_platform.stl",
|
||||
"inherits": "fdmprinter.json",
|
||||
|
||||
"machine_settings": {
|
||||
"overrides": {
|
||||
"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 --"
|
||||
},
|
||||
@ -34,9 +34,7 @@
|
||||
},
|
||||
"machine_platform_offset": {
|
||||
"default": [0, -145, -38]
|
||||
}
|
||||
},
|
||||
"overrides": {
|
||||
},
|
||||
"layer_height": { "default": 0.2 },
|
||||
"layer_height_0": { "default": 0.2, "visible": false },
|
||||
"shell_thickness": { "default": 1.0 },
|
||||
|
@ -4,10 +4,10 @@
|
||||
"name": "BQ Witbox 2",
|
||||
"manufacturer": "Other",
|
||||
"author": "BQ",
|
||||
"platform": "witbox_platform.stl",
|
||||
"platform": "bq_witbox_platform.stl",
|
||||
"inherits": "fdmprinter.json",
|
||||
|
||||
"machine_settings": {
|
||||
"overrides": {
|
||||
"machine_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": {
|
||||
"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 },
|
||||
"speed_topbottom": { "default": 35.0, "visible": false },
|
||||
"top_thickness": { "default": 1.2, "visible": false },
|
||||
"top_layers": { "default": 6, "visible": false },
|
||||
"speed_travel": { "default": 150.0 },
|
||||
"material_bed_temperature": { "default": 0 },
|
||||
"material_diameter": { "default": 1.75 },
|
||||
"layer_height": { "default": 0.2 },
|
||||
"layer_height_0": { "default": 0.2, "visible": true },
|
||||
"shell_thickness": { "default": 1.2 },
|
||||
"wall_line_count": { "default": 3, "visible": false },
|
||||
"wall_thickness": { "default": 1.2, "visible": false },
|
||||
"top_bottom_thickness": { "default": 1.2, "visible": false },
|
||||
"material_bed_temperature": { "default": 0 },
|
||||
"support_enable": { "default": false },
|
||||
"speed_print": { "default": 50.0 },
|
||||
"infill_sparse_density": { "default": 20.0 },
|
||||
"infill_overlap": { "default": 15.0, "visible": false },
|
||||
"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_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,
|
||||
|
||||
|
||||
"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_use_extruder_offset_to_offset_coords": { "default": false },
|
||||
|
||||
@ -31,7 +43,7 @@
|
||||
"type": "float",
|
||||
"min_value": "0.1",
|
||||
"max_value_warning": "150",
|
||||
"default": 50,
|
||||
"default": 60,
|
||||
"visible": false,
|
||||
"enabled": "prime_tower_enable"
|
||||
}
|
||||
@ -86,17 +98,25 @@
|
||||
"min_value": "0",
|
||||
"max_value": "16",
|
||||
"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": {
|
||||
"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",
|
||||
"default": 0,
|
||||
"min_value": "0",
|
||||
"max_value": "16"
|
||||
},
|
||||
"support_roof_extruder_nr": {
|
||||
"label": "Hammock Extruder",
|
||||
"description": "The extruder train to use for printing the hammock. This is used in multi-extrusion.",
|
||||
"label": "Support Roof Extruder",
|
||||
"description": "The extruder train to use for printing the roof of the support. This is used in multi-extrusion.",
|
||||
"type": "int",
|
||||
"default": 0,
|
||||
"min_value": "0",
|
||||
@ -111,6 +131,7 @@
|
||||
"label": "Enable Prime Tower",
|
||||
"description": "Print a tower next to the print which serves to prime the material after each nozzle switch.",
|
||||
"type": "boolean",
|
||||
"visible": true,
|
||||
"default": false
|
||||
},
|
||||
"prime_tower_size": {
|
||||
@ -122,7 +143,7 @@
|
||||
"default": 15,
|
||||
"min_value": "0",
|
||||
"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"
|
||||
},
|
||||
"prime_tower_position_x": {
|
||||
@ -162,6 +183,16 @@
|
||||
"default": false,
|
||||
"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": {
|
||||
"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.",
|
||||
|
@ -9,45 +9,90 @@
|
||||
"add_pages": [],
|
||||
|
||||
"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": {
|
||||
"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"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"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": {
|
||||
"description": "The width (X-direction) of the printable area.",
|
||||
"default": 100
|
||||
},
|
||||
"machine_depth": {
|
||||
"description": "The depth (Y-direction) of the printable area.",
|
||||
"default": 100
|
||||
},
|
||||
"machine_height": {
|
||||
"description": "The height (Z-direction) of the printable area.",
|
||||
"default": 100
|
||||
},
|
||||
"machine_heated_bed": {
|
||||
"description": "Whether the machine has a heated bed present.",
|
||||
"default": false
|
||||
},
|
||||
"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
|
||||
},
|
||||
"machine_extruder_count": {
|
||||
"description": "Number of extruder trains. An extruder train is the combination of a feeder, bowden tube, and nozzle.",
|
||||
"default": 1
|
||||
},
|
||||
"machine_nozzle_size": { "default": 0.4, "SEE_machine_extruder_trains": true },
|
||||
"machine_nozzle_tip_outer_diameter": { "default": 1, "SEE_machine_extruder_trains": true },
|
||||
"machine_nozzle_head_distance": { "default": 3, "SEE_machine_extruder_trains": true },
|
||||
"machine_nozzle_expansion_angle": { "default": 45, "SEE_machine_extruder_trains": true },
|
||||
"machine_heat_zone_length": { "default": 16, "SEE_machine_extruder_trains": true },
|
||||
"machine_nozzle_heat_up_speed": { "default": 2.0, "SEE_machine_extruder_trains": true },
|
||||
"machine_nozzle_cool_down_speed": { "default": 2.0, "SEE_machine_extruder_trains": true },
|
||||
"machine_nozzle_size": {
|
||||
"description": "The inner diameter of the hole in the nozzle.",
|
||||
"default": 0.4, "SEE_machine_extruder_trains": true },
|
||||
"machine_nozzle_tip_outer_diameter": {
|
||||
"description": "The outer diameter of the tip of the nozzle.",
|
||||
"default": 1, "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": {
|
||||
"description": "The type of gcode to be generated.",
|
||||
"default": "RepRap"
|
||||
},
|
||||
"machine_disallowed_areas": {
|
||||
"description": "A list of polygons with areas the print head is not allowed to enter.",
|
||||
"type": "polygons",
|
||||
"default": []
|
||||
},
|
||||
"machine_platform_offset": {
|
||||
"description": "Where to display the platform mesh.",
|
||||
"default": [
|
||||
0,
|
||||
0,
|
||||
@ -55,6 +100,7 @@
|
||||
]
|
||||
},
|
||||
"machine_head_polygon": {
|
||||
"description": "A 2D silhouette of the print head (fan caps excluded).",
|
||||
"type": "polygon",
|
||||
"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",
|
||||
"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
|
||||
}
|
||||
},
|
||||
@ -114,9 +160,10 @@
|
||||
"unit": "mm",
|
||||
"type": "float",
|
||||
"default": 0.1,
|
||||
"min_value": "0.0001",
|
||||
"min_value": "0.001",
|
||||
"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": {
|
||||
"label": "Initial Layer Height",
|
||||
@ -124,14 +171,14 @@
|
||||
"unit": "mm",
|
||||
"type": "float",
|
||||
"default": 0.3,
|
||||
"min_value": "0.0001",
|
||||
"min_value": "0.001",
|
||||
"min_value_warning": "0.04",
|
||||
"max_value_warning": "0.32",
|
||||
"visible": false
|
||||
},
|
||||
"line_width": {
|
||||
"label": "Line Width",
|
||||
"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.",
|
||||
"label": "Nozzle Diameter",
|
||||
"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",
|
||||
"min_value": "0.0001",
|
||||
"min_value_warning": "0.2",
|
||||
@ -143,7 +190,7 @@
|
||||
"children": {
|
||||
"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",
|
||||
"min_value": "0.0001",
|
||||
"min_value_warning": "0.2",
|
||||
@ -154,7 +201,7 @@
|
||||
"children": {
|
||||
"wall_line_width_0": {
|
||||
"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",
|
||||
"min_value": "0.0001",
|
||||
"min_value_warning": "0.2",
|
||||
@ -165,7 +212,7 @@
|
||||
},
|
||||
"wall_line_width_x": {
|
||||
"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",
|
||||
"min_value": "0.0001",
|
||||
"min_value_warning": "0.2",
|
||||
@ -178,7 +225,7 @@
|
||||
},
|
||||
"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",
|
||||
"min_value": "0.0001",
|
||||
"min_value_warning": "0.2",
|
||||
@ -189,7 +236,7 @@
|
||||
},
|
||||
"skin_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",
|
||||
"min_value": "0.0001",
|
||||
"min_value_warning": "0.2",
|
||||
@ -200,7 +247,7 @@
|
||||
},
|
||||
"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",
|
||||
"min_value": "0.0001",
|
||||
"min_value_warning": "0.2",
|
||||
@ -211,7 +258,7 @@
|
||||
},
|
||||
"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",
|
||||
"min_value": "0.0001",
|
||||
"min_value_warning": "0.2",
|
||||
@ -223,7 +270,7 @@
|
||||
},
|
||||
"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",
|
||||
"default": 0.4,
|
||||
"type": "float",
|
||||
@ -262,7 +309,7 @@
|
||||
"children": {
|
||||
"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",
|
||||
"default": 2,
|
||||
"type": "int",
|
||||
@ -281,7 +328,7 @@
|
||||
},
|
||||
"top_bottom_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",
|
||||
"default": 0.8,
|
||||
"min_value": "0",
|
||||
@ -292,7 +339,7 @@
|
||||
"children": {
|
||||
"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",
|
||||
"min_value": "0",
|
||||
"default": 0.8,
|
||||
@ -301,7 +348,7 @@
|
||||
"children": {
|
||||
"top_layers": {
|
||||
"label": "Top Layers",
|
||||
"description": "This controls the amount of top layers.",
|
||||
"description": "This controls the number of top layers.",
|
||||
"min_value": "0",
|
||||
"default": 8,
|
||||
"type": "int",
|
||||
@ -381,7 +428,7 @@
|
||||
},
|
||||
"top_bottom_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",
|
||||
"options": {
|
||||
"lines": "Lines",
|
||||
@ -392,29 +439,29 @@
|
||||
"visible": false
|
||||
},
|
||||
"skin_no_small_gaps_heuristic": {
|
||||
"label": "Ingore 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.",
|
||||
"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.",
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"visible": false
|
||||
},
|
||||
"skin_alternate_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",
|
||||
"default": false,
|
||||
"visible": false
|
||||
},
|
||||
"skin_outline_count": {
|
||||
"label": "Skin Perimeter Line 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.",
|
||||
"label": "Extra Skin Wall Count",
|
||||
"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,
|
||||
"type": "int",
|
||||
"visible": false
|
||||
},
|
||||
"xy_offset": {
|
||||
"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",
|
||||
"type": "float",
|
||||
"default": 0,
|
||||
@ -422,7 +469,7 @@
|
||||
},
|
||||
"z_seam_type": {
|
||||
"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",
|
||||
"options": {
|
||||
"back": "Back",
|
||||
@ -441,7 +488,7 @@
|
||||
"settings": {
|
||||
"infill_sparse_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": "%",
|
||||
"type": "float",
|
||||
"default": 20,
|
||||
@ -461,12 +508,13 @@
|
||||
},
|
||||
"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",
|
||||
"visible": false,
|
||||
"options": {
|
||||
"grid": "Grid",
|
||||
"lines": "Lines",
|
||||
"triangles": "Triangles",
|
||||
"concentric": "Concentric",
|
||||
"zigzag": "Zig Zag"
|
||||
},
|
||||
@ -486,7 +534,7 @@
|
||||
},
|
||||
"infill_wipe_dist": {
|
||||
"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",
|
||||
"type": "float",
|
||||
"default": 0.04,
|
||||
@ -517,9 +565,9 @@
|
||||
"settings": {
|
||||
"material_flow_dependent_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",
|
||||
"default": true,
|
||||
"default": false,
|
||||
"visible": true
|
||||
},
|
||||
"material_print_temperature": {
|
||||
@ -537,7 +585,7 @@
|
||||
"description": "Data linking material flow (in mm³/s) to temperature (°C).",
|
||||
"unit": "",
|
||||
"type": "string",
|
||||
"default": "[[0.1,180],[20,230]]",
|
||||
"default": "[[3.5,200],[7.0,240]]",
|
||||
"enabled": "material_flow_dependent_temperature"
|
||||
},
|
||||
"material_standby_temperature": {
|
||||
@ -551,7 +599,7 @@
|
||||
},
|
||||
"material_extrusion_cool_down_speed": {
|
||||
"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",
|
||||
"type": "float",
|
||||
"default": 0.5,
|
||||
@ -570,7 +618,7 @@
|
||||
},
|
||||
"material_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",
|
||||
"type": "float",
|
||||
"default": 2.85,
|
||||
@ -596,7 +644,7 @@
|
||||
},
|
||||
"retraction_amount": {
|
||||
"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",
|
||||
"type": "float",
|
||||
"default": 4.5,
|
||||
@ -636,8 +684,8 @@
|
||||
},
|
||||
"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.",
|
||||
"unit": "mm",
|
||||
"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³",
|
||||
"type": "float",
|
||||
"default": 0,
|
||||
"visible": false,
|
||||
@ -646,7 +694,7 @@
|
||||
},
|
||||
"retraction_min_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",
|
||||
"type": "float",
|
||||
"default": 1.5,
|
||||
@ -655,27 +703,29 @@
|
||||
"enabled": "retraction_enable"
|
||||
},
|
||||
"retraction_count_max": {
|
||||
"label": "Maximal 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.",
|
||||
"default": 6,
|
||||
"label": "Maximum Retraction Count",
|
||||
"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": 8,
|
||||
"type": "int",
|
||||
"min_value": "1",
|
||||
"visible": false,
|
||||
"inherit": false,
|
||||
"enabled": "retraction_enable"
|
||||
},
|
||||
"retraction_extrusion_window": {
|
||||
"label": "Minimal 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.",
|
||||
"label": "Minimum Extrusion Distance Window",
|
||||
"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",
|
||||
"type": "float",
|
||||
"default": 4.5,
|
||||
"min_value": "0.0",
|
||||
"visible": false,
|
||||
"inherit_function": "retraction_amount",
|
||||
"enabled": "retraction_enable"
|
||||
},
|
||||
"retraction_hop": {
|
||||
"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",
|
||||
"type": "float",
|
||||
"default": 0,
|
||||
@ -697,7 +747,7 @@
|
||||
"type": "float",
|
||||
"min_value": "0.1",
|
||||
"max_value_warning": "150",
|
||||
"default": 50,
|
||||
"default": 60,
|
||||
"children": {
|
||||
"speed_infill": {
|
||||
"label": "Infill Speed",
|
||||
@ -706,38 +756,40 @@
|
||||
"type": "float",
|
||||
"min_value": "0.1",
|
||||
"max_value_warning": "150",
|
||||
"default": 50,
|
||||
"default": 60,
|
||||
"visible": false
|
||||
},
|
||||
"speed_wall": {
|
||||
"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",
|
||||
"type": "float",
|
||||
"min_value": "0.1",
|
||||
"max_value_warning": "150",
|
||||
"default": 50,
|
||||
"default": 30,
|
||||
"visible": false,
|
||||
"inherit_function": "parent_value / 60 * 30",
|
||||
"children": {
|
||||
"speed_wall_0": {
|
||||
"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",
|
||||
"type": "float",
|
||||
"min_value": "0.1",
|
||||
"max_value_warning": "150",
|
||||
"default": 50,
|
||||
"default": 30,
|
||||
"visible": false
|
||||
},
|
||||
"speed_wall_x": {
|
||||
"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",
|
||||
"type": "float",
|
||||
"min_value": "0.1",
|
||||
"max_value_warning": "150",
|
||||
"default": 50,
|
||||
"visible": false
|
||||
"default": 60,
|
||||
"visible": false,
|
||||
"inherit_function": "speed_print"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -748,40 +800,42 @@
|
||||
"type": "float",
|
||||
"min_value": "0.1",
|
||||
"max_value_warning": "150",
|
||||
"default": 50,
|
||||
"visible": false
|
||||
"default": 30,
|
||||
"visible": false,
|
||||
"inherit_function": "parent_value / 60 * 30"
|
||||
},
|
||||
"speed_support": {
|
||||
"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",
|
||||
"type": "float",
|
||||
"min_value": "0.1",
|
||||
"max_value_warning": "150",
|
||||
"default": 50,
|
||||
"default": 60,
|
||||
"visible": false,
|
||||
"inherit_function": "speed_wall_0",
|
||||
"inherit_function": "speed_print",
|
||||
"enabled": "support_enable",
|
||||
"children": {
|
||||
"speed_support_lines": {
|
||||
"label": "Support Wall 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. ",
|
||||
"speed_support_infill": {
|
||||
"label": "Support Infill Speed",
|
||||
"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",
|
||||
"type": "float",
|
||||
"default": 50,
|
||||
"default": 60,
|
||||
"visible": false,
|
||||
"inherit": true,
|
||||
"enabled": "support_roof_enable"
|
||||
},
|
||||
"speed_support_roof": {
|
||||
"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",
|
||||
"type": "float",
|
||||
"default": 40,
|
||||
"visible": false,
|
||||
"inherit": false,
|
||||
"enabled": "support_roof_enable"
|
||||
"enabled": "support_roof_enable",
|
||||
"inherit_function": "parent_value / 60 * 40"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -789,35 +843,36 @@
|
||||
},
|
||||
"speed_travel": {
|
||||
"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",
|
||||
"type": "float",
|
||||
"min_value": "0.1",
|
||||
"max_value_warning": "300",
|
||||
"default": 150
|
||||
"default": 120,
|
||||
"inherit_function": "speed_print if magic_spiralize else 120"
|
||||
},
|
||||
"speed_layer_0": {
|
||||
"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",
|
||||
"type": "float",
|
||||
"min_value": "0.1",
|
||||
"default": 15,
|
||||
"default": 30,
|
||||
"visible": false
|
||||
},
|
||||
"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",
|
||||
"type": "float",
|
||||
"min_value": "0.1",
|
||||
"default": 15,
|
||||
"default": 30,
|
||||
"visible": false,
|
||||
"inherit_function": "speed_layer_0"
|
||||
},
|
||||
"speed_slowdown_layers": {
|
||||
"label": "Amount 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.",
|
||||
"label": "Number of Slower Layers",
|
||||
"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",
|
||||
"min_value": "0",
|
||||
"default": 4,
|
||||
@ -832,7 +887,7 @@
|
||||
"settings": {
|
||||
"retraction_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",
|
||||
"default": true,
|
||||
"visible": false
|
||||
@ -872,93 +927,27 @@
|
||||
"default": 0.064,
|
||||
"visible": false,
|
||||
"inherit": false,
|
||||
"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"
|
||||
}
|
||||
}
|
||||
"enabled": "coasting_enable"
|
||||
},
|
||||
"coasting_min_volume": {
|
||||
"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³",
|
||||
"type": "float",
|
||||
"default": 0.8,
|
||||
"min_value": "0",
|
||||
"visible": false,
|
||||
"inherit": false,
|
||||
"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"
|
||||
}
|
||||
}
|
||||
"enabled": "coasting_enable"
|
||||
},
|
||||
"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": "%",
|
||||
"type": "float",
|
||||
"default": 90,
|
||||
"visible": false,
|
||||
"inherit": false,
|
||||
"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"
|
||||
}
|
||||
}
|
||||
"enabled": "coasting_enable"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -1029,7 +1018,7 @@
|
||||
}
|
||||
},
|
||||
"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.",
|
||||
"unit": "sec",
|
||||
"type": "float",
|
||||
@ -1038,8 +1027,8 @@
|
||||
"visible": false
|
||||
},
|
||||
"cool_min_layer_time_fan_speed_max": {
|
||||
"label": "Minimal 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.",
|
||||
"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 minimum fan speed for layers taking the minimum layer time to maximum fan speed for layers taking the time specified here.",
|
||||
"unit": "sec",
|
||||
"type": "float",
|
||||
"min_value": "0",
|
||||
@ -1076,7 +1065,7 @@
|
||||
},
|
||||
"support_type": {
|
||||
"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",
|
||||
"options": {
|
||||
"buildplate": "Touching Buildplate",
|
||||
@ -1098,7 +1087,7 @@
|
||||
},
|
||||
"support_xy_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",
|
||||
"type": "float",
|
||||
"min_value": "0",
|
||||
@ -1136,7 +1125,7 @@
|
||||
"unit": "mm",
|
||||
"min_value": "0",
|
||||
"max_value_warning": "10",
|
||||
"default": 0.15,
|
||||
"default": 0.1,
|
||||
"type": "float",
|
||||
"visible": false,
|
||||
"enabled": "support_enable"
|
||||
@ -1164,7 +1153,7 @@
|
||||
},
|
||||
"support_conical_min_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",
|
||||
"min_value": "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.",
|
||||
"unit": "mm",
|
||||
"type": "float",
|
||||
"default": 2,
|
||||
"default": 0.3,
|
||||
"visible": false,
|
||||
"enabled": "support_enable"
|
||||
},
|
||||
"support_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",
|
||||
"type": "float",
|
||||
"default": 2,
|
||||
@ -1201,7 +1190,7 @@
|
||||
},
|
||||
"support_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",
|
||||
"type": "float",
|
||||
"default": 0.6,
|
||||
@ -1218,7 +1207,7 @@
|
||||
},
|
||||
"support_roof_height": {
|
||||
"label": "Support Roof Thickness",
|
||||
"description": "The height of the support roofs. ",
|
||||
"description": "The height of the support roofs.",
|
||||
"unit": "mm",
|
||||
"type": "float",
|
||||
"default": 1,
|
||||
@ -1227,7 +1216,7 @@
|
||||
},
|
||||
"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": "%",
|
||||
"type": "float",
|
||||
"default": 100,
|
||||
@ -1261,7 +1250,7 @@
|
||||
"enabled": "support_roof_enable"
|
||||
},
|
||||
"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.",
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
@ -1269,8 +1258,8 @@
|
||||
"enabled": "support_enable"
|
||||
},
|
||||
"support_minimal_diameter": {
|
||||
"label": "Minimal Diameter",
|
||||
"description": "Maximal diameter in the X/Y directions of a small area which is to be supported by a specialized support tower. ",
|
||||
"label": "Minimum Diameter",
|
||||
"description": "Minimum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower.",
|
||||
"unit": "mm",
|
||||
"type": "float",
|
||||
"default": 1,
|
||||
@ -1279,7 +1268,7 @@
|
||||
},
|
||||
"support_tower_diameter": {
|
||||
"label": "Tower Diameter",
|
||||
"description": "The diameter of a special tower. ",
|
||||
"description": "The diameter of a special tower.",
|
||||
"unit": "mm",
|
||||
"type": "float",
|
||||
"default": 1,
|
||||
@ -1288,7 +1277,7 @@
|
||||
},
|
||||
"support_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": "°",
|
||||
"type": "int",
|
||||
"min_value": "0",
|
||||
@ -1299,7 +1288,7 @@
|
||||
},
|
||||
"support_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",
|
||||
"options": {
|
||||
"lines": "Lines",
|
||||
@ -1322,7 +1311,7 @@
|
||||
},
|
||||
"support_infill_rate": {
|
||||
"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": "%",
|
||||
"type": "float",
|
||||
"min_value": "0",
|
||||
@ -1354,7 +1343,7 @@
|
||||
"settings": {
|
||||
"adhesion_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",
|
||||
"options": {
|
||||
"skirt": "Skirt",
|
||||
@ -1365,7 +1354,7 @@
|
||||
},
|
||||
"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",
|
||||
"default": 1,
|
||||
"enabled": "adhesion_type == \"skirt\""
|
||||
@ -1386,12 +1375,23 @@
|
||||
"default": 250,
|
||||
"enabled": "adhesion_type == \"skirt\""
|
||||
},
|
||||
"brim_line_count": {
|
||||
"label": "Brim Line Count",
|
||||
"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.",
|
||||
"type": "int",
|
||||
"default": 10,
|
||||
"enabled": "adhesion_type == \"brim\""
|
||||
"brim_width": {
|
||||
"label": "Brim Width",
|
||||
"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": "float",
|
||||
"unit": "mm",
|
||||
"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": {
|
||||
"label": "Raft Extra Margin",
|
||||
@ -1496,11 +1496,11 @@
|
||||
"type": "float",
|
||||
"default": 30,
|
||||
"enabled": "adhesion_type == \"raft\"",
|
||||
"inherit_function": "0.6 * speed_print",
|
||||
"inherit_function": "speed_print / 60 * 30",
|
||||
"children": {
|
||||
"raft_surface_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",
|
||||
"type": "float",
|
||||
"default": 30,
|
||||
@ -1509,7 +1509,7 @@
|
||||
},
|
||||
"raft_interface_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",
|
||||
"type": "float",
|
||||
"default": 15,
|
||||
@ -1518,7 +1518,7 @@
|
||||
},
|
||||
"raft_base_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",
|
||||
"type": "float",
|
||||
"default": 15,
|
||||
@ -1595,7 +1595,7 @@
|
||||
},
|
||||
"draft_shield_height_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",
|
||||
"options": {
|
||||
"full": "Full",
|
||||
@ -1626,7 +1626,7 @@
|
||||
"settings": {
|
||||
"meshfix_union_all": {
|
||||
"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",
|
||||
"default": true,
|
||||
"visible": false
|
||||
@ -1647,7 +1647,7 @@
|
||||
},
|
||||
"meshfix_keep_open_polygons": {
|
||||
"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",
|
||||
"default": false,
|
||||
"visible": false
|
||||
@ -1661,14 +1661,15 @@
|
||||
"settings": {
|
||||
"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",
|
||||
"options": {
|
||||
"all_at_once": "All at Once",
|
||||
"one_at_a_time": "One at a Time"
|
||||
},
|
||||
"default": "all_at_once",
|
||||
"visible": true
|
||||
"visible": true,
|
||||
"global_only": true
|
||||
},
|
||||
"magic_mesh_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.",
|
||||
"unit": "%",
|
||||
"default": 100,
|
||||
"min_value": "0",
|
||||
"min_value": "0",
|
||||
"max_value": "100",
|
||||
"type": "float",
|
||||
"visible": false,
|
||||
@ -1845,7 +1846,7 @@
|
||||
},
|
||||
"wireframe_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",
|
||||
"type": "float",
|
||||
"default": 0,
|
||||
@ -1854,7 +1855,7 @@
|
||||
},
|
||||
"wireframe_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",
|
||||
"type": "float",
|
||||
"default": 0.1,
|
||||
@ -1899,7 +1900,7 @@
|
||||
},
|
||||
"wireframe_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",
|
||||
"options": {
|
||||
"compensate": "Compensate",
|
||||
@ -1941,7 +1942,7 @@
|
||||
},
|
||||
"wireframe_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",
|
||||
"unit": "sec",
|
||||
"default": 0.2,
|
||||
|
@ -10,7 +10,7 @@
|
||||
"inherits": "fdmprinter.json",
|
||||
"visible": "true",
|
||||
|
||||
"machine_settings": {
|
||||
"overrides": {
|
||||
"machine_width": { "default": 150 },
|
||||
"machine_height": { "default": 150 },
|
||||
"machine_depth": { "default": 150 },
|
||||
@ -30,10 +30,8 @@
|
||||
},
|
||||
"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"
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
"overrides": {
|
||||
"material_bed_temperature": { "visible": false }
|
||||
}
|
||||
}
|
||||
|
@ -9,7 +9,7 @@
|
||||
|
||||
"inherits": "fdmprinter.json",
|
||||
|
||||
"machine_settings": {
|
||||
"overrides": {
|
||||
"machine_width": { "default": 210 },
|
||||
"machine_depth": { "default": 185 },
|
||||
"machine_height": { "default": 200 },
|
||||
@ -30,10 +30,8 @@
|
||||
|
||||
"machine_nozzle_tip_outer_diameter": { "default": 1.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_0": { "default": 0.2, "visible": false },
|
||||
"wall_line_count": { "default": 2, "visible": true },
|
||||
|
@ -9,7 +9,7 @@
|
||||
|
||||
"inherits": "fdmprinter.json",
|
||||
|
||||
"machine_settings": {
|
||||
"overrides": {
|
||||
"machine_heated_bed": { "default": true },
|
||||
"machine_width": { "default": 200 },
|
||||
"machine_height": { "default": 200 },
|
||||
|
@ -11,8 +11,8 @@
|
||||
"inherits": "fdmprinter.json",
|
||||
|
||||
|
||||
"machine_extruder_trains": [
|
||||
{
|
||||
"machine_extruder_trains": {
|
||||
"0": {
|
||||
"machine_nozzle_size": {
|
||||
"default": 0.4
|
||||
},
|
||||
@ -35,8 +35,8 @@
|
||||
"default": 16
|
||||
}
|
||||
}
|
||||
],
|
||||
"machine_settings": {
|
||||
},
|
||||
"overrides": {
|
||||
"machine_start_gcode" : { "default": "" },
|
||||
"machine_end_gcode" : { "default": "" },
|
||||
"machine_width": { "default": 230 },
|
||||
@ -48,20 +48,20 @@
|
||||
{
|
||||
"default": [
|
||||
[
|
||||
-40,
|
||||
10
|
||||
-42,
|
||||
12
|
||||
],
|
||||
[
|
||||
-40,
|
||||
-30
|
||||
-42,
|
||||
-32
|
||||
],
|
||||
[
|
||||
60,
|
||||
10
|
||||
62,
|
||||
12
|
||||
],
|
||||
[
|
||||
60,
|
||||
-30
|
||||
62,
|
||||
-32
|
||||
]
|
||||
]
|
||||
},
|
||||
@ -82,13 +82,12 @@
|
||||
|
||||
"machine_nozzle_tip_outer_diameter": { "default": 1.0 },
|
||||
"machine_nozzle_head_distance": { "default": 3.0 },
|
||||
"machine_nozzle_expansion_angle": { "default": 45 }
|
||||
},
|
||||
|
||||
"overrides": {
|
||||
"machine_nozzle_expansion_angle": { "default": 45 },
|
||||
|
||||
"material_print_temperature": { "enabled": "False" },
|
||||
"material_bed_temperature": { "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",
|
||||
|
||||
"machine_settings": {
|
||||
"overrides": {
|
||||
"machine_width": { "default": 230 },
|
||||
"machine_depth": { "default": 225 },
|
||||
"machine_height": { "default": 315 }
|
||||
|
@ -10,7 +10,7 @@
|
||||
|
||||
"inherits": "ultimaker2.json",
|
||||
|
||||
"machine_settings": {
|
||||
"overrides": {
|
||||
"machine_width": { "default": 120 },
|
||||
"machine_depth": { "default": 120 },
|
||||
"machine_height": { "default": 115 },
|
||||
|
@ -16,8 +16,8 @@
|
||||
"BedLeveling"
|
||||
],
|
||||
|
||||
"machine_extruder_trains": [
|
||||
{
|
||||
"machine_extruder_trains": {
|
||||
"0": {
|
||||
"machine_nozzle_size": {
|
||||
"default": 0.4
|
||||
},
|
||||
@ -40,8 +40,8 @@
|
||||
"default": 16
|
||||
}
|
||||
}
|
||||
],
|
||||
"machine_settings": {
|
||||
},
|
||||
"overrides": {
|
||||
"machine_width": { "default": 205 },
|
||||
"machine_height": { "default": 200 },
|
||||
"machine_depth": { "default": 205 },
|
||||
|
@ -16,7 +16,7 @@
|
||||
"BedLeveling"
|
||||
],
|
||||
|
||||
"machine_settings": {
|
||||
"overrides": {
|
||||
"machine_heated_bed": { "default": true }
|
||||
}
|
||||
}
|
||||
|
BIN
resources/meshes/bq_hephestos_platform.stl
Normal file
@ -3,4 +3,6 @@ version = 1
|
||||
name = High Quality
|
||||
|
||||
[settings]
|
||||
layer_height = 0.08
|
||||
layer_height = 0.06
|
||||
infill_sparse_density = 12
|
||||
|
||||
|
@ -4,3 +4,12 @@ name = Low Quality
|
||||
|
||||
[settings]
|
||||
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
|
||||
|
||||
[settings]
|
||||
layer_height = 0.1
|
||||
|
@ -3,4 +3,7 @@ version = 1
|
||||
name = Ulti Quality
|
||||
|
||||
[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
|
||||
{
|
||||
anchors
|
||||
{
|
||||
horizontalCenter: parent.horizontalCenter
|
||||
horizontalCenterOffset: -(UM.Theme.sizes.logo.width/ 2)
|
||||
top: parent.verticalCenter;
|
||||
bottom: parent.bottom;
|
||||
horizontalCenterOffset: -(UM.Theme.sizes.sidebar.width/ 2)
|
||||
verticalCenter: parent.verticalCenter;
|
||||
}
|
||||
}
|
||||
|
||||
@ -330,8 +340,7 @@ UM.MainWindow
|
||||
//anchors.bottom: parent.bottom
|
||||
anchors.top: viewModeButton.bottom
|
||||
anchors.topMargin: UM.Theme.sizes.default_margin.height;
|
||||
anchors.right: sidebar.left;
|
||||
anchors.rightMargin: UM.Theme.sizes.window_margin.width;
|
||||
anchors.left: viewModeButton.left;
|
||||
//anchors.bottom: buttons.top;
|
||||
//anchors.bottomMargin: UM.Theme.sizes.default_margin.height;
|
||||
|
||||
@ -344,10 +353,9 @@ UM.MainWindow
|
||||
{
|
||||
id: openFileButton;
|
||||
//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");
|
||||
iconSource: UM.Theme.icons.load
|
||||
style: UM.Theme.styles.open_file_button
|
||||
style: UM.Theme.styles.tool_button
|
||||
tooltip: '';
|
||||
anchors
|
||||
{
|
||||
@ -373,6 +381,7 @@ UM.MainWindow
|
||||
source: UM.Theme.images.logo;
|
||||
width: UM.Theme.sizes.logo.width;
|
||||
height: UM.Theme.sizes.logo.height;
|
||||
z: -1;
|
||||
|
||||
sourceSize.width: width;
|
||||
sourceSize.height: height;
|
||||
@ -381,13 +390,12 @@ UM.MainWindow
|
||||
Button
|
||||
{
|
||||
id: viewModeButton
|
||||
property bool verticalTooltip: true
|
||||
|
||||
anchors
|
||||
{
|
||||
top: parent.top;
|
||||
right: sidebar.left;
|
||||
rightMargin: UM.Theme.sizes.window_margin.width;
|
||||
top: toolbar.bottom;
|
||||
topMargin: UM.Theme.sizes.window_margin.height;
|
||||
left: parent.left;
|
||||
}
|
||||
text: catalog.i18nc("@action:button","View Mode");
|
||||
iconSource: UM.Theme.icons.viewmode;
|
||||
@ -422,12 +430,9 @@ UM.MainWindow
|
||||
id: toolbar;
|
||||
|
||||
anchors {
|
||||
left: parent.left
|
||||
top: parent.top
|
||||
topMargin: UM.Theme.sizes.window_margin.height + UM.Theme.sizes.button.height
|
||||
//horizontalCenter: parent.horizontalCenter
|
||||
//horizontalCenterOffset: -(UM.Theme.sizes.sidebar.width / 2)
|
||||
//top: parent.top;
|
||||
top: openFileButton.bottom;
|
||||
topMargin: UM.Theme.sizes.window_margin.height;
|
||||
left: parent.left;
|
||||
}
|
||||
}
|
||||
|
||||
@ -567,7 +572,7 @@ UM.MainWindow
|
||||
|
||||
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); }
|
||||
manageProfiles.onTriggered: { preferences.visible = true; preferences.setPage(4); }
|
||||
|
||||
@ -629,7 +634,7 @@ UM.MainWindow
|
||||
id: openDialog;
|
||||
|
||||
//: 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;
|
||||
//TODO: Support multiple file selection, workaround bug in KDE file dialog
|
||||
//selectMultiple: true
|
||||
|
@ -13,6 +13,18 @@ UM.PreferencesPage
|
||||
//: General configuration page title
|
||||
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()
|
||||
{
|
||||
UM.Preferences.resetPreference("general/language")
|
||||
@ -22,7 +34,8 @@ UM.PreferencesPage
|
||||
pushFreeCheckbox.checked = boolCheck(UM.Preferences.getValue("physics/automatic_push_free"))
|
||||
sendDataCheckbox.checked = boolCheck(UM.Preferences.getValue("info/send_slice_info"))
|
||||
scaleToFitCheckbox.checked = boolCheck(UM.Preferences.getValue("mesh/scale_to_fit"))
|
||||
languageComboBox.currentIndex = 0
|
||||
var defaultLanguage = UM.Preferences.getValue("general/language")
|
||||
setDefaultLanguage(defaultLanguage)
|
||||
}
|
||||
|
||||
GridLayout
|
||||
@ -44,16 +57,16 @@ UM.PreferencesPage
|
||||
id: languageList
|
||||
|
||||
Component.onCompleted: {
|
||||
append({ text: catalog.i18nc("@item:inlistbox", "Bulgarian"), code: "bg" })
|
||||
append({ text: catalog.i18nc("@item:inlistbox", "Czech"), code: "cs" })
|
||||
// append({ text: catalog.i18nc("@item:inlistbox", "Bulgarian"), code: "bg" })
|
||||
// append({ text: catalog.i18nc("@item:inlistbox", "Czech"), code: "cs" })
|
||||
append({ text: catalog.i18nc("@item:inlistbox", "English"), code: "en" })
|
||||
append({ text: catalog.i18nc("@item:inlistbox", "Finnish"), code: "fi" })
|
||||
append({ text: catalog.i18nc("@item:inlistbox", "French"), code: "fr" })
|
||||
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", "Russian"), code: "ru" })
|
||||
append({ text: catalog.i18nc("@item:inlistbox", "Spanish"), code: "es" })
|
||||
// append({ text: catalog.i18nc("@item:inlistbox", "Russian"), code: "ru" })
|
||||
// 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
|
||||
Instantiator
|
||||
{
|
||||
model: UM.MachineVariantsModel { }
|
||||
model: UM.MachineVariantsModel { id: variantsModel }
|
||||
MenuItem
|
||||
{
|
||||
text: model.name;
|
||||
checkable: true;
|
||||
checked: model.active;
|
||||
exclusiveGroup: variantSelectionMenuGroup;
|
||||
onTriggered: UM.MachineManager.setActiveMachineVariant(model.getItem(index).name)
|
||||
onTriggered: UM.MachineManager.setActiveMachineVariant(variantsModel.getItem(index).name)
|
||||
}
|
||||
onObjectAdded: variantsSelectionMenu.insertItem(index, object)
|
||||
onObjectRemoved: variantsSelectionMenu.removeItem(object)
|
||||
@ -81,6 +81,7 @@ Item{
|
||||
text: catalog.i18nc("@label","Global Profile:");
|
||||
width: parent.width/100*45
|
||||
font: UM.Theme.fonts.default;
|
||||
color: UM.Theme.colors.text;
|
||||
}
|
||||
|
||||
|
||||
@ -147,4 +148,4 @@ Item{
|
||||
// }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -10,187 +10,71 @@ import UM 1.1 as UM
|
||||
|
||||
Rectangle {
|
||||
id: base;
|
||||
UM.I18nCatalog { id: catalog; name:"cura"}
|
||||
|
||||
property real progress: UM.Backend.progress;
|
||||
property bool activity: Printer.getPlatformActivity;
|
||||
Behavior on progress { NumberAnimation { duration: 250; } }
|
||||
property int totalHeight: childrenRect.height
|
||||
//Behavior on progress { NumberAnimation { duration: 250; } }
|
||||
property int totalHeight: childrenRect.height + UM.Theme.sizes.default_margin.height
|
||||
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;
|
||||
|
||||
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()
|
||||
property string statusText: {
|
||||
if(progress == 0) {
|
||||
if(!activity) {
|
||||
return catalog.i18nc("@label:PrintjobStatus","Please load a 3d model");
|
||||
} else {
|
||||
return catalog.i18nc("@label:PrintjobStatus","Preparing to slice...");
|
||||
}
|
||||
} else if(base.progress < 0.99) {
|
||||
return catalog.i18nc("@label:PrintjobStatus","Slicing...");
|
||||
} else {
|
||||
return catalog.i18nc("@label:PrintjobStatus","Ready to ") + UM.OutputDeviceManager.activeDeviceShortDescription;
|
||||
}
|
||||
}
|
||||
|
||||
onActivityChanged: {
|
||||
if (activity == false){
|
||||
base.fileBaseName = ''
|
||||
base.createFileName()
|
||||
}
|
||||
Label {
|
||||
id: statusLabel
|
||||
width: parent.width - 2 * UM.Theme.sizes.default_margin.width
|
||||
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{
|
||||
id: printJobRow
|
||||
implicitWidth: base.width;
|
||||
implicitHeight: UM.Theme.sizes.save_button_header.height
|
||||
anchors.top: parent.top
|
||||
color: UM.Theme.colors.sidebar_header_bar
|
||||
Label{
|
||||
id: printJobTextfieldLabel
|
||||
text: catalog.i18nc("@label:textbox", "Printjob Name");
|
||||
anchors.left: parent.left
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
id: progressBar
|
||||
width: parent.width - 2 * UM.Theme.sizes.default_margin.width
|
||||
height: UM.Theme.sizes.progressbar.height
|
||||
anchors.top: statusLabel.bottom
|
||||
anchors.topMargin: UM.Theme.sizes.default_margin.height/4
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: UM.Theme.sizes.default_margin.width
|
||||
radius: UM.Theme.sizes.progressbar_radius.width
|
||||
color: UM.Theme.colors.progressbar_background
|
||||
|
||||
Rectangle {
|
||||
id: specsRow
|
||||
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;
|
||||
Rectangle{
|
||||
width: Math.max(parent.width * base.progress)
|
||||
height: parent.height
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: UM.Theme.sizes.default_margin.width
|
||||
anchors.top: parent.top
|
||||
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)
|
||||
}
|
||||
color: UM.Theme.colors.progressbar_control
|
||||
radius: UM.Theme.sizes.progressbar_radius.width
|
||||
visible: base.progress > 0.99 ? false : true
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle{
|
||||
id: saveRow
|
||||
width: base.width
|
||||
height: saveToButton.height + (UM.Theme.sizes.default_margin.height / 2) // height + bottomMargin
|
||||
anchors.top: specsRow.bottom
|
||||
height: saveToButton.height
|
||||
anchors.top: progressBar.bottom
|
||||
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||
anchors.left: parent.left
|
||||
|
||||
Button {
|
||||
id: saveToButton
|
||||
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;
|
||||
enabled: base.progress > 0.99 && base.activity == true
|
||||
height: UM.Theme.sizes.save_button_save_to_button.height
|
||||
@ -206,39 +90,25 @@ Rectangle {
|
||||
background: Rectangle {
|
||||
//opacity: control.enabled ? 1.0 : 0.5
|
||||
//Behavior on opacity { NumberAnimation { duration: 50; } }
|
||||
color: {
|
||||
if(!control.enabled){
|
||||
return UM.Theme.colors.button;
|
||||
}
|
||||
else if(control.enabled && control.hovered) {
|
||||
return UM.Theme.colors.load_save_button_hover
|
||||
} else {
|
||||
return UM.Theme.colors.load_save_button
|
||||
}
|
||||
}
|
||||
border.color: !control.enabled ? UM.Theme.colors.action_button_disabled_border :
|
||||
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.enabled ? UM.Theme.colors.action_button_disabled :
|
||||
control.pressed ? UM.Theme.colors.action_button_active :
|
||||
control.hovered ? UM.Theme.colors.action_button_hovered : UM.Theme.colors.action_button
|
||||
Behavior on color { ColorAnimation { duration: 50; } }
|
||||
width: {
|
||||
var w = 0;
|
||||
if (base.width*0.55 > actualLabel.width + (UM.Theme.sizes.default_margin.width * 2)){
|
||||
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;
|
||||
saveToButton.resizedWidth = actualLabel.width + (UM.Theme.sizes.default_margin.width * 2)
|
||||
return saveToButton.resizedWidth
|
||||
}
|
||||
Label {
|
||||
id: actualLabel
|
||||
opacity: control.enabled ? 1.0 : 0.4
|
||||
//Behavior on opacity { NumberAnimation { duration: 50; } }
|
||||
anchors.centerIn: parent
|
||||
color: UM.Theme.colors.load_save_button_text
|
||||
font: UM.Theme.fonts.default
|
||||
color: !control.enabled ? UM.Theme.colors.action_button_disabled_text :
|
||||
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;
|
||||
}
|
||||
}
|
||||
@ -260,16 +130,12 @@ Rectangle {
|
||||
style: ButtonStyle {
|
||||
background: Rectangle {
|
||||
id: deviceSelectionIcon
|
||||
color: {
|
||||
if(!control.enabled){
|
||||
return UM.Theme.colors.button;
|
||||
}
|
||||
else if(control.enabled && control.hovered) {
|
||||
return UM.Theme.colors.load_save_button_hover
|
||||
} else {
|
||||
return UM.Theme.colors.load_save_button
|
||||
}
|
||||
}
|
||||
border.color: !control.enabled ? UM.Theme.colors.action_button_disabled_border :
|
||||
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.enabled ? UM.Theme.colors.action_button_disabled :
|
||||
control.pressed ? UM.Theme.colors.action_button_active :
|
||||
control.hovered ? UM.Theme.colors.action_button_hovered : UM.Theme.colors.action_button
|
||||
Behavior on color { ColorAnimation { duration: 50; } }
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: UM.Theme.sizes.save_button_text_margin.width / 2;
|
||||
@ -282,9 +148,11 @@ Rectangle {
|
||||
width: UM.Theme.sizes.standard_arrow.width
|
||||
height: UM.Theme.sizes.standard_arrow.height
|
||||
sourceSize.width: width
|
||||
sourceSize.height: width
|
||||
color: UM.Theme.colors.load_save_button_text
|
||||
source: UM.Theme.icons.arrow_bottom
|
||||
sourceSize.height: height
|
||||
color: !control.enabled ? UM.Theme.colors.action_button_disabled_text :
|
||||
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{ }
|
||||
|
@ -15,6 +15,7 @@ Rectangle
|
||||
property Action addMachineAction;
|
||||
property Action configureMachinesAction;
|
||||
property Action manageProfilesAction;
|
||||
property int currentModeIndex;
|
||||
|
||||
color: UM.Theme.colors.sidebar;
|
||||
UM.I18nCatalog { id: catalog; name:"cura"}
|
||||
@ -49,38 +50,118 @@ Rectangle
|
||||
|
||||
addMachineAction: base.addMachineAction;
|
||||
configureMachinesAction: base.configureMachinesAction;
|
||||
modesModel: modesListModel;
|
||||
}
|
||||
|
||||
currentModeIndex:
|
||||
{
|
||||
var index = parseInt(UM.Preferences.getValue("cura/active_mode"))
|
||||
if(index)
|
||||
{
|
||||
return index;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
onCurrentModeIndexChanged: UM.Preferences.setValue("cura/active_mode", currentModeIndex);
|
||||
Rectangle {
|
||||
id: headerSeparator
|
||||
width: parent.width
|
||||
height: UM.Theme.sizes.sidebar_lining.height
|
||||
color: UM.Theme.colors.sidebar_lining
|
||||
anchors.top: header.bottom
|
||||
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||
}
|
||||
|
||||
ProfileSetup {
|
||||
id: profileItem
|
||||
manageProfilesAction: base.manageProfilesAction
|
||||
anchors.top: header.bottom
|
||||
anchors.top: settingsModeSelection.bottom
|
||||
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||
width: parent.width
|
||||
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
|
||||
{
|
||||
id: sidebarContents;
|
||||
anchors.bottom: saveButton.top
|
||||
anchors.bottom: footerSeparator.top
|
||||
anchors.top: profileItem.bottom
|
||||
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||
anchors.left: base.left
|
||||
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;
|
||||
|
||||
@ -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
|
||||
{
|
||||
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", "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;
|
||||
// Machine Setup
|
||||
property variant modesModel;
|
||||
property int currentModeIndex: 0;
|
||||
property Action addMachineAction;
|
||||
property Action configureMachinesAction;
|
||||
UM.I18nCatalog { id: catalog; name:"cura"}
|
||||
@ -21,74 +19,28 @@ Item
|
||||
Rectangle {
|
||||
id: settingsModeRow
|
||||
width: base.width
|
||||
height: UM.Theme.sizes.sidebar_header.height
|
||||
height: 0
|
||||
anchors.top: parent.top
|
||||
color: UM.Theme.colors.sidebar_header_bar
|
||||
}
|
||||
|
||||
Label{
|
||||
id: settingsModeLabel
|
||||
text: catalog.i18nc("@label:listbox","Print Setup");
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: UM.Theme.sizes.default_margin.width;
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
width: parent.width/100*45
|
||||
font: UM.Theme.fonts.default;
|
||||
color: UM.Theme.colors.text_white
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
Label{
|
||||
id: printjobTabLabel
|
||||
text: catalog.i18nc("@label:listbox","Print Job");
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: UM.Theme.sizes.default_margin.width;
|
||||
anchors.top: settingsModeRow.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: machineSelectionRow
|
||||
width: base.width
|
||||
height: UM.Theme.sizes.sidebar_setup.height
|
||||
anchors.top: settingsModeRow.bottom
|
||||
anchors.top: printjobTabLabel.bottom
|
||||
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
|
||||
@ -100,6 +52,7 @@ Item
|
||||
anchors.leftMargin: UM.Theme.sizes.default_margin.width
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
font: UM.Theme.fonts.default;
|
||||
color: UM.Theme.colors.text;
|
||||
}
|
||||
|
||||
ToolButton {
|
||||
|
@ -13,6 +13,9 @@ Item
|
||||
id: base;
|
||||
anchors.fill: parent;
|
||||
|
||||
signal showTooltip(Item item, point location, string text);
|
||||
signal hideTooltip();
|
||||
|
||||
property Action configureSettings;
|
||||
property variant minimumPrintTime: PrintInformation.minimumPrintTime;
|
||||
property variant maximumPrintTime: PrintInformation.maximumPrintTime;
|
||||
@ -20,12 +23,110 @@ Item
|
||||
Component.onCompleted: PrintInformation.enabled = true
|
||||
Component.onDestruction: PrintInformation.enabled = false
|
||||
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{
|
||||
id: infillCellLeft
|
||||
anchors.top: parent.top
|
||||
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
|
||||
|
||||
Label{
|
||||
@ -33,33 +134,34 @@ Item
|
||||
//: Infill selection label
|
||||
text: catalog.i18nc("@label","Infill:");
|
||||
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
|
||||
}
|
||||
Label{
|
||||
/* Label{
|
||||
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 : ""
|
||||
font: UM.Theme.fonts.caption
|
||||
wrapMode: Text.Wrap
|
||||
color: UM.Theme.colors.text
|
||||
color: UM.Theme.colors.text_subtext
|
||||
anchors.top: infillLabel.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: UM.Theme.sizes.default_margin.width
|
||||
}
|
||||
} */
|
||||
}
|
||||
|
||||
Flow {
|
||||
id: infillCellRight
|
||||
|
||||
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.rightMargin: UM.Theme.sizes.default_margin.width - (UM.Theme.sizes.default_margin.width/4)
|
||||
anchors.top: parent.top
|
||||
anchors.left: infillCellLeft.right
|
||||
anchors.top: infillCellLeft.top
|
||||
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||
|
||||
Repeater {
|
||||
@ -90,28 +192,41 @@ Item
|
||||
Rectangle{
|
||||
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
|
||||
|
||||
border.color: infillListView.activeIndex == index ? UM.Theme.colors.setting_control_text : UM.Theme.colors.setting_control_border
|
||||
border.width: infillListView.activeIndex == index ? 2 : 1
|
||||
color: infillListView.activeIndex == index ? UM.Theme.colors.setting_category_active : "transparent"
|
||||
border.color: (infillListView.activeIndex == index) ? UM.Theme.colors.setting_control_selected :
|
||||
(mousearea.containsMouse ? UM.Theme.colors.setting_control_border_highlight : UM.Theme.colors.setting_control_border)
|
||||
border.width: UM.Theme.sizes.default_lining.width
|
||||
color: infillListView.activeIndex == index ? UM.Theme.colors.setting_control_selected : "transparent"
|
||||
|
||||
Image {
|
||||
UM.RecolorImage {
|
||||
id: infillIcon
|
||||
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.height: width
|
||||
source: UM.Theme.icons[model.icon];
|
||||
color: (infillListView.activeIndex == index) ? UM.Theme.colors.text_white : UM.Theme.colors.text
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: mousearea
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
onClicked: {
|
||||
infillListView.activeIndex = index
|
||||
UM.MachineManager.setSettingValue("infill_sparse_density", model.percentage)
|
||||
if (infillListView.activeIndex != index)
|
||||
{
|
||||
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:
|
||||
{
|
||||
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,
|
||||
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"
|
||||
})
|
||||
infillModel.append({
|
||||
@ -157,7 +278,7 @@ Item
|
||||
anchors.top: infillCellRight.bottom
|
||||
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||
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
|
||||
|
||||
Label{
|
||||
@ -166,44 +287,81 @@ Item
|
||||
//: Helpers selection label
|
||||
text: catalog.i18nc("@label:listbox","Helpers:");
|
||||
font: UM.Theme.fonts.default;
|
||||
color: UM.Theme.colors.text;
|
||||
}
|
||||
}
|
||||
Rectangle {
|
||||
id: helpersCellRight
|
||||
anchors.top: helpersCellLeft.top
|
||||
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
|
||||
|
||||
CheckBox{
|
||||
id: skirtCheckBox
|
||||
id: brimCheckBox
|
||||
property bool hovered_ex: false
|
||||
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
|
||||
//: 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;
|
||||
|
||||
checked: UM.ActiveProfile.valid ? UM.ActiveProfile.settingValues.adhesion_type == "brim" : false;
|
||||
onClicked:
|
||||
{
|
||||
UM.MachineManager.setSettingValue("adhesion_type", "brim")
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
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{
|
||||
anchors.top: skirtCheckBox.bottom
|
||||
id: supportCheckBox
|
||||
property bool hovered_ex: false
|
||||
|
||||
anchors.top: brimCheckBox.bottom
|
||||
anchors.topMargin: UM.Theme.sizes.default_lining.height
|
||||
anchors.left: parent.left
|
||||
|
||||
//: Setting enable support checkbox
|
||||
text: catalog.i18nc("@option:check","Enable Support");
|
||||
|
||||
text: catalog.i18nc("@option:check","Generate Support Structure");
|
||||
style: UM.Theme.styles.checkbox;
|
||||
|
||||
checked: UM.ActiveProfile.valid ? UM.ActiveProfile.settingValues.support_enable : false;
|
||||
onClicked:
|
||||
{
|
||||
UM.MachineManager.setSettingValue("support_enable", checked)
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
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
|
||||
|
||||
Rectangle {
|
||||
UM.PointingRectangle {
|
||||
id: base;
|
||||
|
||||
width: UM.Theme.sizes.tooltip.width;
|
||||
height: label.height + UM.Theme.sizes.tooltip_margins.height * 2;
|
||||
color: UM.Theme.colors.tooltip;
|
||||
|
||||
arrowSize: UM.Theme.sizes.default_arrow.width
|
||||
|
||||
opacity: 0;
|
||||
Behavior on opacity { NumberAnimation { duration: 100; } }
|
||||
|
||||
@ -26,9 +28,10 @@ Rectangle {
|
||||
y = parent.height - base.height;
|
||||
} else {
|
||||
x = position.x - base.width;
|
||||
y = position.y;
|
||||
y = position.y - UM.Theme.sizes.tooltip_arrow_margins.height;
|
||||
}
|
||||
base.opacity = 1;
|
||||
target = Qt.point(40 , position.y)
|
||||
}
|
||||
|
||||
function hide() {
|
||||
@ -47,5 +50,6 @@ Rectangle {
|
||||
}
|
||||
wrapMode: Text.Wrap;
|
||||
font: UM.Theme.fonts.default;
|
||||
color: UM.Theme.colors.tooltip_text;
|
||||
}
|
||||
}
|
||||
|
@ -20,7 +20,7 @@ Item {
|
||||
|
||||
anchors.bottom: parent.bottom;
|
||||
anchors.left: parent.left;
|
||||
spacing: UM.Theme.sizes.default_lining.width
|
||||
spacing: UM.Theme.sizes.button_lining.width
|
||||
|
||||
Repeater {
|
||||
id: repeat
|
||||
@ -50,20 +50,17 @@ Item {
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
width: base.width
|
||||
height: base.height
|
||||
z: parent.z - 1
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
color: UM.Theme.colors.lining
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: panelBackground;
|
||||
UM.PointingRectangle {
|
||||
id: panelBorder;
|
||||
|
||||
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: {
|
||||
if (panel.item && panel.width > 0){
|
||||
@ -78,9 +75,20 @@ Item {
|
||||
opacity: panel.item ? 1 : 0
|
||||
Behavior on opacity { NumberAnimation { duration: 100 } }
|
||||
|
||||
color: UM.Theme.colors.tool_panel_background;
|
||||
border.width: UM.Theme.sizes.default_lining.width
|
||||
border.color: UM.Theme.colors.lining
|
||||
color: UM.Theme.colors.lining;
|
||||
//border.width: UM.Theme.sizes.default_lining.width
|
||||
//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 {
|
||||
id: panel
|
||||
|
@ -7,8 +7,6 @@ import QtQuick.Window 2.1
|
||||
import QtQuick.Controls.Styles 1.1
|
||||
|
||||
import UM 1.1 as UM
|
||||
import Cura 1.0 as Cura
|
||||
import ".."
|
||||
|
||||
Item
|
||||
{
|
||||
@ -18,18 +16,69 @@ Item
|
||||
|
||||
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
|
||||
{
|
||||
target: base.wizard
|
||||
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()
|
||||
// Delete old pages (if any)
|
||||
for (var i = old_page_count - 1; i > 0; i--)
|
||||
var name = machineName.text
|
||||
if (UM.MachineManager.checkInstanceExists(name) != false)
|
||||
{
|
||||
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:
|
||||
{
|
||||
@ -63,7 +112,8 @@ Item
|
||||
{
|
||||
id: machinesHolder
|
||||
|
||||
anchors{
|
||||
anchors
|
||||
{
|
||||
left: parent.left;
|
||||
top: subTitle.bottom;
|
||||
right: parent.right;
|
||||
@ -110,6 +160,7 @@ Item
|
||||
onClicked: {
|
||||
base.activeManufacturer = section;
|
||||
machineList.currentIndex = machineList.model.find("manufacturer", section)
|
||||
machineName.text = getMachineName()
|
||||
}
|
||||
}
|
||||
|
||||
@ -128,7 +179,10 @@ Item
|
||||
|
||||
text: model.name
|
||||
|
||||
onClicked: ListView.view.currentIndex = index;
|
||||
onClicked: {
|
||||
ListView.view.currentIndex = index;
|
||||
machineName.text = getMachineName()
|
||||
}
|
||||
|
||||
Label
|
||||
{
|
||||
@ -169,11 +223,33 @@ Item
|
||||
}
|
||||
}
|
||||
|
||||
Item
|
||||
|
||||
|
||||
Column
|
||||
{
|
||||
id: machineNameHolder
|
||||
height: childrenRect.height
|
||||
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
|
||||
{
|
||||
id: insertNameLabel
|
||||
@ -182,8 +258,7 @@ Item
|
||||
TextField
|
||||
{
|
||||
id: machineName;
|
||||
anchors.top: insertNameLabel.bottom
|
||||
text: machineList.model.getItem(machineList.currentIndex).name
|
||||
text: getMachineName()
|
||||
implicitWidth: UM.Theme.sizes.standard_list_input.width
|
||||
}
|
||||
}
|
||||
@ -218,6 +293,9 @@ Item
|
||||
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 UM 1.1 as UM
|
||||
import Cura 1.0 as Cura
|
||||
import ".."
|
||||
|
||||
Item
|
||||
{
|
||||
@ -15,11 +17,22 @@ Item
|
||||
property bool three_point_leveling: true
|
||||
property int platform_width: UM.MachineManager.getSettingValue("machine_width")
|
||||
property int platform_height: UM.MachineManager.getSettingValue("machine_depth")
|
||||
property bool alreadyTested: base.addOriginalProgress.bedLeveling
|
||||
anchors.fill: parent;
|
||||
property variant printer_connection: UM.USBPrinterManager.connectedPrinterList.getItem(0).printer
|
||||
Component.onCompleted: printer_connection.homeHead()
|
||||
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
|
||||
{
|
||||
@ -61,7 +74,6 @@ Item
|
||||
id: bedlevelingButton
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
enabled: !alreadyTested
|
||||
text: catalog.i18nc("@action:button","Move to Next Position");
|
||||
onClicked:
|
||||
{
|
||||
@ -79,7 +91,6 @@ Item
|
||||
}
|
||||
wizardPage.leveling_state++
|
||||
if (wizardPage.leveling_state >= 3){
|
||||
base.addOriginalProgress.bedLeveling = true
|
||||
resultText.visible = true
|
||||
skipBedlevelingButton.enabled = false
|
||||
bedlevelingButton.enabled = false
|
||||
@ -91,7 +102,6 @@ Item
|
||||
Button
|
||||
{
|
||||
id: skipBedlevelingButton
|
||||
enabled: !alreadyTested
|
||||
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.left: parent.width < wizardPage.width ? bedlevelingButton.right : parent.left
|
||||
@ -104,13 +114,13 @@ Item
|
||||
Label
|
||||
{
|
||||
id: resultText
|
||||
visible: alreadyTested
|
||||
visible: false
|
||||
anchors.top: bedlevelingWrapper.bottom
|
||||
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||
anchors.left: parent.left
|
||||
width: parent.width
|
||||
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)
|
||||
|
@ -17,11 +17,8 @@ Item
|
||||
|
||||
Component.onDestruction:
|
||||
{
|
||||
base.addOriginalProgress.upgrades[0] = extruderCheckBox.checked
|
||||
base.addOriginalProgress.upgrades[1] = heatedBedCheckBox1.checked
|
||||
base.addOriginalProgress.upgrades[2] = heatedBedCheckBox2.checked
|
||||
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){
|
||||
UM.MachineManager.setMachineSettingValue("machine_heated_bed", true)
|
||||
@ -58,14 +55,14 @@ Item
|
||||
{
|
||||
id: extruderCheckBox
|
||||
text: catalog.i18nc("@option:check","Extruder driver ugrades")
|
||||
checked: base.addOriginalProgress.upgrades[0]
|
||||
checked: true
|
||||
}
|
||||
CheckBox
|
||||
{
|
||||
id: heatedBedCheckBox1
|
||||
text: catalog.i18nc("@option:check","Heated printer bed (standard kit)")
|
||||
text: catalog.i18nc("@option:check","Heated printer bed")
|
||||
y: extruderCheckBox.height * 1
|
||||
checked: base.addOriginalProgress.upgrades[1]
|
||||
checked: false
|
||||
onClicked: {
|
||||
if (heatedBedCheckBox2.checked == true)
|
||||
heatedBedCheckBox2.checked = false
|
||||
@ -76,7 +73,7 @@ Item
|
||||
id: heatedBedCheckBox2
|
||||
text: catalog.i18nc("@option:check","Heated printer bed (self built)")
|
||||
y: extruderCheckBox.height * 2
|
||||
checked: base.addOriginalProgress.upgrades[2]
|
||||
checked: false
|
||||
onClicked: {
|
||||
if (heatedBedCheckBox1.checked == true)
|
||||
heatedBedCheckBox1.checked = false
|
||||
|
@ -14,35 +14,40 @@ Item
|
||||
property int leftRow: wizardPage.width*0.40
|
||||
property int rightRow: wizardPage.width*0.60
|
||||
anchors.fill: parent;
|
||||
property bool alreadyTested: base.addOriginalProgress.checkUp[base.addOriginalProgress.checkUp.length-1]
|
||||
property bool x_min_pressed: false
|
||||
property bool y_min_pressed: false
|
||||
property bool z_min_pressed: false
|
||||
property bool heater_works: false
|
||||
property int extruder_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: {
|
||||
if (UM.USBPrinterManager.connectedPrinterList.rowCount() != 0){
|
||||
base.addOriginalProgress.checkUp[0] = true
|
||||
checkTotalCheckUp()
|
||||
wizardPage.checkupProgress.connection = true
|
||||
return UM.USBPrinterManager.connectedPrinterList.getItem(0).printer
|
||||
}
|
||||
else {
|
||||
return null
|
||||
}
|
||||
}
|
||||
//property variant printer_connection: UM.USBPrinterManager.connectedPrinterList.getItem(0).printer
|
||||
UM.I18nCatalog { id: catalog; name:"cura"}
|
||||
|
||||
function checkTotalCheckUp(){
|
||||
var allDone = true
|
||||
for (var i = 0; i < (base.addOriginalProgress.checkUp.length - 1); i++){
|
||||
if (base.addOriginalProgress.checkUp[i] == false){
|
||||
for(var property in checkupProgress){
|
||||
if (checkupProgress[property] == false){
|
||||
allDone = false
|
||||
}
|
||||
}
|
||||
if (allDone == true){
|
||||
base.addOriginalProgress.checkUp[base.addOriginalProgress.checkUp.length] = true
|
||||
skipCheckButton.enabled = false
|
||||
resultText.visible = true
|
||||
}
|
||||
@ -91,7 +96,7 @@ Item
|
||||
id: startCheckButton
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
enabled: !alreadyTested
|
||||
//enabled: !alreadyTested
|
||||
text: catalog.i18nc("@action:button","Start Printer Check");
|
||||
onClicked: {
|
||||
checkupContent.visible = true
|
||||
@ -107,7 +112,7 @@ Item
|
||||
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.leftMargin: parent.width < wizardPage.width ? UM.Theme.sizes.default_margin.width : 0
|
||||
enabled: !alreadyTested
|
||||
//enabled: !alreadyTested
|
||||
text: catalog.i18nc("@action:button","Skip Printer Check");
|
||||
onClicked: {
|
||||
base.currentPage += 1
|
||||
@ -119,7 +124,7 @@ Item
|
||||
id: checkupContent
|
||||
anchors.top: startStopButtons.bottom
|
||||
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||
visible: alreadyTested
|
||||
visible: false
|
||||
//////////////////////////////////////////////////////////
|
||||
Label
|
||||
{
|
||||
@ -156,7 +161,7 @@ Item
|
||||
anchors.left: endstopXLabel.right
|
||||
anchors.top: connectionLabel.bottom
|
||||
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
|
||||
@ -175,7 +180,7 @@ Item
|
||||
anchors.left: endstopYLabel.right
|
||||
anchors.top: endstopXLabel.bottom
|
||||
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
|
||||
@ -194,7 +199,7 @@ Item
|
||||
anchors.left: endstopZLabel.right
|
||||
anchors.top: endstopYLabel.bottom
|
||||
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
|
||||
@ -233,14 +238,9 @@ Item
|
||||
{
|
||||
if(printer_connection != null)
|
||||
{
|
||||
if (alreadyTested){
|
||||
nozzleTempStatus.text = catalog.i18nc("@info:status","Works")
|
||||
}
|
||||
else {
|
||||
nozzleTempStatus.text = catalog.i18nc("@info:progress","Checking")
|
||||
printer_connection.heatupNozzle(190)
|
||||
wizardPage.extruder_target_temp = 190
|
||||
}
|
||||
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 (alreadyTested){
|
||||
bedTempStatus.text = catalog.i18nc("@info:status","Works")
|
||||
}
|
||||
else {
|
||||
bedTempStatus.text = catalog.i18nc("@info:progress","Checking")
|
||||
printer_connection.heatupBed(60)
|
||||
wizardPage.bed_target_temp = 60
|
||||
}
|
||||
bedTempStatus.text = catalog.i18nc("@info:progress","Checking")
|
||||
printer_connection.heatupBed(60)
|
||||
wizardPage.bed_target_temp = 60
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -320,7 +315,7 @@ Item
|
||||
Label
|
||||
{
|
||||
id: resultText
|
||||
visible: base.addOriginalProgress.checkUp[base.addOriginalProgress.checkUp.length-1]
|
||||
visible: false
|
||||
anchors.top: bedTemp.bottom
|
||||
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||
anchors.left: parent.left
|
||||
@ -338,19 +333,16 @@ Item
|
||||
{
|
||||
if(key == "x_min")
|
||||
{
|
||||
base.addOriginalProgress.checkUp[1] = true
|
||||
x_min_pressed = true
|
||||
checkTotalCheckUp()
|
||||
}
|
||||
if(key == "y_min")
|
||||
{
|
||||
base.addOriginalProgress.checkUp[2] = true
|
||||
y_min_pressed = true
|
||||
checkTotalCheckUp()
|
||||
}
|
||||
if(key == "z_min")
|
||||
{
|
||||
base.addOriginalProgress.checkUp[3] = true
|
||||
z_min_pressed = true
|
||||
checkTotalCheckUp()
|
||||
}
|
||||
@ -363,7 +355,7 @@ Item
|
||||
if(printer_connection != null)
|
||||
{
|
||||
nozzleTempStatus.text = catalog.i18nc("@info:status","Works")
|
||||
base.addOriginalProgress.checkUp[4] = true
|
||||
wizardPage.checkupProgress.nozzleTemp = true
|
||||
checkTotalCheckUp()
|
||||
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)
|
||||
{
|
||||
bedTempStatus.text = catalog.i18nc("@info:status","Works")
|
||||
base.addOriginalProgress.checkUp[5] = true
|
||||
wizardPage.checkupProgress.bedTemp = true
|
||||
checkTotalCheckUp()
|
||||
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"
|
||||
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>
|
||||
<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"/>
|
||||
<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"/>
|
||||
<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
|
||||
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
|
||||
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
|
||||
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
|
||||
L24.7,16.7z"/>
|
||||
<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="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"/>
|
||||
</g>
|
||||
</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) -->
|
||||
<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">
|
||||
<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">
|
||||
<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
|
||||
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
|
||||
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
|
||||
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
|
||||
L24.7,16.7z"/>
|
||||
<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="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,421.1 -266.8,434.7 -266.4,434.7 -253.2,421.5 "/>
|
||||
<polygon fill="none" points="-253.2,418.9 -269,434.7 -268.6,434.7 -253.2,419.3 "/>
|
||||
<polygon fill="none" points="-253.2,423.3 -264.6,434.7 -264.2,434.7 -253.2,423.7 "/>
|
||||
<polygon fill="none" points="-253.2,425.5 -262.4,434.7 -262,434.7 -253.2,425.9 "/>
|
||||
<polygon fill="none" points="-253.2,434.7 -253.2,434.3 -253.6,434.7 "/>
|
||||
<polygon fill="none" points="-253.2,429.9 -258,434.7 -257.6,434.7 -253.2,430.3 "/>
|
||||
<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>
|
||||
</svg>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 13 KiB |