This commit is contained in:
Jaime van Kessel 2015-10-28 12:18:06 +01:00
commit e524d028d7
64 changed files with 12202 additions and 441 deletions

View File

@ -66,3 +66,4 @@ else()
install(DIRECTORY cura DESTINATION lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages)
endif()
include(CPackConfig.cmake)

16
CPackConfig.cmake Normal file
View File

@ -0,0 +1,16 @@
set(CPACK_PACKAGE_VENDOR "Ultimaker B.V.")
set(CPACK_PACKAGE_CONTACT "Arjen Hiemstra <a.hiemstra@ultimaker.com>")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Cura application to drive the CuraEngine")
set(CPACK_PACKAGE_VERSION_MAJOR 15)
set(CPACK_PACKAGE_VERSION_MINOR 05)
set(CPACK_PACKAGE_VERSION_PATCH 90)
set(CPACK_PACKAGE_VERSION_REVISION 1)
set(CPACK_GENERATOR "DEB")
set(DEB_DEPENDS
"uranium (>= 15.05.93)"
)
string(REPLACE ";" ", " DEB_DEPENDS "${DEB_DEPENDS}")
set(CPACK_DEBIAN_PACKAGE_DEPENDS ${DEB_DEPENDS})
include(CPack)

View File

@ -13,7 +13,7 @@ Use [this](https://github.com/Ultimaker/Uranium/wiki/Bug-Reporting-Template) tem
For crashes and similar issues, please attach the following information:
* (On Windows) The log as produced by dxdiag (start -> run -> dxdiag -> save output)
* The Cura GUI log file, located at (Windows) $User/AppData/Local/cura/cura.log, (OSX) $User/.cura/cura.log
* The Cura GUI log file, located at (Windows) $User/AppData/Local/cura/cura.log, (OSX) $User/.cura/cura.log, (Ubuntu) $USER/.local/share/cura
* The Cura Engine log, using Help -> Show Engine Log
Dependencies

View File

@ -8,5 +8,6 @@ TryExec=/usr/bin/cura_app.py
Icon=/usr/share/cura/resources/images/cura-icon.png
Terminal=false
Type=Application
MimeType=application/sla
Categories=Graphics;
Keywords=3D;Printing;

View File

@ -8,9 +8,15 @@ from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QVBoxLayout, QLabel, QTex
from UM.i18n import i18nCatalog
catalog = i18nCatalog("cura")
def show(type, value, tb):
if not hasattr(sys, "frozen"):
traceback.print_exception(type, value, tb)
def show(exception_type, value, tb):
debug_mode = False
if QCoreApplication.instance():
debug_mode = QCoreApplication.instance().getCommandLineOption("debug-mode", False)
traceback.print_exception(exception_type, value, tb)
if not debug_mode:
return
application = QCoreApplication.instance()
if not application:
@ -34,7 +40,7 @@ def show(type, value, tb):
except:
version = "Unknown"
trace = "".join(traceback.format_exception(type, value, tb))
trace = "".join(traceback.format_exception(exception_type, value, tb))
crash_info = "Version: {0}\nPlatform: {1}\nQt: {2}\nPyQt: {3}\n\nException:\n{4}"
crash_info = crash_info.format(version, platform.platform(), QT_VERSION_STR, PYQT_VERSION_STR, trace)
@ -44,7 +50,7 @@ def show(type, value, tb):
buttons = QDialogButtonBox(QDialogButtonBox.Close, dialog)
layout.addWidget(buttons)
buttons.addButton(catalog.i18nc("@action:button", "Open Web Page"), QDialogButtonBox.HelpRole)
buttons.rejected.connect(lambda: dialog.close())
buttons.rejected.connect(dialog.close)
buttons.helpRequested.connect(lambda: webbrowser.open("http://github.com/Ultimaker/Cura/issues"))
dialog.exec_()

View File

@ -44,6 +44,7 @@ from . import CameraAnimation
from . import PrintInformation
from . import CuraActions
from . import MultiMaterialDecorator
from . import ZOffsetDecorator
from PyQt5.QtCore import pyqtSlot, QUrl, Qt, pyqtSignal, pyqtProperty, QEvent, Q_ENUMS
from PyQt5.QtGui import QColor, QIcon
@ -68,7 +69,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 = "15.09.82")
super().__init__(name = "cura", version = "master")
self.setWindowIcon(QIcon(Resources.getPath(Resources.Images, "cura-icon.png")))
@ -90,6 +91,7 @@ class CuraApplication(QtApplication):
self._i18n_catalog = None
self._previous_active_tool = None
self._platform_activity = False
self._job_name = None
self.getMachineManager().activeMachineInstanceChanged.connect(self._onActiveMachineChanged)
self.getMachineManager().addMachineRequested.connect(self._onAddMachineRequested)
@ -131,6 +133,7 @@ class CuraApplication(QtApplication):
def addCommandLineOptions(self, parser):
super().addCommandLineOptions(parser)
parser.add_argument("file", nargs="*", help="Files to load after starting the application.")
parser.add_argument("--debug", dest="debug-mode", action="store_true", default=False, help="Enable detailed crash reports.")
def run(self):
self._i18n_catalog = i18nCatalog("cura");
@ -165,25 +168,21 @@ class CuraApplication(QtApplication):
self._physics = PlatformPhysics.PlatformPhysics(controller, self._volume)
camera = Camera("3d", root)
camera.setPosition(Vector(-150, 150, 300))
camera.setPosition(Vector(0, 250, 900))
camera.setPerspective(True)
camera.lookAt(Vector(0, 0, 0))
controller.getScene().setActiveCamera("3d")
self.getController().getTool("CameraTool").setOrigin(Vector(0, 100, 0))
self._camera_animation = CameraAnimation.CameraAnimation()
self._camera_animation.setCameraTool(self.getController().getTool("CameraTool"))
controller.getScene().setActiveCamera("3d")
self.showSplashMessage(self._i18n_catalog.i18nc("@info:progress", "Loading interface..."))
self.setMainQml(Resources.getPath(self.ResourceTypes.QmlFiles, "Cura.qml"))
self.initializeEngine()
manager = self.getMachineManager()
if not self.getMachineManager().getMachineInstances():
self.requestAddPrinter.emit()
if self._engine.rootObjects:
self.closeSplash()
@ -248,19 +247,30 @@ class CuraApplication(QtApplication):
self._platform_activity = True if count > 0 else False
self.activityChanged.emit()
@pyqtSlot(str)
def setJobName(self, name):
if self._job_name != name:
self._job_name = name
self.jobNameChanged.emit()
jobNameChanged = pyqtSignal()
@pyqtProperty(str, notify = jobNameChanged)
def jobName(self):
return self._job_name
## Remove an object from the scene
@pyqtSlot("quint64")
def deleteObject(self, object_id):
object = self.getController().getScene().findObject(object_id)
node = self.getController().getScene().findObject(object_id)
if not object and object_id != 0: #Workaround for tool handles overlapping the selected object
object = Selection.getSelectedObject(0)
if object:
if object.getParent():
group_node = object.getParent()
if not node and object_id != 0: #Workaround for tool handles overlapping the selected object
node = Selection.getSelectedObject(0)
if node:
if node.getParent():
group_node = node.getParent()
if not group_node.callDecoration("isGroup"):
op = RemoveSceneNodeOperation(object)
op = RemoveSceneNodeOperation(node)
else:
while group_node.getParent().callDecoration("isGroup"):
group_node = group_node.getParent()
@ -294,10 +304,15 @@ class CuraApplication(QtApplication):
@pyqtSlot("quint64")
def centerObject(self, object_id):
node = self.getController().getScene().findObject(object_id)
if node.getParent() and node.getParent().callDecoration("isGroup"):
node = node.getParent()
if not node and object_id != 0: #Workaround for tool handles overlapping the selected object
node = Selection.getSelectedObject(0)
if not node:
return
if node.getParent() and node.getParent().callDecoration("isGroup"):
node = node.getParent()
if node:
op = SetTransformOperation(node, Vector())
op.push()
@ -335,14 +350,12 @@ class CuraApplication(QtApplication):
continue #Grouped nodes don't need resetting as their parent (the group) is resetted)
nodes.append(node)
if nodes:
op = GroupedOperation()
for node in nodes:
# Ensure that the object is above the build platform
move_distance = node.getBoundingBox().center.y
if move_distance <= 0:
move_distance = -node.getBoundingBox().bottom
op.addOperation(SetTransformOperation(node, Vector(0,move_distance,0)))
node.removeDecorator(ZOffsetDecorator.ZOffsetDecorator)
op.addOperation(SetTransformOperation(node, Vector(0,0,0)))
op.push()
@ -364,10 +377,8 @@ class CuraApplication(QtApplication):
for node in nodes:
# Ensure that the object is above the build platform
move_distance = node.getBoundingBox().center.y
if move_distance <= 0:
move_distance = -node.getBoundingBox().bottom
op.addOperation(SetTransformOperation(node, Vector(0,move_distance,0), Quaternion(), Vector(1, 1, 1)))
node.removeDecorator(ZOffsetDecorator.ZOffsetDecorator)
op.addOperation(SetTransformOperation(node, Vector(0,0,0), Quaternion(), Vector(1, 1, 1)))
op.push()
@ -464,17 +475,20 @@ class CuraApplication(QtApplication):
group_decorator = GroupDecorator()
group_node.addDecorator(group_decorator)
group_node.setParent(self.getController().getScene().getRoot())
center = Selection.getSelectionCenter()
group_node.setPosition(center)
group_node.setCenterPosition(center)
for node in Selection.getAllSelectedObjects():
world = node.getWorldPosition()
node.setParent(group_node)
group_node.setCenterPosition(group_node.getBoundingBox().center)
#group_node.translate(Vector(0,group_node.getBoundingBox().center.y,0))
group_node.translate(group_node.getBoundingBox().center)
node.setPosition(world - center)
for node in group_node.getChildren():
Selection.remove(node)
Selection.add(group_node)
@pyqtSlot()
def ungroupSelected(self):
ungrouped_nodes = []
@ -485,12 +499,11 @@ class CuraApplication(QtApplication):
for child in node.getChildren():
if type(child) is SceneNode:
children_to_move.append(child)
for child in children_to_move:
position = child.getWorldPosition()
child.setParent(node.getParent())
print(node.getPosition())
child.translate(node.getPosition())
child.setPosition(child.getPosition().scale(node.getScale()))
child.setPosition(position - node.getParent().getWorldPosition())
child.scale(node.getScale())
child.rotate(node.getOrientation())
@ -536,6 +549,8 @@ class CuraApplication(QtApplication):
op = AddSceneNodeOperation(node, self.getController().getScene().getRoot())
op.push()
self.getController().getScene().sceneChanged.emit(node) #Force scene change.
def _onJobFinished(self, job):
if type(job) is not ReadMeshJob or not job.getResult():
return

View File

@ -107,7 +107,7 @@ class Layer():
def build(self, offset, vertices, colors, indices):
result = offset
for polygon in self._polygons:
if polygon._type == Polygon.InfillType or polygon._type == Polygon.SupportInfillType or polygon.type == Polygon.MoveCombingType or polygon.type == Polygon.MoveRetractionType:
if polygon.type == Polygon.InfillType or polygon.type == Polygon.MoveCombingType or polygon.type == Polygon.MoveRetractionType:
continue
polygon.build(result, vertices, colors, indices)
@ -238,7 +238,7 @@ class Polygon():
elif self._type == self.MoveCombingType:
return Color(0.0, 0.0, 1.0, 1.0)
elif self._type == self.MoveRetractionType:
return Color(0.0, 1.0, 1.0, 1.0)
return Color(0.5, 0.5, 1.0, 1.0)
else:
return Color(1.0, 1.0, 1.0, 1.0)

View File

@ -17,6 +17,7 @@ from cura.ConvexHullDecorator import ConvexHullDecorator
from . import PlatformPhysicsOperation
from . import ConvexHullJob
from . import ZOffsetDecorator
import time
import threading
@ -69,8 +70,12 @@ class PlatformPhysics:
# Move it downwards if bottom is above platform
move_vector = Vector()
if not (node.getParent() and node.getParent().callDecoration("isGroup")): #If an object is grouped, don't move it down
z_offset = node.callDecoration("getZOffset") if node.getDecorator(ZOffsetDecorator.ZOffsetDecorator) else 0
if bbox.bottom > 0:
move_vector.setY(-bbox.bottom)
move_vector.setY(-bbox.bottom + z_offset)
elif bbox.bottom < z_offset:
move_vector.setY((-bbox.bottom) - z_offset)
#if not Float.fuzzyCompare(bbox.bottom, 0.0):
# pass#move_vector.setY(-bbox.bottom)
@ -127,8 +132,8 @@ class PlatformPhysics:
if overlap is None:
continue
move_vector.setX(overlap[0] * 1.01)
move_vector.setZ(overlap[1] * 1.01)
move_vector.setX(overlap[0] * 1.1)
move_vector.setZ(overlap[1] * 1.1)
convex_hull = node.callDecoration("getConvexHull")
if convex_hull:
if not convex_hull.isValid():
@ -149,5 +154,16 @@ class PlatformPhysics:
self._enabled = False
def _onToolOperationStopped(self, tool):
if tool.getPluginId() == "TranslateTool":
for node in Selection.getAllSelectedObjects():
if node.getBoundingBox().bottom < 0:
if not node.getDecorator(ZOffsetDecorator.ZOffsetDecorator):
node.addDecorator(ZOffsetDecorator.ZOffsetDecorator())
node.callDecoration("setZOffset", node.getBoundingBox().bottom)
else:
if node.getDecorator(ZOffsetDecorator.ZOffsetDecorator):
node.removeDecorator(ZOffsetDecorator.ZOffsetDecorator)
self._enabled = True
self._onChangeTimerFinished()

13
cura/ZOffsetDecorator.py Normal file
View File

@ -0,0 +1,13 @@
from UM.Scene.SceneNodeDecorator import SceneNodeDecorator
## A decorator that stores the amount an object has been moved below the platform.
class ZOffsetDecorator(SceneNodeDecorator):
def __init__(self):
self._z_offset = 0
def setZOffset(self, offset):
print("setZOffset", offset)
self._z_offset = offset
def getZOffset(self):
return self._z_offset

View File

@ -13,5 +13,12 @@ sys.excepthook = exceptHook
import cura.CuraApplication
if sys.platform == "win32" and hasattr(sys, "frozen"):
import os
dirpath = os.path.expanduser("~/AppData/Local/cura/")
os.makedirs(dirpath, exist_ok = True)
sys.stdout = open(os.path.join(dirpath, "stdout.log"), "w")
sys.stderr = open(os.path.join(dirpath, "stderr.log"), "w")
app = cura.CuraApplication.CuraApplication.getInstance()
app.run()

View File

@ -42,6 +42,10 @@ class ThreeMFReader(MeshReader):
# There can be multiple objects, try to load all of them.
objects = root.findall("./3mf:resources/3mf:object", self._namespaces)
if len(objects) == 0:
Logger.log("w", "No objects found in 3MF file %s, either the file is corrupt or you are using an outdated format", file_name)
return None
for object in objects:
mesh = MeshData()
node = SceneNode()
@ -53,18 +57,17 @@ class ThreeMFReader(MeshReader):
triangles = object.findall(".//3mf:triangle", self._namespaces)
mesh.reserveFaceCount(len(triangles))
#for triangle in object.mesh.triangles.triangle:
for triangle in triangles:
v1 = int(triangle.get("v1"))
v2 = int(triangle.get("v2"))
v3 = int(triangle.get("v3"))
mesh.addFace(vertex_list[v1][0],vertex_list[v1][2],vertex_list[v1][1],vertex_list[v2][0],vertex_list[v2][2],vertex_list[v2][1],vertex_list[v3][0],vertex_list[v3][2],vertex_list[v3][1])
#TODO: We currently do not check for normals and simply recalculate them.
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])
#TODO: We currently do not check for normals and simply recalculate them.
mesh.calculateNormals()
node.setMeshData(mesh)
node.setSelectable(True)
Logger.log("d", "Loaded a mesh with %s vertices", mesh.getVertexCount())
transformation = root.findall("./3mf:build/3mf:item[@objectid='{0}']".format(object.get("id")), self._namespaces)
if transformation:
@ -89,18 +92,18 @@ class ThreeMFReader(MeshReader):
temp_mat._data[0,2] = splitted_transformation[6]
temp_mat._data[1,2] = splitted_transformation[7]
temp_mat._data[2,2] = splitted_transformation[8]
# Translation
temp_mat._data[0,3] = splitted_transformation[9]
temp_mat._data[1,3] = splitted_transformation[10]
temp_mat._data[2,3] = splitted_transformation[11]
node.setPosition(Vector(temp_mat.at(0,3), temp_mat.at(1,3), temp_mat.at(2,3)))
temp_quaternion = Quaternion()
temp_quaternion.setByMatrix(temp_mat)
node.setOrientation(temp_quaternion)
# Magical scale extraction
S2 = temp_mat.getTransposed().multiply(temp_mat)
scale_x = math.sqrt(S2.at(0,0))

View File

@ -31,6 +31,7 @@ class ChangeLog(Extension, QObject,):
self._change_logs = None
Application.getInstance().engineCreatedSignal.connect(self._onEngineCreated)
Preferences.getInstance().addPreference("general/latest_version_changelog_shown", "15.05.90") #First version of CURA with uranium
self.addMenuItem(catalog.i18nc("@item:inmenu", "Show Changelog"), self.showChangelog)
#self.showChangelog()
def getChangeLogs(self):
@ -77,8 +78,8 @@ class ChangeLog(Extension, QObject,):
def _onEngineCreated(self):
if not self._version:
return #We're on dev branch.
if self._version > Preferences.getInstance().getValue("general/latest_version_changelog_shown"):
self.showChangelog()
#if self._version > Preferences.getInstance().getValue("general/latest_version_changelog_shown"):
#self.showChangelog()
def showChangelog(self):
if not self._changelog_window:

View File

@ -9,7 +9,7 @@ catalog = i18nCatalog("cura")
def getMetaData():
return {
"plugin": {
"name": catalog.i18nc("@label", "Change Log"),
"name": catalog.i18nc("@label", "Changelog"),
"author": "Ultimaker",
"version": "1.0",
"description": catalog.i18nc("@info:whatsthis", "Shows changes since latest checked version"),

View File

@ -77,12 +77,20 @@ class CuraEngineBackend(Backend):
self._message = None
self.backendConnected.connect(self._onBackendConnected)
Application.getInstance().getController().toolOperationStarted.connect(self._onToolOperationStarted)
Application.getInstance().getController().toolOperationStopped.connect(self._onToolOperationStopped)
Application.getInstance().getMachineManager().activeMachineInstanceChanged.connect(self._onInstanceChanged)
## Get the command that is used to call the engine.
# This is usefull for debugging and used to actually start the engine
# \return list of commands and args / parameters.
def getEngineCommand(self):
return [Preferences.getInstance().getValue("backend/location"), "connect", "127.0.0.1:{0}".format(self._port), "-j", Resources.getPath(Resources.MachineDefinitions, "fdmprinter.json"), "-vv"]
active_machine = Application.getInstance().getMachineManager().getActiveMachineInstance()
if not active_machine:
return None
return [Preferences.getInstance().getValue("backend/location"), "connect", "127.0.0.1:{0}".format(self._port), "-j", active_machine.getMachineDefinition().getPath(), "-vv"]
## Emitted when we get a message containing print duration and material amount. This also implies the slicing has finished.
# \param time The amount of time the print will take.
@ -123,6 +131,7 @@ class CuraEngineBackend(Backend):
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":
@ -221,10 +230,16 @@ class CuraEngineBackend(Backend):
self._socket.sendMessage(slice_message)
def _onSceneChanged(self, source):
if (type(source) is not SceneNode) or (source is self._scene.getRoot()) or (source.getMeshData() is None):
if type(source) is not SceneNode:
return
if(source.getMeshData().getVertices() is None):
if source is self._scene.getRoot():
return
if source.getMeshData() is None:
return
if source.getMeshData().getVertices() is None:
return
self._onChanged()
@ -327,6 +342,7 @@ class CuraEngineBackend(Backend):
if self._stored_layer_data:
job = ProcessSlicedObjectListJob.ProcessSlicedObjectListJob(self._stored_layer_data)
job.start()
self._stored_layer_data = None
else:
self._layer_view_active = False
@ -346,3 +362,14 @@ class CuraEngineBackend(Backend):
setting = message.settings.add()
setting.name = key
setting.value = str(value).encode()
def _onInstanceChanged(self):
self._slicing = False
self._restart = True
if self._process is not None:
Logger.log("d", "Killing engine process")
try:
self._process.terminate()
except: # terminating a process that is already terminating causes an exception, silently ignore this.
pass
self.slicingCancelled.emit()

View File

@ -102,15 +102,16 @@ class LayerView(View):
continue
except:
continue
self._current_layer_mesh.addVertices(layer_mesh.getVertices())
if self._current_layer_mesh: #Threading thing; Switching between views can cause the current layer mesh to be deleted.
self._current_layer_mesh.addVertices(layer_mesh.getVertices())
# Scale layer color by a brightness factor based on the current layer number
# This will result in a range of 0.5 - 1.0 to multiply colors by.
brightness = (2.0 - (i / self._solid_layers)) / 2.0
self._current_layer_mesh.addColors(layer_mesh.getColors() * brightness)
renderer.queueNode(node, mesh = self._current_layer_mesh, material = self._material)
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)
if not self._current_layer_jumps:
self._current_layer_jumps = MeshData()

View File

@ -0,0 +1,109 @@
# Copyright (c) 2015 Ultimaker B.V.
# Uranium is released under the terms of the AGPLv3 or higher.
from PyQt5.QtCore import Qt, pyqtSlot, QUrl
from UM.Application import Application
from UM.Qt.ListModel import ListModel
from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator
from UM.Scene.SceneNode import SceneNode
from UM.Settings.SettingOverrideDecorator import SettingOverrideDecorator
from UM.Settings.ProfileOverrideDecorator import ProfileOverrideDecorator
from . import SettingOverrideModel
class PerObjectSettingsModel(ListModel):
IdRole = Qt.UserRole + 1
XRole = Qt.UserRole + 2
YRole = Qt.UserRole + 3
MaterialRole = Qt.UserRole + 4
ProfileRole = Qt.UserRole + 5
SettingsRole = Qt.UserRole + 6
def __init__(self, parent = None):
super().__init__(parent)
self._scene = Application.getInstance().getController().getScene()
self._root = self._scene.getRoot()
self._root.transformationChanged.connect(self._updatePositions)
self._root.childrenChanged.connect(self._updateNodes)
self._updateNodes(None)
self.addRoleName(self.IdRole,"id")
self.addRoleName(self.XRole,"x")
self.addRoleName(self.YRole,"y")
self.addRoleName(self.MaterialRole, "material")
self.addRoleName(self.ProfileRole, "profile")
self.addRoleName(self.SettingsRole, "settings")
@pyqtSlot("quint64", str)
def setObjectProfile(self, object_id, profile_name):
self.setProperty(self.find("id", object_id), "profile", profile_name)
profile = None
if profile_name != "global":
profile = Application.getInstance().getMachineManager().findProfile(profile_name)
node = self._scene.findObject(object_id)
if profile:
if not node.getDecorator(ProfileOverrideDecorator):
node.addDecorator(ProfileOverrideDecorator())
node.callDecoration("setProfile", profile)
else:
if node.getDecorator(ProfileOverrideDecorator):
node.removeDecorator(ProfileOverrideDecorator)
@pyqtSlot("quint64", str)
def addSettingOverride(self, object_id, key):
machine = Application.getInstance().getMachineManager().getActiveMachineInstance()
if not machine:
return
node = self._scene.findObject(object_id)
if not node.getDecorator(SettingOverrideDecorator):
node.addDecorator(SettingOverrideDecorator())
node.callDecoration("addSetting", key)
@pyqtSlot("quint64", str)
def removeSettingOverride(self, object_id, key):
node = self._scene.findObject(object_id)
node.callDecoration("removeSetting", key)
if len(node.callDecoration("getAllSettings")) == 0:
node.removeDecorator(SettingOverrideDecorator)
def _updatePositions(self, source):
camera = Application.getInstance().getController().getScene().getActiveCamera()
for node in BreadthFirstIterator(self._root):
if type(node) is not SceneNode or not node.getMeshData():
continue
projected_position = camera.project(node.getWorldPosition())
index = self.find("id", id(node))
self.setProperty(index, "x", float(projected_position[0]))
self.setProperty(index, "y", float(projected_position[1]))
def _updateNodes(self, source):
self.clear()
camera = Application.getInstance().getController().getScene().getActiveCamera()
for node in BreadthFirstIterator(self._root):
if type(node) is not SceneNode or not node.getMeshData() or not node.isSelectable():
continue
projected_position = camera.project(node.getWorldPosition())
node_profile = node.callDecoration("getProfile")
if not node_profile:
node_profile = "global"
else:
node_profile = node_profile.getName()
self.appendItem({
"id": id(node),
"x": float(projected_position[0]),
"y": float(projected_position[1]),
"material": "",
"profile": node_profile,
"settings": SettingOverrideModel.SettingOverrideModel(node)
})

View File

@ -0,0 +1,352 @@
// Copyright (c) 2015 Ultimaker B.V.
// Uranium is released under the terms of the AGPLv3 or higher.
import QtQuick 2.2
import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.2
import QtQuick.Window 2.2
import UM 1.1 as UM
Item {
id: base;
width: 0;
height: 0;
property variant position: mapToItem(null, 0, 0)
property real viewportWidth: UM.Application.mainWindow.width * UM.Application.mainWindow.viewportRect.width;
property real viewportHeight: UM.Application.mainWindow.height * UM.Application.mainWindow.viewportRect.height;
property int currentIndex;
Rectangle {
id: settingsPanel;
z: 3;
width: UM.Theme.sizes.per_object_settings_panel.width;
height: items.height + UM.Theme.sizes.default_margin.height * 2;
opacity: 0;
Behavior on opacity { NumberAnimation { } }
border.width: UM.Theme.sizes.per_object_settings_panel_border.width;
border.color: UM.Theme.colors.per_object_settings_panel_border;
color: UM.Theme.colors.per_object_settings_panel_background;
DropArea {
anchors.fill: parent;
}
Column {
id: items
anchors.top: parent.top;
anchors.topMargin: UM.Theme.sizes.default_margin.height;
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)
}
}
Repeater {
id: settings;
model: UM.ActiveTool.properties.Model.getItem(base.currentIndex).settings
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;
value: model.value;
description: model.description;
unit: model.unit;
valid: model.valid;
perObjectSetting: true
dismissable: true
options: model.options
style: UM.Theme.styles.setting_item;
onItemValueChanged: {
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
{
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;
}
}
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"; }
}
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;
}
style: ButtonStyle
{
background: Rectangle
{
width: control.width;
height: control.height;
color: control.hovered ? UM.Theme.colors.button_active : UM.Theme.colors.button_hover;
}
label: Image {
width: control.width;
height: control.height;
sourceSize.width: width;
sourceSize.height: height;
source: UM.Theme.icons.plus;
}
}
}
}
UM.Dialog {
id: settingPickDialog
title: catalog.i18nc("@title:window", "Pick a Setting to Customize")
TextField {
id: filter;
anchors {
top: parent.top;
left: parent.left;
right: parent.right;
}
placeholderText: catalog.i18nc("@label:textbox", "Filter...");
onTextChanged: settingCategoriesModel.filter(text);
}
ScrollView {
id: view;
anchors {
top: filter.bottom;
left: parent.left;
right: parent.right;
bottom: parent.bottom;
}
Column {
width: view.width - UM.Theme.sizes.default_margin.width * 2;
height: childrenRect.height;
Repeater {
id: settingList;
model: UM.SettingCategoriesModel { id: settingCategoriesModel; }
delegate: Item {
id: delegateItem;
width: parent.width;
height: childrenRect.height;
ToolButton {
id: categoryHeader;
text: model.name;
checkable: true;
width: parent.width;
onCheckedChanged: settingsColumn.state != "" ? settingsColumn.state = "" : settingsColumn.state = "collapsed";
style: ButtonStyle {
background: Rectangle
{
width: control.width;
height: control.height;
color: control.hovered ? palette.highlight : "transparent";
}
label: Row
{
spacing: UM.Theme.sizes.default_margin.width;
Image
{
anchors.verticalCenter: parent.verticalCenter;
source: control.checked ? UM.Theme.icons.arrow_right : UM.Theme.icons.arrow_bottom;
}
Label
{
text: control.text;
font.bold: true;
color: control.hovered ? palette.highlightedText : palette.text;
}
}
}
}
property variant settingsModel: model.settings;
visible: model.visible;
Column {
id: settingsColumn;
anchors.top: categoryHeader.bottom;
property real childrenHeight:
{
var h = 0.0;
for(var i in children)
{
var item = children[i];
h += children[i].height;
if(item.settingVisible)
{
if(i > 0)
{
h += spacing;
}
}
}
return h;
}
width: childrenRect.width;
height: childrenHeight;
Repeater {
model: delegateItem.settingsModel;
delegate: ToolButton {
id: button;
x: model.depth * UM.Theme.sizes.default_margin.width;
text: model.name;
tooltip: model.description;
onClicked: {
var object_id = UM.ActiveTool.properties.Model.getItem(base.currentIndex).id;
UM.ActiveTool.properties.Model.addSettingOverride(object_id, model.key);
settingPickDialog.visible = false;
}
states: State {
name: "filtered"
when: model.filtered || !model.visible || !model.enabled
PropertyChanges { target: button; height: 0; opacity: 0; }
}
}
}
states: State {
name: "collapsed";
PropertyChanges { target: settingsColumn; opacity: 0; height: 0; }
}
}
}
}
}
}
rightButtons: [
Button {
text: catalog.i18nc("@action:button", "Cancel");
onClicked: {
settingPickDialog.visible = false;
}
}
]
}
SystemPalette { id: palette; }
}

View File

@ -0,0 +1,18 @@
# Copyright (c) 2015 Ultimaker B.V.
# Uranium is released under the terms of the AGPLv3 or higher.
from UM.Tool import Tool
from . import PerObjectSettingsModel
class PerObjectSettingsTool(Tool):
def __init__(self):
super().__init__()
self.setExposedProperties("Model")
def event(self, event):
return False
def getModel(self):
return PerObjectSettingsModel.PerObjectSettingsModel()

View File

@ -0,0 +1,102 @@
# Copyright (c) 2015 Ultimaker B.V.
# Uranium is released under the terms of the AGPLv3 or higher.
from PyQt5.QtCore import Qt, pyqtSlot, QUrl
from UM.Application import Application
from UM.Qt.ListModel import ListModel
from UM.Settings.SettingOverrideDecorator import SettingOverrideDecorator
class SettingOverrideModel(ListModel):
KeyRole = Qt.UserRole + 1
LabelRole = Qt.UserRole + 2
DescriptionRole = Qt.UserRole + 3
ValueRole = Qt.UserRole + 4
TypeRole = Qt.UserRole + 5
UnitRole = Qt.UserRole + 6
ValidRole = Qt.UserRole + 7
OptionsRole = Qt.UserRole + 8
WarningDescriptionRole = Qt.UserRole + 9
ErrorDescriptionRole = Qt.UserRole + 10
def __init__(self, node, parent = None):
super().__init__(parent)
self._ignore_setting_change = None
self._node = node
self._node.decoratorsChanged.connect(self._onDecoratorsChanged)
self._onDecoratorsChanged(None)
self.addRoleName(self.KeyRole, "key")
self.addRoleName(self.LabelRole, "label")
self.addRoleName(self.DescriptionRole, "description")
self.addRoleName(self.ValueRole,"value")
self.addRoleName(self.TypeRole, "type")
self.addRoleName(self.UnitRole, "unit")
self.addRoleName(self.ValidRole, "valid")
self.addRoleName(self.OptionsRole, "options")
self.addRoleName(self.WarningDescriptionRole, "warning_description")
self.addRoleName(self.ErrorDescriptionRole, "error_description")
@pyqtSlot(str, "QVariant")
def setSettingValue(self, key, value):
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):
self.clear()
return
self._decorator = self._node.getDecorator(SettingOverrideDecorator)
self._decorator.settingAdded.connect(self._onSettingsChanged)
self._decorator.settingRemoved.connect(self._onSettingsChanged)
self._decorator.settingValueChanged.connect(self._onSettingValueChanged)
self._onSettingsChanged()
def _createOptionsModel(self, options):
if not options:
return None
model = ListModel()
model.addRoleName(Qt.UserRole + 1, "value")
model.addRoleName(Qt.UserRole + 2, "name")
for value, name in options.items():
model.appendItem({"value": str(value), "name": str(name)})
return model
def _onSettingsChanged(self):
self.clear()
items = []
for key, setting in self._decorator.getAllSettings().items():
value = self._decorator.getSettingValue(key)
items.append({
"key": key,
"label": setting.getLabel(),
"description": setting.getDescription(),
"value": str(value),
"type": setting.getType(),
"unit": setting.getUnit(),
"valid": setting.validate(value),
"options": self._createOptionsModel(setting.getOptions()),
"warning_description": setting.getWarningDescription(),
"error_description": setting.getErrorDescription()
})
items.sort(key = lambda i: i["key"])
for item in items:
self.appendItem(item)
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():
self.setProperty(index, "value", str(value))
self.setProperty(index, "valid", setting.validate(value))

View File

@ -0,0 +1,27 @@
# Copyright (c) 2015 Ultimaker B.V.
# Uranium is released under the terms of the AGPLv3 or higher.
from . import PerObjectSettingsTool
from UM.i18n import i18nCatalog
i18n_catalog = i18nCatalog("uranium")
def getMetaData():
return {
"plugin": {
"name": i18n_catalog.i18nc("@label", "Per Object Settings Tool"),
"author": "Ultimaker",
"version": "1.0",
"description": i18n_catalog.i18nc("@info:whatsthis", "Provides the Per Object Settings."),
"api": 2
},
"tool": {
"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"
},
}
def register(app):
return { "tool": PerObjectSettingsTool.PerObjectSettingsTool() }

View File

@ -22,18 +22,18 @@ class RemovableDriveOutputDevice(OutputDevice):
self.setIconName("save_sd")
self.setPriority(1)
def requestWrite(self, node):
def requestWrite(self, node, file_name = None):
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())
raise OutputDeviceError.WriteRequestFailedError()
file_name = None
for n in BreadthFirstIterator(node):
if n.getMeshData():
file_name = n.getName()
if file_name:
break
if file_name == None:
for n in BreadthFirstIterator(node):
if n.getMeshData():
file_name = n.getName()
if file_name:
break
if not file_name:
Logger.log("e", "Could not determine a proper file name when trying to write to %s, aborting", self.getName())

View File

@ -37,7 +37,11 @@ class RemovableDrivePlugin(OutputDevicePlugin):
raise NotImplementedError()
def ejectDevice(self, device):
result = self.performEjectDevice(device)
try:
result = self.performEjectDevice(device)
except Exception as e:
result = False
if result:
message = Message(catalog.i18nc("@info:status", "Ejected {0}. You can now safely remove the drive.").format(device.getName()))
message.show()

View File

@ -88,13 +88,10 @@ class WindowsRemovableDrivePlugin(RemovableDrivePlugin.RemovableDrivePlugin):
result = None
# Then, try and tell it to eject
try:
if not windll.kernel32.DeviceIoControl(handle, IOCTL_STORAGE_EJECT_MEDIA, None, None, None, None, None, None):
result = False
else:
result = True
except Exception as e:
if not windll.kernel32.DeviceIoControl(handle, IOCTL_STORAGE_EJECT_MEDIA, None, None, None, None, None, None):
result = False
else:
result = True
# Finally, close the handle
windll.kernel32.CloseHandle(handle)

View File

@ -46,6 +46,7 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
self._end_stop_thread = threading.Thread(target = self._pollEndStop)
self._end_stop_thread.deamon = True
self._poll_endstop = -1
# Printer is connected
self._is_connected = False
@ -63,7 +64,7 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
self._listen_thread.daemon = True
self._update_firmware_thread = threading.Thread(target= self._updateFirmware)
self._update_firmware_thread.deamon = True
self._update_firmware_thread.daemon = True
self._heatup_wait_start_time = time.time()
@ -122,6 +123,7 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
progressChanged = pyqtSignal()
extruderTemperatureChanged = pyqtSignal()
bedTemperatureChanged = pyqtSignal()
firmwareUpdateComplete = pyqtSignal()
endstopStateChanged = pyqtSignal(str ,bool, arguments = ["key","state"])
@ -237,8 +239,9 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
@pyqtSlot()
def startPollEndstop(self):
self._poll_endstop = True
self._end_stop_thread.start()
if self._poll_endstop == -1:
self._poll_endstop = True
self._end_stop_thread.start()
@pyqtSlot()
def stopPollEndstop(self):
@ -323,6 +326,7 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
## Close the printer connection
def close(self):
Logger.log("d", "Closing the printer connection.")
if self._connect_thread.isAlive():
try:
self._connect_thread.join()
@ -345,7 +349,7 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
self._serial = None
def isConnected(self):
return self._is_connected
return self._is_connected
@pyqtSlot(int)
def heatupNozzle(self, temperature):
@ -411,6 +415,7 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
def createControlInterface(self):
if self._control_view is None:
Logger.log("d", "Creating control interface for printer connection")
path = QUrl.fromLocalFile(os.path.join(PluginRegistry.getInstance().getPluginPath("USBPrinting"), "ControlWindow.qml"))
component = QQmlComponent(Application.getInstance()._engine, path)
self._control_context = QQmlContext(Application.getInstance()._engine.rootContext())
@ -455,7 +460,7 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
self._bed_temperature = temperature
self.bedTemperatureChanged.emit()
def requestWrite(self, node):
def requestWrite(self, node, file_name = None):
self.showControlInterface()
def _setEndstopState(self, endstop_key, value):
@ -617,6 +622,6 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
def _onFirmwareUpdateComplete(self):
self._update_firmware_thread.join()
self._update_firmware_thread = threading.Thread(target= self._updateFirmware)
self._update_firmware_thread.deamon = True
self._update_firmware_thread.daemon = True
self.connect()

View File

@ -54,6 +54,15 @@ class USBPrinterManager(QObject, SignalEmitter, OutputDevicePlugin, Extension):
addConnectionSignal = Signal()
printerConnectionStateChanged = pyqtSignal()
progressChanged = pyqtSignal()
@pyqtProperty(float, notify = progressChanged)
def progress(self):
progress = 0
for name, connection in self._printer_connections.items():
progress += connection.progress
return progress / len(self._printer_connections)
def start(self):
self._check_updates = True
self._update_thread.start()
@ -84,12 +93,14 @@ class USBPrinterManager(QObject, SignalEmitter, OutputDevicePlugin, Extension):
self._firmware_view.show()
@pyqtSlot()
def updateAllFirmware(self):
self.spawnFirmwareInterface("")
for printer_connection in self._printer_connections:
try:
self._printer_connections[printer_connection].updateFirmware(Resources.getPath(CuraApplication.ResourceTypes.Firmware, self._getDefaultFirmwareName()))
except FileNotFoundError:
Logger.log("w", "No firmware found for printer %s", printer_connection)
continue
@pyqtSlot(str, result = bool)
@ -153,6 +164,7 @@ class USBPrinterManager(QObject, SignalEmitter, OutputDevicePlugin, Extension):
connection = PrinterConnection.PrinterConnection(serial_port)
connection.connect()
connection.connectionStateChanged.connect(self._onPrinterConnectionStateChanged)
connection.progressChanged.connect(self.progressChanged)
self._printer_connections[serial_port] = connection
def _onPrinterConnectionStateChanged(self, serial_port):
@ -196,4 +208,4 @@ class USBPrinterManager(QObject, SignalEmitter, OutputDevicePlugin, Extension):
base_list = base_list + glob.glob("/dev/ttyUSB*") + glob.glob("/dev/ttyACM*") + glob.glob("/dev/cu.*") + glob.glob("/dev/tty.usb*") + glob.glob("/dev/rfcomm*") + glob.glob("/dev/serial/by-id/*")
return list(base_list)
_instance = None
_instance = None

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -2,7 +2,7 @@
"id": "rigidbotbig",
"version": 1,
"name": "RigidBot",
"manufacturer": "Invent-A-Part",
"manufacturer": "Other",
"author": "RBC",
"platform": "rigidbot_platform.stl",
@ -18,6 +18,8 @@
"machine_nozzle_size": { "default": 0.4,
"visible": true
},
"machine_nozzle_heat_up_speed": { "default": 2.0 },
"machine_nozzle_cool_down_speed": { "default": 2.0 },
"machine_head_shape_min_x": { "default": 0 },
"machine_head_shape_min_y": { "default": 0 },
"machine_head_shape_max_x": { "default": 0 },

View File

@ -2,7 +2,7 @@
"id": "rigidbotbig",
"version": 1,
"name": "RigidBotBig",
"manufacturer": "Invent-A-Part",
"manufacturer": "Other",
"author": "RBC",
"platform": "rigidbotbig_platform.stl",
@ -16,6 +16,8 @@
"machine_heated_bed": { "default": true },
"machine_nozzle_size": { "default": 0.4},
"machine_nozzle_heat_up_speed": { "default": 2.0 },
"machine_nozzle_cool_down_speed": { "default": 2.0 },
"machine_head_shape_min_x": { "default": 0 },
"machine_head_shape_min_y": { "default": 0 },
"machine_head_shape_max_x": { "default": 0 },

View File

@ -2,7 +2,7 @@
"id": "bq_hephestos",
"version": 1,
"name": "BQ Prusa i3 Hephestos",
"manufacturer": "BQ",
"manufacturer": "Other",
"author": "BQ",
"platform": "hephestos_platform.stl",
"inherits": "fdmprinter.json",

View File

@ -0,0 +1,71 @@
{
"id": "bq_hephestos_2",
"version": 1,
"name": "BQ Hephestos 2",
"manufacturer": "Other",
"author": "BQ",
"platform": "bq_hephestos_2.stl",
"inherits": "fdmprinter.json",
"machine_settings": {
"machine_start_gcode": {
"default": "; -- START GCODE --\nM800 ; Custom GCODE to fire start print procedure\n; -- end of START GCODE --"
},
"machine_end_gcode": {
"default": "; -- END GCODE --\nM801 ; Custom GCODE to fire end print procedure\n; -- end of END GCODE --"
},
"machine_width": {
"default": 210
},
"machine_depth": {
"default": 297
},
"machine_height": {
"default": 220
},
"machine_heated_bed": {
"default": false
},
"machine_center_is_zero": {
"default": false
},
"machine_gcode_flavor": {
"default": "RepRap"
},
"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 },
"shell_thickness": { "default": 1.2 },
"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 },
"skirt_speed": { "default": 35.0, "visible": false },
"skirt_minimal_length": { "default": 30.0, "visible": false }
}
}

View File

@ -2,7 +2,7 @@
"id": "bq_hephestos_xl",
"version": 1,
"name": "BQ Prusa i3 Hephestos XL",
"manufacturer": "BQ",
"manufacturer": "Other",
"author": "BQ",
"platform": "hephestos_platform.stl",
"inherits": "fdmprinter.json",

View File

@ -2,7 +2,7 @@
"id": "bq_witbox",
"version": 1,
"name": "BQ Witbox",
"manufacturer": "BQ",
"manufacturer": "Other",
"author": "BQ",
"platform": "witbox_platform.stl",
"inherits": "fdmprinter.json",

View File

@ -0,0 +1,71 @@
{
"id": "bq_witbox_2",
"version": 1,
"name": "BQ Witbox 2",
"manufacturer": "Other",
"author": "BQ",
"platform": "witbox_platform.stl",
"inherits": "fdmprinter.json",
"machine_settings": {
"machine_start_gcode": {
"default": "; -- START GCODE --\nM800 ; Custom GCODE to fire start print procedure\n; -- end of START GCODE --"
},
"machine_end_gcode": {
"default": "; -- END GCODE --\nM801 ; Custom GCODE to fire end print procedure\n; -- end of END GCODE --"
},
"machine_width": {
"default": 297
},
"machine_depth": {
"default": 210
},
"machine_height": {
"default": 200
},
"machine_heated_bed": {
"default": false
},
"machine_center_is_zero": {
"default": false
},
"machine_gcode_flavor": {
"default": "RepRap"
},
"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 },
"shell_thickness": { "default": 1.2 },
"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 },
"skirt_speed": { "default": 35.0, "visible": false },
"skirt_minimal_length": { "default": 30.0, "visible": false }
}
}

View File

@ -0,0 +1,240 @@
{
"version": 1,
"id": "dual_extrusion",
"name": "Dual Extrusion Base File",
"inherits": "fdmprinter.json",
"visible": false,
"machine_settings": {
"machine_use_extruder_offset_to_offset_coords": { "default": false },
"machine_nozzle_offset_x": { "default": 0, "SEE_machine_extruder_trains": true },
"machine_nozzle_offset_y": { "default": 0, "SEE_machine_extruder_trains": true },
"machine_extruder_start_code": { "default": "", "SEE_machine_extruder_trains": true },
"machine_extruder_start_pos_abs": { "default": false, "SEE_machine_extruder_trains": true },
"machine_extruder_start_pos_x": { "default": 0, "SEE_machine_extruder_trains": true },
"machine_extruder_start_pos_y": { "default": 0, "SEE_machine_extruder_trains": true },
"machine_extruder_end_pos_abs": { "default": false, "SEE_machine_extruder_trains": true },
"machine_extruder_end_pos_x": { "default": 0, "SEE_machine_extruder_trains": true },
"machine_extruder_end_pos_y": { "default": 0, "SEE_machine_extruder_trains": true },
"machine_extruder_end_code": { "default": "", "SEE_machine_extruder_trains": true }
},
"overrides": {
"speed_print": {
"children": {
"speed_prime_tower": {
"label": "Prime Tower Speed",
"description": "The speed at which the prime tower is printed. Printing the prime tower slower can make it more stable when the adhesion between the different filaments is suboptimal.",
"unit": "mm/s",
"type": "float",
"min_value": "0.1",
"max_value_warning": "150",
"default": 50,
"visible": false,
"enabled": "prime_tower_enable"
}
}
},
"line_width": {
"children": {
"prime_tower_line_width": {
"label": "Prime Tower Line Width",
"description": "Width of a single prime tower line.",
"unit": "mm",
"min_value": "0.0001",
"min_value_warning": "0.2",
"max_value_warning": "5",
"default": 0.4,
"type": "float",
"visible": false,
"enabled": "prime_tower_enable"
}
}
}
},
"categories": {
"dual": {
"label": "Dual Extrusion",
"visible": true,
"icon": "category_dual",
"settings": {
"extruder_nr": {
"label": "Extruder",
"description": "The extruder train used for printing. This is used in multi-extrusion.",
"type": "int",
"default": 0,
"min_value": "0",
"max_value": "16",
"always_visible": true,
"children": {
"adhesion_extruder_nr": {
"label": "Platform Adhesion Extruder",
"description": "The extruder train to use for printing the skirt/brim/raft. This is used in multi-extrusion.",
"type": "int",
"default": 0,
"min_value": "0",
"max_value": "16"
},
"support_extruder_nr": {
"label": "Support Extruder",
"description": "The extruder train to use for printing the support. This is used in multi-extrusion.",
"type": "int",
"default": 0,
"min_value": "0",
"max_value": "16",
"children": {
"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.",
"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.",
"type": "int",
"default": 0,
"min_value": "0",
"max_value": "16",
"enabled": "support_roof_enable"
}
}
}
}
},
"prime_tower_enable": {
"label": "Enable Prime Tower",
"description": "Print a tower next to the print which serves to prime the material after each nozzle switch.",
"type": "boolean",
"default": false
},
"prime_tower_size": {
"label": "Prime Tower Size",
"description": "The width of the prime tower.",
"visible": false,
"type": "float",
"unit": "mm",
"default": 15,
"min_value": "0",
"max_value_warning": "20",
"inherit_function": "0 if prime_tower_enable else 15",
"enabled": "prime_tower_enable"
},
"prime_tower_position_x": {
"label": "Prime Tower X Position",
"description": "The x position of the prime tower.",
"visible": false,
"type": "float",
"unit": "mm",
"default": 200,
"enabled": "prime_tower_enable"
},
"prime_tower_position_y": {
"label": "Prime Tower Y Position",
"description": "The y position of the prime tower.",
"visible": false,
"type": "float",
"unit": "mm",
"default": 200,
"enabled": "prime_tower_enable"
},
"prime_tower_flow": {
"label": "Prime Tower Flow",
"description": "Flow compensation: the amount of material extruded is multiplied by this value.",
"visible": false,
"unit": "%",
"default": 100,
"type": "float",
"min_value": "5",
"min_value_warning": "50",
"max_value_warning": "150",
"enabled": "prime_tower_enable"
},
"prime_tower_wipe_enabled": {
"label": "Wipe Nozzle on Prime tower",
"description": "After printing the prime tower with the one nozzle, wipe the oozed material from the other nozzle off on the prime tower.",
"type": "boolean",
"default": false,
"enabled": "prime_tower_enable"
},
"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.",
"type": "boolean",
"default": false
},
"ooze_shield_angle": {
"label": "Ooze Shield Angle",
"description": "The maximum angle a part in the ooze shield will have. With 0 degrees being vertical, and 90 degrees being horizontal. A smaller angle leads to less failed ooze shields, but more material.",
"unit": "°",
"type": "float",
"min_value": "0",
"max_value": "90",
"default": 60,
"visible": false,
"enabled": "ooze_shield_enabled"
},
"ooze_shield_dist": {
"label": "Ooze Shields Distance",
"description": "Distance of the ooze shield from the print, in the X/Y directions.",
"unit": "mm",
"type": "float",
"min_value": "0",
"max_value_warning": "30",
"default": 2,
"visible": false,
"enabled": "ooze_shield_enabled"
}
}
},
"material": {
"settings": {
"switch_extruder_retraction_amount": {
"label": "Nozzle Switch Retraction Distance",
"description": "The amount of retraction: Set at 0 for no retraction at all. This should generally be the same as the length of the heat zone.",
"unit": "mm",
"type": "float",
"default": 16,
"visible": false,
"inherit_function": "machine_heat_zone_length",
"enabled": "retraction_enable"
},
"switch_extruder_retraction_speeds": {
"label": "Nozzle Switch Retraction Speed",
"description": "The speed at which the filament is retracted. A higher retraction speed works better, but a very high retraction speed can lead to filament grinding.",
"unit": "mm/s",
"type": "float",
"default": 20,
"visible": false,
"inherit": false,
"enabled": "retraction_enable",
"children": {
"switch_extruder_retraction_speed": {
"label": "Nozzle Switch Retract Speed",
"description": "The speed at which the filament is retracted during a nozzle switch retract. ",
"unit": "mm/s",
"type": "float",
"default": 20,
"visible": false,
"enabled": "retraction_enable"
},
"switch_extruder_prime_speed": {
"label": "Nozzle Switch Prime Speed",
"description": "The speed at which the filament is pushed back after a nozzle switch retraction.",
"unit": "mm/s",
"type": "float",
"default": 20,
"visible": false,
"enabled": "retraction_enable"
}
}
}
}
}
}
}

View File

@ -38,6 +38,8 @@
"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_gcode_flavor": {
"default": "RepRap"
},
@ -149,7 +151,6 @@
"default": 0.4,
"type": "float",
"visible": false,
"inherit_function": "max(machine_nozzle_size, (wall_thickness / (int(wall_thickness / (machine_nozzle_size - 0.0001) + 1))) if (wall_thickness / (int(wall_thickness / (machine_nozzle_size - 0.0001))) > machine_nozzle_size * 1.5) else (wall_thickness / int(wall_thickness / (machine_nozzle_size - 0.0001))))",
"children": {
"wall_line_width_0": {
"label": "Outer Wall Line Width",
@ -266,7 +267,7 @@
"default": 2,
"type": "int",
"visible": false,
"inherit_function": "max(1, (int(parent_value / (machine_nozzle_size - 0.0001) + 1) if (parent_value / max(1, int(parent_value / (machine_nozzle_size - 0.0001))) > machine_nozzle_size) * 1.5 else int(parent_value / (machine_nozzle_size - 0.0001))))"
"inherit_function": "max(1, round((wall_thickness - wall_line_width_0) / wall_line_width_x) + 1)"
}
}
},
@ -275,7 +276,8 @@
"description": "Make an extra wall at every second layer, so that infill will be caught between an extra wall above and one below. This results in a better cohesion between infill and walls, but might have an impact on the surface quality.",
"type": "boolean",
"default": false,
"visible": false
"visible": false,
"inherit": false
},
"top_bottom_thickness": {
"label": "Bottom/Top Thickness",
@ -301,7 +303,7 @@
"label": "Top Layers",
"description": "This controls the amount of top layers.",
"min_value": "0",
"default": 6,
"default": 8,
"type": "int",
"visible": false,
"inherit_function": "0 if infill_sparse_density == 100 else math.ceil(parent_value / layer_height)"
@ -408,8 +410,7 @@
"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.",
"default": 0,
"type": "int",
"visible": false,
"enabled": "top_bottom_pattern"
"visible": false
},
"xy_offset": {
"label": "Horizontal expansion",
@ -454,7 +455,7 @@
"type": "float",
"default": 2,
"visible": false,
"inherit_function": "0 if parent_value == 0 else (infill_line_width * 100) / parent_value"
"inherit_function": "0 if infill_sparse_density == 0 else (infill_line_width * 100) / infill_sparse_density"
}
}
},
@ -470,7 +471,7 @@
"zigzag": "Zig Zag"
},
"default": "grid",
"inherit_function": "'lines' if parent_value > 25 else 'grid'"
"inherit_function": "'lines' if infill_sparse_density > 25 else 'grid'"
},
"infill_overlap": {
"label": "Infill Overlap",
@ -498,16 +499,7 @@
"type": "float",
"default": 0.1,
"visible": false,
"children": {
"infill_sparse_combine": {
"label": "Infill Layers",
"description": "Amount of layers that are combined together to form sparse infill.",
"type": "int",
"default": 1,
"visible": false,
"inherit_function": "math.floor((parent_value + 0.001) / layer_height)"
}
}
"inherit_function": "layer_height"
},
"infill_before_walls": {
"label": "Infill Before Walls",
@ -523,6 +515,13 @@
"visible": true,
"icon": "category_material",
"settings": {
"material_flow_dependent_temperature": {
"label": "Auto Temperature",
"description": "Change the temperature each layer automatically with the average flow speed of that layer.",
"type": "boolean",
"default": true,
"visible": true
},
"material_print_temperature": {
"label": "Printing Temperature",
"description": "The temperature used for printing. Set at 0 to pre-heat yourself. For PLA a value of 210C is usually used.\nFor ABS a value of 230C or higher is required.",
@ -530,8 +529,35 @@
"type": "float",
"default": 210,
"min_value": "0",
"max_value_warning": "260",
"enabled": "not (material_flow_dependent_temperature)"
},
"material_flow_temp_graph": {
"label": "Flow Temperature Graph",
"description": "Data linking material flow (in mm³/s) to temperature (°C).",
"unit": "",
"type": "string",
"default": "[[0.1,180],[20,230]]",
"enabled": "material_flow_dependent_temperature"
},
"material_standby_temperature": {
"label": "Standby Temperature",
"description": "The temperature of the nozzle when another nozzle is currently used for printing.",
"unit": "°C",
"type": "float",
"default": 150,
"min_value": "0",
"max_value_warning": "260"
},
"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.",
"unit": "°C/s",
"type": "float",
"default": 0.5,
"min_value": "0",
"max_value_warning": "10.0"
},
"material_bed_temperature": {
"label": "Bed Temperature",
"description": "The temperature used for the heated printer bed. Set at 0 to pre-heat it yourself.",
@ -777,18 +803,17 @@
"type": "float",
"min_value": "0.1",
"default": 15,
"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.",
"unit": "mm/s",
"type": "float",
"min_value": "0.1",
"default": 15,
"visible": false,
"children": {
"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.",
"unit": "mm/s",
"type": "float",
"min_value": "0.1",
"default": 15,
"visible": false
}
}
"inherit_function": "speed_layer_0"
},
"speed_slowdown_layers": {
"label": "Amount of Slower Layers",
@ -1340,7 +1365,7 @@
},
"skirt_line_count": {
"label": "Skirt Line Count",
"description": "The skirt is a line drawn around the first layer of the. 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": "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.",
"type": "int",
"default": 1,
"enabled": "adhesion_type == \"skirt\""
@ -1381,35 +1406,35 @@
"description": "The gap between the final raft layer and the first layer of the object. Only the first layer is raised by this amount to lower the bonding between the raft layer and the object. Makes it easier to peel off the raft.",
"unit": "mm",
"type": "float",
"default": 0.22,
"default": 0.35,
"enabled": "adhesion_type == \"raft\""
},
"raft_surface_layers": {
"label": "Raft Surface Layers",
"description": "The number of surface layers on top of the 2nd raft layer. These are fully filled layers that the object sits on. 2 layers usually works fine.",
"label": "Raft Top Layers",
"description": "The number of top layers on top of the 2nd raft layer. These are fully filled layers that the object sits on. 2 layers result in a smoother top surface than 1.",
"type": "int",
"default": 2,
"enabled": "adhesion_type == \"raft\""
},
"raft_surface_thickness": {
"label": "Raft Surface Thickness",
"description": "Layer thickness of the surface raft layers.",
"label": "Raft Top Layer Thickness",
"description": "Layer thickness of the top raft layers.",
"unit": "mm",
"type": "float",
"default": 0.1,
"enabled": "adhesion_type == \"raft\""
},
"raft_surface_line_width": {
"label": "Raft Surface Line Width",
"description": "Width of the lines in the surface raft layers. These can be thin lines so that the top of the raft becomes smooth.",
"label": "Raft Top Line Width",
"description": "Width of the lines in the top surface of the raft. These can be thin lines so that the top of the raft becomes smooth.",
"unit": "mm",
"type": "float",
"default": 0.3,
"enabled": "adhesion_type == \"raft\""
},
"raft_surface_line_spacing": {
"label": "Raft Surface Spacing",
"description": "The distance between the raft lines for the surface raft layers. The spacing of the interface should be equal to the line width, so that the surface is solid.",
"label": "Raft Top Spacing",
"description": "The distance between the raft lines for the top raft layers. The spacing should be equal to the line width, so that the surface is solid.",
"unit": "mm",
"type": "float",
"default": 0.3,
@ -1417,27 +1442,27 @@
"inherit_function": "raft_surface_line_width"
},
"raft_interface_thickness": {
"label": "Raft Interface Thickness",
"description": "Layer thickness of the interface raft layer.",
"label": "Raft Middle Thickness",
"description": "Layer thickness of the middle raft layer.",
"unit": "mm",
"type": "float",
"default": 0.27,
"enabled": "adhesion_type == \"raft\""
},
"raft_interface_line_width": {
"label": "Raft Interface Line Width",
"description": "Width of the lines in the interface raft layer. Making the second layer extrude more causes the lines to stick to the bed.",
"label": "Raft Middle Line Width",
"description": "Width of the lines in the middle raft layer. Making the second layer extrude more causes the lines to stick to the bed.",
"unit": "mm",
"type": "float",
"default": 1,
"enabled": "adhesion_type == \"raft\""
},
"raft_interface_line_spacing": {
"label": "Raft Interface Spacing",
"description": "The distance between the raft lines for the interface raft layer. The spacing of the interface should be quite wide, while being dense enough to support the surface raft layers.",
"label": "Raft Middle Spacing",
"description": "The distance between the raft lines for the middle raft layer. The spacing of the middle should be quite wide, while being dense enough to support the top raft layers.",
"unit": "mm",
"type": "float",
"default": 2,
"default": 1.0,
"enabled": "adhesion_type == \"raft\""
},
"raft_base_thickness": {
@ -1461,7 +1486,7 @@
"description": "The distance between the raft lines for the base raft layer. Wide spacing makes for easy removal of the raft from the build plate.",
"unit": "mm",
"type": "float",
"default": 5,
"default": 3.0,
"enabled": "adhesion_type == \"raft\""
},
"raft_speed": {

View File

@ -3,7 +3,7 @@
"version": 1,
"name": "German RepRap Neo",
"manufacturer": "Other",
"author": "other",
"author": "Other",
"icon": "icon_ultimaker.png",
"platform": "grr_neo_platform.stl",
@ -16,6 +16,8 @@
"machine_depth": { "default": 150 },
"machine_center_is_zero": { "default": false },
"machine_nozzle_size": { "default": 0.5 },
"machine_nozzle_heat_up_speed": { "default": 2.0 },
"machine_nozzle_cool_down_speed": { "default": 2.0 },
"machine_head_shape_min_x": { "default": 75 },
"machine_head_shape_min_y": { "default": 18 },
"machine_head_shape_max_x": { "default": 18 },

View File

@ -17,6 +17,8 @@
"machine_center_is_zero": { "default": false },
"machine_nozzle_size": { "default": 0.4 },
"machine_nozzle_heat_up_speed": { "default": 2.0 },
"machine_nozzle_cool_down_speed": { "default": 2.0 },
"machine_head_shape_min_x": { "default": 0 },
"machine_head_shape_min_y": { "default": 0 },
"machine_head_shape_max_x": { "default": 0 },

View File

@ -2,19 +2,22 @@
"id": "prusa_i3",
"version": 1,
"name": "Prusa i3",
"manufacturer": "Prusa",
"author": "other",
"manufacturer": "Other",
"author": "Other",
"icon": "icon_ultimaker2.png",
"platform": "prusai3_platform.stl",
"inherits": "fdmprinter.json",
"machine_settings": {
"machine_heated_bed": { "default": true },
"machine_width": { "default": 200 },
"machine_height": { "default": 200 },
"machine_depth": { "default": 200 },
"machine_center_is_zero": { "default": false },
"machine_nozzle_size": { "default": 0.4 },
"machine_nozzle_heat_up_speed": { "default": 2.0 },
"machine_nozzle_cool_down_speed": { "default": 2.0 },
"machine_head_shape_min_x": { "default": 75 },
"machine_head_shape_min_y": { "default": 18 },
"machine_head_shape_max_x": { "default": 18 },
@ -28,9 +31,5 @@
"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": true }
}
}

View File

@ -16,6 +16,12 @@
"machine_nozzle_size": {
"default": 0.4
},
"machine_nozzle_heat_up_speed": {
"default": 2.0
},
"machine_nozzle_cool_down_speed": {
"default": 2.0
},
"machine_nozzle_tip_outer_diameter": {
"default": 1
},
@ -43,24 +49,26 @@
"default": [
[
-40,
30
10
],
[
-40,
-10
-30
],
[
60,
-10
10
],
[
60,
30
-30
]
]
},
"machine_center_is_zero": { "default": false },
"machine_nozzle_size": { "default": 0.4 },
"machine_nozzle_heat_up_speed": { "default": 2.0 },
"machine_nozzle_cool_down_speed": { "default": 2.0 },
"gantry_height": { "default": 55 },
"machine_use_extruder_offset_to_offset_coords": { "default": true },
"machine_gcode_flavor": { "default": "UltiGCode" },

View File

@ -21,6 +21,12 @@
"machine_nozzle_size": {
"default": 0.4
},
"machine_nozzle_heat_up_speed": {
"default": 2.0
},
"machine_nozzle_cool_down_speed": {
"default": 2.0
},
"machine_nozzle_tip_outer_diameter": {
"default": 1
},
@ -41,6 +47,8 @@
"machine_depth": { "default": 205 },
"machine_center_is_zero": { "default": false },
"machine_nozzle_size": { "default": 0.4 },
"machine_nozzle_heat_up_speed": { "default": 2.0 },
"machine_nozzle_cool_down_speed": { "default": 2.0 },
"machine_head_with_fans_polygon":
{
"default": [
@ -71,10 +79,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 }
"machine_extruder_drive_upgrade": { "default": false }
}
}

Binary file not shown.

Binary file not shown.

View File

@ -3,4 +3,4 @@ version = 1
name = High Quality
[settings]
layer_height = 0.06
layer_height = 0.08

View File

@ -0,0 +1,6 @@
[general]
version = 1
name = Low Quality
[settings]
layer_height = 0.15

View File

@ -0,0 +1,6 @@
[general]
version = 1
name = Ulti Quality
[settings]
layer_height = 0.06

View File

@ -47,7 +47,6 @@ Item
Action
{
id:toggleFullScreenAction
shortcut: StandardKey.FullScreen;
text: catalog.i18nc("@action:inmenu","Toggle Fu&ll Screen");
iconName: "view-fullscreen";
}
@ -137,7 +136,6 @@ Item
id: deleteObjectAction;
text: catalog.i18nc("@action:inmenu","Delete Object");
iconName: "edit-delete";
shortcut: StandardKey.Backspace;
}
Action
@ -182,6 +180,7 @@ Item
id: deleteAllAction;
text: catalog.i18nc("@action:inmenu","&Clear Build Platform");
iconName: "edit-delete";
shortcut: "Ctrl+D";
}
Action
@ -216,5 +215,6 @@ Item
id: showEngineLogAction;
text: catalog.i18nc("@action:inmenu","Show Engine &Log...");
iconName: "view-list-text";
shortcut: StandardKey.WhatsThis;
}
}

View File

@ -22,6 +22,19 @@ UM.MainWindow
id: backgroundItem;
anchors.fill: parent;
UM.I18nCatalog{id: catalog; name:"cura"}
//DeleteSelection on the keypress backspace event
Keys.onPressed: {
if (event.key == Qt.Key_Backspace)
{
if(objectContextMenu.objectId != 0)
{
Printer.deleteObject(objectContextMenu.objectId);
}
}
}
UM.ApplicationMenu
{
id: menu
@ -72,7 +85,7 @@ UM.MainWindow
text: catalog.i18nc("@action:inmenu", "&Save Selection to File");
enabled: UM.Selection.hasSelection;
iconName: "document-save-as";
onTriggered: UM.OutputDeviceManager.requestWriteSelectionToDevice("local_file");
onTriggered: UM.OutputDeviceManager.requestWriteSelectionToDevice("local_file", Printer.jobName);
}
Menu
{
@ -88,7 +101,7 @@ UM.MainWindow
MenuItem
{
text: model.description;
onTriggered: UM.OutputDeviceManager.requestWriteToDevice(model.id);
onTriggered: UM.OutputDeviceManager.requestWriteToDevice(model.id, Printer.jobName);
}
onObjectAdded: saveAllMenu.insertItem(index, object)
onObjectRemoved: saveAllMenu.removeItem(object)
@ -139,10 +152,6 @@ UM.MainWindow
onObjectRemoved: top_view_menu.removeItem(object)
}
ExclusiveGroup { id: view_menu_top_group; }
MenuSeparator { }
MenuItem { action: actions.toggleFullScreen; }
}
Menu
{
@ -373,6 +382,7 @@ UM.MainWindow
{
id: viewModeButton
property bool verticalTooltip: true
anchors
{
top: parent.top;
@ -389,12 +399,13 @@ UM.MainWindow
id: viewMenu;
Instantiator
{
id: viewMenuInstantiator
model: UM.ViewModel { }
MenuItem
{
text: model.name;
text: model.name
checkable: true;
checked: model.active;
checked: model.active
exclusiveGroup: viewMenuGroup;
onTriggered: UM.Controller.setActiveView(model.id);
}
@ -413,7 +424,7 @@ UM.MainWindow
anchors {
left: parent.left
top: parent.top
topMargin: 74
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;
@ -463,14 +474,27 @@ UM.MainWindow
{
//; Remove & re-add the general page as we want to use our own instead of uranium standard.
removePage(0);
insertPage(0, catalog.i18nc("@title:tab","General") , "" , Qt.resolvedUrl("./GeneralPage.qml"));
insertPage(0, catalog.i18nc("@title:tab","General"), generalPage);
//: View preferences page title
insertPage(1, catalog.i18nc("@title:tab","View"), "view-preview", Qt.resolvedUrl("./ViewPage.qml"));
insertPage(1, catalog.i18nc("@title:tab","View"), viewPage);
//Force refresh
setPage(0)
}
Item {
visible: false
GeneralPage
{
id: generalPage
}
ViewPage
{
id: viewPage
}
}
}
Actions
@ -543,8 +567,8 @@ UM.MainWindow
addMachine.onTriggered: addMachineWizard.visible = true;
preferences.onTriggered: preferences.visible = true;
configureMachines.onTriggered: { preferences.visible = true; preferences.setPage(2); }
preferences.onTriggered: { preferences.visible = true; }
configureMachines.onTriggered: { preferences.visible = true; preferences.setPage(3); }
manageProfiles.onTriggered: { preferences.visible = true; preferences.setPage(4); }
documentation.onTriggered: CuraActions.openDocumentation();
@ -621,6 +645,11 @@ UM.MainWindow
onAccepted:
{
//Because several implementations of the file dialog only update the folder
//when it is explicitly set.
var f = folder;
folder = f;
UM.MeshFileHandler.readLocalFile(fileUrl)
openDialog.sendMeshName(fileUrl.toString())
}
@ -648,14 +677,34 @@ UM.MainWindow
onRequestAddPrinter:
{
addMachineWizard.visible = true
addMachineWizard.firstRun = true
addMachineWizard.firstRun = false
}
}
Component.onCompleted:
{
UM.Theme.load(UM.Resources.getPath(UM.Resources.Themes, "cura"))
base.visible = true;
}
Timer
{
id: startupTimer;
interval: 100;
repeat: false;
running: true;
onTriggered:
{
if(!base.visible)
{
base.visible = true;
restart();
}
else if(UM.MachineManager.activeMachineInstance == "")
{
addMachineWizard.firstRun = true;
addMachineWizard.open();
}
}
}
}

View File

@ -8,69 +8,68 @@ import QtQuick.Layouts 1.1
import UM 1.1 as UM
Column{
Item{
id: base;
UM.I18nCatalog { id: catalog; name:"cura"}
property int totalHeightProfileSetup: childrenRect.height
property Action manageProfilesAction
spacing: 0
Rectangle{
id: variantItem;
height: UM.Theme.sizes.sidebar_setup.height
Rectangle {
id: variantRow
anchors.top: base.top
width: base.width
visible: UM.MachineManager.hasVariants;
height: UM.Theme.sizes.sidebar_setup.height
//visible: UM.MachineManager.hasVariants;
visible: true
Rectangle {
id: variantRow
width: base.width
height: parent.heigth
Label{
id: variantLabel
text: catalog.i18nc("@label","Variant:");
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;
}
Label{
id: variantLabel
text: catalog.i18nc("@label","Variant:");
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;
}
ToolButton {
id: variantSelection
text: UM.MachineManager.activeMachineVariant
width: parent.width/100*55
height: UM.Theme.sizes.setting_control.height
tooltip: UM.MachineManager.activeMachineInstance;
anchors.right: parent.right
anchors.rightMargin: UM.Theme.sizes.default_margin.width
anchors.verticalCenter: parent.verticalCenter
style: UM.Theme.styles.sidebar_header_button
ToolButton {
id: variantSelection
text: UM.MachineManager.activeMachineVariant
width: parent.width/100*55
height: UM.Theme.sizes.setting_control.height
tooltip: UM.MachineManager.activeMachineInstance;
anchors.right: parent.right
anchors.rightMargin: UM.Theme.sizes.default_margin.width
anchors.verticalCenter: parent.verticalCenter
style: UM.Theme.styles.sidebar_header_button
menu: Menu
menu: Menu
{
id: variantsSelectionMenu
Instantiator
{
id: variantsSelectionMenu
Instantiator
model: UM.MachineVariantsModel { }
MenuItem
{
model: UM.MachineVariantsModel { }
MenuItem
{
text: model.name;
checkable: true;
checked: model.active;
exclusiveGroup: variantSelectionMenuGroup;
onTriggered: UM.MachineManager.setActiveMachineVariant(model.getItem(index).name)
}
text: model.name;
checkable: true;
checked: model.active;
exclusiveGroup: variantSelectionMenuGroup;
onTriggered: UM.MachineManager.setActiveMachineVariant(model.getItem(index).name)
}
ExclusiveGroup { id: variantSelectionMenuGroup; }
onObjectAdded: variantsSelectionMenu.insertItem(index, object)
onObjectRemoved: variantsSelectionMenu.removeItem(object)
}
ExclusiveGroup { id: variantSelectionMenuGroup; }
}
}
}
Rectangle{
id: globalProfileRow;
anchors.top: UM.MachineManager.hasVariants ? variantRow.bottom : base.top
//anchors.top: variantRow.bottom
height: UM.Theme.sizes.sidebar_setup.height
width: base.width
@ -148,8 +147,4 @@ Column{
// }
}
}
Rectangle{
width: base.width
height: UM.Theme.sizes.default_margin.width/2
}
}

View File

@ -54,7 +54,16 @@ Rectangle {
Connections {
target: openDialog
onHasMesh: {
base.fileBaseName = name
if(base.fileBaseName == ''){
base.fileBaseName = name
base.createFileName()
}
}
}
onActivityChanged: {
if (activity == false){
base.fileBaseName = ''
base.createFileName()
}
}
@ -62,7 +71,7 @@ Rectangle {
Rectangle{
id: printJobRow
implicitWidth: base.width;
implicitHeight: UM.Theme.sizes.sidebar_header.height
implicitHeight: UM.Theme.sizes.save_button_header.height
anchors.top: parent.top
color: UM.Theme.colors.sidebar_header_bar
Label{
@ -83,6 +92,7 @@ Rectangle {
height: UM.Theme.sizes.sidebar_inputFields.height
property int unremovableSpacing: 5
text: ''
onTextChanged: Printer.setJobName(text)
onEditingFinished: {
if (printJobTextfield.text != ''){
printJobTextfield.focus = false
@ -110,6 +120,7 @@ Rectangle {
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;
@ -188,12 +199,23 @@ Rectangle {
text: UM.OutputDeviceManager.activeDeviceShortDescription
onClicked:
{
UM.OutputDeviceManager.requestWriteToDevice(UM.OutputDeviceManager.activeDevice)
UM.OutputDeviceManager.requestWriteToDevice(UM.OutputDeviceManager.activeDevice, Printer.jobName)
}
style: ButtonStyle {
background: Rectangle {
color: control.hovered ? UM.Theme.colors.load_save_button_hover : UM.Theme.colors.load_save_button
//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
}
}
Behavior on color { ColorAnimation { duration: 50; } }
width: {
var w = 0;
@ -205,17 +227,17 @@ Rectangle {
saveToButton.resizedWidth = actualLabel.width + (UM.Theme.sizes.default_margin.width * 2)
w = actualLabel.width + (UM.Theme.sizes.default_margin.width * 2)
}
if(w < base.width * 0.55) {
w = base.width * 0.55;
}
return w;
}
Label {
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
color: UM.Theme.colors.load_save_button_text
font: UM.Theme.fonts.default
text: control.text;
}
@ -232,12 +254,22 @@ Rectangle {
anchors.rightMargin: UM.Theme.sizes.default_margin.width
width: UM.Theme.sizes.save_button_save_to_button.height
height: UM.Theme.sizes.save_button_save_to_button.height
enabled: base.progress > 0.99 && base.activity == true
//iconSource: UM.Theme.icons[UM.OutputDeviceManager.activeDeviceIconName];
style: ButtonStyle {
background: Rectangle {
id: deviceSelectionIcon
color: control.hovered ? UM.Theme.colors.load_save_button_hover : UM.Theme.colors.load_save_button
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
}
}
Behavior on color { ColorAnimation { duration: 50; } }
anchors.left: parent.left
anchors.leftMargin: UM.Theme.sizes.save_button_text_margin.width / 2;
@ -245,7 +277,6 @@ Rectangle {
height: parent.height
UM.RecolorImage {
id: lengthIcon
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
width: UM.Theme.sizes.standard_arrow.width

View File

@ -76,6 +76,7 @@ Rectangle
id: sidebarContents;
anchors.bottom: saveButton.top
anchors.top: profileItem.bottom
anchors.topMargin: UM.Theme.sizes.default_margin.height
anchors.left: base.left
anchors.right: base.right

View File

@ -39,18 +39,17 @@ Item
Rectangle{
id: settingsModeSelection
width: parent.width/100*55
height: childrenRect.height - UM.Theme.sizes.default_margin.width;
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 {
id: simpleModeButton
height: settingsModeSelection.height
anchors.left: parent.left
anchors.leftMargin: model.index * (settingsModeSelection.width / 2)
anchors.top: parent.top
anchors.verticalCenter: parent.verticalCenter
width: parent.width / 2
text: model.text
exclusiveGroup: modeMenuGroup;
@ -81,8 +80,6 @@ Item
anchors.top: parent.top
anchors.left: parent.left
width: parent.width
height: UM.Theme.sizes.sidebar_header.height
currentIndex: base.currentIndex;
}
}
}
@ -90,8 +87,9 @@ Item
Rectangle {
id: machineSelectionRow
width: base.width
height: UM.Theme.sizes.sidebar_header.height
height: UM.Theme.sizes.sidebar_setup.height
anchors.top: settingsModeRow.bottom
anchors.topMargin: UM.Theme.sizes.default_margin.height
anchors.horizontalCenter: parent.horizontalCenter
Label{
@ -110,7 +108,6 @@ Item
width: parent.width/100*55
height: UM.Theme.sizes.setting_control.height
tooltip: UM.MachineManager.activeMachineInstance;
//style: UM.Theme.styles.sidebar_header_button;
anchors.right: parent.right
anchors.rightMargin: UM.Theme.sizes.default_margin.width
anchors.verticalCenter: parent.verticalCenter

View File

@ -25,7 +25,7 @@ Item
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* 55 - 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{
@ -41,7 +41,7 @@ Item
Label{
id: infillCaption
width: infillCellLeft.width - UM.Theme.sizes.default_margin.width
text: infillModel.get(infillListView.activeIndex).text
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
@ -51,65 +51,80 @@ Item
}
}
Rectangle{
Flow {
id: infillCellRight
height: 100
width: base.width/100*45
height: childrenRect.height;
width: base.width / 100 * 45
anchors.right: parent.right
anchors.rightMargin: UM.Theme.sizes.default_margin.width - (UM.Theme.sizes.default_margin.width/4)
anchors.top: parent.top
anchors.topMargin: UM.Theme.sizes.default_margin.height
Component{
id: infillDelegate
Item{
width: infillCellRight.width/3
x: index * (infillCellRight.width/3)
anchors.top: parent.top
Repeater {
id: infillListView
property int activeIndex: {
if(!UM.ActiveProfile.valid)
{
return -1;
}
var density = parseInt(UM.ActiveProfile.settingValues.infill_sparse_density);
for(var i = 0; i < infillModel.count; ++i)
{
if(infillModel.get(i).percentage == density)
{
return i;
}
}
return -1;
}
model: infillModel;
Item {
width: childrenRect.width;
height: childrenRect.height;
Rectangle{
id: infillIconLining
anchors.top: parent.top
anchors.horizontalCenter: parent.horizontalCenter
width: parent.width - (UM.Theme.sizes.default_margin.width/2)
height: parent.width - (UM.Theme.sizes.default_margin.width/2)
width: infillCellRight.width / 3 - UM.Theme.sizes.default_margin.width;
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"
UM.RecolorImage {
Image {
id: infillIcon
z: parent.z + 1
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
width: parent.width - UM.Theme.sizes.default_margin.width
height: parent.width - UM.Theme.sizes.default_margin.width
anchors.fill: parent;
anchors.margins: UM.Theme.sizes.default_margin.width / 2
sourceSize.width: width
sourceSize.height: width
color: UM.Theme.colors.setting_control_text
source: UM.Theme.icons[model.icon];
}
MouseArea {
anchors.fill: parent
onClicked: {
infillListView.activeIndex = index
UM.MachineManager.setSettingValue("infill_sparse_density", model.percentage)
}
}
}
Label{
id: infillLabel
anchors.top: infillIconLining.bottom
anchors.horizontalCenter: parent.horizontalCenter
anchors.horizontalCenter: infillIconLining.horizontalCenter
color: infillListView.activeIndex == index ? UM.Theme.colors.setting_control_text : UM.Theme.colors.setting_control_border
text: name
//font.bold: infillListView.activeIndex == index ? true : false
}
}
}
ListView{
id: infillListView
property int activeIndex: 0
model: infillModel
delegate: infillDelegate
anchors.fill: parent
}
ListModel {
id: infillModel
@ -139,11 +154,12 @@ Item
Rectangle {
id: helpersCellLeft
anchors.top: infillCellLeft.bottom
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
height: childrenRect.height
Label{
anchors.left: parent.left
anchors.leftMargin: UM.Theme.sizes.default_margin.width
@ -155,7 +171,6 @@ Item
Rectangle {
id: helpersCellRight
anchors.top: helpersCellLeft.top
anchors.topMargin: UM.Theme.sizes.default_margin.height
anchors.left: helpersCellLeft.right
width: parent.width/100*55 - UM.Theme.sizes.default_margin.width
height: childrenRect.height
@ -164,37 +179,31 @@ Item
id: skirtCheckBox
anchors.top: parent.top
anchors.left: parent.left
Layout.preferredHeight: UM.Theme.sizes.section.height;
//: Setting enable skirt adhesion checkbox
text: catalog.i18nc("@option:check","Enable Skirt Adhesion");
style: UM.Theme.styles.checkbox;
checked: Printer.getSettingValue("skirt_line_count") == null ? false: Printer.getSettingValue("skirt_line_count");
onCheckedChanged:
checked: UM.ActiveProfile.valid ? UM.ActiveProfile.settingValues.adhesion_type == "brim" : false;
onClicked:
{
if(checked != Printer.getSettingValue("skirt_line_count"))
{
Printer.setSettingValue("skirt_line_count", checked)
}
UM.MachineManager.setSettingValue("adhesion_type", "brim")
}
}
CheckBox{
anchors.top: skirtCheckBox.bottom
anchors.topMargin: UM.Theme.sizes.default_lining.height
anchors.left: parent.left
Layout.preferredHeight: UM.Theme.sizes.section.height;
//: Setting enable support checkbox
text: catalog.i18nc("@option:check","Enable Support");
style: UM.Theme.styles.checkbox;
checked: Printer.getSettingValue("support_enable") == null? false: Printer.getSettingValue("support_enable");
onCheckedChanged:
checked: UM.ActiveProfile.valid ? UM.ActiveProfile.settingValues.support_enable : false;
onClicked:
{
if(checked != Printer.getSettingValue("support_enable"))
{
Printer.setSettingValue("support_enable", checked)
}
UM.MachineManager.setSettingValue("support_enable", checked)
}
}
}

View File

@ -33,6 +33,7 @@ Item {
checkable: true;
checked: model.active;
enabled: UM.Selection.hasSelection;
style: UM.Theme.styles.tool_button;
@ -43,7 +44,6 @@ Item {
onClicked: {
parent.checked ? UM.Controller.setActiveTool(null) : UM.Controller.setActiveTool(model.id);
base.activeY = parent.y
}
}
}
@ -65,7 +65,14 @@ Item {
anchors.left: parent.right;
y: base.activeY
width: panel.item ? Math.max(panel.width + 2 * UM.Theme.sizes.default_margin.width) : 0;
width: {
if (panel.item && panel.width > 0){
return Math.max(panel.width + 2 * UM.Theme.sizes.default_margin.width)
}
else {
return 0
}
}
height: panel.item ? panel.height + 2 * UM.Theme.sizes.default_margin.height : 0;
opacity: panel.item ? 1 : 0

View File

@ -19,79 +19,51 @@ UM.PreferencesPage
{
UM.Preferences.resetPreference("view/show_overhang");
UM.Preferences.resetPreference("view/center_on_select");
overhangCheckbox.checked = boolCheck(UM.Preferences.getValue("view/show_overhang"))
centerCheckbox.checked = boolCheck(UM.Preferences.getValue("view/center_on_select"))
}
GridLayout
Column
{
columns: 2;
UM.I18nCatalog { id: catalog; name:"cura"}
CheckBox
UM.TooltipArea
{
id: overhangCheckbox
checked: boolCheck(UM.Preferences.getValue("view/show_overhang"))
onCheckedChanged: UM.Preferences.setValue("view/show_overhang", checked ? "True" : "False")
}
Button
{
id: viewText //is a button so the user doesn't have to click inconveniently precise to enable or disable the checkbox
width: childrenRect.width;
height: childrenRect.height;
//: Display Overhang preference checkbox
text: catalog.i18nc("@option:check","Display Overhang");
onClicked: overhangCheckbox.checked = !overhangCheckbox.checked
text: catalog.i18nc("@info:tooltip","Highlight unsupported areas of the model in red. Without support these areas will nog print properly.")
//: Display Overhang preference tooltip
tooltip: catalog.i18nc("@info:tooltip","Highlight unsupported areas of the model in red. Without support these areas will not print properly.")
style: ButtonStyle
CheckBox
{
background: Rectangle
{
border.width: 0
color: "transparent"
}
label: Text
{
renderType: Text.NativeRendering
horizontalAlignment: Text.AlignLeft
text: control.text
}
id: overhangCheckbox
checked: boolCheck(UM.Preferences.getValue("view/show_overhang"))
onClicked: UM.Preferences.setValue("view/show_overhang", checked)
text: catalog.i18nc("@option:check","Display Overhang");
}
}
CheckBox
{
id: centerCheckbox
checked: boolCheck(UM.Preferences.getValue("view/center_on_select"))
onCheckedChanged: UM.Preferences.setValue("view/center_on_select", checked ? "True" : "False")
}
Button
{
id: centerText //is a button so the user doesn't have to click inconveniently precise to enable or disable the checkbox
UM.TooltipArea {
width: childrenRect.width;
height: childrenRect.height;
text: catalog.i18nc("@info:tooltip","Moves the camera so the object is in the center of the view when an object is selected")
//: Display Center camera preference checkbox
text: catalog.i18nc("@action:button","Center camera when item is selected");
onClicked: centerCheckbox.checked = !centerCheckbox.checked
//: Display Center camera preference tooltip
tooltip: catalog.i18nc("@info:tooltip","Moves the camera so the object is in the center of the view when an object is selected")
style: ButtonStyle
CheckBox
{
background: Rectangle
{
border.width: 0
color: "transparent"
}
label: Text
{
renderType: Text.NativeRendering
horizontalAlignment: Text.AlignLeft
text: control.text
}
id: centerCheckbox
text: catalog.i18nc("@action:button","Center camera when item is selected");
checked: boolCheck(UM.Preferences.getValue("view/center_on_select"))
onClicked: UM.Preferences.setValue("view/center_on_select", checked)
}
}
Connections {
target: UM.Preferences
onPreferenceChanged:
{
overhangCheckbox.checked = boolCheck(UM.Preferences.getValue("view/show_overhang"))
centerCheckbox.checked = boolCheck(UM.Preferences.getValue("view/center_on_select"))
}
}
Item { Layout.fillHeight: true; Layout.columnSpan: 2 }
}
}

View File

@ -128,14 +128,7 @@ Item
text: model.name
onClicked: {
ListView.view.currentIndex = index;
if(model.pages.length > 0) {
base.wizard.nextAvailable = true;
} else {
base.wizard.nextAvailable = false;
}
}
onClicked: ListView.view.currentIndex = index;
Label
{
@ -221,6 +214,7 @@ Item
base.wizard.appendPage(Qt.resolvedUrl("Bedleveling.qml"), catalog.i18nc("@title", "Bed Levelling"));
break;
default:
base.wizard.appendPage(Qt.resolvedUrl("%1.qml".arg(pages[i])), pages[i])
break;
}
}

View File

@ -15,6 +15,7 @@ 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()
@ -40,7 +41,7 @@ Item
}
Label
{
id: bedelevelingText
id: bedlevelingText
anchors.top: pageDescription.bottom
anchors.topMargin: UM.Theme.sizes.default_margin.height
width: parent.width
@ -49,47 +50,69 @@ Item
}
Item{
anchors.top: bedelevelingText.bottom
id: bedlevelingWrapper
anchors.top: bedlevelingText.bottom
anchors.topMargin: UM.Theme.sizes.default_margin.height
anchors.horizontalCenter: parent.horizontalCenter
width: bedelevelingButton.width + skipBedlevelingButton.width + UM.Theme.sizes.default_margin.height < wizardPage.width ? bedelevelingButton.width + skipBedlevelingButton.width + UM.Theme.sizes.default_margin.height : wizardPage.width
height: skipBedlevelingButton.height
width: bedlevelingButton.width + skipBedlevelingButton.width + UM.Theme.sizes.default_margin.height < wizardPage.width ? bedlevelingButton.width + skipBedlevelingButton.width + UM.Theme.sizes.default_margin.height : wizardPage.width
Button
{
id: bedelevelingButton
id: bedlevelingButton
anchors.top: parent.top
anchors.left: parent.left
enabled: !alreadyTested
text: catalog.i18nc("@action:button","Move to Next Position");
onClicked:
{
if(wizardPage.leveling_state == 0)
{
printer_connection.moveHead(platform_width /2 , platform_height,0)
printer_connection.moveHead(platform_width, 0 ,0)
}
if(wizardPage.leveling_state == 1)
{
printer_connection.moveHead(platform_width , 0,0)
printer_connection.moveHead(platform_width/2, platform_height, 0)
}
if(wizardPage.leveling_state == 2)
{
printer_connection.moveHead(0, 0 ,0)
printer_connection.moveHead(0, 0, 0)
}
wizardPage.leveling_state++
if (wizardPage.leveling_state >= 3){
base.addOriginalProgress.bedLeveling = true
resultText.visible = true
skipBedlevelingButton.enabled = false
bedlevelingButton.enabled = false
wizardPage.leveling_state = 0
}
}
}
Button
{
id: skipBedlevelingButton
anchors.top: parent.width < wizardPage.width ? parent.top : bedelevelingButton.bottom
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 ? bedelevelingButton.right : parent.left
anchors.left: parent.width < wizardPage.width ? bedlevelingButton.right : parent.left
anchors.leftMargin: parent.width < wizardPage.width ? UM.Theme.sizes.default_margin.width : 0
text: catalog.i18nc("@action:button","Skip Bedleveling");
onClicked: base.visible = false;
}
}
Label
{
id: resultText
visible: alreadyTested
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.")
}
function threePointLeveling(width, height)
{

View File

@ -14,6 +14,19 @@ Item
SystemPalette{id: palette}
UM.I18nCatalog { id: catalog; name:"cura"}
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);
}
if (heatedBedCheckBox1.checked == true || heatedBedCheckBox2.checked == true){
UM.MachineManager.setMachineSettingValue("machine_heated_bed", true)
}
}
Label
{
id: pageTitle
@ -43,24 +56,31 @@ Item
width: parent.width - UM.Theme.sizes.default_margin.width
CheckBox
{
id: checkBox
id: extruderCheckBox
text: catalog.i18nc("@option:check","Extruder driver ugrades")
checked: true
checked: base.addOriginalProgress.upgrades[0]
}
CheckBox
{
id: heatedBedCheckBox1
text: catalog.i18nc("@option:check","Heated printer bed (standard kit)")
y: checkBox.height * 1
y: extruderCheckBox.height * 1
checked: base.addOriginalProgress.upgrades[1]
onClicked: {
if (heatedBedCheckBox2.checked == true)
heatedBedCheckBox2.checked = false
}
}
CheckBox
{
id: heatedBedCheckBox2
text: catalog.i18nc("@option:check","Heated printer bed (self built)")
y: checkBox.height * 2
}
CheckBox
{
text: catalog.i18nc("@option:check","Dual extrusion (experimental)")
y: checkBox.height * 3
y: extruderCheckBox.height * 2
checked: base.addOriginalProgress.upgrades[2]
onClicked: {
if (heatedBedCheckBox1.checked == true)
heatedBedCheckBox1.checked = false
}
}
}
@ -74,4 +94,4 @@ Item
}
ExclusiveGroup { id: printerGroup; }
}
}

View File

@ -14,24 +14,51 @@ 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
property variant printer_connection: UM.USBPrinterManager.connectedPrinterList.rowCount() != 0 ? UM.USBPrinterManager.connectedPrinterList.getItem(0).printer: null
property variant printer_connection: {
if (UM.USBPrinterManager.connectedPrinterList.rowCount() != 0){
base.addOriginalProgress.checkUp[0] = true
checkTotalCheckUp()
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){
allDone = false
}
}
if (allDone == true){
base.addOriginalProgress.checkUp[base.addOriginalProgress.checkUp.length] = true
skipCheckButton.enabled = false
resultText.visible = true
}
}
Component.onCompleted:
{
if (printer_connection != null)
if (printer_connection != null){
printer_connection.startPollEndstop()
}
}
Component.onDestruction:
{
if (printer_connection != null)
if (printer_connection != null){
printer_connection.stopPollEndstop()
}
}
Label
{
@ -64,11 +91,12 @@ Item
id: startCheckButton
anchors.top: parent.top
anchors.left: parent.left
enabled: !alreadyTested
text: catalog.i18nc("@action:button","Start Printer Check");
enabled: manager.progress >= 100;
onClicked: {
checkupContent.visible = true
startCheckButton.enabled = false
printer_connection.homeHead()
}
}
@ -79,8 +107,8 @@ 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
text: catalog.i18nc("@action:button","Skip Printer Check");
enabled: manager.progress >= 100;
onClicked: {
base.currentPage += 1
}
@ -91,7 +119,7 @@ Item
id: checkupContent
anchors.top: startStopButtons.bottom
anchors.topMargin: UM.Theme.sizes.default_margin.height
visible: false
visible: alreadyTested
//////////////////////////////////////////////////////////
Label
{
@ -109,7 +137,7 @@ Item
anchors.left: connectionLabel.right
anchors.top: parent.top
wrapMode: Text.WordWrap
text: UM.USBPrinterManager.connectedPrinterList.count ? catalog.i18nc("@info:status","Done"):catalog.i18nc("@info:status","Incomplete")
text: UM.USBPrinterManager.connectedPrinterList.rowCount() > 0 || base.addOriginalProgress.checkUp[0] ? catalog.i18nc("@info:status","Done"):catalog.i18nc("@info:status","Incomplete")
}
//////////////////////////////////////////////////////////
Label
@ -128,7 +156,7 @@ Item
anchors.left: endstopXLabel.right
anchors.top: connectionLabel.bottom
wrapMode: Text.WordWrap
text: x_min_pressed ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked")
text: x_min_pressed || base.addOriginalProgress.checkUp[1] ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked")
}
//////////////////////////////////////////////////////////////
Label
@ -147,7 +175,7 @@ Item
anchors.left: endstopYLabel.right
anchors.top: endstopXLabel.bottom
wrapMode: Text.WordWrap
text: y_min_pressed ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked")
text: y_min_pressed || base.addOriginalProgress.checkUp[2] ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked")
}
/////////////////////////////////////////////////////////////////////
Label
@ -166,7 +194,7 @@ Item
anchors.left: endstopZLabel.right
anchors.top: endstopYLabel.bottom
wrapMode: Text.WordWrap
text: z_min_pressed ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked")
text: z_min_pressed || base.addOriginalProgress.checkUp[3] ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked")
}
////////////////////////////////////////////////////////////
Label
@ -205,9 +233,14 @@ Item
{
if(printer_connection != null)
{
heater_status_label.text = catalog.i18nc("@info:progress","Checking")
printer_connection.heatupNozzle(190)
wizardPage.extruder_target_temp = 190
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
}
}
}
}
@ -261,9 +294,14 @@ Item
{
if(printer_connection != null)
{
bedTempStatus.text = catalog.i18nc("@info:progress","Checking")
printer_connection.heatupBed(60)
wizardPage.bed_target_temp = 60
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
}
}
}
}
@ -279,6 +317,17 @@ Item
text: printer_connection != null ? printer_connection.bedTemperature + "°C": "0°C"
font.bold: true
}
Label
{
id: resultText
visible: base.addOriginalProgress.checkUp[base.addOriginalProgress.checkUp.length-1]
anchors.top: bedTemp.bottom
anchors.topMargin: UM.Theme.sizes.default_margin.height
anchors.left: parent.left
width: parent.width
wrapMode: Text.WordWrap
text: catalog.i18nc("@label", "Everything is in order! You're done with your CheckUp.")
}
}
@ -289,24 +338,33 @@ 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()
}
}
onExtruderTemperatureChanged:
{
if(printer_connection.extruderTemperature > wizardPage.extruder_target_temp - 10 && printer_connection.extruderTemperature < wizardPage.extruder_target_temp + 10)
{
if(printer_connection != null)
{
heater_status_label.text = catalog.i18nc("@info:status","Works")
nozzleTempStatus.text = catalog.i18nc("@info:status","Works")
base.addOriginalProgress.checkUp[4] = true
checkTotalCheckUp()
printer_connection.heatupNozzle(0)
}
}
@ -315,7 +373,9 @@ Item
{
if(printer_connection.bedTemperature > wizardPage.bed_target_temp - 5 && printer_connection.bedTemperature < wizardPage.bed_target_temp + 5)
{
bed_status_label.text = catalog.i18nc("@info:status","Works")
bedTempStatus.text = catalog.i18nc("@info:status","Works")
base.addOriginalProgress.checkUp[5] = true
checkTotalCheckUp()
printer_connection.heatupBed(0)
}
}

View File

@ -14,6 +14,7 @@ Item
SystemPalette{id: palette}
UM.I18nCatalog { id: catalog; name:"cura"}
property variant printer_connection: UM.USBPrinterManager.connectedPrinterList.rowCount() != 0 ? UM.USBPrinterManager.connectedPrinterList.getItem(0).printer : null
Label
{
id: pageTitle
@ -61,6 +62,7 @@ Item
anchors.top: parent.top
anchors.left: parent.left
text: catalog.i18nc("@action:button","Upgrade to Marlin Firmware");
onClicked: UM.USBPrinterManager.updateAllFirmware()
}
Button {
id: skipUpgradeButton

View File

@ -0,0 +1,49 @@
{
"id": "innovo-inventor",
"name": "Innovo INVENTOR",
"manufacturer": "INNOVO",
"author": "AR",
"version": 1,
"icon": "",
"platform": "inventor_platform.stl",
"platform_texture": "",
"inherits": "fdmprinter.json",
"machine_settings": {
"machine_width": {"default": 340},
"machine_height": {"default": 290},
"machine_depth": {"default": 300},
"machine_heated_bed": { "default": true }
"machine_center_is_zero": {"default": false},
"machine_nozzle_size": {"default": 0.4},
"machine_head_shape_min_x": {"default": 43.7},
"machine_head_shape_min_y": {"default": 19.2},
"machine_head_shape_max_x": {"default": 43.7},
"machine_head_shape_max_y": {"default": 55},
"machine_nozzle_gantry_distance": {"default": 82.3},
"machine_nozzle_offset_x_1": {"default": 0},
"machine_nozzle_offset_y_1": {"default": 15},
"machine_gcode_flavor": {"default": "RepRap (Marlin/Sprinter)"},
"machine_start_gcode": {"default": "G28 ; Home extruder\nM107 ; Turn off fan\nG90 ; Absolute positioning\nM82 ; Extruder in absolute mode\n{IF_BED}M190 S{BED}\n{IF_EXT0}M104 T0 S{TEMP0}\n{IF_EXT0}M109 T0 S{TEMP0}\n{IF_EXT1}M104 T1 S{TEMP1}\n{IF_EXT1}M109 T1 S{TEMP1}\nG32 S3 ; auto level\nG92 E0 ; Reset extruder position"},
"machine_end_gcode": {"default": "M104 S0\nG91 ; relative positioning\nG1 E-2 F5000; retract 2mm\nG28 Z; move bed down\nG90 ; absolute positioning\nM84 ; disable motors"}
},
"overrides": {
"layer_height": { "default": 0.15 },
"shell_thickness": { "default": 0.8},
"wall_thickness": { "default": 0.8 },
"top_bottom_thickness": { "default": 0.3, "visible": true },
"material_print_temperature": { "default": 215, "visible": true },
"material_bed_temperature": { "default": 60, "visible": true },
"material_diameter": { "default": 1.75, "visible": true },
"retraction_enable": { "default": true, "always_visible": true},
"retraction_speed": { "default": 50.0, "visible": false },
"retraction_amount": { "default": 2.5, "visible": false },
"retraction_hop": { "default": 0.075, "visible": false },
"speed_print": { "default": 60.0, "visible": true},
"speed_infill": { "default": 100.0, "visible": true },
"speed_topbottom": { "default": 30.0, "visible": true },
"speed_travel": { "default": 150.0, "visible": true },
"speed_layer_0": { "min_value": 0.1, "default": 30.0, "visible": true },
"infill_overlap": { "default": 10.0 }
}
}

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 760 KiB

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="13px" height="13px" viewBox="0 0 13 13" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
<!-- Generator: Sketch 3.3.3 (12081) - http://www.bohemiancoding.com/sketch -->
<title>Fill 1 Copy 3</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
<g id="Artboard-9" sketch:type="MSArtboardGroup" fill="#979797">
<path d="M12.9591703,5.77835943 C12.9386134,5.59558436 12.7256076,5.45815541 12.5413815,5.45815541 C11.945715,5.45815541 11.4171607,5.10856711 11.1953879,4.56749729 C10.9691411,4.01342825 11.1150951,3.36745775 11.5588824,2.96031012 C11.6986693,2.832555 11.7157195,2.61858181 11.5985451,2.47002795 C11.2936378,2.08289306 10.9471935,1.73312338 10.5688256,1.43009042 C10.4207554,1.31134407 10.203215,1.32785005 10.0747343,1.47005546 C9.68741806,1.89915061 8.99138546,2.05858755 8.45358056,1.83421498 C7.89413045,1.59877796 7.54103538,1.0317097 7.57574027,0.423043942 C7.58704657,0.231743807 7.44725962,0.065474726 7.25668502,0.0432853613 C6.77105838,-0.0129438188 6.2812599,-0.0145762789 5.79424265,0.0394762878 C5.60602605,0.0602750383 5.46617864,0.222553661 5.47258755,0.411495799 C5.49356769,1.01423633 5.13648216,1.57132845 4.58241312,1.79830086 C4.05101714,2.01535759 3.35994238,1.85712988 2.97335165,1.43178334 C2.84559653,1.29169408 2.63180473,1.27446256 2.48282763,1.39066953 C2.09333475,1.69630233 1.73909092,2.04631387 1.43134196,2.43030475 C1.31138638,2.57958415 1.32910159,2.79591534 1.47009777,2.92415415 C1.92259152,3.33396209 2.06854554,3.9855555 1.83353175,4.54603346 C1.60915919,5.08045252 1.05442507,5.42459928 0.419337643,5.42459928 C0.213163982,5.41800898 0.0664844221,5.55640532 0.0438113656,5.74389638 C-0.0133851983,6.2320624 -0.0140502746,6.72972088 0.0409696758,7.22187736 C0.0615265804,7.40543842 0.280941306,7.54171861 0.4672836,7.54171861 C1.03338447,7.52726831 1.57657045,7.87752169 1.80475209,8.43231627 C2.03196634,8.98638531 1.88577048,9.63211396 1.44125765,10.0397453 C1.30213577,10.1675004 1.28442056,10.3809899 1.40183676,10.5293624 C1.70366049,10.9140788 2.05034664,11.2640903 2.42992383,11.5697231 C2.57890093,11.6896787 2.79547396,11.6729309 2.92468016,11.5304836 C3.31368934,11.1004211 4.0094801,10.941226 4.54510839,11.1660823 C5.10625142,11.4008542 5.45910464,11.9679225 5.4246416,12.5767696 C5.41327484,12.7680697 5.55360594,12.9348225 5.743455,12.9565282 C5.9919517,12.9856102 6.24177855,13 6.4923914,13 C6.73024688,13 6.9680419,12.9870008 7.20589738,12.9605791 C7.39435582,12.9397804 7.53396139,12.7772599 7.52755247,12.5883178 C7.5058468,11.9858191 7.86365786,11.428727 8.41700136,11.2021778 C8.95196457,10.9837304 9.6399558,11.1436511 10.0267884,11.5682721 C10.155269,11.7081195 10.3676098,11.7251091 10.5173124,11.6093859 C10.9060797,11.3044786 11.2596585,10.9547089 11.5687981,10.5697507 C11.6887536,10.4207131 11.671764,10.2041401 11.5300423,10.0756594 C11.0775485,9.66609331 10.9308689,9.01425805 11.1658827,8.45426379 C11.3866881,7.92716057 11.9209257,7.57309812 12.4955517,7.57309812 L12.5758445,7.57521427 C12.7624287,7.59032964 12.9338974,7.44673362 12.9563287,7.25640087 C13.0137066,6.76775115 13.0144321,6.27057637 12.9591703,5.77835943 L12.9591703,5.77835943 Z M6.51034846,8.68196174 C5.31478308,8.68196174 4.34244149,7.7093783 4.34244149,6.51387338 C4.34244149,5.318308 5.31478308,4.34572456 6.51034846,4.34572456 C7.70609523,4.34572456 8.67843682,5.318308 8.67843682,6.51387338 C8.67843682,7.7093783 7.70609523,8.68196174 6.51034846,8.68196174 L6.51034846,8.68196174 Z" id="Fill-1-Copy-3" sketch:type="MSShapeGroup"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@ -34,17 +34,17 @@ QtObject {
elide: Text.ElideRight;
anchors.left: parent.left;
anchors.leftMargin: UM.Theme.sizes.setting_unit_margin.width
anchors.right: downArrow.left;
anchors.rightMargin: UM.Theme.sizes.setting_unit_margin.width
anchors.right: separationLine.left;
anchors.verticalCenter: parent.verticalCenter;
font: UM.Theme.fonts.default
}
Rectangle{
id: separationLine
width: 1
height: UM.Theme.sizes.setting_control.height
color: UM.Theme.colors.setting_control_border
anchors.right: sidebarComboBoxLabel.right
anchors.rightMargin: UM.Theme.sizes.setting_unit_margin.width
anchors.right: downArrow.left
anchors.rightMargin: UM.Theme.sizes.setting_unit_margin.width + downArrow.width/2
anchors.top: parent.top
z: parent.z + 1
}
@ -57,11 +57,11 @@ QtObject {
ButtonStyle {
background: Item{
implicitWidth: UM.Theme.sizes.button.width;
implicitHeight: UM.Theme.sizes.button.width;
implicitHeight: UM.Theme.sizes.button.height;
Rectangle {
anchors.left: parent.right
anchors.verticalCenter: parent.verticalCenter
color: "white"
color: UM.Theme.colors.button_text
width: control.hovered ? openFileLabel.width : 0;
height: openFileLabel.height
Behavior on width { NumberAnimation { duration: 100; } }
@ -87,7 +87,7 @@ QtObject {
source: control.iconSource;
width: UM.Theme.sizes.button_icon.width;
height: UM.Theme.sizes.button_icon.height;
sourceSize: UM.Theme.sizes.button_icon;
sourceSize: UM.Theme.sizes.button_icon
}
}
}
@ -139,13 +139,10 @@ QtObject {
id: buttonFace;
anchors.fill: parent;
property bool down: control.pressed || (control.checkable && control.checked);
color: {
if(!control.enabled) {
return UM.Theme.colors.button_disabled;
} else if(control.checkable && control.checked && control.hovered) {
if(control.checkable && control.checked && control.hovered) {
return UM.Theme.colors.button_active_hover;
} else if(control.pressed || (control.checkable && control.checked)) {
return UM.Theme.colors.button_active;
@ -159,6 +156,7 @@ QtObject {
Label {
id: tool_button_arrow
opacity: !control.enabled ? 0.4 : 1.0
anchors.right: parent.right;
anchors.rightMargin: (UM.Theme.sizes.button.width - UM.Theme.sizes.button_icon.width - tool_button_arrow.width) / 2
anchors.verticalCenter: parent.verticalCenter;
@ -173,12 +171,12 @@ QtObject {
label: Item {
Image {
anchors.centerIn: parent;
opacity: !control.enabled ? 0.4 : 1.0
source: control.iconSource;
width: UM.Theme.sizes.button_icon.width;
height: UM.Theme.sizes.button_icon.height;
sourceSize: UM.Theme.sizes.button_icon;
sourceSize: UM.Theme.sizes.button_icon
}
}
}
@ -243,7 +241,7 @@ QtObject {
width: UM.Theme.sizes.button_icon.width;
height: UM.Theme.sizes.button_icon.height;
sourceSize: UM.Theme.sizes.button_icon;
sourceSize: UM.Theme.sizes.button_icon
}
}
}
@ -334,10 +332,10 @@ QtObject {
minimumPointSize: 8
}
UM.RecolorImage {
id: lengthIcon
id: category_arrow
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
anchors.rightMargin: UM.Theme.sizes.default_margin.width * 2
anchors.rightMargin: UM.Theme.sizes.default_margin.width * 2 - width / 2
width: UM.Theme.sizes.standard_arrow.width
height: UM.Theme.sizes.standard_arrow.height
sourceSize.width: width

View File

@ -32,10 +32,11 @@
"capitalize": true,
"family": "Roboto"
},
"timeslider_time": {
"default_header": {
"size": 1.0,
"bold": true,
"family": "Roboto"
"family": "Roboto",
"letterSpacing": 2.0
},
"button_tooltip": {
"size": 0.75,
@ -71,7 +72,7 @@
"button_active": [32, 166, 219, 255],
"button_active_hover": [77, 184, 226, 255],
"button_text": [255, 255, 255, 255],
"button_disabled": [245, 245, 245, 255],
"button_disabled": [0, 0, 0, 255],
"button_tooltip_text": [35, 35, 35, 255],
"toggle_active": [255, 255, 255, 255],
@ -82,7 +83,8 @@
"load_save_button": [0, 0, 0, 255],
"load_save_button_text": [255, 255, 255, 255],
"load_save_button_hover": [43, 45, 46, 255],
"load_save_button_active": [43, 45, 46, 255],
"load_save_button_inactive": [176, 184, 191, 255],
"load_save_button_inactive_text": [209, 214, 219, 255],
"scrollbar_background": [245, 245, 245, 255],
"scrollbar_handle": [12, 159, 227, 255],
@ -91,15 +93,16 @@
"setting_category": [238, 238, 238, 255],
"setting_category_disabled": [238, 238, 238, 255],
"setting_category_hover": [240, 248, 255, 255],
"setting_category_active": [238, 238, 238, 255],
"setting_category_active_hover": [240, 248, 255, 255],
"setting_category_hover": [231, 231, 231, 255],
"setting_category_active": [240, 248, 255, 255],
"setting_category_active_hover": [233, 244, 245, 255],
"setting_category_text": [35, 35, 35, 255],
"setting_control": [255, 255, 255, 255],
"setting_control_highlight": [245, 245, 245, 255],
"setting_control_border": [174, 174, 174, 255],
"setting_control_text": [0, 0, 0, 255],
"setting_control_depth_line": [162, 192, 227, 255],
"setting_control_hover": [139, 143, 153, 255],
"setting_control_selected": [35, 35, 35, 255],
"setting_control_revert": [85, 85, 85, 255],
@ -126,16 +129,6 @@
"tooltip": [255, 225, 146, 255],
"save_button_border": [205, 202, 201, 255],
"save_button_inactive": [205, 202, 201, 255],
"save_button_active": [12, 159, 227, 255],
"save_button_active_hover": [34, 150, 190, 255],
"save_button_safe_to_text": [255, 255, 255, 255],
"save_button_estimated_text": [140, 144, 154, 255],
"save_button_estimated_text_background": [255, 255, 255, 255],
"save_button_printtime_text": [12, 169, 227, 255],
"save_button_background": [249, 249, 249, 255],
"message_background": [255, 255, 255, 255],
"message_text": [32, 166, 219, 255],
"message_dismiss": [139, 143, 153, 255],
@ -147,40 +140,39 @@
},
"sizes": {
"window_margin": [2.0, 2.0],
"window_margin": [1.5, 1.5],
"default_margin": [1.0, 1.0],
"default_lining": [0.1, 0.1],
"logo": [9.5, 2.0],
"toolbar_button": [2.0, 2.0],
"toolbar_spacing": [1.0, 1.0],
"loadfile_button": [11.0, 2.4],
"loadfile_margin": [0.8, 0.4],
"sidebar": [27.0, 10.0],
"sidebar_header": [0.0, 3.2],
"sidebar_setup": [0.0, 2.8],
"sidebar": [26.0, 10.0],
"sidebar_header": [0.0, 3.8],
"sidebar_header_mode_toggle": [0.0, 2.4],
"sidebar_setup": [0.0, 2.6],
"sidebar_subParts": [0.0, 2.4],
"sidebar_specs_bar": [0.0, 2.2],
"sidebar_inputFields": [0.0, 1.9],
"simple_mode_infill_caption": [0.0, 5.0],
"simple_mode_infill_height": [0.0, 8.0],
"section": [0.0, 1.8],
"section_icon": [1.2, 1.2],
"section": [0.0, 2.0],
"section_icon": [1.6, 1.6],
"section_icon_column": [2.8, 0.0],
"setting": [21.0, 1.8],
"setting_control": [6.0, 2.0],
"setting_control_margin": [3.0, 3.0],
"setting_control": [7.0, 2.0],
"setting_control_depth_margin": [1.4, 0.0],
"setting_preferences_button_margin": [3.3, 0.0],
"setting_control_margin": [0.0, 0.0],
"setting_unit_margin": [0.5, 0.5],
"setting_text_maxwidth": [40.0, 0.0],
"simple_mode_infill_caption": [0.0, 5.0],
"standard_list_lineheight": [1.5, 1.5],
"standard_list_input": [20.0, 25.0],
"standard_arrow": [0.6, 0.6],
"button": [3.2, 3.2],
"button_icon": [2.5, 2.5],
"button": [3.8, 3.8],
"button_icon": [2.6, 2.6],
"progressbar": [26.0, 0.8],
"progressbar_control": [8.0, 0.8],
@ -201,6 +193,7 @@
"tooltip_margins": [1.0, 1.0],
"save_button_border": [0.06, 0.06],
"save_button_header": [0.0, 3.2],
"save_button_text_margin": [0.3, 0.6],
"save_button_slicing_bar": [0.0, 2.2],
"save_button_label_margin": [0.5, 0.5],