Merge branch 'settings_rework'

Contributes to CURA-1278

* settings_rework: (224 commits)
  Improve slice trigger documentation
  Import Cura in materials preferences page so we can use the active definition id
  Add layer height to high quality profile so we have something that changes
  Update example XML material to use the right product names
  Filter available materials by the machine definition
  Show the add machine dialog when we do not have an active machine
  Create machine-specific material containers for machine specific overrides in XML material files
  When creating a new container stack, add empty containers for things where we cannot find containers
  Add preferred variant, material and quality to UM2+ definition
  Account for global container stack being None in the backend plugin
  Use the global stack instance variable and account for it potentially being None
  Store the global container stack as an instance property
  Added wildcard to filtering
  Per object settings filter now uses correct bool types (instead of strings)
  Removed stray = sign.
  Fix creating print job name
  Disable asynchronous loading of SettingItem when Qt Version < 5.5
  Document QTbug
  Properly serialise all settings to g-code file
  Document GCodeWriter class
  ...
This commit is contained in:
Arjen Hiemstra 2016-05-25 14:42:45 +02:00
commit 386aec32a8
125 changed files with 7651 additions and 2131 deletions

View file

@ -37,13 +37,9 @@ class BuildVolume(SceneNode):
self.setCalculateBoundingBox(False) self.setCalculateBoundingBox(False)
self._active_profile = None self._active_container_stack = None
self._active_instance = None Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerStackChanged)
Application.getInstance().getMachineManager().activeMachineInstanceChanged.connect(self._onActiveInstanceChanged) self._onGlobalContainerStackChanged()
self._onActiveInstanceChanged()
Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onActiveProfileChanged)
self._onActiveProfileChanged()
def setWidth(self, width): def setWidth(self, width):
if width: self._width = width if width: self._width = width
@ -76,7 +72,7 @@ class BuildVolume(SceneNode):
## Recalculates the build volume & disallowed areas. ## Recalculates the build volume & disallowed areas.
def rebuild(self): def rebuild(self):
if self._width == 0 or self._height == 0 or self._depth == 0: if not self._width or not self._height or not self._depth:
return return
min_w = -self._width / 2 min_w = -self._width / 2
@ -148,9 +144,9 @@ class BuildVolume(SceneNode):
skirt_size = 0.0 skirt_size = 0.0
profile = Application.getInstance().getMachineManager().getWorkingProfile() container_stack = Application.getInstance().getGlobalContainerStack()
if profile: if container_stack:
skirt_size = self._getSkirtSize(profile) skirt_size = self._getSkirtSize(container_stack)
# As this works better for UM machines, we only add the disallowed_area_size for the z direction. # As this works better for UM machines, we only add the disallowed_area_size for the z direction.
# This is probably wrong in all other cases. TODO! # This is probably wrong in all other cases. TODO!
@ -162,52 +158,49 @@ class BuildVolume(SceneNode):
Application.getInstance().getController().getScene()._maximum_bounds = scale_to_max_bounds Application.getInstance().getController().getScene()._maximum_bounds = scale_to_max_bounds
def _onActiveInstanceChanged(self): def _onGlobalContainerStackChanged(self):
self._active_instance = Application.getInstance().getMachineManager().getActiveMachineInstance() if self._active_container_stack:
self._active_container_stack.propertyChanged.disconnect(self._onSettingPropertyChanged)
if self._active_instance: self._active_container_stack = Application.getInstance().getGlobalContainerStack()
self._width = self._active_instance.getMachineSettingValue("machine_width")
if Application.getInstance().getMachineManager().getWorkingProfile().getSettingValue("print_sequence") == "one_at_a_time": if self._active_container_stack:
self._height = Application.getInstance().getMachineManager().getWorkingProfile().getSettingValue("gantry_height") self._active_container_stack.propertyChanged.connect(self._onSettingPropertyChanged)
self._width = self._active_container_stack.getProperty("machine_width", "value")
if self._active_container_stack.getProperty("print_sequence", "value") == "one_at_a_time":
self._height = self._active_container_stack.getProperty("gantry_height", "value")
else: else:
self._height = self._active_instance.getMachineSettingValue("machine_height") self._height = self._active_container_stack.getProperty("machine_height", "value")
self._depth = self._active_instance.getMachineSettingValue("machine_depth") self._depth = self._active_container_stack.getProperty("machine_depth", "value")
self._updateDisallowedAreas() self._updateDisallowedAreas()
self.rebuild() self.rebuild()
def _onActiveProfileChanged(self): def _onSettingPropertyChanged(self, setting_key, property_name):
if self._active_profile: if property_name != "value":
self._active_profile.settingValueChanged.disconnect(self._onSettingValueChanged) return
self._active_profile = Application.getInstance().getMachineManager().getWorkingProfile()
if self._active_profile:
self._active_profile.settingValueChanged.connect(self._onSettingValueChanged)
self._updateDisallowedAreas()
self.rebuild()
def _onSettingValueChanged(self, setting_key):
if setting_key == "print_sequence": if setting_key == "print_sequence":
if Application.getInstance().getMachineManager().getWorkingProfile().getSettingValue("print_sequence") == "one_at_a_time": if Application.getInstance().getGlobalContainerStack().getProperty("print_sequence", "value") == "one_at_a_time":
self._height = Application.getInstance().getMachineManager().getWorkingProfile().getSettingValue("gantry_height") self._height = self._active_container_stack.getProperty("gantry_height", "value")
else: else:
self._height = self._active_instance.getMachineSettingValue("machine_depth") self._height = self._active_container_stack.getProperty("machine_height", "value")
self.rebuild() self.rebuild()
if setting_key in self._skirt_settings: if setting_key in self._skirt_settings:
self._updateDisallowedAreas() self._updateDisallowedAreas()
self.rebuild() self.rebuild()
def _updateDisallowedAreas(self): def _updateDisallowedAreas(self):
if not self._active_instance or not self._active_profile: if not self._active_container_stack:
return return
disallowed_areas = self._active_instance.getMachineSettingValue("machine_disallowed_areas") disallowed_areas = self._active_container_stack.getProperty("machine_disallowed_areas", "value")
areas = [] areas = []
skirt_size = 0.0 skirt_size = 0.0
if self._active_profile: skirt_size = self._getSkirtSize(self._active_container_stack)
skirt_size = self._getSkirtSize(self._active_profile)
if disallowed_areas: if disallowed_areas:
# Extend every area already in the disallowed_areas with the skirt size. # Extend every area already in the disallowed_areas with the skirt size.
@ -228,8 +221,8 @@ class BuildVolume(SceneNode):
# Add the skirt areas around the borders of the build plate. # Add the skirt areas around the borders of the build plate.
if skirt_size > 0: if skirt_size > 0:
half_machine_width = self._active_instance.getMachineSettingValue("machine_width") / 2 half_machine_width = self._active_container_stack.getProperty("machine_width", "value") / 2
half_machine_depth = self._active_instance.getMachineSettingValue("machine_depth") / 2 half_machine_depth = self._active_container_stack.getProperty("machine_depth", "value") / 2
areas.append(Polygon(numpy.array([ areas.append(Polygon(numpy.array([
[-half_machine_width, -half_machine_depth], [-half_machine_width, -half_machine_depth],
@ -262,24 +255,24 @@ class BuildVolume(SceneNode):
self._disallowed_areas = areas self._disallowed_areas = areas
## Convenience function to calculate the size of the bed adhesion. ## Convenience function to calculate the size of the bed adhesion.
def _getSkirtSize(self, profile): def _getSkirtSize(self, container_stack):
skirt_size = 0.0 skirt_size = 0.0
adhesion_type = profile.getSettingValue("adhesion_type") adhesion_type = container_stack.getProperty("adhesion_type", "value")
if adhesion_type == "skirt": if adhesion_type == "skirt":
skirt_distance = profile.getSettingValue("skirt_gap") skirt_distance = container_stack.getProperty("skirt_gap", "value")
skirt_line_count = profile.getSettingValue("skirt_line_count") skirt_line_count = container_stack.getProperty("skirt_line_count", "value")
skirt_size = skirt_distance + (skirt_line_count * profile.getSettingValue("skirt_line_width")) skirt_size = skirt_distance + (skirt_line_count * container_stack.getProperty("skirt_line_width", "value"))
elif adhesion_type == "brim": elif adhesion_type == "brim":
skirt_size = profile.getSettingValue("brim_line_count") * profile.getSettingValue("skirt_line_width") skirt_size = container_stack.getProperty("brim_line_count", "value") * container_stack.getProperty("skirt_line_width", "value")
elif adhesion_type == "raft": elif adhesion_type == "raft":
skirt_size = profile.getSettingValue("raft_margin") skirt_size = container_stack.getProperty("raft_margin", "value")
if profile.getSettingValue("draft_shield_enabled"): if container_stack.getProperty("draft_shield_enabled", "value"):
skirt_size += profile.getSettingValue("draft_shield_dist") skirt_size += container_stack.getProperty("draft_shield_dist", "value")
if profile.getSettingValue("xy_offset"): if container_stack.getProperty("xy_offset", "value"):
skirt_size += profile.getSettingValue("xy_offset") skirt_size += container_stack.getProperty("xy_offset", "value")
return skirt_size return skirt_size

View file

@ -28,9 +28,9 @@ class ConvexHullDecorator(SceneNodeDecorator):
self._parent_node = None self._parent_node = None
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) #Application.getInstance().getMachineManager().activeMachineInstanceChanged.connect(self._onActiveMachineInstanceChanged)
self._onActiveProfileChanged() #self._onActiveProfileChanged()
def setNode(self, node): def setNode(self, node):
super().setNode(node) super().setNode(node)

View file

@ -68,12 +68,12 @@ class ConvexHullJob(Job):
# This is done because of rounding errors. # This is done because of rounding errors.
hull = hull.getMinkowskiHull(Polygon(numpy.array([[-0.5, -0.5], [-0.5, 0.5], [0.5, 0.5], [0.5, -0.5]], numpy.float32))) hull = hull.getMinkowskiHull(Polygon(numpy.array([[-0.5, -0.5], [-0.5, 0.5], [0.5, 0.5], [0.5, -0.5]], numpy.float32)))
profile = Application.getInstance().getMachineManager().getWorkingProfile() global_stack = Application.getInstance().getGlobalContainerStack()
if profile: if global_stack:
if profile.getSettingValue("print_sequence") == "one_at_a_time" and not self._node.getParent().callDecoration("isGroup"): if global_stack.getProperty("print_sequence", "value")== "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
self._node.callDecoration("setConvexHullBoundary", copy.deepcopy(hull)) self._node.callDecoration("setConvexHullBoundary", copy.deepcopy(hull))
head_and_fans = Polygon(numpy.array(profile.getSettingValue("machine_head_with_fans_polygon"), numpy.float32)) head_and_fans = Polygon(numpy.array(global_stack.getProperty("machine_head_with_fans_polygon", "value"), numpy.float32))
# Full head hull is used to actually check the order. # Full head hull is used to actually check the order.
full_head_hull = hull.getMinkowskiHull(head_and_fans) full_head_hull = hull.getMinkowskiHull(head_and_fans)
@ -86,7 +86,7 @@ class ConvexHullJob(Job):
# Min head hull is used for the push free # Min head hull is used for the push free
min_head_hull = hull.getMinkowskiHull(head_and_fans) min_head_hull = hull.getMinkowskiHull(head_and_fans)
self._node.callDecoration("setConvexHullHead", min_head_hull) self._node.callDecoration("setConvexHullHead", min_head_hull)
hull = hull.getMinkowskiHull(Polygon(numpy.array(profile.getSettingValue("machine_head_polygon"),numpy.float32))) hull = hull.getMinkowskiHull(Polygon(numpy.array(global_stack.getProperty("machine_head_polygon","value"),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. if self._node.getParent() is None: # Node was already deleted before job is done.

View file

@ -15,7 +15,7 @@ from UM.Mesh.ReadMeshJob import ReadMeshJob
from UM.Logger import Logger from UM.Logger import Logger
from UM.Preferences import Preferences from UM.Preferences import Preferences
from UM.JobQueue import JobQueue from UM.JobQueue import JobQueue
from UM.SaveFile import SaveFile
from UM.Scene.Selection import Selection from UM.Scene.Selection import Selection
from UM.Scene.GroupDecorator import GroupDecorator from UM.Scene.GroupDecorator import GroupDecorator
@ -25,6 +25,9 @@ from UM.Operations.GroupedOperation import GroupedOperation
from UM.Operations.SetTransformOperation import SetTransformOperation from UM.Operations.SetTransformOperation import SetTransformOperation
from cura.SetParentOperation import SetParentOperation from cura.SetParentOperation import SetParentOperation
from UM.Settings.SettingDefinition import SettingDefinition, DefinitionPropertyType
from UM.Settings.ContainerRegistry import ContainerRegistry
from UM.i18n import i18nCatalog from UM.i18n import i18nCatalog
from . import PlatformPhysics from . import PlatformPhysics
@ -35,16 +38,18 @@ from . import CuraActions
from . import MultiMaterialDecorator from . import MultiMaterialDecorator
from . import ZOffsetDecorator from . import ZOffsetDecorator
from . import CuraSplashScreen from . import CuraSplashScreen
from . import MachineManagerModel
from PyQt5.QtCore import pyqtSlot, QUrl, pyqtSignal, pyqtProperty, QEvent, Q_ENUMS from PyQt5.QtCore import pyqtSlot, QUrl, pyqtSignal, pyqtProperty, QEvent, Q_ENUMS
from PyQt5.QtGui import QColor, QIcon from PyQt5.QtGui import QColor, QIcon
from PyQt5.QtQml import qmlRegisterUncreatableType from PyQt5.QtQml import qmlRegisterUncreatableType, qmlRegisterSingletonType
import platform import platform
import sys import sys
import os.path import os.path
import numpy import numpy
import copy import copy
import urllib
numpy.seterr(all="ignore") numpy.seterr(all="ignore")
#WORKAROUND: GITHUB-88 GITHUB-385 GITHUB-612 #WORKAROUND: GITHUB-88 GITHUB-385 GITHUB-612
@ -65,6 +70,13 @@ class CuraApplication(QtApplication):
class ResourceTypes: class ResourceTypes:
QmlFiles = Resources.UserType + 1 QmlFiles = Resources.UserType + 1
Firmware = Resources.UserType + 2 Firmware = Resources.UserType + 2
QualityInstanceContainer = Resources.UserType + 3
MaterialInstanceContainer = Resources.UserType + 4
VariantInstanceContainer = Resources.UserType + 5
UserInstanceContainer = Resources.UserType + 6
MachineStack = Resources.UserType + 7
ExtruderInstanceContainer = Resources.UserType + 8
Q_ENUMS(ResourceTypes) Q_ENUMS(ResourceTypes)
def __init__(self): def __init__(self):
@ -74,6 +86,9 @@ class CuraApplication(QtApplication):
self._open_file_queue = [] # Files to open when plug-ins are loaded. self._open_file_queue = [] # Files to open when plug-ins are loaded.
# Need to do this before ContainerRegistry tries to load the machines
SettingDefinition.addSupportedProperty("global_only", DefinitionPropertyType.Function, default = False)
super().__init__(name = "cura", version = CuraVersion) super().__init__(name = "cura", version = CuraVersion)
self.setWindowIcon(QIcon(Resources.getPath(Resources.Images, "cura-icon.png"))) self.setWindowIcon(QIcon(Resources.getPath(Resources.Images, "cura-icon.png")))
@ -102,15 +117,28 @@ class CuraApplication(QtApplication):
self._camera_animation = None self._camera_animation = None
self._cura_actions = None self._cura_actions = None
self.getMachineManager().activeMachineInstanceChanged.connect(self._onActiveMachineChanged)
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) 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")
Preferences.getInstance().addPreference("cura/active_machine", "") ## Add the 4 types of profiles to storage.
Resources.addStorageType(self.ResourceTypes.QualityInstanceContainer, "quality")
Resources.addStorageType(self.ResourceTypes.VariantInstanceContainer, "variants")
Resources.addStorageType(self.ResourceTypes.MaterialInstanceContainer, "materials")
Resources.addStorageType(self.ResourceTypes.ExtruderInstanceContainer, "extruders")
Resources.addStorageType(self.ResourceTypes.UserInstanceContainer, "user")
Resources.addStorageType(self.ResourceTypes.MachineStack, "machine_instances")
ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.QualityInstanceContainer)
ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.VariantInstanceContainer)
ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.MaterialInstanceContainer)
ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.UserInstanceContainer)
ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.MachineStack)
ContainerRegistry.getInstance().load()
Preferences.getInstance().addPreference("cura/active_mode", "simple") Preferences.getInstance().addPreference("cura/active_mode", "simple")
Preferences.getInstance().addPreference("cura/recent_files", "") Preferences.getInstance().addPreference("cura/recent_files", "")
Preferences.getInstance().addPreference("cura/categories_expanded", "") Preferences.getInstance().addPreference("cura/categories_expanded", "")
@ -120,8 +148,43 @@ class CuraApplication(QtApplication):
Preferences.getInstance().addPreference("mesh/scale_tiny_meshes", True) Preferences.getInstance().addPreference("mesh/scale_tiny_meshes", True)
Preferences.getInstance().setDefault("local_file/last_used_type", "text/x-gcode") Preferences.getInstance().setDefault("local_file/last_used_type", "text/x-gcode")
Preferences.getInstance().setDefault("general/visible_settings", """
resolution
layer_height
shell
wall_thickness
top_bottom_thickness
infill
infill_sparse_density
material
material_print_temperature
material_bed_temperature
material_diameter
material_flow
retraction_enable
speed
speed_print
speed_travel
cooling
cool_fan_enabled
support
support_enable
support_type
support_roof_density
platform_adhesion
adhesion_type
brim_width
raft_airgap
layer_0_z_overlap
raft_surface_layers
blackmagic
print_sequence
""")
JobQueue.getInstance().jobFinished.connect(self._onJobFinished) JobQueue.getInstance().jobFinished.connect(self._onJobFinished)
self.applicationShuttingDown.connect(self._onExit)
self._recent_files = [] self._recent_files = []
files = Preferences.getInstance().getValue("cura/recent_files").split(";") files = Preferences.getInstance().getValue("cura/recent_files").split(";")
for f in files: for f in files:
@ -130,6 +193,54 @@ class CuraApplication(QtApplication):
self._recent_files.append(QUrl.fromLocalFile(f)) self._recent_files.append(QUrl.fromLocalFile(f))
## Cura has multiple locations where instance containers need to be saved, so we need to handle this differently.
def _onExit(self):
for instance in ContainerRegistry.getInstance().findInstanceContainers():
if not instance.isDirty():
continue
try:
data = instance.serialize()
except NotImplementedError:
continue
except Exception:
Logger.logException("e", "An exception occurred when serializing container %s", instance.getId())
continue
file_name = urllib.parse.quote_plus(instance.getId()) + ".inst.cfg"
instance_type = instance.getMetaDataEntry("type")
path = None
if instance_type == "material":
path = Resources.getStoragePath(self.ResourceTypes.MaterialInstanceContainer, file_name)
elif instance_type == "quality":
path = Resources.getStoragePath(self.ResourceTypes.QualityInstanceContainer, file_name)
elif instance_type == "user":
path = Resources.getStoragePath(self.ResourceTypes.UserInstanceContainer, file_name)
elif instance_type == "variant":
path = Resources.getStoragePath(self.ResourceTypes.VariantInstanceContainer, file_name)
if path:
with SaveFile(path, "wt", -1, "utf-8") as f:
f.write(data)
for stack in ContainerRegistry.getInstance().findContainerStacks():
if not stack.isDirty():
continue
try:
data = stack.serialize()
except NotImplementedError:
continue
except Exception:
Logger.logException("e", "An exception occurred when serializing container %s", instance.getId())
continue
file_name = urllib.parse.quote_plus(stack.getId()) + ".stack.cfg"
path = Resources.getStoragePath(self.ResourceTypes.MachineStack, file_name)
with SaveFile(path, "wt", -1, "utf-8") as f:
f.write(data)
@pyqtSlot(result = QUrl) @pyqtSlot(result = QUrl)
def getDefaultPath(self): def getDefaultPath(self):
return QUrl.fromLocalFile(os.path.expanduser("~/")) return QUrl.fromLocalFile(os.path.expanduser("~/"))
@ -137,6 +248,7 @@ class CuraApplication(QtApplication):
## Handle loading of all plugin types (and the backend explicitly) ## Handle loading of all plugin types (and the backend explicitly)
# \sa PluginRegistery # \sa PluginRegistery
def _loadPlugins(self): def _loadPlugins(self):
self._plugin_registry.addType("profile_reader", self._addProfileReader)
self._plugin_registry.addPluginLocation(os.path.join(QtApplication.getInstallPrefix(), "lib", "cura")) self._plugin_registry.addPluginLocation(os.path.join(QtApplication.getInstallPrefix(), "lib", "cura"))
if not hasattr(sys, "frozen"): if not hasattr(sys, "frozen"):
self._plugin_registry.addPluginLocation(os.path.join(os.path.abspath(os.path.dirname(__file__)), "..", "plugins")) self._plugin_registry.addPluginLocation(os.path.join(os.path.abspath(os.path.dirname(__file__)), "..", "plugins"))
@ -199,6 +311,9 @@ class CuraApplication(QtApplication):
self.showSplashMessage(self._i18n_catalog.i18nc("@info:progress", "Loading interface...")) self.showSplashMessage(self._i18n_catalog.i18nc("@info:progress", "Loading interface..."))
qmlRegisterSingletonType(MachineManagerModel.MachineManagerModel, "Cura", 1, 0, "MachineManager",
MachineManagerModel.createMachineManagerModel)
self.setMainQml(Resources.getPath(self.ResourceTypes.QmlFiles, "Cura.qml")) self.setMainQml(Resources.getPath(self.ResourceTypes.QmlFiles, "Cura.qml"))
self.initializeEngine() self.initializeEngine()
@ -511,20 +626,6 @@ class CuraApplication(QtApplication):
def expandedCategories(self): def expandedCategories(self):
return Preferences.getInstance().getValue("cura/categories_expanded").split(";") return Preferences.getInstance().getValue("cura/categories_expanded").split(";")
@pyqtSlot(str, result = "QVariant")
def getSettingValue(self, key):
if not self.getMachineManager().getWorkingProfile():
return None
return self.getMachineManager().getWorkingProfile().getSettingValue(key)
## Change setting by key value pair
@pyqtSlot(str, "QVariant")
def setSettingValue(self, key, value):
if not self.getMachineManager().getWorkingProfile():
return
self.getMachineManager().getWorkingProfile().setSettingValue(key, value)
@pyqtSlot() @pyqtSlot()
def mergeSelected(self): def mergeSelected(self):
self.groupSelected() self.groupSelected()
@ -630,5 +731,6 @@ class CuraApplication(QtApplication):
job.finished.connect(self._onFileLoaded) job.finished.connect(self._onFileLoaded)
job.start() job.start()
def _onAddMachineRequested(self): def _addProfileReader(self, profile_reader):
self.requestAddPrinter.emit() # TODO: Add the profile reader to the list of plug-ins that can be used when importing profiles.
pass

263
cura/MachineManagerModel.py Normal file
View file

@ -0,0 +1,263 @@
from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal
from UM.Application import Application
from UM.Preferences import Preferences
import UM.Settings
class MachineManagerModel(QObject):
def __init__(self, parent = None):
super().__init__(parent)
self._global_container_stack = None
Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerChanged)
self._onGlobalContainerChanged()
## When the global container is changed, active material probably needs to be updated.
self.globalContainerChanged.connect(self.activeMaterialChanged)
self.globalContainerChanged.connect(self.activeVariantChanged)
self.globalContainerChanged.connect(self.activeQualityChanged)
Preferences.getInstance().addPreference("cura/active_machine", "")
active_machine_id = Preferences.getInstance().getValue("cura/active_machine")
if active_machine_id != "":
# An active machine was saved, so restore it.
self.setActiveMachine(active_machine_id)
pass
globalContainerChanged = pyqtSignal()
activeMaterialChanged = pyqtSignal()
activeVariantChanged = pyqtSignal()
activeQualityChanged = pyqtSignal()
def _onGlobalContainerChanged(self):
if self._global_container_stack:
self._global_container_stack.containersChanged.disconnect(self._onInstanceContainersChanged)
self._global_container_stack = Application.getInstance().getGlobalContainerStack()
self.globalContainerChanged.emit()
if self._global_container_stack:
Preferences.getInstance().setValue("cura/active_machine", self._global_container_stack.getId())
self._global_container_stack.containersChanged.connect(self._onInstanceContainersChanged)
def _onInstanceContainersChanged(self, container):
container_type = container.getMetaDataEntry("type")
if container_type == "material":
self.activeMaterialChanged.emit()
elif container_type == "variant":
self.activeVariantChanged.emit()
elif container_type == "quality":
self.activeQualityChanged.emit()
@pyqtSlot(str)
def setActiveMachine(self, stack_id):
containers = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id = stack_id)
if containers:
Application.getInstance().setGlobalContainerStack(containers[0])
@pyqtSlot(str, str)
def addMachine(self,name, definition_id):
definitions = UM.Settings.ContainerRegistry.getInstance().findDefinitionContainers(id=definition_id)
if definitions:
definition = definitions[0]
new_global_stack = UM.Settings.ContainerStack(name)
new_global_stack.addMetaDataEntry("type", "machine")
UM.Settings.ContainerRegistry.getInstance().addContainer(new_global_stack)
empty_container = UM.Settings.ContainerRegistry.getInstance().getEmptyInstanceContainer()
variants = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(type = "variant", definition = definition.id)
if variants:
new_global_stack.addMetaDataEntry("has_variants", True)
preferred_variant_id = definitions[0].getMetaDataEntry("preferred_variant")
variant_instance_container = empty_container
if preferred_variant_id:
preferred_variant_id = preferred_variant_id.lower()
container = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = preferred_variant_id)
if container:
variant_instance_container = container[0]
if variants and variant_instance_container == empty_container:
variant_instance_container = variants[0]
materials = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(type = "material", definition = definition.id)
if materials:
new_global_stack.addMetaDataEntry("has_materials", True)
preferred_material_id = definitions[0].getMetaDataEntry("preferred_material")
material_instance_container = empty_container
if preferred_material_id:
preferred_material_id = preferred_material_id.lower()
container = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = preferred_material_id)
if container:
material_instance_container = container[0]
if materials and material_instance_container == empty_container:
material_instance_container = materials[0]
preferred_quality_id = definitions[0].getMetaDataEntry("preferred_quality")
quality_instance_container = empty_container
if preferred_quality_id:
preferred_quality_id = preferred_quality_id.lower()
container = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = preferred_quality_id)
if container:
quality_instance_container = container[0]
current_settings_instance_container = UM.Settings.InstanceContainer(name + "_current_settings")
current_settings_instance_container.addMetaDataEntry("machine", name)
current_settings_instance_container.addMetaDataEntry("type", "user")
current_settings_instance_container.setDefinition(definitions[0])
UM.Settings.ContainerRegistry.getInstance().addContainer(current_settings_instance_container)
# If a definition is found, its a list. Should only have one item.
new_global_stack.addContainer(definitions[0])
if variant_instance_container:
new_global_stack.addContainer(variant_instance_container)
if material_instance_container:
new_global_stack.addContainer(material_instance_container)
if quality_instance_container:
new_global_stack.addContainer(quality_instance_container)
new_global_stack.addContainer(current_settings_instance_container)
Application.getInstance().setGlobalContainerStack(new_global_stack)
@pyqtProperty(str, notify = globalContainerChanged)
def activeMachineName(self):
if self._global_container_stack:
return self._global_container_stack.getName()
return ""
@pyqtProperty(str, notify = globalContainerChanged)
def activeMachineId(self):
if self._global_container_stack:
return self._global_container_stack.getId()
return ""
@pyqtProperty(str, notify = activeMaterialChanged)
def activeMaterialName(self):
if self._global_container_stack:
material = self._global_container_stack.findContainer({"type":"material"})
if material:
return material.getName()
return ""
@pyqtProperty(str, notify=activeMaterialChanged)
def activeMaterialId(self):
if self._global_container_stack:
material = self._global_container_stack.findContainer({"type": "material"})
if material:
return material.getId()
return ""
@pyqtProperty(str, notify=activeQualityChanged)
def activeQualityName(self):
if self._global_container_stack:
quality = self._global_container_stack.findContainer({"type": "quality"})
if quality:
return quality.getName()
return ""
@pyqtProperty(str, notify=activeQualityChanged)
def activeQualityId(self):
if self._global_container_stack:
quality = self._global_container_stack.findContainer({"type": "quality"})
if quality:
return quality.getId()
return ""
@pyqtSlot(str)
def setActiveMaterial(self, material_id):
containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id=material_id)
if not containers or not self._global_container_stack:
return
old_material = self._global_container_stack.findContainer({"type":"material"})
if old_material:
material_index = self._global_container_stack.getContainerIndex(old_material)
self._global_container_stack.replaceContainer(material_index, containers[0])
@pyqtSlot(str)
def setActiveVariant(self, variant_id):
containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id=variant_id)
if not containers or not self._global_container_stack:
return
old_variant = self._global_container_stack.findContainer({"type": "variant"})
if old_variant:
variant_index = self._global_container_stack.getContainerIndex(old_variant)
self._global_container_stack.replaceContainer(variant_index, containers[0])
@pyqtSlot(str)
def setActiveQuality(self, quality_id):
containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = quality_id)
if not containers or not self._global_container_stack:
return
old_quality = self._global_container_stack.findContainer({"type": "quality"})
if old_quality:
quality_index = self._global_container_stack.getContainerIndex(old_quality)
self._global_container_stack.replaceContainer(quality_index, containers[0])
@pyqtProperty(str, notify = activeVariantChanged)
def activeVariantName(self):
if self._global_container_stack:
variant = self._global_container_stack.findContainer({"type": "variant"})
if variant:
return variant.getName()
return ""
@pyqtProperty(str, notify = activeVariantChanged)
def activeVariantId(self):
if self._global_container_stack:
variant = self._global_container_stack.findContainer({"type": "variant"})
if variant:
return variant.getId()
return ""
@pyqtProperty(str, notify = globalContainerChanged)
def activeDefinitionId(self):
if self._global_container_stack:
definition = self._global_container_stack.getBottom()
if definition:
return definition.id
return ""
@pyqtSlot(str, str)
def renameMachine(self, machine_id, new_name):
containers = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id = machine_id)
if containers:
containers[0].setName(new_name)
@pyqtSlot(str)
def removeMachine(self, machine_id):
UM.Settings.ContainerRegistry.getInstance().removeContainer(machine_id)
@pyqtProperty(bool, notify = globalContainerChanged)
def hasMaterials(self):
if self._global_container_stack:
return self._global_container_stack.getMetaDataEntry("has_materials", False)
return False
@pyqtProperty(bool, notify = globalContainerChanged)
def hasVariants(self):
if self._global_container_stack:
return self._global_container_stack.getMetaDataEntry("has_variants", False)
return False
def createMachineManagerModel(engine, script_engine):
return MachineManagerModel()

View file

@ -63,6 +63,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().getWorkingProfile().getSettingValue("material_diameter") / 2 r = Application.getInstance().getGlobalContainerStack().getProperty("material_diameter", "value") / 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()

17
cura/ProfileReader.py Normal file
View file

@ -0,0 +1,17 @@
# Copyright (c) 2016 Ultimaker B.V.
# Cura is released under the terms of the AGPLv3 or higher.
from UM.PluginObject import PluginObject
## A type of plug-ins that reads profiles from a file.
#
# The profile is then stored as instance container of the type user profile.
class ProfileReader(PluginObject):
def __init__(self):
super().__init__()
## Read profile data from a file and return a filled profile.
#
# \return \type{Profile} The profile that was obtained from the file.
def read(self, file_name):
raise NotImplementedError("Profile reader plug-in was not correctly implemented. The read function was not implemented.")

View file

@ -0,0 +1,29 @@
# Copyright (c) 2016 Ultimaker B.V.
# Cura is released under the terms of the AGPLv3 or higher.
from UM.Scene.SceneNodeDecorator import SceneNodeDecorator
from UM.Settings.ContainerStack import ContainerStack
from UM.Settings.InstanceContainer import InstanceContainer
from UM.Settings.ContainerRegistry import ContainerRegistry
from UM.Application import Application
## A decorator that adds a container stack to a Node. This stack should be queried for all settings regarding
# the linked node. The Stack in question will refer to the global stack (so that settings that are not defined by
# this stack still resolve.
class SettingOverrideDecorator(SceneNodeDecorator):
def __init__(self):
super().__init__()
self._stack = ContainerStack(id = "SettingOverrideStack")
self._instance = InstanceContainer(id = "SettingOverrideInstanceContainer")
self._stack.addContainer(self._instance)
Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerStackChanged)
self._onGlobalContainerStackChanged()
def _onGlobalContainerStackChanged(self):
## Ensure that the next stack is always the global stack.
self._stack.setNextStack(Application.getInstance().getGlobalContainerStack())
def getStack(self):
return self._stack

View file

@ -11,6 +11,7 @@ from UM.Qt.Bindings.BackendProxy import BackendState #To determine the state of
from UM.Message import Message from UM.Message import Message
from UM.PluginRegistry import PluginRegistry from UM.PluginRegistry import PluginRegistry
from UM.Resources import Resources from UM.Resources import Resources
from UM.Settings.Validator import ValidatorState #To find if a setting is in an error state. We can't slice then.
from cura.OneAtATimeIterator import OneAtATimeIterator from cura.OneAtATimeIterator import OneAtATimeIterator
from . import ProcessSlicedLayersJob from . import ProcessSlicedLayersJob
@ -29,6 +30,10 @@ catalog = i18nCatalog("cura")
class CuraEngineBackend(Backend): class CuraEngineBackend(Backend):
## Starts the back-end plug-in.
#
# This registers all the signal listeners and prepares for communication
# with the back-end in general.
def __init__(self): def __init__(self):
super().__init__() super().__init__()
@ -50,19 +55,19 @@ class CuraEngineBackend(Backend):
self._onActiveViewChanged() self._onActiveViewChanged()
self._stored_layer_data = [] self._stored_layer_data = []
# When there are current settings and machine instance is changed, there is no profile changed event. We should #Triggers for when to (re)start slicing:
# pretend there is though. if Application.getInstance().getGlobalContainerStack():
Application.getInstance().getMachineManager().activeMachineInstanceChanged.connect(self._onActiveProfileChanged) Application.getInstance().getGlobalContainerStack().propertyChanged.connect(self._onSettingChanged) #Note: Only starts slicing when the value changed.
self._profile = None
Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onActiveProfileChanged)
self._onActiveProfileChanged()
#When you update a setting and other settings get changed through inheritance, many propertyChanged signals are fired.
#This timer will group them up, and only slice for the last setting changed signal.
#TODO: Properly group propertyChanged signals by whether they are triggered by the same user interaction.
self._change_timer = QTimer() self._change_timer = QTimer()
self._change_timer.setInterval(500) self._change_timer.setInterval(500)
self._change_timer.setSingleShot(True) self._change_timer.setSingleShot(True)
self._change_timer.timeout.connect(self.slice) self._change_timer.timeout.connect(self.slice)
#Listeners for receiving messages from the back-end.
self._message_handlers["cura.proto.Layer"] = self._onLayerMessage self._message_handlers["cura.proto.Layer"] = self._onLayerMessage
self._message_handlers["cura.proto.Progress"] = self._onProgressMessage self._message_handlers["cura.proto.Progress"] = self._onProgressMessage
self._message_handlers["cura.proto.GCodeLayer"] = self._onGCodeLayerMessage self._message_handlers["cura.proto.GCodeLayer"] = self._onGCodeLayerMessage
@ -70,39 +75,35 @@ class CuraEngineBackend(Backend):
self._message_handlers["cura.proto.ObjectPrintTime"] = self._onObjectPrintTimeMessage self._message_handlers["cura.proto.ObjectPrintTime"] = self._onObjectPrintTimeMessage
self._message_handlers["cura.proto.SlicingFinished"] = self._onSlicingFinishedMessage self._message_handlers["cura.proto.SlicingFinished"] = self._onSlicingFinishedMessage
self._slicing = False
self._start_slice_job = None self._start_slice_job = None
self._restart = False self._slicing = False #Are we currently slicing?
self._enabled = True self._restart = False #Back-end is currently restarting?
self._always_restart = True self._enabled = True #Should we be slicing? Slicing might be paused when, for instance, the user is dragging the mesh around.
self._always_restart = True #Always restart the engine when starting a new slice. Don't keep the process running. TODO: Fix engine statelessness.
self._process_layers_job = None #The currently active job to process layers, or None if it is not processing layers. self._process_layers_job = None #The currently active job to process layers, or None if it is not processing layers.
self._message = None self._message = None #Pop-up message that shows the slicing progress bar (or an error message).
self.backendQuit.connect(self._onBackendQuit) self.backendQuit.connect(self._onBackendQuit)
self.backendConnected.connect(self._onBackendConnected) self.backendConnected.connect(self._onBackendConnected)
#When a tool operation is in progress, don't slice. So we need to listen for tool operations.
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)
Application.getInstance().getMachineManager().activeMachineInstanceChanged.connect(self._onInstanceChanged) ## Called when closing the application.
#
# This function should terminate the engine process.
def close(self): def close(self):
# Terminate CuraEngine if it is still running at this point # Terminate CuraEngine if it is still running at this point
self._terminate() self._terminate()
super().close() super().close()
## Get the command that is used to call the engine. ## Get the command that is used to call the engine.
# This is usefull for debugging and used to actually start the engine # This is useful for debugging and used to actually start the engine.
# \return list of commands and args / parameters. # \return list of commands and args / parameters.
def getEngineCommand(self): def getEngineCommand(self):
active_machine = Application.getInstance().getMachineManager().getActiveMachineInstance() json_path = Resources.getPath(Resources.DefinitionContainers, "fdmprinter.def.json")
json_path = ""
if not active_machine:
json_path = Resources.getPath(Resources.MachineDefinitions, "fdmprinter.json")
else:
json_path = active_machine.getMachineDefinition().getPath()
return [Preferences.getInstance().getValue("backend/location"), "connect", "127.0.0.1:{0}".format(self._port), "-j", json_path, "-vv"] return [Preferences.getInstance().getValue("backend/location"), "connect", "127.0.0.1:{0}".format(self._port), "-j", json_path, "-vv"]
def close(self): def close(self):
@ -116,45 +117,51 @@ class CuraEngineBackend(Backend):
## Emitted when the slicing process starts. ## Emitted when the slicing process starts.
slicingStarted = Signal() slicingStarted = Signal()
## Emitted whne the slicing process is aborted forcefully. ## Emitted when the slicing process is aborted forcefully.
slicingCancelled = Signal() slicingCancelled = Signal()
## Perform a slice of the scene. ## Perform a slice of the scene.
def slice(self): def slice(self):
self._stored_layer_data = [] self._stored_layer_data = []
if not self._enabled: if not self._enabled: #We shouldn't be slicing.
return return
if self._slicing: if self._slicing: #We were already slicing. Stop the old job.
self._terminate() self._terminate()
if self._message: if self._process_layers_job: #We were processing layers. Stop that, the layers are going to change soon.
self._message.hide()
self._message = None
return
if self._process_layers_job:
self._process_layers_job.abort() self._process_layers_job.abort()
self._process_layers_job = None self._process_layers_job = None
if self._profile.hasErrorValue(): #Don't slice if there is a setting with an error value.
Logger.log("w", "Profile has error values. Aborting slicing") stack = Application.getInstance().getGlobalContainerStack()
if self._message: for key in stack.getAllKeys():
self._message.hide() validation_state = stack.getProperty(key, "validationState")
self._message = None #Only setting instances have a validation state, so settings which
self._message = Message(catalog.i18nc("@info:status", "Unable to slice. Please check your setting values for errors.")) #are not overwritten by any instance will have none. The property
self._message.show() #then, and only then, evaluates to None. We make the assumption that
return #No slicing if we have error values since those are by definition illegal values. #the definition defines the setting with a default value that is
#valid. Therefore we can allow both ValidatorState.Valid and None as
#allowable validation states.
#TODO: This assumption is wrong! If the definition defines an inheritance function that through inheritance evaluates to a disallowed value, a setting is still invalid even though it's default!
#TODO: Therefore we must also validate setting definitions.
if validation_state != None and validation_state != ValidatorState.Valid:
Logger.log("w", "Setting %s is not valid, but %s. Aborting slicing.", key, validation_state)
if self._message: #Hide any old message before creating a new one.
self._message.hide()
self._message = None
self._message = Message(catalog.i18nc("@info:status", "Unable to slice. Please check your setting values for errors."))
self._message.show()
return
self.processingProgress.emit(0.0) self.processingProgress.emit(0.0)
self.backendStateChange.emit(BackendState.NOT_STARTED) self.backendStateChange.emit(BackendState.NOT_STARTED)
if self._message: if self._message:
self._message.setProgress(-1) self._message.setProgress(-1)
#else: else:
# self._message = Message(catalog.i18nc("@info:status", "Slicing..."), 0, False, -1) self._message = Message(catalog.i18nc("@info:status", "Slicing..."), 0, False, -1)
# self._message.show() self._message.show()
self._scene.gcode_list = [] self._scene.gcode_list = []
self._slicing = True self._slicing = True
@ -162,10 +169,11 @@ class CuraEngineBackend(Backend):
slice_message = self._socket.createMessage("cura.proto.Slice") slice_message = self._socket.createMessage("cura.proto.Slice")
settings_message = self._socket.createMessage("cura.proto.SettingList"); settings_message = self._socket.createMessage("cura.proto.SettingList");
self._start_slice_job = StartSliceJob.StartSliceJob(self._profile, slice_message, settings_message) self._start_slice_job = StartSliceJob.StartSliceJob(slice_message, settings_message)
self._start_slice_job.start() self._start_slice_job.start()
self._start_slice_job.finished.connect(self._onStartSliceCompleted) self._start_slice_job.finished.connect(self._onStartSliceCompleted)
## Terminate the engine process.
def _terminate(self): def _terminate(self):
self._slicing = False self._slicing = False
self._restart = True self._restart = True
@ -182,10 +190,21 @@ class CuraEngineBackend(Backend):
self._process.terminate() self._process.terminate()
Logger.log("d", "Engine process is killed. Received return code %s", self._process.wait()) Logger.log("d", "Engine process is killed. Received return code %s", self._process.wait())
self._process = None self._process = None
#self._createSocket() # Re create the socket
except Exception as e: # terminating a process that is already terminating causes an exception, silently ignore this. except Exception as e: # terminating a process that is already terminating causes an exception, silently ignore this.
Logger.log("d", "Exception occured while trying to kill the engine %s", str(e)) Logger.log("d", "Exception occurred while trying to kill the engine %s", str(e))
if self._message:
self._message.hide()
self._message = None
## Event handler to call when the job to initiate the slicing process is
# completed.
#
# When the start slice job is successfully completed, it will be happily
# slicing. This function handles any errors that may occur during the
# bootstrapping of a slice job.
#
# \param job The start slice job that was just finished.
def _onStartSliceCompleted(self, job): def _onStartSliceCompleted(self, job):
# Note that cancelled slice jobs can still call this method. # Note that cancelled slice jobs can still call this method.
if self._start_slice_job is job: if self._start_slice_job is job:
@ -200,6 +219,11 @@ class CuraEngineBackend(Backend):
self._socket.sendMessage(job.getSettingsMessage()) self._socket.sendMessage(job.getSettingsMessage())
self._socket.sendMessage(job.getSliceMessage()) self._socket.sendMessage(job.getSliceMessage())
## Listener for when the scene has changed.
#
# This should start a slice if the scene is now ready to slice.
#
# \param source The scene node that was changed.
def _onSceneChanged(self, source): def _onSceneChanged(self, source):
if type(source) is not SceneNode: if type(source) is not SceneNode:
return return
@ -215,6 +239,9 @@ class CuraEngineBackend(Backend):
self._onChanged() self._onChanged()
## Called when an error occurs in the socket connection towards the engine.
#
# \param error The exception that occurred.
def _onSocketError(self, error): def _onSocketError(self, error):
if Application.getInstance().isShuttingDown(): if Application.getInstance().isShuttingDown():
return return
@ -225,22 +252,23 @@ class CuraEngineBackend(Backend):
if error.getErrorCode() not in [Arcus.ErrorCode.BindFailedError, Arcus.ErrorCode.ConnectionResetError, Arcus.ErrorCode.Debug]: if error.getErrorCode() not in [Arcus.ErrorCode.BindFailedError, Arcus.ErrorCode.ConnectionResetError, Arcus.ErrorCode.Debug]:
Logger.log("e", "A socket error caused the connection to be reset") Logger.log("e", "A socket error caused the connection to be reset")
def _onActiveProfileChanged(self): ## A setting has changed, so check if we must reslice.
if self._profile: #
self._profile.settingValueChanged.disconnect(self._onSettingChanged) # \param instance The setting instance that has changed.
# \param property The property of the setting instance that has changed.
self._profile = Application.getInstance().getMachineManager().getWorkingProfile() def _onSettingChanged(self, instance, property):
if self._profile: if property == "value": #Only reslice if the value has changed.
self._profile.settingValueChanged.connect(self._onSettingChanged)
self._onChanged() self._onChanged()
def _onSettingChanged(self, setting): ## Called when a sliced layer data message is received from the engine.
self._onChanged() #
# \param message The protobuf message containing sliced layer data.
def _onLayerMessage(self, message): def _onLayerMessage(self, message):
self._stored_layer_data.append(message) self._stored_layer_data.append(message)
## Called when a progress message is received from the engine.
#
# \param message The protobuf message containing the slicing progress.
def _onProgressMessage(self, message): def _onProgressMessage(self, message):
if self._message: if self._message:
self._message.setProgress(round(message.amount * 100)) self._message.setProgress(round(message.amount * 100))
@ -248,6 +276,9 @@ class CuraEngineBackend(Backend):
self.processingProgress.emit(message.amount) self.processingProgress.emit(message.amount)
self.backendStateChange.emit(BackendState.PROCESSING) self.backendStateChange.emit(BackendState.PROCESSING)
## Called when the engine sends a message that slicing is finished.
#
# \param message The protobuf message signalling that slicing is finished.
def _onSlicingFinishedMessage(self, message): def _onSlicingFinishedMessage(self, message):
self.backendStateChange.emit(BackendState.DONE) self.backendStateChange.emit(BackendState.DONE)
self.processingProgress.emit(1.0) self.processingProgress.emit(1.0)
@ -264,15 +295,27 @@ class CuraEngineBackend(Backend):
self._process_layers_job.start() self._process_layers_job.start()
self._stored_layer_data = [] self._stored_layer_data = []
## Called when a g-code message is received from the engine.
#
# \param message The protobuf message containing g-code, encoded as UTF-8.
def _onGCodeLayerMessage(self, message): def _onGCodeLayerMessage(self, message):
self._scene.gcode_list.append(message.data.decode("utf-8", "replace")) self._scene.gcode_list.append(message.data.decode("utf-8", "replace"))
## Called when a g-code prefix message is received from the engine.
#
# \param message The protobuf message containing the g-code prefix,
# encoded as UTF-8.
def _onGCodePrefixMessage(self, message): def _onGCodePrefixMessage(self, message):
self._scene.gcode_list.insert(0, message.data.decode("utf-8", "replace")) self._scene.gcode_list.insert(0, message.data.decode("utf-8", "replace"))
## Called when a print time message is received from the engine.
#
# \param message The protobuf message containing the print time and
# material amount.
def _onObjectPrintTimeMessage(self, message): def _onObjectPrintTimeMessage(self, message):
self.printDurationMessage.emit(message.time, message.material_amount) self.printDurationMessage.emit(message.time, message.material_amount)
## Creates a new socket connection.
def _createSocket(self): def _createSocket(self):
super()._createSocket(os.path.abspath(os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), "Cura.proto"))) super()._createSocket(os.path.abspath(os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), "Cura.proto")))
@ -280,28 +323,41 @@ class CuraEngineBackend(Backend):
def forceSlice(self): def forceSlice(self):
self._change_timer.start() self._change_timer.start()
## Called when anything has changed to the stuff that needs to be sliced.
#
# This indicates that we should probably re-slice soon.
def _onChanged(self): def _onChanged(self):
if not self._profile:
return
self._change_timer.start() self._change_timer.start()
## Called when the back-end connects to the front-end.
def _onBackendConnected(self): def _onBackendConnected(self):
if self._restart: if self._restart:
self._onChanged() self._onChanged()
self._restart = False self._restart = False
## Called when the user starts using some tool.
#
# When the user starts using a tool, we should pause slicing to prevent
# continuously slicing while the user is dragging some tool handle.
#
# \param tool The tool that the user is using.
def _onToolOperationStarted(self, tool): def _onToolOperationStarted(self, tool):
self._terminate() # Do not continue slicing once a tool has started self._terminate() # Do not continue slicing once a tool has started
self._enabled = False # Do not reslice when a tool is doing it's 'thing' self._enabled = False # Do not reslice when a tool is doing it's 'thing'
## Called when the user stops using some tool.
#
# This indicates that we can safely start slicing again.
#
# \param tool The tool that the user was using.
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.
## Called when the user changes the active view mode.
def _onActiveViewChanged(self): def _onActiveViewChanged(self):
if Application.getInstance().getController().getActiveView(): if Application.getInstance().getController().getActiveView():
view = Application.getInstance().getController().getActiveView() view = Application.getInstance().getController().getActiveView()
if view.getPluginId() == "LayerView": if view.getPluginId() == "LayerView": #If switching to layer view, we should process the layers if that hasn't been done yet.
self._layer_view_active = True self._layer_view_active = True
# There is data and we're not slicing at the moment # There is data and we're not slicing at the moment
# if we are slicing, there is no need to re-calculate the data as it will be invalid in a moment. # if we are slicing, there is no need to re-calculate the data as it will be invalid in a moment.
@ -312,9 +368,9 @@ class CuraEngineBackend(Backend):
else: else:
self._layer_view_active = False self._layer_view_active = False
def _onInstanceChanged(self): ## Called when the back-end self-terminates.
self._terminate() #
# We should reset our state and start listening for new connections.
def _onBackendQuit(self): def _onBackendQuit(self):
if not self._restart and self._process: if not self._restart and self._process:
Logger.log("d", "Backend quit with return code %s. Resetting process and socket.", self._process.wait()) Logger.log("d", "Backend quit with return code %s. Resetting process and socket.", self._process.wait())

View file

@ -62,8 +62,6 @@ class ProcessSlicedLayersJob(Job):
self._progress.hide() self._progress.hide()
return return
settings = Application.getInstance().getMachineManager().getWorkingProfile()
mesh = MeshData() mesh = MeshData()
layer_data = LayerData.LayerData() layer_data = LayerData.LayerData()
layer_count = len(self._layers) layer_count = len(self._layers)
@ -132,8 +130,9 @@ class ProcessSlicedLayersJob(Job):
new_node.setMeshData(mesh) new_node.setMeshData(mesh)
new_node.setParent(self._scene.getRoot()) # Note: After this we can no longer abort! new_node.setParent(self._scene.getRoot()) # Note: After this we can no longer abort!
if not settings.getSettingValue("machine_center_is_zero"): settings = Application.getInstance().getGlobalContainerStack()
new_node.setPosition(Vector(-settings.getSettingValue("machine_width") / 2, 0.0, settings.getSettingValue("machine_depth") / 2)) if not settings.getProperty("machine_center_is_zero", "value"):
new_node.setPosition(Vector(-settings.getProperty("machine_width", "value") / 2, 0.0, settings.getProperty("machine_depth", "value") / 2))
if self._progress: if self._progress:
self._progress.setProgress(100) self._progress.setProgress(100)

View file

@ -30,11 +30,10 @@ class GcodeStartEndFormatter(Formatter):
## Job class that builds up the message of scene data to send to CuraEngine. ## Job class that builds up the message of scene data to send to CuraEngine.
class StartSliceJob(Job): class StartSliceJob(Job):
def __init__(self, profile, slice_message, settings_message): def __init__(self, slice_message, settings_message):
super().__init__() super().__init__()
self._scene = Application.getInstance().getController().getScene() self._scene = Application.getInstance().getController().getScene()
self._profile = profile
self._slice_message = slice_message self._slice_message = slice_message
self._settings_message = settings_message self._settings_message = settings_message
self._is_cancelled = False self._is_cancelled = False
@ -45,18 +44,27 @@ class StartSliceJob(Job):
def getSliceMessage(self): def getSliceMessage(self):
return self._slice_message return self._slice_message
## Runs the job that initiates the slicing.
def run(self): def run(self):
stack = Application.getInstance().getGlobalContainerStack()
if not stack:
self.setResult(False)
return
with self._scene.getSceneLock(): with self._scene.getSceneLock():
# Remove old layer data.
for node in DepthFirstIterator(self._scene.getRoot()): for node in DepthFirstIterator(self._scene.getRoot()):
if node.callDecoration("getLayerData"): if node.callDecoration("getLayerData"):
node.getParent().removeChild(node) node.getParent().removeChild(node)
break break
# Get the objects in their groups to print.
object_groups = [] object_groups = []
if self._profile.getSettingValue("print_sequence") == "one_at_a_time": if stack.getProperty("print_sequence", "value") == "one_at_a_time":
for node in OneAtATimeIterator(self._scene.getRoot()): for node in OneAtATimeIterator(self._scene.getRoot()):
temp_list = [] temp_list = []
# Node can't be printed, so don't bother sending it.
if getattr(node, "_outside_buildarea", False): if getattr(node, "_outside_buildarea", False):
continue continue
@ -85,7 +93,7 @@ class StartSliceJob(Job):
if not object_groups: if not object_groups:
return return
self._buildSettingsMessage(self._profile) self._buildGlobalSettingsMessage(stack)
for group in object_groups: for group in object_groups:
group_message = self._slice_message.addRepeatedMessage("object_lists") group_message = self._slice_message.addRepeatedMessage("object_lists")
@ -97,8 +105,10 @@ class StartSliceJob(Job):
obj = group_message.addRepeatedMessage("objects") 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] *= -1 # Convert from Y up axes to Z up axes. Equals a 90 degree rotation.
verts[:, [1, 2]] = verts[:, [2, 1]]
verts[:, 1] *= -1
obj.vertices = verts obj.vertices = verts
@ -124,18 +134,27 @@ class StartSliceJob(Job):
Logger.log("w", "Unabled to do token replacement on start/end gcode %s", traceback.format_exc()) Logger.log("w", "Unabled to do token replacement on start/end gcode %s", traceback.format_exc())
return str(value).encode("utf-8") return str(value).encode("utf-8")
def _buildSettingsMessage(self, profile): ## Sends all global settings to the engine.
settings = profile.getAllSettingValues(include_machine = True) #
# The settings are taken from the global stack. This does not include any
# per-extruder settings or per-object settings.
def _buildGlobalSettingsMessage(self, stack):
keys = stack.getAllKeys()
settings = {}
for key in keys:
settings[key] = stack.getProperty(key, "value")
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 #Pre-compute material material_bed_temp_prepend and material_print_temp_prepend
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():
s = self._settings_message.addRepeatedMessage("settings") for key, value in settings.items(): #Add all submessages for each individual setting.
s.name = key setting_message = self._settings_message.addRepeatedMessage("settings")
if key == "machine_start_gcode" or key == "machine_end_gcode": setting_message.name = key
s.value = self._expandGcodeTokens(key, value, settings) if key == "machine_start_gcode" or key == "machine_end_gcode": #If it's a g-code message, use special formatting.
setting_message.value = self._expandGcodeTokens(key, value, settings)
else: else:
s.value = str(value).encode("utf-8") setting_message.value = str(value).encode("utf-8")
def _handlePerObjectSettings(self, node, message): def _handlePerObjectSettings(self, node, message):
profile = node.callDecoration("getProfile") profile = node.callDecoration("getProfile")

View file

@ -13,7 +13,7 @@ def getMetaData():
"name": catalog.i18nc("@label", "CuraEngine Backend"), "name": catalog.i18nc("@label", "CuraEngine Backend"),
"author": "Ultimaker", "author": "Ultimaker",
"description": catalog.i18nc("@info:whatsthis", "Provides the link to the CuraEngine slicing backend."), "description": catalog.i18nc("@info:whatsthis", "Provides the link to the CuraEngine slicing backend."),
"api": 2 "api": 3
} }
} }

View file

@ -1,13 +1,22 @@
# Copyright (c) 2015 Ultimaker B.V. # Copyright (c) 2016 Ultimaker B.V.
# Cura is released under the terms of the AGPLv3 or higher. # Cura is released under the terms of the AGPLv3 or higher.
from UM.Mesh.MeshWriter import MeshWriter from UM.Mesh.MeshWriter import MeshWriter
from UM.Logger import Logger from UM.Logger import Logger
from UM.Application import Application from UM.Application import Application
from UM.Settings.InstanceContainer import InstanceContainer #To create a complete setting profile to store in the g-code.
import re #For escaping characters in the settings. import re #For escaping characters in the settings.
import copy
## Writes g-code to a file.
#
# While this poses as a mesh writer, what this really does is take the g-code
# in the entire scene and write it to an output device. Since the g-code of a
# single mesh isn't separable from the rest what with rafts and travel moves
# and all, it doesn't make sense to write just a single mesh.
#
# So this plug-in takes the g-code that is stored in the root of the scene
# node tree, adds a bit of extra information about the profiles and writes
# that to the output device.
class GCodeWriter(MeshWriter): class GCodeWriter(MeshWriter):
## The file format version of the serialised g-code. ## The file format version of the serialised g-code.
# #
@ -32,7 +41,7 @@ class GCodeWriter(MeshWriter):
def write(self, stream, node, mode = MeshWriter.OutputMode.TextMode): def write(self, stream, node, mode = MeshWriter.OutputMode.TextMode):
if mode != MeshWriter.OutputMode.TextMode: if mode != MeshWriter.OutputMode.TextMode:
Logger.log("e", "GCode Writer does not support non-text mode") Logger.log("e", "GCode Writer does not support non-text mode.")
return False return False
scene = Application.getInstance().getController().getScene() scene = Application.getInstance().getController().getScene()
@ -40,26 +49,30 @@ 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)
# Serialise the profile and put them at the end of the file. # Serialise the current container stack and put it at the end of the file.
profile = self._serialiseProfile(Application.getInstance().getMachineManager().getWorkingProfile()) settings = self._serialiseSettings(Application.getInstance().getGlobalContainerStack())
stream.write(profile) stream.write(settings)
return True return True
return False return False
## Serialises the profile to prepare it for saving in the g-code. ## Serialises a container stack to prepare it for writing at the end of the
# g-code.
# #
# The profile are serialised, and special characters (including newline) # The settings are serialised, and special characters (including newline)
# are escaped. # are escaped.
# #
# \param profile The profile to serialise. # \param settings A container stack to serialise.
# \return A serialised string of the profile. # \return A serialised string of the settings.
def _serialiseProfile(self, profile): def _serialiseSettings(self, settings):
prefix = ";SETTING_" + str(GCodeWriter.version) + " " # The prefix to put before each line. prefix = ";SETTING_" + str(GCodeWriter.version) + " " # The prefix to put before each line.
prefix_length = len(prefix) prefix_length = len(prefix)
# Serialise a deepcopy to remove the defaults from the profile all_settings = InstanceContainer("G-code-imported-profile") #Create a new 'profile' with ALL settings so that the slice can be precisely reproduced.
serialised = copy.deepcopy(profile).serialise() all_settings.setDefinition(settings.getBottom())
for key in settings.getAllKeys():
all_settings.setProperty(key, "value", settings.getProperty(key, "value")) #Just copy everything over to the setting instance.
serialised = all_settings.serialize()
# Escape characters that have a special meaning in g-code comments. # Escape characters that have a special meaning in g-code comments.
pattern = re.compile("|".join(GCodeWriter.escape_characters.keys())) pattern = re.compile("|".join(GCodeWriter.escape_characters.keys()))

View file

@ -13,7 +13,7 @@ def getMetaData():
"author": "Ultimaker", "author": "Ultimaker",
"version": "1.0", "version": "1.0",
"description": catalog.i18nc("@info:whatsthis", "Writes GCode to a file."), "description": catalog.i18nc("@info:whatsthis", "Writes GCode to a file."),
"api": 2 "api": 3
}, },
"mesh_writer": { "mesh_writer": {

View file

@ -14,7 +14,7 @@ def getMetaData():
"author": "Ultimaker", "author": "Ultimaker",
"version": "1.0", "version": "1.0",
"description": catalog.i18nc("@info:whatsthis", "Provides the Layer view."), "description": catalog.i18nc("@info:whatsthis", "Provides the Layer view."),
"api": 2 "api": 3
}, },
"view": { "view": {
"name": catalog.i18nc("@item:inlistbox", "Layers"), "name": catalog.i18nc("@item:inlistbox", "Layers"),

View file

@ -9,8 +9,9 @@ import os.path #For concatenating the path to the plugin and the relative path t
from UM.Application import Application #To get the machine manager to create the new profile in. from UM.Application import Application #To get the machine manager to create the new profile in.
from UM.Logger import Logger #Logging errors. from UM.Logger import Logger #Logging errors.
from UM.PluginRegistry import PluginRegistry #For getting the path to this plugin's directory. from UM.PluginRegistry import PluginRegistry #For getting the path to this plugin's directory.
from UM.Settings.Profile import Profile from UM.Settings.DefinitionContainer import DefinitionContainer #For getting the current machine's defaults.
from UM.Settings.ProfileReader import ProfileReader from UM.Settings.InstanceContainer import InstanceContainer #The new profile to make.
from cura.ProfileReader import ProfileReader #The plug-in type to implement.
## A plugin that reads profile data from legacy Cura versions. ## A plugin that reads profile data from legacy Cura versions.
# #
@ -66,7 +67,7 @@ class LegacyProfileReader(ProfileReader):
if file_name.split(".")[-1] != "ini": if file_name.split(".")[-1] != "ini":
return None return None
Logger.log("i", "Importing legacy profile from file " + file_name + ".") Logger.log("i", "Importing legacy profile from file " + file_name + ".")
profile = Profile(machine_manager = Application.getInstance().getMachineManager(), read_only = False) #Create an empty profile. profile = InstanceContainer("Imported Legacy Profile") #Create an empty profile.
parser = configparser.ConfigParser(interpolation = None) parser = configparser.ConfigParser(interpolation = None)
try: try:
@ -103,23 +104,24 @@ class LegacyProfileReader(ProfileReader):
if "target_version" not in dict_of_doom: if "target_version" not in dict_of_doom:
Logger.log("e", "Dictionary of Doom has no target version. Is it the correct JSON file?") Logger.log("e", "Dictionary of Doom has no target version. Is it the correct JSON file?")
return None return None
if Profile.ProfileVersion != dict_of_doom["target_version"]: if InstanceContainer.Version != dict_of_doom["target_version"]:
Logger.log("e", "Dictionary of Doom of legacy profile reader (version %s) is not in sync with the profile version (version %s)!", dict_of_doom["target_version"], str(Profile.ProfileVersion)) Logger.log("e", "Dictionary of Doom of legacy profile reader (version %s) is not in sync with the current instance container version (version %s)!", dict_of_doom["target_version"], str(InstanceContainer.Version))
return None return None
if "translation" not in dict_of_doom: if "translation" not in dict_of_doom:
Logger.log("e", "Dictionary of Doom has no translation. Is it the correct JSON file?") Logger.log("e", "Dictionary of Doom has no translation. Is it the correct JSON file?")
return None return None
current_printer = Application.getInstance().getGlobalContainerStack().findContainer({ }, DefinitionContainer)
for new_setting in dict_of_doom["translation"]: #Evaluate all new settings that would get a value from the translations. for new_setting in dict_of_doom["translation"]: #Evaluate all new settings that would get a value from the translations.
old_setting_expression = dict_of_doom["translation"][new_setting] old_setting_expression = dict_of_doom["translation"][new_setting]
compiled = compile(old_setting_expression, new_setting, "eval") compiled = compile(old_setting_expression, new_setting, "eval")
try: try:
new_value = eval(compiled, {"math": math}, legacy_settings) #Pass the legacy settings as local variables to allow access to in the evaluation. new_value = eval(compiled, {"math": math}, legacy_settings) #Pass the legacy settings as local variables to allow access to in the evaluation.
value_using_defaults = eval(compiled, {"math": math}, defaults) #Evaluate again using only the default values to try to see if they are default. value_using_defaults = eval(compiled, {"math": math}, defaults) #Evaluate again using only the default values to try to see if they are default.
except Exception as e: #Probably some setting name that was missing or something else that went wrong in the ini file. except Exception: #Probably some setting name that was missing or something else that went wrong in the ini file.
Logger.log("w", "Setting " + new_setting + " could not be set because the evaluation failed. Something is probably missing from the imported legacy profile.") Logger.log("w", "Setting " + new_setting + " could not be set because the evaluation failed. Something is probably missing from the imported legacy profile.")
continue continue
if new_value != value_using_defaults and profile.getSettingValue(new_setting) != new_value: #Not equal to the default in the new Cura OR the default in the legacy Cura. if new_value != value_using_defaults and current_printer.findDefinitions(key = new_setting).default_value != new_value: #Not equal to the default in the new Cura OR the default in the legacy Cura.
profile.setSettingValue(new_setting, new_value) #Store the setting in the profile! profile.setSettingValue(new_setting, new_value) #Store the setting in the profile!
if len(profile.getChangedSettings()) == 0: if len(profile.getChangedSettings()) == 0:

View file

@ -13,7 +13,7 @@ def getMetaData():
"author": "Ultimaker", "author": "Ultimaker",
"version": "1.0", "version": "1.0",
"description": catalog.i18nc("@info:whatsthis", "Provides support for importing profiles from legacy Cura versions."), "description": catalog.i18nc("@info:whatsthis", "Provides support for importing profiles from legacy Cura versions."),
"api": 2 "api": 3
}, },
"profile_reader": [ "profile_reader": [
{ {

View file

@ -0,0 +1,29 @@
// Copyright (c) 2015 Ultimaker B.V.
// Uranium is released under the terms of the AGPLv3 or higher.
import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Controls.Styles 1.1
import QtQuick.Layouts 1.1
import UM 1.1 as UM
import ".."
Button {
id: base;
style: UM.Theme.styles.sidebar_category;
signal showTooltip(string text);
signal hideTooltip();
signal contextMenuRequested()
text: definition.label
iconSource: UM.Theme.getIcon(definition.icon)
checkable: true
checked: definition.expanded
onClicked: definition.expanded ? settingDefinitionsModel.collapse(definition.key) : settingDefinitionsModel.expandAll(definition.key)
}

View file

@ -0,0 +1,29 @@
// Copyright (c) 2015 Ultimaker B.V.
// Uranium is released under the terms of the AGPLv3 or higher.
import QtQuick 2.1
import QtQuick.Layouts 1.1
import QtQuick.Controls 1.1
import QtQuick.Controls.Styles 1.1
import UM 1.2 as UM
UM.TooltipArea
{
x: model.depth * UM.Theme.getSize("default_margin").width;
text: model.description;
width: childrenRect.width;
height: childrenRect.height;
Button
{
id: check
text: definition.label
//onClicked: delegateItem.settingsModel.setSettingVisible(model.key, checked);
}
}

View file

@ -7,8 +7,8 @@ from UM.Application import Application
from UM.Qt.ListModel import ListModel from UM.Qt.ListModel import ListModel
from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator
from UM.Scene.SceneNode import SceneNode from UM.Scene.SceneNode import SceneNode
from UM.Settings.SettingOverrideDecorator import SettingOverrideDecorator #from UM.Settings.SettingOverrideDecorator import SettingOverrideDecorator
from UM.Settings.ProfileOverrideDecorator import ProfileOverrideDecorator #from UM.Settings.ProfileOverrideDecorator import ProfileOverrideDecorator
from . import SettingOverrideModel from . import SettingOverrideModel
@ -35,7 +35,7 @@ class PerObjectSettingsModel(ListModel):
self.setProperty(self.find("id", object_id), "profile", profile_name) self.setProperty(self.find("id", object_id), "profile", profile_name)
profile = None profile = None
if profile_name != "global": '''if profile_name != "global":
profile = Application.getInstance().getMachineManager().findProfile(profile_name) profile = Application.getInstance().getMachineManager().findProfile(profile_name)
node = self._scene.findObject(object_id) node = self._scene.findObject(object_id)
@ -45,7 +45,7 @@ class PerObjectSettingsModel(ListModel):
node.callDecoration("setProfile", profile) node.callDecoration("setProfile", profile)
else: else:
if node.getDecorator(ProfileOverrideDecorator): if node.getDecorator(ProfileOverrideDecorator):
node.removeDecorator(ProfileOverrideDecorator) node.removeDecorator(ProfileOverrideDecorator)'''
@pyqtSlot("quint64", str) @pyqtSlot("quint64", str)
def addSettingOverride(self, object_id, key): def addSettingOverride(self, object_id, key):
@ -54,8 +54,8 @@ class PerObjectSettingsModel(ListModel):
return return
node = self._scene.findObject(object_id) node = self._scene.findObject(object_id)
if not node.getDecorator(SettingOverrideDecorator): #if not node.getDecorator(SettingOverrideDecorator):
node.addDecorator(SettingOverrideDecorator()) # node.addDecorator(SettingOverrideDecorator())
node.callDecoration("addSetting", key) node.callDecoration("addSetting", key)
@ -64,8 +64,8 @@ class PerObjectSettingsModel(ListModel):
node = self._scene.findObject(object_id) node = self._scene.findObject(object_id)
node.callDecoration("removeSetting", key) node.callDecoration("removeSetting", key)
if len(node.callDecoration("getAllSettings")) == 0: #if len(node.callDecoration("getAllSettings")) == 0:
node.removeDecorator(SettingOverrideDecorator) # node.removeDecorator(SettingOverrideDecorator)
def _updateModel(self): def _updateModel(self):
self.clear() self.clear()

View file

@ -6,7 +6,10 @@ import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.2 import QtQuick.Controls.Styles 1.2
import QtQuick.Window 2.2 import QtQuick.Window 2.2
import UM 1.1 as UM import UM 1.2 as UM
import Cura 1.0 as Cura
import ".."
Item { Item {
id: base; id: base;
@ -133,6 +136,7 @@ Item {
id: settingPickDialog id: settingPickDialog
title: catalog.i18nc("@title:window", "Pick a Setting to Customize") title: catalog.i18nc("@title:window", "Pick a Setting to Customize")
property string labelFilter: ""
TextField { TextField {
id: filter; id: filter;
@ -145,123 +149,61 @@ Item {
placeholderText: catalog.i18nc("@label:textbox", "Filter..."); placeholderText: catalog.i18nc("@label:textbox", "Filter...");
onTextChanged: settingCategoriesModel.filter(text); onTextChanged:
{
if(text != "")
{
listview.model.filter = {"global_only": false, "label": "*" + text}
}
else
{
listview.model.filter = {"global_only": false}
}
}
} }
ScrollView { ScrollView
id: view; {
anchors { id: scrollView
anchors
{
top: filter.bottom; top: filter.bottom;
left: parent.left; left: parent.left;
right: parent.right; right: parent.right;
bottom: parent.bottom; bottom: parent.bottom;
} }
ListView
{
id:listview
model: UM.SettingDefinitionsModel
{
id: definitionsModel;
containerId: Cura.MachineManager.activeDefinitionId
filter:
{
"global_only": false
}
}
delegate:Loader
{
id: loader
Column { width: parent.width
width: view.width - UM.Theme.getSize("default_margin").width * 2; height: model.type != undefined ? UM.Theme.getSize("section").height : 0;
height: childrenRect.height;
Repeater { property var definition: model
id: settingList; property var settingDefinitionsModel: definitionsModel
model: UM.SettingCategoriesModel { id: settingCategoriesModel; } asynchronous: true
source:
delegate: Item { {
id: delegateItem; switch(model.type)
{
width: parent.width; case "category":
height: childrenRect.height; return "PerObjectCategory.qml"
visible: model.visible && settingsColumn.childrenHeight != 0 //If all children are hidden, the height is 0, and then the category header must also be hidden. default:
return "PerObjectItem.qml"
ToolButton {
id: categoryHeader;
text: model.name;
checkable: true;
width: parent.width;
onCheckedChanged: settingsColumn.state != "" ? settingsColumn.state = "" : settingsColumn.state = "collapsed";
style: ButtonStyle {
background: Rectangle
{
width: control.width;
height: control.height;
color: control.hovered ? palette.highlight : "transparent";
}
label: Row
{
spacing: UM.Theme.getSize("default_margin").width;
Image
{
anchors.verticalCenter: parent.verticalCenter;
source: control.checked ? UM.Theme.getIcon("arrow_right") : UM.Theme.getIcon("arrow_bottom");
}
Label
{
text: control.text;
font.bold: true;
color: control.hovered ? palette.highlightedText : palette.text;
}
}
}
}
property variant settingsModel: model.settings;
Column {
id: settingsColumn;
anchors.top: categoryHeader.bottom;
property real childrenHeight:
{
var h = 0.0;
for(var i in children)
{
var item = children[i];
h += children[i].height;
if(item.settingVisible)
{
if(i > 0)
{
h += spacing;
}
}
}
return h;
}
width: childrenRect.width;
height: childrenHeight;
Repeater {
model: delegateItem.settingsModel;
delegate: ToolButton {
id: button;
x: model.visible_depth * UM.Theme.getSize("default_margin").width;
text: model.name;
tooltip: model.description;
visible: !model.global_only
height: model.global_only ? 0 : undefined
onClicked: {
var object_id = UM.ActiveTool.properties.getValue("Model").getItem(base.currentIndex).id;
UM.ActiveTool.properties.getValue("Model").addSettingOverride(object_id, model.key);
settingPickDialog.visible = false;
}
states: State {
name: "filtered"
when: model.filtered || !model.visible || !model.enabled
PropertyChanges { target: button; height: 0; opacity: 0; }
}
}
}
states: State {
name: "collapsed";
PropertyChanges { target: settingsColumn; opacity: 0; height: 0; }
}
} }
} }
} }

View file

@ -5,7 +5,7 @@ from PyQt5.QtCore import Qt, pyqtSlot, QUrl
from UM.Application import Application from UM.Application import Application
from UM.Qt.ListModel import ListModel from UM.Qt.ListModel import ListModel
from UM.Settings.SettingOverrideDecorator import SettingOverrideDecorator #from UM.Settings.SettingOverrideDecorator import SettingOverrideDecorator
class SettingOverrideModel(ListModel): class SettingOverrideModel(ListModel):
KeyRole = Qt.UserRole + 1 KeyRole = Qt.UserRole + 1
@ -29,9 +29,9 @@ class SettingOverrideModel(ListModel):
self._node.decoratorsChanged.connect(self._onDecoratorsChanged) self._node.decoratorsChanged.connect(self._onDecoratorsChanged)
self._onDecoratorsChanged(None) self._onDecoratorsChanged(None)
self._activeProfile = Application.getInstance().getMachineManager().getWorkingProfile() #To be able to get notified when a setting changes. #self._activeProfile = Application.getInstance().getMachineManager().getWorkingProfile() #To be able to get notified when a setting changes.
self._activeProfile.settingValueChanged.connect(self._onProfileSettingValueChanged) #self._activeProfile.settingValueChanged.connect(self._onProfileSettingValueChanged)
Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onProfileChanged) #Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onProfileChanged)
self.addRoleName(self.KeyRole, "key") self.addRoleName(self.KeyRole, "key")
self.addRoleName(self.LabelRole, "label") self.addRoleName(self.LabelRole, "label")
@ -53,7 +53,8 @@ class SettingOverrideModel(ListModel):
self._decorator.setSettingValue(key, value) self._decorator.setSettingValue(key, value)
def _onDecoratorsChanged(self, node): def _onDecoratorsChanged(self, node):
if not self._node.getDecorator(SettingOverrideDecorator): return
'''if not self._node.getDecorator(SettingOverrideDecorator):
self.clear() self.clear()
return return
@ -61,7 +62,7 @@ class SettingOverrideModel(ListModel):
self._decorator.settingAdded.connect(self._onSettingsChanged) self._decorator.settingAdded.connect(self._onSettingsChanged)
self._decorator.settingRemoved.connect(self._onSettingsChanged) self._decorator.settingRemoved.connect(self._onSettingsChanged)
self._decorator.settingValueChanged.connect(self._onSettingValueChanged) self._decorator.settingValueChanged.connect(self._onSettingValueChanged)
self._onSettingsChanged() self._onSettingsChanged()'''
def _createOptionsModel(self, options): def _createOptionsModel(self, options):
if not options: if not options:

View file

@ -13,7 +13,7 @@ def getMetaData():
"author": "Ultimaker", "author": "Ultimaker",
"version": "1.0", "version": "1.0",
"description": i18n_catalog.i18nc("@info:whatsthis", "Provides the Per Object Settings."), "description": i18n_catalog.i18nc("@info:whatsthis", "Provides the Per Object Settings."),
"api": 2 "api": 3
}, },
"tool": { "tool": {
"name": i18n_catalog.i18nc("@label", "Per Object Settings"), "name": i18n_catalog.i18nc("@label", "Per Object Settings"),

View file

@ -29,17 +29,26 @@ class RemovableDriveOutputDevice(OutputDevice):
if self._writing: if self._writing:
raise OutputDeviceError.DeviceBusyError() raise OutputDeviceError.DeviceBusyError()
file_formats = Application.getInstance().getMeshFileHandler().getSupportedFileTypesWrite() #Formats supported by this application. # Formats supported by this application (File types that we can actually write)
file_formats = Application.getInstance().getMeshFileHandler().getSupportedFileTypesWrite()
if filter_by_machine: if filter_by_machine:
machine_file_formats = Application.getInstance().getMachineManager().getActiveMachineInstance().getMachineDefinition().getFileFormats() container = Application.getInstance().getGlobalContainerStack().findContainer({"file_formats": "*"})
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.
# Create a list from supported file formats string
machine_file_formats = [file_type.strip() for file_type in container.getMetaDataEntry("file_formats").split(";")]
# Take the intersection between file_formats and machine_file_formats.
file_formats = list(filter(lambda file_format: file_format["mime_type"] in machine_file_formats, file_formats))
if len(file_formats) == 0: if len(file_formats) == 0:
Logger.log("e", "There are no file formats available to write with!") 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.
# Just take the first file format available.
writer = Application.getInstance().getMeshFileHandler().getWriterByMimeType(file_formats[0]["mime_type"])
extension = file_formats[0]["extension"] extension = file_formats[0]["extension"]
if file_name == None: if file_name is None:
for n in BreadthFirstIterator(node): for n in BreadthFirstIterator(node):
if n.getMeshData(): if n.getMeshData():
file_name = n.getName() file_name = n.getName()
@ -50,7 +59,7 @@ 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()
if extension: #Not empty string. if extension: # Not empty string.
extension = "." + extension extension = "." + extension
file_name = os.path.join(self.getId(), os.path.splitext(file_name)[0] + extension) file_name = os.path.join(self.getId(), os.path.splitext(file_name)[0] + extension)

View file

@ -34,12 +34,10 @@ class SolidView(View):
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])
self._disabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(0))) self._disabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(0)))
if Application.getInstance().getMachineManager().getWorkingProfile(): if Application.getInstance().getGlobalContainerStack():
profile = Application.getInstance().getMachineManager().getWorkingProfile()
if Preferences.getInstance().getValue("view/show_overhang"): if Preferences.getInstance().getValue("view/show_overhang"):
angle = profile.getSettingValue("support_angle") angle = Application.getInstance().getGlobalContainerStack().getProperty("support_angle", "value")
if angle != None: if angle is not None:
self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(90 - angle))) self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(90 - angle)))
else: else:
self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(0))) #Overhang angle of 0 causes no area at all to be marked as overhang. self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(0))) #Overhang angle of 0 causes no area at all to be marked as overhang.

View file

@ -13,7 +13,7 @@ def getMetaData():
"author": "Ultimaker", "author": "Ultimaker",
"version": "1.0", "version": "1.0",
"description": i18n_catalog.i18nc("@info:whatsthis", "Provides a normal solid mesh view."), "description": i18n_catalog.i18nc("@info:whatsthis", "Provides a normal solid mesh view."),
"api": 2 "api": 3
}, },
"view": { "view": {
"name": i18n_catalog.i18nc("@item:inmenu", "Solid"), "name": i18n_catalog.i18nc("@item:inmenu", "Solid"),

View file

@ -13,7 +13,7 @@ def getMetaData():
"author": "Ultimaker", "author": "Ultimaker",
"version": "1.0", "version": "1.0",
"description": catalog.i18nc("@info:whatsthis", "Provides the X-Ray view."), "description": catalog.i18nc("@info:whatsthis", "Provides the X-Ray view."),
"api": 2 "api": 3
}, },
"view": { "view": {
"name": catalog.i18nc("@item:inlistbox", "X-Ray"), "name": catalog.i18nc("@item:inlistbox", "X-Ray"),

View file

@ -0,0 +1,135 @@
# Copyright (c) 2016 Ultimaker B.V.
# Cura is released under the terms of the AGPLv3 or higher.
import math
import copy
import xml.etree.ElementTree as ET
from UM.Logger import Logger
import UM.Settings
# The namespace is prepended to the tag name but between {}.
# We are only interested in the actual tag name, so discard everything
# before the last }
def _tag_without_namespace(element):
return element.tag[element.tag.rfind("}") + 1:]
class XmlMaterialProfile(UM.Settings.InstanceContainer):
def __init__(self, container_id, *args, **kwargs):
super().__init__(container_id, *args, **kwargs)
def serialize(self):
raise NotImplementedError("Writing material profiles has not yet been implemented")
def deserialize(self, serialized):
data = ET.fromstring(serialized)
self.addMetaDataEntry("type", "material")
# TODO: Add material verfication
self.addMetaDataEntry("status", "Unknown")
metadata = data.iterfind("./um:metadata/*", self.__namespaces)
for entry in metadata:
tag_name = _tag_without_namespace(entry)
if tag_name == "name":
brand = entry.find("./um:brand", self.__namespaces)
material = entry.find("./um:material", self.__namespaces)
color = entry.find("./um:color", self.__namespaces)
self.setName("{0} {1} ({2})".format(brand.text, material.text, color.text))
self.addMetaDataEntry("brand", brand.text)
self.addMetaDataEntry("material", material.text)
self.addMetaDataEntry("color_name", color.text)
self.addMetaDataEntry(tag_name, entry.text)
property_values = {}
properties = data.iterfind("./um:properties/*", self.__namespaces)
for entry in properties:
tag_name = _tag_without_namespace(entry)
property_values[tag_name] = entry.text
diameter = float(property_values.get("diameter", 2.85)) # In mm
density = float(property_values.get("density", 1.3)) # In g/cm3
weight_per_cm = (math.pi * (diameter / 20) ** 2 * 0.1) * density
spool_weight = property_values.get("spool_weight")
spool_length = property_values.get("spool_length")
if spool_weight:
length = float(spool_weight) / weight_per_cm
property_values["spool_length"] = str(length / 100)
elif spool_length:
weight = (float(spool_length) * 100) * weight_per_cm
property_values["spool_weight"] = str(weight)
self.addMetaDataEntry("properties", property_values)
global_setting_values = {}
settings = data.iterfind("./um:settings/um:setting", self.__namespaces)
for entry in settings:
key = entry.get("key")
if key in self.__material_property_setting_map:
self.setProperty(self.__material_property_setting_map[key], "value", entry.text, self._definition)
global_setting_values[key] = entry.text
machines = data.iterfind("./um:settings/um:machine", self.__namespaces)
for machine in machines:
machine_setting_values = {}
settings = machine.iterfind("./um:setting", self.__namespaces)
for entry in settings:
key = entry.get("key")
if key in self.__material_property_setting_map:
machine_setting_values[self.__material_property_setting_map[key]] = entry.text
identifiers = machine.iterfind("./um:machine_identifier", self.__namespaces)
for identifier in identifiers:
machine_id = self.__product_id_map.get(identifier.get("product"), None)
if machine_id is None:
Logger.log("w", "Cannot create material for unknown machine %s", machine_id)
continue
definitions = UM.Settings.ContainerRegistry.getInstance().findDefinitionContainers(id = machine_id)
if not definitions:
Logger.log("w", "No definition found for machine ID %s", machine_id)
continue
new_material = XmlMaterialProfile(self.id + "_" + machine_id)
new_material.setName(self.getName())
new_material.setMetaData(self.getMetaData())
new_material.setDefinition(definitions[0])
for key, value in global_setting_values.items():
new_material.setProperty(key, "value", value, definitions[0])
for key, value in machine_setting_values.items():
new_material.setProperty(key, "value", value, definitions[0])
new_material._dirty = False
UM.Settings.ContainerRegistry.getInstance().addContainer(new_material)
__material_property_setting_map = {
"print temperature": "material_print_temperature",
"heated bed temperature": "material_bed_temperature",
"standby temperature": "material_standby_temperature",
}
__product_id_map = {
"Ultimaker2": "ultimaker2",
"Ultimaker2+": "ultimaker2_plus",
"Ultimaker2go": "ultimaker2_go",
"Ultimaker2extended": "ultimaker2_extended",
"Ultimaker2extended+": "ultimaker2_extended_plus",
"Ultimaker Original": "ultimaker_original",
"Ultimaker Original+": "ultimaker_original_plus"
}
__namespaces = {
"um": "http://www.ultimaker.com/material"
}

View file

@ -0,0 +1,32 @@
# Copyright (c) 2016 Ultimaker B.V.
# Cura is released under the terms of the AGPLv3 or higher.
from . import XmlMaterialProfile
from UM.MimeTypeDatabase import MimeType, MimeTypeDatabase
from UM.i18n import i18nCatalog
catalog = i18nCatalog("cura")
def getMetaData():
return {
"plugin": {
"name": catalog.i18nc("@label", "Material Profiles"),
"author": "Ultimaker",
"version": "1.0",
"description": catalog.i18nc("@info:whatsthis", "Provides capabilities to read and write XML-based material profiles."),
"api": 3
},
"settings_container": {
"mimetype": "application/x-ultimaker-material-profile"
}
}
def register(app):
mime_type = MimeType(
name = "application/x-ultimaker-material-profile",
comment = "Ultimaker Material Profile",
suffixes = [ "xml.fdm_material" ]
)
MimeTypeDatabase.addMimeType(mime_type)
return { "settings_container": XmlMaterialProfile.XmlMaterialProfile("default_xml_material_profile") }

View file

@ -0,0 +1,93 @@
{
"id": "bq_hephestos",
"name": "BQ Prusa i3 Hephestos",
"version": 2,
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "BQ",
"manufacturer": "BQ",
"category": "Other",
"file_formats": "text/x-gcode",
"platform": "bq_hephestos_platform.stl",
"platform_offset": {
"value": [
0,
-82,
0
]
}
},
"overrides": {
"machine_start_gcode": {
"default_value": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --"
},
"machine_end_gcode": {
"default_value": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG1 Z10 ;move extruder up 10 mm\nG90 ;set to absolute positioning\nG1 X0 Y180 F1200 ;expose the platform\nM84 ;turn off steppers\n; -- end of END GCODE --"
},
"machine_width": {
"default_value": 215
},
"machine_depth": {
"default_value": 210
},
"machine_height": {
"default_value": 180
},
"machine_heated_bed": {
"default_value": false
},
"machine_center_is_zero": {
"default_value": false
},
"machine_gcode_flavor": {
"default_value": "RepRap"
},
"layer_height": {
"default_value": 0.2
},
"layer_height_0": {
"default_value": 0.2
},
"wall_thickness": {
"default_value": 1
},
"top_bottom_thickness": {
"default_value": 1
},
"bottom_thickness": {
"default_value": 1
},
"material_print_temperature": {
"default_value": 220
},
"material_bed_temperature": {
"default_value": 0
},
"material_diameter": {
"default_value": 1.75
},
"speed_print": {
"default_value": 40
},
"speed_infill": {
"default_value": 40
},
"speed_wall": {
"default_value": 35
},
"speed_topbottom": {
"default_value": 35
},
"speed_travel": {
"default_value": 120
},
"speed_layer_0": {
"default_value": 20
},
"support_enable": {
"default_value": true
}
}
}

View file

@ -0,0 +1,47 @@
{
"id": "bq_hephestos_2",
"version": 2,
"name": "BQ Hephestos 2",
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "BQ",
"manufacturer": "BQ",
"category": "Other",
"platform": "bq_hephestos_2_platform.stl",
"platform_offset": { "value": [6, 1320, 0 ] },
"file_formats": "text/x-gcode"
},
"overrides": {
"machine_start_gcode": { "default_value": "; -- START GCODE --\nM800 ; Custom GCODE to fire start print procedure\n; -- end of START GCODE --" },
"machine_end_gcode": { "default_value": "; -- END GCODE --\nM801 ; Custom GCODE to fire end print procedure\n; -- end of END GCODE --" },
"machine_width": { "default_value": 210 },
"machine_depth": { "default_value": 297 },
"machine_height": { "default_value": 220 },
"machine_heated_bed": { "default_value": false },
"machine_center_is_zero": { "default_value": false },
"material_print_temperature": { "default_value": 210 },
"material_bed_temperature": { "default_value": 0 },
"material_diameter": { "default_value": 1.75 },
"layer_height": { "default_value": 0.2 },
"layer_height_0": { "default_value": 0.2 },
"wall_line_count": { "default_value": 3 },
"wall_thickness": { "default_value": 1.2 },
"top_bottom_thickness": { "default_value": 1.2 },
"infill_sparse_density": { "default_value": 20 },
"infill_overlap": { "default_value": 15 },
"speed_print": { "default_value": 60 },
"speed_travel": { "default_value": 160 },
"speed_layer_0": { "default_value": 30 },
"speed_wall_x": { "default_value": 35 },
"speed_wall_0": { "default_value": 30 },
"speed_infill": { "default_value": 80 },
"speed_topbottom": { "default_value": 35 },
"skirt_speed": { "default_value": 35 },
"skirt_line_count": { "default_value": 4 },
"skirt_minimal_length": { "default_value": 30 },
"skirt_gap": { "default_value": 6 },
"cool_fan_full_at_height": { "default_value": 0.4 }
}
}

View file

@ -0,0 +1,93 @@
{
"id": "bq_hephestos_xl",
"version": 2,
"name": "BQ Prusa i3 Hephestos XL",
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"manufacturer": "BQ",
"author": "BQ",
"category": "Other",
"file_formats": "text/x-code",
"platform": "bq_hephestos_platform.stl",
"platform_offset": {
"value": [
0,
-82,
0
]
}
},
"overrides": {
"machine_start_gcode": {
"default_value": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --"
},
"machine_end_gcode": {
"default_value": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG1 Z10 ;move extruder up 10 mm\nG90 ;set to absolute positioning\nG1 X0 Y180 F1200 ;expose the platform\nM84 ;turn off steppers\n; -- end of END GCODE --"
},
"machine_width": {
"default_value": 200
},
"machine_depth": {
"default_value": 300
},
"machine_height": {
"default_value": 180
},
"machine_heated_bed": {
"default_value": false
},
"machine_center_is_zero": {
"default_value": false
},
"machine_gcode_flavor": {
"default_value": "RepRap"
},
"layer_height": {
"default_value": 0.2
},
"layer_height_0": {
"default_value": 0.2
},
"wall_thickness": {
"default_value": 1
},
"top_bottom_thickness": {
"default_value": 1
},
"bottom_thickness": {
"default_value": 1
},
"material_print_temperature": {
"default_value": 220
},
"material_bed_temperature": {
"default_value": 0
},
"material_diameter": {
"default_value": 1.75
},
"speed_print": {
"default_value": 40
},
"speed_infill": {
"default_value": 40
},
"speed_wall": {
"default_value": 35
},
"speed_topbottom": {
"default_value": 35
},
"speed_travel": {
"default_value": 120
},
"speed_layer_0": {
"default_value": 20
},
"support_enable": {
"default_value": true
}
}
}

View file

@ -0,0 +1,94 @@
{
"id": "bq_witbox",
"version": 2,
"name": "BQ Witbox",
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "BQ",
"manufacturer": "BQ",
"category": "Other",
"file_formats": "text/x-gcode",
"platform": "bq_witbox_platform.stl",
"platform_offset": {
"value": [
0,
-145,
-38
]
}
},
"overrides": {
"machine_start_gcode": {
"default_value": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --"
},
"machine_end_gcode": {
"default_value": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG90 ;set to absolute positioning\nG1 Z200 ;move the platform to the bottom\nG28 X0 Y0 ;move to the X/Y origin (Home)\nM84 ;turn off steppers\n; -- end of END GCODE --"
},
"machine_width": {
"default_value": 297
},
"machine_depth": {
"default_value": 210
},
"machine_height": {
"default_value": 200
},
"machine_heated_bed": {
"default_value": false
},
"machine_center_is_zero": {
"default_value": false
},
"machine_gcode_flavor": {
"default_value": "RepRap"
},
"layer_height": {
"default_value": 0.2
},
"layer_height_0": {
"default_value": 0.2
},
"wall_thickness": {
"default_value": 1
},
"top_bottom_thickness": {
"default_value": 1
},
"bottom_thickness": {
"default_value": 1
},
"material_print_temperature": {
"default_value": 220
},
"material_bed_temperature": {
"default_value": 0
},
"material_diameter": {
"default_value": 1.75
},
"speed_print": {
"default_value": 40
},
"speed_infill": {
"default_value": 40
},
"speed_wall": {
"default_value": 35
},
"speed_topbottom": {
"default_value": 35
},
"speed_travel": {
"default_value": 120
},
"speed_layer_0": {
"default_value": 20
},
"support_enable": {
"default_value": true
}
}
}

View file

@ -0,0 +1,111 @@
{
"id": "bq_witbox_2",
"version": 2,
"name": "BQ Witbox 2",
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "BQ",
"manufacturer": "BQ",
"category": "Other",
"file_formats": "text/x-gcode",
"platform": "bq_witbox_platform.stl",
"platform_offset": [0, -145, -38]
},
"overrides": {
"machine_start_gcode": {
"default_value": "; -- START GCODE --\nM800 ; Custom GCODE to fire start print procedure\n; -- end of START GCODE --"
},
"machine_end_gcode": {
"default_value": "; -- END GCODE --\nM801 ; Custom GCODE to fire end print procedure\n; -- end of END GCODE --"
},
"machine_width": {
"default_value": 297
},
"machine_depth": {
"default_value": 210
},
"machine_height": {
"default_value": 200
},
"machine_heated_bed": {
"default_value": false
},
"machine_center_is_zero": {
"default_value": false
},
"machine_gcode_flavor": {
"default_value": "RepRap"
},
"material_print_temperature": {
"default_value": 210
},
"material_bed_temperature": {
"default_value": 0
},
"material_diameter": {
"default_value": 1.75
},
"layer_height": {
"default_value": 0.2
},
"layer_height_0": {
"default_value": 0.2
},
"wall_line_count": {
"default_value": 3
},
"wall_thickness": {
"default_value": 1.2
},
"top_bottom_thickness": {
"default_value": 1.2
},
"infill_sparse_density": {
"default_value": 20
},
"infill_overlap": {
"default_value": 15
},
"speed_print": {
"default_value": 60
},
"speed_travel": {
"default_value": 160
},
"speed_layer_0": {
"default_value": 30
},
"speed_wall_x": {
"default_value": 35
},
"speed_wall_0": {
"default_value": 30
},
"speed_infill": {
"default_value": 80
},
"speed_topbottom": {
"default_value": 35
},
"skirt_speed": {
"default_value": 35
},
"skirt_line_count": {
"default_value": 4
},
"skirt_minimal_length": {
"default_value": 30
},
"skirt_gap": {
"default_value": 6
},
"cool_fan_full_at_height": {
"default_value": 0.4
},
"support_enable": {
"default_value": false
}
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,59 @@
{
"id": "grr_neo",
"version": 2,
"name": "German RepRap Neo",
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "Simon Cor",
"manufacturer": "German RepRap",
"category": "Other",
"file_formats": "text/x-gcode",
"icon": "icon_ultimaker.png",
"platform": "grr_neo_platform.stl"
},
"overrides": {
"machine_width": {
"default_value": 150
},
"machine_height": {
"default_value": 150
},
"machine_depth": {
"default_value": 150
},
"machine_center_is_zero": {
"default_value": false
},
"machine_nozzle_size": {
"default_value": 0.5
},
"machine_nozzle_heat_up_speed": {
"default_value": 2
},
"machine_nozzle_cool_down_speed": {
"default_value": 2
},
"machine_head_polygon": {
"default_value": [
[-75, -18],
[-75, 35],
[18, 35],
[18, -18]
]
},
"gantry_height": {
"default_value": 55
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
},
"machine_start_gcode": {
"default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..."
},
"machine_end_gcode": {
"default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning"
}
}
}

View file

@ -0,0 +1,99 @@
{
"id": "innovo-inventor",
"version": 2,
"name": "Innovo INVENTOR",
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "Adam Rumjahn",
"manufacturer": "Innovo",
"category": "Other",
"file_formats": "text/x-gcode",
"platform": "inventor_platform.stl",
"platform_offset": [-180, -0.25, 160]
},
"overrides": {
"machine_width": {
"default_value": 340
},
"machine_height": {
"default_value": 290
},
"machine_depth": {
"default_value": 300
},
"machine_heated_bed": {
"default_value": true
},
"machine_center_is_zero": {
"default_value": false
},
"machine_nozzle_size": {
"default_value": 0.4
},
"machine_head_polygon": {
"default_value": [
[-43.7, -19.2],
[-43.7, 55],
[43.7, 55],
[43.7, -19.2]
]
},
"gantry_height": {
"default_value": 82.3
},
"machine_nozzle_offset_x": {
"default_value": 0
},
"machine_nozzle_offset_y": {
"default_value": 15
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
},
"machine_start_gcode": {
"default_value": "G28 ; Home extruder\nM107 ; Turn off fan\nG90 ; Absolute positioning\nM82 ; Extruder in absolute mode\n{IF_BED}M190 S{BED}\n{IF_EXT0}M104 T0 S{TEMP0}\n{IF_EXT0}M109 T0 S{TEMP0}\n{IF_EXT1}M104 T1 S{TEMP1}\n{IF_EXT1}M109 T1 S{TEMP1}\nG32 S3 ; auto level\nG92 E0 ; Reset extruder position"
},
"machine_end_gcode": {
"default_value": "M104 S0\nG91 ; relative positioning\nG1 E-2 F5000; retract 2mm\nG28 Z; move bed down\nG90 ; absolute positioning\nM84 ; disable motors"
},
"layer_height": {
"default_value": 0.15
},
"wall_thickness": {
"default_value": 0.8
},
"top_bottom_thickness": {
"default_value": 0.3
},
"material_print_temperature": {
"default_value": 215
},
"material_bed_temperature": {
"default_value": 60
},
"material_diameter": {
"default_value": 1.75
},
"speed_print": {
"default_value": 60
},
"speed_infill": {
"default_value": 100
},
"speed_topbottom": {
"default_value": 30
},
"speed_travel": {
"default_value": 150
},
"speed_layer_0": {
"default_value": 30.0,
"minimum_value": 0.1
},
"infill_overlap": {
"default_value": 10.0
}
}
}

View file

@ -0,0 +1,57 @@
{
"id": "m180",
"version": 2,
"name": "Malyan M180",
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "Ruben Dulek",
"manufacturer": "Malyan",
"category": "Other",
"file_formats": "application/x3g"
},
"overrides": {
"machine_width": {
"default_value": 230
},
"machine_height": {
"default_value": 165
},
"machine_depth": {
"default_value": 145
},
"machine_center_is_zero": {
"default_value": true
},
"machine_nozzle_size": {
"default_value": 0.4,
"minimum_value": "0.001"
},
"machine_head_with_fans_polygon": {
"default_value": [
[ -75, 35 ],
[ -75, -18 ],
[ 18, -18 ],
[ 18, 35 ]
]
},
"gantry_height": {
"default_value": 55
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
},
"machine_start_gcode": {
"default_value": "M136\nM73 P0\nM103\nG21\nG90\nM320\n;(**** begin homing ****)\nG162 X Y F4000\nG161 Z F3500\nG92 Z-5\nG1 Z0.0\nG161 Z F100\nM132 X Y Z A B\n;(**** end homing ****)\nG92 X147 Y66 Z5\nG1 X105 Y-60 Z10 F4000.0\nG130 X127 Y127 A127 B127\nG0 X105 Y-60\nG1 Z0.3 F300\nG92 E0\nG1 X100 E10 F300\nG92 E0\nG1 Z0.0 F300\nM320"
},
"machine_end_gcode": {
"default_value": "G92 Z0\nG1 Z10 F400\nM18\nM109 S0 T0\nM104 S0 T0\nM73 P100 (end build progress)\nG162 X Y F3000\nM18"
},
"material_diameter": {
"default_value": 1.75,
"minimum_value_warning": "1.5",
"maximum_value_warning": "2.0"
}
}
}

View file

@ -0,0 +1,176 @@
{
"id": "maker_starter",
"version": 2,
"name": "3DMaker Starter",
"inherits": "fdmprinter",
"metadata": {
"author": "tvlgiao",
"manufacturer": "3DMaker",
"category": "Other",
"file_formats": "text/x-gcode;application/x-stl-ascii;application/x-stl-binary;application/x-wavefront-obj",
"icon": "icon_ultimaker2.png",
"platform": "makerstarter_platform.stl"
},
"overrides": {
"machine_width": {
"default_value": 210
},
"machine_depth": {
"default_value": 185
},
"machine_height": {
"default_value": 200
},
"machine_heated_bed": {
"default_value": false
},
"machine_center_is_zero": {
"default_value": false
},
"machine_nozzle_size": {
"default_value": 0.4
},
"machine_nozzle_heat_up_speed": {
"default_value": 2
},
"machine_nozzle_cool_down_speed": {
"default_value": 2
},
"gantry_height": {
"default_value": 55
},
"machine_gcode_flavor": {
"default_value": "RepRap"
},
"machine_disallowed_areas": {
"default_value": []
},
"machine_nozzle_tip_outer_diameter": {
"default_value": 1
},
"machine_nozzle_head_distance": {
"default_value": 3
},
"machine_nozzle_expansion_angle": {
"default_value": 45
},
"layer_height": {
"default_value": 0.2
},
"layer_height_0": {
"default_value": 0.2
},
"wall_line_count": {
"default_value": 2
},
"top_layers": {
"default_value": 4
},
"bottom_layers": {
"default_value": 4
},
"speed_print": {
"default_value": 50
},
"speed_wall": {
"default_value": 30
},
"speed_wall_0": {
"default_value": 30
},
"speed_wall_x": {
"default_value": 30
},
"speed_topbottom": {
"default_value": 50
},
"speed_support": {
"default_value": 50
},
"speed_travel": {
"default_value": 120
},
"speed_layer_0": {
"default_value": 20
},
"skirt_speed": {
"default_value": 15
},
"speed_slowdown_layers": {
"default_value": 4
},
"infill_sparse_density": {
"default_value": 20
},
"cool_fan_speed_min": {
"default_value": 50
},
"cool_fan_speed_max": {
"default_value": 100
},
"cool_fan_full_layer": {
"default_value": 4
},
"cool_min_layer_time": {
"default_value": 5
},
"cool_min_layer_time_fan_speed_max": {
"default_value": 10
},
"support_type": {
"default_value": "Everywhere"
},
"support_angle": {
"default_value": 45
},
"support_xy_distance": {
"default_value": 1
},
"support_z_distance": {
"default_value": 0.2
},
"support_top_distance": {
"default_value": 0.2
},
"support_bottom_distance": {
"default_value": 0.24
},
"support_pattern": {
"default_value": "ZigZag"
},
"support_infill_rate": {
"default_value": 15
},
"adhesion_type": {
"default_value": "Raft"
},
"skirt_minimal_length": {
"default_value": 100
},
"raft_base_line_spacing": {
"default_value": 2
},
"raft_base_thickness": {
"default_value": 0.3
},
"raft_base_line_width": {
"default_value": 2
},
"raft_base_speed": {
"default_value": 15
},
"raft_interface_thickness": {
"default_value": 0.24
},
"raft_interface_line_width": {
"default_value": 0.6
},
"raft_airgap": {
"default_value": 0.2
},
"raft_surface_layers": {
"default_value": 2
}
}
}

View file

@ -0,0 +1,65 @@
{
"id": "prusa_i3",
"version": 2,
"name": "Prusa i3",
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "Quillford",
"manufacturer": "Prusajr",
"category": "Other",
"file_formats": "text/x-gcode",
"icon": "icon_ultimaker2",
"platform": "prusai3_platform.stl"
},
"overrides": {
"machine_heated_bed": {
"default_value": true
},
"machine_width": {
"default_value": 200
},
"machine_height": {
"default_value": 200
},
"machine_depth": {
"default_value": 200
},
"machine_center_is_zero": {
"default_value": false
},
"machine_nozzle_size": {
"default_value": 0.4
},
"material_diameter": {
"default_value": 1.75
},
"machine_nozzle_heat_up_speed": {
"default_value": 2
},
"machine_nozzle_cool_down_speed": {
"default_value": 2
},
"machine_head_polygon": {
"default_value": [
[-75, -18],
[-75, 35],
[18, 35],
[18, -18]
]
},
"gantry_height": {
"default_value": 55
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
},
"machine_start_gcode": {
"default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..."
},
"machine_end_gcode": {
"default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning"
}
}
}

View file

@ -0,0 +1,65 @@
{
"id": "prusa_i3_xl",
"version": 2,
"name": "Prusa i3 xl",
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "guigashm",
"manufacturer": "Prusajr",
"category": "Other",
"file_formats": "text/x-gcode",
"icon": "icon_ultimaker2.png",
"platform": "prusai3_xl_platform.stl"
},
"overrides": {
"machine_heated_bed": {
"default_value": true
},
"machine_width": {
"default_value": 200
},
"machine_height": {
"default_value": 200
},
"machine_depth": {
"default_value": 270
},
"machine_center_is_zero": {
"default_value": false
},
"machine_nozzle_size": {
"default_value": 0.4
},
"material_diameter": {
"default_value": 1.75
},
"machine_nozzle_heat_up_speed": {
"default_value": 2.0
},
"machine_nozzle_cool_down_speed": {
"default_value": 2.0
},
"machine_head_polygon": {
"default_value": [
[-75, -18],
[-75, 35],
[18, 35],
[18, -18]
]
},
"gantry_height": {
"default_value": 55
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
},
"machine_start_gcode": {
"default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..."
},
"machine_end_gcode": {
"default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning"
}
}
}

View file

@ -0,0 +1,102 @@
{
"id": "rigidbot",
"version": 2,
"name": "RigidBot",
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "RBC",
"manufacturer": "RigidBot",
"category": "Other",
"file_formats": "text/x-gcode",
"platform": "rigidbot_platform.stl"
},
"overrides": {
"machine_width": {
"default_value": 254
},
"machine_depth": {
"default_value": 254
},
"machine_height": {
"default_value": 254
},
"machine_heated_bed": {
"default_value": true
},
"machine_nozzle_heat_up_speed": {
"default_value": 2
},
"machine_nozzle_cool_down_speed": {
"default_value": 2
},
"gantry_height": {
"default_value": 0
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
},
"machine_start_gcode": {
"default_value": ";Sliced at: {day} {date} {time}\n;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {infill_sparse_density}\n;Print time: {print_time}\n;Filament used: {filament_amount}m {filament_weight}g\n;Filament cost: {filament_cost}\n;M190 S{print_bed_temperature} ;Uncomment to add your own bed temperature line\n;M109 S{print_temperature} ;Uncomment to add your own temperature line\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nM205 X8 ;X/Y Jerk settings\nG1 Z15.0 F{travel_speed} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E7 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\n;Put printing message on LCD screen\nM117 Rigibot Printing..."
},
"machine_end_gcode": {
"default_value": ";End GCode\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+10 E-1 X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y230 F3000 ;move Y so the head is out of the way and Plate is moved forward\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}"
},
"layer_height": {
"default_value": 0.2
},
"wall_thickness": {
"default_value": 0.8
},
"top_bottom_thickness": {
"default_value": 0.3
},
"material_print_temperature": {
"default_value": 195
},
"material_bed_temperature": {
"default_value": 60
},
"material_diameter": {
"default_value": 1.75
},
"speed_print": {
"default_value": 60
},
"speed_infill": {
"default_value": 100
},
"speed_topbottom": {
"default_value": 15
},
"speed_travel": {
"default_value": 150
},
"speed_layer_0": {
"default_value": 15,
"minimum_value": "0.1"
},
"infill_overlap": {
"default_value": 10
},
"cool_fan_enabled": {
"default_value": false
},
"cool_fan_speed": {
"default_value": 0
},
"skirt_line_count": {
"default_value": 3,
"enabled": "adhesion_type == \"Skirt\""
},
"skirt_gap": {
"default_value": 4,
"enabled": "adhesion_type == \"Skirt\""
},
"skirt_minimal_length": {
"default_value": 200,
"enabled": "adhesion_type == \"Skirt\""
}
}
}

View file

@ -0,0 +1,105 @@
{
"id": "rigidbotbig",
"version": 2,
"name": "RigidBotBig",
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "RBC",
"manufacturer": "RigidBot",
"category": "Other",
"file_formats": "text/x-gcode",
"platform": "rigidbotbig_platform.stl"
},
"overrides": {
"machine_width": {
"default_value": 400
},
"machine_depth": {
"default_value": 300
},
"machine_height": {
"default_value": 254
},
"machine_heated_bed": {
"default_value": true
},
"machine_nozzle_size": {
"default_value": 0.4
},
"machine_nozzle_heat_up_speed": {
"default_value": 2
},
"machine_nozzle_cool_down_speed": {
"default_value": 2
},
"gantry_height": {
"default_value": 0
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
},
"machine_start_gcode": {
"default_value": ";Sliced at: {day} {date} {time}\n;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {infill_sparse_density}\n;Print time: {print_time}\n;Filament used: {filament_amount}m {filament_weight}g\n;Filament cost: {filament_cost}\n;M190 S{print_bed_temperature} ;Uncomment to add your own bed temperature line\n;M109 S{print_temperature} ;Uncomment to add your own temperature line\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nM205 X8 ;X/Y Jerk settings\nG1 Z15.0 F{travel_speed} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E7 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\n;Put printing message on LCD screen\nM117 Rigibot Printing..."
},
"machine_end_gcode": {
"default_value": ";End GCode\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+10 E-1 X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y230 F3000 ;move Y so the head is out of the way and Plate is moved forward\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}"
},
"layer_height": {
"default_value": 0.2
},
"wall_thickness": {
"default_value": 0.8
},
"top_bottom_thickness": {
"default_value": 0.3
},
"material_print_temperature": {
"default_value": 195
},
"material_bed_temperature": {
"default_value": 60
},
"material_diameter": {
"default_value": 1.75
},
"speed_print": {
"default_value": 60
},
"speed_infill": {
"default_value": 100
},
"speed_topbottom": {
"default_value": 15
},
"speed_travel": {
"default_value": 150
},
"speed_layer_0": {
"default_value": 15,
"minimum_value": "0.1"
},
"infill_overlap": {
"default_value": 10
},
"cool_fan_enabled": {
"default_value": false
},
"cool_fan_speed": {
"default_value": 0
},
"skirt_line_count": {
"default_value": 3,
"enabled": "adhesion_type == \"Skirt\""
},
"skirt_gap": {
"default_value": 4,
"enabled": "adhesion_type == \"Skirt\""
},
"skirt_minimal_length": {
"default_value": 200,
"enabled": "adhesion_type == \"Skirt\""
}
}
}

View file

@ -0,0 +1,14 @@
{
"id": "ultimaker_base",
"version": 2,
"visible": false,
"name": "Ultimaker",
"inherits": "fdmprinter",
"metadata": {
"author": "Ultimaker",
"manufacturer": "Ultimaker",
"preferred_profile": "Normal Quality",
"preferred_nozzle": "0.4 mm",
"preferred_material": "PLA"
}
}

View file

@ -0,0 +1,108 @@
{
"id": "ultimaker2",
"version": 2,
"name": "Ultimaker 2",
"inherits": "ultimaker",
"metadata": {
"visible": true,
"author": "Ultimaker",
"manufacturer": "Ultimaker",
"category": "Ultimaker",
"file_formats": "text/x-gcode",
"icon": "icon_ultimaker2.png",
"platform": "ultimaker2_platform.obj",
"platform_texture": "Ultimaker2backplate.png",
"platform_offset": [9, 0, 0]
},
"overrides": {
"machine_start_gcode" : {
"default_value": ""
},
"machine_end_gcode" : {
"default_value": ""
},
"machine_width": {
"default_value": 223
},
"machine_depth": {
"default_value": 223
},
"machine_height": {
"default_value": 205
},
"machine_heated_bed": {
"default_value": true
},
"machine_head_with_fans_polygon":
{
"default_value": [
[ -42, 12 ],
[ -42, -32 ],
[ 62, 12 ],
[ 62, -32 ]
]
},
"machine_center_is_zero": {
"default_value": false
},
"machine_nozzle_size": {
"default_value": 0.4,
"minimum_value": "0.001"
},
"machine_nozzle_heat_up_speed": {
"default_value": 2
},
"machine_nozzle_cool_down_speed": {
"default_value": 2
},
"gantry_height": {
"default_value": 55
},
"machine_use_extruder_offset_to_offset_coords": {
"default_value": true
},
"machine_gcode_flavor": {
"default_value": "UltiGCode"
},
"machine_disallowed_areas": {
"default_value": [
[[-115, 112.5], [ -82, 112.5], [ -84, 102.5], [-115, 102.5]],
[[ 115, 112.5], [ 115, 102.5], [ 110, 102.5], [ 108, 112.5]],
[[-115, -112.5], [-115, -104.5], [ -84, -104.5], [ -82, -112.5]],
[[ 115, -112.5], [ 108, -112.5], [ 110, -104.5], [ 115, -104.5]]
]},
"machine_nozzle_tip_outer_diameter": {
"default_value": 1
},
"machine_nozzle_head_distance": {
"default_value": 3
},
"machine_nozzle_expansion_angle": {
"default_value": 45
},
"material_print_temperature": {
"enabled": "False"
},
"material_bed_temperature": {
"enabled": "False"
},
"material_diameter": {
"enabled": "False"
},
"material_flow": {
"enabled": "False"
},
"retraction_amount": {
"enabled": "False"
},
"retraction_speed": {
"enabled": "False"
},
"retraction_retract_speed": {
"enabled": "False"
},
"retraction_prime_speed": {
"enabled": "False"
}
}
}

View file

@ -0,0 +1,21 @@
{
"id": "ultimaker2_extended",
"version": 2,
"name": "Ultimaker 2 Extended",
"inherits": "ultimaker2",
"metadata": {
"author": "Ultimaker",
"manufacturer": "Ultimaker",
"category": "Ultimaker",
"file_formats": "text/x-gcode",
"icon": "icon_ultimaker2.png",
"platform": "ultimaker2_platform.obj",
"platform_texture": "Ultimaker2Extendedbackplate.png"
},
"overrides": {
"machine_height": {
"default_value": 315
}
}
}

View file

@ -0,0 +1,30 @@
{
"id": "ultimaker2_extended_plus",
"version": 2,
"name": "Ultimaker 2 Extended+",
"inherits": "ultimaker2_plus",
"visible": false,
"metadata": {
"author": "Ultimaker",
"manufacturer": "Ultimaker",
"category": "Ultimaker",
"file_formats": "text/x-gcode",
"platform": "ultimaker2_platform.obj",
"platform_texture": "Ultimaker2ExtendedPlusbackplate.png"
},
"overrides": {
"machine_height": {
"default_value": 313
},
"machine_show_variants": {
"default_value": true
},
"machine_nozzle_head_distance": {
"default_value": 5
},
"machine_nozzle_expansion_angle": {
"default_value": 45
}
}
}

View file

@ -0,0 +1,39 @@
{
"id": "ultimaker2_go",
"version": 2,
"name": "Ultimaker 2 Go",
"inherits": "ultimaker2",
"metadata": {
"author": "Ultimaker",
"manufacturer": "Ultimaker",
"category": "Ultimaker",
"file_formats": "text/x-gcode",
"icon": "icon_ultimaker2.png",
"platform": "ultimaker2go_platform.obj",
"platform_texture": "Ultimaker2Gobackplate.png",
"platform_offset": [0, 0, 0]
},
"overrides": {
"machine_width": {
"default_value": 120
},
"machine_depth": {
"default_value": 120
},
"machine_height": {
"default_value": 115
},
"machine_heated_bed": {
"default_value": false
},
"machine_disallowed_areas": {
"default_value": [
[[-60, 60], [-33, 60], [-35, 52], [-60, 52]],
[[ 60, 60], [ 60, 52], [ 35, 52], [ 33, 60]],
[[-60, -60], [-60, -52], [-35, -52], [-33, -60]],
[[ 60, -60], [ 33, -60], [ 35, -52], [ 60, -52]]
]
}
}
}

View file

@ -0,0 +1,74 @@
{
"id": "ultimaker2_plus",
"version": 2,
"name": "Ultimaker 2+",
"inherits": "ultimaker2",
"visible": "false",
"metadata": {
"author": "Ultimaker",
"manufacturer": "Ultimaker",
"category": "Ultimaker",
"file_formats": "text/x-gcode",
"platform": "ultimaker2_platform.obj",
"platform_texture": "Ultimaker2Plusbackplate.png",
"preferred_variant": "ultimaker2_plus_0.4",
"preferred_material": "pla",
"preferred_quality": "high"
},
"overrides": {
"speed_infill": {
"value": "speed_print"
},
"speed_wall_x": {
"value": "speed_wall"
},
"layer_height_0": {
"value": "round(machine_nozzle_size / 1.5, 2)"
},
"line_width": {
"value": "round(machine_nozzle_size * 0.875, 2)"
},
"speed_layer_0": {
"default_value": 20
},
"speed_support": {
"value": "speed_wall_0"
},
"machine_height": {
"default_value": 203
},
"machine_show_variants": {
"default_value": true
},
"gantry_height": {
"default_value": 52
},
"machine_nozzle_head_distance": {
"default_value": 5
},
"machine_nozzle_expansion_angle": {
"default_value": 45
},
"machine_heat_zone_length": {
"default_value": 20
},
"machine_head_with_fans_polygon":
{
"default_value": [
[ -44, 14 ],
[ -44, -34 ],
[ 64, 14 ],
[ 64, -34 ]
]
},
"machine_disallowed_areas": {
"default_value": [
[[-115, 112.5], [ -78, 112.5], [ -80, 102.5], [-115, 102.5]],
[[ 115, 112.5], [ 115, 102.5], [ 105, 102.5], [ 103, 112.5]],
[[-115, -112.5], [-115, -104.5], [ -84, -104.5], [ -82, -112.5]],
[[ 115, -112.5], [ 108, -112.5], [ 110, -104.5], [ 115, -104.5]]
]
}
}
}

View file

@ -0,0 +1,68 @@
{
"id": "ultimaker_original",
"version": 2,
"name": "Ultimaker Original",
"inherits": "ultimaker",
"metadata": {
"author": "Ultimaker",
"manufacturer": "Ultimaker",
"category": "Ultimaker",
"file_formats": "text/x-gcode",
"icon": "icon_ultimaker.png",
"platform": "ultimaker_platform.stl",
"pages": [
"SelectUpgradedParts",
"UpgradeFirmware",
"UltimakerCheckup",
"BedLeveling"
]
},
"overrides": {
"machine_width": {
"default_value": 205
},
"machine_height": {
"default_value": 200
},
"machine_depth": {
"default_value": 205
},
"machine_center_is_zero": {
"default_value": false
},
"machine_nozzle_size": {
"default_value": 0.4
},
"machine_nozzle_heat_up_speed": {
"default_value": 2
},
"machine_nozzle_cool_down_speed": {
"default_value": 2
},
"machine_head_with_fans_polygon":
{
"default_value": [
[ -75, 35 ],
[ -75, -18 ],
[ 18, 35 ],
[ 18, -18 ]
]
},
"gantry_height": {
"default_value": 55
},
"machine_use_extruder_offset_to_offset_coords": {
"default_value": true
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
},
"machine_start_gcode": {
"default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E6 ;extrude 6 mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..."
},
"machine_end_gcode": {
"default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning"
}
}
}

View file

@ -0,0 +1,26 @@
{
"id": "ultimaker_original_plus",
"version": 2,
"name": "Ultimaker Original+",
"inherits": "ultimaker_original",
"metadata": {
"author": "Ultimaker",
"manufacturer": "Ultimaker",
"category": "Ultimaker",
"file_formats": "text/x-gcode",
"icon": "icon_ultimaker.png",
"platform": "ultimaker2_platform.obj",
"platform_texture": "UltimakerPlusbackplate.png",
"pages": [
"UpgradeFirmware",
"UltimakerCheckup",
"BedLeveling"
]
},
"overrides": {
"machine_heated_bed": {
"default_value": true
}
}
}

View file

@ -0,0 +1,55 @@
{
"id": "uniqbot_one",
"version": 2,
"name": "Uniqbot",
"inherits": "fdmprinter",
"metadata": {
"author": "Unimatech",
"manufacturer": "Unimatech",
"category": "Other",
"file_formats": "text/x-gcode",
"icon": "icon_ultimaker2.png"
},
"overrides": {
"machine_heated_bed": {
"default_value": false
},
"machine_width": {
"default_value": 140
},
"machine_height": {
"default_value": 120
},
"machine_depth": {
"default_value": 160
},
"machine_center_is_zero": {
"default_value": false
},
"machine_nozzle_size": {
"default_value": 0.5
},
"material_diameter": {
"default_value": 1.75
},
"machine_nozzle_heat_up_speed": {
"default_value": 2
},
"machine_nozzle_cool_down_speed": {
"default_value": 2
},
"gantry_height": {
"default_value": 55
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
},
"machine_start_gcode": {
"default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..."
},
"machine_end_gcode": {
"default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning"
}
}
}

View file

@ -0,0 +1,9 @@
[general]
version = 2
name = high
definition = fdmprinter
[metadata]
type = quality
[values]

View file

@ -0,0 +1,9 @@
[general]
version = 2
name = normal
definition = fdmprinter
[metadata]
type = quality
[values]

View file

@ -1,57 +0,0 @@
{
"id": "rigidbot",
"version": 1,
"name": "RigidBot",
"manufacturer": "Other",
"author": "RBC",
"platform": "rigidbot_platform.stl",
"file_formats": "text/x-gcode",
"inherits": "fdmprinter.json",
"machine_settings": {
"machine_width": { "default": 254 },
"machine_depth": { "default": 254 },
"machine_height": { "default": 254 },
"machine_heated_bed": { "default": true },
"machine_nozzle_size": { "default": 0.4,
"visible": true
},
"machine_nozzle_heat_up_speed": { "default": 2.0 },
"machine_nozzle_cool_down_speed": { "default": 2.0 },
"machine_head_shape_min_x": { "default": 0 },
"machine_head_shape_min_y": { "default": 0 },
"machine_head_shape_max_x": { "default": 0 },
"machine_head_shape_max_y": { "default": 0 },
"machine_nozzle_gantry_distance": { "default": 0 },
"machine_gcode_flavor": { "default": "RepRap (Marlin/Sprinter)" },
"machine_start_gcode": {
"default": ";Sliced at: {day} {date} {time}\n;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {infill_sparse_density}\n;Print time: {print_time}\n;Filament used: {filament_amount}m {filament_weight}g\n;Filament cost: {filament_cost}\n;M190 S{print_bed_temperature} ;Uncomment to add your own bed temperature line\n;M109 S{print_temperature} ;Uncomment to add your own temperature line\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nM205 X8 ;X/Y Jerk settings\nG1 Z15.0 F{travel_speed} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E7 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\n;Put printing message on LCD screen\nM117 Rigibot Printing..."
},
"machine_end_gcode": {
"default": ";End GCode\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+10 E-1 X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y230 F3000 ;move Y so the head is out of the way and Plate is moved forward\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}"
}
},
"overrides": {
"layer_height": { "default": 0.2 },
"wall_thickness": { "default": 0.8 },
"top_bottom_thickness": { "default": 0.3, "visible": true },
"material_print_temperature": { "default": 195, "visible": true },
"material_bed_temperature": { "default": 60, "visible": true },
"material_diameter": { "default": 1.75, "visible": true },
"speed_print": { "default": 60.0, "visible": true },
"speed_infill": { "default": 100.0, "visible": true },
"speed_topbottom": { "default": 15.0, "visible": true },
"speed_travel": { "default": 150.0, "visible": true },
"speed_layer_0": { "min_value": "0.1", "default": 15.0, "visible": true },
"infill_overlap": { "default": 10.0 },
"cool_fan_enabled": { "default": false, "visible": true },
"cool_fan_speed": { "default": 0.0, "visible": true },
"skirt_line_count": { "default": 3, "active_if": { "setting": "adhesion_type", "value": "None" } },
"skirt_gap": { "default": 4.0, "active_if": { "setting": "adhesion_type", "value": "None" } },
"skirt_minimal_length": { "default": 200.0, "active_if": { "setting": "adhesion_type", "value": "None" } }
}
}

View file

@ -1,55 +0,0 @@
{
"id": "rigidbotbig",
"version": 1,
"name": "RigidBotBig",
"manufacturer": "Other",
"author": "RBC",
"platform": "rigidbotbig_platform.stl",
"file_formats": "text/x-gcode",
"inherits": "fdmprinter.json",
"machine_settings": {
"machine_width": { "default": 400 },
"machine_depth": { "default": 300 },
"machine_height": { "default": 254 },
"machine_heated_bed": { "default": true },
"machine_nozzle_size": { "default": 0.4},
"machine_nozzle_heat_up_speed": { "default": 2.0 },
"machine_nozzle_cool_down_speed": { "default": 2.0 },
"machine_head_shape_min_x": { "default": 0 },
"machine_head_shape_min_y": { "default": 0 },
"machine_head_shape_max_x": { "default": 0 },
"machine_head_shape_max_y": { "default": 0 },
"machine_nozzle_gantry_distance": { "default": 0 },
"machine_gcode_flavor": { "default": "RepRap (Marlin/Sprinter)" },
"machine_start_gcode": {
"default": ";Sliced at: {day} {date} {time}\n;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {infill_sparse_density}\n;Print time: {print_time}\n;Filament used: {filament_amount}m {filament_weight}g\n;Filament cost: {filament_cost}\n;M190 S{print_bed_temperature} ;Uncomment to add your own bed temperature line\n;M109 S{print_temperature} ;Uncomment to add your own temperature line\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nM205 X8 ;X/Y Jerk settings\nG1 Z15.0 F{travel_speed} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E7 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\n;Put printing message on LCD screen\nM117 Rigibot Printing..."
},
"machine_end_gcode": {
"default": ";End GCode\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+10 E-1 X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y230 F3000 ;move Y so the head is out of the way and Plate is moved forward\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}"
}
},
"overrides": {
"layer_height": { "default": 0.2 },
"wall_thickness": { "default": 0.8 },
"top_bottom_thickness": { "default": 0.3, "visible": true },
"material_print_temperature": { "default": 195, "visible": true },
"material_bed_temperature": { "default": 60, "visible": true },
"material_diameter": { "default": 1.75, "visible": true },
"speed_print": { "default": 60.0, "visible": true},
"speed_infill": { "default": 100.0, "visible": true },
"speed_topbottom": { "default": 15.0, "visible": true },
"speed_travel": { "default": 150.0, "visible": true },
"speed_layer_0": { "min_value": "0.1", "default": 15.0, "visible": true },
"infill_overlap": { "default": 10.0 },
"cool_fan_enabled": { "default": false, "visible": true},
"cool_fan_speed": { "default": 0.0, "visible": true },
"skirt_line_count": { "default": 3, "active_if": { "setting": "adhesion_type", "value": "None" } },
"skirt_gap": { "default": 4.0, "active_if": { "setting": "adhesion_type", "value": "None" } },
"skirt_minimal_length": { "default": 200.0, "active_if": { "setting": "adhesion_type", "value": "None" } }
}
}

View file

@ -1,55 +0,0 @@
{
"id": "bq_hephestos",
"version": 1,
"name": "BQ Prusa i3 Hephestos",
"manufacturer": "Other",
"author": "BQ",
"platform": "bq_hephestos_platform.stl",
"file_formats": "text/x-gcode",
"inherits": "fdmprinter.json",
"overrides": {
"machine_start_gcode": {
"default": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --"
},
"machine_end_gcode": {
"default": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG1 Z10 ;move extruder up 10 mm\nG90 ;set to absolute positioning\nG1 X0 Y180 F1200 ;expose the platform\nM84 ;turn off steppers\n; -- end of END GCODE --"
},
"machine_width": {
"default": 215
},
"machine_depth": {
"default": 210
},
"machine_height": {
"default": 180
},
"machine_heated_bed": {
"default": false
},
"machine_center_is_zero": {
"default": false
},
"machine_gcode_flavor": {
"default": "RepRap"
},
"machine_platform_offset": {
"default": [0, -82, 0]
},
"layer_height": { "default": 0.2 },
"layer_height_0": { "default": 0.2, "visible": false },
"wall_thickness": { "default": 1.0, "visible": false },
"top_bottom_thickness": { "default": 1.0, "visible": false},
"bottom_thickness": { "default": 1.0, "visible": false },
"material_print_temperature": { "default": 220, "visible": true },
"material_bed_temperature": { "default": 0, "visible": false },
"material_diameter": { "default": 1.75, "visible": true },
"speed_print": { "default": 40.0},
"speed_infill": { "default": 40.0, "visible": true },
"speed_wall": { "default": 35.0, "visible": true},
"speed_topbottom": { "default": 35.0, "visible": true },
"speed_travel": { "default": 120.0 },
"speed_layer_0": { "default": 20.0, "visible": false },
"support_enable": { "default": true }
}
}

View file

@ -1,59 +0,0 @@
{
"id": "bq_hephestos_2",
"version": 1,
"name": "BQ Hephestos 2",
"manufacturer": "Other",
"author": "BQ",
"platform": "bq_hephestos_2_platform.stl",
"file_formats": "text/x-gcode",
"inherits": "fdmprinter.json",
"overrides": {
"machine_start_gcode": {
"default": "; -- START GCODE --\nM800 ; Custom GCODE to fire start print procedure\n; -- end of START GCODE --"
},
"machine_end_gcode": {
"default": "; -- END GCODE --\nM801 ; Custom GCODE to fire end print procedure\n; -- end of END GCODE --"
},
"machine_width": {
"default": 210
},
"machine_depth": {
"default": 297
},
"machine_height": {
"default": 220
},
"machine_heated_bed": {
"default": false
},
"machine_center_is_zero": {
"default": false
},
"machine_platform_offset": {
"default": [6, 1320, 0]
},
"material_print_temperature": { "default": 210.0, "visible": true },
"material_bed_temperature": { "default": 0 },
"material_diameter": { "default": 1.75 },
"layer_height": { "default": 0.2 },
"layer_height_0": { "default": 0.2, "visible": true },
"wall_line_count": { "default": 3, "visible": false },
"wall_thickness": { "default": 1.2, "visible": false },
"top_bottom_thickness": { "default": 1.2, "visible": false },
"infill_sparse_density": { "default": 20.0 },
"infill_overlap": { "default": 15.0, "visible": false },
"speed_print": { "default": 60.0 },
"speed_travel": { "default": 160.0 },
"speed_layer_0": { "default": 30.0, "visible": true },
"speed_wall_x": { "default": 35.0, "visible": false },
"speed_wall_0": { "default": 30.0, "visible": false },
"speed_infill": { "default": 80.0, "visible": true },
"speed_topbottom": { "default": 35.0, "visible": false },
"skirt_speed": { "default": 35.0, "visible": false },
"skirt_line_count": { "default": 4 },
"skirt_minimal_length": { "default": 30.0, "visible": false },
"skirt_gap": { "default": 6.0 },
"cool_fan_full_at_height": { "default": 0.4, "visible": false }
}
}

View file

@ -1,55 +0,0 @@
{
"id": "bq_hephestos_xl",
"version": 1,
"name": "BQ Prusa i3 Hephestos XL",
"manufacturer": "Other",
"author": "BQ",
"platform": "bq_hephestos_platform.stl",
"file_formats": "text/x-gcode",
"inherits": "fdmprinter.json",
"overrides": {
"machine_start_gcode": {
"default": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --"
},
"machine_end_gcode": {
"default": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG1 Z10 ;move extruder up 10 mm\nG90 ;set to absolute positioning\nG1 X0 Y180 F1200 ;expose the platform\nM84 ;turn off steppers\n; -- end of END GCODE --"
},
"machine_width": {
"default": 200
},
"machine_depth": {
"default": 300
},
"machine_height": {
"default": 180
},
"machine_heated_bed": {
"default": false
},
"machine_center_is_zero": {
"default": false
},
"machine_gcode_flavor": {
"default": "RepRap"
},
"machine_platform_offset": {
"default": [0, -82, 0]
},
"layer_height": { "default": 0.2 },
"layer_height_0": { "default": 0.2, "visible": false },
"wall_thickness": { "default": 1.0, "visible": false },
"top_bottom_thickness": { "default": 1.0, "visible": false},
"bottom_thickness": { "default": 1.0, "visible": false },
"material_print_temperature": { "default": 220, "visible": true },
"material_bed_temperature": { "default": 0, "visible": false },
"material_diameter": { "default": 1.75, "visible": true },
"speed_print": { "default": 40.0},
"speed_infill": { "default": 40.0, "visible": true },
"speed_wall": { "default": 35.0, "visible": true},
"speed_topbottom": { "default": 35.0, "visible": true },
"speed_travel": { "default": 120.0 },
"speed_layer_0": { "default": 20.0, "visible": false },
"support_enable": { "default": true }
}
}

View file

@ -1,55 +0,0 @@
{
"id": "bq_witbox",
"version": 1,
"name": "BQ Witbox",
"manufacturer": "Other",
"author": "BQ",
"platform": "bq_witbox_platform.stl",
"file_formats": "text/x-gcode",
"inherits": "fdmprinter.json",
"overrides": {
"machine_start_gcode": {
"default": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --"
},
"machine_end_gcode": {
"default": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG90 ;set to absolute positioning\nG1 Z200 ;move the platform to the bottom\nG28 X0 Y0 ;move to the X/Y origin (Home)\nM84 ;turn off steppers\n; -- end of END GCODE --"
},
"machine_width": {
"default": 297
},
"machine_depth": {
"default": 210
},
"machine_height": {
"default": 200
},
"machine_heated_bed": {
"default": false
},
"machine_center_is_zero": {
"default": false
},
"machine_gcode_flavor": {
"default": "RepRap"
},
"machine_platform_offset": {
"default": [0, -145, -38]
},
"layer_height": { "default": 0.2 },
"layer_height_0": { "default": 0.2, "visible": false },
"wall_thickness": { "default": 1.0, "visible": false },
"top_bottom_thickness": { "default": 1.0, "visible": false},
"bottom_thickness": { "default": 1.0, "visible": false },
"material_print_temperature": { "default": 220, "visible": true },
"material_bed_temperature": { "default": 0, "visible": false },
"material_diameter": { "default": 1.75, "visible": true },
"speed_print": { "default": 40.0},
"speed_infill": { "default": 40.0, "visible": true },
"speed_wall": { "default": 35.0, "visible": true},
"speed_topbottom": { "default": 35.0, "visible": true },
"speed_travel": { "default": 120.0 },
"speed_layer_0": { "default": 20.0, "visible": false },
"support_enable": { "default": true }
}
}

View file

@ -1,63 +0,0 @@
{
"id": "bq_witbox_2",
"version": 1,
"name": "BQ Witbox 2",
"manufacturer": "Other",
"author": "BQ",
"platform": "bq_witbox_platform.stl",
"file_formats": "text/x-gcode",
"inherits": "fdmprinter.json",
"overrides": {
"machine_start_gcode": {
"default": "; -- START GCODE --\nM800 ; Custom GCODE to fire start print procedure\n; -- end of START GCODE --"
},
"machine_end_gcode": {
"default": "; -- END GCODE --\nM801 ; Custom GCODE to fire end print procedure\n; -- end of END GCODE --"
},
"machine_width": {
"default": 297
},
"machine_depth": {
"default": 210
},
"machine_height": {
"default": 200
},
"machine_heated_bed": {
"default": false
},
"machine_center_is_zero": {
"default": false
},
"machine_gcode_flavor": {
"default": "RepRap"
},
"machine_platform_offset": {
"default": [0, -145, -38]
},
"material_print_temperature": { "default": 210.0, "visible": true },
"material_bed_temperature": { "default": 0 },
"material_diameter": { "default": 1.75 },
"layer_height": { "default": 0.2 },
"layer_height_0": { "default": 0.2, "visible": true },
"wall_line_count": { "default": 3, "visible": false },
"wall_thickness": { "default": 1.2, "visible": false },
"top_bottom_thickness": { "default": 1.2, "visible": false },
"infill_sparse_density": { "default": 20.0 },
"infill_overlap": { "default": 15.0, "visible": false },
"speed_print": { "default": 60.0 },
"speed_travel": { "default": 160.0 },
"speed_layer_0": { "default": 30.0, "visible": true },
"speed_wall_x": { "default": 35.0, "visible": false },
"speed_wall_0": { "default": 30.0, "visible": false },
"speed_infill": { "default": 80.0, "visible": true },
"speed_topbottom": { "default": 35.0, "visible": false },
"skirt_speed": { "default": 35.0, "visible": false },
"skirt_line_count": { "default": 4 },
"skirt_minimal_length": { "default": 30.0, "visible": false },
"skirt_gap": { "default": 6.0 },
"cool_fan_full_at_height": { "default": 0.4, "visible": false },
"support_enable": { "default": false }
}
}

View file

@ -1,322 +0,0 @@
{
"version": 1,
"id": "dual_extrusion",
"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",
"visible": false,
"machine_extruder_trains": {
"0": {
"extruder_nr": { "default": 0 },
"machine_nozzle_offset_x": { "default": 0.0 },
"machine_nozzle_offset_y": { "default": 0.0 }
},
"1": {
"extruder_nr": { "default": 1 }
}
},
"machine_settings": {
"machine_use_extruder_offset_to_offset_coords": { "default": false },
"machine_nozzle_offset_x": { "default": 0, "SEE_machine_extruder_trains": true },
"machine_nozzle_offset_y": { "default": 0, "SEE_machine_extruder_trains": true },
"machine_extruder_start_code": { "default": "", "SEE_machine_extruder_trains": true },
"machine_extruder_start_pos_abs": { "default": false, "SEE_machine_extruder_trains": true },
"machine_extruder_start_pos_x": { "default": 0, "SEE_machine_extruder_trains": true },
"machine_extruder_start_pos_y": { "default": 0, "SEE_machine_extruder_trains": true },
"machine_extruder_end_pos_abs": { "default": false, "SEE_machine_extruder_trains": true },
"machine_extruder_end_pos_x": { "default": 0, "SEE_machine_extruder_trains": true },
"machine_extruder_end_pos_y": { "default": 0, "SEE_machine_extruder_trains": true },
"machine_extruder_end_code": { "default": "", "SEE_machine_extruder_trains": true }
},
"overrides": {
"speed_print": {
"children": {
"speed_prime_tower": {
"label": "Prime Tower Speed",
"description": "The speed at which the prime tower is printed. Printing the prime tower slower can make it more stable when the adhesion between the different filaments is suboptimal.",
"unit": "mm/s",
"type": "float",
"min_value": "0.1",
"max_value_warning": "150",
"default": 60,
"visible": false,
"enabled": "prime_tower_enable",
"global_only": true
}
}
},
"line_width": {
"children": {
"prime_tower_line_width": {
"label": "Prime Tower Line Width",
"description": "Width of a single prime tower line.",
"unit": "mm",
"min_value": "0.0001",
"min_value_warning": "0.2",
"max_value_warning": "5",
"default": 0.4,
"type": "float",
"visible": false,
"enabled": "prime_tower_enable",
"global_only": true
}
}
}
},
"categories": {
"dual": {
"label": "Dual Extrusion",
"visible": true,
"icon": "category_dual",
"settings": {
"extruder_nr": {
"label": "Extruder",
"description": "The extruder train used for printing. This is used in multi-extrusion.",
"type": "int",
"default": 0,
"min_value": "0",
"max_value": "machine_extruder_count - 1",
"always_visible": true
},
"adhesion_extruder_nr": {
"label": "Platform Adhesion Extruder",
"description": "The extruder train to use for printing the skirt/brim/raft. This is used in multi-extrusion.",
"type": "int",
"default": 0,
"min_value": "0",
"max_value": "machine_extruder_count - 1",
"global_only": true
},
"support_extruder_nr": {
"label": "Support Extruder",
"description": "The extruder train to use for printing the support. This is used in multi-extrusion.",
"type": "int",
"default": 0,
"min_value": "0",
"max_value": "machine_extruder_count - 1",
"global_only": true,
"children": {
"support_infill_extruder_nr": {
"label": "Support Infill Extruder",
"description": "The extruder train to use for printing the infill of the support. This is used in multi-extrusion.",
"type": "int",
"default": 0,
"min_value": "0",
"max_value": "machine_extruder_count - 1",
"global_only": true
},
"support_extruder_nr_layer_0": {
"label": "First Layer Support Extruder",
"description": "The extruder train to use for printing the first layer of support infill. This is used in multi-extrusion.",
"type": "int",
"default": 0,
"min_value": "0",
"max_value": "machine_extruder_count - 1",
"global_only": true
},
"support_roof_extruder_nr": {
"label": "Support Roof Extruder",
"description": "The extruder train to use for printing the roof of the support. This is used in multi-extrusion.",
"type": "int",
"default": 0,
"min_value": "0",
"max_value": "machine_extruder_count - 1",
"enabled": "support_roof_enable",
"global_only": true
}
}
},
"prime_tower_enable": {
"label": "Enable Prime Tower",
"description": "Print a tower next to the print which serves to prime the material after each nozzle switch.",
"type": "boolean",
"visible": true,
"default": false,
"global_only": true
},
"prime_tower_size": {
"label": "Prime Tower Size",
"description": "The width of the prime tower.",
"visible": false,
"type": "float",
"unit": "mm",
"default": 15,
"min_value": "0",
"max_value_warning": "20",
"inherit_function": "15 if prime_tower_enable else 0",
"enabled": "prime_tower_enable",
"global_only": true
},
"prime_tower_position_x": {
"label": "Prime Tower X Position",
"description": "The x position of the prime tower.",
"visible": false,
"type": "float",
"unit": "mm",
"default": 200,
"min_value_warning": "-1000",
"max_value_warning": "1000",
"enabled": "prime_tower_enable",
"global_only": true
},
"prime_tower_position_y": {
"label": "Prime Tower Y Position",
"description": "The y position of the prime tower.",
"visible": false,
"type": "float",
"unit": "mm",
"default": 200,
"min_value_warning": "-1000",
"max_value_warning": "1000",
"enabled": "prime_tower_enable",
"global_only": true
},
"prime_tower_flow": {
"label": "Prime Tower Flow",
"description": "Flow compensation: the amount of material extruded is multiplied by this value.",
"visible": false,
"unit": "%",
"default": 100,
"type": "float",
"min_value": "5",
"min_value_warning": "50",
"max_value_warning": "150",
"enabled": "prime_tower_enable",
"global_only": true
},
"prime_tower_wipe_enabled": {
"label": "Wipe Nozzle on Prime tower",
"description": "After printing the prime tower with the one nozzle, wipe the oozed material from the other nozzle off on the prime tower.",
"type": "boolean",
"default": false,
"enabled": "prime_tower_enable",
"global_only": true
},
"multiple_mesh_overlap": {
"label": "Dual Extrusion Overlap",
"description": "Make the objects printed with different extruder trains overlap a bit. This makes the different materials bond together better.",
"visible": false,
"type": "float",
"unit": "mm",
"default": 0.15,
"min_value": "0",
"max_value_warning": "1.0"
},
"ooze_shield_enabled": {
"label": "Enable Ooze Shield",
"description": "Enable exterior ooze shield. This will create a shell around the object which is likely to wipe a second nozzle if it's at the same height as the first nozzle.",
"type": "boolean",
"default": false,
"global_only": true
},
"ooze_shield_angle": {
"label": "Ooze Shield Angle",
"description": "The maximum angle a part in the ooze shield will have. With 0 degrees being vertical, and 90 degrees being horizontal. A smaller angle leads to less failed ooze shields, but more material.",
"unit": "°",
"type": "float",
"min_value": "0",
"max_value": "90",
"default": 60,
"visible": false,
"enabled": "ooze_shield_enabled",
"global_only": true
},
"ooze_shield_dist": {
"label": "Ooze Shields Distance",
"description": "Distance of the ooze shield from the print, in the X/Y directions.",
"unit": "mm",
"type": "float",
"min_value": "0",
"max_value_warning": "30",
"default": 2,
"visible": false,
"enabled": "ooze_shield_enabled",
"global_only": true
}
}
},
"material": {
"settings": {
"material_standby_temperature": {
"label": "Standby Temperature",
"description": "The temperature of the nozzle when another nozzle is currently used for printing.",
"unit": "°C",
"type": "float",
"default": 150,
"min_value": "0",
"max_value_warning": "260",
"global_only": "True",
"visible": false
},
"switch_extruder_retraction_amount": {
"label": "Nozzle Switch Retraction Distance",
"description": "The amount of retraction: Set at 0 for no retraction at all. This should generally be the same as the length of the heat zone.",
"unit": "mm",
"type": "float",
"default": 20,
"min_value_warning": "0",
"max_value_warning": "100",
"visible": false,
"inherit_function": "machine_heat_zone_length",
"enabled": "retraction_enable",
"global_only": true
},
"switch_extruder_retraction_speeds": {
"label": "Nozzle Switch Retraction Speed",
"description": "The speed at which the filament is retracted. A higher retraction speed works better, but a very high retraction speed can lead to filament grinding.",
"unit": "mm/s",
"type": "float",
"default": 20,
"min_value": "0.1",
"max_value_warning": "300",
"visible": false,
"inherit": false,
"enabled": "retraction_enable",
"global_only": true,
"children": {
"switch_extruder_retraction_speed": {
"label": "Nozzle Switch Retract Speed",
"description": "The speed at which the filament is retracted during a nozzle switch retract. ",
"unit": "mm/s",
"type": "float",
"default": 20,
"min_value": "0.1",
"max_value_warning": "300",
"visible": false,
"enabled": "retraction_enable",
"global_only": true
},
"switch_extruder_prime_speed": {
"label": "Nozzle Switch Prime Speed",
"description": "The speed at which the filament is pushed back after a nozzle switch retraction.",
"unit": "mm/s",
"type": "float",
"default": 20,
"min_value": "0.1",
"max_value_warning": "300",
"visible": false,
"enabled": "retraction_enable",
"global_only": true
}
}
},
"switch_extruder_retraction_hop": {
"label": "Nozzle Switch Z Hop",
"description": "Whenever the machine switches to another nozzle, the build plate is lowered to create clearance between the nozzle and the print. It prevents the nozzle which has been unused for a while from oozing material on the outside of the print.",
"unit": "mm",
"type": "float",
"default": 1.0,
"min_value_warning": "-0.0001",
"max_value_warning": "10",
"visible": false,
"inherit": false,
"enabled": "retraction_enable"
}
}
}
}
}

View file

@ -121,15 +121,6 @@
"default": [], "default": [],
"global_only": true "global_only": true
}, },
"machine_platform_offset": {
"description": "Where to display the platform mesh.",
"default": [
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 (fan caps excluded).",
"type": "polygon", "type": "polygon",

View file

@ -1,37 +0,0 @@
{
"id": "grr_neo",
"version": 1,
"name": "German RepRap Neo",
"manufacturer": "Other",
"author": "Other",
"icon": "icon_ultimaker.png",
"platform": "grr_neo_platform.stl",
"file_formats": "text/x-gcode",
"inherits": "fdmprinter.json",
"visible": "true",
"overrides": {
"machine_width": { "default": 150 },
"machine_height": { "default": 150 },
"machine_depth": { "default": 150 },
"machine_center_is_zero": { "default": false },
"machine_nozzle_size": { "default": 0.5 },
"machine_nozzle_heat_up_speed": { "default": 2.0 },
"machine_nozzle_cool_down_speed": { "default": 2.0 },
"machine_head_shape_min_x": { "default": 75 },
"machine_head_shape_min_y": { "default": 18 },
"machine_head_shape_max_x": { "default": 18 },
"machine_head_shape_max_y": { "default": 35 },
"machine_nozzle_gantry_distance": { "default": 55 },
"machine_gcode_flavor": { "default": "RepRap (Marlin/Sprinter)" },
"machine_start_gcode": {
"default": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..."
},
"machine_end_gcode": {
"default": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning"
},
"material_bed_temperature": { "visible": false }
}
}

View file

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

View file

@ -1,39 +0,0 @@
{
"id": "m180",
"version": 1,
"name": "Malyan M180",
"manufacturer": "Other",
"icon": "icon_ultimaker.png",
"platform": "",
"file_formats": "application/x3g",
"inherits": "fdmprinter.json",
"machine_settings": {
"machine_width": { "default": 230 },
"machine_height": { "default": 165 },
"machine_depth": { "default": 145 },
"machine_center_is_zero": { "default": true },
"machine_nozzle_size": { "default": 0.4, "min_value": "0.001" },
"machine_head_with_fans_polygon": {
"default": [
[ -75, 35 ],
[ -75, -18 ],
[ 18, -18 ],
[ 18, 35 ]
]
},
"gantry_height": { "default": 55 },
"machine_gcode_flavor": { "default": "RepRap (Marlin/Sprinter)" },
"machine_start_gcode": { "default": "M136\nM73 P0\nM103\nG21\nG90\nM320\n;(**** begin homing ****)\nG162 X Y F4000\nG161 Z F3500\nG92 Z-5\nG1 Z0.0\nG161 Z F100\nM132 X Y Z A B\n;(**** end homing ****)\nG92 X147 Y66 Z5\nG1 X105 Y-60 Z10 F4000.0\nG130 X127 Y127 A127 B127\nG0 X105 Y-60\nG1 Z0.3 F300\nG92 E0\nG1 X100 E10 F300\nG92 E0\nG1 Z0.0 F300\nM320" },
"machine_end_gcode": { "default": "G92 Z0\nG1 Z10 F400\nM18\nM109 S0 T0\nM104 S0 T0\nM73 P100 (end build progress)\nG162 X Y F3000\nM18" }
},
"overrides": {
"material_bed_temperature": { "visible": "True" },
"material_diameter": {
"default": 1.75,
"min_value_warning": "1.5",
"max_value_warning": "2.0"
}
}
}

View file

@ -1,81 +0,0 @@
{
"id": "maker_starter",
"version": 1,
"name": "3DMaker Starter",
"manufacturer": "Other",
"author": "Other",
"icon": "icon_ultimaker2.png",
"platform": "makerstarter_platform.stl",
"file_formats": "text/x-gcode;application/x-stl-ascii;application/x-stl-binary;application/x-wavefront-obj",
"inherits": "fdmprinter.json",
"overrides": {
"machine_width": { "default": 210 },
"machine_depth": { "default": 185 },
"machine_height": { "default": 200 },
"machine_heated_bed": { "default": false },
"machine_center_is_zero": { "default": false },
"machine_nozzle_size": { "default": 0.4 },
"machine_nozzle_heat_up_speed": { "default": 2.0 },
"machine_nozzle_cool_down_speed": { "default": 2.0 },
"machine_head_shape_min_x": { "default": 0 },
"machine_head_shape_min_y": { "default": 0 },
"machine_head_shape_max_x": { "default": 0 },
"machine_head_shape_max_y": { "default": 0 },
"machine_nozzle_gantry_distance": { "default": 55 },
"machine_gcode_flavor": { "default": "RepRap" },
"machine_disallowed_areas": { "default": []},
"machine_platform_offset": { "default": [0.0, 0.0, 0.0] },
"machine_nozzle_tip_outer_diameter": { "default": 1.0 },
"machine_nozzle_head_distance": { "default": 3.0 },
"machine_nozzle_expansion_angle": { "default": 45 },
"layer_height": { "default": 0.2 },
"layer_height_0": { "default": 0.2, "visible": false },
"wall_line_count": { "default": 2, "visible": true },
"top_layers": { "default": 4, "visible": true },
"bottom_layers": { "default": 4, "visible": true },
"material_print_temperature": { "visible": false },
"material_bed_temperature": { "visible": false },
"material_diameter": { "default": 1.75, "visible": false },
"material_flow": { "visible": false },
"speed_print": { "default": 50.0 },
"speed_wall": { "default": 30.0 },
"speed_wall_0": { "default": 30.0 },
"speed_wall_x": { "default": 30.0 },
"speed_topbottom": { "default": 50.0 },
"speed_support": { "default": 50.0 },
"speed_travel": { "default": 120.0 },
"speed_layer_0": { "default": 20.0 },
"skirt_speed": { "default": 15.0 },
"speed_slowdown_layers": { "default": 4 },
"infill_sparse_density": { "default": 20.0 },
"cool_fan_speed_min": { "default": 50.0 },
"cool_fan_speed_max": { "default": 100.0 },
"cool_fan_full_layer": { "default": 4, "visible": true },
"cool_min_layer_time": { "default": 5.0 },
"cool_min_layer_time_fan_speed_max": { "default": 10.0 },
"support_type": { "default": "Everywhere" },
"support_angle": { "default": 45.0, "visible": true },
"support_xy_distance": { "default": 1 },
"support_z_distance": { "default": 0.2 },
"support_top_distance": { "default": 0.2 },
"support_bottom_distance": { "default": 0.24 },
"support_pattern": { "default": "ZigZag" },
"support_infill_rate": { "default": 15, "visible": true },
"adhesion_type": { "default": "Raft" },
"skirt_minimal_length": { "default": 100.0 },
"raft_base_line_spacing": { "default": 2.0 },
"raft_base_thickness": { "default": 0.3 },
"raft_base_line_width": { "default": 2.0 },
"raft_base_speed": { "default": 15.0 },
"raft_interface_thickness": { "default": 0.24 },
"raft_interface_line_width": { "default": 0.6 },
"raft_airgap": { "default": 0.2 },
"raft_surface_layers": { "default": 2 }
}
}

View file

@ -1,36 +0,0 @@
{
"id": "prusa_i3",
"version": 1,
"name": "Prusa i3",
"manufacturer": "Other",
"author": "Other",
"icon": "icon_ultimaker2.png",
"platform": "prusai3_platform.stl",
"file_formats": "text/x-gcode",
"inherits": "fdmprinter.json",
"overrides": {
"machine_heated_bed": { "default": true },
"machine_width": { "default": 200 },
"machine_height": { "default": 200 },
"machine_depth": { "default": 200 },
"machine_center_is_zero": { "default": false },
"machine_nozzle_size": { "default": 0.4 },
"material_diameter": { "default": 1.75 },
"machine_nozzle_heat_up_speed": { "default": 2.0 },
"machine_nozzle_cool_down_speed": { "default": 2.0 },
"machine_head_shape_min_x": { "default": 75 },
"machine_head_shape_min_y": { "default": 18 },
"machine_head_shape_max_x": { "default": 18 },
"machine_head_shape_max_y": { "default": 35 },
"machine_nozzle_gantry_distance": { "default": 55 },
"machine_gcode_flavor": { "default": "RepRap (Marlin/Sprinter)" },
"machine_start_gcode": {
"default": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..."
},
"machine_end_gcode": {
"default": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning"
}
}
}

View file

@ -1,36 +0,0 @@
{
"id": "prusa_i3_xl",
"version": 1,
"name": "Prusa i3 xl",
"manufacturer": "Other",
"author": "Other",
"icon": "icon_ultimaker2.png",
"platform": "prusai3_xl_platform.stl",
"file_formats": "text/x-gcode",
"inherits": "fdmprinter.json",
"overrides": {
"machine_heated_bed": { "default": true },
"machine_width": { "default": 200 },
"machine_height": { "default": 200 },
"machine_depth": { "default": 270 },
"machine_center_is_zero": { "default": false },
"machine_nozzle_size": { "default": 0.4 },
"material_diameter": { "default": 1.75 },
"machine_nozzle_heat_up_speed": { "default": 2.0 },
"machine_nozzle_cool_down_speed": { "default": 2.0 },
"machine_head_shape_min_x": { "default": 75 },
"machine_head_shape_min_y": { "default": 18 },
"machine_head_shape_max_x": { "default": 18 },
"machine_head_shape_max_y": { "default": 35 },
"machine_nozzle_gantry_distance": { "default": 55 },
"machine_gcode_flavor": { "default": "RepRap (Marlin/Sprinter)" },
"machine_start_gcode": {
"default": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..."
},
"machine_end_gcode": {
"default": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning"
}
}
}

View file

@ -1,15 +0,0 @@
{
"id": "ultimaker_base",
"version": 1,
"visible": false,
"name": "Ultimaker",
"manufacturer": "Ultimaker",
"author": "Ultimaker",
"inherits": "fdmprinter.json",
"machine_preferences": {
"prefered_profile": "Normal Quality",
"prefered_variant": "0.4 mm",
"prefered_material": "PLA"
}
}

View file

@ -1,95 +0,0 @@
{
"id": "ultimaker2",
"version": 1,
"name": "Ultimaker 2",
"manufacturer": "Ultimaker",
"author": "Ultimaker",
"icon": "icon_ultimaker2.png",
"platform": "ultimaker2_platform.obj",
"platform_texture": "Ultimaker2backplate.png",
"file_formats": "text/x-gcode",
"inherits": "ultimaker.json",
"machine_extruder_trains": {
"0": {
"machine_nozzle_heat_up_speed": {
"default": 2.0
},
"machine_nozzle_cool_down_speed": {
"default": 2.0
},
"machine_nozzle_tip_outer_diameter": {
"default": 1
},
"machine_nozzle_head_distance": {
"default": 3
},
"machine_nozzle_expansion_angle": {
"default": 45
},
"machine_heat_zone_length": {
"default": 16
}
}
},
"machine_settings": {
"machine_start_gcode" : { "default": "" },
"machine_end_gcode" : { "default": "" },
"machine_width": { "default": 223 },
"machine_depth": { "default": 223 },
"machine_height": { "default": 205 },
"machine_heated_bed": { "default": true },
"machine_head_with_fans_polygon":
{
"default": [
[
-42,
12
],
[
-42,
-32
],
[
62,
12
],
[
62,
-32
]
]
},
"machine_center_is_zero": { "default": false },
"machine_nozzle_size": { "default": 0.4, "min_value": "0.001"},
"machine_nozzle_heat_up_speed": { "default": 2.0 },
"machine_nozzle_cool_down_speed": { "default": 2.0 },
"gantry_height": { "default": 55 },
"machine_use_extruder_offset_to_offset_coords": { "default": true },
"machine_gcode_flavor": { "default": "UltiGCode" },
"machine_disallowed_areas": { "default": [
[[-115.0, 112.5], [ -82.0, 112.5], [ -84.0, 102.5], [-115.0, 102.5]],
[[ 115.0, 112.5], [ 115.0, 102.5], [ 110.0, 102.5], [ 108.0, 112.5]],
[[-115.0, -112.5], [-115.0, -104.5], [ -84.0, -104.5], [ -82.0, -112.5]],
[[ 115.0, -112.5], [ 108.0, -112.5], [ 110.0, -104.5], [ 115.0, -104.5]]
]},
"machine_platform_offset": { "default": [9.0, 0.0, 0.0] },
"machine_nozzle_tip_outer_diameter": { "default": 1.0 },
"machine_nozzle_head_distance": { "default": 3.0 },
"machine_nozzle_expansion_angle": { "default": 45 }
},
"overrides": {
"material_print_temperature": { "enabled": "False" },
"material_bed_temperature": { "enabled": "False" },
"material_diameter": { "enabled": "False" },
"material_flow": { "enabled": "False" },
"retraction_amount": { "enabled": "False" },
"retraction_speed": { "enabled": "False" },
"retraction_retract_speed": { "enabled": "False" },
"retraction_prime_speed": { "enabled": "False" }
}
}

View file

@ -1,16 +0,0 @@
{
"id": "ultimaker2_extended",
"version": 1,
"name": "Ultimaker 2 Extended",
"manufacturer": "Ultimaker",
"author": "Ultimaker",
"icon": "icon_ultimaker2.png",
"platform": "ultimaker2_platform.obj",
"platform_texture": "Ultimaker2Extendedbackplate.png",
"file_formats": "text/x-gcode",
"inherits": "ultimaker2.json",
"machine_settings": {
"machine_height": { "default": 315 }
}
}

View file

@ -1,19 +0,0 @@
{
"id": "ultimaker2_extended_plus_base",
"version": 1,
"name": "Ultimaker 2 Extended+",
"manufacturer": "Ultimaker",
"author": "Ultimaker",
"platform": "ultimaker2_platform.obj",
"platform_texture": "Ultimaker2ExtendedPlusbackplate.png",
"visible": false,
"file_formats": "text/x-gcode",
"inherits": "ultimaker2plus.json",
"machine_settings": {
"machine_height": { "default": 305},
"machine_show_variants": { "default": true },
"machine_nozzle_head_distance": { "default": 5 },
"machine_nozzle_expansion_angle": { "default": 45 }
}
}

View file

@ -1,17 +0,0 @@
{
"id": "ultimaker2_extended_plus",
"version": 1,
"name": "Ultimaker 2 Extended+",
"manufacturer": "Ultimaker",
"author": "Ultimaker",
"platform": "ultimaker2_platform.obj",
"platform_texture": "Ultimaker2ExtendedPlusbackplate.png",
"file_formats": "text/x-gcode",
"inherits": "ultimaker2_extended_plus.json",
"variant": "0.25 mm",
"profiles_machine": "ultimaker2plus",
"machine_settings": {
"machine_nozzle_size": { "default": 0.25 },
"machine_nozzle_tip_outer_diameter": { "default": 0.8 }
}
}

View file

@ -1,17 +0,0 @@
{
"id": "ultimaker2_extended_plus",
"version": 1,
"name": "Ultimaker 2 Extended+",
"manufacturer": "Ultimaker",
"author": "Ultimaker",
"platform": "ultimaker2_platform.obj",
"platform_texture": "Ultimaker2ExtendedPlusbackplate.png",
"file_formats": "text/x-gcode",
"inherits": "ultimaker2_extended_plus.json",
"variant": "0.4 mm",
"profiles_machine": "ultimaker2plus",
"machine_settings": {
"machine_nozzle_size": { "default": 0.40 },
"machine_nozzle_tip_outer_diameter": { "default": 1.05 }
}
}

View file

@ -1,17 +0,0 @@
{
"id": "ultimaker2_extended_plus",
"version": 1,
"name": "Ultimaker 2 Extended+",
"manufacturer": "Ultimaker",
"author": "Ultimaker",
"platform": "ultimaker2_platform.obj",
"platform_texture": "Ultimaker2ExtendedPlusbackplate.png",
"file_formats": "text/x-gcode",
"inherits": "ultimaker2_extended_plus.json",
"variant": "0.6 mm",
"profiles_machine": "ultimaker2plus",
"machine_settings": {
"machine_nozzle_size": { "default": 0.60 },
"machine_nozzle_tip_outer_diameter": { "default": 1.25 }
}
}

View file

@ -1,17 +0,0 @@
{
"id": "ultimaker2_extended_plus",
"version": 1,
"name": "Ultimaker 2 Extended+",
"manufacturer": "Ultimaker",
"author": "Ultimaker",
"platform": "ultimaker2_platform.obj",
"platform_texture": "Ultimaker2ExtendedPlusbackplate.png",
"file_formats": "text/x-gcode",
"inherits": "ultimaker2_extended_plus.json",
"variant": "0.8 mm",
"profiles_machine": "ultimaker2plus",
"machine_settings": {
"machine_nozzle_size": { "default": 0.80 },
"machine_nozzle_tip_outer_diameter": { "default": 1.35 }
}
}

View file

@ -1,26 +0,0 @@
{
"id": "ultimaker2_go",
"version": 1,
"name": "Ultimaker 2 Go",
"manufacturer": "Ultimaker",
"author": "Ultimaker",
"icon": "icon_ultimaker2.png",
"platform": "ultimaker2go_platform.obj",
"platform_texture": "Ultimaker2Gobackplate.png",
"file_formats": "text/x-gcode",
"inherits": "ultimaker2.json",
"overrides": {
"machine_width": { "default": 120 },
"machine_depth": { "default": 120 },
"machine_height": { "default": 115 },
"machine_heated_bed": { "default": false },
"machine_disallowed_areas": { "default": [
[[-60.0, 60.0], [-33.0, 60.0], [-35.0, 52.0], [-60.0, 52.0]],
[[ 60.0, 60.0], [ 60.0, 52.0], [ 35.0, 52.0], [ 33.0, 60.0]],
[[-60.0, -60.0], [-60.0, -52.0], [-35.0, -52.0], [-33.0, -60.0]],
[[ 60.0, -60.0], [ 33.0, -60.0], [ 35.0, -52.0], [ 60.0, -52.0]]
]},
"machine_platform_offset": { "default": [0.0, 0.0, 0.0] }
}
}

View file

@ -1,53 +0,0 @@
{
"id": "ultimaker2plus_base",
"version": 1,
"name": "Ultimaker 2+",
"manufacturer": "Ultimaker",
"author": "Ultimaker",
"platform": "ultimaker2_platform.obj",
"platform_texture": "Ultimaker2Plusbackplate.png",
"visible": false,
"file_formats": "text/x-gcode",
"inherits": "ultimaker2.json",
"overrides": {
"speed_infill": { "inherit_function": "speed_print" },
"speed_wall_x": { "inherit_function": "speed_wall" },
"layer_height_0": { "inherit_function": "round(machine_nozzle_size / 1.5, 2)" },
"line_width": { "inherit_function": "round(machine_nozzle_size * 0.875, 2)" },
"speed_layer_0": { "default": "20" },
"speed_support": { "inherit_function": "speed_wall_0" },
"machine_show_variants": { "default": true },
"gantry_height": { "default": 52 },
"machine_nozzle_head_distance": { "default": 5 },
"machine_nozzle_expansion_angle": { "default": 45 },
"machine_heat_zone_length": { "default": 20 },
"machine_head_with_fans_polygon":
{
"default": [
[
-44,
14
],
[
-44,
-34
],
[
64,
14
],
[
64,
-34
]
]
},
"machine_disallowed_areas": { "default": [
[[-115.0, 112.5], [ -78.0, 112.5], [ -80.0, 102.5], [-115.0, 102.5]],
[[ 115.0, 112.5], [ 115.0, 102.5], [ 105.0, 102.5], [ 103.0, 112.5]],
[[-115.0, -112.5], [-115.0, -104.5], [ -84.0, -104.5], [ -82.0, -112.5]],
[[ 115.0, -112.5], [ 108.0, -112.5], [ 110.0, -104.5], [ 115.0, -104.5]]
]}
}
}

View file

@ -1,23 +0,0 @@
{
"id": "ultimaker2plus",
"version": 1,
"name": "Ultimaker 2+",
"manufacturer": "Ultimaker",
"author": "Ultimaker",
"platform": "ultimaker2_platform.obj",
"platform_texture": "Ultimaker2Plusbackplate.png",
"file_formats": "text/x-gcode",
"inherits": "ultimaker2plus.json",
"variant": "0.25 mm",
"overrides": {
"speed_wall": { "inherit_function": "round(speed_print / 1.2, 1)" },
"speed_wall_0": { "inherit_function": "1 if speed_wall < 5 else (speed_wall - 5)" },
"speed_topbottom": { "inherit_function": "round(speed_print / 1.5, 1)" },
"machine_nozzle_size": { "default": 0.25 },
"machine_nozzle_tip_outer_diameter": { "default": 0.8 },
"coasting_volume": { "default": 0.1 },
"coasting_min_volume": { "default": 0.17 }
}
}

View file

@ -1,21 +0,0 @@
{
"id": "ultimaker2plus",
"version": 1,
"name": "Ultimaker 2+",
"manufacturer": "Ultimaker",
"author": "Ultimaker",
"platform": "ultimaker2_platform.obj",
"platform_texture": "Ultimaker2Plusbackplate.png",
"file_formats": "text/x-gcode",
"inherits": "ultimaker2plus.json",
"variant": "0.4 mm",
"overrides": {
"speed_wall": { "inherit_function": "round(speed_print / 1.25, 1)" },
"speed_wall_0": { "inherit_function": "1 if speed_wall < 10 else (speed_wall - 10)" },
"speed_topbottom": { "inherit_function": "round(speed_print / 2.25, 1)" },
"machine_nozzle_size": { "default": 0.40 },
"machine_nozzle_tip_outer_diameter": { "default": 1.05 }
}
}

View file

@ -1,22 +0,0 @@
{
"id": "ultimaker2plus",
"version": 1,
"name": "Ultimaker 2+",
"manufacturer": "Ultimaker",
"author": "Ultimaker",
"platform": "ultimaker2_platform.obj",
"platform_texture": "Ultimaker2Plusbackplate.png",
"file_formats": "text/x-gcode",
"inherits": "ultimaker2plus.json",
"variant": "0.6 mm",
"overrides": {
"speed_wall": { "inherit_function": "round(speed_print / 1.333333, 1)" },
"speed_wall_0": { "inherit_function": "1 if speed_wall < 10 else (speed_wall - 10)" },
"speed_topbottom": { "inherit_function": "round(speed_print / 2, 1)" },
"machine_nozzle_size": { "default": 0.60 },
"machine_nozzle_tip_outer_diameter": { "default": 1.25 },
"coasting_volume": { "default": 1.36 }
}
}

View file

@ -1,22 +0,0 @@
{
"id": "ultimaker2plus",
"version": 1,
"name": "Ultimaker 2+",
"manufacturer": "Ultimaker",
"author": "Ultimaker",
"platform": "ultimaker2_platform.obj",
"platform_texture": "Ultimaker2Plusbackplate.png",
"file_formats": "text/x-gcode",
"inherits": "ultimaker2plus.json",
"variant": "0.8 mm",
"overrides": {
"speed_wall": { "inherit_function": "round(speed_print / 1.333333, 1)" },
"speed_wall_0": { "inherit_function": "1 if speed_wall < 10 else (speed_wall - 10)" },
"speed_topbottom": { "inherit_function": "round(speed_print / 2, 1)" },
"machine_nozzle_size": { "default": 0.80 },
"machine_nozzle_tip_outer_diameter": { "default": 1.35 },
"coasting_volume": { "default": 3.22 }
}
}

View file

@ -1,83 +0,0 @@
{
"id": "ultimaker_original",
"version": 1,
"name": "Ultimaker Original",
"manufacturer": "Ultimaker",
"author": "Ultimaker",
"icon": "icon_ultimaker.png",
"platform": "ultimaker_platform.stl",
"file_formats": "text/x-gcode",
"inherits": "ultimaker.json",
"pages": [
"SelectUpgradedParts",
"UpgradeFirmware",
"UltimakerCheckup",
"BedLeveling"
],
"machine_extruder_trains": {
"0": {
"machine_nozzle_heat_up_speed": {
"default": 2.0
},
"machine_nozzle_cool_down_speed": {
"default": 2.0
},
"machine_nozzle_tip_outer_diameter": {
"default": 1
},
"machine_nozzle_head_distance": {
"default": 3
},
"machine_nozzle_expansion_angle": {
"default": 45
},
"machine_heat_zone_length": {
"default": 16
}
}
},
"overrides": {
"machine_width": { "default": 205 },
"machine_height": { "default": 200 },
"machine_depth": { "default": 205 },
"machine_center_is_zero": { "default": false },
"machine_nozzle_size": { "default": 0.4 },
"machine_nozzle_heat_up_speed": { "default": 2.0 },
"machine_nozzle_cool_down_speed": { "default": 2.0 },
"machine_head_with_fans_polygon":
{
"default": [
[
-75,
35
],
[
-75,
-18
],
[
18,
35
],
[
18,
-18
]
]
},
"gantry_height": { "default": 55 },
"machine_use_extruder_offset_to_offset_coords": { "default": true },
"machine_gcode_flavor": { "default": "RepRap (Marlin/Sprinter)" },
"machine_start_gcode": {
"default": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E6 ;extrude 6 mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..."
},
"machine_end_gcode": {
"default": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning"
},
"machine_extruder_drive_upgrade": { "default": false }
}
}

View file

@ -1,22 +0,0 @@
{
"id": "ultimaker_original_plus",
"version": 1,
"name": "Ultimaker Original+",
"manufacturer": "Ultimaker",
"author": "Ultimaker",
"icon": "icon_ultimaker.png",
"platform": "ultimaker2_platform.obj",
"platform_texture": "UltimakerPlusbackplate.png",
"file_formats": "text/x-gcode",
"inherits": "ultimaker_original.json",
"pages": [
"UpgradeFirmware",
"UltimakerCheckup",
"BedLeveling"
],
"overrides": {
"machine_heated_bed": { "default": true }
}
}

View file

@ -1,31 +0,0 @@
{
"id": "uniqbot_one",
"version": 1,
"name": "Uniqbot",
"manufacturer": "Other",
"author": "Unimatech",
"icon": "icon_ultimaker2.png",
"file_formats": "text/x-gcode",
"inherits": "fdmprinter.json",
"overrides": {
"machine_heated_bed": { "default": false },
"machine_width": { "default": 140 },
"machine_height": { "default": 120 },
"machine_depth": { "default": 160 },
"machine_center_is_zero": { "default": false },
"machine_nozzle_size": { "default": 0.5 },
"material_diameter": { "default": 1.75 },
"machine_nozzle_heat_up_speed": { "default": 2.0 },
"machine_nozzle_cool_down_speed": { "default": 2.0 },
"machine_nozzle_gantry_distance": { "default": 55 },
"machine_gcode_flavor": { "default": "RepRap (Marlin/Sprinter)" },
"machine_start_gcode": {
"default": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..."
},
"machine_end_gcode": {
"default": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning"
}
}
}

View file

@ -0,0 +1,12 @@
[general]
version = 2
name = ABS
definition = fdmprinter
[metadata]
type = material
[values]
material_print_temperature = 250
material_bed_temperature = 80
material_flow = 107

View file

@ -0,0 +1,11 @@
[general]
version = 2
name = CPE
definition = fdmprinter
[metadata]
type = material
[values]
material_print_temperature = 250
material_bed_temperature = 70

View file

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Generic PLA profile. Serves as an example file, data in this file is not correct.
-->
<fdmmaterial xmlns="http://www.ultimaker.com/material">
<metadata>
<name>
<brand>Generic</brand>
<material>PLA</material>
<color>Generic</color>
</name>
<GUID>506c9f0d-e3aa-4bd4-b2d2-23e2425b1aa9</GUID>
<version>0</version>
<color_code>#FFFFFF</color_code>
</metadata>
<properties>
<density>1.3</density>
<diameter>2.85</diameter>
</properties>
<settings>
<setting key="print temperature">210</setting>
<setting key="heated bed temperature">60</setting>
<setting key="standby temperature">175</setting>
<machine>
<machine_identifier manufacturer="Ultimaker" product="Ultimaker2+"/>
<machine_identifier manufacturer="Ultimaker" product="Ultimaker2extended+"/>
<setting key="standby temperature">150</setting>
<setting key="processing temperature graph">
<point flow="2" temperature="180"/>
<point flow="10" temperature="230"/>
</setting>
</machine>
<machine>
<machine_identifier manufacturer="Ultimaker" product="Ultimaker Original"/>
<machine_identifier manufacturer="Ultimaker" product="Ultimaker Original+"/>
<setting key="standby temperature">150</setting>
<hotend id="0.8mm">
<setting key="standby temperature">80</setting>
</hotend>
<hotend id="0.6mm">
<setting key="standby temperature">100</setting>
</hotend>
</machine>
</settings>
</fdmmaterial>

View file

@ -0,0 +1,10 @@
[general]
version = 2
name = PLA
definition = fdmprinter
[metadata]
type = material
[values]
material_bed_temperature = 60

View file

@ -1,6 +1,8 @@
// Copyright (c) 2015 Ultimaker B.V. // Copyright (c) 2015 Ultimaker B.V.
// Cura is released under the terms of the AGPLv3 or higher. // Cura is released under the terms of the AGPLv3 or higher.
pragma Singleton
import QtQuick 2.2 import QtQuick 2.2
import QtQuick.Controls 1.1 import QtQuick.Controls 1.1
import UM 1.1 as UM import UM 1.1 as UM
@ -45,6 +47,8 @@ Item
property alias toggleFullScreen: toggleFullScreenAction; property alias toggleFullScreen: toggleFullScreenAction;
property alias configureSettingVisibility: configureSettingVisibilityAction
UM.I18nCatalog{id: catalog; name:"cura"} UM.I18nCatalog{id: catalog; name:"cura"}
Action Action
@ -60,6 +64,8 @@ Item
text: catalog.i18nc("@action:inmenu menubar:edit","&Undo"); text: catalog.i18nc("@action:inmenu menubar:edit","&Undo");
iconName: "edit-undo"; iconName: "edit-undo";
shortcut: StandardKey.Undo; shortcut: StandardKey.Undo;
onTriggered: UM.OperationStack.undo();
enabled: UM.OperationStack.canUndo;
} }
Action Action
@ -68,6 +74,8 @@ Item
text: catalog.i18nc("@action:inmenu menubar:edit","&Redo"); text: catalog.i18nc("@action:inmenu menubar:edit","&Redo");
iconName: "edit-redo"; iconName: "edit-redo";
shortcut: StandardKey.Redo; shortcut: StandardKey.Redo;
onTriggered: UM.OperationStack.redo();
enabled: UM.OperationStack.canRedo;
} }
Action Action
@ -103,6 +111,7 @@ Item
id: updateProfileAction; id: updateProfileAction;
enabled: UM.ActiveProfile.valid && !UM.ActiveProfile.readOnly && UM.ActiveProfile.hasCustomisedValues enabled: UM.ActiveProfile.valid && !UM.ActiveProfile.readOnly && UM.ActiveProfile.hasCustomisedValues
text: catalog.i18nc("@action:inmenu menubar:profile","&Update Current Profile"); text: catalog.i18nc("@action:inmenu menubar:profile","&Update Current Profile");
onTriggered: UM.ActiveProfile.updateProfile();
} }
Action Action
@ -110,6 +119,7 @@ Item
id: resetProfileAction; id: resetProfileAction;
enabled: UM.ActiveProfile.valid && UM.ActiveProfile.hasCustomisedValues enabled: UM.ActiveProfile.valid && UM.ActiveProfile.hasCustomisedValues
text: catalog.i18nc("@action:inmenu menubar:profile","&Reload Current Profile"); text: catalog.i18nc("@action:inmenu menubar:profile","&Reload Current Profile");
onTriggered: UM.ActiveProfile.discardChanges();
} }
Action Action
@ -132,12 +142,14 @@ Item
text: catalog.i18nc("@action:inmenu menubar:help","Show Online &Documentation"); text: catalog.i18nc("@action:inmenu menubar:help","Show Online &Documentation");
iconName: "help-contents"; iconName: "help-contents";
shortcut: StandardKey.Help; shortcut: StandardKey.Help;
onTriggered: CuraActions.openDocumentation();
} }
Action { Action {
id: reportBugAction; id: reportBugAction;
text: catalog.i18nc("@action:inmenu menubar:help","Report a &Bug"); text: catalog.i18nc("@action:inmenu menubar:help","Report a &Bug");
iconName: "tools-report-bug"; iconName: "tools-report-bug";
onTriggered: CuraActions.openBugReportPage();
} }
Action Action
@ -154,6 +166,7 @@ Item
enabled: UM.Controller.toolsEnabled; enabled: UM.Controller.toolsEnabled;
iconName: "edit-delete"; iconName: "edit-delete";
shortcut: StandardKey.Delete; shortcut: StandardKey.Delete;
onTriggered: Printer.deleteSelection();
} }
Action Action
@ -177,6 +190,7 @@ Item
enabled: UM.Scene.numObjectsSelected > 1 ? true: false enabled: UM.Scene.numObjectsSelected > 1 ? true: false
iconName: "object-group" iconName: "object-group"
shortcut: "Ctrl+G"; shortcut: "Ctrl+G";
onTriggered: Printer.groupSelected();
} }
Action Action
@ -186,6 +200,7 @@ Item
enabled: UM.Scene.isGroupSelected enabled: UM.Scene.isGroupSelected
iconName: "object-ungroup" iconName: "object-ungroup"
shortcut: "Ctrl+Shift+G"; shortcut: "Ctrl+Shift+G";
onTriggered: Printer.ungroupSelected();
} }
Action Action
@ -195,6 +210,7 @@ Item
enabled: UM.Scene.numObjectsSelected > 1 ? true: false enabled: UM.Scene.numObjectsSelected > 1 ? true: false
iconName: "merge"; iconName: "merge";
shortcut: "Ctrl+Alt+G"; shortcut: "Ctrl+Alt+G";
onTriggered: Printer.mergeSelected();
} }
Action Action
@ -211,6 +227,7 @@ Item
enabled: UM.Controller.toolsEnabled; enabled: UM.Controller.toolsEnabled;
iconName: "edit-delete"; iconName: "edit-delete";
shortcut: "Ctrl+D"; shortcut: "Ctrl+D";
onTriggered: Printer.deleteAll();
} }
Action Action
@ -218,18 +235,21 @@ Item
id: reloadAllAction; id: reloadAllAction;
text: catalog.i18nc("@action:inmenu menubar:file","Re&load All Objects"); text: catalog.i18nc("@action:inmenu menubar:file","Re&load All Objects");
iconName: "document-revert"; iconName: "document-revert";
onTriggered: Printer.reloadAll();
} }
Action Action
{ {
id: resetAllTranslationAction; id: resetAllTranslationAction;
text: catalog.i18nc("@action:inmenu menubar:edit","Reset All Object Positions"); text: catalog.i18nc("@action:inmenu menubar:edit","Reset All Object Positions");
onTriggered: Printer.resetAllTranslation();
} }
Action Action
{ {
id: resetAllAction; id: resetAllAction;
text: catalog.i18nc("@action:inmenu menubar:edit","Reset All Object &Transformations"); text: catalog.i18nc("@action:inmenu menubar:edit","Reset All Object &Transformations");
onTriggered: Printer.resetAll();
} }
Action Action
@ -247,4 +267,10 @@ Item
iconName: "view-list-text"; iconName: "view-list-text";
shortcut: StandardKey.WhatsThis; shortcut: StandardKey.WhatsThis;
} }
Action
{
id: configureSettingVisibilityAction
text: catalog.i18nc("@action:menu", "Configure setting visiblity...");
}
} }

View file

@ -0,0 +1,178 @@
// Copyright (c) 2016 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.Layouts 1.1
import QtQuick.Window 2.1
import QtQuick.Controls.Styles 1.1
import UM 1.2 as UM
import Cura 1.0 as Cura
UM.Dialog
{
id: base
title: catalog.i18nc("@title:window", "Add Printer")
property string activeManufacturer: "Ultimaker";
function getMachineName()
{
var name = machineList.model.getItem(machineList.currentIndex).name
return name
}
ScrollView
{
id: machinesHolder
anchors
{
left: parent.left;
top: parent.top;
right: parent.right;
bottom: parent.bottom;
}
ListView
{
id: machineList
model: UM.DefinitionContainersModel
{
id: machineDefinitionsModel
filter: {"visible":true}
}
section.property: "manufacturer"
section.delegate: Button
{
text: section
style: ButtonStyle
{
background: Rectangle
{
border.width: 0
color: "transparent";
height: UM.Theme.getSize("standard_list_lineheight").height
width: machineList.width
}
label: Label
{
anchors.left: parent.left
anchors.leftMargin: UM.Theme.getSize("standard_arrow").width + UM.Theme.getSize("default_margin").width
text: control.text
color: palette.windowText
font.bold: true
UM.RecolorImage
{
id: downArrow
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.left
anchors.rightMargin: UM.Theme.getSize("default_margin").width
width: UM.Theme.getSize("standard_arrow").width
height: UM.Theme.getSize("standard_arrow").height
sourceSize.width: width
sourceSize.height: width
color: palette.windowText
source: base.activeManufacturer == section ? UM.Theme.getIcon("arrow_bottom") : UM.Theme.getIcon("arrow_right")
}
}
}
onClicked:
{
base.activeManufacturer = section;
machineList.currentIndex = machineList.model.find("manufacturer", section)
machineName.text = getMachineName()
}
}
delegate: RadioButton
{
id: machineButton
anchors.left: parent.left
anchors.leftMargin: UM.Theme.getSize("standard_list_lineheight").width
opacity: 1;
height: UM.Theme.getSize("standard_list_lineheight").height;
checked: ListView.isCurrentItem;
exclusiveGroup: printerGroup;
text: model.name
onClicked:
{
ListView.view.currentIndex = index;
machineName.text = getMachineName()
}
states: State
{
name: "collapsed";
when: base.activeManufacturer != model.manufacturer;
PropertyChanges { target: machineButton; opacity: 0; height: 0; }
}
transitions:
[
Transition
{
to: "collapsed";
SequentialAnimation
{
NumberAnimation { property: "opacity"; duration: 75; }
NumberAnimation { property: "height"; duration: 75; }
}
},
Transition
{
from: "collapsed";
SequentialAnimation
{
NumberAnimation { property: "height"; duration: 75; }
NumberAnimation { property: "opacity"; duration: 75; }
}
}
]
}
}
}
TextField
{
id: machineName;
text: getMachineName()
implicitWidth: UM.Theme.getSize("standard_list_input").width
maximumLength: 40
anchors.bottom:parent.bottom
}
Button
{
text:"save"
anchors.bottom: parent.bottom
anchors.right: parent.right
onClicked:
{
base.visible = false
var item = machineList.model.getItem(machineList.currentIndex);
Cura.MachineManager.addMachine(machineName.text, item.id)
}
}
Item
{
UM.I18nCatalog
{
id: catalog;
name: "cura";
}
SystemPalette { id: palette }
ExclusiveGroup { id: printerGroup; }
}
}

View file

@ -7,7 +7,10 @@ import QtQuick.Controls.Styles 1.1
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
import QtQuick.Dialogs 1.1 import QtQuick.Dialogs 1.1
import UM 1.1 as UM import UM 1.2 as UM
import Cura 1.0 as Cura
import "."
UM.MainWindow UM.MainWindow
{ {
@ -53,7 +56,7 @@ UM.MainWindow
title: catalog.i18nc("@title:menu menubar:toplevel","&File"); title: catalog.i18nc("@title:menu menubar:toplevel","&File");
MenuItem { MenuItem {
action: actions.open; action: Actions.open;
} }
Menu Menu
@ -115,11 +118,11 @@ UM.MainWindow
} }
} }
MenuItem { action: actions.reloadAll; } MenuItem { action: Actions.reloadAll; }
MenuSeparator { } MenuSeparator { }
MenuItem { action: actions.quit; } MenuItem { action: Actions.quit; }
} }
Menu Menu
@ -127,17 +130,17 @@ UM.MainWindow
//: Edit menu //: Edit menu
title: catalog.i18nc("@title:menu menubar:toplevel","&Edit"); title: catalog.i18nc("@title:menu menubar:toplevel","&Edit");
MenuItem { action: actions.undo; } MenuItem { action: Actions.undo; }
MenuItem { action: actions.redo; } MenuItem { action: Actions.redo; }
MenuSeparator { } MenuSeparator { }
MenuItem { action: actions.deleteSelection; } MenuItem { action: Actions.deleteSelection; }
MenuItem { action: actions.deleteAll; } MenuItem { action: Actions.deleteAll; }
MenuItem { action: actions.resetAllTranslation; } MenuItem { action: Actions.resetAllTranslation; }
MenuItem { action: actions.resetAll; } MenuItem { action: Actions.resetAll; }
MenuSeparator { } MenuSeparator { }
MenuItem { action: actions.groupObjects;} MenuItem { action: Actions.groupObjects;}
MenuItem { action: actions.mergeObjects;} MenuItem { action: Actions.mergeObjects;}
MenuItem { action: actions.unGroupObjects;} MenuItem { action: Actions.unGroupObjects;}
} }
Menu Menu
@ -168,14 +171,17 @@ UM.MainWindow
Instantiator Instantiator
{ {
model: UM.MachineInstancesModel { } model: UM.ContainerStacksModel
{
filter: {"type": "machine"}
}
MenuItem MenuItem
{ {
text: model.name; text: model.name;
checkable: true; checkable: true;
checked: model.active; checked: Cura.MachineManager.activeMachineId == model.id
exclusiveGroup: machineMenuGroup; exclusiveGroup: machineSelectionMenuGroup;
onTriggered: UM.MachineManager.setActiveMachineInstance(model.name) onTriggered: Cura.MachineManager.setActiveMachine(model.id);
} }
onObjectAdded: machineMenu.insertItem(index, object) onObjectAdded: machineMenu.insertItem(index, object)
onObjectRemoved: machineMenu.removeItem(object) onObjectRemoved: machineMenu.removeItem(object)
@ -187,13 +193,20 @@ UM.MainWindow
Instantiator Instantiator
{ {
model: UM.MachineVariantsModel { } model: UM.InstanceContainersModel
{
filter:
{
"type": "variant",
"definition": Cura.MachineManager.activeDefinitionId //Only show variants of this machine
}
}
MenuItem { MenuItem {
text: model.name; text: model.name;
checkable: true; checkable: true;
checked: model.active; checked: model.id == Cura.MachineManager.activeVariantId;
exclusiveGroup: machineVariantsGroup; exclusiveGroup: machineVariantsGroup;
onTriggered: UM.MachineManager.setActiveMachineVariant(model.name) onTriggered: Cura.MachineManager.setActiveVariant(model.id)
} }
onObjectAdded: machineMenu.insertItem(index, object) onObjectAdded: machineMenu.insertItem(index, object)
onObjectRemoved: machineMenu.removeItem(object) onObjectRemoved: machineMenu.removeItem(object)
@ -201,10 +214,10 @@ UM.MainWindow
ExclusiveGroup { id: machineVariantsGroup; } ExclusiveGroup { id: machineVariantsGroup; }
MenuSeparator { visible: UM.MachineManager.hasVariants; } MenuSeparator { visible: Cura.MachineManager.hasVariants; }
MenuItem { action: actions.addMachine; } MenuItem { action: Actions.addMachine; }
MenuItem { action: actions.configureMachines; } MenuItem { action: Actions.configureMachines; }
} }
Menu Menu
@ -215,7 +228,7 @@ UM.MainWindow
Instantiator Instantiator
{ {
id: profileMenuInstantiator id: profileMenuInstantiator
model: UM.ProfilesModel {} // model: UM.ProfilesModel {}
property int separatorIndex: -1 property int separatorIndex: -1
Loader { Loader {
@ -277,11 +290,11 @@ UM.MainWindow
MenuSeparator { id: profileMenuSeparator } MenuSeparator { id: profileMenuSeparator }
MenuItem { action: actions.updateProfile; } MenuItem { action: Actions.updateProfile; }
MenuItem { action: actions.resetProfile; } MenuItem { action: Actions.resetProfile; }
MenuItem { action: actions.addProfile; } MenuItem { action: Actions.addProfile; }
MenuSeparator { } MenuSeparator { }
MenuItem { action: actions.manageProfiles; } MenuItem { action: Actions.manageProfiles; }
} }
Menu Menu
@ -292,7 +305,7 @@ UM.MainWindow
Instantiator Instantiator
{ {
model: UM.Models.extensionModel model: UM.ExtensionModel { }
Menu Menu
{ {
@ -323,7 +336,7 @@ UM.MainWindow
//: Settings menu //: Settings menu
title: catalog.i18nc("@title:menu menubar:toplevel","&Settings"); title: catalog.i18nc("@title:menu menubar:toplevel","&Settings");
MenuItem { action: actions.preferences; } MenuItem { action: Actions.preferences; }
} }
Menu Menu
@ -331,11 +344,11 @@ UM.MainWindow
//: Help menu //: Help menu
title: catalog.i18nc("@title:menu menubar:toplevel","&Help"); title: catalog.i18nc("@title:menu menubar:toplevel","&Help");
MenuItem { action: actions.showEngineLog; } MenuItem { action: Actions.showEngineLog; }
MenuItem { action: actions.documentation; } MenuItem { action: Actions.documentation; }
MenuItem { action: actions.reportBug; } MenuItem { action: Actions.reportBug; }
MenuSeparator { } MenuSeparator { }
MenuItem { action: actions.about; } MenuItem { action: Actions.about; }
} }
} }
@ -425,7 +438,7 @@ UM.MainWindow
left: parent.left; left: parent.left;
//leftMargin: UM.Theme.getSize("loadfile_margin").width //leftMargin: UM.Theme.getSize("loadfile_margin").width
} }
action: actions.open; action: Actions.open;
} }
Image Image
@ -513,22 +526,12 @@ UM.MainWindow
width: UM.Theme.getSize("sidebar").width; width: UM.Theme.getSize("sidebar").width;
addMachineAction: actions.addMachine; addMachineAction: Actions.addMachine;
configureMachinesAction: actions.configureMachines; configureMachinesAction: Actions.configureMachines;
addProfileAction: actions.addProfile; addProfileAction: Actions.addProfile;
updateProfileAction: actions.updateProfile; updateProfileAction: Actions.updateProfile;
resetProfileAction: actions.resetProfile; resetProfileAction: Actions.resetProfile;
manageProfilesAction: actions.manageProfiles; manageProfilesAction: Actions.manageProfiles;
configureSettingsAction: Action
{
onTriggered:
{
preferences.visible = true;
preferences.setPage(2);
preferences.getCurrentItem().scrollToSection(source.key);
}
}
} }
} }
} }
@ -546,6 +549,12 @@ UM.MainWindow
//: View preferences page title //: View preferences page title
insertPage(1, catalog.i18nc("@title:tab","View"), Qt.resolvedUrl("ViewPage.qml")); insertPage(1, catalog.i18nc("@title:tab","View"), Qt.resolvedUrl("ViewPage.qml"));
insertPage(3, catalog.i18nc("@title:tab", "Printers"), Qt.resolvedUrl("MachinesPage.qml"));
insertPage(4, catalog.i18nc("@title:tab", "Materials"), Qt.resolvedUrl("Preferences/MaterialsPage.qml"));
insertPage(5, catalog.i18nc("@title:tab", "Profiles"), Qt.resolvedUrl("Preferences/ProfilesPage.qml"));
//Force refresh //Force refresh
setPage(0); setPage(0);
} }
@ -561,73 +570,16 @@ UM.MainWindow
} }
} }
Actions Connections
{ {
id: actions; target: Actions.preferences
onTriggered: preferences.visible = true
}
open.onTriggered: openDialog.open(); Connections
{
quit.onTriggered: base.visible = false; target: Actions.addProfile
onTriggered:
undo.onTriggered: UM.OperationStack.undo();
undo.enabled: UM.OperationStack.canUndo;
redo.onTriggered: UM.OperationStack.redo();
redo.enabled: UM.OperationStack.canRedo;
deleteSelection.onTriggered:
{
Printer.deleteSelection();
}
deleteObject.onTriggered:
{
if(objectContextMenu.objectId != 0)
{
Printer.deleteObject(objectContextMenu.objectId);
objectContextMenu.objectId = 0;
}
}
multiplyObject.onTriggered:
{
if(objectContextMenu.objectId != 0)
{
Printer.multiplyObject(objectContextMenu.objectId, 1);
objectContextMenu.objectId = 0;
}
}
centerObject.onTriggered:
{
if(objectContextMenu.objectId != 0)
{
Printer.centerObject(objectContextMenu.objectId);
objectContextMenu.objectId = 0;
}
}
groupObjects.onTriggered:
{
Printer.groupSelected();
}
unGroupObjects.onTriggered:
{
Printer.ungroupSelected();
}
mergeObjects.onTriggered:
{
Printer.mergeSelected();
}
deleteAll.onTriggered: Printer.deleteAll();
resetAllTranslation.onTriggered: Printer.resetAllTranslation();
resetAll.onTriggered: Printer.resetAll();
reloadAll.onTriggered: Printer.reloadAll();
addMachine.onTriggered: addMachineWizard.visible = true;
addProfile.onTriggered:
{ {
UM.MachineManager.createProfile(); UM.MachineManager.createProfile();
preferences.setPage(4); preferences.setPage(4);
@ -636,26 +588,37 @@ UM.MainWindow
// Show the renameDialog after a very short delay so the preference page has time to initiate // Show the renameDialog after a very short delay so the preference page has time to initiate
showProfileNameDialogTimer.start(); showProfileNameDialogTimer.start();
} }
updateProfile.onTriggered: UM.ActiveProfile.updateProfile(); }
resetProfile.onTriggered: UM.ActiveProfile.discardChanges();
preferences.onTriggered: preferences.visible = true; Connections
configureMachines.onTriggered: {
target: Actions.configureMachines
onTriggered:
{ {
preferences.visible = true; preferences.visible = true;
preferences.setPage(3); preferences.setPage(3);
} }
manageProfiles.onTriggered: }
Connections
{
target: Actions.manageProfiles
onTriggered:
{ {
preferences.visible = true; preferences.visible = true;
preferences.setPage(4); preferences.setPage(4);
} }
}
documentation.onTriggered: CuraActions.openDocumentation(); Connections
reportBug.onTriggered: CuraActions.openBugReportPage(); {
showEngineLog.onTriggered: engineLog.visible = true; target: Actions.configureSettingVisibility
about.onTriggered: aboutDialog.visible = true; onTriggered:
toggleFullScreen.onTriggered: base.toggleFullscreen(); {
preferences.visible = true;
preferences.setPage(2);
preferences.getCurrentItem().scrollToSection(source.key);
}
} }
Timer Timer
@ -672,31 +635,70 @@ UM.MainWindow
id: objectContextMenu; id: objectContextMenu;
property variant objectId: -1; property variant objectId: -1;
MenuItem { action: actions.centerObject; } MenuItem { action: Actions.centerObject; }
MenuItem { action: actions.deleteObject; } MenuItem { action: Actions.deleteObject; }
MenuItem { action: actions.multiplyObject; } MenuItem { action: Actions.multiplyObject; }
MenuSeparator { } MenuSeparator { }
MenuItem { action: actions.deleteAll; } MenuItem { action: Actions.deleteAll; }
MenuItem { action: actions.reloadAll; } MenuItem { action: Actions.reloadAll; }
MenuItem { action: actions.resetAllTranslation; } MenuItem { action: Actions.resetAllTranslation; }
MenuItem { action: actions.resetAll; } MenuItem { action: Actions.resetAll; }
MenuSeparator { } MenuSeparator { }
MenuItem { action: actions.groupObjects; } MenuItem { action: Actions.groupObjects; }
MenuItem { action: actions.mergeObjects; } MenuItem { action: Actions.mergeObjects; }
MenuItem { action: actions.unGroupObjects; } MenuItem { action: Actions.unGroupObjects; }
Connections
{
target: Actions.deleteObject
onTriggered:
{
if(objectContextMenu.objectId != 0)
{
Printer.deleteObject(objectContextMenu.objectId);
objectContextMenu.objectId = 0;
}
}
}
Connections
{
target: Actions.multiplyObject
onTriggered:
{
if(objectContextMenu.objectId != 0)
{
Printer.multiplyObject(objectContextMenu.objectId, 1);
objectContextMenu.objectId = 0;
}
}
}
Connections
{
target: Actions.centerObject
onTriggered:
{
if(objectContextMenu.objectId != 0)
{
Printer.centerObject(objectContextMenu.objectId);
objectContextMenu.objectId = 0;
}
}
}
} }
Menu Menu
{ {
id: contextMenu; id: contextMenu;
MenuItem { action: actions.deleteAll; } MenuItem { action: Actions.deleteAll; }
MenuItem { action: actions.reloadAll; } MenuItem { action: Actions.reloadAll; }
MenuItem { action: actions.resetAllTranslation; } MenuItem { action: Actions.resetAllTranslation; }
MenuItem { action: actions.resetAll; } MenuItem { action: Actions.resetAll; }
MenuSeparator { } MenuSeparator { }
MenuItem { action: actions.groupObjects; } MenuItem { action: Actions.groupObjects; }
MenuItem { action: actions.mergeObjects; } MenuItem { action: Actions.mergeObjects; }
MenuItem { action: actions.unGroupObjects; } MenuItem { action: Actions.unGroupObjects; }
} }
Connections Connections
@ -715,6 +717,18 @@ UM.MainWindow
} }
} }
Connections
{
target: Actions.quit
onTriggered: base.visible = false;
}
Connections
{
target: Actions.toggleFullScreen
onTriggered: base.toggleFullscreen();
}
FileDialog FileDialog
{ {
id: openDialog; id: openDialog;
@ -739,14 +753,32 @@ UM.MainWindow
} }
} }
Connections
{
target: Actions.open
onTriggered: openDialog.open()
}
EngineLog EngineLog
{ {
id: engineLog; id: engineLog;
} }
AddMachineWizard Connections
{ {
id: addMachineWizard target: Actions.showEngineLog
onTriggered: engineLog.visible = true;
}
AddMachineDialog
{
id: addMachineDialog
}
Connections
{
target: Actions.addMachine
onTriggered: addMachineDialog.visible = true;
} }
AboutDialog AboutDialog
@ -754,13 +786,19 @@ UM.MainWindow
id: aboutDialog id: aboutDialog
} }
Connections
{
target: Actions.about
onTriggered: aboutDialog.visible = true;
}
Connections Connections
{ {
target: Printer target: Printer
onRequestAddPrinter: onRequestAddPrinter:
{ {
addMachineWizard.visible = true addMachineDialog.visible = true
addMachineWizard.firstRun = false addMachineDialog.firstRun = false
} }
} }
@ -777,10 +815,9 @@ UM.MainWindow
base.visible = true; base.visible = true;
restart(); restart();
} }
else if(UM.MachineManager.activeMachineInstance == "") else if(Cura.MachineManager.activeMachineId == null || Cura.MachineManager.activeMachineId == "")
{ {
addMachineWizard.firstRun = true; addMachineDialog.open();
addMachineWizard.open();
} }
} }
} }

View file

@ -7,15 +7,16 @@ import QtQuick.Controls.Styles 1.1
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
import UM 1.1 as UM import UM 1.1 as UM
import Cura 1.0 as Cura
Rectangle { Rectangle {
id: base; id: base;
property bool activity: Printer.getPlatformActivity; property bool activity: Printer.getPlatformActivity;
property string fileBaseName property string fileBaseName
property variant activeMachineInstance: UM.MachineManager.activeMachineInstance property variant activeMachineName: Cura.MachineManager.activeMachineName
onActiveMachineInstanceChanged: onActiveMachineNameChanged:
{ {
base.createFileName() base.createFileName()
} }
@ -28,36 +29,48 @@ Rectangle {
height: childrenRect.height height: childrenRect.height
color: "transparent" color: "transparent"
function createFileName(){ function createFileName()
var splitMachineName = UM.MachineManager.activeMachineInstance.split(" ") {
var abbrMachine = '' var splitMachineName = Cura.MachineManager.activeMachineName.split(" ")
if ((UM.Preferences.getValue("cura/jobname_prefix"))) { var abbrMachine = "";
for (var i = 0; i < splitMachineName.length; i++){ if ((UM.Preferences.getValue("cura/jobname_prefix")))
if (splitMachineName[i].search(/ultimaker/i) != -1){ {
abbrMachine += 'UM' for (var i = 0; i < splitMachineName.length; i++)
{
if (splitMachineName[i].search(/ultimaker/i) != -1)
{
abbrMachine += "UM";
} }
else{ else
{
if (splitMachineName[i].charAt(0).search(/[0-9]/g) == -1) if (splitMachineName[i].charAt(0).search(/[0-9]/g) == -1)
abbrMachine += splitMachineName[i].charAt(0) {
} abbrMachine += splitMachineName[i].charAt(0);
var regExpAdditives = /[0-9\+]/g;
var resultAdditives = splitMachineName[i].match(regExpAdditives);
if (resultAdditives != null){
for (var j = 0; j < resultAdditives.length; j++){
abbrMachine += resultAdditives[j]
} }
} }
} }
printJobTextfield.text = abbrMachine + '_' + base.fileBaseName var regExpAdditives = /[0-9\+]/g;
} else { var resultAdditives = splitMachineName[i].match(regExpAdditives);
printJobTextfield.text = base.fileBaseName if (resultAdditives != null)
{
for (var j = 0; j < resultAdditives.length; j++)
{
abbrMachine += resultAdditives[j];
}
}
printJobTextfield.text = abbrMachine + "_" + base.fileBaseName;
}
else
{
printJobTextfield.text = base.fileBaseName;
} }
} }
Connections { Connections
{
target: backgroundItem target: backgroundItem
onHasMesh: { onHasMesh:
{
base.fileBaseName = name base.fileBaseName = name
} }
} }

View file

@ -0,0 +1,68 @@
// Copyright (c) 2016 Ultimaker B.V.
// Uranium is released under the terms of the AGPLv3 or higher.
import QtQuick 2.1
import QtQuick.Controls 1.1
import UM 1.2 as UM
import Cura 1.0 as Cura
UM.ManagementPage
{
id: base;
title: catalog.i18nc("@title:tab", "Printers");
property int numInstances: model.rowCount();
model: UM.ContainerStacksModel
{
filter: {"type": "machine"}
onDataChanged: numInstances = model.rowCount()
}
onAddObject: Printer.requestAddPrinter()
onRemoveObject: confirmDialog.open();
onRenameObject: renameDialog.open();
removeEnabled: numInstances > 1
renameEnabled: numInstances > 0
Flow
{
anchors.fill: parent;
spacing: UM.Theme.getSize("default_margin").height;
Label
{
text: base.currentItem && base.currentItem.name ? base.currentItem.name : ""
font: UM.Theme.getFont("large")
width: parent.width
elide: Text.ElideRight
}
Label { text: catalog.i18nc("@label", "Type"); width: parent.width * 0.2; }
Label { text: base.currentItem && base.currentItem.typeName ? base.currentItem.typeName : ""; width: parent.width * 0.7; }
UM.I18nCatalog { id: catalog; name: "uranium"; }
UM.ConfirmRemoveDialog
{
id: confirmDialog;
object: base.currentItem && base.currentItem.name ? base.currentItem.name : "";
onYes: Cura.MachineManager.removeMachine(base.currentItem.id);
}
UM.RenameDialog
{
id: renameDialog;
object: base.currentItem && base.currentItem.name ? base.currentItem.name : "";
onAccepted:
{
Cura.MachineManager.renameMachine(base.currentItem.id, newName.trim());
//Reselect current item to update details panel
var index = objectList.currentIndex
objectList.currentIndex = -1
objectList.currentIndex = index
}
}
}
}

View file

@ -0,0 +1,217 @@
// Copyright (c) 2016 Ultimaker B.V.
// Uranium is released under the terms of the AGPLv3 or higher.
import QtQuick 2.1
import QtQuick.Controls 1.1
import QtQuick.Dialogs 1.2
import UM 1.2 as UM
import Cura 1.0 as Cura
UM.ManagementPage
{
id: base;
title: catalog.i18nc("@title:tab", "Materials");
model: UM.InstanceContainersModel { filter: { "type": "material", "definition": Cura.MachineManager.activeDefinitionId } }
/*
onAddObject: { var selectedMaterial = UM.MaterialManager.createProfile(); base.selectMaterial(selectedMaterial); }
onRemoveObject: confirmDialog.open();
onRenameObject: { renameDialog.open(); renameDialog.selectText(); }
*/
// activateEnabled: false
addEnabled: false
removeEnabled: false
renameEnabled: false
scrollviewCaption: " "
detailsVisible: true
property string currency: UM.Preferences.getValue("general/currency")
Item {
UM.I18nCatalog { id: catalog; name: "cura"; }
visible: base.currentItem != null
anchors.fill: parent
Label { id: profileName; text: materialProperties.name; font: UM.Theme.getFont("large"); width: parent.width; }
TabView {
id: scrollView
anchors.left: parent.left
anchors.right: parent.right
anchors.top: profileName.bottom
anchors.topMargin: UM.Theme.getSize("default_margin").height
anchors.bottom: parent.bottom
Tab {
title: "Information"
anchors.margins: UM.Theme.getSize("default_margin").height
Flow {
id: containerGrid
width: scrollView.width;
property real columnWidth: width / 2
Label { width: parent.columnWidth; text: catalog.i18nc("@label", "Profile Type") }
Label { width: parent.columnWidth; text: materialProperties.profile_type }
Label { width: parent.columnWidth; text: catalog.i18nc("@label", "Supplier") }
Label { width: parent.columnWidth; text: materialProperties.supplier }
Label { width: parent.columnWidth; text: catalog.i18nc("@label", "Material Type") }
Label { width: parent.columnWidth; text: materialProperties.material_type }
Label { width: parent.columnWidth; text: catalog.i18nc("@label", "Color") }
Row {
width: parent.columnWidth;
spacing: UM.Theme.getSize("default_margin").width/2
Rectangle {
color: materialProperties.color_code
width: colorLabel.height
height: colorLabel.height
border.width: UM.Theme.getSize("default_lining").height
}
Label { id: colorLabel; text: materialProperties.color_name }
}
Item { width: parent.width; height: UM.Theme.getSize("default_margin").height }
Label { width: parent.width; text: "<b>" + catalog.i18nc("@label", "Properties") + "</b>" }
Label { width: parent.columnWidth; text: catalog.i18nc("@label", "Density") }
Label { width: parent.columnWidth; text: materialProperties.density }
Label { width: parent.columnWidth; text: catalog.i18nc("@label", "Diameter") }
Label { width: parent.columnWidth; text: materialProperties.diameter }
Label {
text: catalog.i18nc("@label", "Filament cost")
width: parent.columnWidth;
height: spoolCostInput.height
verticalAlignment: Text.AlignVCenter
}
Row {
width: parent.columnWidth;
Label {
text: base.currency ? base.currency + " " : " "
anchors.verticalCenter: parent.verticalCenter
}
TextField {
id: spoolCostInput
text: materialProperties.spool_cost
}
}
Label { width: parent.columnWidth; text: catalog.i18nc("@label", "Filament weight") }
Label { width: parent.columnWidth; text: materialProperties.spool_weight + " " + "g" }
Label { width: parent.columnWidth; text: catalog.i18nc("@label", "Filament length") }
Label { width: parent.columnWidth; text: materialProperties.spool_length + " " + "m" }
Label { width: parent.columnWidth; text: catalog.i18nc("@label", "Cost per meter") }
Label { width: parent.columnWidth; text: catalog.i18nc("@label", "approx. %1 %2/m").arg(materialProperties.cost_per_meter).arg(base.currency); }
Item { width: parent.width; height: UM.Theme.getSize("default_margin").height }
Label {
text: materialProperties.description ? "<b>" + catalog.i18nc("@label", "Information") + "</b><br>" + materialProperties.description : "";
width: parent.width
wrapMode: Text.WordWrap
}
Label {
text: materialProperties.adhesion_info ? "<b>" + catalog.i18nc("@label", "Adhesion") + "</b><br>" + materialProperties.adhesion_info : "";
width: parent.width
wrapMode: Text.WordWrap
}
}
}
Tab {
title: catalog.i18nc("@label", "Print settings")
anchors.margins: UM.Theme.getSize("default_margin").height
Grid {
columns: 2
spacing: UM.Theme.getSize("default_margin").width
Column {
Repeater {
model: base.currentItem ? base.currentItem.settings : null
Label {
text: modelData.name.toString();
elide: Text.ElideMiddle;
}
}
}
Column {
Repeater {
model: base.currentItem ? base.currentItem.settings : null
Label { text: modelData.value.toString() + " " + modelData.unit.toString(); }
}
}
}
}
}
QtObject
{
id: materialProperties
property string name: "Unknown";
property string profile_type: "Unknown";
property string supplier: "Unknown";
property string material_type: "Unknown";
property string color_name: "Yellow";
property color color_code: "yellow";
property string density: "Unknown";
property string diameter: "Unknown";
property string spool_cost: "Unknown";
property string spool_weight: "Unknown";
property string spool_length: "Unknown";
property string cost_per_meter: "Unknown";
property string description: "";
property string adhesion_info: "";
}
}
onCurrentItemChanged:
{
if(!currentItem == null)
{
return
}
materialProperties.name = currentItem.name;
if(currentItem.metadata != undefined && currentItem.metadata != null)
{
materialProperties.supplier = currentItem.metadata.brand ? currentItem.metadata.brand : "Unknown";
materialProperties.material_type = currentItem.metadata.material ? currentItem.metadata.material : "Unknown";
materialProperties.color_name = currentItem.metadata.color_name ? currentItem.metadata.color_name : "Yellow";
materialProperties.color_code = currentItem.metadata.color_code ? currentItem.metadata.color_code : "yellow";
materialProperties.description = currentItem.metadata.description ? currentItem.metadata.description : "";
materialProperties.adhesion_info = currentItem.metadata.adhesion_info ? currentItem.metadata.adhesion_info : "";
if(currentItem.metadata.properties != undefined && currentItem.metadata.properties != null)
{
materialProperties.density = currentItem.metadata.properties.density ? currentItem.metadata.properties.density : "Unknown";
materialProperties.diameter = currentItem.metadata.properties.diameter ? currentItem.metadata.properties.diameter : "Unknown";
}
else
{
materialProperties.density = "Unknown";
materialProperties.diameter = "Unknown";
}
}
}
}

View file

@ -0,0 +1,222 @@
// Copyright (c) 2015 Ultimaker B.V.
// Uranium is released under the terms of the AGPLv3 or higher.
import QtQuick 2.1
import QtQuick.Controls 1.1
import QtQuick.Dialogs 1.2
import UM 1.2 as UM
UM.ManagementPage
{
id: base;
title: catalog.i18nc("@title:tab", "Profiles");
addText: catalog.i18nc("@label", "Duplicate")
model: UM.InstanceContainersModel { filter: { "type": "quality" } }
onAddObject: {
var selectedProfile;
if (objectList.currentIndex == 0) {
// Current settings
selectedProfile = UM.MachineManager.createProfile();
} else {
selectedProfile = UM.MachineManager.duplicateProfile(currentItem.name);
}
base.selectProfile(selectedProfile);
renameDialog.removeWhenRejected = true;
renameDialog.open();
renameDialog.selectText();
}
onRemoveObject: confirmDialog.open();
onRenameObject: { renameDialog.removeWhenRejected = false; renameDialog.open(); renameDialog.selectText(); }
addEnabled: currentItem != null;
removeEnabled: currentItem != null ? !currentItem.readOnly : false;
renameEnabled: currentItem != null ? !currentItem.readOnly : false;
scrollviewCaption: catalog.i18nc("@label %1 is printer name","Printer: %1").arg(UM.MachineManager.activeMachineInstance)
signal selectProfile(string name)
onSelectProfile: {
objectList.currentIndex = objectList.model.find("name", name);
}
Item {
visible: base.currentItem != null
anchors.fill: parent
Label {
id: profileName
text: base.currentItem ? base.currentItem.name : ""
font: UM.Theme.getFont("large")
width: parent.width
elide: Text.ElideRight
}
ScrollView {
anchors.left: parent.left
anchors.top: profileName.bottom
anchors.topMargin: UM.Theme.getSize("default_margin").height
anchors.right: parent.right
anchors.bottom: parent.bottom
Column
{
spacing: UM.Theme.getSize("default_margin").height
Row
{
visible: base.currentItem.id == -1 || base.currentItem.active
Button
{
text: {
var profileName = UM.MachineManager.activeProfile;
profileName = (profileName.length > 20) ? profileName.substring(0, 20) + '...' : profileName;
return catalog.i18nc("@action:button", "Update \"%1\"".arg(profileName));
}
enabled: UM.ActiveProfile.hasCustomisedValues && !UM.ActiveProfile.readOnly
onClicked: UM.ActiveProfile.updateProfile()
}
Button
{
text: catalog.i18nc("@action:button", "Discard changes");
enabled: UM.ActiveProfile.hasCustomisedValues
onClicked: UM.ActiveProfile.discardChanges()
}
}
Grid
{
id: containerGrid
columns: 2
spacing: UM.Theme.getSize("default_margin").width
Label {
text: base.currentItem == null ? "" :
base.currentItem.id == -1 ? catalog.i18nc("@label", "Based on") : catalog.i18nc("@label", "Profile type")
}
Label {
text: base.currentItem == null ? "" :
base.currentItem.id == -1 ? UM.MachineManager.activeProfile :
base.currentItem.readOnly ? catalog.i18nc("@label", "Protected profile") : catalog.i18nc("@label", "Custom profile")
}
Column {
Repeater {
model: base.currentItem ? base.currentItem.settings : null
Label {
text: modelData.name.toString();
elide: Text.ElideMiddle;
}
}
}
Column {
Repeater {
model: base.currentItem ? base.currentItem.settings : null
Label { text: modelData.value.toString(); }
}
}
}
}
}
}
buttons: Row {
Button
{
text: catalog.i18nc("@action:button", "Import");
iconName: "document-import";
onClicked: importDialog.open();
}
Button
{
text: catalog.i18nc("@action:button", "Export");
iconName: "document-export";
onClicked: exportDialog.open();
}
}
Item
{
UM.I18nCatalog { id: catalog; name: "uranium"; }
UM.ConfirmRemoveDialog
{
id: confirmDialog;
object: base.currentItem != null ? base.currentItem.name : "";
onYes: base.model.removeProfile(base.currentItem.name);
}
UM.RenameDialog
{
id: renameDialog;
object: base.currentItem != null ? base.currentItem.name : "";
property bool removeWhenRejected: false;
onAccepted: base.model.renameProfile(base.currentItem.name, newName.trim());
onRejected: {
if(removeWhenRejected) {
base.model.removeProfile(base.currentItem.name)
}
}
}
MessageDialog
{
id: messageDialog
title: catalog.i18nc("@window:title", "Import Profile");
standardButtons: StandardButton.Ok
modality: Qt.ApplicationModal
}
FileDialog
{
id: importDialog;
title: catalog.i18nc("@title:window", "Import Profile");
selectExisting: true;
nameFilters: base.model.getFileNameFiltersRead()
folder: base.model.getDefaultPath()
onAccepted:
{
var result = base.model.importProfile(fileUrl)
messageDialog.text = result.message
if(result.status == "ok")
{
messageDialog.icon = StandardIcon.Information
}
else if(result.status == "duplicate")
{
messageDialog.icon = StandardIcon.Warning
}
else
{
messageDialog.icon = StandardIcon.Critical
}
messageDialog.open()
}
}
FileDialog
{
id: exportDialog;
title: catalog.i18nc("@title:window", "Export Profile");
selectExisting: false;
nameFilters: base.model.getFileNameFiltersWrite()
folder: base.model.getDefaultPath()
onAccepted:
{
var result = base.model.exportProfile(base.currentItem.id, base.currentItem.name, fileUrl, selectedNameFilter)
if(result && result.status == "error")
{
messageDialog.icon = StandardIcon.Critical
messageDialog.text = result.message
messageDialog.open()
}
// else pop-up Message thing from python code
}
}
}
}

View file

@ -6,7 +6,8 @@ import QtQuick.Controls 1.1
import QtQuick.Controls.Styles 1.1 import QtQuick.Controls.Styles 1.1
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
import UM 1.1 as UM import UM 1.2 as UM
import Cura 1.0 as Cura
Item{ Item{
id: base; id: base;
@ -41,13 +42,13 @@ Item{
property int rightMargin: customisedSettings.visible ? customisedSettings.width + UM.Theme.getSize("default_margin").width / 2 : 0 property int rightMargin: customisedSettings.visible ? customisedSettings.width + UM.Theme.getSize("default_margin").width / 2 : 0
id: globalProfileSelection id: globalProfileSelection
text: UM.MachineManager.activeProfile text: Cura.MachineManager.activeQualityName
width: parent.width/100*55 width: parent.width/100*55
height: UM.Theme.getSize("setting_control").height height: UM.Theme.getSize("setting_control").height
anchors.right: parent.right anchors.right: parent.right
anchors.rightMargin: UM.Theme.getSize("default_margin").width anchors.rightMargin: UM.Theme.getSize("default_margin").width
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
tooltip: UM.MachineManager.activeProfile tooltip: Cura.MachineManager.activeQualityName
style: UM.Theme.styles.sidebar_header_button style: UM.Theme.styles.sidebar_header_button
menu: Menu menu: Menu
@ -56,7 +57,10 @@ Item{
Instantiator Instantiator
{ {
id: profileSelectionInstantiator id: profileSelectionInstantiator
model: UM.ProfilesModel {} model: UM.InstanceContainersModel
{
filter: {"type": "quality"}
}
property int separatorIndex: -1 property int separatorIndex: -1
Loader { Loader {
@ -98,18 +102,18 @@ Item{
id: item id: item
text: model_data ? model_data.name : "" text: model_data ? model_data.name : ""
checkable: true; checkable: true;
checked: model_data ? model_data.active : false; checked: Cura.MachineManager.activeQualityId == model_data.id
exclusiveGroup: profileSelectionMenuGroup; exclusiveGroup: profileSelectionMenuGroup;
onTriggered: onTriggered:
{ {
UM.MachineManager.setActiveProfile(model_data.name); Cura.MachineManager.setActiveQuality(model_data.id);
if (!model_data.active) { /*if (!model_data.active) {
//Selecting a profile was canceled; undo menu selection //Selecting a profile was canceled; undo menu selection
profileSelectionInstantiator.model.setProperty(model_index, "active", false); profileSelectionInstantiator.model.setProperty(model_index, "active", false);
var activeProfileName = UM.MachineManager.activeProfile; var activeProfileName = UM.MachineManager.activeProfile;
var activeProfileIndex = profileSelectionInstantiator.model.find("name", activeProfileName); var activeProfileIndex = profileSelectionInstantiator.model.find("name", activeProfileName);
profileSelectionInstantiator.model.setProperty(activeProfileIndex, "active", true); profileSelectionInstantiator.model.setProperty(activeProfileIndex, "active", true);
} }*/
} }
} }
} }

View file

@ -0,0 +1,82 @@
// Copyright (c) 2015 Ultimaker B.V.
// Uranium is released under the terms of the AGPLv3 or higher.
import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Controls.Styles 1.1
import QtQuick.Layouts 1.1
import UM 1.1 as UM
import ".."
Button {
id: base;
style: UM.Theme.styles.sidebar_category;
signal showTooltip(string text);
signal hideTooltip();
signal contextMenuRequested()
text: definition.label
iconSource: UM.Theme.getIcon(definition.icon)
checkable: true
checked: definition.expanded
onClicked: definition.expanded ? settingDefinitionsModel.collapse(definition.key) : settingDefinitionsModel.expandAll(definition.key)
UM.SimpleButton {
id: settingsButton
visible: base.hovered || settingsButton.hovered
height: base.height * 0.6
width: base.height * 0.6
anchors {
right: inheritButton.visible ? inheritButton.left : parent.right
rightMargin: inheritButton.visible? UM.Theme.getSize("default_margin").width / 2 : UM.Theme.getSize("setting_preferences_button_margin").width
verticalCenter: parent.verticalCenter;
}
color: UM.Theme.getColor("setting_control_button");
hoverColor: UM.Theme.getColor("setting_control_button_hover")
iconSource: UM.Theme.getIcon("settings");
onClicked: {
Actions.configureSettingVisibility.trigger(definition)
}
}
UM.SimpleButton
{
id: inheritButton;
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
anchors.rightMargin: UM.Theme.getSize("setting_preferences_button_margin").width
visible: hiddenValuesCount > 0
height: parent.height / 2;
width: height;
onClicked: {
base.showAllHiddenInheritedSettings()
}
color: UM.Theme.getColor("setting_control_button")
hoverColor: UM.Theme.getColor("setting_control_button_hover")
iconSource: UM.Theme.getIcon("notice")
onEntered: {
base.showTooltip(catalog.i18nc("@label","Some hidden settings use values different from their normal calculated value.\n\nClick to make these settings visible."))
}
onExited: {
base.hideTooltip();
}
UM.I18nCatalog { id: catalog; name: "cura" }
}
}

View file

@ -0,0 +1,78 @@
// Copyright (c) 2015 Ultimaker B.V.
// Uranium is released under the terms of the AGPLv3 or higher.
import QtQuick 2.1
import QtQuick.Layouts 1.1
import QtQuick.Controls 1.1
import QtQuick.Controls.Styles 1.1
import UM 1.2 as UM
SettingItem
{
id: base
contents: MouseArea
{
id: control
anchors.fill: parent
property bool checked:
{
switch(propertyProvider.properties.value)
{
case "True":
return true
case "False":
return false
default:
return propertyProvider.properties.value
}
}
onClicked: propertyProvider.setPropertyValue("value", !checked)
Rectangle
{
anchors
{
top: parent.top
bottom: parent.bottom
left: parent.left
}
width: height
color:
{
if (!enabled)
{
return UM.Theme.getColor("setting_control_disabled")
}
if(control.containsMouse || control.activeFocus)
{
return UM.Theme.getColor("setting_control_highlight")
}
else
{
return UM.Theme.getColor("setting_control")
}
}
border.width: UM.Theme.getSize("default_lining").width
border.color: !enabled ? UM.Theme.getColor("setting_control_disabled_border") : control.containsMouse ? UM.Theme.getColor("setting_control_border_highlight") : UM.Theme.getColor("setting_control_border")
UM.RecolorImage {
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
width: parent.width/2.5
height: parent.height/2.5
sourceSize.width: width
sourceSize.height: width
color: !enabled ? UM.Theme.getColor("setting_control_disabled_text") : UM.Theme.getColor("setting_control_text");
source: UM.Theme.getIcon("check")
opacity: control.checked ? 1 : 0
Behavior on opacity { NumberAnimation { duration: 100; } }
}
}
}
}

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