This commit is contained in:
Jaime van Kessel 2016-02-12 09:46:23 +01:00
commit b2f37390fd
106 changed files with 29578 additions and 20272 deletions

View File

@ -44,7 +44,7 @@ if(NOT ${URANIUM_SCRIPTS_DIR} STREQUAL "")
file(GLOB po_files ${CMAKE_SOURCE_DIR}/resources/i18n/${lang}/*.po) file(GLOB po_files ${CMAKE_SOURCE_DIR}/resources/i18n/${lang}/*.po)
foreach(po_file ${po_files}) foreach(po_file ${po_files})
string(REGEX REPLACE ".*/(.*).po" "${CMAKE_BINARY_DIR}/resources/i18n/${lang}/LC_MESSAGES/\\1.mo" mo_file ${po_file}) string(REGEX REPLACE ".*/(.*).po" "${CMAKE_BINARY_DIR}/resources/i18n/${lang}/LC_MESSAGES/\\1.mo" mo_file ${po_file})
add_custom_command(TARGET translations POST_BUILD COMMAND mkdir ARGS -p ${CMAKE_BINARY_DIR}/resources/i18n/${lang}/LC_MESSAGES/ COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} ARGS ${po_file} -o ${mo_file}) add_custom_command(TARGET translations POST_BUILD COMMAND mkdir ARGS -p ${CMAKE_BINARY_DIR}/resources/i18n/${lang}/LC_MESSAGES/ COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} ARGS ${po_file} -o ${mo_file} -f)
endforeach() endforeach()
endforeach() endforeach()
install(DIRECTORY ${CMAKE_BINARY_DIR}/resources DESTINATION ${CMAKE_INSTALL_DATADIR}/cura) install(DIRECTORY ${CMAKE_BINARY_DIR}/resources DESTINATION ${CMAKE_INSTALL_DATADIR}/cura)
@ -60,6 +60,9 @@ if(NOT APPLE AND NOT WIN32)
install(DIRECTORY cura DESTINATION lib/python${PYTHON_VERSION_MAJOR}/dist-packages FILES_MATCHING PATTERN *.py) install(DIRECTORY cura DESTINATION lib/python${PYTHON_VERSION_MAJOR}/dist-packages FILES_MATCHING PATTERN *.py)
install(FILES ${CMAKE_BINARY_DIR}/CuraVersion.py DESTINATION lib/python${PYTHON_VERSION_MAJOR}/dist-packages/cura) install(FILES ${CMAKE_BINARY_DIR}/CuraVersion.py DESTINATION lib/python${PYTHON_VERSION_MAJOR}/dist-packages/cura)
install(FILES cura.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications) install(FILES cura.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications)
install(FILES cura.sharedmimeinfo
DESTINATION ${CMAKE_INSTALL_DATADIR}/mime/packages/
RENAME cura.xml )
else() else()
install(DIRECTORY cura DESTINATION lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages FILES_MATCHING PATTERN *.py) install(DIRECTORY cura DESTINATION lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages FILES_MATCHING PATTERN *.py)
install(FILES ${CMAKE_BINARY_DIR}/CuraVersion.py DESTINATION lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages/cura) install(FILES ${CMAKE_BINARY_DIR}/CuraVersion.py DESTINATION lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages/cura)

View File

@ -10,6 +10,6 @@ TryExec=/usr/bin/cura_app.py
Icon=/usr/share/cura/resources/images/cura-icon.png Icon=/usr/share/cura/resources/images/cura-icon.png
Terminal=false Terminal=false
Type=Application Type=Application
MimeType=application/sla;image/bmp;image/gif;image/jpeg;image/png MimeType=application/sla;application/vnd.ms-3mfdocument;application/prs.wavefront-obj;image/bmp;image/gif;image/jpeg;image/png
Categories=Graphics; Categories=Graphics;
Keywords=3D;Printing; Keywords=3D;Printing;

22
cura.sharedmimeinfo Normal file
View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
<mime-type type="application/vnd.ms-3mfdocument">
<comment>3D Manufacturing Format Document</comment>
<icon name="unknown"/>
<glob-deleteall/>
<glob pattern="*.3mf"/>
</mime-type>
<mime-type type="application/sla">
<comment>Computer-aided design and manufacturing format</comment>
<icon name="unknown"/>
<glob-deleteall/>
<glob pattern="*.stl"/>
</mime-type>
<mime-type type="application/prs.wavefront-obj">
<sub-class-of type="text/plain"/>
<comment>Wavefront 3D Object file</comment>
<icon name="unknown"/>
<glob-deleteall/>
<glob pattern="*.obj"/>
</mime-type>
</mime-info>

View File

@ -146,7 +146,7 @@ class BuildVolume(SceneNode):
skirt_size = 0.0 skirt_size = 0.0
profile = Application.getInstance().getMachineManager().getActiveProfile() profile = Application.getInstance().getMachineManager().getWorkingProfile()
if profile: if profile:
skirt_size = self._getSkirtSize(profile) skirt_size = self._getSkirtSize(profile)
@ -176,7 +176,7 @@ class BuildVolume(SceneNode):
if self._active_profile: if self._active_profile:
self._active_profile.settingValueChanged.disconnect(self._onSettingValueChanged) self._active_profile.settingValueChanged.disconnect(self._onSettingValueChanged)
self._active_profile = Application.getInstance().getMachineManager().getActiveProfile() self._active_profile = Application.getInstance().getMachineManager().getWorkingProfile()
if self._active_profile: if self._active_profile:
self._active_profile.settingValueChanged.connect(self._onSettingValueChanged) self._active_profile.settingValueChanged.connect(self._onSettingValueChanged)
self._updateDisallowedAreas() self._updateDisallowedAreas()

View File

@ -17,6 +17,7 @@ class ConvexHullDecorator(SceneNodeDecorator):
self._profile = None self._profile = None
Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onActiveProfileChanged) Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onActiveProfileChanged)
Application.getInstance().getMachineManager().activeMachineInstanceChanged.connect(self._onActiveMachineInstanceChanged)
self._onActiveProfileChanged() self._onActiveProfileChanged()
## Force that a new (empty) object is created upon copy. ## Force that a new (empty) object is created upon copy.
@ -62,11 +63,19 @@ class ConvexHullDecorator(SceneNodeDecorator):
if self._profile: if self._profile:
self._profile.settingValueChanged.disconnect(self._onSettingValueChanged) self._profile.settingValueChanged.disconnect(self._onSettingValueChanged)
self._profile = Application.getInstance().getMachineManager().getActiveProfile() self._profile = Application.getInstance().getMachineManager().getWorkingProfile()
if self._profile: if self._profile:
self._profile.settingValueChanged.connect(self._onSettingValueChanged) self._profile.settingValueChanged.connect(self._onSettingValueChanged)
def _onActiveMachineInstanceChanged(self):
if self._convex_hull_job:
self._convex_hull_job.cancel()
self.setConvexHull(None)
if self._convex_hull_node:
self._convex_hull_node.setParent(None)
self._convex_hull_node = None
def _onSettingValueChanged(self, setting): def _onSettingValueChanged(self, setting):
if setting == "print_sequence": if setting == "print_sequence":
if self._convex_hull_job: if self._convex_hull_job:

View File

@ -49,7 +49,7 @@ class ConvexHullJob(Job):
# This is done because of rounding errors. # This is done because of rounding errors.
hull = hull.getMinkowskiHull(Polygon(numpy.array([[-1, -1], [-1, 1], [1, 1], [1, -1]], numpy.float32))) hull = hull.getMinkowskiHull(Polygon(numpy.array([[-1, -1], [-1, 1], [1, 1], [1, -1]], numpy.float32)))
profile = Application.getInstance().getMachineManager().getActiveProfile() profile = Application.getInstance().getMachineManager().getWorkingProfile()
if profile: if profile:
if profile.getSettingValue("print_sequence") == "one_at_a_time" and not self._node.getParent().callDecoration("isGroup"): if profile.getSettingValue("print_sequence") == "one_at_a_time" and not self._node.getParent().callDecoration("isGroup"):
# Printing one at a time and it's not an object in a group # Printing one at a time and it's not an object in a group
@ -64,12 +64,17 @@ class ConvexHullJob(Job):
hull = hull.getMinkowskiHull(Polygon(numpy.array(profile.getSettingValue("machine_head_polygon"),numpy.float32))) hull = hull.getMinkowskiHull(Polygon(numpy.array(profile.getSettingValue("machine_head_polygon"),numpy.float32)))
else: else:
self._node.callDecoration("setConvexHullHead", None) self._node.callDecoration("setConvexHullHead", None)
if self._node.getParent() is None: #Node was already deleted before job is done.
self._node.callDecoration("setConvexHullNode",None)
self._node.callDecoration("setConvexHull", None)
self._node.callDecoration("setConvexHullJob", None)
return
hull_node = ConvexHullNode.ConvexHullNode(self._node, hull, Application.getInstance().getController().getScene().getRoot()) hull_node = ConvexHullNode.ConvexHullNode(self._node, hull, Application.getInstance().getController().getScene().getRoot())
self._node.callDecoration("setConvexHullNode", hull_node) self._node.callDecoration("setConvexHullNode", hull_node)
self._node.callDecoration("setConvexHull", hull) self._node.callDecoration("setConvexHull", hull)
self._node.callDecoration("setConvexHullJob", None) self._node.callDecoration("setConvexHullJob", None)
if self._node.getParent().callDecoration("isGroup"): if self._node.getParent() and self._node.getParent().callDecoration("isGroup"):
job = self._node.getParent().callDecoration("getConvexHullJob") job = self._node.getParent().callDecoration("getConvexHullJob")
if job: if job:
job.cancel() job.cancel()

View File

@ -57,8 +57,10 @@ numpy.seterr(all="ignore")
if platform.system() == "Linux": # Needed for platform.linux_distribution, which is not available on Windows and OSX if platform.system() == "Linux": # Needed for platform.linux_distribution, which is not available on Windows and OSX
# For Ubuntu: https://bugs.launchpad.net/ubuntu/+source/python-qt4/+bug/941826 # For Ubuntu: https://bugs.launchpad.net/ubuntu/+source/python-qt4/+bug/941826
if platform.linux_distribution()[0] in ("Ubuntu", ): # Just in case it also happens on Debian, so it can be added if platform.linux_distribution()[0] in ("Ubuntu", ): # TODO: Needs a "if X11_GFX == 'nvidia'" here. The workaround is only needed on Ubuntu+NVidia drivers. Other drivers are not affected, but fine with this fix.
from OpenGL import GL import ctypes
from ctypes.util import find_library
ctypes.CDLL(find_library('GL'), ctypes.RTLD_GLOBAL)
try: try:
from cura.CuraVersion import CuraVersion from cura.CuraVersion import CuraVersion
@ -100,10 +102,12 @@ class CuraApplication(QtApplication):
self._platform_activity = False self._platform_activity = False
self._scene_boundingbox = AxisAlignedBox() self._scene_boundingbox = AxisAlignedBox()
self._job_name = None self._job_name = None
self._center_after_select = False
self.getMachineManager().activeMachineInstanceChanged.connect(self._onActiveMachineChanged) self.getMachineManager().activeMachineInstanceChanged.connect(self._onActiveMachineChanged)
self.getMachineManager().addMachineRequested.connect(self._onAddMachineRequested) self.getMachineManager().addMachineRequested.connect(self._onAddMachineRequested)
self.getController().getScene().sceneChanged.connect(self.updatePlatformActivity) self.getController().getScene().sceneChanged.connect(self.updatePlatformActivity)
self.getController().toolOperationStopped.connect(self._onToolOperationStopped)
Resources.addType(self.ResourceTypes.QmlFiles, "qml") Resources.addType(self.ResourceTypes.QmlFiles, "qml")
Resources.addType(self.ResourceTypes.Firmware, "firmware") Resources.addType(self.ResourceTypes.Firmware, "firmware")
@ -146,9 +150,6 @@ class CuraApplication(QtApplication):
parser.add_argument("--debug", dest="debug-mode", action="store_true", default=False, help="Enable detailed crash reports.") parser.add_argument("--debug", dest="debug-mode", action="store_true", default=False, help="Enable detailed crash reports.")
def run(self): def run(self):
if "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION" not in os.environ or os.environ["PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION"] != "cpp":
Logger.log("w", "Using Python implementation of Protobuf, expect bad performance!")
self._i18n_catalog = i18nCatalog("cura"); self._i18n_catalog = i18nCatalog("cura");
i18nCatalog.setTagReplacements({ i18nCatalog.setTagReplacements({
@ -231,9 +232,7 @@ class CuraApplication(QtApplication):
else: else:
self.getController().setActiveTool("TranslateTool") self.getController().setActiveTool("TranslateTool")
if Preferences.getInstance().getValue("view/center_on_select"): if Preferences.getInstance().getValue("view/center_on_select"):
self._camera_animation.setStart(self.getController().getTool("CameraTool").getOrigin()) self._center_after_select = True
self._camera_animation.setTarget(Selection.getSelectedObject(0).getWorldPosition())
self._camera_animation.start()
else: else:
if self.getController().getActiveTool(): if self.getController().getActiveTool():
self._previous_active_tool = self.getController().getActiveTool().getPluginId() self._previous_active_tool = self.getController().getActiveTool().getPluginId()
@ -241,6 +240,13 @@ class CuraApplication(QtApplication):
else: else:
self._previous_active_tool = None self._previous_active_tool = None
def _onToolOperationStopped(self, event):
if self._center_after_select:
self._center_after_select = False
self._camera_animation.setStart(self.getController().getTool("CameraTool").getOrigin())
self._camera_animation.setTarget(Selection.getSelectedObject(0).getWorldPosition())
self._camera_animation.start()
requestAddPrinter = pyqtSignal() requestAddPrinter = pyqtSignal()
activityChanged = pyqtSignal() activityChanged = pyqtSignal()
sceneBoundingBoxChanged = pyqtSignal() sceneBoundingBoxChanged = pyqtSignal()
@ -493,18 +499,18 @@ class CuraApplication(QtApplication):
@pyqtSlot(str, result = "QVariant") @pyqtSlot(str, result = "QVariant")
def getSettingValue(self, key): def getSettingValue(self, key):
if not self.getMachineManager().getActiveProfile(): if not self.getMachineManager().getWorkingProfile():
return None return None
return self.getMachineManager().getActiveProfile().getSettingValue(key) return self.getMachineManager().getWorkingProfile().getSettingValue(key)
#return self.getActiveMachine().getSettingValueByKey(key) #return self.getActiveMachine().getSettingValueByKey(key)
## Change setting by key value pair ## Change setting by key value pair
@pyqtSlot(str, "QVariant") @pyqtSlot(str, "QVariant")
def setSettingValue(self, key, value): def setSettingValue(self, key, value):
if not self.getMachineManager().getActiveProfile(): if not self.getMachineManager().getWorkingProfile():
return return
self.getMachineManager().getActiveProfile().setSettingValue(key, value) self.getMachineManager().getWorkingProfile().setSettingValue(key, value)
@pyqtSlot() @pyqtSlot()
def mergeSelected(self): def mergeSelected(self):

View File

@ -131,7 +131,7 @@ class Layer():
continue continue
if not make_mesh and not (polygon.type == Polygon.MoveCombingType or polygon.type == Polygon.MoveRetractionType): if not make_mesh and not (polygon.type == Polygon.MoveCombingType or polygon.type == Polygon.MoveRetractionType):
continue continue
poly_color = polygon.getColor() poly_color = polygon.getColor()
points = numpy.copy(polygon.data) points = numpy.copy(polygon.data)
@ -140,26 +140,7 @@ class Layer():
if polygon.type == Polygon.MoveCombingType or polygon.type == Polygon.MoveRetractionType: if polygon.type == Polygon.MoveCombingType or polygon.type == Polygon.MoveRetractionType:
points[:,1] += 0.01 points[:,1] += 0.01
# Calculate normals for the entire polygon using numpy. normals = polygon.getNormals()
normals = numpy.copy(points)
normals[:,1] = 0.0 # We are only interested in 2D normals
# Calculate the edges between points.
# The call to numpy.roll shifts the entire array by one so that
# we end up subtracting each next point from the current, wrapping
# around. This gives us the edges from the next point to the current
# point.
normals[:] = normals[:] - numpy.roll(normals, -1, axis = 0)
# Calculate the length of each edge using standard Pythagoras
lengths = numpy.sqrt(normals[:,0] ** 2 + normals[:,2] ** 2)
# The normal of a 2D vector is equal to its x and y coordinates swapped
# and then x inverted. This code does that.
normals[:,[0, 2]] = normals[:,[2, 0]]
normals[:,0] *= -1
# Normalize the normals.
normals[:,0] /= lengths
normals[:,2] /= lengths
# Scale all by the line width of the polygon so we can easily offset. # Scale all by the line width of the polygon so we can easily offset.
normals *= (polygon.lineWidth / 2) normals *= (polygon.lineWidth / 2)
@ -199,16 +180,33 @@ class Polygon():
self._data = data self._data = data
self._line_width = line_width / 1000 self._line_width = line_width / 1000
if type == self.Inset0Type:
self._color = Color(1.0, 0.0, 0.0, 1.0)
elif self._type == self.InsetXType:
self._color = Color(0.0, 1.0, 0.0, 1.0)
elif self._type == self.SkinType:
self._color = Color(1.0, 1.0, 0.0, 1.0)
elif self._type == self.SupportType:
self._color = Color(0.0, 1.0, 1.0, 1.0)
elif self._type == self.SkirtType:
self._color = Color(0.0, 1.0, 1.0, 1.0)
elif self._type == self.InfillType:
self._color = Color(1.0, 0.74, 0.0, 1.0)
elif self._type == self.SupportInfillType:
self._color = Color(0.0, 1.0, 1.0, 1.0)
elif self._type == self.MoveCombingType:
self._color = Color(0.0, 0.0, 1.0, 1.0)
elif self._type == self.MoveRetractionType:
self._color = Color(0.5, 0.5, 1.0, 1.0)
else:
self._color = Color(1.0, 1.0, 1.0, 1.0)
def build(self, offset, vertices, colors, indices): def build(self, offset, vertices, colors, indices):
self._begin = offset self._begin = offset
self._end = self._begin + len(self._data) - 1 self._end = self._begin + len(self._data) - 1
color = self.getColor()
color.setValues(color.r * 0.5, color.g * 0.5, color.b * 0.5, color.a)
color = numpy.array([color.r, color.g, color.b, color.a], numpy.float32)
vertices[self._begin:self._end + 1, :] = self._data[:, :] vertices[self._begin:self._end + 1, :] = self._data[:, :]
colors[self._begin:self._end + 1, :] = color colors[self._begin:self._end + 1, :] = numpy.array([self._color.r * 0.5, self._color.g * 0.5, self._color.b * 0.5, self._color.a], numpy.float32)
for i in range(self._begin, self._end): for i in range(self._begin, self._end):
indices[i, 0] = i indices[i, 0] = i
@ -218,26 +216,7 @@ class Polygon():
indices[self._end, 1] = self._begin indices[self._end, 1] = self._begin
def getColor(self): def getColor(self):
if self._type == self.Inset0Type: return self._color
return Color(1.0, 0.0, 0.0, 1.0)
elif self._type == self.InsetXType:
return Color(0.0, 1.0, 0.0, 1.0)
elif self._type == self.SkinType:
return Color(1.0, 1.0, 0.0, 1.0)
elif self._type == self.SupportType:
return Color(0.0, 1.0, 1.0, 1.0)
elif self._type == self.SkirtType:
return Color(0.0, 1.0, 1.0, 1.0)
elif self._type == self.InfillType:
return Color(1.0, 0.74, 0.0, 1.0)
elif self._type == self.SupportInfillType:
return Color(0.0, 1.0, 1.0, 1.0)
elif self._type == self.MoveCombingType:
return Color(0.0, 0.0, 1.0, 1.0)
elif self._type == self.MoveRetractionType:
return Color(0.5, 0.5, 1.0, 1.0)
else:
return Color(1.0, 1.0, 1.0, 1.0)
def vertexCount(self): def vertexCount(self):
return len(self._data) return len(self._data)
@ -257,3 +236,27 @@ class Polygon():
@property @property
def lineWidth(self): def lineWidth(self):
return self._line_width return self._line_width
# Calculate normals for the entire polygon using numpy.
def getNormals(self):
normals = numpy.copy(self._data)
normals[:,1] = 0.0 # We are only interested in 2D normals
# Calculate the edges between points.
# The call to numpy.roll shifts the entire array by one so that
# we end up subtracting each next point from the current, wrapping
# around. This gives us the edges from the next point to the current
# point.
normals[:] = normals[:] - numpy.roll(normals, -1, axis = 0)
# Calculate the length of each edge using standard Pythagoras
lengths = numpy.sqrt(normals[:,0] ** 2 + normals[:,2] ** 2)
# The normal of a 2D vector is equal to its x and y coordinates swapped
# and then x inverted. This code does that.
normals[:,[0, 2]] = normals[:,[2, 0]]
normals[:,0] *= -1
# Normalize the normals.
normals[:,0] /= lengths
normals[:,2] /= lengths
return normals

View File

@ -21,7 +21,7 @@ class OneAtATimeIterator(Iterator.Iterator):
if not type(node) is SceneNode: if not type(node) is SceneNode:
continue continue
if node.getBoundingBox().height > Application.getInstance().getMachineManager().getActiveProfile().getSettingValue("gantry_height"): if node.getBoundingBox().height > Application.getInstance().getMachineManager().getWorkingProfile().getSettingValue("gantry_height"):
return return
if node.callDecoration("getConvexHull"): if node.callDecoration("getConvexHull"):
node_list.append(node) node_list.append(node)

View File

@ -66,6 +66,6 @@ class PrintInformation(QObject):
self.currentPrintTimeChanged.emit() self.currentPrintTimeChanged.emit()
# Material amount is sent as an amount of mm^3, so calculate length from that # Material amount is sent as an amount of mm^3, so calculate length from that
r = Application.getInstance().getMachineManager().getActiveProfile().getSettingValue("material_diameter") / 2 r = Application.getInstance().getMachineManager().getWorkingProfile().getSettingValue("material_diameter") / 2
self._material_amount = round((amount / (math.pi * r ** 2)) / 1000, 2) self._material_amount = round((amount / (math.pi * r ** 2)) / 1000, 2)
self.materialAmountChanged.emit() self.materialAmountChanged.emit()

View File

@ -12,15 +12,12 @@ def exceptHook(type, value, traceback):
sys.excepthook = exceptHook sys.excepthook = exceptHook
try: # Workaround for a race condition on certain systems where there
from google.protobuf.pyext import _message # is a race condition between Arcus and PyQt. Importing Arcus
except ImportError: # first seems to prevent Sip from going into a state where it
pass # tries to create PyQt objects on a non-main thread.
else: import Arcus
os.environ["PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION"] = "cpp" import cura.CuraApplication
if True: # To make the code style checker stop complaining
import cura.CuraApplication
if sys.platform == "win32" and hasattr(sys, "frozen"): if sys.platform == "win32" and hasattr(sys, "frozen"):
import os import os

View File

@ -13,68 +13,47 @@ class AutoSave(Extension):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
Preferences.getInstance().preferenceChanged.connect(self._onPreferenceChanged) #Preferences.getInstance().preferenceChanged.connect(self._onPreferenceChanged)
Preferences.getInstance().preferenceChanged.connect(self._triggerTimer)
machine_manager = Application.getInstance().getMachineManager() machine_manager = Application.getInstance().getMachineManager()
self._profile = None self._profile = None
machine_manager.activeProfileChanged.connect(self._onActiveProfileChanged) machine_manager.activeProfileChanged.connect(self._onActiveProfileChanged)
machine_manager.profileNameChanged.connect(self._onProfilesChanged) machine_manager.profileNameChanged.connect(self._triggerTimer)
machine_manager.profilesChanged.connect(self._onProfilesChanged) machine_manager.profilesChanged.connect(self._triggerTimer)
machine_manager.machineInstanceNameChanged.connect(self._onInstanceNameChanged) machine_manager.machineInstanceNameChanged.connect(self._triggerTimer)
machine_manager.machineInstancesChanged.connect(self._onInstancesChanged) machine_manager.machineInstancesChanged.connect(self._triggerTimer)
Application
self._onActiveProfileChanged() self._onActiveProfileChanged()
Preferences.getInstance().addPreference("cura/autosave_delay", 1000 * 10)
self._change_timer = QTimer() self._change_timer = QTimer()
self._change_timer.setInterval(1000 * 60) self._change_timer.setInterval(Preferences.getInstance().getValue("cura/autosave_delay"))
self._change_timer.setSingleShot(True) self._change_timer.setSingleShot(True)
self._change_timer.timeout.connect(self._onTimeout) self._change_timer.timeout.connect(self._onTimeout)
self._save_preferences = False self._saving = False
self._save_profiles = False
self._save_instances = False
def _onPreferenceChanged(self, preference): def _triggerTimer(self, *args):
self._save_preferences = True if not self._saving:
self._change_timer.start() self._change_timer.start()
def _onSettingValueChanged(self, setting):
self._save_profiles = True
self._change_timer.start()
def _onActiveProfileChanged(self): def _onActiveProfileChanged(self):
if self._profile: if self._profile:
self._profile.settingValueChanged.disconnect(self._onSettingValueChanged) self._profile.settingValueChanged.disconnect(self._triggerTimer)
self._profile = Application.getInstance().getMachineManager().getActiveProfile() self._profile = Application.getInstance().getMachineManager().getWorkingProfile()
if self._profile: if self._profile:
self._profile.settingValueChanged.connect(self._onSettingValueChanged) self._profile.settingValueChanged.connect(self._triggerTimer)
def _onProfilesChanged(self):
self._save_profiles = True
self._change_timer.start()
def _onInstanceNameChanged(self, name):
self._onInstancesChanged()
def _onInstancesChanged(self):
self._save_instances = True
self._change_timer.start()
def _onTimeout(self): def _onTimeout(self):
self._saving = True # To prevent the save process from triggering another autosave.
Logger.log("d", "Autosaving preferences, instances and profiles") Logger.log("d", "Autosaving preferences, instances and profiles")
if self._save_preferences: Preferences.getInstance().writeToFile(Resources.getStoragePath(Resources.Preferences, Application.getInstance().getApplicationName() + ".cfg"))
Preferences.getInstance().writeToFile(Resources.getStoragePath(Resources.Preferences, Application.getInstance().getApplicationName() + ".cfg")) Application.getInstance().getMachineManager().saveMachineInstances()
Application.getInstance().getMachineManager().saveProfiles()
if self._save_instances: self._saving = False
Application.getInstance().getMachineManager().saveMachineInstances()
if self._save_profiles:
Application.getInstance().getMachineManager().saveProfiles()
self._save_preferences = False
self._save_instances = False
self._save_profiles = False

View File

@ -0,0 +1,104 @@
syntax = "proto3";
package cura.proto;
message ObjectList
{
repeated Object objects = 1;
repeated Setting settings = 2;
}
// typeid 1
message Slice
{
repeated ObjectList object_lists = 1;
}
message Object
{
int64 id = 1;
bytes vertices = 2; //An array of 3 floats.
bytes normals = 3; //An array of 3 floats.
bytes indices = 4; //An array of ints.
repeated Setting settings = 5; // Setting override per object, overruling the global settings.
}
// typeid 3
message Progress
{
float amount = 1;
}
// typeid 2
message SlicedObjectList
{
repeated SlicedObject objects = 1;
}
message SlicedObject
{
int64 id = 1;
repeated Layer layers = 2;
}
message Layer {
int32 id = 1;
float height = 2;
float thickness = 3;
repeated Polygon polygons = 4;
}
message Polygon {
enum Type {
NoneType = 0;
Inset0Type = 1;
InsetXType = 2;
SkinType = 3;
SupportType = 4;
SkirtType = 5;
InfillType = 6;
SupportInfillType = 7;
MoveCombingType = 8;
MoveRetractionType = 9;
}
Type type = 1;
bytes points = 2;
float line_width = 3;
}
// typeid 4
message GCodeLayer {
int64 id = 1;
bytes data = 2;
}
// typeid 5
message ObjectPrintTime {
int64 id = 1;
float time = 2;
float material_amount = 3;
}
// typeid 6
message SettingList {
repeated Setting settings = 1;
}
message Setting {
string name = 1;
bytes value = 2;
}
// typeid 7
message GCodePrefix {
bytes data = 2;
}
// typeid 8
message SlicingFinished {
}

View File

@ -9,12 +9,13 @@ from UM.Preferences import Preferences
from UM.Math.Vector import Vector from UM.Math.Vector import Vector
from UM.Signal import Signal from UM.Signal import Signal
from UM.Logger import Logger from UM.Logger import Logger
from UM.Qt.Bindings.BackendProxy import BackendState #To determine the state of the slicing job.
from UM.Resources import Resources from UM.Resources import Resources
from UM.Settings.SettingOverrideDecorator import SettingOverrideDecorator from UM.Settings.SettingOverrideDecorator import SettingOverrideDecorator
from UM.Message import Message from UM.Message import Message
from UM.PluginRegistry import PluginRegistry
from cura.OneAtATimeIterator import OneAtATimeIterator from cura.OneAtATimeIterator import OneAtATimeIterator
from . import Cura_pb2
from . import ProcessSlicedObjectListJob from . import ProcessSlicedObjectListJob
from . import ProcessGCodeJob from . import ProcessGCodeJob
from . import StartSliceJob from . import StartSliceJob
@ -61,11 +62,12 @@ class CuraEngineBackend(Backend):
self._change_timer.setSingleShot(True) self._change_timer.setSingleShot(True)
self._change_timer.timeout.connect(self.slice) self._change_timer.timeout.connect(self.slice)
self._message_handlers[Cura_pb2.SlicedObjectList] = self._onSlicedObjectListMessage self._message_handlers["cura.proto.SlicedObjectList"] = self._onSlicedObjectListMessage
self._message_handlers[Cura_pb2.Progress] = self._onProgressMessage self._message_handlers["cura.proto.Progress"] = self._onProgressMessage
self._message_handlers[Cura_pb2.GCodeLayer] = self._onGCodeLayerMessage self._message_handlers["cura.proto.GCodeLayer"] = self._onGCodeLayerMessage
self._message_handlers[Cura_pb2.GCodePrefix] = self._onGCodePrefixMessage self._message_handlers["cura.proto.GCodePrefix"] = self._onGCodePrefixMessage
self._message_handlers[Cura_pb2.ObjectPrintTime] = self._onObjectPrintTimeMessage self._message_handlers["cura.proto.ObjectPrintTime"] = self._onObjectPrintTimeMessage
self._message_handlers["cura.proto.SlicingFinished"] = self._onSlicingFinishedMessage
self._slicing = False self._slicing = False
self._restart = False self._restart = False
@ -74,6 +76,8 @@ class CuraEngineBackend(Backend):
self._message = None self._message = None
self.backendQuit.connect(self._onBackendQuit)
self.backendConnected.connect(self._onBackendConnected) self.backendConnected.connect(self._onBackendConnected)
Application.getInstance().getController().toolOperationStarted.connect(self._onToolOperationStarted) Application.getInstance().getController().toolOperationStarted.connect(self._onToolOperationStarted)
Application.getInstance().getController().toolOperationStopped.connect(self._onToolOperationStopped) Application.getInstance().getController().toolOperationStopped.connect(self._onToolOperationStopped)
@ -126,6 +130,7 @@ class CuraEngineBackend(Backend):
return #No slicing if we have error values since those are by definition illegal values. return #No slicing if we have error values since those are by definition illegal values.
self.processingProgress.emit(0.0) self.processingProgress.emit(0.0)
self.backendStateChange.emit(BackendState.NOT_STARTED)
if self._message: if self._message:
self._message.setProgress(-1) self._message.setProgress(-1)
#else: #else:
@ -148,6 +153,7 @@ class CuraEngineBackend(Backend):
Logger.log("d", "Killing engine process") Logger.log("d", "Killing engine process")
try: try:
self._process.terminate() self._process.terminate()
self._process = None
except: # terminating a process that is already terminating causes an exception, silently ignore this. except: # terminating a process that is already terminating causes an exception, silently ignore this.
pass pass
@ -177,7 +183,7 @@ class CuraEngineBackend(Backend):
if self._profile: if self._profile:
self._profile.settingValueChanged.disconnect(self._onSettingChanged) self._profile.settingValueChanged.disconnect(self._onSettingChanged)
self._profile = Application.getInstance().getMachineManager().getActiveProfile() self._profile = Application.getInstance().getMachineManager().getWorkingProfile()
if self._profile: if self._profile:
self._profile.settingValueChanged.connect(self._onSettingChanged) self._profile.settingValueChanged.connect(self._onSettingChanged)
self._onChanged() self._onChanged()
@ -197,15 +203,10 @@ class CuraEngineBackend(Backend):
self._message.setProgress(round(message.amount * 100)) self._message.setProgress(round(message.amount * 100))
self.processingProgress.emit(message.amount) self.processingProgress.emit(message.amount)
self.backendStateChange.emit(BackendState.PROCESSING)
def _onGCodeLayerMessage(self, message): def _onSlicingFinishedMessage(self, message):
self._scene.gcode_list.append(message.data.decode("utf-8", "replace")) self.backendStateChange.emit(BackendState.DONE)
def _onGCodePrefixMessage(self, message):
self._scene.gcode_list.insert(0, message.data.decode("utf-8", "replace"))
def _onObjectPrintTimeMessage(self, message):
self.printDurationMessage.emit(message.time, message.material_amount)
self.processingProgress.emit(1.0) self.processingProgress.emit(1.0)
self._slicing = False self._slicing = False
@ -215,23 +216,17 @@ class CuraEngineBackend(Backend):
self._message.hide() self._message.hide()
self._message = None self._message = None
if self._always_restart: def _onGCodeLayerMessage(self, message):
try: self._scene.gcode_list.append(message.data.decode("utf-8", "replace"))
self._process.terminate()
self._createSocket() def _onGCodePrefixMessage(self, message):
except: # terminating a process that is already terminating causes an exception, silently ignore this. self._scene.gcode_list.insert(0, message.data.decode("utf-8", "replace"))
pass
def _onObjectPrintTimeMessage(self, message):
self.printDurationMessage.emit(message.time, message.material_amount)
def _createSocket(self): def _createSocket(self):
super()._createSocket() super()._createSocket(os.path.abspath(os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), "Cura.proto")))
self._socket.registerMessageType(1, Cura_pb2.Slice)
self._socket.registerMessageType(2, Cura_pb2.SlicedObjectList)
self._socket.registerMessageType(3, Cura_pb2.Progress)
self._socket.registerMessageType(4, Cura_pb2.GCodeLayer)
self._socket.registerMessageType(5, Cura_pb2.ObjectPrintTime)
self._socket.registerMessageType(6, Cura_pb2.SettingList)
self._socket.registerMessageType(7, Cura_pb2.GCodePrefix)
## Manually triggers a reslice ## Manually triggers a reslice
def forceSlice(self): def forceSlice(self):
@ -254,7 +249,6 @@ class CuraEngineBackend(Backend):
def _onToolOperationStopped(self, tool): def _onToolOperationStopped(self, tool):
self._enabled = True # Tool stop, start listening for changes again. self._enabled = True # Tool stop, start listening for changes again.
self._onChanged()
def _onActiveViewChanged(self): def _onActiveViewChanged(self):
if Application.getInstance().getController().getActiveView(): if Application.getInstance().getController().getActiveView():
@ -270,7 +264,11 @@ class CuraEngineBackend(Backend):
else: else:
self._layer_view_active = False self._layer_view_active = False
def _onInstanceChanged(self): def _onInstanceChanged(self):
self._terminate() self._terminate()
self.slicingCancelled.emit() self.slicingCancelled.emit()
def _onBackendQuit(self):
if not self._restart and self._process:
self._process = None
self._createSocket()

View File

@ -1,739 +0,0 @@
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: Cura.proto
import sys
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
from google.protobuf import descriptor_pb2
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor.FileDescriptor(
name='Cura.proto',
package='cura.proto',
syntax='proto3',
serialized_pb=_b('\n\nCura.proto\x12\ncura.proto\"X\n\nObjectList\x12#\n\x07objects\x18\x01 \x03(\x0b\x32\x12.cura.proto.Object\x12%\n\x08settings\x18\x02 \x03(\x0b\x32\x13.cura.proto.Setting\"5\n\x05Slice\x12,\n\x0cobject_lists\x18\x01 \x03(\x0b\x32\x16.cura.proto.ObjectList\"o\n\x06Object\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x10\n\x08vertices\x18\x02 \x01(\x0c\x12\x0f\n\x07normals\x18\x03 \x01(\x0c\x12\x0f\n\x07indices\x18\x04 \x01(\x0c\x12%\n\x08settings\x18\x05 \x03(\x0b\x32\x13.cura.proto.Setting\"\x1a\n\x08Progress\x12\x0e\n\x06\x61mount\x18\x01 \x01(\x02\"=\n\x10SlicedObjectList\x12)\n\x07objects\x18\x01 \x03(\x0b\x32\x18.cura.proto.SlicedObject\"=\n\x0cSlicedObject\x12\n\n\x02id\x18\x01 \x01(\x03\x12!\n\x06layers\x18\x02 \x03(\x0b\x32\x11.cura.proto.Layer\"]\n\x05Layer\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x0e\n\x06height\x18\x02 \x01(\x02\x12\x11\n\tthickness\x18\x03 \x01(\x02\x12%\n\x08polygons\x18\x04 \x03(\x0b\x32\x13.cura.proto.Polygon\"\x8e\x02\n\x07Polygon\x12&\n\x04type\x18\x01 \x01(\x0e\x32\x18.cura.proto.Polygon.Type\x12\x0e\n\x06points\x18\x02 \x01(\x0c\x12\x12\n\nline_width\x18\x03 \x01(\x02\"\xb6\x01\n\x04Type\x12\x0c\n\x08NoneType\x10\x00\x12\x0e\n\nInset0Type\x10\x01\x12\x0e\n\nInsetXType\x10\x02\x12\x0c\n\x08SkinType\x10\x03\x12\x0f\n\x0bSupportType\x10\x04\x12\r\n\tSkirtType\x10\x05\x12\x0e\n\nInfillType\x10\x06\x12\x15\n\x11SupportInfillType\x10\x07\x12\x13\n\x0fMoveCombingType\x10\x08\x12\x16\n\x12MoveRetractionType\x10\t\"&\n\nGCodeLayer\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"D\n\x0fObjectPrintTime\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x0c\n\x04time\x18\x02 \x01(\x02\x12\x17\n\x0fmaterial_amount\x18\x03 \x01(\x02\"4\n\x0bSettingList\x12%\n\x08settings\x18\x01 \x03(\x0b\x32\x13.cura.proto.Setting\"&\n\x07Setting\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x0c\"\x1b\n\x0bGCodePrefix\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"\x11\n\x0fSlicingFinishedb\x06proto3')
)
_sym_db.RegisterFileDescriptor(DESCRIPTOR)
_POLYGON_TYPE = _descriptor.EnumDescriptor(
name='Type',
full_name='cura.proto.Polygon.Type',
filename=None,
file=DESCRIPTOR,
values=[
_descriptor.EnumValueDescriptor(
name='NoneType', index=0, number=0,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='Inset0Type', index=1, number=1,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='InsetXType', index=2, number=2,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='SkinType', index=3, number=3,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='SupportType', index=4, number=4,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='SkirtType', index=5, number=5,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='InfillType', index=6, number=6,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='SupportInfillType', index=7, number=7,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='MoveCombingType', index=8, number=8,
options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='MoveRetractionType', index=9, number=9,
options=None,
type=None),
],
containing_type=None,
options=None,
serialized_start=622,
serialized_end=804,
)
_sym_db.RegisterEnumDescriptor(_POLYGON_TYPE)
_OBJECTLIST = _descriptor.Descriptor(
name='ObjectList',
full_name='cura.proto.ObjectList',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='objects', full_name='cura.proto.ObjectList.objects', index=0,
number=1, type=11, cpp_type=10, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='settings', full_name='cura.proto.ObjectList.settings', index=1,
number=2, type=11, cpp_type=10, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=26,
serialized_end=114,
)
_SLICE = _descriptor.Descriptor(
name='Slice',
full_name='cura.proto.Slice',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='object_lists', full_name='cura.proto.Slice.object_lists', index=0,
number=1, type=11, cpp_type=10, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=116,
serialized_end=169,
)
_OBJECT = _descriptor.Descriptor(
name='Object',
full_name='cura.proto.Object',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='id', full_name='cura.proto.Object.id', index=0,
number=1, type=3, cpp_type=2, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='vertices', full_name='cura.proto.Object.vertices', index=1,
number=2, type=12, cpp_type=9, label=1,
has_default_value=False, default_value=_b(""),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='normals', full_name='cura.proto.Object.normals', index=2,
number=3, type=12, cpp_type=9, label=1,
has_default_value=False, default_value=_b(""),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='indices', full_name='cura.proto.Object.indices', index=3,
number=4, type=12, cpp_type=9, label=1,
has_default_value=False, default_value=_b(""),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='settings', full_name='cura.proto.Object.settings', index=4,
number=5, type=11, cpp_type=10, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=171,
serialized_end=282,
)
_PROGRESS = _descriptor.Descriptor(
name='Progress',
full_name='cura.proto.Progress',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='amount', full_name='cura.proto.Progress.amount', index=0,
number=1, type=2, cpp_type=6, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=284,
serialized_end=310,
)
_SLICEDOBJECTLIST = _descriptor.Descriptor(
name='SlicedObjectList',
full_name='cura.proto.SlicedObjectList',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='objects', full_name='cura.proto.SlicedObjectList.objects', index=0,
number=1, type=11, cpp_type=10, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=312,
serialized_end=373,
)
_SLICEDOBJECT = _descriptor.Descriptor(
name='SlicedObject',
full_name='cura.proto.SlicedObject',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='id', full_name='cura.proto.SlicedObject.id', index=0,
number=1, type=3, cpp_type=2, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='layers', full_name='cura.proto.SlicedObject.layers', index=1,
number=2, type=11, cpp_type=10, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=375,
serialized_end=436,
)
_LAYER = _descriptor.Descriptor(
name='Layer',
full_name='cura.proto.Layer',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='id', full_name='cura.proto.Layer.id', index=0,
number=1, type=5, cpp_type=1, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='height', full_name='cura.proto.Layer.height', index=1,
number=2, type=2, cpp_type=6, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='thickness', full_name='cura.proto.Layer.thickness', index=2,
number=3, type=2, cpp_type=6, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='polygons', full_name='cura.proto.Layer.polygons', index=3,
number=4, type=11, cpp_type=10, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=438,
serialized_end=531,
)
_POLYGON = _descriptor.Descriptor(
name='Polygon',
full_name='cura.proto.Polygon',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='type', full_name='cura.proto.Polygon.type', index=0,
number=1, type=14, cpp_type=8, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='points', full_name='cura.proto.Polygon.points', index=1,
number=2, type=12, cpp_type=9, label=1,
has_default_value=False, default_value=_b(""),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='line_width', full_name='cura.proto.Polygon.line_width', index=2,
number=3, type=2, cpp_type=6, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
_POLYGON_TYPE,
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=534,
serialized_end=804,
)
_GCODELAYER = _descriptor.Descriptor(
name='GCodeLayer',
full_name='cura.proto.GCodeLayer',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='id', full_name='cura.proto.GCodeLayer.id', index=0,
number=1, type=3, cpp_type=2, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='data', full_name='cura.proto.GCodeLayer.data', index=1,
number=2, type=12, cpp_type=9, label=1,
has_default_value=False, default_value=_b(""),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=806,
serialized_end=844,
)
_OBJECTPRINTTIME = _descriptor.Descriptor(
name='ObjectPrintTime',
full_name='cura.proto.ObjectPrintTime',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='id', full_name='cura.proto.ObjectPrintTime.id', index=0,
number=1, type=3, cpp_type=2, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='time', full_name='cura.proto.ObjectPrintTime.time', index=1,
number=2, type=2, cpp_type=6, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='material_amount', full_name='cura.proto.ObjectPrintTime.material_amount', index=2,
number=3, type=2, cpp_type=6, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=846,
serialized_end=914,
)
_SETTINGLIST = _descriptor.Descriptor(
name='SettingList',
full_name='cura.proto.SettingList',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='settings', full_name='cura.proto.SettingList.settings', index=0,
number=1, type=11, cpp_type=10, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=916,
serialized_end=968,
)
_SETTING = _descriptor.Descriptor(
name='Setting',
full_name='cura.proto.Setting',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='name', full_name='cura.proto.Setting.name', index=0,
number=1, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='value', full_name='cura.proto.Setting.value', index=1,
number=2, type=12, cpp_type=9, label=1,
has_default_value=False, default_value=_b(""),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=970,
serialized_end=1008,
)
_GCODEPREFIX = _descriptor.Descriptor(
name='GCodePrefix',
full_name='cura.proto.GCodePrefix',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='data', full_name='cura.proto.GCodePrefix.data', index=0,
number=2, type=12, cpp_type=9, label=1,
has_default_value=False, default_value=_b(""),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=1010,
serialized_end=1037,
)
_SLICINGFINISHED = _descriptor.Descriptor(
name='SlicingFinished',
full_name='cura.proto.SlicingFinished',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=1039,
serialized_end=1056,
)
_OBJECTLIST.fields_by_name['objects'].message_type = _OBJECT
_OBJECTLIST.fields_by_name['settings'].message_type = _SETTING
_SLICE.fields_by_name['object_lists'].message_type = _OBJECTLIST
_OBJECT.fields_by_name['settings'].message_type = _SETTING
_SLICEDOBJECTLIST.fields_by_name['objects'].message_type = _SLICEDOBJECT
_SLICEDOBJECT.fields_by_name['layers'].message_type = _LAYER
_LAYER.fields_by_name['polygons'].message_type = _POLYGON
_POLYGON.fields_by_name['type'].enum_type = _POLYGON_TYPE
_POLYGON_TYPE.containing_type = _POLYGON
_SETTINGLIST.fields_by_name['settings'].message_type = _SETTING
DESCRIPTOR.message_types_by_name['ObjectList'] = _OBJECTLIST
DESCRIPTOR.message_types_by_name['Slice'] = _SLICE
DESCRIPTOR.message_types_by_name['Object'] = _OBJECT
DESCRIPTOR.message_types_by_name['Progress'] = _PROGRESS
DESCRIPTOR.message_types_by_name['SlicedObjectList'] = _SLICEDOBJECTLIST
DESCRIPTOR.message_types_by_name['SlicedObject'] = _SLICEDOBJECT
DESCRIPTOR.message_types_by_name['Layer'] = _LAYER
DESCRIPTOR.message_types_by_name['Polygon'] = _POLYGON
DESCRIPTOR.message_types_by_name['GCodeLayer'] = _GCODELAYER
DESCRIPTOR.message_types_by_name['ObjectPrintTime'] = _OBJECTPRINTTIME
DESCRIPTOR.message_types_by_name['SettingList'] = _SETTINGLIST
DESCRIPTOR.message_types_by_name['Setting'] = _SETTING
DESCRIPTOR.message_types_by_name['GCodePrefix'] = _GCODEPREFIX
DESCRIPTOR.message_types_by_name['SlicingFinished'] = _SLICINGFINISHED
ObjectList = _reflection.GeneratedProtocolMessageType('ObjectList', (_message.Message,), dict(
DESCRIPTOR = _OBJECTLIST,
__module__ = 'Cura_pb2'
# @@protoc_insertion_point(class_scope:cura.proto.ObjectList)
))
_sym_db.RegisterMessage(ObjectList)
Slice = _reflection.GeneratedProtocolMessageType('Slice', (_message.Message,), dict(
DESCRIPTOR = _SLICE,
__module__ = 'Cura_pb2'
# @@protoc_insertion_point(class_scope:cura.proto.Slice)
))
_sym_db.RegisterMessage(Slice)
Object = _reflection.GeneratedProtocolMessageType('Object', (_message.Message,), dict(
DESCRIPTOR = _OBJECT,
__module__ = 'Cura_pb2'
# @@protoc_insertion_point(class_scope:cura.proto.Object)
))
_sym_db.RegisterMessage(Object)
Progress = _reflection.GeneratedProtocolMessageType('Progress', (_message.Message,), dict(
DESCRIPTOR = _PROGRESS,
__module__ = 'Cura_pb2'
# @@protoc_insertion_point(class_scope:cura.proto.Progress)
))
_sym_db.RegisterMessage(Progress)
SlicedObjectList = _reflection.GeneratedProtocolMessageType('SlicedObjectList', (_message.Message,), dict(
DESCRIPTOR = _SLICEDOBJECTLIST,
__module__ = 'Cura_pb2'
# @@protoc_insertion_point(class_scope:cura.proto.SlicedObjectList)
))
_sym_db.RegisterMessage(SlicedObjectList)
SlicedObject = _reflection.GeneratedProtocolMessageType('SlicedObject', (_message.Message,), dict(
DESCRIPTOR = _SLICEDOBJECT,
__module__ = 'Cura_pb2'
# @@protoc_insertion_point(class_scope:cura.proto.SlicedObject)
))
_sym_db.RegisterMessage(SlicedObject)
Layer = _reflection.GeneratedProtocolMessageType('Layer', (_message.Message,), dict(
DESCRIPTOR = _LAYER,
__module__ = 'Cura_pb2'
# @@protoc_insertion_point(class_scope:cura.proto.Layer)
))
_sym_db.RegisterMessage(Layer)
Polygon = _reflection.GeneratedProtocolMessageType('Polygon', (_message.Message,), dict(
DESCRIPTOR = _POLYGON,
__module__ = 'Cura_pb2'
# @@protoc_insertion_point(class_scope:cura.proto.Polygon)
))
_sym_db.RegisterMessage(Polygon)
GCodeLayer = _reflection.GeneratedProtocolMessageType('GCodeLayer', (_message.Message,), dict(
DESCRIPTOR = _GCODELAYER,
__module__ = 'Cura_pb2'
# @@protoc_insertion_point(class_scope:cura.proto.GCodeLayer)
))
_sym_db.RegisterMessage(GCodeLayer)
ObjectPrintTime = _reflection.GeneratedProtocolMessageType('ObjectPrintTime', (_message.Message,), dict(
DESCRIPTOR = _OBJECTPRINTTIME,
__module__ = 'Cura_pb2'
# @@protoc_insertion_point(class_scope:cura.proto.ObjectPrintTime)
))
_sym_db.RegisterMessage(ObjectPrintTime)
SettingList = _reflection.GeneratedProtocolMessageType('SettingList', (_message.Message,), dict(
DESCRIPTOR = _SETTINGLIST,
__module__ = 'Cura_pb2'
# @@protoc_insertion_point(class_scope:cura.proto.SettingList)
))
_sym_db.RegisterMessage(SettingList)
Setting = _reflection.GeneratedProtocolMessageType('Setting', (_message.Message,), dict(
DESCRIPTOR = _SETTING,
__module__ = 'Cura_pb2'
# @@protoc_insertion_point(class_scope:cura.proto.Setting)
))
_sym_db.RegisterMessage(Setting)
GCodePrefix = _reflection.GeneratedProtocolMessageType('GCodePrefix', (_message.Message,), dict(
DESCRIPTOR = _GCODEPREFIX,
__module__ = 'Cura_pb2'
# @@protoc_insertion_point(class_scope:cura.proto.GCodePrefix)
))
_sym_db.RegisterMessage(GCodePrefix)
SlicingFinished = _reflection.GeneratedProtocolMessageType('SlicingFinished', (_message.Message,), dict(
DESCRIPTOR = _SLICINGFINISHED,
__module__ = 'Cura_pb2'
# @@protoc_insertion_point(class_scope:cura.proto.SlicingFinished)
))
_sym_db.RegisterMessage(SlicingFinished)
# @@protoc_insertion_point(module_scope)

View File

@ -44,7 +44,7 @@ class ProcessSlicedObjectListJob(Job):
object_id_map[id(node)] = node object_id_map[id(node)] = node
Job.yieldThread() Job.yieldThread()
settings = Application.getInstance().getMachineManager().getActiveProfile() settings = Application.getInstance().getMachineManager().getWorkingProfile()
center = None center = None
if not settings.getSettingValue("machine_center_is_zero"): if not settings.getSettingValue("machine_center_is_zero"):
@ -56,21 +56,27 @@ class ProcessSlicedObjectListJob(Job):
layer_data = LayerData.LayerData() layer_data = LayerData.LayerData()
layer_count = 0 layer_count = 0
for object in self._message.objects: for i in range(self._message.repeatedMessageCount("objects")):
layer_count += len(object.layers) layer_count += self._message.getRepeatedMessage("objects", i).repeatedMessageCount("layers")
current_layer = 0 current_layer = 0
for object in self._message.objects: for i in range(self._message.repeatedMessageCount("objects")):
object = self._message.getRepeatedMessage("objects", i)
try: try:
node = object_id_map[object.id] node = object_id_map[object.id]
except KeyError: except KeyError:
continue continue
for layer in object.layers: for l in range(object.repeatedMessageCount("layers")):
layer = object.getRepeatedMessage("layers", l)
layer_data.addLayer(layer.id) layer_data.addLayer(layer.id)
layer_data.setLayerHeight(layer.id, layer.height) layer_data.setLayerHeight(layer.id, layer.height)
layer_data.setLayerThickness(layer.id, layer.thickness) layer_data.setLayerThickness(layer.id, layer.thickness)
for polygon in layer.polygons:
for p in range(layer.repeatedMessageCount("polygons")):
polygon = layer.getRepeatedMessage("polygons", p)
points = numpy.fromstring(polygon.points, dtype="i8") # Convert bytearray to numpy array points = numpy.fromstring(polygon.points, dtype="i8") # Convert bytearray to numpy array
points = points.reshape((-1,2)) # We get a linear list of pairs that make up the points, so make numpy interpret them correctly. points = points.reshape((-1,2)) # We get a linear list of pairs that make up the points, so make numpy interpret them correctly.
points = numpy.asarray(points, dtype=numpy.float32) points = numpy.asarray(points, dtype=numpy.float32)
@ -83,8 +89,6 @@ class ProcessSlicedObjectListJob(Job):
layer_data.addPolygon(layer.id, polygon.type, points, polygon.line_width) layer_data.addPolygon(layer.id, polygon.type, points, polygon.line_width)
Job.yieldThread()
current_layer += 1 current_layer += 1
progress = (current_layer / layer_count) * 100 progress = (current_layer / layer_count) * 100
# TODO: Rebuild the layer data mesh once the layer has been processed. # TODO: Rebuild the layer data mesh once the layer has been processed.

View File

@ -14,8 +14,6 @@ from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
from cura.OneAtATimeIterator import OneAtATimeIterator from cura.OneAtATimeIterator import OneAtATimeIterator
from . import Cura_pb2
## Formatter class that handles token expansion in start/end gcod ## Formatter class that handles token expansion in start/end gcod
class GcodeStartEndFormatter(Formatter): class GcodeStartEndFormatter(Formatter):
def get_value(self, key, args, kwargs): # [CodeStyle: get_value is an overridden function from the Formatter class] def get_value(self, key, args, kwargs): # [CodeStyle: get_value is an overridden function from the Formatter class]
@ -81,20 +79,21 @@ class StartSliceJob(Job):
self._sendSettings(self._profile) self._sendSettings(self._profile)
slice_message = Cura_pb2.Slice() slice_message = self._socket.createMessage("cura.proto.Slice");
for group in object_groups: for group in object_groups:
group_message = slice_message.object_lists.add() group_message = slice_message.addRepeatedMessage("object_lists");
for object in group: for object in group:
mesh_data = object.getMeshData().getTransformed(object.getWorldTransformation()) mesh_data = object.getMeshData().getTransformed(object.getWorldTransformation())
obj = group_message.objects.add() obj = group_message.addRepeatedMessage("objects");
obj.id = id(object) obj.id = id(object)
verts = numpy.array(mesh_data.getVertices()) verts = numpy.array(mesh_data.getVertices())
verts[:,[1,2]] = verts[:,[2,1]] verts[:,[1,2]] = verts[:,[2,1]]
verts[:,1] *= -1 verts[:,1] *= -1
obj.vertices = verts.tostring()
obj.vertices = verts
self._handlePerObjectSettings(object, obj) self._handlePerObjectSettings(object, obj)
@ -115,13 +114,13 @@ class StartSliceJob(Job):
return str(value).encode("utf-8") return str(value).encode("utf-8")
def _sendSettings(self, profile): def _sendSettings(self, profile):
msg = Cura_pb2.SettingList() msg = self._socket.createMessage("cura.proto.SettingList");
settings = profile.getAllSettingValues(include_machine = True) settings = profile.getAllSettingValues(include_machine = True)
start_gcode = settings["machine_start_gcode"] start_gcode = settings["machine_start_gcode"]
settings["material_bed_temp_prepend"] = "{material_bed_temperature}" not in start_gcode settings["material_bed_temp_prepend"] = "{material_bed_temperature}" not in start_gcode
settings["material_print_temp_prepend"] = "{material_print_temperature}" not in start_gcode settings["material_print_temp_prepend"] = "{material_print_temperature}" not in start_gcode
for key, value in settings.items(): for key, value in settings.items():
s = msg.settings.add() s = msg.addRepeatedMessage("settings")
s.name = key s.name = key
if key == "machine_start_gcode" or key == "machine_end_gcode": if key == "machine_start_gcode" or key == "machine_end_gcode":
s.value = self._expandGcodeTokens(key, value, settings) s.value = self._expandGcodeTokens(key, value, settings)
@ -134,7 +133,7 @@ class StartSliceJob(Job):
profile = node.callDecoration("getProfile") profile = node.callDecoration("getProfile")
if profile: if profile:
for key, value in profile.getAllSettingValues().items(): for key, value in profile.getAllSettingValues().items():
setting = message.settings.add() setting = message.addRepeatedMessage("settings")
setting.name = key setting.name = key
setting.value = str(value).encode() setting.value = str(value).encode()
@ -145,7 +144,7 @@ class StartSliceJob(Job):
return return
for key, value in object_settings.items(): for key, value in object_settings.items():
setting = message.settings.add() setting = message.addRepeatedMessage("settings")
setting.name = key setting.name = key
setting.value = str(value).encode() setting.value = str(value).encode()

View File

@ -40,7 +40,7 @@ class GCodeWriter(MeshWriter):
if gcode_list: if gcode_list:
for gcode in gcode_list: for gcode in gcode_list:
stream.write(gcode) stream.write(gcode)
profile = self._serialiseProfile(Application.getInstance().getMachineManager().getActiveProfile()) #Serialise the profile and put them at the end of the file. profile = self._serialiseProfile(Application.getInstance().getMachineManager().getWorkingProfile()) #Serialise the profile and put them at the end of the file.
stream.write(profile) stream.write(profile)
return True return True

View File

@ -10,16 +10,13 @@ import UM 1.1 as UM
UM.Dialog UM.Dialog
{ {
width: 350*Screen.devicePixelRatio; width: 350 * Screen.devicePixelRatio;
minimumWidth: 350*Screen.devicePixelRatio; minimumWidth: 350 * Screen.devicePixelRatio;
maximumWidth: 350*Screen.devicePixelRatio; maximumWidth: 350 * Screen.devicePixelRatio;
height: 220*Screen.devicePixelRatio; height: 250 * Screen.devicePixelRatio;
minimumHeight: 220*Screen.devicePixelRatio; minimumHeight: 250 * Screen.devicePixelRatio;
maximumHeight: 220*Screen.devicePixelRatio; maximumHeight: 250 * Screen.devicePixelRatio;
modality: Qt.Modal
title: catalog.i18nc("@title:window", "Convert Image...") title: catalog.i18nc("@title:window", "Convert Image...")
@ -38,7 +35,6 @@ UM.Dialog
text: catalog.i18nc("@info:tooltip","The maximum distance of each pixel from \"Base.\"") text: catalog.i18nc("@info:tooltip","The maximum distance of each pixel from \"Base.\"")
Row { Row {
width: parent.width width: parent.width
height: childrenRect.height
Text { Text {
text: catalog.i18nc("@action:label","Height (mm)") text: catalog.i18nc("@action:label","Height (mm)")
@ -62,7 +58,6 @@ UM.Dialog
text: catalog.i18nc("@info:tooltip","The base height from the build plate in millimeters.") text: catalog.i18nc("@info:tooltip","The base height from the build plate in millimeters.")
Row { Row {
width: parent.width width: parent.width
height: childrenRect.height
Text { Text {
text: catalog.i18nc("@action:label","Base (mm)") text: catalog.i18nc("@action:label","Base (mm)")
@ -86,7 +81,6 @@ UM.Dialog
text: catalog.i18nc("@info:tooltip","The width in millimeters on the build plate.") text: catalog.i18nc("@info:tooltip","The width in millimeters on the build plate.")
Row { Row {
width: parent.width width: parent.width
height: childrenRect.height
Text { Text {
text: catalog.i18nc("@action:label","Width (mm)") text: catalog.i18nc("@action:label","Width (mm)")
@ -111,7 +105,6 @@ UM.Dialog
text: catalog.i18nc("@info:tooltip","The depth in millimeters on the build plate") text: catalog.i18nc("@info:tooltip","The depth in millimeters on the build plate")
Row { Row {
width: parent.width width: parent.width
height: childrenRect.height
Text { Text {
text: catalog.i18nc("@action:label","Depth (mm)") text: catalog.i18nc("@action:label","Depth (mm)")
@ -135,7 +128,6 @@ UM.Dialog
text: catalog.i18nc("@info:tooltip","By default, white pixels represent high points on the mesh and black pixels represent low points on the mesh. Change this option to reverse the behavior such that black pixels represent high points on the mesh and white pixels represent low points on the mesh.") text: catalog.i18nc("@info:tooltip","By default, white pixels represent high points on the mesh and black pixels represent low points on the mesh. Change this option to reverse the behavior such that black pixels represent high points on the mesh and white pixels represent low points on the mesh.")
Row { Row {
width: parent.width width: parent.width
height: childrenRect.height
//Empty label so 2 column layout works. //Empty label so 2 column layout works.
Text { Text {
@ -159,7 +151,6 @@ UM.Dialog
text: catalog.i18nc("@info:tooltip","The amount of smoothing to apply to the image.") text: catalog.i18nc("@info:tooltip","The amount of smoothing to apply to the image.")
Row { Row {
width: parent.width width: parent.width
height: childrenRect.height
Text { Text {
text: catalog.i18nc("@action:label","Smoothing") text: catalog.i18nc("@action:label","Smoothing")

View File

@ -167,12 +167,16 @@ class LayerView(View):
if new_max_layers > 0 and new_max_layers != self._old_max_layers: if new_max_layers > 0 and new_max_layers != self._old_max_layers:
self._max_layers = new_max_layers self._max_layers = new_max_layers
self.maxLayersChanged.emit()
self._current_layer_num = self._max_layers
# This makes sure we update the current layer # The qt slider has a bit of weird behavior that if the maxvalue needs to be changed first
self.setLayer(int(self._max_layers)) # if it's the largest value. If we don't do this, we can have a slider block outside of the
self.currentLayerNumChanged.emit() # slider.
if new_max_layers > self._current_layer_num:
self.maxLayersChanged.emit()
self.setLayer(int(self._max_layers))
else:
self.setLayer(int(self._max_layers))
self.maxLayersChanged.emit()
maxLayersChanged = Signal() maxLayersChanged = Signal()
currentLayerNumChanged = Signal() currentLayerNumChanged = Signal()

View File

@ -24,16 +24,11 @@ class PerObjectSettingsModel(ListModel):
super().__init__(parent) super().__init__(parent)
self._scene = Application.getInstance().getController().getScene() self._scene = Application.getInstance().getController().getScene()
self._root = self._scene.getRoot() 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.IdRole,"id")
self.addRoleName(self.XRole,"x")
self.addRoleName(self.YRole,"y")
self.addRoleName(self.MaterialRole, "material") self.addRoleName(self.MaterialRole, "material")
self.addRoleName(self.ProfileRole, "profile") self.addRoleName(self.ProfileRole, "profile")
self.addRoleName(self.SettingsRole, "settings") self.addRoleName(self.SettingsRole, "settings")
self._updateModel()
@pyqtSlot("quint64", str) @pyqtSlot("quint64", str)
def setObjectProfile(self, object_id, profile_name): def setObjectProfile(self, object_id, profile_name):
@ -72,27 +67,11 @@ class PerObjectSettingsModel(ListModel):
if len(node.callDecoration("getAllSettings")) == 0: if len(node.callDecoration("getAllSettings")) == 0:
node.removeDecorator(SettingOverrideDecorator) node.removeDecorator(SettingOverrideDecorator)
def _updatePositions(self, source): def _updateModel(self):
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() self.clear()
camera = Application.getInstance().getController().getScene().getActiveCamera()
for node in BreadthFirstIterator(self._root): for node in BreadthFirstIterator(self._root):
if type(node) is not SceneNode or not node.getMeshData() or not node.isSelectable(): if type(node) is not SceneNode or not node.getMeshData() or not node.isSelectable():
continue continue
projected_position = camera.project(node.getWorldPosition())
node_profile = node.callDecoration("getProfile") node_profile = node.callDecoration("getProfile")
if not node_profile: if not node_profile:
node_profile = "global" node_profile = "global"
@ -101,8 +80,6 @@ class PerObjectSettingsModel(ListModel):
self.appendItem({ self.appendItem({
"id": id(node), "id": id(node),
"x": float(projected_position[0]),
"y": float(projected_position[1]),
"material": "", "material": "",
"profile": node_profile, "profile": node_profile,
"settings": SettingOverrideModel.SettingOverrideModel(node) "settings": SettingOverrideModel.SettingOverrideModel(node)

View File

@ -10,8 +10,7 @@ import UM 1.1 as UM
Item { Item {
id: base; id: base;
property int currentIndex: UM.ActiveTool.properties.SelectedIndex; property int currentIndex: UM.ActiveTool.properties.getValue("SelectedIndex")
property string printSequence: UM.ActiveTool.properties.PrintSequence;
UM.I18nCatalog { id: catalog; name: "cura"; } UM.I18nCatalog { id: catalog; name: "cura"; }
@ -25,14 +24,6 @@ Item {
spacing: UM.Theme.sizes.default_margin.height; spacing: UM.Theme.sizes.default_margin.height;
Label {
width: UM.Theme.sizes.setting.width;
wrapMode: Text.Wrap;
text: catalog.i18nc("@label", "Per Object Settings behavior may be unexpected when 'Print sequence' is set to 'All at Once'.")
color: UM.Theme.colors.text;
visible: base.printSequence == "all_at_once"
}
UM.SettingItem { UM.SettingItem {
id: profileSelection id: profileSelection
@ -47,11 +38,11 @@ Item {
options: UM.ProfilesModel { addUseGlobal: true } options: UM.ProfilesModel { addUseGlobal: true }
value: UM.ActiveTool.properties.Model.getItem(base.currentIndex).profile value: UM.ActiveTool.properties.getValue("Model").getItem(base.currentIndex).profile
onItemValueChanged: { onItemValueChanged: {
var item = UM.ActiveTool.properties.Model.getItem(base.currentIndex); var item = UM.ActiveTool.properties.getValue("Model").getItem(base.currentIndex);
UM.ActiveTool.properties.Model.setObjectProfile(item.id, value) UM.ActiveTool.properties.getValue("Model").setObjectProfile(item.id, value)
} }
} }
@ -63,7 +54,7 @@ Item {
Repeater { Repeater {
id: settings; id: settings;
model: UM.ActiveTool.properties.Model.getItem(base.currentIndex).settings model: UM.ActiveTool.properties.getValue("Model").getItem(base.currentIndex).settings
UM.SettingItem { UM.SettingItem {
width: UM.Theme.sizes.setting.width; width: UM.Theme.sizes.setting.width;
@ -91,7 +82,7 @@ Item {
width: UM.Theme.sizes.setting.height; width: UM.Theme.sizes.setting.height;
height: UM.Theme.sizes.setting.height; height: UM.Theme.sizes.setting.height;
onClicked: UM.ActiveTool.properties.Model.removeSettingOverride(UM.ActiveTool.properties.Model.getItem(base.currentIndex).id, model.key) onClicked: UM.ActiveTool.properties.getValue("Model").removeSettingOverride(UM.ActiveTool.properties.getValue("Model").getItem(base.currentIndex).id, model.key)
style: ButtonStyle style: ButtonStyle
{ {
@ -202,6 +193,7 @@ Item {
width: parent.width; width: parent.width;
height: childrenRect.height; height: childrenRect.height;
visible: model.visible && settingsColumn.childrenHeight != 0 //If all children are hidden, the height is 0, and then the category header must also be hidden.
ToolButton { ToolButton {
id: categoryHeader; id: categoryHeader;
@ -237,8 +229,6 @@ Item {
property variant settingsModel: model.settings; property variant settingsModel: model.settings;
visible: model.visible;
Column { Column {
id: settingsColumn; id: settingsColumn;
@ -272,10 +262,12 @@ Item {
x: model.depth * UM.Theme.sizes.default_margin.width; x: model.depth * UM.Theme.sizes.default_margin.width;
text: model.name; text: model.name;
tooltip: model.description; tooltip: model.description;
visible: !model.global_only
height: model.global_only ? 0 : undefined
onClicked: { onClicked: {
var object_id = UM.ActiveTool.properties.Model.getItem(base.currentIndex).id; var object_id = UM.ActiveTool.properties.getValue("Model").getItem(base.currentIndex).id;
UM.ActiveTool.properties.Model.addSettingOverride(object_id, model.key); UM.ActiveTool.properties.getValue("Model").addSettingOverride(object_id, model.key);
settingPickDialog.visible = false; settingPickDialog.visible = false;
} }

View File

@ -4,26 +4,29 @@
from UM.Tool import Tool from UM.Tool import Tool
from UM.Scene.Selection import Selection from UM.Scene.Selection import Selection
from UM.Application import Application from UM.Application import Application
from UM.Qt.ListModel import ListModel
from . import PerObjectSettingsModel from . import PerObjectSettingsModel
class PerObjectSettingsTool(Tool): class PerObjectSettingsTool(Tool):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self._model = None
self.setExposedProperties("Model", "SelectedIndex", "PrintSequence") self.setExposedProperties("Model", "SelectedIndex")
def event(self, event): def event(self, event):
return False return False
def getModel(self): def getModel(self):
return PerObjectSettingsModel.PerObjectSettingsModel() if not self._model:
self._model = PerObjectSettingsModel.PerObjectSettingsModel()
#For some reason, casting this model to itself causes the model to properly be cast to a QVariant, even though it ultimately inherits from QVariant.
#Yeah, we have no idea either...
return PerObjectSettingsModel.PerObjectSettingsModel(self._model)
def getSelectedIndex(self): def getSelectedIndex(self):
selected_object_id = id(Selection.getSelectedObject(0)) selected_object_id = id(Selection.getSelectedObject(0))
index = self.getModel().find("id", selected_object_id) index = self.getModel().find("id", selected_object_id)
return index return index
def getPrintSequence(self):
settings = Application.getInstance().getMachineManager().getActiveProfile()
return settings.getSettingValue("print_sequence")

View File

@ -23,19 +23,21 @@ class RemovableDriveOutputDevice(OutputDevice):
self.setIconName("save_sd") self.setIconName("save_sd")
self.setPriority(1) self.setPriority(1)
Preferences.getInstance().addPreference("removable_drive/file_type", "text/x-gcode") #Add a preference that says in what file type we should store the file.
self._writing = False self._writing = False
def requestWrite(self, node, file_name = None): def requestWrite(self, node, file_name = None, filter_by_machine = False):
if self._writing: if self._writing:
raise OutputDeviceError.DeviceBusyError() raise OutputDeviceError.DeviceBusyError()
file_type = Preferences.getInstance().getValue("removable_drive/file_type") file_formats = Application.getInstance().getMeshFileHandler().getSupportedFileTypesWrite() #Formats supported by this application.
gcode_writer = Application.getInstance().getMeshFileHandler().getWriterByMimeType(file_type) if filter_by_machine:
if not gcode_writer: machine_file_formats = Application.getInstance().getMachineManager().getActiveMachineInstance().getMachineDefinition().getFileFormats()
Logger.log("e", "Could not find writer for MIME type %s, not writing to removable drive %s", file_type, self.getName()) file_formats = list(filter(lambda file_format: file_format["mime_type"] in machine_file_formats, file_formats)) #Take the intersection between file_formats and machine_file_formats.
if len(file_formats) == 0:
Logger.log("e", "There are no file formats available to write with!")
raise OutputDeviceError.WriteRequestFailedError() raise OutputDeviceError.WriteRequestFailedError()
writer = Application.getInstance().getMeshFileHandler().getWriterByMimeType(file_formats[0]["mime_type"]) #Just take the first file format available.
extension = file_formats[0]["extension"]
if file_name == None: if file_name == None:
for n in BreadthFirstIterator(node): for n in BreadthFirstIterator(node):
@ -48,12 +50,14 @@ class RemovableDriveOutputDevice(OutputDevice):
Logger.log("e", "Could not determine a proper file name when trying to write to %s, aborting", self.getName()) Logger.log("e", "Could not determine a proper file name when trying to write to %s, aborting", self.getName())
raise OutputDeviceError.WriteRequestFailedError() raise OutputDeviceError.WriteRequestFailedError()
file_name = os.path.join(self.getId(), os.path.splitext(file_name)[0] + ".gcode") if extension: #Not empty string.
extension = "." + extension
file_name = os.path.join(self.getId(), os.path.splitext(file_name)[0] + extension)
try: try:
Logger.log("d", "Writing to %s", file_name) Logger.log("d", "Writing to %s", file_name)
stream = open(file_name, "wt") stream = open(file_name, "wt")
job = WriteMeshJob(gcode_writer, stream, node, MeshWriter.OutputMode.TextMode) job = WriteMeshJob(writer, stream, node, MeshWriter.OutputMode.TextMode)
job.setFileName(file_name) job.setFileName(file_name)
job.progress.connect(self._onProgress) job.progress.connect(self._onProgress)
job.finished.connect(self._onFinished) job.finished.connect(self._onFinished)

View File

@ -44,7 +44,7 @@ class SliceInfo(Extension):
def _onWriteStarted(self, output_device): def _onWriteStarted(self, output_device):
if not Preferences.getInstance().getValue("info/send_slice_info"): if not Preferences.getInstance().getValue("info/send_slice_info"):
return # Do nothing, user does not want to send data return # Do nothing, user does not want to send data
settings = Application.getInstance().getMachineManager().getActiveProfile() settings = Application.getInstance().getMachineManager().getWorkingProfile()
# Load all machine definitions and put them in machine_settings dict # Load all machine definitions and put them in machine_settings dict
#setting_file_name = Application.getInstance().getActiveMachineInstance().getMachineSettings()._json_file #setting_file_name = Application.getInstance().getActiveMachineInstance().getMachineSettings()._json_file

View File

@ -34,8 +34,8 @@ class SolidView(View):
self._disabled_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "overhang.shader")) self._disabled_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "overhang.shader"))
self._disabled_shader.setUniformValue("u_diffuseColor", [0.68, 0.68, 0.68, 1.0]) self._disabled_shader.setUniformValue("u_diffuseColor", [0.68, 0.68, 0.68, 1.0])
if Application.getInstance().getMachineManager().getActiveProfile(): if Application.getInstance().getMachineManager().getWorkingProfile():
profile = Application.getInstance().getMachineManager().getActiveProfile() profile = Application.getInstance().getMachineManager().getWorkingProfile()
if profile.getSettingValue("support_enable") or not Preferences.getInstance().getValue("view/show_overhang"): if profile.getSettingValue("support_enable") or not Preferences.getInstance().getValue("view/show_overhang"):
angle = profile.getSettingValue("support_angle") angle = profile.getSettingValue("support_angle")

2955
resources/i18n/de/cura.po Executable file → Normal file

File diff suppressed because it is too large Load Diff

6148
resources/i18n/de/fdmprinter.json.po Executable file → Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1320
resources/i18n/es/cura.po Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

3004
resources/i18n/fi/cura.po Executable file → Normal file

File diff suppressed because it is too large Load Diff

5914
resources/i18n/fi/fdmprinter.json.po Executable file → Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1320
resources/i18n/it/cura.po Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1320
resources/i18n/nl/cura.po Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -5,7 +5,7 @@
"manufacturer": "Other", "manufacturer": "Other",
"author": "RBC", "author": "RBC",
"platform": "rigidbot_platform.stl", "platform": "rigidbot_platform.stl",
"file_formats": "text/x-gcode",
"inherits": "fdmprinter.json", "inherits": "fdmprinter.json",
"overrides": { "overrides": {

View File

@ -5,7 +5,7 @@
"manufacturer": "Other", "manufacturer": "Other",
"author": "RBC", "author": "RBC",
"platform": "rigidbotbig_platform.stl", "platform": "rigidbotbig_platform.stl",
"file_formats": "text/x-gcode",
"inherits": "fdmprinter.json", "inherits": "fdmprinter.json",
"overrides": { "overrides": {

View File

@ -5,6 +5,7 @@
"manufacturer": "Other", "manufacturer": "Other",
"author": "BQ", "author": "BQ",
"platform": "bq_hephestos_platform.stl", "platform": "bq_hephestos_platform.stl",
"file_formats": "text/x-gcode",
"inherits": "fdmprinter.json", "inherits": "fdmprinter.json",
"overrides": { "overrides": {

View File

@ -5,6 +5,7 @@
"manufacturer": "Other", "manufacturer": "Other",
"author": "BQ", "author": "BQ",
"platform": "bq_hephestos_2_platform.stl", "platform": "bq_hephestos_2_platform.stl",
"file_formats": "text/x-gcode",
"inherits": "fdmprinter.json", "inherits": "fdmprinter.json",
"overrides": { "overrides": {

View File

@ -5,6 +5,7 @@
"manufacturer": "Other", "manufacturer": "Other",
"author": "BQ", "author": "BQ",
"platform": "bq_hephestos_platform.stl", "platform": "bq_hephestos_platform.stl",
"file_formats": "text/x-gcode",
"inherits": "fdmprinter.json", "inherits": "fdmprinter.json",
"overrides": { "overrides": {

View File

@ -5,6 +5,7 @@
"manufacturer": "Other", "manufacturer": "Other",
"author": "BQ", "author": "BQ",
"platform": "bq_witbox_platform.stl", "platform": "bq_witbox_platform.stl",
"file_formats": "text/x-gcode",
"inherits": "fdmprinter.json", "inherits": "fdmprinter.json",
"overrides": { "overrides": {

View File

@ -5,6 +5,7 @@
"manufacturer": "Other", "manufacturer": "Other",
"author": "BQ", "author": "BQ",
"platform": "bq_witbox_platform.stl", "platform": "bq_witbox_platform.stl",
"file_formats": "text/x-gcode",
"inherits": "fdmprinter.json", "inherits": "fdmprinter.json",
"overrides": { "overrides": {

View File

@ -2,7 +2,7 @@
"version": 1, "version": 1,
"id": "dual_extrusion", "id": "dual_extrusion",
"name": "Dual Extrusion Base File", "name": "Dual Extrusion Base File",
"file_formats": "text/x-gcode;application/x-stl-ascii;application/x-stl-binary;application/x-wavefront-obj;application/x3g",
"inherits": "fdmprinter.json", "inherits": "fdmprinter.json",
"visible": false, "visible": false,

View File

@ -5,88 +5,117 @@
"name": "FDM Printer Base Description", "name": "FDM Printer Base Description",
"author": "Ultimaker B.V.", "author": "Ultimaker B.V.",
"manufacturer": "Ultimaker", "manufacturer": "Ultimaker",
"file_formats": "text/x-gcode;application/x-stl-ascii;application/x-stl-binary;application/x-wavefront-obj;application/x3g",
"add_pages": [], "add_pages": [],
"machine_settings": { "machine_settings": {
"machine_show_variants": {
"description": "Wether to show the different variants of this machine, which are described in separate json files.",
"default": false
},
"machine_start_gcode": { "machine_start_gcode": {
"description": "Gcode commands to be executed at the very start - separated by \\n.", "description": "Gcode commands to be executed at the very start - separated by \\n.",
"default": "G28 ; Home\nG1 Z15.0 F6000 ;move the platform down 15mm\n;Prime the extruder\nG92 E0\nG1 F200 E3\nG92 E0" "default": "G28 ; Home\nG1 Z15.0 F6000 ;move the platform down 15mm\n;Prime the extruder\nG92 E0\nG1 F200 E3\nG92 E0",
"global_only": true
}, },
"machine_end_gcode": { "machine_end_gcode": {
"description": "Gcode commands to be executed at the very end - separated by \\n.", "description": "Gcode commands to be executed at the very end - separated by \\n.",
"default": "M104 S0\nM140 S0\n;Retract the filament\nG92 E1\nG1 E-1 F300\nG28 X0 Y0\nM84" "default": "M104 S0\nM140 S0\n;Retract the filament\nG92 E1\nG1 E-1 F300\nG28 X0 Y0\nM84",
"global_only": true
}, },
"material_bed_temp_wait": { "material_bed_temp_wait": {
"description": "Whether to insert a command to wait until the bed temperature is reached at the start.", "description": "Whether to insert a command to wait until the bed temperature is reached at the start.",
"default": true "default": true,
"global_only": true
}, },
"material_print_temp_wait": { "material_print_temp_wait": {
"description": "Whether to insert a command to wait until the nozzle temperatures are reached at the start.", "description": "Whether to insert a command to wait until the nozzle temperatures are reached at the start.",
"default": true "default": true,
"global_only": true
}, },
"material_print_temp_prepend": { "material_print_temp_prepend": {
"description": "Whether to include nozzle temperature commands at the start of the gcode. When the start_gcode already contains nozzle temperature commands Cura frontend will automatically disable this setting.", "description": "Whether to include nozzle temperature commands at the start of the gcode. When the start_gcode already contains nozzle temperature commands Cura frontend will automatically disable this setting.",
"default": true "default": true,
"global_only": true
}, },
"material_bed_temp_prepend": { "material_bed_temp_prepend": {
"description": "Whether to include bed temperature commands at the start of the gcode. When the start_gcode already contains bed temperature commands Cura frontend will automatically disable this setting.", "description": "Whether to include bed temperature commands at the start of the gcode. When the start_gcode already contains bed temperature commands Cura frontend will automatically disable this setting.",
"default": true "default": true,
"global_only": true
}, },
"machine_width": { "machine_width": {
"description": "The width (X-direction) of the printable area.", "description": "The width (X-direction) of the printable area.",
"default": 100 "default": 100,
"global_only": true
}, },
"machine_depth": { "machine_depth": {
"description": "The depth (Y-direction) of the printable area.", "description": "The depth (Y-direction) of the printable area.",
"default": 100 "default": 100,
"global_only": true
}, },
"machine_height": { "machine_height": {
"description": "The height (Z-direction) of the printable area.", "description": "The height (Z-direction) of the printable area.",
"default": 100 "default": 100,
"global_only": true
}, },
"machine_heated_bed": { "machine_heated_bed": {
"description": "Whether the machine has a heated bed present.", "description": "Whether the machine has a heated bed present.",
"default": false "default": false,
"global_only": true
}, },
"machine_center_is_zero": { "machine_center_is_zero": {
"description": "Whether the X/Y coordinates of the zero position of the printer is at the center of the printable area.", "description": "Whether the X/Y coordinates of the zero position of the printer is at the center of the printable area.",
"default": false "default": false,
"global_only": true
}, },
"machine_extruder_count": { "machine_extruder_count": {
"description": "Number of extruder trains. An extruder train is the combination of a feeder, bowden tube, and nozzle.", "description": "Number of extruder trains. An extruder train is the combination of a feeder, bowden tube, and nozzle.",
"default": 1 "default": 1,
"global_only": true
}, },
"machine_nozzle_tip_outer_diameter": { "machine_nozzle_tip_outer_diameter": {
"description": "The outer diameter of the tip of the nozzle.", "description": "The outer diameter of the tip of the nozzle.",
"default": 1, "SEE_machine_extruder_trains": true }, "default": 1,
"SEE_machine_extruder_trains": true,
"global_only": true
},
"machine_nozzle_head_distance": { "machine_nozzle_head_distance": {
"description": "The height difference between the tip of the nozzle and the lowest part of the print head.", "description": "The height difference between the tip of the nozzle and the lowest part of the print head.",
"default": 3, "SEE_machine_extruder_trains": true }, "default": 3,
"SEE_machine_extruder_trains": true,
"global_only": true
},
"machine_nozzle_expansion_angle": { "machine_nozzle_expansion_angle": {
"description": "The angle between the horizontal plane and the conical part right above the tip of the nozzle.", "description": "The angle between the horizontal plane and the conical part right above the tip of the nozzle.",
"default": 45, "SEE_machine_extruder_trains": true }, "default": 45,
"SEE_machine_extruder_trains": true,
"global_only": true
},
"machine_heat_zone_length": { "machine_heat_zone_length": {
"description": "The distance from the tip of the nozzle in which heat from the nozzle is transfered to the filament.", "description": "The distance from the tip of the nozzle in which heat from the nozzle is transfered to the filament.",
"default": 16, "SEE_machine_extruder_trains": true }, "default": 16,
"SEE_machine_extruder_trains": true,
"global_only": true
},
"machine_nozzle_heat_up_speed": { "machine_nozzle_heat_up_speed": {
"description": "The speed (°C/s) by which the nozzle heats up averaged over the window of normal printing temperatures and the standby temperature.", "description": "The speed (*C/s) by which the nozzle heats up averaged over the window of normal printing temperatures and the standby temperature.",
"default": 2.0, "SEE_machine_extruder_trains": true }, "default": 2.0,
"SEE_machine_extruder_trains": true,
"global_only": true
},
"machine_nozzle_cool_down_speed": { "machine_nozzle_cool_down_speed": {
"description": "The speed (°C/s) by which the nozzle cools down averaged over the window of normal printing temperatures and the standby temperature.", "description": "The speed (*C/s) by which the nozzle cools down averaged over the window of normal printing temperatures and the standby temperature.",
"default": 2.0, "SEE_machine_extruder_trains": true }, "default": 2.0,
"SEE_machine_extruder_trains": true,
"global_only": true
},
"machine_gcode_flavor": { "machine_gcode_flavor": {
"description": "The type of gcode to be generated.", "description": "The type of gcode to be generated.",
"default": "RepRap" "default": "RepRap",
"global_only": true
}, },
"machine_disallowed_areas": { "machine_disallowed_areas": {
"description": "A list of polygons with areas the print head is not allowed to enter.", "description": "A list of polygons with areas the print head is not allowed to enter.",
"type": "polygons", "type": "polygons",
"default": [] "default": [],
"global_only": true
}, },
"machine_platform_offset": { "machine_platform_offset": {
"description": "Where to display the platform mesh.", "description": "Where to display the platform mesh.",
@ -94,10 +123,11 @@
0, 0,
0, 0,
0 0
] ],
"global_only": true
}, },
"machine_head_polygon": { "machine_head_polygon": {
"description": "A 2D silhouette of the print head (fan caps excluded).", "description": "A 2D silhouette of the print head.",
"type": "polygon", "type": "polygon",
"default": [ "default": [
[ [
@ -116,10 +146,11 @@
1, 1,
1 1
] ]
] ],
"global_only": true
}, },
"machine_head_with_fans_polygon": { "machine_head_with_fans_polygon": {
"description": "A 2D silhouette of the print head (fan caps included).", "description": "A 2D silhouette of the print head.",
"type": "polygon", "type": "polygon",
"default": [ "default": [
[ [
@ -138,11 +169,13 @@
-20, -20,
-10 -10
] ]
] ],
"global_only": true
}, },
"gantry_height": { "gantry_height": {
"description": "The height difference between the tip of the nozzle and the gantry system (X and Y axes).", "description": "The height difference between the tip of the nozzle and the gantry system (X and Y axes).",
"default":99999999999 "default": 99999999999,
"global_only": true
} }
}, },
"categories": { "categories": {
@ -161,7 +194,8 @@
"max_value_warning": "10", "max_value_warning": "10",
"visible": false "visible": false
} }
} },
"global_only": true
}, },
"resolution": { "resolution": {
"label": "Quality", "label": "Quality",
@ -188,7 +222,8 @@
"min_value": "0.001", "min_value": "0.001",
"min_value_warning": "0.04", "min_value_warning": "0.04",
"max_value_warning": "0.32", "max_value_warning": "0.32",
"visible": false "visible": false,
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"line_width": { "line_width": {
"label": "Line Width", "label": "Line Width",
@ -547,12 +582,12 @@
"infill_overlap": { "infill_overlap": {
"label": "Infill Overlap", "label": "Infill Overlap",
"description": "The amount of overlap between the infill and the walls. A slight overlap allows the walls to connect firmly to the infill.", "description": "The amount of overlap between the infill and the walls. A slight overlap allows the walls to connect firmly to the infill.",
"unit": "mm", "unit": "%",
"type": "float", "type": "float",
"default": 0.04, "default": 10,
"min_value_warning": "0", "min_value": "0",
"max_value_warning": "machine_nozzle_size", "max_value_warning": "100",
"inherit_function": "0.1 * line_width if infill_sparse_density < 95 else 0.0", "inherit_function": "10 if infill_sparse_density < 95 else 0",
"visible": false "visible": false
}, },
"infill_wipe_dist": { "infill_wipe_dist": {
@ -622,7 +657,8 @@
"type": "float", "type": "float",
"default": 150, "default": 150,
"min_value": "0", "min_value": "0",
"max_value_warning": "260" "max_value_warning": "260",
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"material_extrusion_cool_down_speed": { "material_extrusion_cool_down_speed": {
"label": "Extrusion Cool Down Speed Modifier", "label": "Extrusion Cool Down Speed Modifier",
@ -631,7 +667,8 @@
"type": "float", "type": "float",
"default": 0.5, "default": 0.5,
"min_value": "0", "min_value": "0",
"max_value_warning": "10.0" "max_value_warning": "10.0",
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"material_bed_temperature": { "material_bed_temperature": {
"label": "Bed Temperature", "label": "Bed Temperature",
@ -641,7 +678,8 @@
"default": 60, "default": 60,
"min_value": "0", "min_value": "0",
"max_value_warning": "260", "max_value_warning": "260",
"enabled": "machine_heated_bed" "enabled": "machine_heated_bed",
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"material_diameter": { "material_diameter": {
"label": "Diameter", "label": "Diameter",
@ -651,7 +689,8 @@
"default": 2.85, "default": 2.85,
"min_value": "0.0001", "min_value": "0.0001",
"min_value_warning": "0.4", "min_value_warning": "0.4",
"max_value_warning": "3.5" "max_value_warning": "3.5",
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"material_flow": { "material_flow": {
"label": "Flow", "label": "Flow",
@ -749,7 +788,6 @@
"min_value": "0", "min_value": "0",
"max_value_warning": "20", "max_value_warning": "20",
"type": "int", "type": "int",
"min_value": "1",
"visible": false, "visible": false,
"inherit": false, "inherit": false,
"enabled": "retraction_enable" "enabled": "retraction_enable"
@ -760,7 +798,7 @@
"unit": "mm", "unit": "mm",
"type": "float", "type": "float",
"default": 4.5, "default": 4.5,
"min_value": "0.0", "min_value": "0",
"max_value_warning": "retraction_amount * 2", "max_value_warning": "retraction_amount * 2",
"visible": false, "visible": false,
"inherit_function": "retraction_amount", "inherit_function": "retraction_amount",
@ -861,9 +899,9 @@
"inherit_function": "speed_print", "inherit_function": "speed_print",
"enabled": "support_enable", "enabled": "support_enable",
"children": { "children": {
"speed_support_infill": { "speed_support_lines": {
"label": "Support Infill Speed", "label": "Support Wall Speed",
"description": "The speed at which the infill of exterior support is printed. Printing the infill at higher speeds can improve the overall print time.", "description": "The speed at which the walls of exterior support are printed. Printing the walls at higher speeds can improve the overall duration.",
"unit": "mm/s", "unit": "mm/s",
"type": "float", "type": "float",
"default": 60, "default": 60,
@ -951,6 +989,7 @@
"default": true, "default": true,
"visible": false, "visible": false,
"enabled": "retraction_combing", "enabled": "retraction_combing",
"global_only": "print_sequence != \"one_at_a_time\"",
"children": { "children": {
"travel_avoid_distance": { "travel_avoid_distance": {
"label": "Avoid Distance", "label": "Avoid Distance",
@ -962,7 +1001,8 @@
"max_value_warning": "machine_nozzle_tip_outer_diameter * 5", "max_value_warning": "machine_nozzle_tip_outer_diameter * 5",
"visible": false, "visible": false,
"inherit": false, "inherit": false,
"enabled": "retraction_combing" "enabled": "retraction_combing",
"global_only": "print_sequence != \"one_at_a_time\""
} }
} }
}, },
@ -986,8 +1026,8 @@
"enabled": "coasting_enable" "enabled": "coasting_enable"
}, },
"coasting_min_volume": { "coasting_min_volume": {
"label": "Minimum Volume Before Coasting", "label": "Minimal Volume Before Coasting",
"description": "The smallest volume an extrusion path should have to coast the full amount. For smaller extrusion paths, less pressure has been built up in the bowden tube and so the coasted volume is scaled linearly. This value should always be larger than the Coasting Volume.", "description": "The least volume an extrusion path should have to coast the full amount. For smaller extrusion paths, less pressure has been built up in the bowden tube and so the coasted volume is scaled linearly. This value should always be larger than the Coasting Volume.",
"unit": "mm³", "unit": "mm³",
"type": "float", "type": "float",
"default": 0.8, "default": 0.8,
@ -1020,6 +1060,7 @@
"description": "Enable the cooling fan during the print. The extra cooling from the cooling fan helps parts with small cross sections that print each layer quickly.", "description": "Enable the cooling fan during the print. The extra cooling from the cooling fan helps parts with small cross sections that print each layer quickly.",
"type": "boolean", "type": "boolean",
"default": true, "default": true,
"global_only": "print_sequence != \"one_at_a_time\"",
"children": { "children": {
"cool_fan_speed": { "cool_fan_speed": {
"label": "Fan Speed", "label": "Fan Speed",
@ -1031,6 +1072,7 @@
"default": 100, "default": 100,
"visible": false, "visible": false,
"inherit_function": "100.0 if parent_value else 0.0", "inherit_function": "100.0 if parent_value else 0.0",
"global_only": "print_sequence != \"one_at_a_time\"",
"children": { "children": {
"cool_fan_speed_min": { "cool_fan_speed_min": {
"label": "Minimum Fan Speed", "label": "Minimum Fan Speed",
@ -1040,7 +1082,8 @@
"min_value": "0", "min_value": "0",
"max_value": "100", "max_value": "100",
"default": 100, "default": 100,
"visible": false "visible": false,
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"cool_fan_speed_max": { "cool_fan_speed_max": {
"label": "Maximum Fan Speed", "label": "Maximum Fan Speed",
@ -1050,7 +1093,8 @@
"min_value": "0", "min_value": "0",
"max_value": "100", "max_value": "100",
"default": 100, "default": 100,
"visible": false "visible": false,
"global_only": "print_sequence != \"one_at_a_time\""
} }
} }
} }
@ -1065,6 +1109,7 @@
"min_value": "0", "min_value": "0",
"max_value_warning": "10.0", "max_value_warning": "10.0",
"visible": false, "visible": false,
"global_only": "print_sequence != \"one_at_a_time\"",
"children": { "children": {
"cool_fan_full_layer": { "cool_fan_full_layer": {
"label": "Fan Full on at Layer", "label": "Fan Full on at Layer",
@ -1074,7 +1119,8 @@
"min_value": "0", "min_value": "0",
"max_value_warning": "100", "max_value_warning": "100",
"visible": false, "visible": false,
"inherit_function": "int((parent_value - layer_height_0 + 0.001) / layer_height)" "inherit_function": "int((parent_value - layer_height_0 + 0.001) / layer_height)",
"global_only": "print_sequence != \"one_at_a_time\""
} }
} }
}, },
@ -1086,7 +1132,8 @@
"default": 5, "default": 5,
"min_value": "0", "min_value": "0",
"max_value_warning": "600", "max_value_warning": "600",
"visible": false "visible": false,
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"cool_min_layer_time_fan_speed_max": { "cool_min_layer_time_fan_speed_max": {
"label": "Minimum Layer Time Full Fan Speed", "label": "Minimum Layer Time Full Fan Speed",
@ -1096,7 +1143,8 @@
"default": 10, "default": 10,
"min_value": "cool_min_layer_time", "min_value": "cool_min_layer_time",
"max_value_warning": "600", "max_value_warning": "600",
"visible": false "visible": false,
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"cool_min_speed": { "cool_min_speed": {
"label": "Minimum Speed", "label": "Minimum Speed",
@ -1106,14 +1154,16 @@
"default": 10, "default": 10,
"min_value": "0", "min_value": "0",
"max_value_warning": "100", "max_value_warning": "100",
"visible": false "visible": false,
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"cool_lift_head": { "cool_lift_head": {
"label": "Lift Head", "label": "Lift Head",
"description": "Lift the head away from the print if the minimum speed is hit because of cool slowdown, and wait the extra time away from the print surface until the minimum layer time is used up.", "description": "Lift the head away from the print if the minimum speed is hit because of cool slowdown, and wait the extra time away from the print surface until the minimum layer time is used up.",
"type": "boolean", "type": "boolean",
"default": false, "default": false,
"visible": false "visible": false,
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"draft_shield_enabled": { "draft_shield_enabled": {
"label": "Enable Draft Shield", "label": "Enable Draft Shield",
@ -1204,7 +1254,7 @@
}, },
"support_z_distance": { "support_z_distance": {
"label": "Z Distance", "label": "Z Distance",
"description": "Distance from the top/bottom of the support to the print. A small gap here makes it easier to remove the support but makes the print a bit uglier. 0.15mm allows for easier separation of the support structure. The value is rounded down to the nearest multiple of the layer height", "description": "Distance from the top/bottom of the support to the print. A small gap here makes it easier to remove the support but makes the print a bit uglier. 0.15mm allows for easier separation of the support structure.",
"unit": "mm", "unit": "mm",
"type": "float", "type": "float",
"min_value": "0", "min_value": "0",
@ -1485,7 +1535,8 @@
"default": 1, "default": 1,
"min_value": "0", "min_value": "0",
"max_value_warning": "10", "max_value_warning": "10",
"enabled": "adhesion_type == \"skirt\"" "enabled": "adhesion_type == \"skirt\"",
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"skirt_gap": { "skirt_gap": {
"label": "Skirt Distance", "label": "Skirt Distance",
@ -1495,7 +1546,8 @@
"default": 3, "default": 3,
"min_value_warning": "0", "min_value_warning": "0",
"max_value_warning": "100", "max_value_warning": "100",
"enabled": "adhesion_type == \"skirt\"" "enabled": "adhesion_type == \"skirt\"",
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"skirt_minimal_length": { "skirt_minimal_length": {
"label": "Skirt Minimum Length", "label": "Skirt Minimum Length",
@ -1506,7 +1558,8 @@
"min_value": "0", "min_value": "0",
"min_value_warning": "25", "min_value_warning": "25",
"max_value_warning": "2500", "max_value_warning": "2500",
"enabled": "adhesion_type == \"skirt\"" "enabled": "adhesion_type == \"skirt\"",
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"brim_width": { "brim_width": {
"label": "Brim Width", "label": "Brim Width",
@ -1517,6 +1570,7 @@
"min_value": "0.0", "min_value": "0.0",
"max_value_warning": "100.0", "max_value_warning": "100.0",
"enabled": "adhesion_type == \"brim\"", "enabled": "adhesion_type == \"brim\"",
"global_only": "print_sequence != \"one_at_a_time\"",
"children": { "children": {
"brim_line_count": { "brim_line_count": {
"label": "Brim Line Count", "label": "Brim Line Count",
@ -1526,7 +1580,8 @@
"min_value": "0", "min_value": "0",
"max_value_warning": "300", "max_value_warning": "300",
"inherit_function": "math.ceil(parent_value / skirt_line_width)", "inherit_function": "math.ceil(parent_value / skirt_line_width)",
"enabled": "adhesion_type == \"brim\"" "enabled": "adhesion_type == \"brim\"",
"global_only": "print_sequence != \"one_at_a_time\""
} }
} }
}, },
@ -1816,7 +1871,8 @@
"description": "Spiralize smooths out the Z move of the outer edge. This will create a steady Z increase over the whole print. This feature turns a solid object into a single walled print with a solid bottom. This feature used to be called Joris in older versions.", "description": "Spiralize smooths out the Z move of the outer edge. This will create a steady Z increase over the whole print. This feature turns a solid object into a single walled print with a solid bottom. This feature used to be called Joris in older versions.",
"type": "boolean", "type": "boolean",
"default": false, "default": false,
"visible": false "visible": false,
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"magic_fuzzy_skin_enabled": { "magic_fuzzy_skin_enabled": {
"label": "Fuzzy Skin", "label": "Fuzzy Skin",
@ -1867,7 +1923,8 @@
"description": "Print only the outside surface with a sparse webbed structure, printing 'in thin air'. This is realized by horizontally printing the contours of the model at given Z intervals which are connected via upward and diagonally downward lines.", "description": "Print only the outside surface with a sparse webbed structure, printing 'in thin air'. This is realized by horizontally printing the contours of the model at given Z intervals which are connected via upward and diagonally downward lines.",
"type": "boolean", "type": "boolean",
"default": false, "default": false,
"visible": false "visible": false,
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"wireframe_height": { "wireframe_height": {
"label": "WP Connection Height", "label": "WP Connection Height",
@ -1878,7 +1935,8 @@
"min_value": "0.0001", "min_value": "0.0001",
"max_value_warning": "20", "max_value_warning": "20",
"visible": false, "visible": false,
"enabled": "wireframe_enabled" "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"wireframe_roof_inset": { "wireframe_roof_inset": {
"label": "WP Roof Inset Distance", "label": "WP Roof Inset Distance",
@ -1891,7 +1949,8 @@
"max_value_warning": "20", "max_value_warning": "20",
"visible": false, "visible": false,
"enabled": "wireframe_enabled", "enabled": "wireframe_enabled",
"inherit_function": "wireframe_height" "inherit_function": "wireframe_height",
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"wireframe_printspeed": { "wireframe_printspeed": {
"label": "WP speed", "label": "WP speed",
@ -1903,6 +1962,7 @@
"max_value_warning": "50", "max_value_warning": "50",
"visible": false, "visible": false,
"enabled": "wireframe_enabled", "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\"",
"children": { "children": {
"wireframe_printspeed_bottom": { "wireframe_printspeed_bottom": {
"label": "WP Bottom Printing Speed", "label": "WP Bottom Printing Speed",
@ -1914,7 +1974,8 @@
"max_value_warning": "50", "max_value_warning": "50",
"visible": false, "visible": false,
"inherit": true, "inherit": true,
"enabled": "wireframe_enabled" "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"wireframe_printspeed_up": { "wireframe_printspeed_up": {
"label": "WP Upward Printing Speed", "label": "WP Upward Printing Speed",
@ -1926,7 +1987,8 @@
"max_value_warning": "50", "max_value_warning": "50",
"visible": false, "visible": false,
"inherit": true, "inherit": true,
"enabled": "wireframe_enabled" "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"wireframe_printspeed_down": { "wireframe_printspeed_down": {
"label": "WP Downward Printing Speed", "label": "WP Downward Printing Speed",
@ -1938,7 +2000,8 @@
"max_value_warning": "50", "max_value_warning": "50",
"visible": false, "visible": false,
"inherit": true, "inherit": true,
"enabled": "wireframe_enabled" "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"wireframe_printspeed_flat": { "wireframe_printspeed_flat": {
"label": "WP Horizontal Printing Speed", "label": "WP Horizontal Printing Speed",
@ -1950,7 +2013,8 @@
"max_value_warning": "100", "max_value_warning": "100",
"visible": false, "visible": false,
"inherit": true, "inherit": true,
"enabled": "wireframe_enabled" "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\""
} }
} }
}, },
@ -1964,6 +2028,7 @@
"type": "float", "type": "float",
"visible": false, "visible": false,
"enabled": "wireframe_enabled", "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\"",
"children": { "children": {
"wireframe_flow_connection": { "wireframe_flow_connection": {
"label": "WP Connection Flow", "label": "WP Connection Flow",
@ -1974,7 +2039,8 @@
"max_value_warning": "100", "max_value_warning": "100",
"type": "float", "type": "float",
"visible": false, "visible": false,
"enabled": "wireframe_enabled" "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"wireframe_flow_flat": { "wireframe_flow_flat": {
"label": "WP Flat Flow", "label": "WP Flat Flow",
@ -1985,7 +2051,8 @@
"max_value_warning": "100", "max_value_warning": "100",
"type": "float", "type": "float",
"visible": false, "visible": false,
"enabled": "wireframe_enabled" "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\""
} }
} }
}, },
@ -1998,7 +2065,8 @@
"min_value": "0", "min_value": "0",
"max_value_warning": "1", "max_value_warning": "1",
"visible": false, "visible": false,
"enabled": "wireframe_enabled" "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"wireframe_bottom_delay": { "wireframe_bottom_delay": {
"label": "WP Bottom Delay", "label": "WP Bottom Delay",
@ -2009,7 +2077,8 @@
"min_value": "0", "min_value": "0",
"max_value_warning": "1", "max_value_warning": "1",
"visible": false, "visible": false,
"enabled": "wireframe_enabled" "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"wireframe_flat_delay": { "wireframe_flat_delay": {
"label": "WP Flat Delay", "label": "WP Flat Delay",
@ -2020,7 +2089,8 @@
"min_value": "0", "min_value": "0",
"max_value_warning": "0.5", "max_value_warning": "0.5",
"visible": false, "visible": false,
"enabled": "wireframe_enabled" "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"wireframe_up_half_speed": { "wireframe_up_half_speed": {
"label": "WP Ease Upward", "label": "WP Ease Upward",
@ -2031,7 +2101,8 @@
"min_value": "0", "min_value": "0",
"max_value_warning": "5.0", "max_value_warning": "5.0",
"visible": false, "visible": false,
"enabled": "wireframe_enabled" "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"wireframe_top_jump": { "wireframe_top_jump": {
"label": "WP Knot Size", "label": "WP Knot Size",
@ -2042,7 +2113,8 @@
"min_value": "0", "min_value": "0",
"max_value_warning": "2.0", "max_value_warning": "2.0",
"visible": false, "visible": false,
"enabled": "wireframe_enabled" "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"wireframe_fall_down": { "wireframe_fall_down": {
"label": "WP Fall Down", "label": "WP Fall Down",
@ -2053,7 +2125,8 @@
"min_value": "0", "min_value": "0",
"max_value_warning": "wireframe_height", "max_value_warning": "wireframe_height",
"visible": false, "visible": false,
"enabled": "wireframe_enabled" "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"wireframe_drag_along": { "wireframe_drag_along": {
"label": "WP Drag along", "label": "WP Drag along",
@ -2064,7 +2137,8 @@
"min_value": "0", "min_value": "0",
"max_value_warning": "wireframe_height", "max_value_warning": "wireframe_height",
"visible": false, "visible": false,
"enabled": "wireframe_enabled" "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"wireframe_strategy": { "wireframe_strategy": {
"label": "WP Strategy", "label": "WP Strategy",
@ -2077,7 +2151,8 @@
}, },
"default": "compensate", "default": "compensate",
"visible": false, "visible": false,
"enabled": "wireframe_enabled" "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"wireframe_straight_before_down": { "wireframe_straight_before_down": {
"label": "WP Straighten Downward Lines", "label": "WP Straighten Downward Lines",
@ -2088,7 +2163,8 @@
"min_value": "0", "min_value": "0",
"max_value": "100", "max_value": "100",
"visible": false, "visible": false,
"enabled": "wireframe_enabled" "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"wireframe_roof_fall_down": { "wireframe_roof_fall_down": {
"label": "WP Roof Fall Down", "label": "WP Roof Fall Down",
@ -2099,7 +2175,8 @@
"min_value_warning": "0", "min_value_warning": "0",
"max_value_warning": "wireframe_roof_inset", "max_value_warning": "wireframe_roof_inset",
"visible": false, "visible": false,
"enabled": "wireframe_enabled" "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"wireframe_roof_drag_along": { "wireframe_roof_drag_along": {
"label": "WP Roof Drag Along", "label": "WP Roof Drag Along",
@ -2110,7 +2187,8 @@
"min_value": "0", "min_value": "0",
"max_value_warning": "10", "max_value_warning": "10",
"visible": false, "visible": false,
"enabled": "wireframe_enabled" "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"wireframe_roof_outer_delay": { "wireframe_roof_outer_delay": {
"label": "WP Roof Outer Delay", "label": "WP Roof Outer Delay",
@ -2121,7 +2199,8 @@
"min_value": "0", "min_value": "0",
"max_value_warning": "2.0", "max_value_warning": "2.0",
"visible": false, "visible": false,
"enabled": "wireframe_enabled" "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\""
}, },
"wireframe_nozzle_clearance": { "wireframe_nozzle_clearance": {
"label": "WP Nozzle Clearance", "label": "WP Nozzle Clearance",
@ -2132,7 +2211,8 @@
"min_value_warning": "0", "min_value_warning": "0",
"max_value_warning": "10.0", "max_value_warning": "10.0",
"visible": false, "visible": false,
"enabled": "wireframe_enabled" "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\""
} }
} }
} }

View File

@ -6,7 +6,7 @@
"author": "Other", "author": "Other",
"icon": "icon_ultimaker.png", "icon": "icon_ultimaker.png",
"platform": "grr_neo_platform.stl", "platform": "grr_neo_platform.stl",
"file_formats": "text/x-gcode",
"inherits": "fdmprinter.json", "inherits": "fdmprinter.json",
"visible": "true", "visible": "true",

View File

@ -5,6 +5,7 @@
"manufacturer": "Other", "manufacturer": "Other",
"icon": "icon_ultimaker.png", "icon": "icon_ultimaker.png",
"platform": "", "platform": "",
"file_formats": "application/x3g",
"inherits": "fdmprinter.json", "inherits": "fdmprinter.json",
"machine_settings": { "machine_settings": {

View File

@ -6,7 +6,7 @@
"author": "Other", "author": "Other",
"icon": "icon_ultimaker2.png", "icon": "icon_ultimaker2.png",
"platform": "makerstarter_platform.stl", "platform": "makerstarter_platform.stl",
"file_formats": "text/x-gcode;application/x-stl-ascii;application/x-stl-binary;application/x-wavefront-obj",
"inherits": "fdmprinter.json", "inherits": "fdmprinter.json",
"overrides": { "overrides": {

View File

@ -6,7 +6,7 @@
"author": "Other", "author": "Other",
"icon": "icon_ultimaker2.png", "icon": "icon_ultimaker2.png",
"platform": "prusai3_platform.stl", "platform": "prusai3_platform.stl",
"file_formats": "text/x-gcode",
"inherits": "fdmprinter.json", "inherits": "fdmprinter.json",
"overrides": { "overrides": {

View File

@ -7,6 +7,7 @@
"icon": "icon_ultimaker2.png", "icon": "icon_ultimaker2.png",
"platform": "ultimaker2_platform.obj", "platform": "ultimaker2_platform.obj",
"platform_texture": "Ultimaker2backplate.png", "platform_texture": "Ultimaker2backplate.png",
"file_formats": "text/x-gcode",
"inherits": "fdmprinter.json", "inherits": "fdmprinter.json",

View File

@ -7,7 +7,7 @@
"icon": "icon_ultimaker2.png", "icon": "icon_ultimaker2.png",
"platform": "ultimaker2_platform.obj", "platform": "ultimaker2_platform.obj",
"platform_texture": "Ultimaker2Extendedbackplate.png", "platform_texture": "Ultimaker2Extendedbackplate.png",
"file_formats": "text/x-gcode",
"inherits": "ultimaker2.json", "inherits": "ultimaker2.json",
"overrides": { "overrides": {

View File

@ -7,6 +7,7 @@
"platform": "ultimaker2_platform.obj", "platform": "ultimaker2_platform.obj",
"platform_texture": "ultimaker2plus_backplate.png", "platform_texture": "ultimaker2plus_backplate.png",
"visible": false, "visible": false,
"file_formats": "text/x-gcode",
"inherits": "ultimaker2plus.json", "inherits": "ultimaker2plus.json",
"machine_settings": { "machine_settings": {

View File

@ -6,8 +6,10 @@
"author": "Ultimaker", "author": "Ultimaker",
"platform": "ultimaker2_platform.obj", "platform": "ultimaker2_platform.obj",
"platform_texture": "ultimaker2plus_backplate.png", "platform_texture": "ultimaker2plus_backplate.png",
"file_formats": "text/x-gcode",
"inherits": "ultimaker2_extended_plus.json", "inherits": "ultimaker2_extended_plus.json",
"variant": "0.25mm Nozzle", "variant": "0.25 mm",
"profiles_machine": "ultimaker2plus",
"machine_settings": { "machine_settings": {
"machine_nozzle_size": { "default": 0.25 } "machine_nozzle_size": { "default": 0.25 }
} }

View File

@ -6,8 +6,10 @@
"author": "Ultimaker", "author": "Ultimaker",
"platform": "ultimaker2_platform.obj", "platform": "ultimaker2_platform.obj",
"platform_texture": "ultimaker2plus_backplate.png", "platform_texture": "ultimaker2plus_backplate.png",
"file_formats": "text/x-gcode",
"inherits": "ultimaker2_extended_plus.json", "inherits": "ultimaker2_extended_plus.json",
"variant": "0.40mm Nozzle", "variant": "0.4 mm",
"profiles_machine": "ultimaker2plus",
"machine_settings": { "machine_settings": {
"machine_nozzle_size": { "default": 0.40 } "machine_nozzle_size": { "default": 0.40 }
} }

View File

@ -6,8 +6,10 @@
"author": "Ultimaker", "author": "Ultimaker",
"platform": "ultimaker2_platform.obj", "platform": "ultimaker2_platform.obj",
"platform_texture": "ultimaker2plus_backplate.png", "platform_texture": "ultimaker2plus_backplate.png",
"file_formats": "text/x-gcode",
"inherits": "ultimaker2_extended_plus.json", "inherits": "ultimaker2_extended_plus.json",
"variant": "0.60mm Nozzle", "variant": "0.6 mm",
"profiles_machine": "ultimaker2plus",
"machine_settings": { "machine_settings": {
"machine_nozzle_size": { "default": 0.60 } "machine_nozzle_size": { "default": 0.60 }
} }

View File

@ -6,8 +6,10 @@
"author": "Ultimaker", "author": "Ultimaker",
"platform": "ultimaker2_platform.obj", "platform": "ultimaker2_platform.obj",
"platform_texture": "ultimaker2plus_backplate.png", "platform_texture": "ultimaker2plus_backplate.png",
"file_formats": "text/x-gcode",
"inherits": "ultimaker2_extended_plus.json", "inherits": "ultimaker2_extended_plus.json",
"variant": "0.80mm Nozzle", "variant": "0.8 mm",
"profiles_machine": "ultimaker2plus",
"machine_settings": { "machine_settings": {
"machine_nozzle_size": { "default": 0.80 } "machine_nozzle_size": { "default": 0.80 }
} }

View File

@ -7,7 +7,7 @@
"icon": "icon_ultimaker2.png", "icon": "icon_ultimaker2.png",
"platform": "ultimaker2go_platform.obj", "platform": "ultimaker2go_platform.obj",
"platform_texture": "Ultimaker2Gobackplate.png", "platform_texture": "Ultimaker2Gobackplate.png",
"file_formats": "text/x-gcode",
"inherits": "ultimaker2.json", "inherits": "ultimaker2.json",
"overrides": { "overrides": {

View File

@ -7,18 +7,15 @@
"platform": "ultimaker2_platform.obj", "platform": "ultimaker2_platform.obj",
"platform_texture": "ultimaker2plus_backplate.png", "platform_texture": "ultimaker2plus_backplate.png",
"visible": false, "visible": false,
"file_formats": "text/x-gcode",
"inherits": "ultimaker2.json", "inherits": "ultimaker2.json",
"machine_settings": { "overrides": {
"machine_width": { "default": 230 }, "machine_width": { "default": 230 },
"machine_depth": { "default": 225 }, "machine_depth": { "default": 225 },
"machine_height": { "default": 200 }, "machine_height": { "default": 200 },
"machine_show_variants": { "default": true }, "machine_show_variants": { "default": true },
"gantry_height": { "default": 50 } "gantry_height": { "default": 50 },
},
"overrides": {
"shell_thickness": { "default": 1.2 }, "shell_thickness": { "default": 1.2 },
"top_bottom_thickness": { "inherit_function": "(parent_value / 3) * 2" }, "top_bottom_thickness": { "inherit_function": "(parent_value / 3) * 2" },
"travel_compensate_overlapping_walls_enabled": { "default": true }, "travel_compensate_overlapping_walls_enabled": { "default": true },

View File

@ -6,16 +6,14 @@
"author": "Ultimaker", "author": "Ultimaker",
"platform": "ultimaker2_platform.obj", "platform": "ultimaker2_platform.obj",
"platform_texture": "ultimaker2plus_backplate.png", "platform_texture": "ultimaker2plus_backplate.png",
"file_formats": "text/x-gcode",
"inherits": "ultimaker2plus.json", "inherits": "ultimaker2plus.json",
"variant": "0.25mm Nozzle", "variant": "0.25 mm",
"machine_settings": {
"machine_nozzle_size": { "default": 0.25 }
},
"overrides": { "overrides": {
"machine_nozzle_size": { "default": 0.25 },
"layer_height": { "default": 0.06 }, "layer_height": { "default": 0.06 },
"layer_height_0": { "default": 0.15 }, "layer_height_0": { "default": 0.15 },

View File

@ -6,16 +6,14 @@
"author": "Ultimaker", "author": "Ultimaker",
"platform": "ultimaker2_platform.obj", "platform": "ultimaker2_platform.obj",
"platform_texture": "ultimaker2plus_backplate.png", "platform_texture": "ultimaker2plus_backplate.png",
"file_formats": "text/x-gcode",
"inherits": "ultimaker2plus.json", "inherits": "ultimaker2plus.json",
"variant": "0.40mm Nozzle", "variant": "0.4 mm",
"machine_settings": {
"machine_nozzle_size": { "default": 0.40 }
},
"overrides": { "overrides": {
"machine_nozzle_size": { "default": 0.40 },
"wall_line_width_0": { "inherit_function": "parent_value * 0.875" }, "wall_line_width_0": { "inherit_function": "parent_value * 0.875" },
"skin_line_width": { "inherit_function": "parent_value * 0.875" } "skin_line_width": { "inherit_function": "parent_value * 0.875" }
} }

View File

@ -6,16 +6,14 @@
"author": "Ultimaker", "author": "Ultimaker",
"platform": "ultimaker2_platform.obj", "platform": "ultimaker2_platform.obj",
"platform_texture": "ultimaker2plus_backplate.png", "platform_texture": "ultimaker2plus_backplate.png",
"file_formats": "text/x-gcode",
"inherits": "ultimaker2plus.json", "inherits": "ultimaker2plus.json",
"variant": "0.60mm Nozzle", "variant": "0.6 mm",
"machine_settings": {
"machine_nozzle_size": { "default": 0.60 }
},
"overrides": { "overrides": {
"machine_nozzle_size": { "default": 0.60 },
"layer_height": { "default": 0.15 }, "layer_height": { "default": 0.15 },
"layer_height_0": { "default": 0.4 }, "layer_height_0": { "default": 0.4 },

View File

@ -6,16 +6,14 @@
"author": "Ultimaker", "author": "Ultimaker",
"platform": "ultimaker2_platform.obj", "platform": "ultimaker2_platform.obj",
"platform_texture": "ultimaker2plus_backplate.png", "platform_texture": "ultimaker2plus_backplate.png",
"file_formats": "text/x-gcode",
"inherits": "ultimaker2plus.json", "inherits": "ultimaker2plus.json",
"variant": "0.80mm Nozzle", "variant": "0.8 mm",
"machine_settings": {
"machine_nozzle_size": { "default": 0.80 }
},
"overrides": { "overrides": {
"machine_nozzle_size": { "default": 0.80 },
"layer_height": { "default": 0.2 }, "layer_height": { "default": 0.2 },
"layer_height_0": { "default": 0.5 }, "layer_height_0": { "default": 0.5 },

View File

@ -6,7 +6,7 @@
"author": "Ultimaker", "author": "Ultimaker",
"icon": "icon_ultimaker.png", "icon": "icon_ultimaker.png",
"platform": "ultimaker_platform.stl", "platform": "ultimaker_platform.stl",
"file_formats": "text/x-gcode",
"inherits": "fdmprinter.json", "inherits": "fdmprinter.json",
"pages": [ "pages": [

View File

@ -7,7 +7,7 @@
"icon": "icon_ultimaker.png", "icon": "icon_ultimaker.png",
"platform": "ultimaker2_platform.obj", "platform": "ultimaker2_platform.obj",
"platform_texture": "UltimakerPlusbackplate.png", "platform_texture": "UltimakerPlusbackplate.png",
"file_formats": "text/x-gcode",
"inherits": "ultimaker_original.json", "inherits": "ultimaker_original.json",
"pages": [ "pages": [

View File

@ -1,15 +0,0 @@
[general]
version = 1
name = Low Quality
[settings]
layer_height = 0.15
shell_thickness = 0.8
infill_sparse_density = 8
speed_print = 60
speed_wall_0 = 40
speed_wall_x = 50
speed_topbottom = 30
speed_travel = 150
speed_layer_0 = 30
skirt_speed = 30

View File

@ -1,5 +0,0 @@
[general]
version = 1
name = Normal Quality
[settings]

View File

@ -1,9 +0,0 @@
[general]
version = 1
name = Ulti Quality
[settings]
layer_height = 0.04
shell_thickness = 1.6
top_bottom_thickness = 0.8
infill_sparse_density = 14

View File

@ -4,5 +4,7 @@ name = High Quality
[settings] [settings]
layer_height = 0.06 layer_height = 0.06
infill_sparse_density = 12 speed_wall_0 = 30
speed_topbottom = 15
speed_infill = 80

View File

@ -0,0 +1,14 @@
[general]
version = 1
name = Low Quality
[settings]
infill_sparse_density = 10
layer_height = 0.15
cool_min_layer_time = 3
speed_wall_0 = 40
speed_wall_x = 80
speed_infill = 100
shell_thickness = 1
speed_topbottom = 30

View File

@ -0,0 +1,9 @@
[general]
version = 1
name = Normal Quality
[settings]
speed_wall_0 = 30
speed_topbottom = 15
speed_infill = 80

View File

@ -0,0 +1,10 @@
[general]
version = 1
name = Ulti Quality
[settings]
layer_height = 0.04
speed_wall_0 = 30
speed_topbottom = 15
speed_infill = 80

View File

@ -0,0 +1,12 @@
[general]
version = 1
type = material
name = ABS
[settings]
material_bed_temperature = 100
platform_adhesion = Brim
material_flow = 107
material_print_temperature = 250
cool_fan_speed = 50
cool_fan_speed_max = 50

View File

@ -0,0 +1,12 @@
[general]
version = 1
type = material
name = CPE
[settings]
material_bed_temperature = 60
platform_adhesion = Brim
material_flow = 100
material_print_temperature = 250
cool_fan_speed = 50
cool_fan_speed_max = 50

View File

@ -0,0 +1,12 @@
[general]
version = 1
type = material
name = PLA
[settings]
material_bed_temperature = 60
platform_adhesion = Skirt
material_flow = 100
material_print_temperature = 210
cool_fan_speed = 100
cool_fan_speed_max = 100

View File

@ -0,0 +1,51 @@
[general]
version = 1
name = High Quality
machine_type = ultimaker2plus
machine_variant = 0.25 mm
material = ABS
[settings]
raft_surface_thickness = 0.27
raft_base_line_width = 1.0
raft_margin = 5.0
cool_min_layer_time = 2
support_enable = False
retraction_combing = All
cool_min_speed = 25
brim_line_count = 32
top_thickness = 0.72
material_flow = 100.0
cool_lift_head = True
speed_print = 20
retraction_hop = 0.0
machine_nozzle_size = 0.22
layer_height = 0.06
speed_wall_0 = 20
raft_interface_line_spacing = 3.0
speed_topbottom = 20
speed_infill = 30
infill_before_walls = False
retraction_speed = 40.0
skin_no_small_gaps_heuristic = False
infill_sparse_density = 22
shell_thickness = 0.88
cool_fan_speed_max = 100
raft_airgap = 0.0
material_bed_temperature = 70
infill_overlap = 15
speed_wall_x = 25
skirt_minimal_length = 150.0
speed_layer_0 = 20
bottom_thickness = 0.72
layer_height_0 = 0.15
magic_mesh_surface_mode = False
cool_fan_speed_min = 50
top_bottom_thickness = 0.72
skirt_gap = 3.0
raft_interface_line_width = 0.4
adhesion_type = brim
support_pattern = lines
raft_surface_line_width = 0.4
raft_surface_line_spacing = 3.0

View File

@ -0,0 +1,51 @@
[general]
version = 1
name = Fast Prints
machine_type = ultimaker2plus
machine_variant = 0.4 mm
material = ABS
[settings]
raft_surface_thickness = 0.27
raft_base_line_width = 1.0
raft_margin = 5.0
cool_min_layer_time = 3
support_enable = False
retraction_combing = All
speed_travel = 150
cool_min_speed = 20
brim_line_count = 20
top_thickness = 0.75
material_flow = 100.0
cool_lift_head = True
speed_print = 40
retraction_hop = 0.0
machine_nozzle_size = 0.35
layer_height = 0.15
speed_wall_0 = 30
raft_interface_line_spacing = 3.0
speed_topbottom = 30
speed_infill = 55
infill_before_walls = False
retraction_speed = 40.0
skin_no_small_gaps_heuristic = False
infill_sparse_density = 18
shell_thickness = 0.7
cool_fan_speed_max = 100
raft_airgap = 0.0
material_bed_temperature = 70
infill_overlap = 15
speed_wall_x = 40
skirt_minimal_length = 150.0
bottom_thickness = 0.75
layer_height_0 = 0.26
magic_mesh_surface_mode = False
cool_fan_speed_min = 50
top_bottom_thickness = 0.75
skirt_gap = 3.0
raft_interface_line_width = 0.4
adhesion_type = brim
support_pattern = lines
raft_surface_line_width = 0.4
raft_surface_line_spacing = 3.0

View File

@ -0,0 +1,51 @@
[general]
version = 1
name = High Quality
machine_type = ultimaker2plus
machine_variant = 0.4 mm
material = ABS
[settings]
raft_surface_thickness = 0.27
raft_base_line_width = 1.0
raft_margin = 5.0
cool_min_layer_time = 3
support_enable = False
retraction_combing = All
cool_min_speed = 20
brim_line_count = 20
top_thickness = 0.72
material_flow = 100.0
cool_lift_head = True
speed_print = 30
retraction_hop = 0.0
machine_nozzle_size = 0.35
layer_height = 0.06
speed_wall_0 = 20
raft_interface_line_spacing = 3.0
speed_topbottom = 20
speed_infill = 45
infill_before_walls = False
retraction_speed = 40.0
skin_no_small_gaps_heuristic = False
infill_sparse_density = 22
shell_thickness = 1.05
cool_fan_speed_max = 100
raft_airgap = 0.0
material_bed_temperature = 70
infill_overlap = 15
speed_wall_x = 30
skirt_minimal_length = 150.0
speed_layer_0 = 20
bottom_thickness = 0.72
layer_height_0 = 0.26
magic_mesh_surface_mode = False
cool_fan_speed_min = 50
top_bottom_thickness = 0.72
skirt_gap = 3.0
raft_interface_line_width = 0.4
adhesion_type = brim
support_pattern = lines
raft_surface_line_width = 0.4
raft_surface_line_spacing = 3.0

View File

@ -0,0 +1,46 @@
[general]
version = 1
name = Normal Quality
machine_type = ultimaker2plus
machine_variant = 0.4 mm
material = ABS
[settings]
raft_surface_thickness = 0.27
raft_base_line_width = 1.0
raft_margin = 5.0
support_enable = False
retraction_combing = All
cool_min_speed = 20
brim_line_count = 20
material_flow = 100.0
cool_lift_head = True
speed_print = 30
retraction_hop = 0.0
machine_nozzle_size = 0.35
speed_wall_0 = 20
raft_interface_line_spacing = 3.0
speed_topbottom = 20
speed_infill = 45
infill_before_walls = False
retraction_speed = 40.0
skin_no_small_gaps_heuristic = False
shell_thickness = 1.05
cool_fan_speed_max = 100
raft_airgap = 0.0
material_bed_temperature = 70
infill_overlap = 15
speed_wall_x = 30
skirt_minimal_length = 150.0
speed_layer_0 = 20
layer_height_0 = 0.26
magic_mesh_surface_mode = False
cool_fan_speed_min = 50
cool_min_layer_time = 3
skirt_gap = 3.0
raft_interface_line_width = 0.4
adhesion_type = brim
support_pattern = lines
raft_surface_line_width = 0.4
raft_surface_line_spacing = 3.0

View File

@ -0,0 +1,50 @@
[general]
version = 1
name = Normal Quality
machine_type = ultimaker2plus
machine_variant = 0.6 mm
material = ABS
[settings]
raft_surface_thickness = 0.27
raft_base_line_width = 1.0
raft_margin = 5.0
cool_min_layer_time = 3
support_enable = False
retraction_combing = All
cool_min_speed = 20
brim_line_count = 14
top_thickness = 1.2
material_flow = 100.0
cool_lift_head = True
speed_print = 25
retraction_hop = 0.0
machine_nozzle_size = 0.53
layer_height = 0.15
speed_wall_0 = 20
raft_interface_line_spacing = 3.0
speed_topbottom = 20
speed_infill = 55
infill_before_walls = False
retraction_speed = 40.0
skin_no_small_gaps_heuristic = False
shell_thickness = 1.59
cool_fan_speed_max = 100
raft_airgap = 0.0
material_bed_temperature = 70
infill_overlap = 15
speed_wall_x = 30
skirt_minimal_length = 150.0
speed_layer_0 = 20
bottom_thickness = 1.2
layer_height_0 = 0.39
magic_mesh_surface_mode = False
cool_fan_speed_min = 50
top_bottom_thickness = 1.2
skirt_gap = 3.0
raft_interface_line_width = 0.4
adhesion_type = brim
support_pattern = lines
raft_surface_line_width = 0.4
raft_surface_line_spacing = 3.0

View File

@ -0,0 +1,50 @@
[general]
version = 1
name = Fast Prints
machine_type = ultimaker2plus
machine_variant = 0.8 mm
material = ABS
[settings]
raft_surface_thickness = 0.27
raft_base_line_width = 1.0
raft_margin = 5.0
cool_min_layer_time = 3
support_enable = False
retraction_combing = All
cool_min_speed = 15
brim_line_count = 10
top_thickness = 1.2
material_flow = 100.0
cool_lift_head = True
speed_print = 20
retraction_hop = 0.0
machine_nozzle_size = 0.7
layer_height = 0.2
speed_wall_0 = 20
raft_interface_line_spacing = 3.0
speed_topbottom = 20
speed_infill = 40
infill_before_walls = False
retraction_speed = 40.0
skin_no_small_gaps_heuristic = False
shell_thickness = 2.1
cool_fan_speed_max = 100
raft_airgap = 0.0
material_bed_temperature = 70
infill_overlap = 15
speed_wall_x = 30
skirt_minimal_length = 150.0
speed_layer_0 = 20
bottom_thickness = 1.2
layer_height_0 = 0.5
magic_mesh_surface_mode = False
cool_fan_speed_min = 50
top_bottom_thickness = 1.2
skirt_gap = 3.0
raft_interface_line_width = 0.4
adhesion_type = brim
support_pattern = lines
raft_surface_line_width = 0.4
raft_surface_line_spacing = 3.0

View File

@ -0,0 +1,50 @@
[general]
version = 1
name = High Quality
machine_type = ultimaker2plus
machine_variant = 0.25 mm
material = CPE
[settings]
cool_fan_speed_min = 50
retraction_hop = 0.0
support_enable = False
raft_airgap = 0.0
raft_surface_thickness = 0.27
raft_interface_line_spacing = 3.0
skin_no_small_gaps_heuristic = False
bottom_thickness = 0.72
raft_surface_line_spacing = 3.0
retraction_combing = All
adhesion_type = brim
cool_min_layer_time = 2
layer_height = 0.06
raft_margin = 5.0
speed_infill = 30
speed_layer_0 = 20
brim_line_count = 32
cool_lift_head = True
retraction_speed = 40.0
cool_fan_speed_max = 100
magic_mesh_surface_mode = False
speed_print = 20
shell_thickness = 0.88
speed_wall_0 = 20
material_flow = 100.0
support_pattern = lines
infill_sparse_density = 22
raft_interface_line_width = 0.4
layer_height_0 = 0.15
material_bed_temperature = 70
top_thickness = 0.72
top_bottom_thickness = 0.72
speed_wall_x = 25
infill_overlap = 17
infill_before_walls = False
raft_surface_line_width = 0.4
skirt_minimal_length = 150.0
speed_topbottom = 20
skirt_gap = 3.0
raft_base_line_width = 1.0
machine_nozzle_size = 0.22

View File

@ -0,0 +1,50 @@
[general]
version = 1
name = Fast Prints
machine_type = ultimaker2plus
machine_variant = 0.4 mm
material = CPE
[settings]
cool_fan_speed_min = 50
retraction_hop = 0.0
skin_no_small_gaps_heuristic = False
raft_airgap = 0.0
speed_travel = 150
raft_surface_thickness = 0.27
raft_interface_line_spacing = 3.0
support_enable = False
raft_surface_line_width = 0.4
raft_surface_line_spacing = 3.0
retraction_combing = All
adhesion_type = brim
cool_min_layer_time = 3
layer_height = 0.15
raft_margin = 5.0
speed_infill = 45
bottom_thickness = 0.75
brim_line_count = 20
cool_lift_head = True
retraction_speed = 40.0
cool_fan_speed_max = 100
magic_mesh_surface_mode = False
speed_print = 30
shell_thickness = 0.7
speed_wall_0 = 30
material_flow = 100.0
support_pattern = lines
infill_sparse_density = 18
raft_interface_line_width = 0.4
layer_height_0 = 0.26
material_bed_temperature = 70
top_thickness = 0.75
top_bottom_thickness = 0.75
speed_wall_x = 40
infill_overlap = 17
infill_before_walls = False
skirt_minimal_length = 150.0
speed_topbottom = 20
skirt_gap = 3.0
raft_base_line_width = 1.0
machine_nozzle_size = 0.35

View File

@ -0,0 +1,50 @@
[general]
version = 1
name = High Quality
machine_type = ultimaker2plus
machine_variant = 0.4 mm
material = CPE
[settings]
cool_fan_speed_min = 50
retraction_hop = 0.0
support_enable = False
raft_airgap = 0.0
raft_surface_thickness = 0.27
raft_interface_line_spacing = 3.0
skin_no_small_gaps_heuristic = False
bottom_thickness = 0.72
raft_surface_line_spacing = 3.0
retraction_combing = All
adhesion_type = brim
cool_min_layer_time = 3
layer_height = 0.06
raft_margin = 5.0
speed_infill = 45
speed_layer_0 = 20
brim_line_count = 20
cool_lift_head = True
retraction_speed = 40.0
cool_fan_speed_max = 100
magic_mesh_surface_mode = False
speed_print = 20
shell_thickness = 1.05
speed_wall_0 = 20
material_flow = 100.0
support_pattern = lines
infill_sparse_density = 22
raft_interface_line_width = 0.4
layer_height_0 = 0.26
material_bed_temperature = 70
top_thickness = 0.72
top_bottom_thickness = 0.72
speed_wall_x = 30
infill_overlap = 15
infill_before_walls = False
raft_surface_line_width = 0.4
skirt_minimal_length = 150.0
speed_topbottom = 20
skirt_gap = 3.0
raft_base_line_width = 1.0
machine_nozzle_size = 0.35

View File

@ -0,0 +1,45 @@
[general]
version = 1
name = Normal Quality
machine_type = ultimaker2plus
machine_variant = 0.4 mm
material = CPE
[settings]
retraction_hop = 0.0
support_enable = False
raft_airgap = 0.0
raft_surface_thickness = 0.27
support_pattern = lines
raft_interface_line_spacing = 3.0
skin_no_small_gaps_heuristic = False
raft_surface_line_width = 0.4
cool_fan_speed_min = 50
retraction_combing = All
adhesion_type = brim
cool_min_layer_time = 3
infill_before_walls = False
speed_layer_0 = 20
brim_line_count = 20
cool_lift_head = True
raft_interface_line_width = 0.4
cool_fan_speed_max = 100
magic_mesh_surface_mode = False
speed_print = 20
shell_thickness = 1.05
speed_wall_0 = 20
material_flow = 100.0
raft_surface_line_spacing = 3.0
raft_margin = 5.0
retraction_speed = 40.0
layer_height_0 = 0.26
material_bed_temperature = 70
speed_wall_x = 30
infill_overlap = 15
speed_infill = 45
skirt_minimal_length = 150.0
speed_topbottom = 20
skirt_gap = 3.0
raft_base_line_width = 1.0
machine_nozzle_size = 0.35

View File

@ -0,0 +1,49 @@
[general]
version = 1
name = Normal Quality
machine_type = ultimaker2plus
machine_variant = 0.6 mm
material = CPE
[settings]
cool_fan_speed_min = 50
retraction_hop = 0.0
support_enable = False
raft_airgap = 0.0
raft_surface_thickness = 0.27
raft_interface_line_spacing = 3.0
skin_no_small_gaps_heuristic = False
bottom_thickness = 1.2
support_pattern = lines
retraction_combing = All
adhesion_type = brim
cool_min_layer_time = 3
layer_height = 0.15
speed_infill = 40
speed_layer_0 = 20
brim_line_count = 14
cool_lift_head = True
retraction_speed = 40.0
cool_fan_speed_max = 100
magic_mesh_surface_mode = False
speed_print = 20
shell_thickness = 1.59
speed_wall_0 = 20
material_flow = 100.0
raft_surface_line_spacing = 3.0
raft_margin = 5.0
raft_interface_line_width = 0.4
layer_height_0 = 0.39
material_bed_temperature = 70
top_thickness = 1.2
top_bottom_thickness = 1.2
speed_wall_x = 30
infill_overlap = 17
infill_before_walls = False
raft_surface_line_width = 0.4
skirt_minimal_length = 150.0
speed_topbottom = 20
skirt_gap = 3.0
raft_base_line_width = 1.0
machine_nozzle_size = 0.53

View File

@ -0,0 +1,49 @@
[general]
version = 1
name = Fast Prints
machine_type = ultimaker2plus
machine_variant = 0.8 mm
material = CPE
[settings]
cool_fan_speed_min = 50
retraction_hop = 0.0
support_enable = False
raft_airgap = 0.0
raft_surface_thickness = 0.27
raft_interface_line_spacing = 3.0
skin_no_small_gaps_heuristic = False
bottom_thickness = 1.2
support_pattern = lines
retraction_combing = All
adhesion_type = brim
cool_min_layer_time = 3
layer_height = 0.2
speed_infill = 40
speed_layer_0 = 20
brim_line_count = 10
cool_lift_head = True
retraction_speed = 40.0
cool_fan_speed_max = 100
magic_mesh_surface_mode = False
speed_print = 20
shell_thickness = 2.1
speed_wall_0 = 20
material_flow = 100.0
raft_surface_line_spacing = 3.0
raft_margin = 5.0
raft_interface_line_width = 0.4
layer_height_0 = 0.5
material_bed_temperature = 70
top_thickness = 1.2
top_bottom_thickness = 1.2
speed_wall_x = 30
infill_overlap = 17
infill_before_walls = False
raft_surface_line_width = 0.4
skirt_minimal_length = 150.0
speed_topbottom = 20
skirt_gap = 3.0
raft_base_line_width = 1.0
machine_nozzle_size = 0.7

View File

@ -0,0 +1,48 @@
[general]
version = 1
name = High Quality
machine_type = ultimaker2plus
machine_variant = 0.25 mm
material = PLA
[settings]
retraction_combing = All
top_thickness = 0.72
speed_layer_0 = 20
speed_print = 20
speed_wall_0 = 20
raft_interface_line_spacing = 3.0
shell_thickness = 0.88
infill_overlap = 15
retraction_hop = 0.0
material_bed_temperature = 70
skin_no_small_gaps_heuristic = False
retraction_speed = 40.0
raft_surface_line_width = 0.4
raft_base_line_width = 1.0
raft_margin = 5.0
adhesion_type = brim
skirt_minimal_length = 150.0
layer_height = 0.06
brim_line_count = 36
infill_before_walls = False
raft_surface_thickness = 0.27
raft_airgap = 0.0
skirt_gap = 3.0
raft_interface_line_width = 0.4
speed_topbottom = 20
support_pattern = lines
layer_height_0 = 0.15
infill_sparse_density = 22
material_flow = 100.0
cool_fan_speed_min = 100
top_bottom_thickness = 0.72
cool_fan_speed_max = 100
speed_infill = 30
magic_mesh_surface_mode = False
bottom_thickness = 0.72
speed_wall_x = 25
machine_nozzle_size = 0.22
raft_surface_line_spacing = 3.0
support_enable = False

View File

@ -0,0 +1,47 @@
[general]
version = 1
name = Fast Prints
machine_type = ultimaker2plus
machine_variant = 0.4 mm
material = PLA
[settings]
retraction_combing = All
top_thickness = 0.75
speed_print = 40
speed_wall_0 = 40
raft_surface_line_spacing = 3.0
shell_thickness = 0.7
infill_sparse_density = 18
retraction_hop = 0.0
material_bed_temperature = 70
skin_no_small_gaps_heuristic = False
retraction_speed = 40.0
raft_surface_line_width = 0.4
raft_base_line_width = 1.0
raft_margin = 5.0
adhesion_type = brim
skirt_minimal_length = 150.0
layer_height = 0.15
brim_line_count = 22
infill_before_walls = False
raft_surface_thickness = 0.27
raft_airgap = 0.0
infill_overlap = 15
raft_interface_line_width = 0.4
speed_topbottom = 30
support_pattern = lines
layer_height_0 = 0.26
raft_interface_line_spacing = 3.0
material_flow = 100.0
cool_fan_speed_min = 100
cool_fan_speed_max = 100
speed_travel = 150
skirt_gap = 3.0
magic_mesh_surface_mode = False
bottom_thickness = 0.75
speed_wall_x = 50
machine_nozzle_size = 0.35
top_bottom_thickness = 0.75
support_enable = False

View File

@ -0,0 +1,48 @@
[general]
version = 1
name = High Quality
machine_type = ultimaker2plus
machine_variant = 0.4 mm
material = PLA
[settings]
retraction_combing = All
top_thickness = 0.72
speed_layer_0 = 20
speed_print = 30
speed_wall_0 = 30
raft_interface_line_spacing = 3.0
shell_thickness = 1.05
infill_overlap = 15
retraction_hop = 0.0
material_bed_temperature = 70
skin_no_small_gaps_heuristic = False
retraction_speed = 40.0
raft_surface_line_width = 0.4
raft_base_line_width = 1.0
raft_margin = 5.0
adhesion_type = brim
skirt_minimal_length = 150.0
layer_height = 0.06
brim_line_count = 22
infill_before_walls = False
raft_surface_thickness = 0.27
raft_airgap = 0.0
skirt_gap = 3.0
raft_interface_line_width = 0.4
speed_topbottom = 20
support_pattern = lines
layer_height_0 = 0.26
infill_sparse_density = 22
material_flow = 100.0
cool_fan_speed_min = 100
top_bottom_thickness = 0.72
cool_fan_speed_max = 100
speed_infill = 50
magic_mesh_surface_mode = False
bottom_thickness = 0.72
speed_wall_x = 40
machine_nozzle_size = 0.35
raft_surface_line_spacing = 3.0
support_enable = False

View File

@ -0,0 +1,43 @@
[general]
version = 1
name = Normal Quality
machine_type = ultimaker2plus
machine_variant = 0.4 mm
material = PLA
[settings]
retraction_combing = All
shell_thickness = 1.05
speed_print = 30
speed_wall_0 = 30
raft_interface_line_spacing = 3.0
speed_layer_0 = 20
layer_height_0 = 0.26
retraction_hop = 0.0
material_bed_temperature = 70
skirt_gap = 3.0
retraction_speed = 40.0
raft_surface_line_width = 0.4
raft_base_line_width = 1.0
raft_margin = 5.0
adhesion_type = brim
skirt_minimal_length = 150.0
brim_line_count = 22
infill_before_walls = False
raft_surface_thickness = 0.27
raft_airgap = 0.0
infill_overlap = 15
raft_interface_line_width = 0.4
speed_topbottom = 20
support_pattern = lines
speed_infill = 50
material_flow = 100.0
cool_fan_speed_min = 100
cool_fan_speed_max = 100
skin_no_small_gaps_heuristic = False
magic_mesh_surface_mode = False
speed_wall_x = 40
machine_nozzle_size = 0.35
raft_surface_line_spacing = 3.0
support_enable = False

View File

@ -0,0 +1,47 @@
[general]
version = 1
name = Normal Quality
machine_type = ultimaker2plus
machine_variant = 0.6 mm
material = PLA
[settings]
retraction_combing = All
top_thickness = 1.2
speed_layer_0 = 20
speed_print = 25
speed_wall_0 = 25
raft_interface_line_spacing = 3.0
shell_thickness = 1.59
infill_overlap = 15
retraction_hop = 0.0
material_bed_temperature = 70
skin_no_small_gaps_heuristic = False
retraction_speed = 40.0
raft_surface_line_width = 0.4
raft_base_line_width = 1.0
raft_margin = 5.0
adhesion_type = brim
skirt_minimal_length = 150.0
layer_height = 0.15
brim_line_count = 15
infill_before_walls = False
raft_surface_thickness = 0.27
raft_airgap = 0.0
skirt_gap = 3.0
raft_interface_line_width = 0.4
speed_topbottom = 20
support_pattern = lines
layer_height_0 = 0.39
material_flow = 100.0
cool_fan_speed_min = 100
top_bottom_thickness = 1.2
cool_fan_speed_max = 100
speed_infill = 55
magic_mesh_surface_mode = False
bottom_thickness = 1.2
speed_wall_x = 40
machine_nozzle_size = 0.53
raft_surface_line_spacing = 3.0
support_enable = False

View File

@ -0,0 +1,47 @@
[general]
version = 1
name = Fast Prints
machine_type = ultimaker2plus
machine_variant = 0.8 mm
material = PLA
[settings]
retraction_combing = All
top_thickness = 1.2
speed_layer_0 = 20
speed_print = 20
speed_wall_0 = 25
raft_interface_line_spacing = 3.0
shell_thickness = 2.1
infill_overlap = 15
retraction_hop = 0.0
material_bed_temperature = 70
skin_no_small_gaps_heuristic = False
retraction_speed = 40.0
raft_surface_line_width = 0.4
raft_base_line_width = 1.0
raft_margin = 5.0
adhesion_type = brim
skirt_minimal_length = 150.0
layer_height = 0.2
brim_line_count = 11
infill_before_walls = False
raft_surface_thickness = 0.27
raft_airgap = 0.0
skirt_gap = 3.0
raft_interface_line_width = 0.4
speed_topbottom = 20
support_pattern = lines
layer_height_0 = 0.5
material_flow = 100.0
cool_fan_speed_min = 100
top_bottom_thickness = 1.2
cool_fan_speed_max = 100
speed_infill = 40
magic_mesh_surface_mode = False
bottom_thickness = 1.2
speed_wall_x = 30
machine_nozzle_size = 0.7
raft_surface_line_spacing = 3.0
support_enable = False

View File

@ -31,6 +31,7 @@ Item
property alias addMachine: addMachineAction; property alias addMachine: addMachineAction;
property alias configureMachines: settingsAction; property alias configureMachines: settingsAction;
property alias addProfile: addProfileAction;
property alias manageProfiles: manageProfilesAction; property alias manageProfiles: manageProfilesAction;
property alias preferences: preferencesAction; property alias preferences: preferencesAction;
@ -95,6 +96,12 @@ Item
iconName: "configure"; iconName: "configure";
} }
Action
{
id: addProfileAction;
text: catalog.i18nc("@action:inmenu menubar:profile","&Add Profile...");
}
Action Action
{ {
id: manageProfilesAction; id: manageProfilesAction;

View File

@ -92,7 +92,7 @@ UM.MainWindow
text: catalog.i18nc("@action:inmenu menubar:file", "&Save Selection to File"); text: catalog.i18nc("@action:inmenu menubar:file", "&Save Selection to File");
enabled: UM.Selection.hasSelection; enabled: UM.Selection.hasSelection;
iconName: "document-save-as"; iconName: "document-save-as";
onTriggered: UM.OutputDeviceManager.requestWriteSelectionToDevice("local_file", Printer.jobName); onTriggered: UM.OutputDeviceManager.requestWriteSelectionToDevice("local_file", Printer.jobName, false);
} }
Menu Menu
{ {
@ -108,7 +108,7 @@ UM.MainWindow
MenuItem MenuItem
{ {
text: model.description; text: model.description;
onTriggered: UM.OutputDeviceManager.requestWriteToDevice(model.id, Printer.jobName); onTriggered: UM.OutputDeviceManager.requestWriteToDevice(model.id, Printer.jobName, false);
} }
onObjectAdded: saveAllMenu.insertItem(index, object) onObjectAdded: saveAllMenu.insertItem(index, object)
onObjectRemoved: saveAllMenu.removeItem(object) onObjectRemoved: saveAllMenu.removeItem(object)
@ -230,6 +230,7 @@ UM.MainWindow
MenuSeparator { } MenuSeparator { }
MenuItem { action: actions.addProfile; }
MenuItem { action: actions.manageProfiles; } MenuItem { action: actions.manageProfiles; }
} }
@ -461,6 +462,7 @@ UM.MainWindow
addMachineAction: actions.addMachine; addMachineAction: actions.addMachine;
configureMachinesAction: actions.configureMachines; configureMachinesAction: actions.configureMachines;
addProfileAction: actions.addProfile;
manageProfilesAction: actions.manageProfiles; manageProfilesAction: actions.manageProfiles;
} }
@ -473,7 +475,7 @@ UM.MainWindow
height: childrenRect.height; height: childrenRect.height;
Label Label
{ {
text: UM.ActiveTool.properties.Rotation != undefined ? "%1°".arg(UM.ActiveTool.properties.Rotation) : ""; text: UM.ActiveTool.properties.getValue("Rotation") != undefined ? "%1°".arg(UM.ActiveTool.properties.getValue("Rotation")) : "";
} }
visible: UM.ActiveTool.valid && UM.ActiveTool.properties.Rotation != undefined; visible: UM.ActiveTool.valid && UM.ActiveTool.properties.Rotation != undefined;
@ -578,6 +580,7 @@ UM.MainWindow
reloadAll.onTriggered: Printer.reloadAll() reloadAll.onTriggered: Printer.reloadAll()
addMachine.onTriggered: addMachineWizard.visible = true; addMachine.onTriggered: addMachineWizard.visible = true;
addProfile.onTriggered: { UM.MachineManager.createProfile(); preferences.visible = true; preferences.setPage(4); }
preferences.onTriggered: { preferences.visible = true; preferences.setPage(0); } preferences.onTriggered: { preferences.visible = true; preferences.setPage(0); }
configureMachines.onTriggered: { preferences.visible = true; preferences.setPage(3); } configureMachines.onTriggered: { preferences.visible = true; preferences.setPage(3); }
@ -670,7 +673,6 @@ UM.MainWindow
id: addMachineWizard id: addMachineWizard
} }
AboutDialog AboutDialog
{ {
id: aboutDialog id: aboutDialog

View File

@ -59,16 +59,13 @@ UM.PreferencesPage
id: languageList id: languageList
Component.onCompleted: { Component.onCompleted: {
// append({ text: catalog.i18nc("@item:inlistbox", "Bulgarian"), code: "bg" })
// append({ text: catalog.i18nc("@item:inlistbox", "Czech"), code: "cs" })
append({ text: catalog.i18nc("@item:inlistbox", "English"), code: "en" }) append({ text: catalog.i18nc("@item:inlistbox", "English"), code: "en" })
append({ text: catalog.i18nc("@item:inlistbox", "Finnish"), code: "fi" }) append({ text: catalog.i18nc("@item:inlistbox", "Finnish"), code: "fi" })
append({ text: catalog.i18nc("@item:inlistbox", "French"), code: "fr" }) append({ text: catalog.i18nc("@item:inlistbox", "French"), code: "fr" })
append({ text: catalog.i18nc("@item:inlistbox", "German"), code: "de" }) append({ text: catalog.i18nc("@item:inlistbox", "German"), code: "de" })
// append({ text: catalog.i18nc("@item:inlistbox", "Italian"), code: "it" }) append({ text: catalog.i18nc("@item:inlistbox", "Italian"), code: "it" })
append({ text: catalog.i18nc("@item:inlistbox", "Polish"), code: "pl" }) append({ text: catalog.i18nc("@item:inlistbox", "Dutch"), code: "nl" })
// append({ text: catalog.i18nc("@item:inlistbox", "Russian"), code: "ru" }) append({ text: catalog.i18nc("@item:inlistbox", "Spanish"), code: "es" })
// append({ text: catalog.i18nc("@item:inlistbox", "Spanish"), code: "es" })
} }
} }

View File

@ -1,64 +0,0 @@
// Copyright (c) 2015 Ultimaker B.V.
// Cura is released under the terms of the AGPLv3 or higher.
import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Window 2.1
import UM 1.1 as UM
UM.Dialog
{
id: base
//: About dialog title
title: catalog.i18nc("@title:window","Load profile")
width: 400
height: childrenRect.height
Label
{
id: body
//: About dialog application description
text: catalog.i18nc("@label","Selecting this profile overwrites some of your customised settings. Do you want to merge the new settings into your current profile or do you want to load a clean copy of the profile?")
wrapMode: Text.WordWrap
width: parent.width
anchors.top: parent.top
anchors.margins: UM.Theme.sizes.default_margin.height
UM.I18nCatalog { id: catalog; name: "cura"; }
}
Label
{
id: show_details
//: About dialog application author note
text: catalog.i18nc("@label","Show details.")
wrapMode: Text.WordWrap
anchors.top: body.bottom
anchors.topMargin: UM.Theme.sizes.default_margin.height
}
rightButtons: Row
{
spacing: UM.Theme.sizes.default_margin.width
Button
{
text: catalog.i18nc("@action:button","Merge settings");
}
Button
{
text: catalog.i18nc("@action:button","Reset profile");
}
Button
{
text: catalog.i18nc("@action:button","Cancel");
onClicked: base.visible = false;
}
}
}

Some files were not shown because too many files have changed in this diff Show More