mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-08-14 05:45:55 +08:00
Merge branch 'master' of https://github.com/Ultimaker/Cura
This commit is contained in:
commit
e524d028d7
@ -66,3 +66,4 @@ else()
|
||||
install(DIRECTORY cura DESTINATION lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages)
|
||||
endif()
|
||||
|
||||
include(CPackConfig.cmake)
|
||||
|
16
CPackConfig.cmake
Normal file
16
CPackConfig.cmake
Normal 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)
|
@ -13,7 +13,7 @@ Use [this](https://github.com/Ultimaker/Uranium/wiki/Bug-Reporting-Template) tem
|
||||
For crashes and similar issues, please attach the following information:
|
||||
|
||||
* (On Windows) The log as produced by dxdiag (start -> run -> dxdiag -> save output)
|
||||
* The Cura GUI log file, located at (Windows) $User/AppData/Local/cura/cura.log, (OSX) $User/.cura/cura.log
|
||||
* The Cura GUI log file, located at (Windows) $User/AppData/Local/cura/cura.log, (OSX) $User/.cura/cura.log, (Ubuntu) $USER/.local/share/cura
|
||||
* The Cura Engine log, using Help -> Show Engine Log
|
||||
|
||||
Dependencies
|
||||
|
@ -8,5 +8,6 @@ TryExec=/usr/bin/cura_app.py
|
||||
Icon=/usr/share/cura/resources/images/cura-icon.png
|
||||
Terminal=false
|
||||
Type=Application
|
||||
MimeType=application/sla
|
||||
Categories=Graphics;
|
||||
Keywords=3D;Printing;
|
||||
|
@ -8,9 +8,15 @@ from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QVBoxLayout, QLabel, QTex
|
||||
from UM.i18n import i18nCatalog
|
||||
catalog = i18nCatalog("cura")
|
||||
|
||||
def show(type, value, tb):
|
||||
if not hasattr(sys, "frozen"):
|
||||
traceback.print_exception(type, value, tb)
|
||||
def show(exception_type, value, tb):
|
||||
debug_mode = False
|
||||
if QCoreApplication.instance():
|
||||
debug_mode = QCoreApplication.instance().getCommandLineOption("debug-mode", False)
|
||||
|
||||
traceback.print_exception(exception_type, value, tb)
|
||||
|
||||
if not debug_mode:
|
||||
return
|
||||
|
||||
application = QCoreApplication.instance()
|
||||
if not application:
|
||||
@ -34,7 +40,7 @@ def show(type, value, tb):
|
||||
except:
|
||||
version = "Unknown"
|
||||
|
||||
trace = "".join(traceback.format_exception(type, value, tb))
|
||||
trace = "".join(traceback.format_exception(exception_type, value, tb))
|
||||
|
||||
crash_info = "Version: {0}\nPlatform: {1}\nQt: {2}\nPyQt: {3}\n\nException:\n{4}"
|
||||
crash_info = crash_info.format(version, platform.platform(), QT_VERSION_STR, PYQT_VERSION_STR, trace)
|
||||
@ -44,7 +50,7 @@ def show(type, value, tb):
|
||||
buttons = QDialogButtonBox(QDialogButtonBox.Close, dialog)
|
||||
layout.addWidget(buttons)
|
||||
buttons.addButton(catalog.i18nc("@action:button", "Open Web Page"), QDialogButtonBox.HelpRole)
|
||||
buttons.rejected.connect(lambda: dialog.close())
|
||||
buttons.rejected.connect(dialog.close)
|
||||
buttons.helpRequested.connect(lambda: webbrowser.open("http://github.com/Ultimaker/Cura/issues"))
|
||||
|
||||
dialog.exec_()
|
||||
|
@ -44,6 +44,7 @@ from . import CameraAnimation
|
||||
from . import PrintInformation
|
||||
from . import CuraActions
|
||||
from . import MultiMaterialDecorator
|
||||
from . import ZOffsetDecorator
|
||||
|
||||
from PyQt5.QtCore import pyqtSlot, QUrl, Qt, pyqtSignal, pyqtProperty, QEvent, Q_ENUMS
|
||||
from PyQt5.QtGui import QColor, QIcon
|
||||
@ -68,7 +69,7 @@ class CuraApplication(QtApplication):
|
||||
if not hasattr(sys, "frozen"):
|
||||
Resources.addSearchPath(os.path.join(os.path.abspath(os.path.dirname(__file__)), ".."))
|
||||
|
||||
super().__init__(name = "cura", version = "15.09.82")
|
||||
super().__init__(name = "cura", version = "master")
|
||||
|
||||
self.setWindowIcon(QIcon(Resources.getPath(Resources.Images, "cura-icon.png")))
|
||||
|
||||
@ -90,6 +91,7 @@ class CuraApplication(QtApplication):
|
||||
self._i18n_catalog = None
|
||||
self._previous_active_tool = None
|
||||
self._platform_activity = False
|
||||
self._job_name = None
|
||||
|
||||
self.getMachineManager().activeMachineInstanceChanged.connect(self._onActiveMachineChanged)
|
||||
self.getMachineManager().addMachineRequested.connect(self._onAddMachineRequested)
|
||||
@ -131,6 +133,7 @@ class CuraApplication(QtApplication):
|
||||
def addCommandLineOptions(self, parser):
|
||||
super().addCommandLineOptions(parser)
|
||||
parser.add_argument("file", nargs="*", help="Files to load after starting the application.")
|
||||
parser.add_argument("--debug", dest="debug-mode", action="store_true", default=False, help="Enable detailed crash reports.")
|
||||
|
||||
def run(self):
|
||||
self._i18n_catalog = i18nCatalog("cura");
|
||||
@ -165,25 +168,21 @@ class CuraApplication(QtApplication):
|
||||
self._physics = PlatformPhysics.PlatformPhysics(controller, self._volume)
|
||||
|
||||
camera = Camera("3d", root)
|
||||
camera.setPosition(Vector(-150, 150, 300))
|
||||
camera.setPosition(Vector(0, 250, 900))
|
||||
camera.setPerspective(True)
|
||||
camera.lookAt(Vector(0, 0, 0))
|
||||
controller.getScene().setActiveCamera("3d")
|
||||
|
||||
self.getController().getTool("CameraTool").setOrigin(Vector(0, 100, 0))
|
||||
|
||||
self._camera_animation = CameraAnimation.CameraAnimation()
|
||||
self._camera_animation.setCameraTool(self.getController().getTool("CameraTool"))
|
||||
|
||||
controller.getScene().setActiveCamera("3d")
|
||||
|
||||
self.showSplashMessage(self._i18n_catalog.i18nc("@info:progress", "Loading interface..."))
|
||||
|
||||
self.setMainQml(Resources.getPath(self.ResourceTypes.QmlFiles, "Cura.qml"))
|
||||
self.initializeEngine()
|
||||
|
||||
manager = self.getMachineManager()
|
||||
if not self.getMachineManager().getMachineInstances():
|
||||
self.requestAddPrinter.emit()
|
||||
|
||||
|
||||
if self._engine.rootObjects:
|
||||
self.closeSplash()
|
||||
|
||||
@ -248,19 +247,30 @@ class CuraApplication(QtApplication):
|
||||
self._platform_activity = True if count > 0 else False
|
||||
self.activityChanged.emit()
|
||||
|
||||
@pyqtSlot(str)
|
||||
def setJobName(self, name):
|
||||
if self._job_name != name:
|
||||
self._job_name = name
|
||||
self.jobNameChanged.emit()
|
||||
|
||||
jobNameChanged = pyqtSignal()
|
||||
@pyqtProperty(str, notify = jobNameChanged)
|
||||
def jobName(self):
|
||||
return self._job_name
|
||||
|
||||
## Remove an object from the scene
|
||||
@pyqtSlot("quint64")
|
||||
def deleteObject(self, object_id):
|
||||
object = self.getController().getScene().findObject(object_id)
|
||||
node = self.getController().getScene().findObject(object_id)
|
||||
|
||||
if not object and object_id != 0: #Workaround for tool handles overlapping the selected object
|
||||
object = Selection.getSelectedObject(0)
|
||||
|
||||
if object:
|
||||
if object.getParent():
|
||||
group_node = object.getParent()
|
||||
if not node and object_id != 0: #Workaround for tool handles overlapping the selected object
|
||||
node = Selection.getSelectedObject(0)
|
||||
|
||||
if node:
|
||||
if node.getParent():
|
||||
group_node = node.getParent()
|
||||
if not group_node.callDecoration("isGroup"):
|
||||
op = RemoveSceneNodeOperation(object)
|
||||
op = RemoveSceneNodeOperation(node)
|
||||
else:
|
||||
while group_node.getParent().callDecoration("isGroup"):
|
||||
group_node = group_node.getParent()
|
||||
@ -294,10 +304,15 @@ class CuraApplication(QtApplication):
|
||||
@pyqtSlot("quint64")
|
||||
def centerObject(self, object_id):
|
||||
node = self.getController().getScene().findObject(object_id)
|
||||
if node.getParent() and node.getParent().callDecoration("isGroup"):
|
||||
node = node.getParent()
|
||||
if not node and object_id != 0: #Workaround for tool handles overlapping the selected object
|
||||
node = Selection.getSelectedObject(0)
|
||||
|
||||
if not node:
|
||||
return
|
||||
|
||||
if node.getParent() and node.getParent().callDecoration("isGroup"):
|
||||
node = node.getParent()
|
||||
|
||||
if node:
|
||||
op = SetTransformOperation(node, Vector())
|
||||
op.push()
|
||||
@ -335,14 +350,12 @@ class CuraApplication(QtApplication):
|
||||
continue #Grouped nodes don't need resetting as their parent (the group) is resetted)
|
||||
|
||||
nodes.append(node)
|
||||
|
||||
if nodes:
|
||||
op = GroupedOperation()
|
||||
for node in nodes:
|
||||
# Ensure that the object is above the build platform
|
||||
move_distance = node.getBoundingBox().center.y
|
||||
if move_distance <= 0:
|
||||
move_distance = -node.getBoundingBox().bottom
|
||||
op.addOperation(SetTransformOperation(node, Vector(0,move_distance,0)))
|
||||
node.removeDecorator(ZOffsetDecorator.ZOffsetDecorator)
|
||||
op.addOperation(SetTransformOperation(node, Vector(0,0,0)))
|
||||
|
||||
op.push()
|
||||
|
||||
@ -364,10 +377,8 @@ class CuraApplication(QtApplication):
|
||||
|
||||
for node in nodes:
|
||||
# Ensure that the object is above the build platform
|
||||
move_distance = node.getBoundingBox().center.y
|
||||
if move_distance <= 0:
|
||||
move_distance = -node.getBoundingBox().bottom
|
||||
op.addOperation(SetTransformOperation(node, Vector(0,move_distance,0), Quaternion(), Vector(1, 1, 1)))
|
||||
node.removeDecorator(ZOffsetDecorator.ZOffsetDecorator)
|
||||
op.addOperation(SetTransformOperation(node, Vector(0,0,0), Quaternion(), Vector(1, 1, 1)))
|
||||
|
||||
op.push()
|
||||
|
||||
@ -464,17 +475,20 @@ class CuraApplication(QtApplication):
|
||||
group_decorator = GroupDecorator()
|
||||
group_node.addDecorator(group_decorator)
|
||||
group_node.setParent(self.getController().getScene().getRoot())
|
||||
|
||||
center = Selection.getSelectionCenter()
|
||||
group_node.setPosition(center)
|
||||
group_node.setCenterPosition(center)
|
||||
|
||||
for node in Selection.getAllSelectedObjects():
|
||||
world = node.getWorldPosition()
|
||||
node.setParent(group_node)
|
||||
group_node.setCenterPosition(group_node.getBoundingBox().center)
|
||||
#group_node.translate(Vector(0,group_node.getBoundingBox().center.y,0))
|
||||
group_node.translate(group_node.getBoundingBox().center)
|
||||
node.setPosition(world - center)
|
||||
|
||||
for node in group_node.getChildren():
|
||||
Selection.remove(node)
|
||||
|
||||
|
||||
Selection.add(group_node)
|
||||
|
||||
|
||||
@pyqtSlot()
|
||||
def ungroupSelected(self):
|
||||
ungrouped_nodes = []
|
||||
@ -485,12 +499,11 @@ class CuraApplication(QtApplication):
|
||||
for child in node.getChildren():
|
||||
if type(child) is SceneNode:
|
||||
children_to_move.append(child)
|
||||
|
||||
|
||||
for child in children_to_move:
|
||||
position = child.getWorldPosition()
|
||||
child.setParent(node.getParent())
|
||||
print(node.getPosition())
|
||||
child.translate(node.getPosition())
|
||||
child.setPosition(child.getPosition().scale(node.getScale()))
|
||||
child.setPosition(position - node.getParent().getWorldPosition())
|
||||
child.scale(node.getScale())
|
||||
child.rotate(node.getOrientation())
|
||||
|
||||
@ -536,6 +549,8 @@ class CuraApplication(QtApplication):
|
||||
op = AddSceneNodeOperation(node, self.getController().getScene().getRoot())
|
||||
op.push()
|
||||
|
||||
self.getController().getScene().sceneChanged.emit(node) #Force scene change.
|
||||
|
||||
def _onJobFinished(self, job):
|
||||
if type(job) is not ReadMeshJob or not job.getResult():
|
||||
return
|
||||
|
@ -107,7 +107,7 @@ class Layer():
|
||||
def build(self, offset, vertices, colors, indices):
|
||||
result = offset
|
||||
for polygon in self._polygons:
|
||||
if polygon._type == Polygon.InfillType or polygon._type == Polygon.SupportInfillType or polygon.type == Polygon.MoveCombingType or polygon.type == Polygon.MoveRetractionType:
|
||||
if polygon.type == Polygon.InfillType or polygon.type == Polygon.MoveCombingType or polygon.type == Polygon.MoveRetractionType:
|
||||
continue
|
||||
|
||||
polygon.build(result, vertices, colors, indices)
|
||||
@ -238,7 +238,7 @@ class Polygon():
|
||||
elif self._type == self.MoveCombingType:
|
||||
return Color(0.0, 0.0, 1.0, 1.0)
|
||||
elif self._type == self.MoveRetractionType:
|
||||
return Color(0.0, 1.0, 1.0, 1.0)
|
||||
return Color(0.5, 0.5, 1.0, 1.0)
|
||||
else:
|
||||
return Color(1.0, 1.0, 1.0, 1.0)
|
||||
|
||||
|
@ -17,6 +17,7 @@ from cura.ConvexHullDecorator import ConvexHullDecorator
|
||||
|
||||
from . import PlatformPhysicsOperation
|
||||
from . import ConvexHullJob
|
||||
from . import ZOffsetDecorator
|
||||
|
||||
import time
|
||||
import threading
|
||||
@ -69,8 +70,12 @@ class PlatformPhysics:
|
||||
# Move it downwards if bottom is above platform
|
||||
move_vector = Vector()
|
||||
if not (node.getParent() and node.getParent().callDecoration("isGroup")): #If an object is grouped, don't move it down
|
||||
z_offset = node.callDecoration("getZOffset") if node.getDecorator(ZOffsetDecorator.ZOffsetDecorator) else 0
|
||||
if bbox.bottom > 0:
|
||||
move_vector.setY(-bbox.bottom)
|
||||
move_vector.setY(-bbox.bottom + z_offset)
|
||||
elif bbox.bottom < z_offset:
|
||||
move_vector.setY((-bbox.bottom) - z_offset)
|
||||
|
||||
#if not Float.fuzzyCompare(bbox.bottom, 0.0):
|
||||
# pass#move_vector.setY(-bbox.bottom)
|
||||
|
||||
@ -127,8 +132,8 @@ class PlatformPhysics:
|
||||
|
||||
if overlap is None:
|
||||
continue
|
||||
move_vector.setX(overlap[0] * 1.01)
|
||||
move_vector.setZ(overlap[1] * 1.01)
|
||||
move_vector.setX(overlap[0] * 1.1)
|
||||
move_vector.setZ(overlap[1] * 1.1)
|
||||
convex_hull = node.callDecoration("getConvexHull")
|
||||
if convex_hull:
|
||||
if not convex_hull.isValid():
|
||||
@ -149,5 +154,16 @@ class PlatformPhysics:
|
||||
self._enabled = False
|
||||
|
||||
def _onToolOperationStopped(self, tool):
|
||||
if tool.getPluginId() == "TranslateTool":
|
||||
for node in Selection.getAllSelectedObjects():
|
||||
if node.getBoundingBox().bottom < 0:
|
||||
if not node.getDecorator(ZOffsetDecorator.ZOffsetDecorator):
|
||||
node.addDecorator(ZOffsetDecorator.ZOffsetDecorator())
|
||||
|
||||
node.callDecoration("setZOffset", node.getBoundingBox().bottom)
|
||||
else:
|
||||
if node.getDecorator(ZOffsetDecorator.ZOffsetDecorator):
|
||||
node.removeDecorator(ZOffsetDecorator.ZOffsetDecorator)
|
||||
|
||||
self._enabled = True
|
||||
self._onChangeTimerFinished()
|
||||
|
13
cura/ZOffsetDecorator.py
Normal file
13
cura/ZOffsetDecorator.py
Normal 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
|
@ -13,5 +13,12 @@ sys.excepthook = exceptHook
|
||||
|
||||
import cura.CuraApplication
|
||||
|
||||
if sys.platform == "win32" and hasattr(sys, "frozen"):
|
||||
import os
|
||||
dirpath = os.path.expanduser("~/AppData/Local/cura/")
|
||||
os.makedirs(dirpath, exist_ok = True)
|
||||
sys.stdout = open(os.path.join(dirpath, "stdout.log"), "w")
|
||||
sys.stderr = open(os.path.join(dirpath, "stderr.log"), "w")
|
||||
|
||||
app = cura.CuraApplication.CuraApplication.getInstance()
|
||||
app.run()
|
||||
|
@ -42,6 +42,10 @@ class ThreeMFReader(MeshReader):
|
||||
|
||||
# There can be multiple objects, try to load all of them.
|
||||
objects = root.findall("./3mf:resources/3mf:object", self._namespaces)
|
||||
if len(objects) == 0:
|
||||
Logger.log("w", "No objects found in 3MF file %s, either the file is corrupt or you are using an outdated format", file_name)
|
||||
return None
|
||||
|
||||
for object in objects:
|
||||
mesh = MeshData()
|
||||
node = SceneNode()
|
||||
@ -53,18 +57,17 @@ class ThreeMFReader(MeshReader):
|
||||
triangles = object.findall(".//3mf:triangle", self._namespaces)
|
||||
|
||||
mesh.reserveFaceCount(len(triangles))
|
||||
|
||||
|
||||
#for triangle in object.mesh.triangles.triangle:
|
||||
for triangle in triangles:
|
||||
v1 = int(triangle.get("v1"))
|
||||
v2 = int(triangle.get("v2"))
|
||||
v3 = int(triangle.get("v3"))
|
||||
mesh.addFace(vertex_list[v1][0],vertex_list[v1][2],vertex_list[v1][1],vertex_list[v2][0],vertex_list[v2][2],vertex_list[v2][1],vertex_list[v3][0],vertex_list[v3][2],vertex_list[v3][1])
|
||||
#TODO: We currently do not check for normals and simply recalculate them.
|
||||
mesh.addFace(vertex_list[v1][0],vertex_list[v1][1],vertex_list[v1][2],vertex_list[v2][0],vertex_list[v2][1],vertex_list[v2][2],vertex_list[v3][0],vertex_list[v3][1],vertex_list[v3][2])
|
||||
#TODO: We currently do not check for normals and simply recalculate them.
|
||||
mesh.calculateNormals()
|
||||
node.setMeshData(mesh)
|
||||
node.setSelectable(True)
|
||||
Logger.log("d", "Loaded a mesh with %s vertices", mesh.getVertexCount())
|
||||
|
||||
transformation = root.findall("./3mf:build/3mf:item[@objectid='{0}']".format(object.get("id")), self._namespaces)
|
||||
if transformation:
|
||||
@ -89,18 +92,18 @@ class ThreeMFReader(MeshReader):
|
||||
temp_mat._data[0,2] = splitted_transformation[6]
|
||||
temp_mat._data[1,2] = splitted_transformation[7]
|
||||
temp_mat._data[2,2] = splitted_transformation[8]
|
||||
|
||||
|
||||
# Translation
|
||||
temp_mat._data[0,3] = splitted_transformation[9]
|
||||
temp_mat._data[1,3] = splitted_transformation[10]
|
||||
temp_mat._data[2,3] = splitted_transformation[11]
|
||||
|
||||
|
||||
node.setPosition(Vector(temp_mat.at(0,3), temp_mat.at(1,3), temp_mat.at(2,3)))
|
||||
|
||||
|
||||
temp_quaternion = Quaternion()
|
||||
temp_quaternion.setByMatrix(temp_mat)
|
||||
node.setOrientation(temp_quaternion)
|
||||
|
||||
|
||||
# Magical scale extraction
|
||||
S2 = temp_mat.getTransposed().multiply(temp_mat)
|
||||
scale_x = math.sqrt(S2.at(0,0))
|
||||
|
@ -31,6 +31,7 @@ class ChangeLog(Extension, QObject,):
|
||||
self._change_logs = None
|
||||
Application.getInstance().engineCreatedSignal.connect(self._onEngineCreated)
|
||||
Preferences.getInstance().addPreference("general/latest_version_changelog_shown", "15.05.90") #First version of CURA with uranium
|
||||
self.addMenuItem(catalog.i18nc("@item:inmenu", "Show Changelog"), self.showChangelog)
|
||||
#self.showChangelog()
|
||||
|
||||
def getChangeLogs(self):
|
||||
@ -77,8 +78,8 @@ class ChangeLog(Extension, QObject,):
|
||||
def _onEngineCreated(self):
|
||||
if not self._version:
|
||||
return #We're on dev branch.
|
||||
if self._version > Preferences.getInstance().getValue("general/latest_version_changelog_shown"):
|
||||
self.showChangelog()
|
||||
#if self._version > Preferences.getInstance().getValue("general/latest_version_changelog_shown"):
|
||||
#self.showChangelog()
|
||||
|
||||
def showChangelog(self):
|
||||
if not self._changelog_window:
|
||||
|
@ -9,7 +9,7 @@ catalog = i18nCatalog("cura")
|
||||
def getMetaData():
|
||||
return {
|
||||
"plugin": {
|
||||
"name": catalog.i18nc("@label", "Change Log"),
|
||||
"name": catalog.i18nc("@label", "Changelog"),
|
||||
"author": "Ultimaker",
|
||||
"version": "1.0",
|
||||
"description": catalog.i18nc("@info:whatsthis", "Shows changes since latest checked version"),
|
||||
|
@ -77,12 +77,20 @@ class CuraEngineBackend(Backend):
|
||||
self._message = None
|
||||
|
||||
self.backendConnected.connect(self._onBackendConnected)
|
||||
Application.getInstance().getController().toolOperationStarted.connect(self._onToolOperationStarted)
|
||||
Application.getInstance().getController().toolOperationStopped.connect(self._onToolOperationStopped)
|
||||
|
||||
Application.getInstance().getMachineManager().activeMachineInstanceChanged.connect(self._onInstanceChanged)
|
||||
|
||||
## Get the command that is used to call the engine.
|
||||
# This is usefull for debugging and used to actually start the engine
|
||||
# \return list of commands and args / parameters.
|
||||
def getEngineCommand(self):
|
||||
return [Preferences.getInstance().getValue("backend/location"), "connect", "127.0.0.1:{0}".format(self._port), "-j", Resources.getPath(Resources.MachineDefinitions, "fdmprinter.json"), "-vv"]
|
||||
active_machine = Application.getInstance().getMachineManager().getActiveMachineInstance()
|
||||
if not active_machine:
|
||||
return None
|
||||
|
||||
return [Preferences.getInstance().getValue("backend/location"), "connect", "127.0.0.1:{0}".format(self._port), "-j", active_machine.getMachineDefinition().getPath(), "-vv"]
|
||||
|
||||
## Emitted when we get a message containing print duration and material amount. This also implies the slicing has finished.
|
||||
# \param time The amount of time the print will take.
|
||||
@ -123,6 +131,7 @@ class CuraEngineBackend(Backend):
|
||||
pass
|
||||
self.slicingCancelled.emit()
|
||||
return
|
||||
|
||||
Logger.log("d", "Preparing to send slice data to engine.")
|
||||
object_groups = []
|
||||
if self._profile.getSettingValue("print_sequence") == "one_at_a_time":
|
||||
@ -221,10 +230,16 @@ class CuraEngineBackend(Backend):
|
||||
self._socket.sendMessage(slice_message)
|
||||
|
||||
def _onSceneChanged(self, source):
|
||||
if (type(source) is not SceneNode) or (source is self._scene.getRoot()) or (source.getMeshData() is None):
|
||||
if type(source) is not SceneNode:
|
||||
return
|
||||
|
||||
if(source.getMeshData().getVertices() is None):
|
||||
if source is self._scene.getRoot():
|
||||
return
|
||||
|
||||
if source.getMeshData() is None:
|
||||
return
|
||||
|
||||
if source.getMeshData().getVertices() is None:
|
||||
return
|
||||
|
||||
self._onChanged()
|
||||
@ -327,6 +342,7 @@ class CuraEngineBackend(Backend):
|
||||
if self._stored_layer_data:
|
||||
job = ProcessSlicedObjectListJob.ProcessSlicedObjectListJob(self._stored_layer_data)
|
||||
job.start()
|
||||
self._stored_layer_data = None
|
||||
else:
|
||||
self._layer_view_active = False
|
||||
|
||||
@ -346,3 +362,14 @@ class CuraEngineBackend(Backend):
|
||||
setting = message.settings.add()
|
||||
setting.name = key
|
||||
setting.value = str(value).encode()
|
||||
|
||||
def _onInstanceChanged(self):
|
||||
self._slicing = False
|
||||
self._restart = True
|
||||
if self._process is not None:
|
||||
Logger.log("d", "Killing engine process")
|
||||
try:
|
||||
self._process.terminate()
|
||||
except: # terminating a process that is already terminating causes an exception, silently ignore this.
|
||||
pass
|
||||
self.slicingCancelled.emit()
|
||||
|
@ -102,15 +102,16 @@ class LayerView(View):
|
||||
continue
|
||||
except:
|
||||
continue
|
||||
|
||||
self._current_layer_mesh.addVertices(layer_mesh.getVertices())
|
||||
if self._current_layer_mesh: #Threading thing; Switching between views can cause the current layer mesh to be deleted.
|
||||
self._current_layer_mesh.addVertices(layer_mesh.getVertices())
|
||||
|
||||
# Scale layer color by a brightness factor based on the current layer number
|
||||
# This will result in a range of 0.5 - 1.0 to multiply colors by.
|
||||
brightness = (2.0 - (i / self._solid_layers)) / 2.0
|
||||
self._current_layer_mesh.addColors(layer_mesh.getColors() * brightness)
|
||||
|
||||
renderer.queueNode(node, mesh = self._current_layer_mesh, material = self._material)
|
||||
if self._current_layer_mesh:
|
||||
self._current_layer_mesh.addColors(layer_mesh.getColors() * brightness)
|
||||
if self._current_layer_mesh:
|
||||
renderer.queueNode(node, mesh = self._current_layer_mesh, material = self._material)
|
||||
|
||||
if not self._current_layer_jumps:
|
||||
self._current_layer_jumps = MeshData()
|
||||
|
109
plugins/PerObjectSettingsTool/PerObjectSettingsModel.py
Normal file
109
plugins/PerObjectSettingsTool/PerObjectSettingsModel.py
Normal 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)
|
||||
})
|
352
plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml
Normal file
352
plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml
Normal 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; }
|
||||
}
|
18
plugins/PerObjectSettingsTool/PerObjectSettingsTool.py
Normal file
18
plugins/PerObjectSettingsTool/PerObjectSettingsTool.py
Normal 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()
|
102
plugins/PerObjectSettingsTool/SettingOverrideModel.py
Normal file
102
plugins/PerObjectSettingsTool/SettingOverrideModel.py
Normal 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))
|
27
plugins/PerObjectSettingsTool/__init__.py
Normal file
27
plugins/PerObjectSettingsTool/__init__.py
Normal 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() }
|
@ -22,18 +22,18 @@ class RemovableDriveOutputDevice(OutputDevice):
|
||||
self.setIconName("save_sd")
|
||||
self.setPriority(1)
|
||||
|
||||
def requestWrite(self, node):
|
||||
def requestWrite(self, node, file_name = None):
|
||||
gcode_writer = Application.getInstance().getMeshFileHandler().getWriterByMimeType("text/x-gcode")
|
||||
if not gcode_writer:
|
||||
Logger.log("e", "Could not find GCode writer, not writing to removable drive %s", self.getName())
|
||||
raise OutputDeviceError.WriteRequestFailedError()
|
||||
|
||||
file_name = None
|
||||
for n in BreadthFirstIterator(node):
|
||||
if n.getMeshData():
|
||||
file_name = n.getName()
|
||||
if file_name:
|
||||
break
|
||||
if file_name == None:
|
||||
for n in BreadthFirstIterator(node):
|
||||
if n.getMeshData():
|
||||
file_name = n.getName()
|
||||
if file_name:
|
||||
break
|
||||
|
||||
if not file_name:
|
||||
Logger.log("e", "Could not determine a proper file name when trying to write to %s, aborting", self.getName())
|
||||
|
@ -37,7 +37,11 @@ class RemovableDrivePlugin(OutputDevicePlugin):
|
||||
raise NotImplementedError()
|
||||
|
||||
def ejectDevice(self, device):
|
||||
result = self.performEjectDevice(device)
|
||||
try:
|
||||
result = self.performEjectDevice(device)
|
||||
except Exception as e:
|
||||
result = False
|
||||
|
||||
if result:
|
||||
message = Message(catalog.i18nc("@info:status", "Ejected {0}. You can now safely remove the drive.").format(device.getName()))
|
||||
message.show()
|
||||
|
@ -88,13 +88,10 @@ class WindowsRemovableDrivePlugin(RemovableDrivePlugin.RemovableDrivePlugin):
|
||||
|
||||
result = None
|
||||
# Then, try and tell it to eject
|
||||
try:
|
||||
if not windll.kernel32.DeviceIoControl(handle, IOCTL_STORAGE_EJECT_MEDIA, None, None, None, None, None, None):
|
||||
result = False
|
||||
else:
|
||||
result = True
|
||||
except Exception as e:
|
||||
if not windll.kernel32.DeviceIoControl(handle, IOCTL_STORAGE_EJECT_MEDIA, None, None, None, None, None, None):
|
||||
result = False
|
||||
else:
|
||||
result = True
|
||||
|
||||
# Finally, close the handle
|
||||
windll.kernel32.CloseHandle(handle)
|
||||
|
@ -46,6 +46,7 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
|
||||
|
||||
self._end_stop_thread = threading.Thread(target = self._pollEndStop)
|
||||
self._end_stop_thread.deamon = True
|
||||
self._poll_endstop = -1
|
||||
|
||||
# Printer is connected
|
||||
self._is_connected = False
|
||||
@ -63,7 +64,7 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
|
||||
self._listen_thread.daemon = True
|
||||
|
||||
self._update_firmware_thread = threading.Thread(target= self._updateFirmware)
|
||||
self._update_firmware_thread.deamon = True
|
||||
self._update_firmware_thread.daemon = True
|
||||
|
||||
self._heatup_wait_start_time = time.time()
|
||||
|
||||
@ -122,6 +123,7 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
|
||||
progressChanged = pyqtSignal()
|
||||
extruderTemperatureChanged = pyqtSignal()
|
||||
bedTemperatureChanged = pyqtSignal()
|
||||
firmwareUpdateComplete = pyqtSignal()
|
||||
|
||||
endstopStateChanged = pyqtSignal(str ,bool, arguments = ["key","state"])
|
||||
|
||||
@ -237,8 +239,9 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
|
||||
|
||||
@pyqtSlot()
|
||||
def startPollEndstop(self):
|
||||
self._poll_endstop = True
|
||||
self._end_stop_thread.start()
|
||||
if self._poll_endstop == -1:
|
||||
self._poll_endstop = True
|
||||
self._end_stop_thread.start()
|
||||
|
||||
@pyqtSlot()
|
||||
def stopPollEndstop(self):
|
||||
@ -323,6 +326,7 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
|
||||
|
||||
## Close the printer connection
|
||||
def close(self):
|
||||
Logger.log("d", "Closing the printer connection.")
|
||||
if self._connect_thread.isAlive():
|
||||
try:
|
||||
self._connect_thread.join()
|
||||
@ -345,7 +349,7 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
|
||||
self._serial = None
|
||||
|
||||
def isConnected(self):
|
||||
return self._is_connected
|
||||
return self._is_connected
|
||||
|
||||
@pyqtSlot(int)
|
||||
def heatupNozzle(self, temperature):
|
||||
@ -411,6 +415,7 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
|
||||
|
||||
def createControlInterface(self):
|
||||
if self._control_view is None:
|
||||
Logger.log("d", "Creating control interface for printer connection")
|
||||
path = QUrl.fromLocalFile(os.path.join(PluginRegistry.getInstance().getPluginPath("USBPrinting"), "ControlWindow.qml"))
|
||||
component = QQmlComponent(Application.getInstance()._engine, path)
|
||||
self._control_context = QQmlContext(Application.getInstance()._engine.rootContext())
|
||||
@ -455,7 +460,7 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
|
||||
self._bed_temperature = temperature
|
||||
self.bedTemperatureChanged.emit()
|
||||
|
||||
def requestWrite(self, node):
|
||||
def requestWrite(self, node, file_name = None):
|
||||
self.showControlInterface()
|
||||
|
||||
def _setEndstopState(self, endstop_key, value):
|
||||
@ -617,6 +622,6 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter):
|
||||
def _onFirmwareUpdateComplete(self):
|
||||
self._update_firmware_thread.join()
|
||||
self._update_firmware_thread = threading.Thread(target= self._updateFirmware)
|
||||
self._update_firmware_thread.deamon = True
|
||||
self._update_firmware_thread.daemon = True
|
||||
|
||||
self.connect()
|
||||
|
@ -54,6 +54,15 @@ class USBPrinterManager(QObject, SignalEmitter, OutputDevicePlugin, Extension):
|
||||
addConnectionSignal = Signal()
|
||||
printerConnectionStateChanged = pyqtSignal()
|
||||
|
||||
progressChanged = pyqtSignal()
|
||||
@pyqtProperty(float, notify = progressChanged)
|
||||
def progress(self):
|
||||
progress = 0
|
||||
for name, connection in self._printer_connections.items():
|
||||
progress += connection.progress
|
||||
|
||||
return progress / len(self._printer_connections)
|
||||
|
||||
def start(self):
|
||||
self._check_updates = True
|
||||
self._update_thread.start()
|
||||
@ -84,12 +93,14 @@ class USBPrinterManager(QObject, SignalEmitter, OutputDevicePlugin, Extension):
|
||||
|
||||
self._firmware_view.show()
|
||||
|
||||
@pyqtSlot()
|
||||
def updateAllFirmware(self):
|
||||
self.spawnFirmwareInterface("")
|
||||
for printer_connection in self._printer_connections:
|
||||
try:
|
||||
self._printer_connections[printer_connection].updateFirmware(Resources.getPath(CuraApplication.ResourceTypes.Firmware, self._getDefaultFirmwareName()))
|
||||
except FileNotFoundError:
|
||||
Logger.log("w", "No firmware found for printer %s", printer_connection)
|
||||
continue
|
||||
|
||||
@pyqtSlot(str, result = bool)
|
||||
@ -153,6 +164,7 @@ class USBPrinterManager(QObject, SignalEmitter, OutputDevicePlugin, Extension):
|
||||
connection = PrinterConnection.PrinterConnection(serial_port)
|
||||
connection.connect()
|
||||
connection.connectionStateChanged.connect(self._onPrinterConnectionStateChanged)
|
||||
connection.progressChanged.connect(self.progressChanged)
|
||||
self._printer_connections[serial_port] = connection
|
||||
|
||||
def _onPrinterConnectionStateChanged(self, serial_port):
|
||||
@ -196,4 +208,4 @@ class USBPrinterManager(QObject, SignalEmitter, OutputDevicePlugin, Extension):
|
||||
base_list = base_list + glob.glob("/dev/ttyUSB*") + glob.glob("/dev/ttyACM*") + glob.glob("/dev/cu.*") + glob.glob("/dev/tty.usb*") + glob.glob("/dev/rfcomm*") + glob.glob("/dev/serial/by-id/*")
|
||||
return list(base_list)
|
||||
|
||||
_instance = None
|
||||
_instance = None
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.6 KiB |
@ -2,7 +2,7 @@
|
||||
"id": "rigidbotbig",
|
||||
"version": 1,
|
||||
"name": "RigidBot",
|
||||
"manufacturer": "Invent-A-Part",
|
||||
"manufacturer": "Other",
|
||||
"author": "RBC",
|
||||
"platform": "rigidbot_platform.stl",
|
||||
|
||||
@ -18,6 +18,8 @@
|
||||
"machine_nozzle_size": { "default": 0.4,
|
||||
"visible": true
|
||||
},
|
||||
"machine_nozzle_heat_up_speed": { "default": 2.0 },
|
||||
"machine_nozzle_cool_down_speed": { "default": 2.0 },
|
||||
"machine_head_shape_min_x": { "default": 0 },
|
||||
"machine_head_shape_min_y": { "default": 0 },
|
||||
"machine_head_shape_max_x": { "default": 0 },
|
||||
|
@ -2,7 +2,7 @@
|
||||
"id": "rigidbotbig",
|
||||
"version": 1,
|
||||
"name": "RigidBotBig",
|
||||
"manufacturer": "Invent-A-Part",
|
||||
"manufacturer": "Other",
|
||||
"author": "RBC",
|
||||
"platform": "rigidbotbig_platform.stl",
|
||||
|
||||
@ -16,6 +16,8 @@
|
||||
"machine_heated_bed": { "default": true },
|
||||
|
||||
"machine_nozzle_size": { "default": 0.4},
|
||||
"machine_nozzle_heat_up_speed": { "default": 2.0 },
|
||||
"machine_nozzle_cool_down_speed": { "default": 2.0 },
|
||||
"machine_head_shape_min_x": { "default": 0 },
|
||||
"machine_head_shape_min_y": { "default": 0 },
|
||||
"machine_head_shape_max_x": { "default": 0 },
|
||||
|
@ -2,7 +2,7 @@
|
||||
"id": "bq_hephestos",
|
||||
"version": 1,
|
||||
"name": "BQ Prusa i3 Hephestos",
|
||||
"manufacturer": "BQ",
|
||||
"manufacturer": "Other",
|
||||
"author": "BQ",
|
||||
"platform": "hephestos_platform.stl",
|
||||
"inherits": "fdmprinter.json",
|
||||
|
71
resources/machines/bq_hephestos_2.json
Normal file
71
resources/machines/bq_hephestos_2.json
Normal 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 }
|
||||
}
|
||||
}
|
@ -2,7 +2,7 @@
|
||||
"id": "bq_hephestos_xl",
|
||||
"version": 1,
|
||||
"name": "BQ Prusa i3 Hephestos XL",
|
||||
"manufacturer": "BQ",
|
||||
"manufacturer": "Other",
|
||||
"author": "BQ",
|
||||
"platform": "hephestos_platform.stl",
|
||||
"inherits": "fdmprinter.json",
|
||||
|
@ -2,7 +2,7 @@
|
||||
"id": "bq_witbox",
|
||||
"version": 1,
|
||||
"name": "BQ Witbox",
|
||||
"manufacturer": "BQ",
|
||||
"manufacturer": "Other",
|
||||
"author": "BQ",
|
||||
"platform": "witbox_platform.stl",
|
||||
"inherits": "fdmprinter.json",
|
||||
|
71
resources/machines/bq_witbox_2.json
Normal file
71
resources/machines/bq_witbox_2.json
Normal 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 }
|
||||
}
|
||||
}
|
240
resources/machines/dual_extrusion_printer.json
Normal file
240
resources/machines/dual_extrusion_printer.json
Normal 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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -38,6 +38,8 @@
|
||||
"machine_nozzle_head_distance": { "default": 3, "SEE_machine_extruder_trains": true },
|
||||
"machine_nozzle_expansion_angle": { "default": 45, "SEE_machine_extruder_trains": true },
|
||||
"machine_heat_zone_length": { "default": 16, "SEE_machine_extruder_trains": true },
|
||||
"machine_nozzle_heat_up_speed": { "default": 2.0, "SEE_machine_extruder_trains": true },
|
||||
"machine_nozzle_cool_down_speed": { "default": 2.0, "SEE_machine_extruder_trains": true },
|
||||
"machine_gcode_flavor": {
|
||||
"default": "RepRap"
|
||||
},
|
||||
@ -149,7 +151,6 @@
|
||||
"default": 0.4,
|
||||
"type": "float",
|
||||
"visible": false,
|
||||
"inherit_function": "max(machine_nozzle_size, (wall_thickness / (int(wall_thickness / (machine_nozzle_size - 0.0001) + 1))) if (wall_thickness / (int(wall_thickness / (machine_nozzle_size - 0.0001))) > machine_nozzle_size * 1.5) else (wall_thickness / int(wall_thickness / (machine_nozzle_size - 0.0001))))",
|
||||
"children": {
|
||||
"wall_line_width_0": {
|
||||
"label": "Outer Wall Line Width",
|
||||
@ -266,7 +267,7 @@
|
||||
"default": 2,
|
||||
"type": "int",
|
||||
"visible": false,
|
||||
"inherit_function": "max(1, (int(parent_value / (machine_nozzle_size - 0.0001) + 1) if (parent_value / max(1, int(parent_value / (machine_nozzle_size - 0.0001))) > machine_nozzle_size) * 1.5 else int(parent_value / (machine_nozzle_size - 0.0001))))"
|
||||
"inherit_function": "max(1, round((wall_thickness - wall_line_width_0) / wall_line_width_x) + 1)"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -275,7 +276,8 @@
|
||||
"description": "Make an extra wall at every second layer, so that infill will be caught between an extra wall above and one below. This results in a better cohesion between infill and walls, but might have an impact on the surface quality.",
|
||||
"type": "boolean",
|
||||
"default": false,
|
||||
"visible": false
|
||||
"visible": false,
|
||||
"inherit": false
|
||||
},
|
||||
"top_bottom_thickness": {
|
||||
"label": "Bottom/Top Thickness",
|
||||
@ -301,7 +303,7 @@
|
||||
"label": "Top Layers",
|
||||
"description": "This controls the amount of top layers.",
|
||||
"min_value": "0",
|
||||
"default": 6,
|
||||
"default": 8,
|
||||
"type": "int",
|
||||
"visible": false,
|
||||
"inherit_function": "0 if infill_sparse_density == 100 else math.ceil(parent_value / layer_height)"
|
||||
@ -408,8 +410,7 @@
|
||||
"description": "Number of lines around skin regions. Using one or two skin perimeter lines can greatly improve on roofs which would start in the middle of infill cells.",
|
||||
"default": 0,
|
||||
"type": "int",
|
||||
"visible": false,
|
||||
"enabled": "top_bottom_pattern"
|
||||
"visible": false
|
||||
},
|
||||
"xy_offset": {
|
||||
"label": "Horizontal expansion",
|
||||
@ -454,7 +455,7 @@
|
||||
"type": "float",
|
||||
"default": 2,
|
||||
"visible": false,
|
||||
"inherit_function": "0 if parent_value == 0 else (infill_line_width * 100) / parent_value"
|
||||
"inherit_function": "0 if infill_sparse_density == 0 else (infill_line_width * 100) / infill_sparse_density"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -470,7 +471,7 @@
|
||||
"zigzag": "Zig Zag"
|
||||
},
|
||||
"default": "grid",
|
||||
"inherit_function": "'lines' if parent_value > 25 else 'grid'"
|
||||
"inherit_function": "'lines' if infill_sparse_density > 25 else 'grid'"
|
||||
},
|
||||
"infill_overlap": {
|
||||
"label": "Infill Overlap",
|
||||
@ -498,16 +499,7 @@
|
||||
"type": "float",
|
||||
"default": 0.1,
|
||||
"visible": false,
|
||||
"children": {
|
||||
"infill_sparse_combine": {
|
||||
"label": "Infill Layers",
|
||||
"description": "Amount of layers that are combined together to form sparse infill.",
|
||||
"type": "int",
|
||||
"default": 1,
|
||||
"visible": false,
|
||||
"inherit_function": "math.floor((parent_value + 0.001) / layer_height)"
|
||||
}
|
||||
}
|
||||
"inherit_function": "layer_height"
|
||||
},
|
||||
"infill_before_walls": {
|
||||
"label": "Infill Before Walls",
|
||||
@ -523,6 +515,13 @@
|
||||
"visible": true,
|
||||
"icon": "category_material",
|
||||
"settings": {
|
||||
"material_flow_dependent_temperature": {
|
||||
"label": "Auto Temperature",
|
||||
"description": "Change the temperature each layer automatically with the average flow speed of that layer.",
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"visible": true
|
||||
},
|
||||
"material_print_temperature": {
|
||||
"label": "Printing Temperature",
|
||||
"description": "The temperature used for printing. Set at 0 to pre-heat yourself. For PLA a value of 210C is usually used.\nFor ABS a value of 230C or higher is required.",
|
||||
@ -530,8 +529,35 @@
|
||||
"type": "float",
|
||||
"default": 210,
|
||||
"min_value": "0",
|
||||
"max_value_warning": "260",
|
||||
"enabled": "not (material_flow_dependent_temperature)"
|
||||
},
|
||||
"material_flow_temp_graph": {
|
||||
"label": "Flow Temperature Graph",
|
||||
"description": "Data linking material flow (in mm³/s) to temperature (°C).",
|
||||
"unit": "",
|
||||
"type": "string",
|
||||
"default": "[[0.1,180],[20,230]]",
|
||||
"enabled": "material_flow_dependent_temperature"
|
||||
},
|
||||
"material_standby_temperature": {
|
||||
"label": "Standby Temperature",
|
||||
"description": "The temperature of the nozzle when another nozzle is currently used for printing.",
|
||||
"unit": "°C",
|
||||
"type": "float",
|
||||
"default": 150,
|
||||
"min_value": "0",
|
||||
"max_value_warning": "260"
|
||||
},
|
||||
"material_extrusion_cool_down_speed": {
|
||||
"label": "Extrusion Cool Down Speed Modifier",
|
||||
"description": "The extra speed by which the nozzle cools when while extruding. The same value is used to signify the heat up speed lost when heating up while extruding.",
|
||||
"unit": "°C/s",
|
||||
"type": "float",
|
||||
"default": 0.5,
|
||||
"min_value": "0",
|
||||
"max_value_warning": "10.0"
|
||||
},
|
||||
"material_bed_temperature": {
|
||||
"label": "Bed Temperature",
|
||||
"description": "The temperature used for the heated printer bed. Set at 0 to pre-heat it yourself.",
|
||||
@ -777,18 +803,17 @@
|
||||
"type": "float",
|
||||
"min_value": "0.1",
|
||||
"default": 15,
|
||||
"visible": false
|
||||
},
|
||||
"skirt_speed": {
|
||||
"label": "Skirt Speed",
|
||||
"description": "The speed at which the skirt and brim are printed. Normally this is done at the initial layer speed. But sometimes you want to print the skirt at a different speed.",
|
||||
"unit": "mm/s",
|
||||
"type": "float",
|
||||
"min_value": "0.1",
|
||||
"default": 15,
|
||||
"visible": false,
|
||||
"children": {
|
||||
"skirt_speed": {
|
||||
"label": "Skirt Speed",
|
||||
"description": "The speed at which the skirt and brim are printed. Normally this is done at the initial layer speed. But sometimes you want to print the skirt at a different speed.",
|
||||
"unit": "mm/s",
|
||||
"type": "float",
|
||||
"min_value": "0.1",
|
||||
"default": 15,
|
||||
"visible": false
|
||||
}
|
||||
}
|
||||
"inherit_function": "speed_layer_0"
|
||||
},
|
||||
"speed_slowdown_layers": {
|
||||
"label": "Amount of Slower Layers",
|
||||
@ -1340,7 +1365,7 @@
|
||||
},
|
||||
"skirt_line_count": {
|
||||
"label": "Skirt Line Count",
|
||||
"description": "The skirt is a line drawn around the first layer of the. This helps to prime your extruder, and to see if the object fits on your platform. Setting this to 0 will disable the skirt. Multiple skirt lines can help to prime your extruder better for small objects.",
|
||||
"description": "The skirt is a line drawn around the first layer of the print. This helps to prime your extruder, and to see if the object fits on your platform. Setting this to 0 will disable the skirt. Multiple skirt lines can help to prime your extruder better for small objects.",
|
||||
"type": "int",
|
||||
"default": 1,
|
||||
"enabled": "adhesion_type == \"skirt\""
|
||||
@ -1381,35 +1406,35 @@
|
||||
"description": "The gap between the final raft layer and the first layer of the object. Only the first layer is raised by this amount to lower the bonding between the raft layer and the object. Makes it easier to peel off the raft.",
|
||||
"unit": "mm",
|
||||
"type": "float",
|
||||
"default": 0.22,
|
||||
"default": 0.35,
|
||||
"enabled": "adhesion_type == \"raft\""
|
||||
},
|
||||
"raft_surface_layers": {
|
||||
"label": "Raft Surface Layers",
|
||||
"description": "The number of surface layers on top of the 2nd raft layer. These are fully filled layers that the object sits on. 2 layers usually works fine.",
|
||||
"label": "Raft Top Layers",
|
||||
"description": "The number of top layers on top of the 2nd raft layer. These are fully filled layers that the object sits on. 2 layers result in a smoother top surface than 1.",
|
||||
"type": "int",
|
||||
"default": 2,
|
||||
"enabled": "adhesion_type == \"raft\""
|
||||
},
|
||||
"raft_surface_thickness": {
|
||||
"label": "Raft Surface Thickness",
|
||||
"description": "Layer thickness of the surface raft layers.",
|
||||
"label": "Raft Top Layer Thickness",
|
||||
"description": "Layer thickness of the top raft layers.",
|
||||
"unit": "mm",
|
||||
"type": "float",
|
||||
"default": 0.1,
|
||||
"enabled": "adhesion_type == \"raft\""
|
||||
},
|
||||
"raft_surface_line_width": {
|
||||
"label": "Raft Surface Line Width",
|
||||
"description": "Width of the lines in the surface raft layers. These can be thin lines so that the top of the raft becomes smooth.",
|
||||
"label": "Raft Top Line Width",
|
||||
"description": "Width of the lines in the top surface of the raft. These can be thin lines so that the top of the raft becomes smooth.",
|
||||
"unit": "mm",
|
||||
"type": "float",
|
||||
"default": 0.3,
|
||||
"enabled": "adhesion_type == \"raft\""
|
||||
},
|
||||
"raft_surface_line_spacing": {
|
||||
"label": "Raft Surface Spacing",
|
||||
"description": "The distance between the raft lines for the surface raft layers. The spacing of the interface should be equal to the line width, so that the surface is solid.",
|
||||
"label": "Raft Top Spacing",
|
||||
"description": "The distance between the raft lines for the top raft layers. The spacing should be equal to the line width, so that the surface is solid.",
|
||||
"unit": "mm",
|
||||
"type": "float",
|
||||
"default": 0.3,
|
||||
@ -1417,27 +1442,27 @@
|
||||
"inherit_function": "raft_surface_line_width"
|
||||
},
|
||||
"raft_interface_thickness": {
|
||||
"label": "Raft Interface Thickness",
|
||||
"description": "Layer thickness of the interface raft layer.",
|
||||
"label": "Raft Middle Thickness",
|
||||
"description": "Layer thickness of the middle raft layer.",
|
||||
"unit": "mm",
|
||||
"type": "float",
|
||||
"default": 0.27,
|
||||
"enabled": "adhesion_type == \"raft\""
|
||||
},
|
||||
"raft_interface_line_width": {
|
||||
"label": "Raft Interface Line Width",
|
||||
"description": "Width of the lines in the interface raft layer. Making the second layer extrude more causes the lines to stick to the bed.",
|
||||
"label": "Raft Middle Line Width",
|
||||
"description": "Width of the lines in the middle raft layer. Making the second layer extrude more causes the lines to stick to the bed.",
|
||||
"unit": "mm",
|
||||
"type": "float",
|
||||
"default": 1,
|
||||
"enabled": "adhesion_type == \"raft\""
|
||||
},
|
||||
"raft_interface_line_spacing": {
|
||||
"label": "Raft Interface Spacing",
|
||||
"description": "The distance between the raft lines for the interface raft layer. The spacing of the interface should be quite wide, while being dense enough to support the surface raft layers.",
|
||||
"label": "Raft Middle Spacing",
|
||||
"description": "The distance between the raft lines for the middle raft layer. The spacing of the middle should be quite wide, while being dense enough to support the top raft layers.",
|
||||
"unit": "mm",
|
||||
"type": "float",
|
||||
"default": 2,
|
||||
"default": 1.0,
|
||||
"enabled": "adhesion_type == \"raft\""
|
||||
},
|
||||
"raft_base_thickness": {
|
||||
@ -1461,7 +1486,7 @@
|
||||
"description": "The distance between the raft lines for the base raft layer. Wide spacing makes for easy removal of the raft from the build plate.",
|
||||
"unit": "mm",
|
||||
"type": "float",
|
||||
"default": 5,
|
||||
"default": 3.0,
|
||||
"enabled": "adhesion_type == \"raft\""
|
||||
},
|
||||
"raft_speed": {
|
||||
|
@ -3,7 +3,7 @@
|
||||
"version": 1,
|
||||
"name": "German RepRap Neo",
|
||||
"manufacturer": "Other",
|
||||
"author": "other",
|
||||
"author": "Other",
|
||||
"icon": "icon_ultimaker.png",
|
||||
"platform": "grr_neo_platform.stl",
|
||||
|
||||
@ -16,6 +16,8 @@
|
||||
"machine_depth": { "default": 150 },
|
||||
"machine_center_is_zero": { "default": false },
|
||||
"machine_nozzle_size": { "default": 0.5 },
|
||||
"machine_nozzle_heat_up_speed": { "default": 2.0 },
|
||||
"machine_nozzle_cool_down_speed": { "default": 2.0 },
|
||||
"machine_head_shape_min_x": { "default": 75 },
|
||||
"machine_head_shape_min_y": { "default": 18 },
|
||||
"machine_head_shape_max_x": { "default": 18 },
|
||||
|
@ -17,6 +17,8 @@
|
||||
|
||||
"machine_center_is_zero": { "default": false },
|
||||
"machine_nozzle_size": { "default": 0.4 },
|
||||
"machine_nozzle_heat_up_speed": { "default": 2.0 },
|
||||
"machine_nozzle_cool_down_speed": { "default": 2.0 },
|
||||
"machine_head_shape_min_x": { "default": 0 },
|
||||
"machine_head_shape_min_y": { "default": 0 },
|
||||
"machine_head_shape_max_x": { "default": 0 },
|
||||
|
@ -2,19 +2,22 @@
|
||||
"id": "prusa_i3",
|
||||
"version": 1,
|
||||
"name": "Prusa i3",
|
||||
"manufacturer": "Prusa",
|
||||
"author": "other",
|
||||
"manufacturer": "Other",
|
||||
"author": "Other",
|
||||
"icon": "icon_ultimaker2.png",
|
||||
"platform": "prusai3_platform.stl",
|
||||
|
||||
"inherits": "fdmprinter.json",
|
||||
|
||||
"machine_settings": {
|
||||
"machine_heated_bed": { "default": true },
|
||||
"machine_width": { "default": 200 },
|
||||
"machine_height": { "default": 200 },
|
||||
"machine_depth": { "default": 200 },
|
||||
"machine_center_is_zero": { "default": false },
|
||||
"machine_nozzle_size": { "default": 0.4 },
|
||||
"machine_nozzle_heat_up_speed": { "default": 2.0 },
|
||||
"machine_nozzle_cool_down_speed": { "default": 2.0 },
|
||||
"machine_head_shape_min_x": { "default": 75 },
|
||||
"machine_head_shape_min_y": { "default": 18 },
|
||||
"machine_head_shape_max_x": { "default": 18 },
|
||||
@ -28,9 +31,5 @@
|
||||
"machine_end_gcode": {
|
||||
"default": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning"
|
||||
}
|
||||
},
|
||||
|
||||
"overrides": {
|
||||
"material_bed_temperature": { "visible": true }
|
||||
}
|
||||
}
|
||||
|
@ -16,6 +16,12 @@
|
||||
"machine_nozzle_size": {
|
||||
"default": 0.4
|
||||
},
|
||||
"machine_nozzle_heat_up_speed": {
|
||||
"default": 2.0
|
||||
},
|
||||
"machine_nozzle_cool_down_speed": {
|
||||
"default": 2.0
|
||||
},
|
||||
"machine_nozzle_tip_outer_diameter": {
|
||||
"default": 1
|
||||
},
|
||||
@ -43,24 +49,26 @@
|
||||
"default": [
|
||||
[
|
||||
-40,
|
||||
30
|
||||
10
|
||||
],
|
||||
[
|
||||
-40,
|
||||
-10
|
||||
-30
|
||||
],
|
||||
[
|
||||
60,
|
||||
-10
|
||||
10
|
||||
],
|
||||
[
|
||||
60,
|
||||
30
|
||||
-30
|
||||
]
|
||||
]
|
||||
},
|
||||
"machine_center_is_zero": { "default": false },
|
||||
"machine_nozzle_size": { "default": 0.4 },
|
||||
"machine_nozzle_heat_up_speed": { "default": 2.0 },
|
||||
"machine_nozzle_cool_down_speed": { "default": 2.0 },
|
||||
"gantry_height": { "default": 55 },
|
||||
"machine_use_extruder_offset_to_offset_coords": { "default": true },
|
||||
"machine_gcode_flavor": { "default": "UltiGCode" },
|
||||
|
@ -21,6 +21,12 @@
|
||||
"machine_nozzle_size": {
|
||||
"default": 0.4
|
||||
},
|
||||
"machine_nozzle_heat_up_speed": {
|
||||
"default": 2.0
|
||||
},
|
||||
"machine_nozzle_cool_down_speed": {
|
||||
"default": 2.0
|
||||
},
|
||||
"machine_nozzle_tip_outer_diameter": {
|
||||
"default": 1
|
||||
},
|
||||
@ -41,6 +47,8 @@
|
||||
"machine_depth": { "default": 205 },
|
||||
"machine_center_is_zero": { "default": false },
|
||||
"machine_nozzle_size": { "default": 0.4 },
|
||||
"machine_nozzle_heat_up_speed": { "default": 2.0 },
|
||||
"machine_nozzle_cool_down_speed": { "default": 2.0 },
|
||||
"machine_head_with_fans_polygon":
|
||||
{
|
||||
"default": [
|
||||
@ -71,10 +79,8 @@
|
||||
},
|
||||
"machine_end_gcode": {
|
||||
"default": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning"
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
"overrides": {
|
||||
"material_bed_temperature": { "visible": false }
|
||||
"machine_extruder_drive_upgrade": { "default": false }
|
||||
}
|
||||
}
|
||||
|
BIN
resources/meshes/bq_hephestos_2.stl
Normal file
BIN
resources/meshes/bq_hephestos_2.stl
Normal file
Binary file not shown.
BIN
resources/meshes/inventor_platform.STL
Normal file
BIN
resources/meshes/inventor_platform.STL
Normal file
Binary file not shown.
@ -3,4 +3,4 @@ version = 1
|
||||
name = High Quality
|
||||
|
||||
[settings]
|
||||
layer_height = 0.06
|
||||
layer_height = 0.08
|
||||
|
6
resources/profiles/Low+Quality.cfg
Normal file
6
resources/profiles/Low+Quality.cfg
Normal file
@ -0,0 +1,6 @@
|
||||
[general]
|
||||
version = 1
|
||||
name = Low Quality
|
||||
|
||||
[settings]
|
||||
layer_height = 0.15
|
6
resources/profiles/Ulti+Quality.cfg
Normal file
6
resources/profiles/Ulti+Quality.cfg
Normal file
@ -0,0 +1,6 @@
|
||||
[general]
|
||||
version = 1
|
||||
name = Ulti Quality
|
||||
|
||||
[settings]
|
||||
layer_height = 0.06
|
@ -47,7 +47,6 @@ Item
|
||||
Action
|
||||
{
|
||||
id:toggleFullScreenAction
|
||||
shortcut: StandardKey.FullScreen;
|
||||
text: catalog.i18nc("@action:inmenu","Toggle Fu&ll Screen");
|
||||
iconName: "view-fullscreen";
|
||||
}
|
||||
@ -137,7 +136,6 @@ Item
|
||||
id: deleteObjectAction;
|
||||
text: catalog.i18nc("@action:inmenu","Delete Object");
|
||||
iconName: "edit-delete";
|
||||
shortcut: StandardKey.Backspace;
|
||||
}
|
||||
|
||||
Action
|
||||
@ -182,6 +180,7 @@ Item
|
||||
id: deleteAllAction;
|
||||
text: catalog.i18nc("@action:inmenu","&Clear Build Platform");
|
||||
iconName: "edit-delete";
|
||||
shortcut: "Ctrl+D";
|
||||
}
|
||||
|
||||
Action
|
||||
@ -216,5 +215,6 @@ Item
|
||||
id: showEngineLogAction;
|
||||
text: catalog.i18nc("@action:inmenu","Show Engine &Log...");
|
||||
iconName: "view-list-text";
|
||||
shortcut: StandardKey.WhatsThis;
|
||||
}
|
||||
}
|
||||
|
@ -22,6 +22,19 @@ UM.MainWindow
|
||||
id: backgroundItem;
|
||||
anchors.fill: parent;
|
||||
UM.I18nCatalog{id: catalog; name:"cura"}
|
||||
|
||||
//DeleteSelection on the keypress backspace event
|
||||
Keys.onPressed: {
|
||||
if (event.key == Qt.Key_Backspace)
|
||||
{
|
||||
if(objectContextMenu.objectId != 0)
|
||||
{
|
||||
Printer.deleteObject(objectContextMenu.objectId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
UM.ApplicationMenu
|
||||
{
|
||||
id: menu
|
||||
@ -72,7 +85,7 @@ UM.MainWindow
|
||||
text: catalog.i18nc("@action:inmenu", "&Save Selection to File");
|
||||
enabled: UM.Selection.hasSelection;
|
||||
iconName: "document-save-as";
|
||||
onTriggered: UM.OutputDeviceManager.requestWriteSelectionToDevice("local_file");
|
||||
onTriggered: UM.OutputDeviceManager.requestWriteSelectionToDevice("local_file", Printer.jobName);
|
||||
}
|
||||
Menu
|
||||
{
|
||||
@ -88,7 +101,7 @@ UM.MainWindow
|
||||
MenuItem
|
||||
{
|
||||
text: model.description;
|
||||
onTriggered: UM.OutputDeviceManager.requestWriteToDevice(model.id);
|
||||
onTriggered: UM.OutputDeviceManager.requestWriteToDevice(model.id, Printer.jobName);
|
||||
}
|
||||
onObjectAdded: saveAllMenu.insertItem(index, object)
|
||||
onObjectRemoved: saveAllMenu.removeItem(object)
|
||||
@ -139,10 +152,6 @@ UM.MainWindow
|
||||
onObjectRemoved: top_view_menu.removeItem(object)
|
||||
}
|
||||
ExclusiveGroup { id: view_menu_top_group; }
|
||||
|
||||
MenuSeparator { }
|
||||
|
||||
MenuItem { action: actions.toggleFullScreen; }
|
||||
}
|
||||
Menu
|
||||
{
|
||||
@ -373,6 +382,7 @@ UM.MainWindow
|
||||
{
|
||||
id: viewModeButton
|
||||
property bool verticalTooltip: true
|
||||
|
||||
anchors
|
||||
{
|
||||
top: parent.top;
|
||||
@ -389,12 +399,13 @@ UM.MainWindow
|
||||
id: viewMenu;
|
||||
Instantiator
|
||||
{
|
||||
id: viewMenuInstantiator
|
||||
model: UM.ViewModel { }
|
||||
MenuItem
|
||||
{
|
||||
text: model.name;
|
||||
text: model.name
|
||||
checkable: true;
|
||||
checked: model.active;
|
||||
checked: model.active
|
||||
exclusiveGroup: viewMenuGroup;
|
||||
onTriggered: UM.Controller.setActiveView(model.id);
|
||||
}
|
||||
@ -413,7 +424,7 @@ UM.MainWindow
|
||||
anchors {
|
||||
left: parent.left
|
||||
top: parent.top
|
||||
topMargin: 74
|
||||
topMargin: UM.Theme.sizes.window_margin.height + UM.Theme.sizes.button.height
|
||||
//horizontalCenter: parent.horizontalCenter
|
||||
//horizontalCenterOffset: -(UM.Theme.sizes.sidebar.width / 2)
|
||||
//top: parent.top;
|
||||
@ -463,14 +474,27 @@ UM.MainWindow
|
||||
{
|
||||
//; Remove & re-add the general page as we want to use our own instead of uranium standard.
|
||||
removePage(0);
|
||||
insertPage(0, catalog.i18nc("@title:tab","General") , "" , Qt.resolvedUrl("./GeneralPage.qml"));
|
||||
insertPage(0, catalog.i18nc("@title:tab","General"), generalPage);
|
||||
|
||||
//: View preferences page title
|
||||
insertPage(1, catalog.i18nc("@title:tab","View"), "view-preview", Qt.resolvedUrl("./ViewPage.qml"));
|
||||
insertPage(1, catalog.i18nc("@title:tab","View"), viewPage);
|
||||
|
||||
//Force refresh
|
||||
setPage(0)
|
||||
}
|
||||
|
||||
Item {
|
||||
visible: false
|
||||
GeneralPage
|
||||
{
|
||||
id: generalPage
|
||||
}
|
||||
|
||||
ViewPage
|
||||
{
|
||||
id: viewPage
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Actions
|
||||
@ -543,8 +567,8 @@ UM.MainWindow
|
||||
|
||||
addMachine.onTriggered: addMachineWizard.visible = true;
|
||||
|
||||
preferences.onTriggered: preferences.visible = true;
|
||||
configureMachines.onTriggered: { preferences.visible = true; preferences.setPage(2); }
|
||||
preferences.onTriggered: { preferences.visible = true; }
|
||||
configureMachines.onTriggered: { preferences.visible = true; preferences.setPage(3); }
|
||||
manageProfiles.onTriggered: { preferences.visible = true; preferences.setPage(4); }
|
||||
|
||||
documentation.onTriggered: CuraActions.openDocumentation();
|
||||
@ -621,6 +645,11 @@ UM.MainWindow
|
||||
|
||||
onAccepted:
|
||||
{
|
||||
//Because several implementations of the file dialog only update the folder
|
||||
//when it is explicitly set.
|
||||
var f = folder;
|
||||
folder = f;
|
||||
|
||||
UM.MeshFileHandler.readLocalFile(fileUrl)
|
||||
openDialog.sendMeshName(fileUrl.toString())
|
||||
}
|
||||
@ -648,14 +677,34 @@ UM.MainWindow
|
||||
onRequestAddPrinter:
|
||||
{
|
||||
addMachineWizard.visible = true
|
||||
addMachineWizard.firstRun = true
|
||||
addMachineWizard.firstRun = false
|
||||
}
|
||||
}
|
||||
|
||||
Component.onCompleted:
|
||||
{
|
||||
UM.Theme.load(UM.Resources.getPath(UM.Resources.Themes, "cura"))
|
||||
base.visible = true;
|
||||
}
|
||||
|
||||
Timer
|
||||
{
|
||||
id: startupTimer;
|
||||
interval: 100;
|
||||
repeat: false;
|
||||
running: true;
|
||||
onTriggered:
|
||||
{
|
||||
if(!base.visible)
|
||||
{
|
||||
base.visible = true;
|
||||
restart();
|
||||
}
|
||||
else if(UM.MachineManager.activeMachineInstance == "")
|
||||
{
|
||||
addMachineWizard.firstRun = true;
|
||||
addMachineWizard.open();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -8,69 +8,68 @@ import QtQuick.Layouts 1.1
|
||||
|
||||
import UM 1.1 as UM
|
||||
|
||||
Column{
|
||||
Item{
|
||||
id: base;
|
||||
UM.I18nCatalog { id: catalog; name:"cura"}
|
||||
property int totalHeightProfileSetup: childrenRect.height
|
||||
property Action manageProfilesAction
|
||||
spacing: 0
|
||||
|
||||
Rectangle{
|
||||
id: variantItem;
|
||||
height: UM.Theme.sizes.sidebar_setup.height
|
||||
Rectangle {
|
||||
id: variantRow
|
||||
anchors.top: base.top
|
||||
width: base.width
|
||||
visible: UM.MachineManager.hasVariants;
|
||||
height: UM.Theme.sizes.sidebar_setup.height
|
||||
//visible: UM.MachineManager.hasVariants;
|
||||
visible: true
|
||||
|
||||
Rectangle {
|
||||
id: variantRow
|
||||
width: base.width
|
||||
height: parent.heigth
|
||||
Label{
|
||||
id: variantLabel
|
||||
text: catalog.i18nc("@label","Variant:");
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: UM.Theme.sizes.default_margin.width;
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
width: parent.width/100*45
|
||||
font: UM.Theme.fonts.default;
|
||||
}
|
||||
|
||||
Label{
|
||||
id: variantLabel
|
||||
text: catalog.i18nc("@label","Variant:");
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: UM.Theme.sizes.default_margin.width;
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
width: parent.width/100*45
|
||||
font: UM.Theme.fonts.default;
|
||||
}
|
||||
ToolButton {
|
||||
id: variantSelection
|
||||
text: UM.MachineManager.activeMachineVariant
|
||||
width: parent.width/100*55
|
||||
height: UM.Theme.sizes.setting_control.height
|
||||
tooltip: UM.MachineManager.activeMachineInstance;
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: UM.Theme.sizes.default_margin.width
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
style: UM.Theme.styles.sidebar_header_button
|
||||
|
||||
ToolButton {
|
||||
id: variantSelection
|
||||
text: UM.MachineManager.activeMachineVariant
|
||||
width: parent.width/100*55
|
||||
height: UM.Theme.sizes.setting_control.height
|
||||
tooltip: UM.MachineManager.activeMachineInstance;
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: UM.Theme.sizes.default_margin.width
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
style: UM.Theme.styles.sidebar_header_button
|
||||
|
||||
menu: Menu
|
||||
menu: Menu
|
||||
{
|
||||
id: variantsSelectionMenu
|
||||
Instantiator
|
||||
{
|
||||
id: variantsSelectionMenu
|
||||
Instantiator
|
||||
model: UM.MachineVariantsModel { }
|
||||
MenuItem
|
||||
{
|
||||
model: UM.MachineVariantsModel { }
|
||||
MenuItem
|
||||
{
|
||||
text: model.name;
|
||||
checkable: true;
|
||||
checked: model.active;
|
||||
exclusiveGroup: variantSelectionMenuGroup;
|
||||
onTriggered: UM.MachineManager.setActiveMachineVariant(model.getItem(index).name)
|
||||
}
|
||||
text: model.name;
|
||||
checkable: true;
|
||||
checked: model.active;
|
||||
exclusiveGroup: variantSelectionMenuGroup;
|
||||
onTriggered: UM.MachineManager.setActiveMachineVariant(model.getItem(index).name)
|
||||
}
|
||||
|
||||
ExclusiveGroup { id: variantSelectionMenuGroup; }
|
||||
onObjectAdded: variantsSelectionMenu.insertItem(index, object)
|
||||
onObjectRemoved: variantsSelectionMenu.removeItem(object)
|
||||
}
|
||||
|
||||
ExclusiveGroup { id: variantSelectionMenuGroup; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle{
|
||||
id: globalProfileRow;
|
||||
anchors.top: UM.MachineManager.hasVariants ? variantRow.bottom : base.top
|
||||
//anchors.top: variantRow.bottom
|
||||
height: UM.Theme.sizes.sidebar_setup.height
|
||||
width: base.width
|
||||
|
||||
@ -148,8 +147,4 @@ Column{
|
||||
// }
|
||||
}
|
||||
}
|
||||
Rectangle{
|
||||
width: base.width
|
||||
height: UM.Theme.sizes.default_margin.width/2
|
||||
}
|
||||
}
|
@ -54,7 +54,16 @@ Rectangle {
|
||||
Connections {
|
||||
target: openDialog
|
||||
onHasMesh: {
|
||||
base.fileBaseName = name
|
||||
if(base.fileBaseName == ''){
|
||||
base.fileBaseName = name
|
||||
base.createFileName()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
onActivityChanged: {
|
||||
if (activity == false){
|
||||
base.fileBaseName = ''
|
||||
base.createFileName()
|
||||
}
|
||||
}
|
||||
@ -62,7 +71,7 @@ Rectangle {
|
||||
Rectangle{
|
||||
id: printJobRow
|
||||
implicitWidth: base.width;
|
||||
implicitHeight: UM.Theme.sizes.sidebar_header.height
|
||||
implicitHeight: UM.Theme.sizes.save_button_header.height
|
||||
anchors.top: parent.top
|
||||
color: UM.Theme.colors.sidebar_header_bar
|
||||
Label{
|
||||
@ -83,6 +92,7 @@ Rectangle {
|
||||
height: UM.Theme.sizes.sidebar_inputFields.height
|
||||
property int unremovableSpacing: 5
|
||||
text: ''
|
||||
onTextChanged: Printer.setJobName(text)
|
||||
onEditingFinished: {
|
||||
if (printJobTextfield.text != ''){
|
||||
printJobTextfield.focus = false
|
||||
@ -110,6 +120,7 @@ Rectangle {
|
||||
implicitWidth: base.width
|
||||
implicitHeight: UM.Theme.sizes.sidebar_specs_bar.height
|
||||
anchors.top: printJobRow.bottom
|
||||
visible: base.progress > 0.99 && base.activity == true
|
||||
Item{
|
||||
id: time
|
||||
width: childrenRect.width;
|
||||
@ -188,12 +199,23 @@ Rectangle {
|
||||
text: UM.OutputDeviceManager.activeDeviceShortDescription
|
||||
onClicked:
|
||||
{
|
||||
UM.OutputDeviceManager.requestWriteToDevice(UM.OutputDeviceManager.activeDevice)
|
||||
UM.OutputDeviceManager.requestWriteToDevice(UM.OutputDeviceManager.activeDevice, Printer.jobName)
|
||||
}
|
||||
|
||||
style: ButtonStyle {
|
||||
background: Rectangle {
|
||||
color: control.hovered ? UM.Theme.colors.load_save_button_hover : UM.Theme.colors.load_save_button
|
||||
//opacity: control.enabled ? 1.0 : 0.5
|
||||
//Behavior on opacity { NumberAnimation { duration: 50; } }
|
||||
color: {
|
||||
if(!control.enabled){
|
||||
return UM.Theme.colors.button;
|
||||
}
|
||||
else if(control.enabled && control.hovered) {
|
||||
return UM.Theme.colors.load_save_button_hover
|
||||
} else {
|
||||
return UM.Theme.colors.load_save_button
|
||||
}
|
||||
}
|
||||
Behavior on color { ColorAnimation { duration: 50; } }
|
||||
width: {
|
||||
var w = 0;
|
||||
@ -205,17 +227,17 @@ Rectangle {
|
||||
saveToButton.resizedWidth = actualLabel.width + (UM.Theme.sizes.default_margin.width * 2)
|
||||
w = actualLabel.width + (UM.Theme.sizes.default_margin.width * 2)
|
||||
}
|
||||
|
||||
if(w < base.width * 0.55) {
|
||||
w = base.width * 0.55;
|
||||
}
|
||||
|
||||
return w;
|
||||
}
|
||||
Label {
|
||||
id: actualLabel
|
||||
opacity: control.enabled ? 1.0 : 0.4
|
||||
//Behavior on opacity { NumberAnimation { duration: 50; } }
|
||||
anchors.centerIn: parent
|
||||
color: UM.Theme.colors.load_save_button_text
|
||||
color: UM.Theme.colors.load_save_button_text
|
||||
font: UM.Theme.fonts.default
|
||||
text: control.text;
|
||||
}
|
||||
@ -232,12 +254,22 @@ Rectangle {
|
||||
anchors.rightMargin: UM.Theme.sizes.default_margin.width
|
||||
width: UM.Theme.sizes.save_button_save_to_button.height
|
||||
height: UM.Theme.sizes.save_button_save_to_button.height
|
||||
enabled: base.progress > 0.99 && base.activity == true
|
||||
//iconSource: UM.Theme.icons[UM.OutputDeviceManager.activeDeviceIconName];
|
||||
|
||||
style: ButtonStyle {
|
||||
background: Rectangle {
|
||||
id: deviceSelectionIcon
|
||||
color: control.hovered ? UM.Theme.colors.load_save_button_hover : UM.Theme.colors.load_save_button
|
||||
color: {
|
||||
if(!control.enabled){
|
||||
return UM.Theme.colors.button;
|
||||
}
|
||||
else if(control.enabled && control.hovered) {
|
||||
return UM.Theme.colors.load_save_button_hover
|
||||
} else {
|
||||
return UM.Theme.colors.load_save_button
|
||||
}
|
||||
}
|
||||
Behavior on color { ColorAnimation { duration: 50; } }
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: UM.Theme.sizes.save_button_text_margin.width / 2;
|
||||
@ -245,7 +277,6 @@ Rectangle {
|
||||
height: parent.height
|
||||
|
||||
UM.RecolorImage {
|
||||
id: lengthIcon
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
width: UM.Theme.sizes.standard_arrow.width
|
||||
|
@ -76,6 +76,7 @@ Rectangle
|
||||
id: sidebarContents;
|
||||
anchors.bottom: saveButton.top
|
||||
anchors.top: profileItem.bottom
|
||||
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||
anchors.left: base.left
|
||||
anchors.right: base.right
|
||||
|
||||
|
@ -39,18 +39,17 @@ Item
|
||||
Rectangle{
|
||||
id: settingsModeSelection
|
||||
width: parent.width/100*55
|
||||
height: childrenRect.height - UM.Theme.sizes.default_margin.width;
|
||||
height: UM.Theme.sizes.sidebar_header_mode_toggle.height
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: UM.Theme.sizes.default_margin.width;
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
Component{
|
||||
id: wizardDelegate
|
||||
Button {
|
||||
id: simpleModeButton
|
||||
height: settingsModeSelection.height
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: model.index * (settingsModeSelection.width / 2)
|
||||
anchors.top: parent.top
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
width: parent.width / 2
|
||||
text: model.text
|
||||
exclusiveGroup: modeMenuGroup;
|
||||
@ -81,8 +80,6 @@ Item
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
width: parent.width
|
||||
height: UM.Theme.sizes.sidebar_header.height
|
||||
currentIndex: base.currentIndex;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -90,8 +87,9 @@ Item
|
||||
Rectangle {
|
||||
id: machineSelectionRow
|
||||
width: base.width
|
||||
height: UM.Theme.sizes.sidebar_header.height
|
||||
height: UM.Theme.sizes.sidebar_setup.height
|
||||
anchors.top: settingsModeRow.bottom
|
||||
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
|
||||
Label{
|
||||
@ -110,7 +108,6 @@ Item
|
||||
width: parent.width/100*55
|
||||
height: UM.Theme.sizes.setting_control.height
|
||||
tooltip: UM.MachineManager.activeMachineInstance;
|
||||
//style: UM.Theme.styles.sidebar_header_button;
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: UM.Theme.sizes.default_margin.width
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
|
@ -25,7 +25,7 @@ Item
|
||||
id: infillCellLeft
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
width: base.width/100*55 - UM.Theme.sizes.default_margin.width
|
||||
width: base.width/100* 55 - UM.Theme.sizes.default_margin.width
|
||||
height: childrenRect.height < UM.Theme.sizes.simple_mode_infill_caption.height ? UM.Theme.sizes.simple_mode_infill_caption.height : childrenRect.height
|
||||
|
||||
Label{
|
||||
@ -41,7 +41,7 @@ Item
|
||||
Label{
|
||||
id: infillCaption
|
||||
width: infillCellLeft.width - UM.Theme.sizes.default_margin.width
|
||||
text: infillModel.get(infillListView.activeIndex).text
|
||||
text: infillModel.count > 0 && infillListView.activeIndex != -1 ? infillModel.get(infillListView.activeIndex).text : ""
|
||||
font: UM.Theme.fonts.caption
|
||||
wrapMode: Text.Wrap
|
||||
color: UM.Theme.colors.text
|
||||
@ -51,65 +51,80 @@ Item
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle{
|
||||
Flow {
|
||||
id: infillCellRight
|
||||
height: 100
|
||||
width: base.width/100*45
|
||||
|
||||
height: childrenRect.height;
|
||||
width: base.width / 100 * 45
|
||||
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: UM.Theme.sizes.default_margin.width - (UM.Theme.sizes.default_margin.width/4)
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||
Component{
|
||||
id: infillDelegate
|
||||
Item{
|
||||
width: infillCellRight.width/3
|
||||
x: index * (infillCellRight.width/3)
|
||||
anchors.top: parent.top
|
||||
|
||||
Repeater {
|
||||
id: infillListView
|
||||
property int activeIndex: {
|
||||
if(!UM.ActiveProfile.valid)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
var density = parseInt(UM.ActiveProfile.settingValues.infill_sparse_density);
|
||||
for(var i = 0; i < infillModel.count; ++i)
|
||||
{
|
||||
if(infillModel.get(i).percentage == density)
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
model: infillModel;
|
||||
|
||||
Item {
|
||||
width: childrenRect.width;
|
||||
height: childrenRect.height;
|
||||
|
||||
Rectangle{
|
||||
id: infillIconLining
|
||||
anchors.top: parent.top
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
width: parent.width - (UM.Theme.sizes.default_margin.width/2)
|
||||
height: parent.width - (UM.Theme.sizes.default_margin.width/2)
|
||||
|
||||
width: infillCellRight.width / 3 - UM.Theme.sizes.default_margin.width;
|
||||
height: width
|
||||
|
||||
border.color: infillListView.activeIndex == index ? UM.Theme.colors.setting_control_text : UM.Theme.colors.setting_control_border
|
||||
border.width: infillListView.activeIndex == index ? 2 : 1
|
||||
color: infillListView.activeIndex == index ? UM.Theme.colors.setting_category_active : "transparent"
|
||||
UM.RecolorImage {
|
||||
|
||||
Image {
|
||||
id: infillIcon
|
||||
z: parent.z + 1
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
width: parent.width - UM.Theme.sizes.default_margin.width
|
||||
height: parent.width - UM.Theme.sizes.default_margin.width
|
||||
anchors.fill: parent;
|
||||
anchors.margins: UM.Theme.sizes.default_margin.width / 2
|
||||
|
||||
sourceSize.width: width
|
||||
sourceSize.height: width
|
||||
color: UM.Theme.colors.setting_control_text
|
||||
source: UM.Theme.icons[model.icon];
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
infillListView.activeIndex = index
|
||||
UM.MachineManager.setSettingValue("infill_sparse_density", model.percentage)
|
||||
}
|
||||
}
|
||||
}
|
||||
Label{
|
||||
id: infillLabel
|
||||
anchors.top: infillIconLining.bottom
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.horizontalCenter: infillIconLining.horizontalCenter
|
||||
color: infillListView.activeIndex == index ? UM.Theme.colors.setting_control_text : UM.Theme.colors.setting_control_border
|
||||
text: name
|
||||
//font.bold: infillListView.activeIndex == index ? true : false
|
||||
}
|
||||
}
|
||||
}
|
||||
ListView{
|
||||
id: infillListView
|
||||
property int activeIndex: 0
|
||||
model: infillModel
|
||||
delegate: infillDelegate
|
||||
anchors.fill: parent
|
||||
}
|
||||
|
||||
ListModel {
|
||||
id: infillModel
|
||||
|
||||
@ -139,11 +154,12 @@ Item
|
||||
|
||||
Rectangle {
|
||||
id: helpersCellLeft
|
||||
anchors.top: infillCellLeft.bottom
|
||||
anchors.top: infillCellRight.bottom
|
||||
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||
anchors.left: parent.left
|
||||
width: parent.width/100*45 - UM.Theme.sizes.default_margin.width
|
||||
height: childrenRect.height
|
||||
|
||||
Label{
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: UM.Theme.sizes.default_margin.width
|
||||
@ -155,7 +171,6 @@ Item
|
||||
Rectangle {
|
||||
id: helpersCellRight
|
||||
anchors.top: helpersCellLeft.top
|
||||
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||
anchors.left: helpersCellLeft.right
|
||||
width: parent.width/100*55 - UM.Theme.sizes.default_margin.width
|
||||
height: childrenRect.height
|
||||
@ -164,37 +179,31 @@ Item
|
||||
id: skirtCheckBox
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
Layout.preferredHeight: UM.Theme.sizes.section.height;
|
||||
|
||||
//: Setting enable skirt adhesion checkbox
|
||||
text: catalog.i18nc("@option:check","Enable Skirt Adhesion");
|
||||
style: UM.Theme.styles.checkbox;
|
||||
checked: Printer.getSettingValue("skirt_line_count") == null ? false: Printer.getSettingValue("skirt_line_count");
|
||||
onCheckedChanged:
|
||||
|
||||
checked: UM.ActiveProfile.valid ? UM.ActiveProfile.settingValues.adhesion_type == "brim" : false;
|
||||
onClicked:
|
||||
{
|
||||
if(checked != Printer.getSettingValue("skirt_line_count"))
|
||||
{
|
||||
Printer.setSettingValue("skirt_line_count", checked)
|
||||
}
|
||||
UM.MachineManager.setSettingValue("adhesion_type", "brim")
|
||||
}
|
||||
}
|
||||
CheckBox{
|
||||
anchors.top: skirtCheckBox.bottom
|
||||
anchors.topMargin: UM.Theme.sizes.default_lining.height
|
||||
anchors.left: parent.left
|
||||
Layout.preferredHeight: UM.Theme.sizes.section.height;
|
||||
|
||||
//: Setting enable support checkbox
|
||||
text: catalog.i18nc("@option:check","Enable Support");
|
||||
|
||||
style: UM.Theme.styles.checkbox;
|
||||
|
||||
checked: Printer.getSettingValue("support_enable") == null? false: Printer.getSettingValue("support_enable");
|
||||
onCheckedChanged:
|
||||
checked: UM.ActiveProfile.valid ? UM.ActiveProfile.settingValues.support_enable : false;
|
||||
onClicked:
|
||||
{
|
||||
if(checked != Printer.getSettingValue("support_enable"))
|
||||
{
|
||||
Printer.setSettingValue("support_enable", checked)
|
||||
}
|
||||
UM.MachineManager.setSettingValue("support_enable", checked)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -33,6 +33,7 @@ Item {
|
||||
|
||||
checkable: true;
|
||||
checked: model.active;
|
||||
enabled: UM.Selection.hasSelection;
|
||||
|
||||
style: UM.Theme.styles.tool_button;
|
||||
|
||||
@ -43,7 +44,6 @@ Item {
|
||||
onClicked: {
|
||||
parent.checked ? UM.Controller.setActiveTool(null) : UM.Controller.setActiveTool(model.id);
|
||||
base.activeY = parent.y
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -65,7 +65,14 @@ Item {
|
||||
anchors.left: parent.right;
|
||||
y: base.activeY
|
||||
|
||||
width: panel.item ? Math.max(panel.width + 2 * UM.Theme.sizes.default_margin.width) : 0;
|
||||
width: {
|
||||
if (panel.item && panel.width > 0){
|
||||
return Math.max(panel.width + 2 * UM.Theme.sizes.default_margin.width)
|
||||
}
|
||||
else {
|
||||
return 0
|
||||
}
|
||||
}
|
||||
height: panel.item ? panel.height + 2 * UM.Theme.sizes.default_margin.height : 0;
|
||||
|
||||
opacity: panel.item ? 1 : 0
|
||||
|
@ -19,79 +19,51 @@ UM.PreferencesPage
|
||||
{
|
||||
UM.Preferences.resetPreference("view/show_overhang");
|
||||
UM.Preferences.resetPreference("view/center_on_select");
|
||||
overhangCheckbox.checked = boolCheck(UM.Preferences.getValue("view/show_overhang"))
|
||||
centerCheckbox.checked = boolCheck(UM.Preferences.getValue("view/center_on_select"))
|
||||
}
|
||||
|
||||
GridLayout
|
||||
Column
|
||||
{
|
||||
columns: 2;
|
||||
UM.I18nCatalog { id: catalog; name:"cura"}
|
||||
CheckBox
|
||||
|
||||
UM.TooltipArea
|
||||
{
|
||||
id: overhangCheckbox
|
||||
checked: boolCheck(UM.Preferences.getValue("view/show_overhang"))
|
||||
onCheckedChanged: UM.Preferences.setValue("view/show_overhang", checked ? "True" : "False")
|
||||
}
|
||||
Button
|
||||
{
|
||||
id: viewText //is a button so the user doesn't have to click inconveniently precise to enable or disable the checkbox
|
||||
width: childrenRect.width;
|
||||
height: childrenRect.height;
|
||||
|
||||
//: Display Overhang preference checkbox
|
||||
text: catalog.i18nc("@option:check","Display Overhang");
|
||||
onClicked: overhangCheckbox.checked = !overhangCheckbox.checked
|
||||
text: catalog.i18nc("@info:tooltip","Highlight unsupported areas of the model in red. Without support these areas will nog print properly.")
|
||||
|
||||
//: Display Overhang preference tooltip
|
||||
tooltip: catalog.i18nc("@info:tooltip","Highlight unsupported areas of the model in red. Without support these areas will not print properly.")
|
||||
|
||||
style: ButtonStyle
|
||||
CheckBox
|
||||
{
|
||||
background: Rectangle
|
||||
{
|
||||
border.width: 0
|
||||
color: "transparent"
|
||||
}
|
||||
label: Text
|
||||
{
|
||||
renderType: Text.NativeRendering
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
text: control.text
|
||||
}
|
||||
id: overhangCheckbox
|
||||
|
||||
checked: boolCheck(UM.Preferences.getValue("view/show_overhang"))
|
||||
onClicked: UM.Preferences.setValue("view/show_overhang", checked)
|
||||
|
||||
text: catalog.i18nc("@option:check","Display Overhang");
|
||||
}
|
||||
}
|
||||
|
||||
CheckBox
|
||||
{
|
||||
id: centerCheckbox
|
||||
checked: boolCheck(UM.Preferences.getValue("view/center_on_select"))
|
||||
onCheckedChanged: UM.Preferences.setValue("view/center_on_select", checked ? "True" : "False")
|
||||
}
|
||||
Button
|
||||
{
|
||||
id: centerText //is a button so the user doesn't have to click inconveniently precise to enable or disable the checkbox
|
||||
UM.TooltipArea {
|
||||
width: childrenRect.width;
|
||||
height: childrenRect.height;
|
||||
text: catalog.i18nc("@info:tooltip","Moves the camera so the object is in the center of the view when an object is selected")
|
||||
|
||||
//: Display Center camera preference checkbox
|
||||
text: catalog.i18nc("@action:button","Center camera when item is selected");
|
||||
onClicked: centerCheckbox.checked = !centerCheckbox.checked
|
||||
|
||||
//: Display Center camera preference tooltip
|
||||
tooltip: catalog.i18nc("@info:tooltip","Moves the camera so the object is in the center of the view when an object is selected")
|
||||
|
||||
style: ButtonStyle
|
||||
CheckBox
|
||||
{
|
||||
background: Rectangle
|
||||
{
|
||||
border.width: 0
|
||||
color: "transparent"
|
||||
}
|
||||
label: Text
|
||||
{
|
||||
renderType: Text.NativeRendering
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
text: control.text
|
||||
}
|
||||
id: centerCheckbox
|
||||
text: catalog.i18nc("@action:button","Center camera when item is selected");
|
||||
checked: boolCheck(UM.Preferences.getValue("view/center_on_select"))
|
||||
onClicked: UM.Preferences.setValue("view/center_on_select", checked)
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: UM.Preferences
|
||||
onPreferenceChanged:
|
||||
{
|
||||
overhangCheckbox.checked = boolCheck(UM.Preferences.getValue("view/show_overhang"))
|
||||
centerCheckbox.checked = boolCheck(UM.Preferences.getValue("view/center_on_select"))
|
||||
}
|
||||
}
|
||||
Item { Layout.fillHeight: true; Layout.columnSpan: 2 }
|
||||
}
|
||||
}
|
||||
|
@ -128,14 +128,7 @@ Item
|
||||
|
||||
text: model.name
|
||||
|
||||
onClicked: {
|
||||
ListView.view.currentIndex = index;
|
||||
if(model.pages.length > 0) {
|
||||
base.wizard.nextAvailable = true;
|
||||
} else {
|
||||
base.wizard.nextAvailable = false;
|
||||
}
|
||||
}
|
||||
onClicked: ListView.view.currentIndex = index;
|
||||
|
||||
Label
|
||||
{
|
||||
@ -221,6 +214,7 @@ Item
|
||||
base.wizard.appendPage(Qt.resolvedUrl("Bedleveling.qml"), catalog.i18nc("@title", "Bed Levelling"));
|
||||
break;
|
||||
default:
|
||||
base.wizard.appendPage(Qt.resolvedUrl("%1.qml".arg(pages[i])), pages[i])
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -15,6 +15,7 @@ Item
|
||||
property bool three_point_leveling: true
|
||||
property int platform_width: UM.MachineManager.getSettingValue("machine_width")
|
||||
property int platform_height: UM.MachineManager.getSettingValue("machine_depth")
|
||||
property bool alreadyTested: base.addOriginalProgress.bedLeveling
|
||||
anchors.fill: parent;
|
||||
property variant printer_connection: UM.USBPrinterManager.connectedPrinterList.getItem(0).printer
|
||||
Component.onCompleted: printer_connection.homeHead()
|
||||
@ -40,7 +41,7 @@ Item
|
||||
}
|
||||
Label
|
||||
{
|
||||
id: bedelevelingText
|
||||
id: bedlevelingText
|
||||
anchors.top: pageDescription.bottom
|
||||
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||
width: parent.width
|
||||
@ -49,47 +50,69 @@ Item
|
||||
}
|
||||
|
||||
Item{
|
||||
anchors.top: bedelevelingText.bottom
|
||||
id: bedlevelingWrapper
|
||||
anchors.top: bedlevelingText.bottom
|
||||
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
width: bedelevelingButton.width + skipBedlevelingButton.width + UM.Theme.sizes.default_margin.height < wizardPage.width ? bedelevelingButton.width + skipBedlevelingButton.width + UM.Theme.sizes.default_margin.height : wizardPage.width
|
||||
height: skipBedlevelingButton.height
|
||||
width: bedlevelingButton.width + skipBedlevelingButton.width + UM.Theme.sizes.default_margin.height < wizardPage.width ? bedlevelingButton.width + skipBedlevelingButton.width + UM.Theme.sizes.default_margin.height : wizardPage.width
|
||||
Button
|
||||
{
|
||||
id: bedelevelingButton
|
||||
id: bedlevelingButton
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
enabled: !alreadyTested
|
||||
text: catalog.i18nc("@action:button","Move to Next Position");
|
||||
onClicked:
|
||||
{
|
||||
if(wizardPage.leveling_state == 0)
|
||||
{
|
||||
printer_connection.moveHead(platform_width /2 , platform_height,0)
|
||||
printer_connection.moveHead(platform_width, 0 ,0)
|
||||
}
|
||||
if(wizardPage.leveling_state == 1)
|
||||
{
|
||||
printer_connection.moveHead(platform_width , 0,0)
|
||||
printer_connection.moveHead(platform_width/2, platform_height, 0)
|
||||
}
|
||||
if(wizardPage.leveling_state == 2)
|
||||
{
|
||||
printer_connection.moveHead(0, 0 ,0)
|
||||
printer_connection.moveHead(0, 0, 0)
|
||||
}
|
||||
wizardPage.leveling_state++
|
||||
|
||||
if (wizardPage.leveling_state >= 3){
|
||||
base.addOriginalProgress.bedLeveling = true
|
||||
resultText.visible = true
|
||||
skipBedlevelingButton.enabled = false
|
||||
bedlevelingButton.enabled = false
|
||||
wizardPage.leveling_state = 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Button
|
||||
{
|
||||
id: skipBedlevelingButton
|
||||
anchors.top: parent.width < wizardPage.width ? parent.top : bedelevelingButton.bottom
|
||||
enabled: !alreadyTested
|
||||
anchors.top: parent.width < wizardPage.width ? parent.top : bedlevelingButton.bottom
|
||||
anchors.topMargin: parent.width < wizardPage.width ? 0 : UM.Theme.sizes.default_margin.height/2
|
||||
anchors.left: parent.width < wizardPage.width ? bedelevelingButton.right : parent.left
|
||||
anchors.left: parent.width < wizardPage.width ? bedlevelingButton.right : parent.left
|
||||
anchors.leftMargin: parent.width < wizardPage.width ? UM.Theme.sizes.default_margin.width : 0
|
||||
text: catalog.i18nc("@action:button","Skip Bedleveling");
|
||||
onClicked: base.visible = false;
|
||||
}
|
||||
}
|
||||
|
||||
Label
|
||||
{
|
||||
id: resultText
|
||||
visible: alreadyTested
|
||||
anchors.top: bedlevelingWrapper.bottom
|
||||
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||
anchors.left: parent.left
|
||||
width: parent.width
|
||||
wrapMode: Text.WordWrap
|
||||
text: catalog.i18nc("@label", "Everythink is in order! You're done with bedeleveling.")
|
||||
}
|
||||
|
||||
function threePointLeveling(width, height)
|
||||
{
|
||||
|
||||
|
@ -14,6 +14,19 @@ Item
|
||||
|
||||
SystemPalette{id: palette}
|
||||
UM.I18nCatalog { id: catalog; name:"cura"}
|
||||
|
||||
Component.onDestruction:
|
||||
{
|
||||
base.addOriginalProgress.upgrades[0] = extruderCheckBox.checked
|
||||
base.addOriginalProgress.upgrades[1] = heatedBedCheckBox1.checked
|
||||
base.addOriginalProgress.upgrades[2] = heatedBedCheckBox2.checked
|
||||
if (extruderCheckBox.checked == true){
|
||||
UM.MachineManager.setMachineSettingValue("machine_extruder_drive_upgrade", true);
|
||||
}
|
||||
if (heatedBedCheckBox1.checked == true || heatedBedCheckBox2.checked == true){
|
||||
UM.MachineManager.setMachineSettingValue("machine_heated_bed", true)
|
||||
}
|
||||
}
|
||||
Label
|
||||
{
|
||||
id: pageTitle
|
||||
@ -43,24 +56,31 @@ Item
|
||||
width: parent.width - UM.Theme.sizes.default_margin.width
|
||||
CheckBox
|
||||
{
|
||||
id: checkBox
|
||||
id: extruderCheckBox
|
||||
text: catalog.i18nc("@option:check","Extruder driver ugrades")
|
||||
checked: true
|
||||
checked: base.addOriginalProgress.upgrades[0]
|
||||
}
|
||||
CheckBox
|
||||
{
|
||||
id: heatedBedCheckBox1
|
||||
text: catalog.i18nc("@option:check","Heated printer bed (standard kit)")
|
||||
y: checkBox.height * 1
|
||||
y: extruderCheckBox.height * 1
|
||||
checked: base.addOriginalProgress.upgrades[1]
|
||||
onClicked: {
|
||||
if (heatedBedCheckBox2.checked == true)
|
||||
heatedBedCheckBox2.checked = false
|
||||
}
|
||||
}
|
||||
CheckBox
|
||||
{
|
||||
id: heatedBedCheckBox2
|
||||
text: catalog.i18nc("@option:check","Heated printer bed (self built)")
|
||||
y: checkBox.height * 2
|
||||
}
|
||||
CheckBox
|
||||
{
|
||||
text: catalog.i18nc("@option:check","Dual extrusion (experimental)")
|
||||
y: checkBox.height * 3
|
||||
y: extruderCheckBox.height * 2
|
||||
checked: base.addOriginalProgress.upgrades[2]
|
||||
onClicked: {
|
||||
if (heatedBedCheckBox1.checked == true)
|
||||
heatedBedCheckBox1.checked = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -74,4 +94,4 @@ Item
|
||||
}
|
||||
|
||||
ExclusiveGroup { id: printerGroup; }
|
||||
}
|
||||
}
|
||||
|
@ -14,24 +14,51 @@ Item
|
||||
property int leftRow: wizardPage.width*0.40
|
||||
property int rightRow: wizardPage.width*0.60
|
||||
anchors.fill: parent;
|
||||
property bool alreadyTested: base.addOriginalProgress.checkUp[base.addOriginalProgress.checkUp.length-1]
|
||||
property bool x_min_pressed: false
|
||||
property bool y_min_pressed: false
|
||||
property bool z_min_pressed: false
|
||||
property bool heater_works: false
|
||||
property int extruder_target_temp: 0
|
||||
property int bed_target_temp: 0
|
||||
property variant printer_connection: UM.USBPrinterManager.connectedPrinterList.rowCount() != 0 ? UM.USBPrinterManager.connectedPrinterList.getItem(0).printer: null
|
||||
property variant printer_connection: {
|
||||
if (UM.USBPrinterManager.connectedPrinterList.rowCount() != 0){
|
||||
base.addOriginalProgress.checkUp[0] = true
|
||||
checkTotalCheckUp()
|
||||
return UM.USBPrinterManager.connectedPrinterList.getItem(0).printer
|
||||
}
|
||||
else {
|
||||
return null
|
||||
}
|
||||
}
|
||||
//property variant printer_connection: UM.USBPrinterManager.connectedPrinterList.getItem(0).printer
|
||||
UM.I18nCatalog { id: catalog; name:"cura"}
|
||||
|
||||
function checkTotalCheckUp(){
|
||||
var allDone = true
|
||||
for (var i = 0; i < (base.addOriginalProgress.checkUp.length - 1); i++){
|
||||
if (base.addOriginalProgress.checkUp[i] == false){
|
||||
allDone = false
|
||||
}
|
||||
}
|
||||
if (allDone == true){
|
||||
base.addOriginalProgress.checkUp[base.addOriginalProgress.checkUp.length] = true
|
||||
skipCheckButton.enabled = false
|
||||
resultText.visible = true
|
||||
}
|
||||
}
|
||||
|
||||
Component.onCompleted:
|
||||
{
|
||||
if (printer_connection != null)
|
||||
if (printer_connection != null){
|
||||
printer_connection.startPollEndstop()
|
||||
}
|
||||
}
|
||||
Component.onDestruction:
|
||||
{
|
||||
if (printer_connection != null)
|
||||
if (printer_connection != null){
|
||||
printer_connection.stopPollEndstop()
|
||||
}
|
||||
}
|
||||
Label
|
||||
{
|
||||
@ -64,11 +91,12 @@ Item
|
||||
id: startCheckButton
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
enabled: !alreadyTested
|
||||
text: catalog.i18nc("@action:button","Start Printer Check");
|
||||
enabled: manager.progress >= 100;
|
||||
onClicked: {
|
||||
checkupContent.visible = true
|
||||
startCheckButton.enabled = false
|
||||
printer_connection.homeHead()
|
||||
}
|
||||
}
|
||||
|
||||
@ -79,8 +107,8 @@ Item
|
||||
anchors.topMargin: parent.width < wizardPage.width ? 0 : UM.Theme.sizes.default_margin.height/2
|
||||
anchors.left: parent.width < wizardPage.width ? startCheckButton.right : parent.left
|
||||
anchors.leftMargin: parent.width < wizardPage.width ? UM.Theme.sizes.default_margin.width : 0
|
||||
enabled: !alreadyTested
|
||||
text: catalog.i18nc("@action:button","Skip Printer Check");
|
||||
enabled: manager.progress >= 100;
|
||||
onClicked: {
|
||||
base.currentPage += 1
|
||||
}
|
||||
@ -91,7 +119,7 @@ Item
|
||||
id: checkupContent
|
||||
anchors.top: startStopButtons.bottom
|
||||
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||
visible: false
|
||||
visible: alreadyTested
|
||||
//////////////////////////////////////////////////////////
|
||||
Label
|
||||
{
|
||||
@ -109,7 +137,7 @@ Item
|
||||
anchors.left: connectionLabel.right
|
||||
anchors.top: parent.top
|
||||
wrapMode: Text.WordWrap
|
||||
text: UM.USBPrinterManager.connectedPrinterList.count ? catalog.i18nc("@info:status","Done"):catalog.i18nc("@info:status","Incomplete")
|
||||
text: UM.USBPrinterManager.connectedPrinterList.rowCount() > 0 || base.addOriginalProgress.checkUp[0] ? catalog.i18nc("@info:status","Done"):catalog.i18nc("@info:status","Incomplete")
|
||||
}
|
||||
//////////////////////////////////////////////////////////
|
||||
Label
|
||||
@ -128,7 +156,7 @@ Item
|
||||
anchors.left: endstopXLabel.right
|
||||
anchors.top: connectionLabel.bottom
|
||||
wrapMode: Text.WordWrap
|
||||
text: x_min_pressed ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked")
|
||||
text: x_min_pressed || base.addOriginalProgress.checkUp[1] ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked")
|
||||
}
|
||||
//////////////////////////////////////////////////////////////
|
||||
Label
|
||||
@ -147,7 +175,7 @@ Item
|
||||
anchors.left: endstopYLabel.right
|
||||
anchors.top: endstopXLabel.bottom
|
||||
wrapMode: Text.WordWrap
|
||||
text: y_min_pressed ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked")
|
||||
text: y_min_pressed || base.addOriginalProgress.checkUp[2] ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked")
|
||||
}
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
Label
|
||||
@ -166,7 +194,7 @@ Item
|
||||
anchors.left: endstopZLabel.right
|
||||
anchors.top: endstopYLabel.bottom
|
||||
wrapMode: Text.WordWrap
|
||||
text: z_min_pressed ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked")
|
||||
text: z_min_pressed || base.addOriginalProgress.checkUp[3] ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked")
|
||||
}
|
||||
////////////////////////////////////////////////////////////
|
||||
Label
|
||||
@ -205,9 +233,14 @@ Item
|
||||
{
|
||||
if(printer_connection != null)
|
||||
{
|
||||
heater_status_label.text = catalog.i18nc("@info:progress","Checking")
|
||||
printer_connection.heatupNozzle(190)
|
||||
wizardPage.extruder_target_temp = 190
|
||||
if (alreadyTested){
|
||||
nozzleTempStatus.text = catalog.i18nc("@info:status","Works")
|
||||
}
|
||||
else {
|
||||
nozzleTempStatus.text = catalog.i18nc("@info:progress","Checking")
|
||||
printer_connection.heatupNozzle(190)
|
||||
wizardPage.extruder_target_temp = 190
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -261,9 +294,14 @@ Item
|
||||
{
|
||||
if(printer_connection != null)
|
||||
{
|
||||
bedTempStatus.text = catalog.i18nc("@info:progress","Checking")
|
||||
printer_connection.heatupBed(60)
|
||||
wizardPage.bed_target_temp = 60
|
||||
if (alreadyTested){
|
||||
bedTempStatus.text = catalog.i18nc("@info:status","Works")
|
||||
}
|
||||
else {
|
||||
bedTempStatus.text = catalog.i18nc("@info:progress","Checking")
|
||||
printer_connection.heatupBed(60)
|
||||
wizardPage.bed_target_temp = 60
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -279,6 +317,17 @@ Item
|
||||
text: printer_connection != null ? printer_connection.bedTemperature + "°C": "0°C"
|
||||
font.bold: true
|
||||
}
|
||||
Label
|
||||
{
|
||||
id: resultText
|
||||
visible: base.addOriginalProgress.checkUp[base.addOriginalProgress.checkUp.length-1]
|
||||
anchors.top: bedTemp.bottom
|
||||
anchors.topMargin: UM.Theme.sizes.default_margin.height
|
||||
anchors.left: parent.left
|
||||
width: parent.width
|
||||
wrapMode: Text.WordWrap
|
||||
text: catalog.i18nc("@label", "Everything is in order! You're done with your CheckUp.")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -289,24 +338,33 @@ Item
|
||||
{
|
||||
if(key == "x_min")
|
||||
{
|
||||
base.addOriginalProgress.checkUp[1] = true
|
||||
x_min_pressed = true
|
||||
checkTotalCheckUp()
|
||||
}
|
||||
if(key == "y_min")
|
||||
{
|
||||
base.addOriginalProgress.checkUp[2] = true
|
||||
y_min_pressed = true
|
||||
checkTotalCheckUp()
|
||||
}
|
||||
if(key == "z_min")
|
||||
{
|
||||
base.addOriginalProgress.checkUp[3] = true
|
||||
z_min_pressed = true
|
||||
checkTotalCheckUp()
|
||||
}
|
||||
}
|
||||
|
||||
onExtruderTemperatureChanged:
|
||||
{
|
||||
if(printer_connection.extruderTemperature > wizardPage.extruder_target_temp - 10 && printer_connection.extruderTemperature < wizardPage.extruder_target_temp + 10)
|
||||
{
|
||||
if(printer_connection != null)
|
||||
{
|
||||
heater_status_label.text = catalog.i18nc("@info:status","Works")
|
||||
nozzleTempStatus.text = catalog.i18nc("@info:status","Works")
|
||||
base.addOriginalProgress.checkUp[4] = true
|
||||
checkTotalCheckUp()
|
||||
printer_connection.heatupNozzle(0)
|
||||
}
|
||||
}
|
||||
@ -315,7 +373,9 @@ Item
|
||||
{
|
||||
if(printer_connection.bedTemperature > wizardPage.bed_target_temp - 5 && printer_connection.bedTemperature < wizardPage.bed_target_temp + 5)
|
||||
{
|
||||
bed_status_label.text = catalog.i18nc("@info:status","Works")
|
||||
bedTempStatus.text = catalog.i18nc("@info:status","Works")
|
||||
base.addOriginalProgress.checkUp[5] = true
|
||||
checkTotalCheckUp()
|
||||
printer_connection.heatupBed(0)
|
||||
}
|
||||
}
|
||||
|
@ -14,6 +14,7 @@ Item
|
||||
|
||||
SystemPalette{id: palette}
|
||||
UM.I18nCatalog { id: catalog; name:"cura"}
|
||||
property variant printer_connection: UM.USBPrinterManager.connectedPrinterList.rowCount() != 0 ? UM.USBPrinterManager.connectedPrinterList.getItem(0).printer : null
|
||||
Label
|
||||
{
|
||||
id: pageTitle
|
||||
@ -61,6 +62,7 @@ Item
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
text: catalog.i18nc("@action:button","Upgrade to Marlin Firmware");
|
||||
onClicked: UM.USBPrinterManager.updateAllFirmware()
|
||||
}
|
||||
Button {
|
||||
id: skipUpgradeButton
|
||||
|
49
resources/settings/innovo-inventor.json
Normal file
49
resources/settings/innovo-inventor.json
Normal 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 }
|
||||
}
|
||||
}
|
10376
resources/themes/cura/icons/cross1.svg
Normal file
10376
resources/themes/cura/icons/cross1.svg
Normal file
File diff suppressed because it is too large
Load Diff
After Width: | Height: | Size: 760 KiB |
12
resources/themes/cura/icons/settings.svg
Normal file
12
resources/themes/cura/icons/settings.svg
Normal 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 |
@ -34,17 +34,17 @@ QtObject {
|
||||
elide: Text.ElideRight;
|
||||
anchors.left: parent.left;
|
||||
anchors.leftMargin: UM.Theme.sizes.setting_unit_margin.width
|
||||
anchors.right: downArrow.left;
|
||||
anchors.rightMargin: UM.Theme.sizes.setting_unit_margin.width
|
||||
anchors.right: separationLine.left;
|
||||
anchors.verticalCenter: parent.verticalCenter;
|
||||
font: UM.Theme.fonts.default
|
||||
}
|
||||
Rectangle{
|
||||
id: separationLine
|
||||
width: 1
|
||||
height: UM.Theme.sizes.setting_control.height
|
||||
color: UM.Theme.colors.setting_control_border
|
||||
anchors.right: sidebarComboBoxLabel.right
|
||||
anchors.rightMargin: UM.Theme.sizes.setting_unit_margin.width
|
||||
anchors.right: downArrow.left
|
||||
anchors.rightMargin: UM.Theme.sizes.setting_unit_margin.width + downArrow.width/2
|
||||
anchors.top: parent.top
|
||||
z: parent.z + 1
|
||||
}
|
||||
@ -57,11 +57,11 @@ QtObject {
|
||||
ButtonStyle {
|
||||
background: Item{
|
||||
implicitWidth: UM.Theme.sizes.button.width;
|
||||
implicitHeight: UM.Theme.sizes.button.width;
|
||||
implicitHeight: UM.Theme.sizes.button.height;
|
||||
Rectangle {
|
||||
anchors.left: parent.right
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
color: "white"
|
||||
color: UM.Theme.colors.button_text
|
||||
width: control.hovered ? openFileLabel.width : 0;
|
||||
height: openFileLabel.height
|
||||
Behavior on width { NumberAnimation { duration: 100; } }
|
||||
@ -87,7 +87,7 @@ QtObject {
|
||||
source: control.iconSource;
|
||||
width: UM.Theme.sizes.button_icon.width;
|
||||
height: UM.Theme.sizes.button_icon.height;
|
||||
sourceSize: UM.Theme.sizes.button_icon;
|
||||
sourceSize: UM.Theme.sizes.button_icon
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -139,13 +139,10 @@ QtObject {
|
||||
id: buttonFace;
|
||||
|
||||
anchors.fill: parent;
|
||||
|
||||
property bool down: control.pressed || (control.checkable && control.checked);
|
||||
|
||||
color: {
|
||||
if(!control.enabled) {
|
||||
return UM.Theme.colors.button_disabled;
|
||||
} else if(control.checkable && control.checked && control.hovered) {
|
||||
if(control.checkable && control.checked && control.hovered) {
|
||||
return UM.Theme.colors.button_active_hover;
|
||||
} else if(control.pressed || (control.checkable && control.checked)) {
|
||||
return UM.Theme.colors.button_active;
|
||||
@ -159,6 +156,7 @@ QtObject {
|
||||
|
||||
Label {
|
||||
id: tool_button_arrow
|
||||
opacity: !control.enabled ? 0.4 : 1.0
|
||||
anchors.right: parent.right;
|
||||
anchors.rightMargin: (UM.Theme.sizes.button.width - UM.Theme.sizes.button_icon.width - tool_button_arrow.width) / 2
|
||||
anchors.verticalCenter: parent.verticalCenter;
|
||||
@ -173,12 +171,12 @@ QtObject {
|
||||
label: Item {
|
||||
Image {
|
||||
anchors.centerIn: parent;
|
||||
|
||||
opacity: !control.enabled ? 0.4 : 1.0
|
||||
source: control.iconSource;
|
||||
width: UM.Theme.sizes.button_icon.width;
|
||||
height: UM.Theme.sizes.button_icon.height;
|
||||
|
||||
sourceSize: UM.Theme.sizes.button_icon;
|
||||
sourceSize: UM.Theme.sizes.button_icon
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -243,7 +241,7 @@ QtObject {
|
||||
width: UM.Theme.sizes.button_icon.width;
|
||||
height: UM.Theme.sizes.button_icon.height;
|
||||
|
||||
sourceSize: UM.Theme.sizes.button_icon;
|
||||
sourceSize: UM.Theme.sizes.button_icon
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -334,10 +332,10 @@ QtObject {
|
||||
minimumPointSize: 8
|
||||
}
|
||||
UM.RecolorImage {
|
||||
id: lengthIcon
|
||||
id: category_arrow
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: UM.Theme.sizes.default_margin.width * 2
|
||||
anchors.rightMargin: UM.Theme.sizes.default_margin.width * 2 - width / 2
|
||||
width: UM.Theme.sizes.standard_arrow.width
|
||||
height: UM.Theme.sizes.standard_arrow.height
|
||||
sourceSize.width: width
|
||||
|
@ -32,10 +32,11 @@
|
||||
"capitalize": true,
|
||||
"family": "Roboto"
|
||||
},
|
||||
"timeslider_time": {
|
||||
"default_header": {
|
||||
"size": 1.0,
|
||||
"bold": true,
|
||||
"family": "Roboto"
|
||||
"family": "Roboto",
|
||||
"letterSpacing": 2.0
|
||||
},
|
||||
"button_tooltip": {
|
||||
"size": 0.75,
|
||||
@ -71,7 +72,7 @@
|
||||
"button_active": [32, 166, 219, 255],
|
||||
"button_active_hover": [77, 184, 226, 255],
|
||||
"button_text": [255, 255, 255, 255],
|
||||
"button_disabled": [245, 245, 245, 255],
|
||||
"button_disabled": [0, 0, 0, 255],
|
||||
"button_tooltip_text": [35, 35, 35, 255],
|
||||
|
||||
"toggle_active": [255, 255, 255, 255],
|
||||
@ -82,7 +83,8 @@
|
||||
"load_save_button": [0, 0, 0, 255],
|
||||
"load_save_button_text": [255, 255, 255, 255],
|
||||
"load_save_button_hover": [43, 45, 46, 255],
|
||||
"load_save_button_active": [43, 45, 46, 255],
|
||||
"load_save_button_inactive": [176, 184, 191, 255],
|
||||
"load_save_button_inactive_text": [209, 214, 219, 255],
|
||||
|
||||
"scrollbar_background": [245, 245, 245, 255],
|
||||
"scrollbar_handle": [12, 159, 227, 255],
|
||||
@ -91,15 +93,16 @@
|
||||
|
||||
"setting_category": [238, 238, 238, 255],
|
||||
"setting_category_disabled": [238, 238, 238, 255],
|
||||
"setting_category_hover": [240, 248, 255, 255],
|
||||
"setting_category_active": [238, 238, 238, 255],
|
||||
"setting_category_active_hover": [240, 248, 255, 255],
|
||||
"setting_category_hover": [231, 231, 231, 255],
|
||||
"setting_category_active": [240, 248, 255, 255],
|
||||
"setting_category_active_hover": [233, 244, 245, 255],
|
||||
"setting_category_text": [35, 35, 35, 255],
|
||||
|
||||
"setting_control": [255, 255, 255, 255],
|
||||
"setting_control_highlight": [245, 245, 245, 255],
|
||||
"setting_control_border": [174, 174, 174, 255],
|
||||
"setting_control_text": [0, 0, 0, 255],
|
||||
"setting_control_depth_line": [162, 192, 227, 255],
|
||||
"setting_control_hover": [139, 143, 153, 255],
|
||||
"setting_control_selected": [35, 35, 35, 255],
|
||||
"setting_control_revert": [85, 85, 85, 255],
|
||||
@ -126,16 +129,6 @@
|
||||
|
||||
"tooltip": [255, 225, 146, 255],
|
||||
|
||||
"save_button_border": [205, 202, 201, 255],
|
||||
"save_button_inactive": [205, 202, 201, 255],
|
||||
"save_button_active": [12, 159, 227, 255],
|
||||
"save_button_active_hover": [34, 150, 190, 255],
|
||||
"save_button_safe_to_text": [255, 255, 255, 255],
|
||||
"save_button_estimated_text": [140, 144, 154, 255],
|
||||
"save_button_estimated_text_background": [255, 255, 255, 255],
|
||||
"save_button_printtime_text": [12, 169, 227, 255],
|
||||
"save_button_background": [249, 249, 249, 255],
|
||||
|
||||
"message_background": [255, 255, 255, 255],
|
||||
"message_text": [32, 166, 219, 255],
|
||||
"message_dismiss": [139, 143, 153, 255],
|
||||
@ -147,40 +140,39 @@
|
||||
},
|
||||
|
||||
"sizes": {
|
||||
"window_margin": [2.0, 2.0],
|
||||
"window_margin": [1.5, 1.5],
|
||||
"default_margin": [1.0, 1.0],
|
||||
"default_lining": [0.1, 0.1],
|
||||
"logo": [9.5, 2.0],
|
||||
"toolbar_button": [2.0, 2.0],
|
||||
"toolbar_spacing": [1.0, 1.0],
|
||||
|
||||
"loadfile_button": [11.0, 2.4],
|
||||
"loadfile_margin": [0.8, 0.4],
|
||||
|
||||
"sidebar": [27.0, 10.0],
|
||||
"sidebar_header": [0.0, 3.2],
|
||||
"sidebar_setup": [0.0, 2.8],
|
||||
"sidebar": [26.0, 10.0],
|
||||
"sidebar_header": [0.0, 3.8],
|
||||
"sidebar_header_mode_toggle": [0.0, 2.4],
|
||||
"sidebar_setup": [0.0, 2.6],
|
||||
"sidebar_subParts": [0.0, 2.4],
|
||||
"sidebar_specs_bar": [0.0, 2.2],
|
||||
"sidebar_inputFields": [0.0, 1.9],
|
||||
"simple_mode_infill_caption": [0.0, 5.0],
|
||||
"simple_mode_infill_height": [0.0, 8.0],
|
||||
|
||||
"section": [0.0, 1.8],
|
||||
"section_icon": [1.2, 1.2],
|
||||
"section": [0.0, 2.0],
|
||||
"section_icon": [1.6, 1.6],
|
||||
"section_icon_column": [2.8, 0.0],
|
||||
|
||||
"setting": [21.0, 1.8],
|
||||
"setting_control": [6.0, 2.0],
|
||||
"setting_control_margin": [3.0, 3.0],
|
||||
"setting_control": [7.0, 2.0],
|
||||
"setting_control_depth_margin": [1.4, 0.0],
|
||||
"setting_preferences_button_margin": [3.3, 0.0],
|
||||
"setting_control_margin": [0.0, 0.0],
|
||||
"setting_unit_margin": [0.5, 0.5],
|
||||
"setting_text_maxwidth": [40.0, 0.0],
|
||||
"simple_mode_infill_caption": [0.0, 5.0],
|
||||
|
||||
"standard_list_lineheight": [1.5, 1.5],
|
||||
"standard_list_input": [20.0, 25.0],
|
||||
"standard_arrow": [0.6, 0.6],
|
||||
|
||||
"button": [3.2, 3.2],
|
||||
"button_icon": [2.5, 2.5],
|
||||
"button": [3.8, 3.8],
|
||||
"button_icon": [2.6, 2.6],
|
||||
|
||||
"progressbar": [26.0, 0.8],
|
||||
"progressbar_control": [8.0, 0.8],
|
||||
@ -201,6 +193,7 @@
|
||||
"tooltip_margins": [1.0, 1.0],
|
||||
|
||||
"save_button_border": [0.06, 0.06],
|
||||
"save_button_header": [0.0, 3.2],
|
||||
"save_button_text_margin": [0.3, 0.6],
|
||||
"save_button_slicing_bar": [0.0, 2.2],
|
||||
"save_button_label_margin": [0.5, 0.5],
|
||||
|
Loading…
x
Reference in New Issue
Block a user