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) install(DIRECTORY cura DESTINATION lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages)
endif() 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: For crashes and similar issues, please attach the following information:
* (On Windows) The log as produced by dxdiag (start -> run -> dxdiag -> save output) * (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 * The Cura Engine log, using Help -> Show Engine Log
Dependencies Dependencies

View File

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

View File

@ -8,9 +8,15 @@ from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QVBoxLayout, QLabel, QTex
from UM.i18n import i18nCatalog from UM.i18n import i18nCatalog
catalog = i18nCatalog("cura") catalog = i18nCatalog("cura")
def show(type, value, tb): def show(exception_type, value, tb):
if not hasattr(sys, "frozen"): debug_mode = False
traceback.print_exception(type, value, tb) 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() application = QCoreApplication.instance()
if not application: if not application:
@ -34,7 +40,7 @@ def show(type, value, tb):
except: except:
version = "Unknown" 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 = "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) 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) buttons = QDialogButtonBox(QDialogButtonBox.Close, dialog)
layout.addWidget(buttons) layout.addWidget(buttons)
buttons.addButton(catalog.i18nc("@action:button", "Open Web Page"), QDialogButtonBox.HelpRole) 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")) buttons.helpRequested.connect(lambda: webbrowser.open("http://github.com/Ultimaker/Cura/issues"))
dialog.exec_() dialog.exec_()

View File

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

View File

@ -107,7 +107,7 @@ class Layer():
def build(self, offset, vertices, colors, indices): def build(self, offset, vertices, colors, indices):
result = offset result = offset
for polygon in self._polygons: 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 continue
polygon.build(result, vertices, colors, indices) polygon.build(result, vertices, colors, indices)
@ -238,7 +238,7 @@ class Polygon():
elif self._type == self.MoveCombingType: elif self._type == self.MoveCombingType:
return Color(0.0, 0.0, 1.0, 1.0) return Color(0.0, 0.0, 1.0, 1.0)
elif self._type == self.MoveRetractionType: 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: else:
return Color(1.0, 1.0, 1.0, 1.0) 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 PlatformPhysicsOperation
from . import ConvexHullJob from . import ConvexHullJob
from . import ZOffsetDecorator
import time import time
import threading import threading
@ -69,8 +70,12 @@ class PlatformPhysics:
# Move it downwards if bottom is above platform # Move it downwards if bottom is above platform
move_vector = Vector() move_vector = Vector()
if not (node.getParent() and node.getParent().callDecoration("isGroup")): #If an object is grouped, don't move it down 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: 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): #if not Float.fuzzyCompare(bbox.bottom, 0.0):
# pass#move_vector.setY(-bbox.bottom) # pass#move_vector.setY(-bbox.bottom)
@ -127,8 +132,8 @@ class PlatformPhysics:
if overlap is None: if overlap is None:
continue continue
move_vector.setX(overlap[0] * 1.01) move_vector.setX(overlap[0] * 1.1)
move_vector.setZ(overlap[1] * 1.01) move_vector.setZ(overlap[1] * 1.1)
convex_hull = node.callDecoration("getConvexHull") convex_hull = node.callDecoration("getConvexHull")
if convex_hull: if convex_hull:
if not convex_hull.isValid(): if not convex_hull.isValid():
@ -149,5 +154,16 @@ class PlatformPhysics:
self._enabled = False self._enabled = False
def _onToolOperationStopped(self, tool): 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._enabled = True
self._onChangeTimerFinished() 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 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 = cura.CuraApplication.CuraApplication.getInstance()
app.run() app.run()

View File

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

View File

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

View File

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

View File

@ -77,12 +77,20 @@ class CuraEngineBackend(Backend):
self._message = None self._message = None
self.backendConnected.connect(self._onBackendConnected) 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. ## Get the command that is used to call the engine.
# This is usefull for debugging and used to actually start the engine # This is usefull for debugging and used to actually start the engine
# \return list of commands and args / parameters. # \return list of commands and args / parameters.
def getEngineCommand(self): 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. ## 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. # \param time The amount of time the print will take.
@ -123,6 +131,7 @@ class CuraEngineBackend(Backend):
pass pass
self.slicingCancelled.emit() self.slicingCancelled.emit()
return return
Logger.log("d", "Preparing to send slice data to engine.") Logger.log("d", "Preparing to send slice data to engine.")
object_groups = [] object_groups = []
if self._profile.getSettingValue("print_sequence") == "one_at_a_time": if self._profile.getSettingValue("print_sequence") == "one_at_a_time":
@ -221,10 +230,16 @@ class CuraEngineBackend(Backend):
self._socket.sendMessage(slice_message) self._socket.sendMessage(slice_message)
def _onSceneChanged(self, source): 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 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 return
self._onChanged() self._onChanged()
@ -327,6 +342,7 @@ class CuraEngineBackend(Backend):
if self._stored_layer_data: if self._stored_layer_data:
job = ProcessSlicedObjectListJob.ProcessSlicedObjectListJob(self._stored_layer_data) job = ProcessSlicedObjectListJob.ProcessSlicedObjectListJob(self._stored_layer_data)
job.start() job.start()
self._stored_layer_data = None
else: else:
self._layer_view_active = False self._layer_view_active = False
@ -346,3 +362,14 @@ class CuraEngineBackend(Backend):
setting = message.settings.add() setting = message.settings.add()
setting.name = key setting.name = key
setting.value = str(value).encode() 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 continue
except: except:
continue continue
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()) self._current_layer_mesh.addVertices(layer_mesh.getVertices())
# Scale layer color by a brightness factor based on the current layer number # 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. # This will result in a range of 0.5 - 1.0 to multiply colors by.
brightness = (2.0 - (i / self._solid_layers)) / 2.0 brightness = (2.0 - (i / self._solid_layers)) / 2.0
self._current_layer_mesh.addColors(layer_mesh.getColors() * brightness) if self._current_layer_mesh:
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:
renderer.queueNode(node, mesh = self._current_layer_mesh, material = self._material)
if not self._current_layer_jumps: if not self._current_layer_jumps:
self._current_layer_jumps = MeshData() 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.setIconName("save_sd")
self.setPriority(1) self.setPriority(1)
def requestWrite(self, node): def requestWrite(self, node, file_name = None):
gcode_writer = Application.getInstance().getMeshFileHandler().getWriterByMimeType("text/x-gcode") gcode_writer = Application.getInstance().getMeshFileHandler().getWriterByMimeType("text/x-gcode")
if not gcode_writer: if not gcode_writer:
Logger.log("e", "Could not find GCode writer, not writing to removable drive %s", self.getName()) Logger.log("e", "Could not find GCode writer, not writing to removable drive %s", self.getName())
raise OutputDeviceError.WriteRequestFailedError() raise OutputDeviceError.WriteRequestFailedError()
file_name = None if file_name == None:
for n in BreadthFirstIterator(node): for n in BreadthFirstIterator(node):
if n.getMeshData(): if n.getMeshData():
file_name = n.getName() file_name = n.getName()
if file_name: if file_name:
break break
if not file_name: if not file_name:
Logger.log("e", "Could not determine a proper file name when trying to write to %s, aborting", self.getName()) 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() raise NotImplementedError()
def ejectDevice(self, device): def ejectDevice(self, device):
result = self.performEjectDevice(device) try:
result = self.performEjectDevice(device)
except Exception as e:
result = False
if result: if result:
message = Message(catalog.i18nc("@info:status", "Ejected {0}. You can now safely remove the drive.").format(device.getName())) message = Message(catalog.i18nc("@info:status", "Ejected {0}. You can now safely remove the drive.").format(device.getName()))
message.show() message.show()

View File

@ -88,13 +88,10 @@ class WindowsRemovableDrivePlugin(RemovableDrivePlugin.RemovableDrivePlugin):
result = None result = None
# Then, try and tell it to eject # Then, try and tell it to eject
try: if not windll.kernel32.DeviceIoControl(handle, IOCTL_STORAGE_EJECT_MEDIA, None, None, None, None, None, None):
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:
result = False result = False
else:
result = True
# Finally, close the handle # Finally, close the handle
windll.kernel32.CloseHandle(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 = threading.Thread(target = self._pollEndStop)
self._end_stop_thread.deamon = True self._end_stop_thread.deamon = True
self._poll_endstop = -1
# Printer is connected # Printer is connected
self._is_connected = False self._is_connected = False
@ -63,7 +64,7 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
self._listen_thread.daemon = True self._listen_thread.daemon = True
self._update_firmware_thread = threading.Thread(target= self._updateFirmware) 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() self._heatup_wait_start_time = time.time()
@ -122,6 +123,7 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
progressChanged = pyqtSignal() progressChanged = pyqtSignal()
extruderTemperatureChanged = pyqtSignal() extruderTemperatureChanged = pyqtSignal()
bedTemperatureChanged = pyqtSignal() bedTemperatureChanged = pyqtSignal()
firmwareUpdateComplete = pyqtSignal()
endstopStateChanged = pyqtSignal(str ,bool, arguments = ["key","state"]) endstopStateChanged = pyqtSignal(str ,bool, arguments = ["key","state"])
@ -237,8 +239,9 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
@pyqtSlot() @pyqtSlot()
def startPollEndstop(self): def startPollEndstop(self):
self._poll_endstop = True if self._poll_endstop == -1:
self._end_stop_thread.start() self._poll_endstop = True
self._end_stop_thread.start()
@pyqtSlot() @pyqtSlot()
def stopPollEndstop(self): def stopPollEndstop(self):
@ -323,6 +326,7 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
## Close the printer connection ## Close the printer connection
def close(self): def close(self):
Logger.log("d", "Closing the printer connection.")
if self._connect_thread.isAlive(): if self._connect_thread.isAlive():
try: try:
self._connect_thread.join() self._connect_thread.join()
@ -345,7 +349,7 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
self._serial = None self._serial = None
def isConnected(self): def isConnected(self):
return self._is_connected return self._is_connected
@pyqtSlot(int) @pyqtSlot(int)
def heatupNozzle(self, temperature): def heatupNozzle(self, temperature):
@ -411,6 +415,7 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
def createControlInterface(self): def createControlInterface(self):
if self._control_view is None: 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")) path = QUrl.fromLocalFile(os.path.join(PluginRegistry.getInstance().getPluginPath("USBPrinting"), "ControlWindow.qml"))
component = QQmlComponent(Application.getInstance()._engine, path) component = QQmlComponent(Application.getInstance()._engine, path)
self._control_context = QQmlContext(Application.getInstance()._engine.rootContext()) self._control_context = QQmlContext(Application.getInstance()._engine.rootContext())
@ -455,7 +460,7 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
self._bed_temperature = temperature self._bed_temperature = temperature
self.bedTemperatureChanged.emit() self.bedTemperatureChanged.emit()
def requestWrite(self, node): def requestWrite(self, node, file_name = None):
self.showControlInterface() self.showControlInterface()
def _setEndstopState(self, endstop_key, value): def _setEndstopState(self, endstop_key, value):
@ -617,6 +622,6 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
def _onFirmwareUpdateComplete(self): def _onFirmwareUpdateComplete(self):
self._update_firmware_thread.join() self._update_firmware_thread.join()
self._update_firmware_thread = threading.Thread(target= self._updateFirmware) self._update_firmware_thread = threading.Thread(target= self._updateFirmware)
self._update_firmware_thread.deamon = True self._update_firmware_thread.daemon = True
self.connect() self.connect()

View File

@ -54,6 +54,15 @@ class USBPrinterManager(QObject, SignalEmitter, OutputDevicePlugin, Extension):
addConnectionSignal = Signal() addConnectionSignal = Signal()
printerConnectionStateChanged = pyqtSignal() 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): def start(self):
self._check_updates = True self._check_updates = True
self._update_thread.start() self._update_thread.start()
@ -84,12 +93,14 @@ class USBPrinterManager(QObject, SignalEmitter, OutputDevicePlugin, Extension):
self._firmware_view.show() self._firmware_view.show()
@pyqtSlot()
def updateAllFirmware(self): def updateAllFirmware(self):
self.spawnFirmwareInterface("") self.spawnFirmwareInterface("")
for printer_connection in self._printer_connections: for printer_connection in self._printer_connections:
try: try:
self._printer_connections[printer_connection].updateFirmware(Resources.getPath(CuraApplication.ResourceTypes.Firmware, self._getDefaultFirmwareName())) self._printer_connections[printer_connection].updateFirmware(Resources.getPath(CuraApplication.ResourceTypes.Firmware, self._getDefaultFirmwareName()))
except FileNotFoundError: except FileNotFoundError:
Logger.log("w", "No firmware found for printer %s", printer_connection)
continue continue
@pyqtSlot(str, result = bool) @pyqtSlot(str, result = bool)
@ -153,6 +164,7 @@ class USBPrinterManager(QObject, SignalEmitter, OutputDevicePlugin, Extension):
connection = PrinterConnection.PrinterConnection(serial_port) connection = PrinterConnection.PrinterConnection(serial_port)
connection.connect() connection.connect()
connection.connectionStateChanged.connect(self._onPrinterConnectionStateChanged) connection.connectionStateChanged.connect(self._onPrinterConnectionStateChanged)
connection.progressChanged.connect(self.progressChanged)
self._printer_connections[serial_port] = connection self._printer_connections[serial_port] = connection
def _onPrinterConnectionStateChanged(self, serial_port): 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/*") 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) 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", "id": "rigidbotbig",
"version": 1, "version": 1,
"name": "RigidBot", "name": "RigidBot",
"manufacturer": "Invent-A-Part", "manufacturer": "Other",
"author": "RBC", "author": "RBC",
"platform": "rigidbot_platform.stl", "platform": "rigidbot_platform.stl",
@ -18,6 +18,8 @@
"machine_nozzle_size": { "default": 0.4, "machine_nozzle_size": { "default": 0.4,
"visible": true "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_x": { "default": 0 },
"machine_head_shape_min_y": { "default": 0 }, "machine_head_shape_min_y": { "default": 0 },
"machine_head_shape_max_x": { "default": 0 }, "machine_head_shape_max_x": { "default": 0 },

View File

@ -2,7 +2,7 @@
"id": "rigidbotbig", "id": "rigidbotbig",
"version": 1, "version": 1,
"name": "RigidBotBig", "name": "RigidBotBig",
"manufacturer": "Invent-A-Part", "manufacturer": "Other",
"author": "RBC", "author": "RBC",
"platform": "rigidbotbig_platform.stl", "platform": "rigidbotbig_platform.stl",
@ -16,6 +16,8 @@
"machine_heated_bed": { "default": true }, "machine_heated_bed": { "default": true },
"machine_nozzle_size": { "default": 0.4}, "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_x": { "default": 0 },
"machine_head_shape_min_y": { "default": 0 }, "machine_head_shape_min_y": { "default": 0 },
"machine_head_shape_max_x": { "default": 0 }, "machine_head_shape_max_x": { "default": 0 },

View File

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

View File

@ -2,7 +2,7 @@
"id": "bq_witbox", "id": "bq_witbox",
"version": 1, "version": 1,
"name": "BQ Witbox", "name": "BQ Witbox",
"manufacturer": "BQ", "manufacturer": "Other",
"author": "BQ", "author": "BQ",
"platform": "witbox_platform.stl", "platform": "witbox_platform.stl",
"inherits": "fdmprinter.json", "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_head_distance": { "default": 3, "SEE_machine_extruder_trains": true },
"machine_nozzle_expansion_angle": { "default": 45, "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_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": { "machine_gcode_flavor": {
"default": "RepRap" "default": "RepRap"
}, },
@ -149,7 +151,6 @@
"default": 0.4, "default": 0.4,
"type": "float", "type": "float",
"visible": false, "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": { "children": {
"wall_line_width_0": { "wall_line_width_0": {
"label": "Outer Wall Line Width", "label": "Outer Wall Line Width",
@ -266,7 +267,7 @@
"default": 2, "default": 2,
"type": "int", "type": "int",
"visible": false, "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.", "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", "type": "boolean",
"default": false, "default": false,
"visible": false "visible": false,
"inherit": false
}, },
"top_bottom_thickness": { "top_bottom_thickness": {
"label": "Bottom/Top Thickness", "label": "Bottom/Top Thickness",
@ -301,7 +303,7 @@
"label": "Top Layers", "label": "Top Layers",
"description": "This controls the amount of top layers.", "description": "This controls the amount of top layers.",
"min_value": "0", "min_value": "0",
"default": 6, "default": 8,
"type": "int", "type": "int",
"visible": false, "visible": false,
"inherit_function": "0 if infill_sparse_density == 100 else math.ceil(parent_value / layer_height)" "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.", "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, "default": 0,
"type": "int", "type": "int",
"visible": false, "visible": false
"enabled": "top_bottom_pattern"
}, },
"xy_offset": { "xy_offset": {
"label": "Horizontal expansion", "label": "Horizontal expansion",
@ -454,7 +455,7 @@
"type": "float", "type": "float",
"default": 2, "default": 2,
"visible": false, "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" "zigzag": "Zig Zag"
}, },
"default": "grid", "default": "grid",
"inherit_function": "'lines' if parent_value > 25 else 'grid'" "inherit_function": "'lines' if infill_sparse_density > 25 else 'grid'"
}, },
"infill_overlap": { "infill_overlap": {
"label": "Infill Overlap", "label": "Infill Overlap",
@ -498,16 +499,7 @@
"type": "float", "type": "float",
"default": 0.1, "default": 0.1,
"visible": false, "visible": false,
"children": { "inherit_function": "layer_height"
"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)"
}
}
}, },
"infill_before_walls": { "infill_before_walls": {
"label": "Infill Before Walls", "label": "Infill Before Walls",
@ -523,6 +515,13 @@
"visible": true, "visible": true,
"icon": "category_material", "icon": "category_material",
"settings": { "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": { "material_print_temperature": {
"label": "Printing 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.", "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", "type": "float",
"default": 210, "default": 210,
"min_value": "0", "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" "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": { "material_bed_temperature": {
"label": "Bed Temperature", "label": "Bed Temperature",
"description": "The temperature used for the heated printer bed. Set at 0 to pre-heat it yourself.", "description": "The temperature used for the heated printer bed. Set at 0 to pre-heat it yourself.",
@ -777,18 +803,17 @@
"type": "float", "type": "float",
"min_value": "0.1", "min_value": "0.1",
"default": 15, "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, "visible": false,
"children": { "inherit_function": "speed_layer_0"
"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
}
}
}, },
"speed_slowdown_layers": { "speed_slowdown_layers": {
"label": "Amount of Slower Layers", "label": "Amount of Slower Layers",
@ -1340,7 +1365,7 @@
}, },
"skirt_line_count": { "skirt_line_count": {
"label": "Skirt Line Count", "label": "Skirt Line Count",
"description": "The skirt is a line drawn around the first layer of the. 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", "type": "int",
"default": 1, "default": 1,
"enabled": "adhesion_type == \"skirt\"" "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.", "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", "unit": "mm",
"type": "float", "type": "float",
"default": 0.22, "default": 0.35,
"enabled": "adhesion_type == \"raft\"" "enabled": "adhesion_type == \"raft\""
}, },
"raft_surface_layers": { "raft_surface_layers": {
"label": "Raft Surface Layers", "label": "Raft Top 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.", "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", "type": "int",
"default": 2, "default": 2,
"enabled": "adhesion_type == \"raft\"" "enabled": "adhesion_type == \"raft\""
}, },
"raft_surface_thickness": { "raft_surface_thickness": {
"label": "Raft Surface Thickness", "label": "Raft Top Layer Thickness",
"description": "Layer thickness of the surface raft layers.", "description": "Layer thickness of the top raft layers.",
"unit": "mm", "unit": "mm",
"type": "float", "type": "float",
"default": 0.1, "default": 0.1,
"enabled": "adhesion_type == \"raft\"" "enabled": "adhesion_type == \"raft\""
}, },
"raft_surface_line_width": { "raft_surface_line_width": {
"label": "Raft Surface Line Width", "label": "Raft Top 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.", "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", "unit": "mm",
"type": "float", "type": "float",
"default": 0.3, "default": 0.3,
"enabled": "adhesion_type == \"raft\"" "enabled": "adhesion_type == \"raft\""
}, },
"raft_surface_line_spacing": { "raft_surface_line_spacing": {
"label": "Raft Surface Spacing", "label": "Raft Top 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.", "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", "unit": "mm",
"type": "float", "type": "float",
"default": 0.3, "default": 0.3,
@ -1417,27 +1442,27 @@
"inherit_function": "raft_surface_line_width" "inherit_function": "raft_surface_line_width"
}, },
"raft_interface_thickness": { "raft_interface_thickness": {
"label": "Raft Interface Thickness", "label": "Raft Middle Thickness",
"description": "Layer thickness of the interface raft layer.", "description": "Layer thickness of the middle raft layer.",
"unit": "mm", "unit": "mm",
"type": "float", "type": "float",
"default": 0.27, "default": 0.27,
"enabled": "adhesion_type == \"raft\"" "enabled": "adhesion_type == \"raft\""
}, },
"raft_interface_line_width": { "raft_interface_line_width": {
"label": "Raft Interface Line Width", "label": "Raft Middle 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.", "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", "unit": "mm",
"type": "float", "type": "float",
"default": 1, "default": 1,
"enabled": "adhesion_type == \"raft\"" "enabled": "adhesion_type == \"raft\""
}, },
"raft_interface_line_spacing": { "raft_interface_line_spacing": {
"label": "Raft Interface Spacing", "label": "Raft Middle 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.", "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", "unit": "mm",
"type": "float", "type": "float",
"default": 2, "default": 1.0,
"enabled": "adhesion_type == \"raft\"" "enabled": "adhesion_type == \"raft\""
}, },
"raft_base_thickness": { "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.", "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", "unit": "mm",
"type": "float", "type": "float",
"default": 5, "default": 3.0,
"enabled": "adhesion_type == \"raft\"" "enabled": "adhesion_type == \"raft\""
}, },
"raft_speed": { "raft_speed": {

View File

@ -3,7 +3,7 @@
"version": 1, "version": 1,
"name": "German RepRap Neo", "name": "German RepRap Neo",
"manufacturer": "Other", "manufacturer": "Other",
"author": "other", "author": "Other",
"icon": "icon_ultimaker.png", "icon": "icon_ultimaker.png",
"platform": "grr_neo_platform.stl", "platform": "grr_neo_platform.stl",
@ -16,6 +16,8 @@
"machine_depth": { "default": 150 }, "machine_depth": { "default": 150 },
"machine_center_is_zero": { "default": false }, "machine_center_is_zero": { "default": false },
"machine_nozzle_size": { "default": 0.5 }, "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_x": { "default": 75 },
"machine_head_shape_min_y": { "default": 18 }, "machine_head_shape_min_y": { "default": 18 },
"machine_head_shape_max_x": { "default": 18 }, "machine_head_shape_max_x": { "default": 18 },

View File

@ -17,6 +17,8 @@
"machine_center_is_zero": { "default": false }, "machine_center_is_zero": { "default": false },
"machine_nozzle_size": { "default": 0.4 }, "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_x": { "default": 0 },
"machine_head_shape_min_y": { "default": 0 }, "machine_head_shape_min_y": { "default": 0 },
"machine_head_shape_max_x": { "default": 0 }, "machine_head_shape_max_x": { "default": 0 },

View File

@ -2,19 +2,22 @@
"id": "prusa_i3", "id": "prusa_i3",
"version": 1, "version": 1,
"name": "Prusa i3", "name": "Prusa i3",
"manufacturer": "Prusa", "manufacturer": "Other",
"author": "other", "author": "Other",
"icon": "icon_ultimaker2.png", "icon": "icon_ultimaker2.png",
"platform": "prusai3_platform.stl", "platform": "prusai3_platform.stl",
"inherits": "fdmprinter.json", "inherits": "fdmprinter.json",
"machine_settings": { "machine_settings": {
"machine_heated_bed": { "default": true },
"machine_width": { "default": 200 }, "machine_width": { "default": 200 },
"machine_height": { "default": 200 }, "machine_height": { "default": 200 },
"machine_depth": { "default": 200 }, "machine_depth": { "default": 200 },
"machine_center_is_zero": { "default": false }, "machine_center_is_zero": { "default": false },
"machine_nozzle_size": { "default": 0.4 }, "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_x": { "default": 75 },
"machine_head_shape_min_y": { "default": 18 }, "machine_head_shape_min_y": { "default": 18 },
"machine_head_shape_max_x": { "default": 18 }, "machine_head_shape_max_x": { "default": 18 },
@ -28,9 +31,5 @@
"machine_end_gcode": { "machine_end_gcode": {
"default": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" "default": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning"
} }
},
"overrides": {
"material_bed_temperature": { "visible": true }
} }
} }

View File

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

View File

@ -21,6 +21,12 @@
"machine_nozzle_size": { "machine_nozzle_size": {
"default": 0.4 "default": 0.4
}, },
"machine_nozzle_heat_up_speed": {
"default": 2.0
},
"machine_nozzle_cool_down_speed": {
"default": 2.0
},
"machine_nozzle_tip_outer_diameter": { "machine_nozzle_tip_outer_diameter": {
"default": 1 "default": 1
}, },
@ -41,6 +47,8 @@
"machine_depth": { "default": 205 }, "machine_depth": { "default": 205 },
"machine_center_is_zero": { "default": false }, "machine_center_is_zero": { "default": false },
"machine_nozzle_size": { "default": 0.4 }, "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": "machine_head_with_fans_polygon":
{ {
"default": [ "default": [
@ -71,10 +79,8 @@
}, },
"machine_end_gcode": { "machine_end_gcode": {
"default": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" "default": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning"
} },
},
"overrides": { "machine_extruder_drive_upgrade": { "default": false }
"material_bed_temperature": { "visible": false }
} }
} }

Binary file not shown.

Binary file not shown.

View File

@ -3,4 +3,4 @@ version = 1
name = High Quality name = High Quality
[settings] [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 Action
{ {
id:toggleFullScreenAction id:toggleFullScreenAction
shortcut: StandardKey.FullScreen;
text: catalog.i18nc("@action:inmenu","Toggle Fu&ll Screen"); text: catalog.i18nc("@action:inmenu","Toggle Fu&ll Screen");
iconName: "view-fullscreen"; iconName: "view-fullscreen";
} }
@ -137,7 +136,6 @@ Item
id: deleteObjectAction; id: deleteObjectAction;
text: catalog.i18nc("@action:inmenu","Delete Object"); text: catalog.i18nc("@action:inmenu","Delete Object");
iconName: "edit-delete"; iconName: "edit-delete";
shortcut: StandardKey.Backspace;
} }
Action Action
@ -182,6 +180,7 @@ Item
id: deleteAllAction; id: deleteAllAction;
text: catalog.i18nc("@action:inmenu","&Clear Build Platform"); text: catalog.i18nc("@action:inmenu","&Clear Build Platform");
iconName: "edit-delete"; iconName: "edit-delete";
shortcut: "Ctrl+D";
} }
Action Action
@ -216,5 +215,6 @@ Item
id: showEngineLogAction; id: showEngineLogAction;
text: catalog.i18nc("@action:inmenu","Show Engine &Log..."); text: catalog.i18nc("@action:inmenu","Show Engine &Log...");
iconName: "view-list-text"; iconName: "view-list-text";
shortcut: StandardKey.WhatsThis;
} }
} }

View File

@ -22,6 +22,19 @@ UM.MainWindow
id: backgroundItem; id: backgroundItem;
anchors.fill: parent; anchors.fill: parent;
UM.I18nCatalog{id: catalog; name:"cura"} 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 UM.ApplicationMenu
{ {
id: menu id: menu
@ -72,7 +85,7 @@ UM.MainWindow
text: catalog.i18nc("@action:inmenu", "&Save Selection to File"); text: catalog.i18nc("@action:inmenu", "&Save Selection to File");
enabled: UM.Selection.hasSelection; enabled: UM.Selection.hasSelection;
iconName: "document-save-as"; iconName: "document-save-as";
onTriggered: UM.OutputDeviceManager.requestWriteSelectionToDevice("local_file"); onTriggered: UM.OutputDeviceManager.requestWriteSelectionToDevice("local_file", Printer.jobName);
} }
Menu Menu
{ {
@ -88,7 +101,7 @@ UM.MainWindow
MenuItem MenuItem
{ {
text: model.description; text: model.description;
onTriggered: UM.OutputDeviceManager.requestWriteToDevice(model.id); onTriggered: UM.OutputDeviceManager.requestWriteToDevice(model.id, Printer.jobName);
} }
onObjectAdded: saveAllMenu.insertItem(index, object) onObjectAdded: saveAllMenu.insertItem(index, object)
onObjectRemoved: saveAllMenu.removeItem(object) onObjectRemoved: saveAllMenu.removeItem(object)
@ -139,10 +152,6 @@ UM.MainWindow
onObjectRemoved: top_view_menu.removeItem(object) onObjectRemoved: top_view_menu.removeItem(object)
} }
ExclusiveGroup { id: view_menu_top_group; } ExclusiveGroup { id: view_menu_top_group; }
MenuSeparator { }
MenuItem { action: actions.toggleFullScreen; }
} }
Menu Menu
{ {
@ -373,6 +382,7 @@ UM.MainWindow
{ {
id: viewModeButton id: viewModeButton
property bool verticalTooltip: true property bool verticalTooltip: true
anchors anchors
{ {
top: parent.top; top: parent.top;
@ -389,12 +399,13 @@ UM.MainWindow
id: viewMenu; id: viewMenu;
Instantiator Instantiator
{ {
id: viewMenuInstantiator
model: UM.ViewModel { } model: UM.ViewModel { }
MenuItem MenuItem
{ {
text: model.name; text: model.name
checkable: true; checkable: true;
checked: model.active; checked: model.active
exclusiveGroup: viewMenuGroup; exclusiveGroup: viewMenuGroup;
onTriggered: UM.Controller.setActiveView(model.id); onTriggered: UM.Controller.setActiveView(model.id);
} }
@ -413,7 +424,7 @@ UM.MainWindow
anchors { anchors {
left: parent.left left: parent.left
top: parent.top top: parent.top
topMargin: 74 topMargin: UM.Theme.sizes.window_margin.height + UM.Theme.sizes.button.height
//horizontalCenter: parent.horizontalCenter //horizontalCenter: parent.horizontalCenter
//horizontalCenterOffset: -(UM.Theme.sizes.sidebar.width / 2) //horizontalCenterOffset: -(UM.Theme.sizes.sidebar.width / 2)
//top: parent.top; //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. //; Remove & re-add the general page as we want to use our own instead of uranium standard.
removePage(0); 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 //: 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 //Force refresh
setPage(0) setPage(0)
} }
Item {
visible: false
GeneralPage
{
id: generalPage
}
ViewPage
{
id: viewPage
}
}
} }
Actions Actions
@ -543,8 +567,8 @@ UM.MainWindow
addMachine.onTriggered: addMachineWizard.visible = true; addMachine.onTriggered: addMachineWizard.visible = true;
preferences.onTriggered: preferences.visible = true; preferences.onTriggered: { preferences.visible = true; }
configureMachines.onTriggered: { preferences.visible = true; preferences.setPage(2); } configureMachines.onTriggered: { preferences.visible = true; preferences.setPage(3); }
manageProfiles.onTriggered: { preferences.visible = true; preferences.setPage(4); } manageProfiles.onTriggered: { preferences.visible = true; preferences.setPage(4); }
documentation.onTriggered: CuraActions.openDocumentation(); documentation.onTriggered: CuraActions.openDocumentation();
@ -621,6 +645,11 @@ UM.MainWindow
onAccepted: 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) UM.MeshFileHandler.readLocalFile(fileUrl)
openDialog.sendMeshName(fileUrl.toString()) openDialog.sendMeshName(fileUrl.toString())
} }
@ -648,14 +677,34 @@ UM.MainWindow
onRequestAddPrinter: onRequestAddPrinter:
{ {
addMachineWizard.visible = true addMachineWizard.visible = true
addMachineWizard.firstRun = true addMachineWizard.firstRun = false
} }
} }
Component.onCompleted: Component.onCompleted:
{ {
UM.Theme.load(UM.Resources.getPath(UM.Resources.Themes, "cura")) 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 import UM 1.1 as UM
Column{ Item{
id: base; id: base;
UM.I18nCatalog { id: catalog; name:"cura"} UM.I18nCatalog { id: catalog; name:"cura"}
property int totalHeightProfileSetup: childrenRect.height property int totalHeightProfileSetup: childrenRect.height
property Action manageProfilesAction property Action manageProfilesAction
spacing: 0
Rectangle{ Rectangle {
id: variantItem; id: variantRow
height: UM.Theme.sizes.sidebar_setup.height anchors.top: base.top
width: base.width width: base.width
visible: UM.MachineManager.hasVariants; height: UM.Theme.sizes.sidebar_setup.height
//visible: UM.MachineManager.hasVariants;
visible: true
Rectangle { Label{
id: variantRow id: variantLabel
width: base.width text: catalog.i18nc("@label","Variant:");
height: parent.heigth 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{ ToolButton {
id: variantLabel id: variantSelection
text: catalog.i18nc("@label","Variant:"); text: UM.MachineManager.activeMachineVariant
anchors.left: parent.left width: parent.width/100*55
anchors.leftMargin: UM.Theme.sizes.default_margin.width; height: UM.Theme.sizes.setting_control.height
anchors.verticalCenter: parent.verticalCenter tooltip: UM.MachineManager.activeMachineInstance;
width: parent.width/100*45 anchors.right: parent.right
font: UM.Theme.fonts.default; anchors.rightMargin: UM.Theme.sizes.default_margin.width
} anchors.verticalCenter: parent.verticalCenter
style: UM.Theme.styles.sidebar_header_button
ToolButton { menu: Menu
id: variantSelection {
text: UM.MachineManager.activeMachineVariant id: variantsSelectionMenu
width: parent.width/100*55 Instantiator
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
{ {
id: variantsSelectionMenu model: UM.MachineVariantsModel { }
Instantiator MenuItem
{ {
model: UM.MachineVariantsModel { } text: model.name;
MenuItem checkable: true;
{ checked: model.active;
text: model.name; exclusiveGroup: variantSelectionMenuGroup;
checkable: true; onTriggered: UM.MachineManager.setActiveMachineVariant(model.getItem(index).name)
checked: model.active;
exclusiveGroup: variantSelectionMenuGroup;
onTriggered: UM.MachineManager.setActiveMachineVariant(model.getItem(index).name)
}
} }
onObjectAdded: variantsSelectionMenu.insertItem(index, object)
ExclusiveGroup { id: variantSelectionMenuGroup; } onObjectRemoved: variantsSelectionMenu.removeItem(object)
} }
ExclusiveGroup { id: variantSelectionMenuGroup; }
} }
} }
} }
Rectangle{ Rectangle{
id: globalProfileRow; id: globalProfileRow;
anchors.top: UM.MachineManager.hasVariants ? variantRow.bottom : base.top
//anchors.top: variantRow.bottom
height: UM.Theme.sizes.sidebar_setup.height height: UM.Theme.sizes.sidebar_setup.height
width: base.width 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 { Connections {
target: openDialog target: openDialog
onHasMesh: { onHasMesh: {
base.fileBaseName = name if(base.fileBaseName == ''){
base.fileBaseName = name
base.createFileName()
}
}
}
onActivityChanged: {
if (activity == false){
base.fileBaseName = ''
base.createFileName() base.createFileName()
} }
} }
@ -62,7 +71,7 @@ Rectangle {
Rectangle{ Rectangle{
id: printJobRow id: printJobRow
implicitWidth: base.width; implicitWidth: base.width;
implicitHeight: UM.Theme.sizes.sidebar_header.height implicitHeight: UM.Theme.sizes.save_button_header.height
anchors.top: parent.top anchors.top: parent.top
color: UM.Theme.colors.sidebar_header_bar color: UM.Theme.colors.sidebar_header_bar
Label{ Label{
@ -83,6 +92,7 @@ Rectangle {
height: UM.Theme.sizes.sidebar_inputFields.height height: UM.Theme.sizes.sidebar_inputFields.height
property int unremovableSpacing: 5 property int unremovableSpacing: 5
text: '' text: ''
onTextChanged: Printer.setJobName(text)
onEditingFinished: { onEditingFinished: {
if (printJobTextfield.text != ''){ if (printJobTextfield.text != ''){
printJobTextfield.focus = false printJobTextfield.focus = false
@ -110,6 +120,7 @@ Rectangle {
implicitWidth: base.width implicitWidth: base.width
implicitHeight: UM.Theme.sizes.sidebar_specs_bar.height implicitHeight: UM.Theme.sizes.sidebar_specs_bar.height
anchors.top: printJobRow.bottom anchors.top: printJobRow.bottom
visible: base.progress > 0.99 && base.activity == true
Item{ Item{
id: time id: time
width: childrenRect.width; width: childrenRect.width;
@ -188,12 +199,23 @@ Rectangle {
text: UM.OutputDeviceManager.activeDeviceShortDescription text: UM.OutputDeviceManager.activeDeviceShortDescription
onClicked: onClicked:
{ {
UM.OutputDeviceManager.requestWriteToDevice(UM.OutputDeviceManager.activeDevice) UM.OutputDeviceManager.requestWriteToDevice(UM.OutputDeviceManager.activeDevice, Printer.jobName)
} }
style: ButtonStyle { style: ButtonStyle {
background: Rectangle { 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; } } Behavior on color { ColorAnimation { duration: 50; } }
width: { width: {
var w = 0; var w = 0;
@ -205,17 +227,17 @@ Rectangle {
saveToButton.resizedWidth = actualLabel.width + (UM.Theme.sizes.default_margin.width * 2) saveToButton.resizedWidth = actualLabel.width + (UM.Theme.sizes.default_margin.width * 2)
w = 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) { if(w < base.width * 0.55) {
w = base.width * 0.55; w = base.width * 0.55;
} }
return w; return w;
} }
Label { Label {
id: actualLabel id: actualLabel
opacity: control.enabled ? 1.0 : 0.4
//Behavior on opacity { NumberAnimation { duration: 50; } }
anchors.centerIn: parent anchors.centerIn: parent
color: UM.Theme.colors.load_save_button_text color: UM.Theme.colors.load_save_button_text
font: UM.Theme.fonts.default font: UM.Theme.fonts.default
text: control.text; text: control.text;
} }
@ -232,12 +254,22 @@ Rectangle {
anchors.rightMargin: UM.Theme.sizes.default_margin.width anchors.rightMargin: UM.Theme.sizes.default_margin.width
width: UM.Theme.sizes.save_button_save_to_button.height width: UM.Theme.sizes.save_button_save_to_button.height
height: 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]; //iconSource: UM.Theme.icons[UM.OutputDeviceManager.activeDeviceIconName];
style: ButtonStyle { style: ButtonStyle {
background: Rectangle { background: Rectangle {
id: deviceSelectionIcon 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; } } Behavior on color { ColorAnimation { duration: 50; } }
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: UM.Theme.sizes.save_button_text_margin.width / 2; anchors.leftMargin: UM.Theme.sizes.save_button_text_margin.width / 2;
@ -245,7 +277,6 @@ Rectangle {
height: parent.height height: parent.height
UM.RecolorImage { UM.RecolorImage {
id: lengthIcon
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
width: UM.Theme.sizes.standard_arrow.width width: UM.Theme.sizes.standard_arrow.width

View File

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

View File

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

View File

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

View File

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

View File

@ -19,79 +19,51 @@ UM.PreferencesPage
{ {
UM.Preferences.resetPreference("view/show_overhang"); UM.Preferences.resetPreference("view/show_overhang");
UM.Preferences.resetPreference("view/center_on_select"); 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"} UM.I18nCatalog { id: catalog; name:"cura"}
CheckBox
UM.TooltipArea
{ {
id: overhangCheckbox width: childrenRect.width;
checked: boolCheck(UM.Preferences.getValue("view/show_overhang")) height: childrenRect.height;
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
//: Display Overhang preference checkbox text: catalog.i18nc("@info:tooltip","Highlight unsupported areas of the model in red. Without support these areas will nog print properly.")
text: catalog.i18nc("@option:check","Display Overhang");
onClicked: overhangCheckbox.checked = !overhangCheckbox.checked
//: Display Overhang preference tooltip CheckBox
tooltip: catalog.i18nc("@info:tooltip","Highlight unsupported areas of the model in red. Without support these areas will not print properly.")
style: ButtonStyle
{ {
background: Rectangle id: overhangCheckbox
{
border.width: 0 checked: boolCheck(UM.Preferences.getValue("view/show_overhang"))
color: "transparent" onClicked: UM.Preferences.setValue("view/show_overhang", checked)
}
label: Text text: catalog.i18nc("@option:check","Display Overhang");
{
renderType: Text.NativeRendering
horizontalAlignment: Text.AlignLeft
text: control.text
}
} }
} }
CheckBox UM.TooltipArea {
{ width: childrenRect.width;
id: centerCheckbox height: childrenRect.height;
checked: boolCheck(UM.Preferences.getValue("view/center_on_select")) text: catalog.i18nc("@info:tooltip","Moves the camera so the object is in the center of the view when an object is selected")
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
//: Display Center camera preference checkbox 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
{ {
background: Rectangle id: centerCheckbox
{ text: catalog.i18nc("@action:button","Center camera when item is selected");
border.width: 0 checked: boolCheck(UM.Preferences.getValue("view/center_on_select"))
color: "transparent" onClicked: UM.Preferences.setValue("view/center_on_select", checked)
} }
label: Text }
{
renderType: Text.NativeRendering Connections {
horizontalAlignment: Text.AlignLeft target: UM.Preferences
text: control.text 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 text: model.name
onClicked: { onClicked: ListView.view.currentIndex = index;
ListView.view.currentIndex = index;
if(model.pages.length > 0) {
base.wizard.nextAvailable = true;
} else {
base.wizard.nextAvailable = false;
}
}
Label Label
{ {
@ -221,6 +214,7 @@ Item
base.wizard.appendPage(Qt.resolvedUrl("Bedleveling.qml"), catalog.i18nc("@title", "Bed Levelling")); base.wizard.appendPage(Qt.resolvedUrl("Bedleveling.qml"), catalog.i18nc("@title", "Bed Levelling"));
break; break;
default: default:
base.wizard.appendPage(Qt.resolvedUrl("%1.qml".arg(pages[i])), pages[i])
break; break;
} }
} }

View File

@ -15,6 +15,7 @@ Item
property bool three_point_leveling: true property bool three_point_leveling: true
property int platform_width: UM.MachineManager.getSettingValue("machine_width") property int platform_width: UM.MachineManager.getSettingValue("machine_width")
property int platform_height: UM.MachineManager.getSettingValue("machine_depth") property int platform_height: UM.MachineManager.getSettingValue("machine_depth")
property bool alreadyTested: base.addOriginalProgress.bedLeveling
anchors.fill: parent; anchors.fill: parent;
property variant printer_connection: UM.USBPrinterManager.connectedPrinterList.getItem(0).printer property variant printer_connection: UM.USBPrinterManager.connectedPrinterList.getItem(0).printer
Component.onCompleted: printer_connection.homeHead() Component.onCompleted: printer_connection.homeHead()
@ -40,7 +41,7 @@ Item
} }
Label Label
{ {
id: bedelevelingText id: bedlevelingText
anchors.top: pageDescription.bottom anchors.top: pageDescription.bottom
anchors.topMargin: UM.Theme.sizes.default_margin.height anchors.topMargin: UM.Theme.sizes.default_margin.height
width: parent.width width: parent.width
@ -49,47 +50,69 @@ Item
} }
Item{ Item{
anchors.top: bedelevelingText.bottom id: bedlevelingWrapper
anchors.top: bedlevelingText.bottom
anchors.topMargin: UM.Theme.sizes.default_margin.height anchors.topMargin: UM.Theme.sizes.default_margin.height
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
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 Button
{ {
id: bedelevelingButton id: bedlevelingButton
anchors.top: parent.top anchors.top: parent.top
anchors.left: parent.left anchors.left: parent.left
enabled: !alreadyTested
text: catalog.i18nc("@action:button","Move to Next Position"); text: catalog.i18nc("@action:button","Move to Next Position");
onClicked: onClicked:
{ {
if(wizardPage.leveling_state == 0) 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) 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) if(wizardPage.leveling_state == 2)
{ {
printer_connection.moveHead(0, 0 ,0) printer_connection.moveHead(0, 0, 0)
} }
wizardPage.leveling_state++ 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 Button
{ {
id: skipBedlevelingButton 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.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 anchors.leftMargin: parent.width < wizardPage.width ? UM.Theme.sizes.default_margin.width : 0
text: catalog.i18nc("@action:button","Skip Bedleveling"); text: catalog.i18nc("@action:button","Skip Bedleveling");
onClicked: base.visible = false; 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) function threePointLeveling(width, height)
{ {

View File

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

View File

@ -14,24 +14,51 @@ Item
property int leftRow: wizardPage.width*0.40 property int leftRow: wizardPage.width*0.40
property int rightRow: wizardPage.width*0.60 property int rightRow: wizardPage.width*0.60
anchors.fill: parent; anchors.fill: parent;
property bool alreadyTested: base.addOriginalProgress.checkUp[base.addOriginalProgress.checkUp.length-1]
property bool x_min_pressed: false property bool x_min_pressed: false
property bool y_min_pressed: false property bool y_min_pressed: false
property bool z_min_pressed: false property bool z_min_pressed: false
property bool heater_works: false property bool heater_works: false
property int extruder_target_temp: 0 property int extruder_target_temp: 0
property int bed_target_temp: 0 property int bed_target_temp: 0
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"} 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: Component.onCompleted:
{ {
if (printer_connection != null) if (printer_connection != null){
printer_connection.startPollEndstop() printer_connection.startPollEndstop()
}
} }
Component.onDestruction: Component.onDestruction:
{ {
if (printer_connection != null) if (printer_connection != null){
printer_connection.stopPollEndstop() printer_connection.stopPollEndstop()
}
} }
Label Label
{ {
@ -64,11 +91,12 @@ Item
id: startCheckButton id: startCheckButton
anchors.top: parent.top anchors.top: parent.top
anchors.left: parent.left anchors.left: parent.left
enabled: !alreadyTested
text: catalog.i18nc("@action:button","Start Printer Check"); text: catalog.i18nc("@action:button","Start Printer Check");
enabled: manager.progress >= 100;
onClicked: { onClicked: {
checkupContent.visible = true checkupContent.visible = true
startCheckButton.enabled = false 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.topMargin: parent.width < wizardPage.width ? 0 : UM.Theme.sizes.default_margin.height/2
anchors.left: parent.width < wizardPage.width ? startCheckButton.right : parent.left anchors.left: parent.width < wizardPage.width ? startCheckButton.right : parent.left
anchors.leftMargin: parent.width < wizardPage.width ? UM.Theme.sizes.default_margin.width : 0 anchors.leftMargin: parent.width < wizardPage.width ? UM.Theme.sizes.default_margin.width : 0
enabled: !alreadyTested
text: catalog.i18nc("@action:button","Skip Printer Check"); text: catalog.i18nc("@action:button","Skip Printer Check");
enabled: manager.progress >= 100;
onClicked: { onClicked: {
base.currentPage += 1 base.currentPage += 1
} }
@ -91,7 +119,7 @@ Item
id: checkupContent id: checkupContent
anchors.top: startStopButtons.bottom anchors.top: startStopButtons.bottom
anchors.topMargin: UM.Theme.sizes.default_margin.height anchors.topMargin: UM.Theme.sizes.default_margin.height
visible: false visible: alreadyTested
////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////
Label Label
{ {
@ -109,7 +137,7 @@ Item
anchors.left: connectionLabel.right anchors.left: connectionLabel.right
anchors.top: parent.top anchors.top: parent.top
wrapMode: Text.WordWrap 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 Label
@ -128,7 +156,7 @@ Item
anchors.left: endstopXLabel.right anchors.left: endstopXLabel.right
anchors.top: connectionLabel.bottom anchors.top: connectionLabel.bottom
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
text: x_min_pressed ? 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 Label
@ -147,7 +175,7 @@ Item
anchors.left: endstopYLabel.right anchors.left: endstopYLabel.right
anchors.top: endstopXLabel.bottom anchors.top: endstopXLabel.bottom
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
text: y_min_pressed ? 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 Label
@ -166,7 +194,7 @@ Item
anchors.left: endstopZLabel.right anchors.left: endstopZLabel.right
anchors.top: endstopYLabel.bottom anchors.top: endstopYLabel.bottom
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
text: z_min_pressed ? 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 Label
@ -205,9 +233,14 @@ Item
{ {
if(printer_connection != null) if(printer_connection != null)
{ {
heater_status_label.text = catalog.i18nc("@info:progress","Checking") if (alreadyTested){
printer_connection.heatupNozzle(190) nozzleTempStatus.text = catalog.i18nc("@info:status","Works")
wizardPage.extruder_target_temp = 190 }
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) if(printer_connection != null)
{ {
bedTempStatus.text = catalog.i18nc("@info:progress","Checking") if (alreadyTested){
printer_connection.heatupBed(60) bedTempStatus.text = catalog.i18nc("@info:status","Works")
wizardPage.bed_target_temp = 60 }
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" text: printer_connection != null ? printer_connection.bedTemperature + "°C": "0°C"
font.bold: true 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") if(key == "x_min")
{ {
base.addOriginalProgress.checkUp[1] = true
x_min_pressed = true x_min_pressed = true
checkTotalCheckUp()
} }
if(key == "y_min") if(key == "y_min")
{ {
base.addOriginalProgress.checkUp[2] = true
y_min_pressed = true y_min_pressed = true
checkTotalCheckUp()
} }
if(key == "z_min") if(key == "z_min")
{ {
base.addOriginalProgress.checkUp[3] = true
z_min_pressed = true z_min_pressed = true
checkTotalCheckUp()
} }
} }
onExtruderTemperatureChanged: onExtruderTemperatureChanged:
{ {
if(printer_connection.extruderTemperature > wizardPage.extruder_target_temp - 10 && printer_connection.extruderTemperature < wizardPage.extruder_target_temp + 10) if(printer_connection.extruderTemperature > wizardPage.extruder_target_temp - 10 && printer_connection.extruderTemperature < wizardPage.extruder_target_temp + 10)
{ {
if(printer_connection != null) 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) 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) 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) printer_connection.heatupBed(0)
} }
} }

View File

@ -14,6 +14,7 @@ Item
SystemPalette{id: palette} SystemPalette{id: palette}
UM.I18nCatalog { id: catalog; name:"cura"} UM.I18nCatalog { id: catalog; name:"cura"}
property variant printer_connection: UM.USBPrinterManager.connectedPrinterList.rowCount() != 0 ? UM.USBPrinterManager.connectedPrinterList.getItem(0).printer : null
Label Label
{ {
id: pageTitle id: pageTitle
@ -61,6 +62,7 @@ Item
anchors.top: parent.top anchors.top: parent.top
anchors.left: parent.left anchors.left: parent.left
text: catalog.i18nc("@action:button","Upgrade to Marlin Firmware"); text: catalog.i18nc("@action:button","Upgrade to Marlin Firmware");
onClicked: UM.USBPrinterManager.updateAllFirmware()
} }
Button { Button {
id: skipUpgradeButton 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; elide: Text.ElideRight;
anchors.left: parent.left; anchors.left: parent.left;
anchors.leftMargin: UM.Theme.sizes.setting_unit_margin.width anchors.leftMargin: UM.Theme.sizes.setting_unit_margin.width
anchors.right: downArrow.left; anchors.right: separationLine.left;
anchors.rightMargin: UM.Theme.sizes.setting_unit_margin.width
anchors.verticalCenter: parent.verticalCenter; anchors.verticalCenter: parent.verticalCenter;
font: UM.Theme.fonts.default font: UM.Theme.fonts.default
} }
Rectangle{ Rectangle{
id: separationLine
width: 1 width: 1
height: UM.Theme.sizes.setting_control.height height: UM.Theme.sizes.setting_control.height
color: UM.Theme.colors.setting_control_border color: UM.Theme.colors.setting_control_border
anchors.right: sidebarComboBoxLabel.right anchors.right: downArrow.left
anchors.rightMargin: UM.Theme.sizes.setting_unit_margin.width anchors.rightMargin: UM.Theme.sizes.setting_unit_margin.width + downArrow.width/2
anchors.top: parent.top anchors.top: parent.top
z: parent.z + 1 z: parent.z + 1
} }
@ -57,11 +57,11 @@ QtObject {
ButtonStyle { ButtonStyle {
background: Item{ background: Item{
implicitWidth: UM.Theme.sizes.button.width; implicitWidth: UM.Theme.sizes.button.width;
implicitHeight: UM.Theme.sizes.button.width; implicitHeight: UM.Theme.sizes.button.height;
Rectangle { Rectangle {
anchors.left: parent.right anchors.left: parent.right
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
color: "white" color: UM.Theme.colors.button_text
width: control.hovered ? openFileLabel.width : 0; width: control.hovered ? openFileLabel.width : 0;
height: openFileLabel.height height: openFileLabel.height
Behavior on width { NumberAnimation { duration: 100; } } Behavior on width { NumberAnimation { duration: 100; } }
@ -87,7 +87,7 @@ QtObject {
source: control.iconSource; source: control.iconSource;
width: UM.Theme.sizes.button_icon.width; width: UM.Theme.sizes.button_icon.width;
height: UM.Theme.sizes.button_icon.height; 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; id: buttonFace;
anchors.fill: parent; anchors.fill: parent;
property bool down: control.pressed || (control.checkable && control.checked); property bool down: control.pressed || (control.checkable && control.checked);
color: { color: {
if(!control.enabled) { if(control.checkable && control.checked && control.hovered) {
return UM.Theme.colors.button_disabled;
} else if(control.checkable && control.checked && control.hovered) {
return UM.Theme.colors.button_active_hover; return UM.Theme.colors.button_active_hover;
} else if(control.pressed || (control.checkable && control.checked)) { } else if(control.pressed || (control.checkable && control.checked)) {
return UM.Theme.colors.button_active; return UM.Theme.colors.button_active;
@ -159,6 +156,7 @@ QtObject {
Label { Label {
id: tool_button_arrow id: tool_button_arrow
opacity: !control.enabled ? 0.4 : 1.0
anchors.right: parent.right; anchors.right: parent.right;
anchors.rightMargin: (UM.Theme.sizes.button.width - UM.Theme.sizes.button_icon.width - tool_button_arrow.width) / 2 anchors.rightMargin: (UM.Theme.sizes.button.width - UM.Theme.sizes.button_icon.width - tool_button_arrow.width) / 2
anchors.verticalCenter: parent.verticalCenter; anchors.verticalCenter: parent.verticalCenter;
@ -173,12 +171,12 @@ QtObject {
label: Item { label: Item {
Image { Image {
anchors.centerIn: parent; anchors.centerIn: parent;
opacity: !control.enabled ? 0.4 : 1.0
source: control.iconSource; source: control.iconSource;
width: UM.Theme.sizes.button_icon.width; width: UM.Theme.sizes.button_icon.width;
height: UM.Theme.sizes.button_icon.height; 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; width: UM.Theme.sizes.button_icon.width;
height: UM.Theme.sizes.button_icon.height; 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 minimumPointSize: 8
} }
UM.RecolorImage { UM.RecolorImage {
id: lengthIcon id: category_arrow
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right 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 width: UM.Theme.sizes.standard_arrow.width
height: UM.Theme.sizes.standard_arrow.height height: UM.Theme.sizes.standard_arrow.height
sourceSize.width: width sourceSize.width: width

View File

@ -32,10 +32,11 @@
"capitalize": true, "capitalize": true,
"family": "Roboto" "family": "Roboto"
}, },
"timeslider_time": { "default_header": {
"size": 1.0, "size": 1.0,
"bold": true, "bold": true,
"family": "Roboto" "family": "Roboto",
"letterSpacing": 2.0
}, },
"button_tooltip": { "button_tooltip": {
"size": 0.75, "size": 0.75,
@ -71,7 +72,7 @@
"button_active": [32, 166, 219, 255], "button_active": [32, 166, 219, 255],
"button_active_hover": [77, 184, 226, 255], "button_active_hover": [77, 184, 226, 255],
"button_text": [255, 255, 255, 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], "button_tooltip_text": [35, 35, 35, 255],
"toggle_active": [255, 255, 255, 255], "toggle_active": [255, 255, 255, 255],
@ -82,7 +83,8 @@
"load_save_button": [0, 0, 0, 255], "load_save_button": [0, 0, 0, 255],
"load_save_button_text": [255, 255, 255, 255], "load_save_button_text": [255, 255, 255, 255],
"load_save_button_hover": [43, 45, 46, 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_background": [245, 245, 245, 255],
"scrollbar_handle": [12, 159, 227, 255], "scrollbar_handle": [12, 159, 227, 255],
@ -91,15 +93,16 @@
"setting_category": [238, 238, 238, 255], "setting_category": [238, 238, 238, 255],
"setting_category_disabled": [238, 238, 238, 255], "setting_category_disabled": [238, 238, 238, 255],
"setting_category_hover": [240, 248, 255, 255], "setting_category_hover": [231, 231, 231, 255],
"setting_category_active": [238, 238, 238, 255], "setting_category_active": [240, 248, 255, 255],
"setting_category_active_hover": [240, 248, 255, 255], "setting_category_active_hover": [233, 244, 245, 255],
"setting_category_text": [35, 35, 35, 255], "setting_category_text": [35, 35, 35, 255],
"setting_control": [255, 255, 255, 255], "setting_control": [255, 255, 255, 255],
"setting_control_highlight": [245, 245, 245, 255], "setting_control_highlight": [245, 245, 245, 255],
"setting_control_border": [174, 174, 174, 255], "setting_control_border": [174, 174, 174, 255],
"setting_control_text": [0, 0, 0, 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_hover": [139, 143, 153, 255],
"setting_control_selected": [35, 35, 35, 255], "setting_control_selected": [35, 35, 35, 255],
"setting_control_revert": [85, 85, 85, 255], "setting_control_revert": [85, 85, 85, 255],
@ -126,16 +129,6 @@
"tooltip": [255, 225, 146, 255], "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_background": [255, 255, 255, 255],
"message_text": [32, 166, 219, 255], "message_text": [32, 166, 219, 255],
"message_dismiss": [139, 143, 153, 255], "message_dismiss": [139, 143, 153, 255],
@ -147,40 +140,39 @@
}, },
"sizes": { "sizes": {
"window_margin": [2.0, 2.0], "window_margin": [1.5, 1.5],
"default_margin": [1.0, 1.0], "default_margin": [1.0, 1.0],
"default_lining": [0.1, 0.1], "default_lining": [0.1, 0.1],
"logo": [9.5, 2.0], "logo": [9.5, 2.0],
"toolbar_button": [2.0, 2.0],
"toolbar_spacing": [1.0, 1.0],
"loadfile_button": [11.0, 2.4], "sidebar": [26.0, 10.0],
"loadfile_margin": [0.8, 0.4], "sidebar_header": [0.0, 3.8],
"sidebar_header_mode_toggle": [0.0, 2.4],
"sidebar": [27.0, 10.0], "sidebar_setup": [0.0, 2.6],
"sidebar_header": [0.0, 3.2],
"sidebar_setup": [0.0, 2.8],
"sidebar_subParts": [0.0, 2.4], "sidebar_subParts": [0.0, 2.4],
"sidebar_specs_bar": [0.0, 2.2], "sidebar_specs_bar": [0.0, 2.2],
"sidebar_inputFields": [0.0, 1.9], "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": [0.0, 2.0],
"section_icon": [1.2, 1.2], "section_icon": [1.6, 1.6],
"section_icon_column": [2.8, 0.0], "section_icon_column": [2.8, 0.0],
"setting": [21.0, 1.8], "setting": [21.0, 1.8],
"setting_control": [6.0, 2.0], "setting_control": [7.0, 2.0],
"setting_control_margin": [3.0, 3.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_unit_margin": [0.5, 0.5],
"setting_text_maxwidth": [40.0, 0.0], "setting_text_maxwidth": [40.0, 0.0],
"simple_mode_infill_caption": [0.0, 5.0],
"standard_list_lineheight": [1.5, 1.5], "standard_list_lineheight": [1.5, 1.5],
"standard_list_input": [20.0, 25.0], "standard_list_input": [20.0, 25.0],
"standard_arrow": [0.6, 0.6], "standard_arrow": [0.6, 0.6],
"button": [3.2, 3.2], "button": [3.8, 3.8],
"button_icon": [2.5, 2.5], "button_icon": [2.6, 2.6],
"progressbar": [26.0, 0.8], "progressbar": [26.0, 0.8],
"progressbar_control": [8.0, 0.8], "progressbar_control": [8.0, 0.8],
@ -201,6 +193,7 @@
"tooltip_margins": [1.0, 1.0], "tooltip_margins": [1.0, 1.0],
"save_button_border": [0.06, 0.06], "save_button_border": [0.06, 0.06],
"save_button_header": [0.0, 3.2],
"save_button_text_margin": [0.3, 0.6], "save_button_text_margin": [0.3, 0.6],
"save_button_slicing_bar": [0.0, 2.2], "save_button_slicing_bar": [0.0, 2.2],
"save_button_label_margin": [0.5, 0.5], "save_button_label_margin": [0.5, 0.5],