mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-06 22:47:29 -06:00
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:
commit
386aec32a8
125 changed files with 7651 additions and 2131 deletions
|
@ -37,13 +37,9 @@ class BuildVolume(SceneNode):
|
|||
|
||||
self.setCalculateBoundingBox(False)
|
||||
|
||||
self._active_profile = None
|
||||
self._active_instance = None
|
||||
Application.getInstance().getMachineManager().activeMachineInstanceChanged.connect(self._onActiveInstanceChanged)
|
||||
self._onActiveInstanceChanged()
|
||||
|
||||
Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onActiveProfileChanged)
|
||||
self._onActiveProfileChanged()
|
||||
self._active_container_stack = None
|
||||
Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerStackChanged)
|
||||
self._onGlobalContainerStackChanged()
|
||||
|
||||
def setWidth(self, width):
|
||||
if width: self._width = width
|
||||
|
@ -76,7 +72,7 @@ class BuildVolume(SceneNode):
|
|||
|
||||
## Recalculates the build volume & disallowed areas.
|
||||
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
|
||||
|
||||
min_w = -self._width / 2
|
||||
|
@ -148,9 +144,9 @@ class BuildVolume(SceneNode):
|
|||
|
||||
skirt_size = 0.0
|
||||
|
||||
profile = Application.getInstance().getMachineManager().getWorkingProfile()
|
||||
if profile:
|
||||
skirt_size = self._getSkirtSize(profile)
|
||||
container_stack = Application.getInstance().getGlobalContainerStack()
|
||||
if container_stack:
|
||||
skirt_size = self._getSkirtSize(container_stack)
|
||||
|
||||
# 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!
|
||||
|
@ -162,52 +158,49 @@ class BuildVolume(SceneNode):
|
|||
|
||||
Application.getInstance().getController().getScene()._maximum_bounds = scale_to_max_bounds
|
||||
|
||||
def _onActiveInstanceChanged(self):
|
||||
self._active_instance = Application.getInstance().getMachineManager().getActiveMachineInstance()
|
||||
def _onGlobalContainerStackChanged(self):
|
||||
if self._active_container_stack:
|
||||
self._active_container_stack.propertyChanged.disconnect(self._onSettingPropertyChanged)
|
||||
|
||||
if self._active_instance:
|
||||
self._width = self._active_instance.getMachineSettingValue("machine_width")
|
||||
if Application.getInstance().getMachineManager().getWorkingProfile().getSettingValue("print_sequence") == "one_at_a_time":
|
||||
self._height = Application.getInstance().getMachineManager().getWorkingProfile().getSettingValue("gantry_height")
|
||||
self._active_container_stack = Application.getInstance().getGlobalContainerStack()
|
||||
|
||||
if self._active_container_stack:
|
||||
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:
|
||||
self._height = self._active_instance.getMachineSettingValue("machine_height")
|
||||
self._depth = self._active_instance.getMachineSettingValue("machine_depth")
|
||||
self._height = self._active_container_stack.getProperty("machine_height", "value")
|
||||
self._depth = self._active_container_stack.getProperty("machine_depth", "value")
|
||||
|
||||
self._updateDisallowedAreas()
|
||||
|
||||
self.rebuild()
|
||||
|
||||
def _onActiveProfileChanged(self):
|
||||
if self._active_profile:
|
||||
self._active_profile.settingValueChanged.disconnect(self._onSettingValueChanged)
|
||||
def _onSettingPropertyChanged(self, setting_key, property_name):
|
||||
if property_name != "value":
|
||||
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 Application.getInstance().getMachineManager().getWorkingProfile().getSettingValue("print_sequence") == "one_at_a_time":
|
||||
self._height = Application.getInstance().getMachineManager().getWorkingProfile().getSettingValue("gantry_height")
|
||||
if Application.getInstance().getGlobalContainerStack().getProperty("print_sequence", "value") == "one_at_a_time":
|
||||
self._height = self._active_container_stack.getProperty("gantry_height", "value")
|
||||
else:
|
||||
self._height = self._active_instance.getMachineSettingValue("machine_depth")
|
||||
self._height = self._active_container_stack.getProperty("machine_height", "value")
|
||||
self.rebuild()
|
||||
if setting_key in self._skirt_settings:
|
||||
self._updateDisallowedAreas()
|
||||
self.rebuild()
|
||||
|
||||
def _updateDisallowedAreas(self):
|
||||
if not self._active_instance or not self._active_profile:
|
||||
if not self._active_container_stack:
|
||||
return
|
||||
|
||||
disallowed_areas = self._active_instance.getMachineSettingValue("machine_disallowed_areas")
|
||||
disallowed_areas = self._active_container_stack.getProperty("machine_disallowed_areas", "value")
|
||||
areas = []
|
||||
|
||||
skirt_size = 0.0
|
||||
if self._active_profile:
|
||||
skirt_size = self._getSkirtSize(self._active_profile)
|
||||
skirt_size = self._getSkirtSize(self._active_container_stack)
|
||||
|
||||
if disallowed_areas:
|
||||
# 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.
|
||||
if skirt_size > 0:
|
||||
half_machine_width = self._active_instance.getMachineSettingValue("machine_width") / 2
|
||||
half_machine_depth = self._active_instance.getMachineSettingValue("machine_depth") / 2
|
||||
half_machine_width = self._active_container_stack.getProperty("machine_width", "value") / 2
|
||||
half_machine_depth = self._active_container_stack.getProperty("machine_depth", "value") / 2
|
||||
|
||||
areas.append(Polygon(numpy.array([
|
||||
[-half_machine_width, -half_machine_depth],
|
||||
|
@ -262,24 +255,24 @@ class BuildVolume(SceneNode):
|
|||
self._disallowed_areas = areas
|
||||
|
||||
## Convenience function to calculate the size of the bed adhesion.
|
||||
def _getSkirtSize(self, profile):
|
||||
def _getSkirtSize(self, container_stack):
|
||||
skirt_size = 0.0
|
||||
|
||||
adhesion_type = profile.getSettingValue("adhesion_type")
|
||||
adhesion_type = container_stack.getProperty("adhesion_type", "value")
|
||||
if adhesion_type == "skirt":
|
||||
skirt_distance = profile.getSettingValue("skirt_gap")
|
||||
skirt_line_count = profile.getSettingValue("skirt_line_count")
|
||||
skirt_size = skirt_distance + (skirt_line_count * profile.getSettingValue("skirt_line_width"))
|
||||
skirt_distance = container_stack.getProperty("skirt_gap", "value")
|
||||
skirt_line_count = container_stack.getProperty("skirt_line_count", "value")
|
||||
skirt_size = skirt_distance + (skirt_line_count * container_stack.getProperty("skirt_line_width", "value"))
|
||||
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":
|
||||
skirt_size = profile.getSettingValue("raft_margin")
|
||||
skirt_size = container_stack.getProperty("raft_margin", "value")
|
||||
|
||||
if profile.getSettingValue("draft_shield_enabled"):
|
||||
skirt_size += profile.getSettingValue("draft_shield_dist")
|
||||
if container_stack.getProperty("draft_shield_enabled", "value"):
|
||||
skirt_size += container_stack.getProperty("draft_shield_dist", "value")
|
||||
|
||||
if profile.getSettingValue("xy_offset"):
|
||||
skirt_size += profile.getSettingValue("xy_offset")
|
||||
if container_stack.getProperty("xy_offset", "value"):
|
||||
skirt_size += container_stack.getProperty("xy_offset", "value")
|
||||
|
||||
return skirt_size
|
||||
|
||||
|
|
|
@ -28,9 +28,9 @@ class ConvexHullDecorator(SceneNodeDecorator):
|
|||
self._parent_node = None
|
||||
|
||||
self._profile = None
|
||||
Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onActiveProfileChanged)
|
||||
Application.getInstance().getMachineManager().activeMachineInstanceChanged.connect(self._onActiveMachineInstanceChanged)
|
||||
self._onActiveProfileChanged()
|
||||
#Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onActiveProfileChanged)
|
||||
#Application.getInstance().getMachineManager().activeMachineInstanceChanged.connect(self._onActiveMachineInstanceChanged)
|
||||
#self._onActiveProfileChanged()
|
||||
|
||||
def setNode(self, node):
|
||||
super().setNode(node)
|
||||
|
|
|
@ -68,12 +68,12 @@ class ConvexHullJob(Job):
|
|||
# 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)))
|
||||
|
||||
profile = Application.getInstance().getMachineManager().getWorkingProfile()
|
||||
if profile:
|
||||
if profile.getSettingValue("print_sequence") == "one_at_a_time" and not self._node.getParent().callDecoration("isGroup"):
|
||||
global_stack = Application.getInstance().getGlobalContainerStack()
|
||||
if global_stack:
|
||||
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
|
||||
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 = hull.getMinkowskiHull(head_and_fans)
|
||||
|
@ -86,7 +86,7 @@ class ConvexHullJob(Job):
|
|||
# Min head hull is used for the push free
|
||||
min_head_hull = hull.getMinkowskiHull(head_and_fans)
|
||||
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:
|
||||
self._node.callDecoration("setConvexHullHead", None)
|
||||
if self._node.getParent() is None: # Node was already deleted before job is done.
|
||||
|
|
|
@ -15,7 +15,7 @@ from UM.Mesh.ReadMeshJob import ReadMeshJob
|
|||
from UM.Logger import Logger
|
||||
from UM.Preferences import Preferences
|
||||
from UM.JobQueue import JobQueue
|
||||
|
||||
from UM.SaveFile import SaveFile
|
||||
from UM.Scene.Selection import Selection
|
||||
from UM.Scene.GroupDecorator import GroupDecorator
|
||||
|
||||
|
@ -25,6 +25,9 @@ from UM.Operations.GroupedOperation import GroupedOperation
|
|||
from UM.Operations.SetTransformOperation import SetTransformOperation
|
||||
from cura.SetParentOperation import SetParentOperation
|
||||
|
||||
from UM.Settings.SettingDefinition import SettingDefinition, DefinitionPropertyType
|
||||
from UM.Settings.ContainerRegistry import ContainerRegistry
|
||||
|
||||
from UM.i18n import i18nCatalog
|
||||
|
||||
from . import PlatformPhysics
|
||||
|
@ -35,16 +38,18 @@ from . import CuraActions
|
|||
from . import MultiMaterialDecorator
|
||||
from . import ZOffsetDecorator
|
||||
from . import CuraSplashScreen
|
||||
from . import MachineManagerModel
|
||||
|
||||
from PyQt5.QtCore import pyqtSlot, QUrl, pyqtSignal, pyqtProperty, QEvent, Q_ENUMS
|
||||
from PyQt5.QtGui import QColor, QIcon
|
||||
from PyQt5.QtQml import qmlRegisterUncreatableType
|
||||
from PyQt5.QtQml import qmlRegisterUncreatableType, qmlRegisterSingletonType
|
||||
|
||||
import platform
|
||||
import sys
|
||||
import os.path
|
||||
import numpy
|
||||
import copy
|
||||
import urllib
|
||||
numpy.seterr(all="ignore")
|
||||
|
||||
#WORKAROUND: GITHUB-88 GITHUB-385 GITHUB-612
|
||||
|
@ -65,6 +70,13 @@ class CuraApplication(QtApplication):
|
|||
class ResourceTypes:
|
||||
QmlFiles = Resources.UserType + 1
|
||||
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)
|
||||
|
||||
def __init__(self):
|
||||
|
@ -74,6 +86,9 @@ class CuraApplication(QtApplication):
|
|||
|
||||
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)
|
||||
|
||||
self.setWindowIcon(QIcon(Resources.getPath(Resources.Images, "cura-icon.png")))
|
||||
|
@ -102,15 +117,28 @@ class CuraApplication(QtApplication):
|
|||
self._camera_animation = 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().toolOperationStopped.connect(self._onToolOperationStopped)
|
||||
|
||||
Resources.addType(self.ResourceTypes.QmlFiles, "qml")
|
||||
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/recent_files", "")
|
||||
Preferences.getInstance().addPreference("cura/categories_expanded", "")
|
||||
|
@ -120,8 +148,43 @@ class CuraApplication(QtApplication):
|
|||
Preferences.getInstance().addPreference("mesh/scale_tiny_meshes", True)
|
||||
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)
|
||||
|
||||
self.applicationShuttingDown.connect(self._onExit)
|
||||
|
||||
self._recent_files = []
|
||||
files = Preferences.getInstance().getValue("cura/recent_files").split(";")
|
||||
for f in files:
|
||||
|
@ -130,6 +193,54 @@ class CuraApplication(QtApplication):
|
|||
|
||||
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)
|
||||
def getDefaultPath(self):
|
||||
return QUrl.fromLocalFile(os.path.expanduser("~/"))
|
||||
|
@ -137,6 +248,7 @@ class CuraApplication(QtApplication):
|
|||
## Handle loading of all plugin types (and the backend explicitly)
|
||||
# \sa PluginRegistery
|
||||
def _loadPlugins(self):
|
||||
self._plugin_registry.addType("profile_reader", self._addProfileReader)
|
||||
self._plugin_registry.addPluginLocation(os.path.join(QtApplication.getInstallPrefix(), "lib", "cura"))
|
||||
if not hasattr(sys, "frozen"):
|
||||
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..."))
|
||||
|
||||
qmlRegisterSingletonType(MachineManagerModel.MachineManagerModel, "Cura", 1, 0, "MachineManager",
|
||||
MachineManagerModel.createMachineManagerModel)
|
||||
|
||||
self.setMainQml(Resources.getPath(self.ResourceTypes.QmlFiles, "Cura.qml"))
|
||||
self.initializeEngine()
|
||||
|
||||
|
@ -511,20 +626,6 @@ class CuraApplication(QtApplication):
|
|||
def expandedCategories(self):
|
||||
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()
|
||||
def mergeSelected(self):
|
||||
self.groupSelected()
|
||||
|
@ -630,5 +731,6 @@ class CuraApplication(QtApplication):
|
|||
job.finished.connect(self._onFileLoaded)
|
||||
job.start()
|
||||
|
||||
def _onAddMachineRequested(self):
|
||||
self.requestAddPrinter.emit()
|
||||
def _addProfileReader(self, profile_reader):
|
||||
# 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
263
cura/MachineManagerModel.py
Normal 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()
|
|
@ -63,6 +63,6 @@ class PrintInformation(QObject):
|
|||
self.currentPrintTimeChanged.emit()
|
||||
|
||||
# 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.materialAmountChanged.emit()
|
||||
|
|
17
cura/ProfileReader.py
Normal file
17
cura/ProfileReader.py
Normal 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.")
|
29
cura/SettingOverrideDecorator.py
Normal file
29
cura/SettingOverrideDecorator.py
Normal 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
|
|
@ -11,6 +11,7 @@ from UM.Qt.Bindings.BackendProxy import BackendState #To determine the state of
|
|||
from UM.Message import Message
|
||||
from UM.PluginRegistry import PluginRegistry
|
||||
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 . import ProcessSlicedLayersJob
|
||||
|
@ -29,6 +30,10 @@ catalog = i18nCatalog("cura")
|
|||
|
||||
|
||||
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):
|
||||
super().__init__()
|
||||
|
||||
|
@ -50,19 +55,19 @@ class CuraEngineBackend(Backend):
|
|||
self._onActiveViewChanged()
|
||||
self._stored_layer_data = []
|
||||
|
||||
# When there are current settings and machine instance is changed, there is no profile changed event. We should
|
||||
# pretend there is though.
|
||||
Application.getInstance().getMachineManager().activeMachineInstanceChanged.connect(self._onActiveProfileChanged)
|
||||
|
||||
self._profile = None
|
||||
Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onActiveProfileChanged)
|
||||
self._onActiveProfileChanged()
|
||||
#Triggers for when to (re)start slicing:
|
||||
if Application.getInstance().getGlobalContainerStack():
|
||||
Application.getInstance().getGlobalContainerStack().propertyChanged.connect(self._onSettingChanged) #Note: Only starts slicing when the value changed.
|
||||
|
||||
#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.setInterval(500)
|
||||
self._change_timer.setSingleShot(True)
|
||||
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.Progress"] = self._onProgressMessage
|
||||
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.SlicingFinished"] = self._onSlicingFinishedMessage
|
||||
|
||||
self._slicing = False
|
||||
self._start_slice_job = None
|
||||
self._restart = False
|
||||
self._enabled = True
|
||||
self._always_restart = True
|
||||
self._slicing = False #Are we currently slicing?
|
||||
self._restart = False #Back-end is currently restarting?
|
||||
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._message = None
|
||||
self._message = None #Pop-up message that shows the slicing progress bar (or an error message).
|
||||
|
||||
self.backendQuit.connect(self._onBackendQuit)
|
||||
|
||||
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().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):
|
||||
# Terminate CuraEngine if it is still running at this point
|
||||
self._terminate()
|
||||
super().close()
|
||||
|
||||
## 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.
|
||||
def getEngineCommand(self):
|
||||
active_machine = Application.getInstance().getMachineManager().getActiveMachineInstance()
|
||||
json_path = ""
|
||||
if not active_machine:
|
||||
json_path = Resources.getPath(Resources.MachineDefinitions, "fdmprinter.json")
|
||||
else:
|
||||
json_path = active_machine.getMachineDefinition().getPath()
|
||||
|
||||
json_path = Resources.getPath(Resources.DefinitionContainers, "fdmprinter.def.json")
|
||||
return [Preferences.getInstance().getValue("backend/location"), "connect", "127.0.0.1:{0}".format(self._port), "-j", json_path, "-vv"]
|
||||
|
||||
def close(self):
|
||||
|
@ -116,45 +117,51 @@ class CuraEngineBackend(Backend):
|
|||
## Emitted when the slicing process starts.
|
||||
slicingStarted = Signal()
|
||||
|
||||
## Emitted whne the slicing process is aborted forcefully.
|
||||
## Emitted when the slicing process is aborted forcefully.
|
||||
slicingCancelled = Signal()
|
||||
|
||||
## Perform a slice of the scene.
|
||||
def slice(self):
|
||||
self._stored_layer_data = []
|
||||
|
||||
if not self._enabled:
|
||||
if not self._enabled: #We shouldn't be slicing.
|
||||
return
|
||||
|
||||
if self._slicing:
|
||||
if self._slicing: #We were already slicing. Stop the old job.
|
||||
self._terminate()
|
||||
|
||||
if self._message:
|
||||
self._message.hide()
|
||||
self._message = None
|
||||
|
||||
return
|
||||
|
||||
if self._process_layers_job:
|
||||
if self._process_layers_job: #We were processing layers. Stop that, the layers are going to change soon.
|
||||
self._process_layers_job.abort()
|
||||
self._process_layers_job = None
|
||||
|
||||
if self._profile.hasErrorValue():
|
||||
Logger.log("w", "Profile has error values. Aborting slicing")
|
||||
if self._message:
|
||||
#Don't slice if there is a setting with an error value.
|
||||
stack = Application.getInstance().getGlobalContainerStack()
|
||||
for key in stack.getAllKeys():
|
||||
validation_state = stack.getProperty(key, "validationState")
|
||||
#Only setting instances have a validation state, so settings which
|
||||
#are not overwritten by any instance will have none. The property
|
||||
#then, and only then, evaluates to None. We make the assumption that
|
||||
#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 #No slicing if we have error values since those are by definition illegal values.
|
||||
return
|
||||
|
||||
self.processingProgress.emit(0.0)
|
||||
self.backendStateChange.emit(BackendState.NOT_STARTED)
|
||||
if self._message:
|
||||
self._message.setProgress(-1)
|
||||
#else:
|
||||
# self._message = Message(catalog.i18nc("@info:status", "Slicing..."), 0, False, -1)
|
||||
# self._message.show()
|
||||
else:
|
||||
self._message = Message(catalog.i18nc("@info:status", "Slicing..."), 0, False, -1)
|
||||
self._message.show()
|
||||
|
||||
self._scene.gcode_list = []
|
||||
self._slicing = True
|
||||
|
@ -162,10 +169,11 @@ class CuraEngineBackend(Backend):
|
|||
|
||||
slice_message = self._socket.createMessage("cura.proto.Slice")
|
||||
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.finished.connect(self._onStartSliceCompleted)
|
||||
|
||||
## Terminate the engine process.
|
||||
def _terminate(self):
|
||||
self._slicing = False
|
||||
self._restart = True
|
||||
|
@ -182,10 +190,21 @@ class CuraEngineBackend(Backend):
|
|||
self._process.terminate()
|
||||
Logger.log("d", "Engine process is killed. Received return code %s", self._process.wait())
|
||||
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.
|
||||
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):
|
||||
# Note that cancelled slice jobs can still call this method.
|
||||
if self._start_slice_job is job:
|
||||
|
@ -200,6 +219,11 @@ class CuraEngineBackend(Backend):
|
|||
self._socket.sendMessage(job.getSettingsMessage())
|
||||
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):
|
||||
if type(source) is not SceneNode:
|
||||
return
|
||||
|
@ -215,6 +239,9 @@ class CuraEngineBackend(Backend):
|
|||
|
||||
self._onChanged()
|
||||
|
||||
## Called when an error occurs in the socket connection towards the engine.
|
||||
#
|
||||
# \param error The exception that occurred.
|
||||
def _onSocketError(self, error):
|
||||
if Application.getInstance().isShuttingDown():
|
||||
return
|
||||
|
@ -225,22 +252,23 @@ class CuraEngineBackend(Backend):
|
|||
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")
|
||||
|
||||
def _onActiveProfileChanged(self):
|
||||
if self._profile:
|
||||
self._profile.settingValueChanged.disconnect(self._onSettingChanged)
|
||||
|
||||
self._profile = Application.getInstance().getMachineManager().getWorkingProfile()
|
||||
if self._profile:
|
||||
self._profile.settingValueChanged.connect(self._onSettingChanged)
|
||||
self._onChanged()
|
||||
|
||||
def _onSettingChanged(self, setting):
|
||||
## A setting has changed, so check if we must reslice.
|
||||
#
|
||||
# \param instance The setting instance that has changed.
|
||||
# \param property The property of the setting instance that has changed.
|
||||
def _onSettingChanged(self, instance, property):
|
||||
if property == "value": #Only reslice if the value has changed.
|
||||
self._onChanged()
|
||||
|
||||
## Called when a sliced layer data message is received from the engine.
|
||||
#
|
||||
# \param message The protobuf message containing sliced layer data.
|
||||
def _onLayerMessage(self, 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):
|
||||
if self._message:
|
||||
self._message.setProgress(round(message.amount * 100))
|
||||
|
@ -248,6 +276,9 @@ class CuraEngineBackend(Backend):
|
|||
self.processingProgress.emit(message.amount)
|
||||
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):
|
||||
self.backendStateChange.emit(BackendState.DONE)
|
||||
self.processingProgress.emit(1.0)
|
||||
|
@ -264,15 +295,27 @@ class CuraEngineBackend(Backend):
|
|||
self._process_layers_job.start()
|
||||
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):
|
||||
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):
|
||||
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):
|
||||
self.printDurationMessage.emit(message.time, message.material_amount)
|
||||
|
||||
## Creates a new socket connection.
|
||||
def _createSocket(self):
|
||||
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):
|
||||
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):
|
||||
if not self._profile:
|
||||
return
|
||||
|
||||
self._change_timer.start()
|
||||
|
||||
## Called when the back-end connects to the front-end.
|
||||
def _onBackendConnected(self):
|
||||
if self._restart:
|
||||
self._onChanged()
|
||||
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):
|
||||
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'
|
||||
|
||||
## 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):
|
||||
self._enabled = True # Tool stop, start listening for changes again.
|
||||
|
||||
## Called when the user changes the active view mode.
|
||||
def _onActiveViewChanged(self):
|
||||
if 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
|
||||
# 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.
|
||||
|
@ -312,9 +368,9 @@ class CuraEngineBackend(Backend):
|
|||
else:
|
||||
self._layer_view_active = False
|
||||
|
||||
def _onInstanceChanged(self):
|
||||
self._terminate()
|
||||
|
||||
## Called when the back-end self-terminates.
|
||||
#
|
||||
# We should reset our state and start listening for new connections.
|
||||
def _onBackendQuit(self):
|
||||
if not self._restart and self._process:
|
||||
Logger.log("d", "Backend quit with return code %s. Resetting process and socket.", self._process.wait())
|
||||
|
|
|
@ -62,8 +62,6 @@ class ProcessSlicedLayersJob(Job):
|
|||
self._progress.hide()
|
||||
return
|
||||
|
||||
settings = Application.getInstance().getMachineManager().getWorkingProfile()
|
||||
|
||||
mesh = MeshData()
|
||||
layer_data = LayerData.LayerData()
|
||||
layer_count = len(self._layers)
|
||||
|
@ -132,8 +130,9 @@ class ProcessSlicedLayersJob(Job):
|
|||
new_node.setMeshData(mesh)
|
||||
new_node.setParent(self._scene.getRoot()) # Note: After this we can no longer abort!
|
||||
|
||||
if not settings.getSettingValue("machine_center_is_zero"):
|
||||
new_node.setPosition(Vector(-settings.getSettingValue("machine_width") / 2, 0.0, settings.getSettingValue("machine_depth") / 2))
|
||||
settings = Application.getInstance().getGlobalContainerStack()
|
||||
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:
|
||||
self._progress.setProgress(100)
|
||||
|
|
|
@ -30,11 +30,10 @@ class GcodeStartEndFormatter(Formatter):
|
|||
|
||||
## Job class that builds up the message of scene data to send to CuraEngine.
|
||||
class StartSliceJob(Job):
|
||||
def __init__(self, profile, slice_message, settings_message):
|
||||
def __init__(self, slice_message, settings_message):
|
||||
super().__init__()
|
||||
|
||||
self._scene = Application.getInstance().getController().getScene()
|
||||
self._profile = profile
|
||||
self._slice_message = slice_message
|
||||
self._settings_message = settings_message
|
||||
self._is_cancelled = False
|
||||
|
@ -45,18 +44,27 @@ class StartSliceJob(Job):
|
|||
def getSliceMessage(self):
|
||||
return self._slice_message
|
||||
|
||||
## Runs the job that initiates the slicing.
|
||||
def run(self):
|
||||
stack = Application.getInstance().getGlobalContainerStack()
|
||||
if not stack:
|
||||
self.setResult(False)
|
||||
return
|
||||
|
||||
with self._scene.getSceneLock():
|
||||
# Remove old layer data.
|
||||
for node in DepthFirstIterator(self._scene.getRoot()):
|
||||
if node.callDecoration("getLayerData"):
|
||||
node.getParent().removeChild(node)
|
||||
break
|
||||
|
||||
# Get the objects in their groups to print.
|
||||
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()):
|
||||
temp_list = []
|
||||
|
||||
# Node can't be printed, so don't bother sending it.
|
||||
if getattr(node, "_outside_buildarea", False):
|
||||
continue
|
||||
|
||||
|
@ -85,7 +93,7 @@ class StartSliceJob(Job):
|
|||
if not object_groups:
|
||||
return
|
||||
|
||||
self._buildSettingsMessage(self._profile)
|
||||
self._buildGlobalSettingsMessage(stack)
|
||||
|
||||
for group in object_groups:
|
||||
group_message = self._slice_message.addRepeatedMessage("object_lists")
|
||||
|
@ -97,6 +105,8 @@ class StartSliceJob(Job):
|
|||
obj = group_message.addRepeatedMessage("objects")
|
||||
obj.id = id(object)
|
||||
verts = numpy.array(mesh_data.getVertices())
|
||||
|
||||
# Convert from Y up axes to Z up axes. Equals a 90 degree rotation.
|
||||
verts[:, [1, 2]] = verts[:, [2, 1]]
|
||||
verts[:, 1] *= -1
|
||||
|
||||
|
@ -124,18 +134,27 @@ class StartSliceJob(Job):
|
|||
Logger.log("w", "Unabled to do token replacement on start/end gcode %s", traceback.format_exc())
|
||||
return str(value).encode("utf-8")
|
||||
|
||||
def _buildSettingsMessage(self, profile):
|
||||
settings = profile.getAllSettingValues(include_machine = True)
|
||||
## Sends all global settings to the engine.
|
||||
#
|
||||
# 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"]
|
||||
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
|
||||
for key, value in settings.items():
|
||||
s = self._settings_message.addRepeatedMessage("settings")
|
||||
s.name = key
|
||||
if key == "machine_start_gcode" or key == "machine_end_gcode":
|
||||
s.value = self._expandGcodeTokens(key, value, settings)
|
||||
|
||||
for key, value in settings.items(): #Add all submessages for each individual setting.
|
||||
setting_message = self._settings_message.addRepeatedMessage("settings")
|
||||
setting_message.name = key
|
||||
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:
|
||||
s.value = str(value).encode("utf-8")
|
||||
setting_message.value = str(value).encode("utf-8")
|
||||
|
||||
def _handlePerObjectSettings(self, node, message):
|
||||
profile = node.callDecoration("getProfile")
|
||||
|
|
|
@ -13,7 +13,7 @@ def getMetaData():
|
|||
"name": catalog.i18nc("@label", "CuraEngine Backend"),
|
||||
"author": "Ultimaker",
|
||||
"description": catalog.i18nc("@info:whatsthis", "Provides the link to the CuraEngine slicing backend."),
|
||||
"api": 2
|
||||
"api": 3
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
from UM.Mesh.MeshWriter import MeshWriter
|
||||
from UM.Logger import Logger
|
||||
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 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):
|
||||
## 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):
|
||||
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
|
||||
|
||||
scene = Application.getInstance().getController().getScene()
|
||||
|
@ -40,26 +49,30 @@ class GCodeWriter(MeshWriter):
|
|||
if gcode_list:
|
||||
for gcode in gcode_list:
|
||||
stream.write(gcode)
|
||||
# Serialise the profile and put them at the end of the file.
|
||||
profile = self._serialiseProfile(Application.getInstance().getMachineManager().getWorkingProfile())
|
||||
stream.write(profile)
|
||||
# Serialise the current container stack and put it at the end of the file.
|
||||
settings = self._serialiseSettings(Application.getInstance().getGlobalContainerStack())
|
||||
stream.write(settings)
|
||||
return True
|
||||
|
||||
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.
|
||||
#
|
||||
# \param profile The profile to serialise.
|
||||
# \return A serialised string of the profile.
|
||||
def _serialiseProfile(self, profile):
|
||||
# \param settings A container stack to serialise.
|
||||
# \return A serialised string of the settings.
|
||||
def _serialiseSettings(self, settings):
|
||||
prefix = ";SETTING_" + str(GCodeWriter.version) + " " # The prefix to put before each line.
|
||||
prefix_length = len(prefix)
|
||||
|
||||
# Serialise a deepcopy to remove the defaults from the profile
|
||||
serialised = copy.deepcopy(profile).serialise()
|
||||
all_settings = InstanceContainer("G-code-imported-profile") #Create a new 'profile' with ALL settings so that the slice can be precisely reproduced.
|
||||
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.
|
||||
pattern = re.compile("|".join(GCodeWriter.escape_characters.keys()))
|
||||
|
|
|
@ -13,7 +13,7 @@ def getMetaData():
|
|||
"author": "Ultimaker",
|
||||
"version": "1.0",
|
||||
"description": catalog.i18nc("@info:whatsthis", "Writes GCode to a file."),
|
||||
"api": 2
|
||||
"api": 3
|
||||
},
|
||||
|
||||
"mesh_writer": {
|
||||
|
|
|
@ -14,7 +14,7 @@ def getMetaData():
|
|||
"author": "Ultimaker",
|
||||
"version": "1.0",
|
||||
"description": catalog.i18nc("@info:whatsthis", "Provides the Layer view."),
|
||||
"api": 2
|
||||
"api": 3
|
||||
},
|
||||
"view": {
|
||||
"name": catalog.i18nc("@item:inlistbox", "Layers"),
|
||||
|
|
|
@ -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.Logger import Logger #Logging errors.
|
||||
from UM.PluginRegistry import PluginRegistry #For getting the path to this plugin's directory.
|
||||
from UM.Settings.Profile import Profile
|
||||
from UM.Settings.ProfileReader import ProfileReader
|
||||
from UM.Settings.DefinitionContainer import DefinitionContainer #For getting the current machine's defaults.
|
||||
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.
|
||||
#
|
||||
|
@ -66,7 +67,7 @@ class LegacyProfileReader(ProfileReader):
|
|||
if file_name.split(".")[-1] != "ini":
|
||||
return None
|
||||
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)
|
||||
try:
|
||||
|
@ -103,23 +104,24 @@ class LegacyProfileReader(ProfileReader):
|
|||
if "target_version" not in dict_of_doom:
|
||||
Logger.log("e", "Dictionary of Doom has no target version. Is it the correct JSON file?")
|
||||
return None
|
||||
if Profile.ProfileVersion != 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))
|
||||
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 current instance container version (version %s)!", dict_of_doom["target_version"], str(InstanceContainer.Version))
|
||||
return None
|
||||
|
||||
if "translation" not in dict_of_doom:
|
||||
Logger.log("e", "Dictionary of Doom has no translation. Is it the correct JSON file?")
|
||||
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.
|
||||
old_setting_expression = dict_of_doom["translation"][new_setting]
|
||||
compiled = compile(old_setting_expression, new_setting, "eval")
|
||||
try:
|
||||
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.
|
||||
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.")
|
||||
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!
|
||||
|
||||
if len(profile.getChangedSettings()) == 0:
|
||||
|
|
|
@ -13,7 +13,7 @@ def getMetaData():
|
|||
"author": "Ultimaker",
|
||||
"version": "1.0",
|
||||
"description": catalog.i18nc("@info:whatsthis", "Provides support for importing profiles from legacy Cura versions."),
|
||||
"api": 2
|
||||
"api": 3
|
||||
},
|
||||
"profile_reader": [
|
||||
{
|
||||
|
|
29
plugins/PerObjectSettingsTool/PerObjectCategory.qml
Normal file
29
plugins/PerObjectSettingsTool/PerObjectCategory.qml
Normal 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)
|
||||
}
|
29
plugins/PerObjectSettingsTool/PerObjectItem.qml
Normal file
29
plugins/PerObjectSettingsTool/PerObjectItem.qml
Normal 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -7,8 +7,8 @@ from UM.Application import Application
|
|||
from UM.Qt.ListModel import ListModel
|
||||
from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator
|
||||
from UM.Scene.SceneNode import SceneNode
|
||||
from UM.Settings.SettingOverrideDecorator import SettingOverrideDecorator
|
||||
from UM.Settings.ProfileOverrideDecorator import ProfileOverrideDecorator
|
||||
#from UM.Settings.SettingOverrideDecorator import SettingOverrideDecorator
|
||||
#from UM.Settings.ProfileOverrideDecorator import ProfileOverrideDecorator
|
||||
|
||||
from . import SettingOverrideModel
|
||||
|
||||
|
@ -35,7 +35,7 @@ class PerObjectSettingsModel(ListModel):
|
|||
self.setProperty(self.find("id", object_id), "profile", profile_name)
|
||||
|
||||
profile = None
|
||||
if profile_name != "global":
|
||||
'''if profile_name != "global":
|
||||
profile = Application.getInstance().getMachineManager().findProfile(profile_name)
|
||||
|
||||
node = self._scene.findObject(object_id)
|
||||
|
@ -45,7 +45,7 @@ class PerObjectSettingsModel(ListModel):
|
|||
node.callDecoration("setProfile", profile)
|
||||
else:
|
||||
if node.getDecorator(ProfileOverrideDecorator):
|
||||
node.removeDecorator(ProfileOverrideDecorator)
|
||||
node.removeDecorator(ProfileOverrideDecorator)'''
|
||||
|
||||
@pyqtSlot("quint64", str)
|
||||
def addSettingOverride(self, object_id, key):
|
||||
|
@ -54,8 +54,8 @@ class PerObjectSettingsModel(ListModel):
|
|||
return
|
||||
|
||||
node = self._scene.findObject(object_id)
|
||||
if not node.getDecorator(SettingOverrideDecorator):
|
||||
node.addDecorator(SettingOverrideDecorator())
|
||||
#if not node.getDecorator(SettingOverrideDecorator):
|
||||
# node.addDecorator(SettingOverrideDecorator())
|
||||
|
||||
node.callDecoration("addSetting", key)
|
||||
|
||||
|
@ -64,8 +64,8 @@ class PerObjectSettingsModel(ListModel):
|
|||
node = self._scene.findObject(object_id)
|
||||
node.callDecoration("removeSetting", key)
|
||||
|
||||
if len(node.callDecoration("getAllSettings")) == 0:
|
||||
node.removeDecorator(SettingOverrideDecorator)
|
||||
#if len(node.callDecoration("getAllSettings")) == 0:
|
||||
# node.removeDecorator(SettingOverrideDecorator)
|
||||
|
||||
def _updateModel(self):
|
||||
self.clear()
|
||||
|
|
|
@ -6,7 +6,10 @@ import QtQuick.Controls 1.2
|
|||
import QtQuick.Controls.Styles 1.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 {
|
||||
id: base;
|
||||
|
@ -133,6 +136,7 @@ Item {
|
|||
id: settingPickDialog
|
||||
|
||||
title: catalog.i18nc("@title:window", "Pick a Setting to Customize")
|
||||
property string labelFilter: ""
|
||||
|
||||
TextField {
|
||||
id: filter;
|
||||
|
@ -145,123 +149,61 @@ Item {
|
|||
|
||||
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 {
|
||||
id: view;
|
||||
anchors {
|
||||
ScrollView
|
||||
{
|
||||
id: scrollView
|
||||
|
||||
anchors
|
||||
{
|
||||
top: filter.bottom;
|
||||
left: parent.left;
|
||||
right: parent.right;
|
||||
bottom: parent.bottom;
|
||||
}
|
||||
|
||||
Column {
|
||||
width: view.width - UM.Theme.getSize("default_margin").width * 2;
|
||||
height: childrenRect.height;
|
||||
|
||||
Repeater {
|
||||
id: settingList;
|
||||
|
||||
model: UM.SettingCategoriesModel { id: settingCategoriesModel; }
|
||||
|
||||
delegate: Item {
|
||||
id: delegateItem;
|
||||
|
||||
width: parent.width;
|
||||
height: childrenRect.height;
|
||||
visible: model.visible && settingsColumn.childrenHeight != 0 //If all children are hidden, the height is 0, and then the category header must also be hidden.
|
||||
|
||||
ToolButton {
|
||||
id: categoryHeader;
|
||||
text: model.name;
|
||||
checkable: true;
|
||||
width: parent.width;
|
||||
onCheckedChanged: settingsColumn.state != "" ? settingsColumn.state = "" : settingsColumn.state = "collapsed";
|
||||
|
||||
style: ButtonStyle {
|
||||
background: Rectangle
|
||||
ListView
|
||||
{
|
||||
width: control.width;
|
||||
height: control.height;
|
||||
color: control.hovered ? palette.highlight : "transparent";
|
||||
}
|
||||
label: Row
|
||||
id:listview
|
||||
model: UM.SettingDefinitionsModel
|
||||
{
|
||||
spacing: UM.Theme.getSize("default_margin").width;
|
||||
Image
|
||||
id: definitionsModel;
|
||||
containerId: Cura.MachineManager.activeDefinitionId
|
||||
filter:
|
||||
{
|
||||
anchors.verticalCenter: parent.verticalCenter;
|
||||
source: control.checked ? UM.Theme.getIcon("arrow_right") : UM.Theme.getIcon("arrow_bottom");
|
||||
"global_only": false
|
||||
}
|
||||
Label
|
||||
}
|
||||
delegate:Loader
|
||||
{
|
||||
text: control.text;
|
||||
font.bold: true;
|
||||
color: control.hovered ? palette.highlightedText : palette.text;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
id: loader
|
||||
|
||||
property variant settingsModel: model.settings;
|
||||
width: parent.width
|
||||
height: model.type != undefined ? UM.Theme.getSize("section").height : 0;
|
||||
|
||||
Column {
|
||||
id: settingsColumn;
|
||||
property var definition: model
|
||||
property var settingDefinitionsModel: definitionsModel
|
||||
|
||||
anchors.top: categoryHeader.bottom;
|
||||
|
||||
property real childrenHeight:
|
||||
asynchronous: true
|
||||
source:
|
||||
{
|
||||
var h = 0.0;
|
||||
for(var i in children)
|
||||
switch(model.type)
|
||||
{
|
||||
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; }
|
||||
}
|
||||
case "category":
|
||||
return "PerObjectCategory.qml"
|
||||
default:
|
||||
return "PerObjectItem.qml"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@ from PyQt5.QtCore import Qt, pyqtSlot, QUrl
|
|||
|
||||
from UM.Application import Application
|
||||
from UM.Qt.ListModel import ListModel
|
||||
from UM.Settings.SettingOverrideDecorator import SettingOverrideDecorator
|
||||
#from UM.Settings.SettingOverrideDecorator import SettingOverrideDecorator
|
||||
|
||||
class SettingOverrideModel(ListModel):
|
||||
KeyRole = Qt.UserRole + 1
|
||||
|
@ -29,9 +29,9 @@ class SettingOverrideModel(ListModel):
|
|||
self._node.decoratorsChanged.connect(self._onDecoratorsChanged)
|
||||
self._onDecoratorsChanged(None)
|
||||
|
||||
self._activeProfile = Application.getInstance().getMachineManager().getWorkingProfile() #To be able to get notified when a setting changes.
|
||||
self._activeProfile.settingValueChanged.connect(self._onProfileSettingValueChanged)
|
||||
Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onProfileChanged)
|
||||
#self._activeProfile = Application.getInstance().getMachineManager().getWorkingProfile() #To be able to get notified when a setting changes.
|
||||
#self._activeProfile.settingValueChanged.connect(self._onProfileSettingValueChanged)
|
||||
#Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onProfileChanged)
|
||||
|
||||
self.addRoleName(self.KeyRole, "key")
|
||||
self.addRoleName(self.LabelRole, "label")
|
||||
|
@ -53,7 +53,8 @@ class SettingOverrideModel(ListModel):
|
|||
self._decorator.setSettingValue(key, value)
|
||||
|
||||
def _onDecoratorsChanged(self, node):
|
||||
if not self._node.getDecorator(SettingOverrideDecorator):
|
||||
return
|
||||
'''if not self._node.getDecorator(SettingOverrideDecorator):
|
||||
self.clear()
|
||||
return
|
||||
|
||||
|
@ -61,7 +62,7 @@ class SettingOverrideModel(ListModel):
|
|||
self._decorator.settingAdded.connect(self._onSettingsChanged)
|
||||
self._decorator.settingRemoved.connect(self._onSettingsChanged)
|
||||
self._decorator.settingValueChanged.connect(self._onSettingValueChanged)
|
||||
self._onSettingsChanged()
|
||||
self._onSettingsChanged()'''
|
||||
|
||||
def _createOptionsModel(self, options):
|
||||
if not options:
|
||||
|
|
|
@ -13,7 +13,7 @@ def getMetaData():
|
|||
"author": "Ultimaker",
|
||||
"version": "1.0",
|
||||
"description": i18n_catalog.i18nc("@info:whatsthis", "Provides the Per Object Settings."),
|
||||
"api": 2
|
||||
"api": 3
|
||||
},
|
||||
"tool": {
|
||||
"name": i18n_catalog.i18nc("@label", "Per Object Settings"),
|
||||
|
|
|
@ -29,17 +29,26 @@ class RemovableDriveOutputDevice(OutputDevice):
|
|||
if self._writing:
|
||||
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:
|
||||
machine_file_formats = Application.getInstance().getMachineManager().getActiveMachineInstance().getMachineDefinition().getFileFormats()
|
||||
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.
|
||||
container = Application.getInstance().getGlobalContainerStack().findContainer({"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:
|
||||
Logger.log("e", "There are no file formats available to write with!")
|
||||
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"]
|
||||
|
||||
if file_name == None:
|
||||
if file_name is None:
|
||||
for n in BreadthFirstIterator(node):
|
||||
if n.getMeshData():
|
||||
file_name = n.getName()
|
||||
|
|
|
@ -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_overhangAngle", math.cos(math.radians(0)))
|
||||
|
||||
if Application.getInstance().getMachineManager().getWorkingProfile():
|
||||
profile = Application.getInstance().getMachineManager().getWorkingProfile()
|
||||
|
||||
if Application.getInstance().getGlobalContainerStack():
|
||||
if Preferences.getInstance().getValue("view/show_overhang"):
|
||||
angle = profile.getSettingValue("support_angle")
|
||||
if angle != None:
|
||||
angle = Application.getInstance().getGlobalContainerStack().getProperty("support_angle", "value")
|
||||
if angle is not None:
|
||||
self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(90 - angle)))
|
||||
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.
|
||||
|
|
|
@ -13,7 +13,7 @@ def getMetaData():
|
|||
"author": "Ultimaker",
|
||||
"version": "1.0",
|
||||
"description": i18n_catalog.i18nc("@info:whatsthis", "Provides a normal solid mesh view."),
|
||||
"api": 2
|
||||
"api": 3
|
||||
},
|
||||
"view": {
|
||||
"name": i18n_catalog.i18nc("@item:inmenu", "Solid"),
|
||||
|
|
|
@ -13,7 +13,7 @@ def getMetaData():
|
|||
"author": "Ultimaker",
|
||||
"version": "1.0",
|
||||
"description": catalog.i18nc("@info:whatsthis", "Provides the X-Ray view."),
|
||||
"api": 2
|
||||
"api": 3
|
||||
},
|
||||
"view": {
|
||||
"name": catalog.i18nc("@item:inlistbox", "X-Ray"),
|
||||
|
|
135
plugins/XmlMaterialProfile/XmlMaterialProfile.py
Normal file
135
plugins/XmlMaterialProfile/XmlMaterialProfile.py
Normal 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"
|
||||
}
|
32
plugins/XmlMaterialProfile/__init__.py
Normal file
32
plugins/XmlMaterialProfile/__init__.py
Normal 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") }
|
||||
|
93
resources/definitions/bq_hephestos.def.json
Normal file
93
resources/definitions/bq_hephestos.def.json
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
47
resources/definitions/bq_hephestos_2.def.json
Normal file
47
resources/definitions/bq_hephestos_2.def.json
Normal 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 }
|
||||
}
|
||||
}
|
93
resources/definitions/bq_hephestos_xl.def.json
Normal file
93
resources/definitions/bq_hephestos_xl.def.json
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
94
resources/definitions/bq_witbox.def.json
Normal file
94
resources/definitions/bq_witbox.def.json
Normal 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
|
||||
}
|
||||
|
||||
}
|
||||
}
|
111
resources/definitions/bq_witbox_2.def.json
Normal file
111
resources/definitions/bq_witbox_2.def.json
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
2900
resources/definitions/fdmprinter.def.json
Normal file
2900
resources/definitions/fdmprinter.def.json
Normal file
File diff suppressed because it is too large
Load diff
59
resources/definitions/grr_neo.def.json
Normal file
59
resources/definitions/grr_neo.def.json
Normal 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"
|
||||
}
|
||||
}
|
||||
}
|
99
resources/definitions/innovo_inventor.def.json
Normal file
99
resources/definitions/innovo_inventor.def.json
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
57
resources/definitions/m180.def.json
Normal file
57
resources/definitions/m180.def.json
Normal 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"
|
||||
}
|
||||
}
|
||||
}
|
176
resources/definitions/maker_starter.def.json
Normal file
176
resources/definitions/maker_starter.def.json
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
65
resources/definitions/prusa_i3.def.json
Normal file
65
resources/definitions/prusa_i3.def.json
Normal 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"
|
||||
}
|
||||
}
|
||||
}
|
65
resources/definitions/prusa_i3_xl.def.json
Normal file
65
resources/definitions/prusa_i3_xl.def.json
Normal 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"
|
||||
}
|
||||
}
|
||||
}
|
102
resources/definitions/rigidbot.def.json
Normal file
102
resources/definitions/rigidbot.def.json
Normal 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\""
|
||||
}
|
||||
}
|
||||
}
|
105
resources/definitions/rigidbot_big.def.json
Normal file
105
resources/definitions/rigidbot_big.def.json
Normal 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\""
|
||||
}
|
||||
}
|
||||
}
|
14
resources/definitions/ultimaker.def.json
Normal file
14
resources/definitions/ultimaker.def.json
Normal 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"
|
||||
}
|
||||
}
|
108
resources/definitions/ultimaker2.def.json
Normal file
108
resources/definitions/ultimaker2.def.json
Normal 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"
|
||||
}
|
||||
}
|
||||
}
|
21
resources/definitions/ultimaker2_extended.def.json
Normal file
21
resources/definitions/ultimaker2_extended.def.json
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
30
resources/definitions/ultimaker2_extended_plus.def.json
Normal file
30
resources/definitions/ultimaker2_extended_plus.def.json
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
39
resources/definitions/ultimaker2_go.def.json
Normal file
39
resources/definitions/ultimaker2_go.def.json
Normal 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]]
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
74
resources/definitions/ultimaker2_plus.def.json
Normal file
74
resources/definitions/ultimaker2_plus.def.json
Normal 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]]
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
68
resources/definitions/ultimaker_original.def.json
Normal file
68
resources/definitions/ultimaker_original.def.json
Normal 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"
|
||||
}
|
||||
}
|
||||
}
|
26
resources/definitions/ultimaker_original_plus.def.json
Normal file
26
resources/definitions/ultimaker_original_plus.def.json
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
55
resources/definitions/uniqbot_one.def.json
Normal file
55
resources/definitions/uniqbot_one.def.json
Normal 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"
|
||||
}
|
||||
}
|
||||
}
|
9
resources/instances/high_quality.inst.cfg
Normal file
9
resources/instances/high_quality.inst.cfg
Normal file
|
@ -0,0 +1,9 @@
|
|||
[general]
|
||||
version = 2
|
||||
name = high
|
||||
definition = fdmprinter
|
||||
|
||||
[metadata]
|
||||
type = quality
|
||||
|
||||
[values]
|
9
resources/instances/normal_quality.inst.cfg
Normal file
9
resources/instances/normal_quality.inst.cfg
Normal file
|
@ -0,0 +1,9 @@
|
|||
[general]
|
||||
version = 2
|
||||
name = normal
|
||||
definition = fdmprinter
|
||||
|
||||
[metadata]
|
||||
type = quality
|
||||
|
||||
[values]
|
|
@ -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" } }
|
||||
}
|
||||
}
|
|
@ -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" } }
|
||||
}
|
||||
}
|
|
@ -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 }
|
||||
}
|
||||
}
|
|
@ -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 }
|
||||
}
|
||||
}
|
|
@ -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 }
|
||||
}
|
||||
}
|
|
@ -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 }
|
||||
}
|
||||
}
|
|
@ -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 }
|
||||
}
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -121,15 +121,6 @@
|
|||
"default": [],
|
||||
"global_only": true
|
||||
},
|
||||
"machine_platform_offset": {
|
||||
"description": "Where to display the platform mesh.",
|
||||
"default": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"global_only": true
|
||||
},
|
||||
"machine_head_polygon": {
|
||||
"description": "A 2D silhouette of the print head (fan caps excluded).",
|
||||
"type": "polygon",
|
||||
|
|
|
@ -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 }
|
||||
}
|
||||
}
|
|
@ -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 }
|
||||
}
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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 }
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
}
|
|
@ -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" }
|
||||
}
|
||||
}
|
|
@ -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 }
|
||||
}
|
||||
}
|
|
@ -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 }
|
||||
}
|
||||
}
|
|
@ -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 }
|
||||
}
|
||||
}
|
|
@ -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 }
|
||||
}
|
||||
}
|
|
@ -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 }
|
||||
}
|
||||
}
|
|
@ -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 }
|
||||
}
|
||||
}
|
|
@ -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] }
|
||||
}
|
||||
}
|
|
@ -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]]
|
||||
]}
|
||||
}
|
||||
}
|
|
@ -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 }
|
||||
}
|
||||
}
|
|
@ -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 }
|
||||
}
|
||||
}
|
|
@ -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 }
|
||||
}
|
||||
}
|
|
@ -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 }
|
||||
}
|
||||
}
|
|
@ -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 }
|
||||
}
|
||||
}
|
|
@ -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 }
|
||||
}
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
12
resources/materials/abs.inst.cfg
Normal file
12
resources/materials/abs.inst.cfg
Normal 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
|
11
resources/materials/cpe.inst.cfg
Normal file
11
resources/materials/cpe.inst.cfg
Normal file
|
@ -0,0 +1,11 @@
|
|||
[general]
|
||||
version = 2
|
||||
name = CPE
|
||||
definition = fdmprinter
|
||||
|
||||
[metadata]
|
||||
type = material
|
||||
|
||||
[values]
|
||||
material_print_temperature = 250
|
||||
material_bed_temperature = 70
|
47
resources/materials/generic_pla.xml.fdm_material
Normal file
47
resources/materials/generic_pla.xml.fdm_material
Normal 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>
|
10
resources/materials/pla.inst.cfg
Normal file
10
resources/materials/pla.inst.cfg
Normal file
|
@ -0,0 +1,10 @@
|
|||
[general]
|
||||
version = 2
|
||||
name = PLA
|
||||
definition = fdmprinter
|
||||
|
||||
[metadata]
|
||||
type = material
|
||||
|
||||
[values]
|
||||
material_bed_temperature = 60
|
|
@ -1,6 +1,8 @@
|
|||
// Copyright (c) 2015 Ultimaker B.V.
|
||||
// Cura is released under the terms of the AGPLv3 or higher.
|
||||
|
||||
pragma Singleton
|
||||
|
||||
import QtQuick 2.2
|
||||
import QtQuick.Controls 1.1
|
||||
import UM 1.1 as UM
|
||||
|
@ -45,6 +47,8 @@ Item
|
|||
|
||||
property alias toggleFullScreen: toggleFullScreenAction;
|
||||
|
||||
property alias configureSettingVisibility: configureSettingVisibilityAction
|
||||
|
||||
UM.I18nCatalog{id: catalog; name:"cura"}
|
||||
|
||||
Action
|
||||
|
@ -60,6 +64,8 @@ Item
|
|||
text: catalog.i18nc("@action:inmenu menubar:edit","&Undo");
|
||||
iconName: "edit-undo";
|
||||
shortcut: StandardKey.Undo;
|
||||
onTriggered: UM.OperationStack.undo();
|
||||
enabled: UM.OperationStack.canUndo;
|
||||
}
|
||||
|
||||
Action
|
||||
|
@ -68,6 +74,8 @@ Item
|
|||
text: catalog.i18nc("@action:inmenu menubar:edit","&Redo");
|
||||
iconName: "edit-redo";
|
||||
shortcut: StandardKey.Redo;
|
||||
onTriggered: UM.OperationStack.redo();
|
||||
enabled: UM.OperationStack.canRedo;
|
||||
}
|
||||
|
||||
Action
|
||||
|
@ -103,6 +111,7 @@ Item
|
|||
id: updateProfileAction;
|
||||
enabled: UM.ActiveProfile.valid && !UM.ActiveProfile.readOnly && UM.ActiveProfile.hasCustomisedValues
|
||||
text: catalog.i18nc("@action:inmenu menubar:profile","&Update Current Profile");
|
||||
onTriggered: UM.ActiveProfile.updateProfile();
|
||||
}
|
||||
|
||||
Action
|
||||
|
@ -110,6 +119,7 @@ Item
|
|||
id: resetProfileAction;
|
||||
enabled: UM.ActiveProfile.valid && UM.ActiveProfile.hasCustomisedValues
|
||||
text: catalog.i18nc("@action:inmenu menubar:profile","&Reload Current Profile");
|
||||
onTriggered: UM.ActiveProfile.discardChanges();
|
||||
}
|
||||
|
||||
Action
|
||||
|
@ -132,12 +142,14 @@ Item
|
|||
text: catalog.i18nc("@action:inmenu menubar:help","Show Online &Documentation");
|
||||
iconName: "help-contents";
|
||||
shortcut: StandardKey.Help;
|
||||
onTriggered: CuraActions.openDocumentation();
|
||||
}
|
||||
|
||||
Action {
|
||||
id: reportBugAction;
|
||||
text: catalog.i18nc("@action:inmenu menubar:help","Report a &Bug");
|
||||
iconName: "tools-report-bug";
|
||||
onTriggered: CuraActions.openBugReportPage();
|
||||
}
|
||||
|
||||
Action
|
||||
|
@ -154,6 +166,7 @@ Item
|
|||
enabled: UM.Controller.toolsEnabled;
|
||||
iconName: "edit-delete";
|
||||
shortcut: StandardKey.Delete;
|
||||
onTriggered: Printer.deleteSelection();
|
||||
}
|
||||
|
||||
Action
|
||||
|
@ -177,6 +190,7 @@ Item
|
|||
enabled: UM.Scene.numObjectsSelected > 1 ? true: false
|
||||
iconName: "object-group"
|
||||
shortcut: "Ctrl+G";
|
||||
onTriggered: Printer.groupSelected();
|
||||
}
|
||||
|
||||
Action
|
||||
|
@ -186,6 +200,7 @@ Item
|
|||
enabled: UM.Scene.isGroupSelected
|
||||
iconName: "object-ungroup"
|
||||
shortcut: "Ctrl+Shift+G";
|
||||
onTriggered: Printer.ungroupSelected();
|
||||
}
|
||||
|
||||
Action
|
||||
|
@ -195,6 +210,7 @@ Item
|
|||
enabled: UM.Scene.numObjectsSelected > 1 ? true: false
|
||||
iconName: "merge";
|
||||
shortcut: "Ctrl+Alt+G";
|
||||
onTriggered: Printer.mergeSelected();
|
||||
}
|
||||
|
||||
Action
|
||||
|
@ -211,6 +227,7 @@ Item
|
|||
enabled: UM.Controller.toolsEnabled;
|
||||
iconName: "edit-delete";
|
||||
shortcut: "Ctrl+D";
|
||||
onTriggered: Printer.deleteAll();
|
||||
}
|
||||
|
||||
Action
|
||||
|
@ -218,18 +235,21 @@ Item
|
|||
id: reloadAllAction;
|
||||
text: catalog.i18nc("@action:inmenu menubar:file","Re&load All Objects");
|
||||
iconName: "document-revert";
|
||||
onTriggered: Printer.reloadAll();
|
||||
}
|
||||
|
||||
Action
|
||||
{
|
||||
id: resetAllTranslationAction;
|
||||
text: catalog.i18nc("@action:inmenu menubar:edit","Reset All Object Positions");
|
||||
onTriggered: Printer.resetAllTranslation();
|
||||
}
|
||||
|
||||
Action
|
||||
{
|
||||
id: resetAllAction;
|
||||
text: catalog.i18nc("@action:inmenu menubar:edit","Reset All Object &Transformations");
|
||||
onTriggered: Printer.resetAll();
|
||||
}
|
||||
|
||||
Action
|
||||
|
@ -247,4 +267,10 @@ Item
|
|||
iconName: "view-list-text";
|
||||
shortcut: StandardKey.WhatsThis;
|
||||
}
|
||||
|
||||
Action
|
||||
{
|
||||
id: configureSettingVisibilityAction
|
||||
text: catalog.i18nc("@action:menu", "Configure setting visiblity...");
|
||||
}
|
||||
}
|
||||
|
|
178
resources/qml/AddMachineDialog.qml
Normal file
178
resources/qml/AddMachineDialog.qml
Normal 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; }
|
||||
}
|
||||
}
|
|
@ -7,7 +7,10 @@ import QtQuick.Controls.Styles 1.1
|
|||
import QtQuick.Layouts 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
|
||||
{
|
||||
|
@ -53,7 +56,7 @@ UM.MainWindow
|
|||
title: catalog.i18nc("@title:menu menubar:toplevel","&File");
|
||||
|
||||
MenuItem {
|
||||
action: actions.open;
|
||||
action: Actions.open;
|
||||
}
|
||||
|
||||
Menu
|
||||
|
@ -115,11 +118,11 @@ UM.MainWindow
|
|||
}
|
||||
}
|
||||
|
||||
MenuItem { action: actions.reloadAll; }
|
||||
MenuItem { action: Actions.reloadAll; }
|
||||
|
||||
MenuSeparator { }
|
||||
|
||||
MenuItem { action: actions.quit; }
|
||||
MenuItem { action: Actions.quit; }
|
||||
}
|
||||
|
||||
Menu
|
||||
|
@ -127,17 +130,17 @@ UM.MainWindow
|
|||
//: Edit menu
|
||||
title: catalog.i18nc("@title:menu menubar:toplevel","&Edit");
|
||||
|
||||
MenuItem { action: actions.undo; }
|
||||
MenuItem { action: actions.redo; }
|
||||
MenuItem { action: Actions.undo; }
|
||||
MenuItem { action: Actions.redo; }
|
||||
MenuSeparator { }
|
||||
MenuItem { action: actions.deleteSelection; }
|
||||
MenuItem { action: actions.deleteAll; }
|
||||
MenuItem { action: actions.resetAllTranslation; }
|
||||
MenuItem { action: actions.resetAll; }
|
||||
MenuItem { action: Actions.deleteSelection; }
|
||||
MenuItem { action: Actions.deleteAll; }
|
||||
MenuItem { action: Actions.resetAllTranslation; }
|
||||
MenuItem { action: Actions.resetAll; }
|
||||
MenuSeparator { }
|
||||
MenuItem { action: actions.groupObjects;}
|
||||
MenuItem { action: actions.mergeObjects;}
|
||||
MenuItem { action: actions.unGroupObjects;}
|
||||
MenuItem { action: Actions.groupObjects;}
|
||||
MenuItem { action: Actions.mergeObjects;}
|
||||
MenuItem { action: Actions.unGroupObjects;}
|
||||
}
|
||||
|
||||
Menu
|
||||
|
@ -168,14 +171,17 @@ UM.MainWindow
|
|||
|
||||
Instantiator
|
||||
{
|
||||
model: UM.MachineInstancesModel { }
|
||||
model: UM.ContainerStacksModel
|
||||
{
|
||||
filter: {"type": "machine"}
|
||||
}
|
||||
MenuItem
|
||||
{
|
||||
text: model.name;
|
||||
checkable: true;
|
||||
checked: model.active;
|
||||
exclusiveGroup: machineMenuGroup;
|
||||
onTriggered: UM.MachineManager.setActiveMachineInstance(model.name)
|
||||
checked: Cura.MachineManager.activeMachineId == model.id
|
||||
exclusiveGroup: machineSelectionMenuGroup;
|
||||
onTriggered: Cura.MachineManager.setActiveMachine(model.id);
|
||||
}
|
||||
onObjectAdded: machineMenu.insertItem(index, object)
|
||||
onObjectRemoved: machineMenu.removeItem(object)
|
||||
|
@ -187,13 +193,20 @@ UM.MainWindow
|
|||
|
||||
Instantiator
|
||||
{
|
||||
model: UM.MachineVariantsModel { }
|
||||
model: UM.InstanceContainersModel
|
||||
{
|
||||
filter:
|
||||
{
|
||||
"type": "variant",
|
||||
"definition": Cura.MachineManager.activeDefinitionId //Only show variants of this machine
|
||||
}
|
||||
}
|
||||
MenuItem {
|
||||
text: model.name;
|
||||
checkable: true;
|
||||
checked: model.active;
|
||||
checked: model.id == Cura.MachineManager.activeVariantId;
|
||||
exclusiveGroup: machineVariantsGroup;
|
||||
onTriggered: UM.MachineManager.setActiveMachineVariant(model.name)
|
||||
onTriggered: Cura.MachineManager.setActiveVariant(model.id)
|
||||
}
|
||||
onObjectAdded: machineMenu.insertItem(index, object)
|
||||
onObjectRemoved: machineMenu.removeItem(object)
|
||||
|
@ -201,10 +214,10 @@ UM.MainWindow
|
|||
|
||||
ExclusiveGroup { id: machineVariantsGroup; }
|
||||
|
||||
MenuSeparator { visible: UM.MachineManager.hasVariants; }
|
||||
MenuSeparator { visible: Cura.MachineManager.hasVariants; }
|
||||
|
||||
MenuItem { action: actions.addMachine; }
|
||||
MenuItem { action: actions.configureMachines; }
|
||||
MenuItem { action: Actions.addMachine; }
|
||||
MenuItem { action: Actions.configureMachines; }
|
||||
}
|
||||
|
||||
Menu
|
||||
|
@ -215,7 +228,7 @@ UM.MainWindow
|
|||
Instantiator
|
||||
{
|
||||
id: profileMenuInstantiator
|
||||
model: UM.ProfilesModel {}
|
||||
// model: UM.ProfilesModel {}
|
||||
property int separatorIndex: -1
|
||||
|
||||
Loader {
|
||||
|
@ -277,11 +290,11 @@ UM.MainWindow
|
|||
|
||||
MenuSeparator { id: profileMenuSeparator }
|
||||
|
||||
MenuItem { action: actions.updateProfile; }
|
||||
MenuItem { action: actions.resetProfile; }
|
||||
MenuItem { action: actions.addProfile; }
|
||||
MenuItem { action: Actions.updateProfile; }
|
||||
MenuItem { action: Actions.resetProfile; }
|
||||
MenuItem { action: Actions.addProfile; }
|
||||
MenuSeparator { }
|
||||
MenuItem { action: actions.manageProfiles; }
|
||||
MenuItem { action: Actions.manageProfiles; }
|
||||
}
|
||||
|
||||
Menu
|
||||
|
@ -292,7 +305,7 @@ UM.MainWindow
|
|||
|
||||
Instantiator
|
||||
{
|
||||
model: UM.Models.extensionModel
|
||||
model: UM.ExtensionModel { }
|
||||
|
||||
Menu
|
||||
{
|
||||
|
@ -323,7 +336,7 @@ UM.MainWindow
|
|||
//: Settings menu
|
||||
title: catalog.i18nc("@title:menu menubar:toplevel","&Settings");
|
||||
|
||||
MenuItem { action: actions.preferences; }
|
||||
MenuItem { action: Actions.preferences; }
|
||||
}
|
||||
|
||||
Menu
|
||||
|
@ -331,11 +344,11 @@ UM.MainWindow
|
|||
//: Help menu
|
||||
title: catalog.i18nc("@title:menu menubar:toplevel","&Help");
|
||||
|
||||
MenuItem { action: actions.showEngineLog; }
|
||||
MenuItem { action: actions.documentation; }
|
||||
MenuItem { action: actions.reportBug; }
|
||||
MenuItem { action: Actions.showEngineLog; }
|
||||
MenuItem { action: Actions.documentation; }
|
||||
MenuItem { action: Actions.reportBug; }
|
||||
MenuSeparator { }
|
||||
MenuItem { action: actions.about; }
|
||||
MenuItem { action: Actions.about; }
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -425,7 +438,7 @@ UM.MainWindow
|
|||
left: parent.left;
|
||||
//leftMargin: UM.Theme.getSize("loadfile_margin").width
|
||||
}
|
||||
action: actions.open;
|
||||
action: Actions.open;
|
||||
}
|
||||
|
||||
Image
|
||||
|
@ -513,22 +526,12 @@ UM.MainWindow
|
|||
|
||||
width: UM.Theme.getSize("sidebar").width;
|
||||
|
||||
addMachineAction: actions.addMachine;
|
||||
configureMachinesAction: actions.configureMachines;
|
||||
addProfileAction: actions.addProfile;
|
||||
updateProfileAction: actions.updateProfile;
|
||||
resetProfileAction: actions.resetProfile;
|
||||
manageProfilesAction: actions.manageProfiles;
|
||||
|
||||
configureSettingsAction: Action
|
||||
{
|
||||
onTriggered:
|
||||
{
|
||||
preferences.visible = true;
|
||||
preferences.setPage(2);
|
||||
preferences.getCurrentItem().scrollToSection(source.key);
|
||||
}
|
||||
}
|
||||
addMachineAction: Actions.addMachine;
|
||||
configureMachinesAction: Actions.configureMachines;
|
||||
addProfileAction: Actions.addProfile;
|
||||
updateProfileAction: Actions.updateProfile;
|
||||
resetProfileAction: Actions.resetProfile;
|
||||
manageProfilesAction: Actions.manageProfiles;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -546,6 +549,12 @@ UM.MainWindow
|
|||
//: View preferences page title
|
||||
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
|
||||
setPage(0);
|
||||
}
|
||||
|
@ -561,73 +570,16 @@ UM.MainWindow
|
|||
}
|
||||
}
|
||||
|
||||
Actions
|
||||
Connections
|
||||
{
|
||||
id: actions;
|
||||
|
||||
open.onTriggered: openDialog.open();
|
||||
|
||||
quit.onTriggered: base.visible = false;
|
||||
|
||||
undo.onTriggered: UM.OperationStack.undo();
|
||||
undo.enabled: UM.OperationStack.canUndo;
|
||||
redo.onTriggered: UM.OperationStack.redo();
|
||||
redo.enabled: UM.OperationStack.canRedo;
|
||||
|
||||
deleteSelection.onTriggered:
|
||||
{
|
||||
Printer.deleteSelection();
|
||||
target: Actions.preferences
|
||||
onTriggered: preferences.visible = true
|
||||
}
|
||||
|
||||
deleteObject.onTriggered:
|
||||
Connections
|
||||
{
|
||||
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:
|
||||
target: Actions.addProfile
|
||||
onTriggered:
|
||||
{
|
||||
UM.MachineManager.createProfile();
|
||||
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
|
||||
showProfileNameDialogTimer.start();
|
||||
}
|
||||
updateProfile.onTriggered: UM.ActiveProfile.updateProfile();
|
||||
resetProfile.onTriggered: UM.ActiveProfile.discardChanges();
|
||||
}
|
||||
|
||||
preferences.onTriggered: preferences.visible = true;
|
||||
configureMachines.onTriggered:
|
||||
Connections
|
||||
{
|
||||
target: Actions.configureMachines
|
||||
onTriggered:
|
||||
{
|
||||
preferences.visible = true;
|
||||
preferences.setPage(3);
|
||||
}
|
||||
manageProfiles.onTriggered:
|
||||
}
|
||||
|
||||
Connections
|
||||
{
|
||||
target: Actions.manageProfiles
|
||||
onTriggered:
|
||||
{
|
||||
preferences.visible = true;
|
||||
preferences.setPage(4);
|
||||
}
|
||||
}
|
||||
|
||||
documentation.onTriggered: CuraActions.openDocumentation();
|
||||
reportBug.onTriggered: CuraActions.openBugReportPage();
|
||||
showEngineLog.onTriggered: engineLog.visible = true;
|
||||
about.onTriggered: aboutDialog.visible = true;
|
||||
toggleFullScreen.onTriggered: base.toggleFullscreen();
|
||||
Connections
|
||||
{
|
||||
target: Actions.configureSettingVisibility
|
||||
onTriggered:
|
||||
{
|
||||
preferences.visible = true;
|
||||
preferences.setPage(2);
|
||||
preferences.getCurrentItem().scrollToSection(source.key);
|
||||
}
|
||||
}
|
||||
|
||||
Timer
|
||||
|
@ -672,31 +635,70 @@ UM.MainWindow
|
|||
id: objectContextMenu;
|
||||
|
||||
property variant objectId: -1;
|
||||
MenuItem { action: actions.centerObject; }
|
||||
MenuItem { action: actions.deleteObject; }
|
||||
MenuItem { action: actions.multiplyObject; }
|
||||
MenuItem { action: Actions.centerObject; }
|
||||
MenuItem { action: Actions.deleteObject; }
|
||||
MenuItem { action: Actions.multiplyObject; }
|
||||
MenuSeparator { }
|
||||
MenuItem { action: actions.deleteAll; }
|
||||
MenuItem { action: actions.reloadAll; }
|
||||
MenuItem { action: actions.resetAllTranslation; }
|
||||
MenuItem { action: actions.resetAll; }
|
||||
MenuItem { action: Actions.deleteAll; }
|
||||
MenuItem { action: Actions.reloadAll; }
|
||||
MenuItem { action: Actions.resetAllTranslation; }
|
||||
MenuItem { action: Actions.resetAll; }
|
||||
MenuSeparator { }
|
||||
MenuItem { action: actions.groupObjects; }
|
||||
MenuItem { action: actions.mergeObjects; }
|
||||
MenuItem { action: actions.unGroupObjects; }
|
||||
MenuItem { action: Actions.groupObjects; }
|
||||
MenuItem { action: Actions.mergeObjects; }
|
||||
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
|
||||
{
|
||||
id: contextMenu;
|
||||
MenuItem { action: actions.deleteAll; }
|
||||
MenuItem { action: actions.reloadAll; }
|
||||
MenuItem { action: actions.resetAllTranslation; }
|
||||
MenuItem { action: actions.resetAll; }
|
||||
MenuItem { action: Actions.deleteAll; }
|
||||
MenuItem { action: Actions.reloadAll; }
|
||||
MenuItem { action: Actions.resetAllTranslation; }
|
||||
MenuItem { action: Actions.resetAll; }
|
||||
MenuSeparator { }
|
||||
MenuItem { action: actions.groupObjects; }
|
||||
MenuItem { action: actions.mergeObjects; }
|
||||
MenuItem { action: actions.unGroupObjects; }
|
||||
MenuItem { action: Actions.groupObjects; }
|
||||
MenuItem { action: Actions.mergeObjects; }
|
||||
MenuItem { action: Actions.unGroupObjects; }
|
||||
}
|
||||
|
||||
Connections
|
||||
|
@ -715,6 +717,18 @@ UM.MainWindow
|
|||
}
|
||||
}
|
||||
|
||||
Connections
|
||||
{
|
||||
target: Actions.quit
|
||||
onTriggered: base.visible = false;
|
||||
}
|
||||
|
||||
Connections
|
||||
{
|
||||
target: Actions.toggleFullScreen
|
||||
onTriggered: base.toggleFullscreen();
|
||||
}
|
||||
|
||||
FileDialog
|
||||
{
|
||||
id: openDialog;
|
||||
|
@ -739,14 +753,32 @@ UM.MainWindow
|
|||
}
|
||||
}
|
||||
|
||||
Connections
|
||||
{
|
||||
target: Actions.open
|
||||
onTriggered: openDialog.open()
|
||||
}
|
||||
|
||||
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
|
||||
|
@ -754,13 +786,19 @@ UM.MainWindow
|
|||
id: aboutDialog
|
||||
}
|
||||
|
||||
Connections
|
||||
{
|
||||
target: Actions.about
|
||||
onTriggered: aboutDialog.visible = true;
|
||||
}
|
||||
|
||||
Connections
|
||||
{
|
||||
target: Printer
|
||||
onRequestAddPrinter:
|
||||
{
|
||||
addMachineWizard.visible = true
|
||||
addMachineWizard.firstRun = false
|
||||
addMachineDialog.visible = true
|
||||
addMachineDialog.firstRun = false
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -777,10 +815,9 @@ UM.MainWindow
|
|||
base.visible = true;
|
||||
restart();
|
||||
}
|
||||
else if(UM.MachineManager.activeMachineInstance == "")
|
||||
else if(Cura.MachineManager.activeMachineId == null || Cura.MachineManager.activeMachineId == "")
|
||||
{
|
||||
addMachineWizard.firstRun = true;
|
||||
addMachineWizard.open();
|
||||
addMachineDialog.open();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,15 +7,16 @@ import QtQuick.Controls.Styles 1.1
|
|||
import QtQuick.Layouts 1.1
|
||||
|
||||
import UM 1.1 as UM
|
||||
import Cura 1.0 as Cura
|
||||
|
||||
Rectangle {
|
||||
id: base;
|
||||
|
||||
property bool activity: Printer.getPlatformActivity;
|
||||
property string fileBaseName
|
||||
property variant activeMachineInstance: UM.MachineManager.activeMachineInstance
|
||||
property variant activeMachineName: Cura.MachineManager.activeMachineName
|
||||
|
||||
onActiveMachineInstanceChanged:
|
||||
onActiveMachineNameChanged:
|
||||
{
|
||||
base.createFileName()
|
||||
}
|
||||
|
@ -28,36 +29,48 @@ Rectangle {
|
|||
height: childrenRect.height
|
||||
color: "transparent"
|
||||
|
||||
function createFileName(){
|
||||
var splitMachineName = UM.MachineManager.activeMachineInstance.split(" ")
|
||||
var abbrMachine = ''
|
||||
if ((UM.Preferences.getValue("cura/jobname_prefix"))) {
|
||||
for (var i = 0; i < splitMachineName.length; i++){
|
||||
if (splitMachineName[i].search(/ultimaker/i) != -1){
|
||||
abbrMachine += 'UM'
|
||||
function createFileName()
|
||||
{
|
||||
var splitMachineName = Cura.MachineManager.activeMachineName.split(" ")
|
||||
var abbrMachine = "";
|
||||
if ((UM.Preferences.getValue("cura/jobname_prefix")))
|
||||
{
|
||||
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)
|
||||
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]
|
||||
|
||||
if (resultAdditives != null)
|
||||
{
|
||||
for (var j = 0; j < resultAdditives.length; j++)
|
||||
{
|
||||
abbrMachine += resultAdditives[j];
|
||||
}
|
||||
}
|
||||
printJobTextfield.text = abbrMachine + "_" + base.fileBaseName;
|
||||
}
|
||||
printJobTextfield.text = abbrMachine + '_' + base.fileBaseName
|
||||
} else {
|
||||
printJobTextfield.text = base.fileBaseName
|
||||
else
|
||||
{
|
||||
printJobTextfield.text = base.fileBaseName;
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
Connections
|
||||
{
|
||||
target: backgroundItem
|
||||
onHasMesh: {
|
||||
onHasMesh:
|
||||
{
|
||||
base.fileBaseName = name
|
||||
}
|
||||
}
|
||||
|
|
68
resources/qml/MachinesPage.qml
Normal file
68
resources/qml/MachinesPage.qml
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
217
resources/qml/Preferences/MaterialsPage.qml
Normal file
217
resources/qml/Preferences/MaterialsPage.qml
Normal 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";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
222
resources/qml/Preferences/ProfilesPage.qml
Normal file
222
resources/qml/Preferences/ProfilesPage.qml
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -6,7 +6,8 @@ import QtQuick.Controls 1.1
|
|||
import QtQuick.Controls.Styles 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{
|
||||
id: base;
|
||||
|
@ -41,13 +42,13 @@ Item{
|
|||
property int rightMargin: customisedSettings.visible ? customisedSettings.width + UM.Theme.getSize("default_margin").width / 2 : 0
|
||||
|
||||
id: globalProfileSelection
|
||||
text: UM.MachineManager.activeProfile
|
||||
text: Cura.MachineManager.activeQualityName
|
||||
width: parent.width/100*55
|
||||
height: UM.Theme.getSize("setting_control").height
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: UM.Theme.getSize("default_margin").width
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
tooltip: UM.MachineManager.activeProfile
|
||||
tooltip: Cura.MachineManager.activeQualityName
|
||||
style: UM.Theme.styles.sidebar_header_button
|
||||
|
||||
menu: Menu
|
||||
|
@ -56,7 +57,10 @@ Item{
|
|||
Instantiator
|
||||
{
|
||||
id: profileSelectionInstantiator
|
||||
model: UM.ProfilesModel {}
|
||||
model: UM.InstanceContainersModel
|
||||
{
|
||||
filter: {"type": "quality"}
|
||||
}
|
||||
property int separatorIndex: -1
|
||||
|
||||
Loader {
|
||||
|
@ -98,18 +102,18 @@ Item{
|
|||
id: item
|
||||
text: model_data ? model_data.name : ""
|
||||
checkable: true;
|
||||
checked: model_data ? model_data.active : false;
|
||||
checked: Cura.MachineManager.activeQualityId == model_data.id
|
||||
exclusiveGroup: profileSelectionMenuGroup;
|
||||
onTriggered:
|
||||
{
|
||||
UM.MachineManager.setActiveProfile(model_data.name);
|
||||
if (!model_data.active) {
|
||||
Cura.MachineManager.setActiveQuality(model_data.id);
|
||||
/*if (!model_data.active) {
|
||||
//Selecting a profile was canceled; undo menu selection
|
||||
profileSelectionInstantiator.model.setProperty(model_index, "active", false);
|
||||
var activeProfileName = UM.MachineManager.activeProfile;
|
||||
var activeProfileIndex = profileSelectionInstantiator.model.find("name", activeProfileName);
|
||||
profileSelectionInstantiator.model.setProperty(activeProfileIndex, "active", true);
|
||||
}
|
||||
}*/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
82
resources/qml/Settings/SettingCategory.qml
Normal file
82
resources/qml/Settings/SettingCategory.qml
Normal 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" }
|
||||
}
|
||||
}
|
78
resources/qml/Settings/SettingCheckBox.qml
Normal file
78
resources/qml/Settings/SettingCheckBox.qml
Normal 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
Loading…
Add table
Add a link
Reference in a new issue