mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-06 14:37:29 -06:00
Merge remote-tracking branch 'origin/master' into doxygen_to_restructuredtext_comments
# Conflicts: # cura/API/Account.py # plugins/SimulationView/SimulationView.py
This commit is contained in:
commit
c6e6c76962
1932 changed files with 5292 additions and 2002 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -53,6 +53,7 @@ plugins/GodMode
|
|||
plugins/OctoPrintPlugin
|
||||
plugins/ProfileFlattener
|
||||
plugins/SettingsGuide
|
||||
plugins/SettingsGuide2
|
||||
plugins/SVGToolpathReader
|
||||
plugins/X3GWriter
|
||||
|
||||
|
|
|
@ -1,9 +1,11 @@
|
|||
# Copyright (c) 2018 Ultimaker B.V.
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
from typing import Optional, Dict, TYPE_CHECKING
|
||||
from datetime import datetime
|
||||
from typing import Optional, Dict, TYPE_CHECKING, Union
|
||||
|
||||
from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot, pyqtProperty
|
||||
from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot, pyqtProperty, QTimer, Q_ENUMS
|
||||
|
||||
from UM.Logger import Logger
|
||||
from UM.Message import Message
|
||||
from UM.i18n import i18nCatalog
|
||||
from cura.OAuth2.AuthorizationService import AuthorizationService
|
||||
|
@ -16,9 +18,15 @@ if TYPE_CHECKING:
|
|||
i18n_catalog = i18nCatalog("cura")
|
||||
|
||||
|
||||
class SyncState:
|
||||
"""QML: Cura.AccountSyncState"""
|
||||
SYNCING = 0
|
||||
SUCCESS = 1
|
||||
ERROR = 2
|
||||
|
||||
class Account(QObject):
|
||||
"""The account API provides a version-proof bridge to use Ultimaker Accounts
|
||||
|
||||
|
||||
Usage:
|
||||
|
||||
.. code-block:: python
|
||||
|
@ -30,10 +38,22 @@ class Account(QObject):
|
|||
api.account.userProfile # Who is logged in
|
||||
"""
|
||||
|
||||
# The interval in which sync services are automatically triggered
|
||||
SYNC_INTERVAL = 30.0 # seconds
|
||||
Q_ENUMS(SyncState)
|
||||
|
||||
loginStateChanged = pyqtSignal(bool)
|
||||
"""Signal emitted when user logged in or out"""
|
||||
|
||||
accessTokenChanged = pyqtSignal()
|
||||
syncRequested = pyqtSignal()
|
||||
"""Sync services may connect to this signal to receive sync triggers.
|
||||
Services should be resilient to receiving a signal while they are still syncing,
|
||||
either by ignoring subsequent signals or restarting a sync.
|
||||
See setSyncState() for providing user feedback on the state of your service.
|
||||
"""
|
||||
lastSyncDateTimeChanged = pyqtSignal()
|
||||
syncStateChanged = pyqtSignal(int) # because SyncState is an int Enum
|
||||
|
||||
def __init__(self, application: "CuraApplication", parent = None) -> None:
|
||||
super().__init__(parent)
|
||||
|
@ -42,6 +62,8 @@ class Account(QObject):
|
|||
|
||||
self._error_message = None # type: Optional[Message]
|
||||
self._logged_in = False
|
||||
self._sync_state = SyncState.SUCCESS
|
||||
self._last_sync_str = "-"
|
||||
|
||||
self._callback_port = 32118
|
||||
self._oauth_root = UltimakerCloudAuthentication.CuraCloudAccountAPIRoot
|
||||
|
@ -61,6 +83,16 @@ class Account(QObject):
|
|||
|
||||
self._authorization_service = AuthorizationService(self._oauth_settings)
|
||||
|
||||
# Create a timer for automatic account sync
|
||||
self._update_timer = QTimer()
|
||||
self._update_timer.setInterval(int(self.SYNC_INTERVAL * 1000))
|
||||
# The timer is restarted explicitly after an update was processed. This prevents 2 concurrent updates
|
||||
self._update_timer.setSingleShot(True)
|
||||
self._update_timer.timeout.connect(self.syncRequested)
|
||||
|
||||
self._sync_services = {} # type: Dict[str, int]
|
||||
"""contains entries "service_name" : SyncState"""
|
||||
|
||||
def initialize(self) -> None:
|
||||
self._authorization_service.initialize(self._application.getPreferences())
|
||||
self._authorization_service.onAuthStateChanged.connect(self._onLoginStateChanged)
|
||||
|
@ -68,6 +100,39 @@ class Account(QObject):
|
|||
self._authorization_service.accessTokenChanged.connect(self._onAccessTokenChanged)
|
||||
self._authorization_service.loadAuthDataFromPreferences()
|
||||
|
||||
def setSyncState(self, service_name: str, state: int) -> None:
|
||||
""" Can be used to register sync services and update account sync states
|
||||
|
||||
Contract: A sync service is expected exit syncing state in all cases, within reasonable time
|
||||
|
||||
Example: `setSyncState("PluginSyncService", SyncState.SYNCING)`
|
||||
:param service_name: A unique name for your service, such as `plugins` or `backups`
|
||||
:param state: One of SyncState
|
||||
"""
|
||||
|
||||
prev_state = self._sync_state
|
||||
|
||||
self._sync_services[service_name] = state
|
||||
|
||||
if any(val == SyncState.SYNCING for val in self._sync_services.values()):
|
||||
self._sync_state = SyncState.SYNCING
|
||||
elif any(val == SyncState.ERROR for val in self._sync_services.values()):
|
||||
self._sync_state = SyncState.ERROR
|
||||
else:
|
||||
self._sync_state = SyncState.SUCCESS
|
||||
|
||||
if self._sync_state != prev_state:
|
||||
self.syncStateChanged.emit(self._sync_state)
|
||||
|
||||
if self._sync_state == SyncState.SUCCESS:
|
||||
self._last_sync_str = datetime.now().strftime("%d/%m/%Y %H:%M")
|
||||
self.lastSyncDateTimeChanged.emit()
|
||||
|
||||
if self._sync_state != SyncState.SYNCING:
|
||||
# schedule new auto update after syncing completed (for whatever reason)
|
||||
if not self._update_timer.isActive():
|
||||
self._update_timer.start()
|
||||
|
||||
def _onAccessTokenChanged(self):
|
||||
self.accessTokenChanged.emit()
|
||||
|
||||
|
@ -89,18 +154,37 @@ class Account(QObject):
|
|||
self._error_message.show()
|
||||
self._logged_in = False
|
||||
self.loginStateChanged.emit(False)
|
||||
if self._update_timer.isActive():
|
||||
self._update_timer.stop()
|
||||
return
|
||||
|
||||
if self._logged_in != logged_in:
|
||||
self._logged_in = logged_in
|
||||
self.loginStateChanged.emit(logged_in)
|
||||
if logged_in:
|
||||
self.sync()
|
||||
else:
|
||||
if self._update_timer.isActive():
|
||||
self._update_timer.stop()
|
||||
|
||||
@pyqtSlot()
|
||||
def login(self) -> None:
|
||||
@pyqtSlot(bool)
|
||||
def login(self, force_logout_before_login: bool = False) -> None:
|
||||
"""
|
||||
Initializes the login process. If the user is logged in already and force_logout_before_login is true, Cura will
|
||||
logout from the account before initiating the authorization flow. If the user is logged in and
|
||||
force_logout_before_login is false, the function will return, as there is nothing to do.
|
||||
|
||||
:param force_logout_before_login: Optional boolean parameter
|
||||
:return: None
|
||||
"""
|
||||
if self._logged_in:
|
||||
# Nothing to do, user already logged in.
|
||||
return
|
||||
self._authorization_service.startAuthorizationFlow()
|
||||
if force_logout_before_login:
|
||||
self.logout()
|
||||
else:
|
||||
# Nothing to do, user already logged in.
|
||||
return
|
||||
self._authorization_service.startAuthorizationFlow(force_logout_before_login)
|
||||
|
||||
@pyqtProperty(str, notify=loginStateChanged)
|
||||
def userName(self):
|
||||
|
@ -129,6 +213,25 @@ class Account(QObject):
|
|||
return None
|
||||
return user_profile.__dict__
|
||||
|
||||
@pyqtProperty(str, notify=lastSyncDateTimeChanged)
|
||||
def lastSyncDateTime(self) -> str:
|
||||
return self._last_sync_str
|
||||
|
||||
@pyqtSlot()
|
||||
def sync(self) -> None:
|
||||
"""Signals all sync services to start syncing
|
||||
|
||||
This can be considered a forced sync: even when a
|
||||
sync is currently running, a sync will be requested.
|
||||
"""
|
||||
|
||||
if self._update_timer.isActive():
|
||||
self._update_timer.stop()
|
||||
elif self._sync_state == SyncState.SYNCING:
|
||||
Logger.warning("Starting a new sync while previous sync was not completed\n{}", str(self._sync_services))
|
||||
|
||||
self.syncRequested.emit()
|
||||
|
||||
@pyqtSlot()
|
||||
def logout(self) -> None:
|
||||
if not self._logged_in:
|
||||
|
|
|
@ -48,6 +48,7 @@ from UM.Workspace.WorkspaceReader import WorkspaceReader
|
|||
from UM.i18n import i18nCatalog
|
||||
from cura import ApplicationMetadata
|
||||
from cura.API import CuraAPI
|
||||
from cura.API.Account import Account
|
||||
from cura.Arranging.Arrange import Arrange
|
||||
from cura.Arranging.ArrangeObjectsAllBuildPlatesJob import ArrangeObjectsAllBuildPlatesJob
|
||||
from cura.Arranging.ArrangeObjectsJob import ArrangeObjectsJob
|
||||
|
@ -125,7 +126,7 @@ class CuraApplication(QtApplication):
|
|||
# SettingVersion represents the set of settings available in the machine/extruder definitions.
|
||||
# You need to make sure that this version number needs to be increased if there is any non-backwards-compatible
|
||||
# changes of the settings.
|
||||
SettingVersion = 13
|
||||
SettingVersion = 15
|
||||
|
||||
Created = False
|
||||
|
||||
|
@ -464,7 +465,10 @@ class CuraApplication(QtApplication):
|
|||
super().startSplashWindowPhase()
|
||||
|
||||
if not self.getIsHeadLess():
|
||||
self.setWindowIcon(QIcon(Resources.getPath(Resources.Images, "cura-icon.png")))
|
||||
try:
|
||||
self.setWindowIcon(QIcon(Resources.getPath(Resources.Images, "cura-icon.png")))
|
||||
except FileNotFoundError:
|
||||
Logger.log("w", "Unable to find the window icon.")
|
||||
|
||||
self.setRequiredPlugins([
|
||||
# Misc.:
|
||||
|
@ -1139,6 +1143,7 @@ class CuraApplication(QtApplication):
|
|||
|
||||
from cura.API import CuraAPI
|
||||
qmlRegisterSingletonType(CuraAPI, "Cura", 1, 1, "API", self.getCuraAPI)
|
||||
qmlRegisterUncreatableType(Account, "Cura", 1, 0, "AccountSyncState", "Could not create AccountSyncState")
|
||||
|
||||
# As of Qt5.7, it is necessary to get rid of any ".." in the path for the singleton to work.
|
||||
actions_url = QUrl.fromLocalFile(os.path.abspath(Resources.getPath(CuraApplication.ResourceTypes.QmlFiles, "Actions.qml")))
|
||||
|
@ -1775,6 +1780,9 @@ class CuraApplication(QtApplication):
|
|||
if not global_container_stack:
|
||||
Logger.log("w", "Can't load meshes before a printer is added.")
|
||||
return
|
||||
if not self._volume:
|
||||
Logger.log("w", "Can't load meshes before the build volume is initialized")
|
||||
return
|
||||
|
||||
nodes = job.getResult()
|
||||
file_name = job.getFileName()
|
||||
|
|
|
@ -3,8 +3,8 @@
|
|||
|
||||
import json
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Optional, TYPE_CHECKING
|
||||
from urllib.parse import urlencode
|
||||
from typing import Optional, TYPE_CHECKING, Dict
|
||||
from urllib.parse import urlencode, quote_plus
|
||||
|
||||
import requests.exceptions
|
||||
from PyQt5.QtCore import QUrl
|
||||
|
@ -24,6 +24,7 @@ if TYPE_CHECKING:
|
|||
from cura.OAuth2.Models import UserProfile, OAuth2Settings
|
||||
from UM.Preferences import Preferences
|
||||
|
||||
MYCLOUD_LOGOFF_URL = "https://mycloud.ultimaker.com/logoff"
|
||||
|
||||
## The authorization service is responsible for handling the login flow,
|
||||
# storing user credentials and providing account information.
|
||||
|
@ -142,7 +143,7 @@ class AuthorizationService:
|
|||
self.onAuthStateChanged.emit(logged_in = False)
|
||||
|
||||
## Start the flow to become authenticated. This will start a new webbrowser tap, prompting the user to login.
|
||||
def startAuthorizationFlow(self) -> None:
|
||||
def startAuthorizationFlow(self, force_browser_logout: bool = False) -> None:
|
||||
Logger.log("d", "Starting new OAuth2 flow...")
|
||||
|
||||
# Create the tokens needed for the code challenge (PKCE) extension for OAuth2.
|
||||
|
@ -153,8 +154,8 @@ class AuthorizationService:
|
|||
|
||||
state = AuthorizationHelpers.generateVerificationCode()
|
||||
|
||||
# Create the query string needed for the OAuth2 flow.
|
||||
query_string = urlencode({
|
||||
# Create the query dict needed for the OAuth2 flow.
|
||||
query_parameters_dict = {
|
||||
"client_id": self._settings.CLIENT_ID,
|
||||
"redirect_uri": self._settings.CALLBACK_URL,
|
||||
"scope": self._settings.CLIENT_SCOPES,
|
||||
|
@ -162,7 +163,7 @@ class AuthorizationService:
|
|||
"state": state, # Forever in our Hearts, RIP "(.Y.)" (2018-2020)
|
||||
"code_challenge": challenge_code,
|
||||
"code_challenge_method": "S512"
|
||||
})
|
||||
}
|
||||
|
||||
# Start a local web server to receive the callback URL on.
|
||||
try:
|
||||
|
@ -173,9 +174,28 @@ class AuthorizationService:
|
|||
title=i18n_catalog.i18nc("@info:title", "Warning")).show()
|
||||
return
|
||||
|
||||
auth_url = self._generate_auth_url(query_parameters_dict, force_browser_logout)
|
||||
# Open the authorization page in a new browser window.
|
||||
QDesktopServices.openUrl(QUrl("{}?{}".format(self._auth_url, query_string)))
|
||||
QDesktopServices.openUrl(QUrl(auth_url))
|
||||
|
||||
def _generate_auth_url(self, query_parameters_dict: Dict[str, Optional[str]], force_browser_logout: bool) -> str:
|
||||
"""
|
||||
Generates the authentications url based on the original auth_url and the query_parameters_dict to be included.
|
||||
If there is a request to force logging out of mycloud in the browser, the link to logoff from mycloud is
|
||||
prepended in order to force the browser to logoff from mycloud and then redirect to the authentication url to
|
||||
login again. This case is used to sync the accounts between Cura and the browser.
|
||||
|
||||
:param query_parameters_dict: A dictionary with the query parameters to be url encoded and added to the
|
||||
authentication link
|
||||
:param force_browser_logout: If True, Cura will prepend the MYCLOUD_LOGOFF_URL link before the authentication
|
||||
link to force the a browser logout from mycloud.ultimaker.com
|
||||
:return: The authentication URL, properly formatted and encoded
|
||||
"""
|
||||
auth_url = "{}?{}".format(self._auth_url, urlencode(query_parameters_dict))
|
||||
if force_browser_logout:
|
||||
# The url after '?next=' should be urlencoded
|
||||
auth_url = "{}?next={}".format(MYCLOUD_LOGOFF_URL, quote_plus(auth_url))
|
||||
return auth_url
|
||||
|
||||
## Callback method for the authentication flow.
|
||||
def _onAuthStateChanged(self, auth_response: AuthenticationResponse) -> None:
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# Copyright (c) 2019 Ultimaker B.V.
|
||||
# Copyright (c) 2020 Ultimaker B.V.
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
import time
|
||||
|
@ -1424,6 +1424,9 @@ class MachineManager(QObject):
|
|||
machine_definition_id = self._global_container_stack.definition.id
|
||||
machine_node = ContainerTree.getInstance().machines.get(machine_definition_id)
|
||||
variant_node = machine_node.variants.get(variant_name)
|
||||
if variant_node is None:
|
||||
Logger.error("There is no variant with the name {variant_name}.")
|
||||
return
|
||||
self.setVariant(position, variant_node)
|
||||
|
||||
@pyqtSlot(str, "QVariant")
|
||||
|
|
|
@ -18,4 +18,5 @@ Index
|
|||
----
|
||||
The following chapters are available in this documentation:
|
||||
* [Repositories](repositories.md): An overview of the repositories that together make up the Cura application.
|
||||
* [Profiles](profiles/profiles.md): About the setting and profile system of Cura.
|
||||
* [Profiles](profiles/profiles.md): About the setting and profile system of Cura.
|
||||
* [Scene](scene/scene.md): How Cura's 3D scene looks.
|
27
docs/scene/build_volume.md
Normal file
27
docs/scene/build_volume.md
Normal file
|
@ -0,0 +1,27 @@
|
|||
Build Volume
|
||||
====
|
||||
The build volume is a scene node. This node gets placed somewhere in the scene. This is a specialised scene node that draws the build volume and all of its bits and pieces.
|
||||
|
||||
Volume bounds
|
||||
----
|
||||
The build volume draws a cube (for rectangular build plates) that represents the printable build volume. This outline is drawn with a blue line. To render this, the Build Volume scene node generates a cube and instructs OpenGL to draw a wireframe of this cube. This way the wireframe is always a single pixel wide regardless of view distance. This cube is automatically resized when the relevant settings change, like the width, height and depth of the printer, the shape of the build plate, the Print Sequence or the gantry height.
|
||||
|
||||
The build volume also draws a grid underneath the build volume. The grid features 1cm lines which allows the user to roughly estimate how big its print is or the distance between prints. It also features a finer 1mm line pattern within that grid. The grid is drawn as a single quad. This quad is then sent to the graphical card with a specialised shader which draws the grid pattern.
|
||||
|
||||
For elliptical build plates, the volume bounds are drawn as two circles, one at the top and one at the bottom of the available height. The build plate grid is drawn as a tesselated circle, but with the same shader.
|
||||
|
||||
Disallowed areas
|
||||
----
|
||||
The build volume also calculates and draws the disallowed areas. These are drawn as a grey shadow. The point of these disallowed areas is to denote the areas where the user is not allowed to place any objects. The reason to forbid placing an object can be a lot of things.
|
||||
|
||||
One disallowed area that is always present is the border around the build volume. This border is there to prevent the nozzle from going outside of the bounds of the build volume. For instance, if you were to print an object with a brim of 8mm, you won't be able to place that object closer than 8mm to the edge of the build volume. Doing so would draw part of the brim outside of the build volume. The width of these disallowed areas depends on a bunch of things. Most commonly the build plate adhesion setting or the Avoid Distance setting is the culprit. However this border is also affected by the draft shield, ooze shield and Support Horizontal Expansion, among others.
|
||||
|
||||
Another disallowed area stems from the distance between the nozzles for some multi-extrusion printers. The total build volume in Cura is normally the volume that can be reached by either nozzle. However for every extruder that your print uses, the build volume will be shrunk to the intersecting area that all used nozzles can reach. This is done by adding disallowed areas near the border. For instance, if you have two extruders with 18mm X distance between them, and your print uses only the left extruder, there will be an extra border of 18mm on the right hand side of the printer, because the left nozzle can't reach that far to the right. If you then use both extruders, there will be an 18mm border on both sides.
|
||||
|
||||
There are also disallowed areas for features that are printed. There are as of this writing two such disallowed areas: The prime tower and the prime blob. You can't print an object on those locations since they would intersect with the printed feature.
|
||||
|
||||
Then there are disallowed areas imposed by the current printer. Some printers have things in the way of your print, such as clips that hold the build plate down, or cameras, switching bays or wiping brushes. These are encoded in the `machine_disallowed_areas` and `nozzle_disallowed_areas` settings, as polygons. The difference between these two settings is that one is intended to describe where the print head is not allowed to move. The other is intended to describe where the currently active nozzle is not allowed to move. This distinction is meant to allow inactive nozzles to move over things like build plate clips or stickers, which can slide underneath an inactive nozzle.
|
||||
|
||||
Finally, there are disallowed areas imposed by other objects that you want to print. Each object and group has an associated Convex Hull Node, which denotes the volume that the object is going to be taking up while printing. This convex hull is projected down to the build plate and determines there the volume that the object is going to occupy.
|
||||
|
||||
Each type of disallowed area is affected by certain settings. The border around the build volume, for instance, is affected by the brim, but the disallowed areas for printed objects are not. This is because the brim could go outside of the build volume but the brim can't hit any other objects. If the brim comes too close to other objects, it merges with the brim of those objects. As such, generating each type of disallowed area requires specialised business logic to determine how the setting affects the disallowed area. It needs to take the highest of two settings sometimes, or it needs to sum them together, multiplying a certain line width by an accompanying line count setting, and so on. All this logic is implemented in the BuildVolume class.
|
26
docs/scene/scene.md
Normal file
26
docs/scene/scene.md
Normal file
|
@ -0,0 +1,26 @@
|
|||
Scene
|
||||
====
|
||||
The 3D scene in Cura is designed as a [Scene Graph](https://en.wikipedia.org/wiki/Scene_graph), which is common in many 3D graphics applications. The scene graph of Cura is usually very flat, but has the possibility to have nested objects which inherit transformations from each other.
|
||||
|
||||
Scene Graph
|
||||
----
|
||||
Cura's scene graph is a mere tree data structure. This tree contains all scene nodes, which represent the objects in the 3D scene.
|
||||
|
||||
The main idea behind the scene tree is that each scene node has a transformation applied to it. The scene nodes can be nested beneath other scene nodes. The transformation of the parents is then also applied to the children. This way you can have scene nodes grouped together and transform the group as a whole. Since the transformations are all linear, this ensures that the elements of this group stay in the same relative position and orientation. It will look as if the whole group is a single object. This idea is very common for games where objects are often composed of multiple 3D models but need to move together as a whole. For Cura it is used to group objects together and to transform the collision area correctly.
|
||||
|
||||
A Typical Scene
|
||||
----
|
||||
Cura's scene has a few nodes that are always present, and a few nodes that are repeated for every object that the user loads onto their build plate. To give an idea of how a scene normally looks, this is an overview of a typical scene tree for Cura.
|
||||
|
||||
* Root
|
||||
* Camera
|
||||
* [Build volume](build_volume.md)
|
||||
* Platform
|
||||
* Object 1
|
||||
* Group 1
|
||||
* Object 2
|
||||
* Object 3
|
||||
* Object 1 convex hull node
|
||||
* Object 2 convex hull node
|
||||
* Object 3 convex hull node
|
||||
* Group 1 convex hull node
|
|
@ -43,7 +43,7 @@ UM.Dialog
|
|||
TextField {
|
||||
id: peak_height
|
||||
objectName: "Peak_Height"
|
||||
validator: RegExpValidator {regExp: /^-?\d{1,3}([\,|\.]\d*)?$/}
|
||||
validator: RegExpValidator {regExp: /^\d{1,3}([\,|\.]\d*)?$/}
|
||||
width: 180 * screenScaleFactor
|
||||
onTextChanged: { manager.onPeakHeightChanged(text) }
|
||||
}
|
||||
|
|
|
@ -50,7 +50,7 @@ class ImageReader(MeshReader):
|
|||
size = max(self._ui.getWidth(), self._ui.getDepth())
|
||||
return self._generateSceneNode(file_name, size, self._ui.peak_height, self._ui.base_height, self._ui.smoothing, 512, self._ui.lighter_is_higher, self._ui.use_transparency_model, self._ui.transmittance_1mm)
|
||||
|
||||
def _generateSceneNode(self, file_name, xz_size, peak_height, base_height, blur_iterations, max_size, lighter_is_higher, use_transparency_model, transmittance_1mm):
|
||||
def _generateSceneNode(self, file_name, xz_size, height_from_base, base_height, blur_iterations, max_size, lighter_is_higher, use_transparency_model, transmittance_1mm):
|
||||
scene_node = SceneNode()
|
||||
|
||||
mesh = MeshBuilder()
|
||||
|
@ -68,8 +68,10 @@ class ImageReader(MeshReader):
|
|||
if img.width() < 2 or img.height() < 2:
|
||||
img = img.scaled(width, height, Qt.IgnoreAspectRatio)
|
||||
|
||||
height_from_base = max(height_from_base, 0)
|
||||
base_height = max(base_height, 0)
|
||||
peak_height = max(peak_height, -base_height)
|
||||
peak_height = base_height + height_from_base
|
||||
|
||||
|
||||
xz_size = max(xz_size, 1)
|
||||
scale_vector = Vector(xz_size, peak_height, xz_size)
|
||||
|
|
|
@ -155,8 +155,10 @@ class ImageReaderUI(QObject):
|
|||
if len(value) > 0:
|
||||
try:
|
||||
self.peak_height = float(value.replace(",", "."))
|
||||
if self.peak_height < 0:
|
||||
self.peak_height = 2.5
|
||||
except ValueError: # Can happen with incomplete numbers, such as "-".
|
||||
self._width = 0
|
||||
self.peak_height = 2.5 # restore default
|
||||
else:
|
||||
self.peak_height = 0
|
||||
|
||||
|
|
|
@ -108,13 +108,12 @@ class PauseAtHeight(Script):
|
|||
"type": "float",
|
||||
"default_value": 3.3333
|
||||
},
|
||||
"redo_layers":
|
||||
"redo_layer":
|
||||
{
|
||||
"label": "Redo Layers",
|
||||
"description": "Redo a number of previous layers after a pause to increases adhesion.",
|
||||
"unit": "layers",
|
||||
"type": "int",
|
||||
"default_value": 0
|
||||
"label": "Redo Layer",
|
||||
"description": "Redo the last layer before the pause, to get the filament flowing again after having oozed a bit during the pause.",
|
||||
"type": "bool",
|
||||
"default_value": false
|
||||
},
|
||||
"standby_temperature":
|
||||
{
|
||||
|
@ -161,7 +160,7 @@ class PauseAtHeight(Script):
|
|||
park_x = self.getSettingValueByKey("head_park_x")
|
||||
park_y = self.getSettingValueByKey("head_park_y")
|
||||
layers_started = False
|
||||
redo_layers = self.getSettingValueByKey("redo_layers")
|
||||
redo_layer = self.getSettingValueByKey("redo_layer")
|
||||
standby_temperature = self.getSettingValueByKey("standby_temperature")
|
||||
firmware_retract = Application.getInstance().getGlobalContainerStack().getProperty("machine_firmware_retract", "value")
|
||||
control_temperatures = Application.getInstance().getGlobalContainerStack().getProperty("machine_nozzle_temp_enabled", "value")
|
||||
|
@ -265,24 +264,23 @@ class PauseAtHeight(Script):
|
|||
if current_e >= 0:
|
||||
break
|
||||
|
||||
# include a number of previous layers
|
||||
for i in range(1, redo_layers + 1):
|
||||
prev_layer = data[index - i]
|
||||
# Maybe redo the last layer.
|
||||
if redo_layer:
|
||||
prev_layer = data[index - 1]
|
||||
layer = prev_layer + layer
|
||||
|
||||
# Get extruder's absolute position at the
|
||||
# beginning of the first layer redone
|
||||
# beginning of the redone layer.
|
||||
# see https://github.com/nallath/PostProcessingPlugin/issues/55
|
||||
if i == redo_layers:
|
||||
# Get X and Y from the next layer (better position for
|
||||
# the nozzle)
|
||||
x, y = self.getNextXY(layer)
|
||||
prev_lines = prev_layer.split("\n")
|
||||
for lin in prev_lines:
|
||||
new_e = self.getValue(lin, "E", current_e)
|
||||
if new_e != current_e:
|
||||
current_e = new_e
|
||||
break
|
||||
# Get X and Y from the next layer (better position for
|
||||
# the nozzle)
|
||||
x, y = self.getNextXY(layer)
|
||||
prev_lines = prev_layer.split("\n")
|
||||
for lin in prev_lines:
|
||||
new_e = self.getValue(lin, "E", current_e)
|
||||
if new_e != current_e:
|
||||
current_e = new_e
|
||||
break
|
||||
|
||||
prepend_gcode = ";TYPE:CUSTOM\n"
|
||||
prepend_gcode += ";added code by post processing\n"
|
||||
|
@ -365,8 +363,8 @@ class PauseAtHeight(Script):
|
|||
|
||||
prepend_gcode += self.putValue(M = 82) + " ; switch back to absolute E values\n"
|
||||
|
||||
# reset extrude value to pre pause value
|
||||
prepend_gcode += self.putValue(G = 92, E = current_e) + "\n"
|
||||
# reset extrude value to pre pause value
|
||||
prepend_gcode += self.putValue(G = 92, E = current_e) + "\n"
|
||||
|
||||
layer = prepend_gcode + layer
|
||||
|
||||
|
|
|
@ -77,7 +77,7 @@ class SimulationPass(RenderPass):
|
|||
self._layer_shader.setUniformValue("u_max_thickness", 1)
|
||||
self._layer_shader.setUniformValue("u_min_thickness", 0)
|
||||
self._layer_shader.setUniformValue("u_layer_view_type", 1)
|
||||
self._layer_shader.setUniformValue("u_extruder_opacity", [1, 1, 1, 1])
|
||||
self._layer_shader.setUniformValue("u_extruder_opacity", [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]])
|
||||
self._layer_shader.setUniformValue("u_show_travel_moves", 0)
|
||||
self._layer_shader.setUniformValue("u_show_helpers", 1)
|
||||
self._layer_shader.setUniformValue("u_show_skin", 1)
|
||||
|
|
|
@ -12,6 +12,7 @@ from UM.Event import Event, KeyEvent
|
|||
from UM.Job import Job
|
||||
from UM.Logger import Logger
|
||||
from UM.Math.Color import Color
|
||||
from UM.Math.Matrix import Matrix
|
||||
from UM.Mesh.MeshBuilder import MeshBuilder
|
||||
from UM.Message import Message
|
||||
from UM.Platform import Platform
|
||||
|
@ -140,7 +141,7 @@ class SimulationView(CuraView):
|
|||
def _resetSettings(self) -> None:
|
||||
self._layer_view_type = 0 # type: int # 0 is material color, 1 is color by linetype, 2 is speed, 3 is layer thickness
|
||||
self._extruder_count = 0
|
||||
self._extruder_opacity = [1.0, 1.0, 1.0, 1.0]
|
||||
self._extruder_opacity = [[1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0]]
|
||||
self._show_travel_moves = False
|
||||
self._show_helpers = True
|
||||
self._show_skin = True
|
||||
|
@ -297,7 +298,7 @@ class SimulationView(CuraView):
|
|||
|
||||
def setSimulationViewType(self, layer_view_type: int) -> None:
|
||||
"""Set the layer view type
|
||||
|
||||
|
||||
:param layer_view_type: integer as in SimulationView.qml and this class
|
||||
"""
|
||||
|
||||
|
@ -312,17 +313,19 @@ class SimulationView(CuraView):
|
|||
|
||||
def setExtruderOpacity(self, extruder_nr: int, opacity: float) -> None:
|
||||
"""Set the extruder opacity
|
||||
|
||||
:param extruder_nr: 0..3
|
||||
|
||||
:param extruder_nr: 0..15
|
||||
:param opacity: 0.0 .. 1.0
|
||||
"""
|
||||
|
||||
if 0 <= extruder_nr <= 3:
|
||||
self._extruder_opacity[extruder_nr] = opacity
|
||||
if 0 <= extruder_nr <= 15:
|
||||
self._extruder_opacity[extruder_nr // 4][extruder_nr % 4] = opacity
|
||||
self.currentLayerNumChanged.emit()
|
||||
|
||||
def getExtruderOpacities(self)-> List[float]:
|
||||
return self._extruder_opacity
|
||||
def getExtruderOpacities(self) -> Matrix:
|
||||
# NOTE: Extruder opacities are stored in a matrix for (minor) performance reasons (w.r.t. OpenGL/shaders).
|
||||
# If more than 16 extruders are called for, this should be converted to a sampler1d.
|
||||
return Matrix(self._extruder_opacity)
|
||||
|
||||
def setShowTravelMoves(self, show):
|
||||
self._show_travel_moves = show
|
||||
|
|
|
@ -152,7 +152,7 @@ fragment41core =
|
|||
u_active_extruder = 0.0
|
||||
u_shade_factor = 0.60
|
||||
u_layer_view_type = 0
|
||||
u_extruder_opacity = [1.0, 1.0, 1.0, 1.0]
|
||||
u_extruder_opacity = [[1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0]]
|
||||
|
||||
u_show_travel_moves = 0
|
||||
u_show_helpers = 1
|
||||
|
|
|
@ -11,7 +11,7 @@ vertex41core =
|
|||
uniform lowp float u_max_thickness;
|
||||
uniform lowp float u_min_thickness;
|
||||
uniform lowp int u_layer_view_type;
|
||||
uniform lowp vec4 u_extruder_opacity; // currently only for max 4 extruders, others always visible
|
||||
uniform lowp mat4 u_extruder_opacity; // currently only for max 16 extruders, others always visible
|
||||
|
||||
uniform highp mat4 u_normalMatrix;
|
||||
|
||||
|
@ -31,7 +31,7 @@ vertex41core =
|
|||
out highp vec3 v_normal;
|
||||
out lowp vec2 v_line_dim;
|
||||
out highp int v_extruder;
|
||||
out highp vec4 v_extruder_opacity;
|
||||
out highp mat4 v_extruder_opacity;
|
||||
out float v_line_type;
|
||||
|
||||
out lowp vec4 f_color;
|
||||
|
@ -121,7 +121,7 @@ geometry41core =
|
|||
in vec3 v_normal[];
|
||||
in vec2 v_line_dim[];
|
||||
in int v_extruder[];
|
||||
in vec4 v_extruder_opacity[];
|
||||
in mat4 v_extruder_opacity[];
|
||||
in float v_line_type[];
|
||||
|
||||
out vec4 f_color;
|
||||
|
@ -152,7 +152,7 @@ geometry41core =
|
|||
float size_x;
|
||||
float size_y;
|
||||
|
||||
if ((v_extruder_opacity[0][v_extruder[0]] == 0.0) && (v_line_type[0] != 8) && (v_line_type[0] != 9)) {
|
||||
if ((v_extruder_opacity[0][int(mod(v_extruder[0], 4))][v_extruder[0] / 4] == 0.0) && (v_line_type[0] != 8) && (v_line_type[0] != 9)) {
|
||||
return;
|
||||
}
|
||||
// See LayerPolygon; 8 is MoveCombingType, 9 is RetractionType
|
||||
|
@ -304,7 +304,7 @@ fragment41core =
|
|||
[defaults]
|
||||
u_active_extruder = 0.0
|
||||
u_layer_view_type = 0
|
||||
u_extruder_opacity = [1.0, 1.0, 1.0, 1.0]
|
||||
u_extruder_opacity = [[1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0]]
|
||||
|
||||
u_specularColor = [0.4, 0.4, 0.4, 1.0]
|
||||
u_ambientColor = [0.3, 0.3, 0.3, 0.0]
|
||||
|
|
|
@ -6,7 +6,7 @@ vertex41core =
|
|||
uniform highp mat4 u_projectionMatrix;
|
||||
|
||||
uniform lowp float u_active_extruder;
|
||||
uniform lowp vec4 u_extruder_opacity; // currently only for max 4 extruders, others always visible
|
||||
uniform lowp mat4 u_extruder_opacity; // currently only for max 16 extruders, others always visible
|
||||
|
||||
uniform highp mat4 u_normalMatrix;
|
||||
|
||||
|
@ -25,7 +25,7 @@ vertex41core =
|
|||
out highp vec3 v_normal;
|
||||
out lowp vec2 v_line_dim;
|
||||
out highp int v_extruder;
|
||||
out highp vec4 v_extruder_opacity;
|
||||
out highp mat4 v_extruder_opacity;
|
||||
out float v_line_type;
|
||||
|
||||
out lowp vec4 f_color;
|
||||
|
@ -75,7 +75,7 @@ geometry41core =
|
|||
in vec3 v_normal[];
|
||||
in vec2 v_line_dim[];
|
||||
in int v_extruder[];
|
||||
in vec4 v_extruder_opacity[];
|
||||
in mat4 v_extruder_opacity[];
|
||||
in float v_line_type[];
|
||||
|
||||
out vec4 f_color;
|
||||
|
@ -106,7 +106,7 @@ geometry41core =
|
|||
float size_x;
|
||||
float size_y;
|
||||
|
||||
if ((v_extruder_opacity[0][v_extruder[0]] == 0.0) && (v_line_type[0] != 8) && (v_line_type[0] != 9)) {
|
||||
if ((v_extruder_opacity[0][int(mod(v_extruder[0], 4))][v_extruder[0] / 4] == 0.0) && (v_line_type[0] != 8) && (v_line_type[0] != 9)) {
|
||||
return;
|
||||
}
|
||||
// See LayerPolygon; 8 is MoveCombingType, 9 is RetractionType
|
||||
|
@ -256,7 +256,7 @@ fragment41core =
|
|||
|
||||
[defaults]
|
||||
u_active_extruder = 0.0
|
||||
u_extruder_opacity = [1.0, 1.0, 1.0, 1.0]
|
||||
u_extruder_opacity = [[1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0]]
|
||||
|
||||
u_specularColor = [0.4, 0.4, 0.4, 1.0]
|
||||
u_ambientColor = [0.3, 0.3, 0.3, 0.0]
|
||||
|
|
|
@ -157,7 +157,7 @@ fragment41core =
|
|||
u_active_extruder = 0.0
|
||||
u_shade_factor = 0.60
|
||||
u_layer_view_type = 0
|
||||
u_extruder_opacity = [1.0, 1.0, 1.0, 1.0]
|
||||
u_extruder_opacity = [[1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0]]
|
||||
|
||||
u_show_travel_moves = 0
|
||||
u_show_helpers = 1
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
import json
|
||||
from typing import List, Dict, Any
|
||||
from typing import List, Dict, Any, Set
|
||||
from typing import Optional
|
||||
|
||||
from PyQt5.QtCore import QObject
|
||||
|
@ -13,6 +13,7 @@ from UM.Logger import Logger
|
|||
from UM.Message import Message
|
||||
from UM.Signal import Signal
|
||||
from UM.TaskManagement.HttpRequestScope import JsonDecoratorScope
|
||||
from cura.API.Account import SyncState
|
||||
from cura.CuraApplication import CuraApplication, ApplicationMetadata
|
||||
from cura.UltimakerCloud.UltimakerCloudScope import UltimakerCloudScope
|
||||
from .SubscribedPackagesModel import SubscribedPackagesModel
|
||||
|
@ -20,6 +21,9 @@ from ..CloudApiModel import CloudApiModel
|
|||
|
||||
|
||||
class CloudPackageChecker(QObject):
|
||||
|
||||
SYNC_SERVICE_NAME = "CloudPackageChecker"
|
||||
|
||||
def __init__(self, application: CuraApplication) -> None:
|
||||
super().__init__()
|
||||
|
||||
|
@ -32,23 +36,32 @@ class CloudPackageChecker(QObject):
|
|||
self._application.initializationFinished.connect(self._onAppInitialized)
|
||||
self._i18n_catalog = i18nCatalog("cura")
|
||||
self._sdk_version = ApplicationMetadata.CuraSDKVersion
|
||||
self._last_notified_packages = set() # type: Set[str]
|
||||
"""Packages for which a notification has been shown. No need to bother the user twice fo equal content"""
|
||||
|
||||
# This is a plugin, so most of the components required are not ready when
|
||||
# this is initialized. Therefore, we wait until the application is ready.
|
||||
def _onAppInitialized(self) -> None:
|
||||
self._package_manager = self._application.getPackageManager()
|
||||
# initial check
|
||||
self._onLoginStateChanged()
|
||||
# check again whenever the login state changes
|
||||
self._getPackagesIfLoggedIn()
|
||||
|
||||
self._application.getCuraAPI().account.loginStateChanged.connect(self._onLoginStateChanged)
|
||||
self._application.getCuraAPI().account.syncRequested.connect(self._getPackagesIfLoggedIn)
|
||||
|
||||
def _onLoginStateChanged(self) -> None:
|
||||
# reset session
|
||||
self._last_notified_packages = set()
|
||||
self._getPackagesIfLoggedIn()
|
||||
|
||||
def _getPackagesIfLoggedIn(self) -> None:
|
||||
if self._application.getCuraAPI().account.isLoggedIn:
|
||||
self._getUserSubscribedPackages()
|
||||
else:
|
||||
self._hideSyncMessage()
|
||||
|
||||
def _getUserSubscribedPackages(self) -> None:
|
||||
self._application.getCuraAPI().account.setSyncState(self.SYNC_SERVICE_NAME, SyncState.SYNCING)
|
||||
Logger.debug("Requesting subscribed packages metadata from server.")
|
||||
url = CloudApiModel.api_url_user_packages
|
||||
self._application.getHttpRequestManager().get(url,
|
||||
|
@ -61,6 +74,7 @@ class CloudPackageChecker(QObject):
|
|||
Logger.log("w",
|
||||
"Requesting user packages failed, response code %s while trying to connect to %s",
|
||||
reply.attribute(QNetworkRequest.HttpStatusCodeAttribute), reply.url())
|
||||
self._application.getCuraAPI().account.setSyncState(self.SYNC_SERVICE_NAME, SyncState.ERROR)
|
||||
return
|
||||
|
||||
try:
|
||||
|
@ -69,14 +83,21 @@ class CloudPackageChecker(QObject):
|
|||
if "errors" in json_data:
|
||||
for error in json_data["errors"]:
|
||||
Logger.log("e", "%s", error["title"])
|
||||
self._application.getCuraAPI().account.setSyncState(self.SYNC_SERVICE_NAME, SyncState.ERROR)
|
||||
return
|
||||
self._handleCompatibilityData(json_data["data"])
|
||||
except json.decoder.JSONDecodeError:
|
||||
Logger.log("w", "Received invalid JSON for user subscribed packages from the Web Marketplace")
|
||||
|
||||
self._application.getCuraAPI().account.setSyncState(self.SYNC_SERVICE_NAME, SyncState.SUCCESS)
|
||||
|
||||
def _handleCompatibilityData(self, subscribed_packages_payload: List[Dict[str, Any]]) -> None:
|
||||
user_subscribed_packages = [plugin["package_id"] for plugin in subscribed_packages_payload]
|
||||
user_installed_packages = self._package_manager.getUserInstalledPackages()
|
||||
user_subscribed_packages = {plugin["package_id"] for plugin in subscribed_packages_payload}
|
||||
user_installed_packages = self._package_manager.getAllInstalledPackageIDs()
|
||||
|
||||
if user_subscribed_packages == self._last_notified_packages:
|
||||
# already notified user about these
|
||||
return
|
||||
|
||||
# We need to re-evaluate the dismissed packages
|
||||
# (i.e. some package might got updated to the correct SDK version in the meantime,
|
||||
|
@ -87,12 +108,13 @@ class CloudPackageChecker(QObject):
|
|||
user_installed_packages += user_dismissed_packages
|
||||
|
||||
# We check if there are packages installed in Web Marketplace but not in Cura marketplace
|
||||
package_discrepancy = list(set(user_subscribed_packages).difference(user_installed_packages))
|
||||
package_discrepancy = list(user_subscribed_packages.difference(user_installed_packages))
|
||||
if package_discrepancy:
|
||||
Logger.log("d", "Discrepancy found between Cloud subscribed packages and Cura installed packages")
|
||||
self._model.addDiscrepancies(package_discrepancy)
|
||||
self._model.initialize(self._package_manager, subscribed_packages_payload)
|
||||
self._showSyncMessage()
|
||||
self._last_notified_packages = user_subscribed_packages
|
||||
|
||||
def _showSyncMessage(self) -> None:
|
||||
"""Show the message if it is not already shown"""
|
||||
|
|
|
@ -53,10 +53,10 @@ class CloudApiClient:
|
|||
|
||||
## Retrieves all the clusters for the user that is currently logged in.
|
||||
# \param on_finished: The function to be called after the result is parsed.
|
||||
def getClusters(self, on_finished: Callable[[List[CloudClusterResponse]], Any]) -> None:
|
||||
def getClusters(self, on_finished: Callable[[List[CloudClusterResponse]], Any], failed: Callable) -> None:
|
||||
url = "{}/clusters?status=active".format(self.CLUSTER_API_ROOT)
|
||||
reply = self._manager.get(self._createEmptyRequest(url))
|
||||
self._addCallback(reply, on_finished, CloudClusterResponse)
|
||||
self._addCallback(reply, on_finished, CloudClusterResponse, failed)
|
||||
|
||||
## Retrieves the status of the given cluster.
|
||||
# \param cluster_id: The ID of the cluster.
|
||||
|
@ -166,16 +166,24 @@ class CloudApiClient:
|
|||
reply: QNetworkReply,
|
||||
on_finished: Union[Callable[[CloudApiClientModel], Any],
|
||||
Callable[[List[CloudApiClientModel]], Any]],
|
||||
model: Type[CloudApiClientModel]) -> None:
|
||||
model: Type[CloudApiClientModel],
|
||||
on_error: Optional[Callable] = None) -> None:
|
||||
def parse() -> None:
|
||||
self._anti_gc_callbacks.remove(parse)
|
||||
|
||||
# Don't try to parse the reply if we didn't get one
|
||||
if reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) is None:
|
||||
if on_error is not None:
|
||||
on_error()
|
||||
return
|
||||
|
||||
status_code, response = self._parseReply(reply)
|
||||
self._parseModels(response, on_finished, model)
|
||||
if status_code >= 300 and on_error is not None:
|
||||
on_error()
|
||||
else:
|
||||
self._parseModels(response, on_finished, model)
|
||||
|
||||
self._anti_gc_callbacks.append(parse)
|
||||
reply.finished.connect(parse)
|
||||
if on_error is not None:
|
||||
reply.error.connect(on_error)
|
||||
|
|
|
@ -10,6 +10,7 @@ from UM.Logger import Logger # To log errors talking to the API.
|
|||
from UM.Message import Message
|
||||
from UM.Signal import Signal
|
||||
from cura.API import Account
|
||||
from cura.API.Account import SyncState
|
||||
from cura.CuraApplication import CuraApplication
|
||||
from cura.Settings.CuraStackBuilder import CuraStackBuilder
|
||||
from cura.Settings.GlobalStack import GlobalStack
|
||||
|
@ -27,9 +28,7 @@ class CloudOutputDeviceManager:
|
|||
|
||||
META_CLUSTER_ID = "um_cloud_cluster_id"
|
||||
META_NETWORK_KEY = "um_network_key"
|
||||
|
||||
# The interval with which the remote clusters are checked
|
||||
CHECK_CLUSTER_INTERVAL = 30.0 # seconds
|
||||
SYNC_SERVICE_NAME = "CloudOutputDeviceManager"
|
||||
|
||||
# The translation catalog for this device.
|
||||
I18N_CATALOG = i18nCatalog("cura")
|
||||
|
@ -44,16 +43,11 @@ class CloudOutputDeviceManager:
|
|||
self._api = CloudApiClient(self._account, on_error = lambda error: Logger.log("e", str(error)))
|
||||
self._account.loginStateChanged.connect(self._onLoginStateChanged)
|
||||
|
||||
# Create a timer to update the remote cluster list
|
||||
self._update_timer = QTimer()
|
||||
self._update_timer.setInterval(int(self.CHECK_CLUSTER_INTERVAL * 1000))
|
||||
# The timer is restarted explicitly after an update was processed. This prevents 2 concurrent updates
|
||||
self._update_timer.setSingleShot(True)
|
||||
self._update_timer.timeout.connect(self._getRemoteClusters)
|
||||
|
||||
# Ensure we don't start twice.
|
||||
self._running = False
|
||||
|
||||
self._syncing = False
|
||||
|
||||
def start(self):
|
||||
"""Starts running the cloud output device manager, thus periodically requesting cloud data."""
|
||||
|
||||
|
@ -62,18 +56,16 @@ class CloudOutputDeviceManager:
|
|||
if not self._account.isLoggedIn:
|
||||
return
|
||||
self._running = True
|
||||
if not self._update_timer.isActive():
|
||||
self._update_timer.start()
|
||||
self._getRemoteClusters()
|
||||
|
||||
self._account.syncRequested.connect(self._getRemoteClusters)
|
||||
|
||||
def stop(self):
|
||||
"""Stops running the cloud output device manager."""
|
||||
|
||||
if not self._running:
|
||||
return
|
||||
self._running = False
|
||||
if self._update_timer.isActive():
|
||||
self._update_timer.stop()
|
||||
self._onGetRemoteClustersFinished([]) # Make sure we remove all cloud output devices.
|
||||
|
||||
def refreshConnections(self) -> None:
|
||||
|
@ -92,7 +84,14 @@ class CloudOutputDeviceManager:
|
|||
def _getRemoteClusters(self) -> None:
|
||||
"""Gets all remote clusters from the API."""
|
||||
|
||||
self._api.getClusters(self._onGetRemoteClustersFinished)
|
||||
if self._syncing:
|
||||
return
|
||||
|
||||
Logger.info("Syncing cloud printer clusters")
|
||||
|
||||
self._syncing = True
|
||||
self._account.setSyncState(self.SYNC_SERVICE_NAME, SyncState.SYNCING)
|
||||
self._api.getClusters(self._onGetRemoteClustersFinished, self._onGetRemoteClusterFailed)
|
||||
|
||||
def _onGetRemoteClustersFinished(self, clusters: List[CloudClusterResponse]) -> None:
|
||||
"""Callback for when the request for getting the clusters is finished."""
|
||||
|
@ -115,8 +114,13 @@ class CloudOutputDeviceManager:
|
|||
if removed_device_keys:
|
||||
# If the removed device was active we should connect to the new active device
|
||||
self._connectToActiveMachine()
|
||||
# Schedule a new update
|
||||
self._update_timer.start()
|
||||
|
||||
self._syncing = False
|
||||
self._account.setSyncState(self.SYNC_SERVICE_NAME, SyncState.SUCCESS)
|
||||
|
||||
def _onGetRemoteClusterFailed(self):
|
||||
self._syncing = False
|
||||
self._account.setSyncState(self.SYNC_SERVICE_NAME, SyncState.ERROR)
|
||||
|
||||
def _onDevicesDiscovered(self, clusters: List[CloudClusterResponse]) -> None:
|
||||
"""**Synchronously** create machines for discovered devices
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# Copyright (c) 2019 Ultimaker B.V.
|
||||
# Copyright (c) 2020 Ultimaker B.V.
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
import os
|
||||
|
@ -367,11 +367,18 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
|
|||
self._sendCommand("M84")
|
||||
|
||||
def _sendNextGcodeLine(self):
|
||||
if self._gcode_position >= len(self._gcode):
|
||||
"""
|
||||
Send the next line of g-code, at the current `_gcode_position`, via a
|
||||
serial port to the printer.
|
||||
|
||||
If the print is done, this sets `_is_printing` to `False` as well.
|
||||
"""
|
||||
try:
|
||||
line = self._gcode[self._gcode_position]
|
||||
except IndexError: # End of print, or print got cancelled.
|
||||
self._printers[0].updateActivePrintJob(None)
|
||||
self._is_printing = False
|
||||
return
|
||||
line = self._gcode[self._gcode_position]
|
||||
|
||||
if ";" in line:
|
||||
line = line[:line.find(";")]
|
||||
|
@ -401,7 +408,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
|
|||
if print_job is None:
|
||||
controller = GenericOutputController(self)
|
||||
controller.setCanUpdateFirmware(True)
|
||||
print_job = PrintJobOutputModel(output_controller=controller, name=CuraApplication.getInstance().getPrintInformation().jobName)
|
||||
print_job = PrintJobOutputModel(output_controller = controller, name = CuraApplication.getInstance().getPrintInformation().jobName)
|
||||
print_job.updateState("printing")
|
||||
self._printers[0].updateActivePrintJob(print_job)
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@ class VersionUpgrade45to46(VersionUpgrade):
|
|||
parser.read_string(serialized)
|
||||
|
||||
# Update version number.
|
||||
parser["metadata"]["setting_version"] = "12"
|
||||
parser["metadata"]["setting_version"] = "13"
|
||||
|
||||
# Remove deleted settings from the visible settings list.
|
||||
if "general" in parser and "visible_settings" in parser["general"]:
|
||||
|
@ -54,13 +54,20 @@ class VersionUpgrade45to46(VersionUpgrade):
|
|||
parser.read_string(serialized)
|
||||
|
||||
# Update version number.
|
||||
parser["metadata"]["setting_version"] = "12"
|
||||
parser["metadata"]["setting_version"] = "13"
|
||||
|
||||
if "values" in parser:
|
||||
for removed in _removed_settings:
|
||||
if removed in parser["values"]:
|
||||
del parser["values"][removed]
|
||||
|
||||
if "meshfix_maximum_deviation" in parser["values"]:
|
||||
maximum_deviation = parser["values"]["meshfix_maximum_deviation"]
|
||||
if maximum_deviation.startswith("="):
|
||||
maximum_deviation = maximum_deviation[1:]
|
||||
maximum_deviation = "=(" + maximum_deviation + ") / 2"
|
||||
parser["values"]["meshfix_maximum_deviation"] = maximum_deviation
|
||||
|
||||
result = io.StringIO()
|
||||
parser.write(result)
|
||||
return [filename], [result.getvalue()]
|
||||
|
@ -79,7 +86,7 @@ class VersionUpgrade45to46(VersionUpgrade):
|
|||
# Update version number.
|
||||
if "metadata" not in parser:
|
||||
parser["metadata"] = {}
|
||||
parser["metadata"]["setting_version"] = "12"
|
||||
parser["metadata"]["setting_version"] = "13"
|
||||
|
||||
result = io.StringIO()
|
||||
parser.write(result)
|
||||
|
|
|
@ -14,13 +14,13 @@ def getMetaData() -> Dict[str, Any]:
|
|||
return {
|
||||
"version_upgrade": {
|
||||
# From To Upgrade function
|
||||
("preferences", 6000011): ("preferences", 6000012, upgrade.upgradePreferences),
|
||||
("machine_stack", 4000011): ("machine_stack", 4000012, upgrade.upgradeStack),
|
||||
("extruder_train", 4000011): ("extruder_train", 4000012, upgrade.upgradeStack),
|
||||
("definition_changes", 4000011): ("definition_changes", 4000012, upgrade.upgradeInstanceContainer),
|
||||
("quality_changes", 4000011): ("quality_changes", 4000012, upgrade.upgradeInstanceContainer),
|
||||
("quality", 4000011): ("quality", 4000012, upgrade.upgradeInstanceContainer),
|
||||
("user", 4000011): ("user", 4000012, upgrade.upgradeInstanceContainer),
|
||||
("preferences", 6000011): ("preferences", 6000013, upgrade.upgradePreferences),
|
||||
("machine_stack", 4000011): ("machine_stack", 4000013, upgrade.upgradeStack),
|
||||
("extruder_train", 4000011): ("extruder_train", 4000013, upgrade.upgradeStack),
|
||||
("definition_changes", 4000011): ("definition_changes", 4000013, upgrade.upgradeInstanceContainer),
|
||||
("quality_changes", 4000011): ("quality_changes", 4000013, upgrade.upgradeInstanceContainer),
|
||||
("quality", 4000011): ("quality", 4000013, upgrade.upgradeInstanceContainer),
|
||||
("user", 4000011): ("user", 4000013, upgrade.upgradeInstanceContainer),
|
||||
},
|
||||
"sources": {
|
||||
"preferences": {
|
||||
|
|
|
@ -6,8 +6,7 @@ from typing import Tuple, List
|
|||
import io
|
||||
from UM.VersionUpgrade import VersionUpgrade
|
||||
|
||||
|
||||
class VersionUpgrade46to47(VersionUpgrade):
|
||||
class VersionUpgrade460to462(VersionUpgrade):
|
||||
def upgradePreferences(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
|
||||
"""
|
||||
Upgrades preferences to have the new version number.
|
||||
|
@ -20,7 +19,7 @@ class VersionUpgrade46to47(VersionUpgrade):
|
|||
parser.read_string(serialized)
|
||||
|
||||
# Update version number.
|
||||
parser["metadata"]["setting_version"] = "13"
|
||||
parser["metadata"]["setting_version"] = "14"
|
||||
|
||||
result = io.StringIO()
|
||||
parser.write(result)
|
||||
|
@ -41,18 +40,19 @@ class VersionUpgrade46to47(VersionUpgrade):
|
|||
parser.read_string(serialized)
|
||||
|
||||
# Update version number.
|
||||
parser["metadata"]["setting_version"] = "13"
|
||||
parser["metadata"]["setting_version"] = "14"
|
||||
|
||||
if "values" in parser:
|
||||
# Maximum Deviation's effect was corrected. Previously the deviation
|
||||
# ended up being only half of what the user had entered. This was
|
||||
# fixed in Cura 4.7 so there we need to halve the deviation that the
|
||||
# user had entered.
|
||||
# user had entered. This halving was accidentally merged into 4.6 and had to be reverted
|
||||
# back in 4.6.2.
|
||||
if "meshfix_maximum_deviation" in parser["values"]:
|
||||
maximum_deviation = parser["values"]["meshfix_maximum_deviation"]
|
||||
if maximum_deviation.startswith("="):
|
||||
maximum_deviation = maximum_deviation[1:]
|
||||
maximum_deviation = "=(" + maximum_deviation + ") / 2"
|
||||
maximum_deviation = "=(" + maximum_deviation + ") * 2"
|
||||
parser["values"]["meshfix_maximum_deviation"] = maximum_deviation
|
||||
|
||||
result = io.StringIO()
|
||||
|
@ -73,7 +73,7 @@ class VersionUpgrade46to47(VersionUpgrade):
|
|||
# Update version number.
|
||||
if "metadata" not in parser:
|
||||
parser["metadata"] = {}
|
||||
parser["metadata"]["setting_version"] = "13"
|
||||
parser["metadata"]["setting_version"] = "14"
|
||||
|
||||
result = io.StringIO()
|
||||
parser.write(result)
|
59
plugins/VersionUpgrade/VersionUpgrade460to462/__init__.py
Normal file
59
plugins/VersionUpgrade/VersionUpgrade460to462/__init__.py
Normal file
|
@ -0,0 +1,59 @@
|
|||
# Copyright (c) 2020 Ultimaker B.V.
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
from typing import Any, Dict, TYPE_CHECKING
|
||||
|
||||
from . import VersionUpgrade460to462
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from UM.Application import Application
|
||||
|
||||
upgrade = VersionUpgrade460to462.VersionUpgrade460to462()
|
||||
|
||||
def getMetaData() -> Dict[str, Any]:
|
||||
return {
|
||||
"version_upgrade": {
|
||||
# From To Upgrade function
|
||||
("preferences", 6000013): ("preferences", 6000014, upgrade.upgradePreferences),
|
||||
("machine_stack", 4000013): ("machine_stack", 4000014, upgrade.upgradeStack),
|
||||
("extruder_train", 4000013): ("extruder_train", 4000014, upgrade.upgradeStack),
|
||||
("definition_changes", 4000013): ("definition_changes", 4000014, upgrade.upgradeInstanceContainer),
|
||||
("quality_changes", 4000013): ("quality_changes", 4000014, upgrade.upgradeInstanceContainer),
|
||||
("quality", 4000013): ("quality", 4000014, upgrade.upgradeInstanceContainer),
|
||||
("user", 4000013): ("user", 4000014, upgrade.upgradeInstanceContainer),
|
||||
},
|
||||
"sources": {
|
||||
"preferences": {
|
||||
"get_version": upgrade.getCfgVersion,
|
||||
"location": {"."}
|
||||
},
|
||||
"machine_stack": {
|
||||
"get_version": upgrade.getCfgVersion,
|
||||
"location": {"./machine_instances"}
|
||||
},
|
||||
"extruder_train": {
|
||||
"get_version": upgrade.getCfgVersion,
|
||||
"location": {"./extruders"}
|
||||
},
|
||||
"definition_changes": {
|
||||
"get_version": upgrade.getCfgVersion,
|
||||
"location": {"./definition_changes"}
|
||||
},
|
||||
"quality_changes": {
|
||||
"get_version": upgrade.getCfgVersion,
|
||||
"location": {"./quality_changes"}
|
||||
},
|
||||
"quality": {
|
||||
"get_version": upgrade.getCfgVersion,
|
||||
"location": {"./quality"}
|
||||
},
|
||||
"user": {
|
||||
"get_version": upgrade.getCfgVersion,
|
||||
"location": {"./user"}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
def register(app: "Application") -> Dict[str, Any]:
|
||||
return {"version_upgrade": upgrade}
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"name": "Version Upgrade 4.6.0 to 4.6.2",
|
||||
"author": "Ultimaker B.V.",
|
||||
"version": "1.0.0",
|
||||
"description": "Upgrades configurations from Cura 4.6.0 to Cura 4.6.2.",
|
||||
"api": "7.2.0",
|
||||
"i18n-catalog": "cura"
|
||||
}
|
|
@ -0,0 +1,104 @@
|
|||
# Copyright (c) 2020 Ultimaker B.V.
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
import configparser
|
||||
from typing import Tuple, List
|
||||
import io
|
||||
from UM.VersionUpgrade import VersionUpgrade
|
||||
|
||||
class VersionUpgrade462to47(VersionUpgrade):
|
||||
def upgradePreferences(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
|
||||
"""
|
||||
Upgrades preferences to have the new version number.
|
||||
:param serialized: The original contents of the preferences file.
|
||||
:param filename: The file name of the preferences file.
|
||||
:return: A list of new file names, and a list of the new contents for
|
||||
those files.
|
||||
"""
|
||||
parser = configparser.ConfigParser(interpolation = None)
|
||||
parser.read_string(serialized)
|
||||
|
||||
# Update version number.
|
||||
parser["metadata"]["setting_version"] = "15"
|
||||
|
||||
result = io.StringIO()
|
||||
parser.write(result)
|
||||
return [filename], [result.getvalue()]
|
||||
|
||||
def upgradeInstanceContainer(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
|
||||
"""
|
||||
Upgrades instance containers to have the new version number.
|
||||
|
||||
This changes the maximum deviation setting if that setting was present
|
||||
in the profile.
|
||||
:param serialized: The original contents of the instance container.
|
||||
:param filename: The original file name of the instance container.
|
||||
:return: A list of new file names, and a list of the new contents for
|
||||
those files.
|
||||
"""
|
||||
parser = configparser.ConfigParser(interpolation = None, comment_prefixes = ())
|
||||
parser.read_string(serialized)
|
||||
|
||||
# Update version number.
|
||||
parser["metadata"]["setting_version"] = "15"
|
||||
|
||||
if "values" in parser:
|
||||
# Maximum Deviation's effect was corrected. Previously the deviation
|
||||
# ended up being only half of what the user had entered. This was
|
||||
# fixed in Cura 4.7 so there we need to halve the deviation that the
|
||||
# user had entered.
|
||||
#
|
||||
# This got accidentally merged in Cura 4.6.0. In 4.6.2 we removed
|
||||
# that. In 4.7 it's not unmerged, so there we need to revert all
|
||||
# that again.
|
||||
if "meshfix_maximum_deviation" in parser["values"]:
|
||||
maximum_deviation = parser["values"]["meshfix_maximum_deviation"]
|
||||
if maximum_deviation.startswith("="):
|
||||
maximum_deviation = maximum_deviation[1:]
|
||||
maximum_deviation = "=(" + maximum_deviation + ") / 2"
|
||||
parser["values"]["meshfix_maximum_deviation"] = maximum_deviation
|
||||
|
||||
result = io.StringIO()
|
||||
parser.write(result)
|
||||
return [filename], [result.getvalue()]
|
||||
|
||||
def upgradeStack(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
|
||||
"""
|
||||
Upgrades stacks to have the new version number.
|
||||
:param serialized: The original contents of the stack.
|
||||
:param filename: The original file name of the stack.
|
||||
:return: A list of new file names, and a list of the new contents for
|
||||
those files.
|
||||
"""
|
||||
parser = configparser.ConfigParser(interpolation = None)
|
||||
parser.read_string(serialized)
|
||||
|
||||
# Update version number.
|
||||
if "metadata" not in parser:
|
||||
parser["metadata"] = {}
|
||||
parser["metadata"]["setting_version"] = "15"
|
||||
|
||||
# Update Pause at Height script parameters if present.
|
||||
if "post_processing_scripts" in parser["metadata"]:
|
||||
new_scripts_entries = []
|
||||
for script_str in parser["metadata"]["post_processing_scripts"].split("\n"):
|
||||
if not script_str:
|
||||
continue
|
||||
script_str = script_str.replace(r"\\\n", "\n").replace(r"\\\\", "\\\\") # Unescape escape sequences.
|
||||
script_parser = configparser.ConfigParser(interpolation=None)
|
||||
script_parser.optionxform = str # type: ignore # Don't transform the setting keys as they are case-sensitive.
|
||||
script_parser.read_string(script_str)
|
||||
if "PauseAtHeight" in script_parser:
|
||||
if "redo_layers" in script_parser["PauseAtHeight"]:
|
||||
script_parser["PauseAtHeight"]["redo_layer"] = str(int(script_parser["PauseAtHeight"]["redo_layers"]) > 0)
|
||||
del script_parser["PauseAtHeight"]["redo_layers"] # Has been renamed to without the S.
|
||||
script_io = io.StringIO()
|
||||
script_parser.write(script_io)
|
||||
script_str = script_io.getvalue()
|
||||
script_str = script_str.replace("\\\\", r"\\\\").replace("\n", r"\\\n") # Escape newlines because configparser sees those as section delimiters.
|
||||
new_scripts_entries.append(script_str)
|
||||
parser["metadata"]["post_processing_scripts"] = "\n".join(new_scripts_entries)
|
||||
|
||||
result = io.StringIO()
|
||||
parser.write(result)
|
||||
return [filename], [result.getvalue()]
|
|
@ -3,24 +3,24 @@
|
|||
|
||||
from typing import Any, Dict, TYPE_CHECKING
|
||||
|
||||
from . import VersionUpgrade46to47
|
||||
from . import VersionUpgrade462to47
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from UM.Application import Application
|
||||
|
||||
upgrade = VersionUpgrade46to47.VersionUpgrade46to47()
|
||||
upgrade = VersionUpgrade462to47.VersionUpgrade462to47()
|
||||
|
||||
def getMetaData() -> Dict[str, Any]:
|
||||
return {
|
||||
"version_upgrade": {
|
||||
# From To Upgrade function
|
||||
("preferences", 6000012): ("preferences", 6000013, upgrade.upgradePreferences),
|
||||
("machine_stack", 4000012): ("machine_stack", 4000013, upgrade.upgradeStack),
|
||||
("extruder_train", 4000012): ("extruder_train", 4000013, upgrade.upgradeStack),
|
||||
("definition_changes", 4000012): ("definition_changes", 4000013, upgrade.upgradeInstanceContainer),
|
||||
("quality_changes", 4000012): ("quality_changes", 4000013, upgrade.upgradeInstanceContainer),
|
||||
("quality", 4000012): ("quality", 4000013, upgrade.upgradeInstanceContainer),
|
||||
("user", 4000012): ("user", 4000013, upgrade.upgradeInstanceContainer),
|
||||
("preferences", 6000014): ("preferences", 6000015, upgrade.upgradePreferences),
|
||||
("machine_stack", 4000014): ("machine_stack", 4000015, upgrade.upgradeStack),
|
||||
("extruder_train", 4000014): ("extruder_train", 4000015, upgrade.upgradeStack),
|
||||
("definition_changes", 4000014): ("definition_changes", 4000015, upgrade.upgradeInstanceContainer),
|
||||
("quality_changes", 4000014): ("quality_changes", 4000015, upgrade.upgradeInstanceContainer),
|
||||
("quality", 4000014): ("quality", 4000015, upgrade.upgradeInstanceContainer),
|
||||
("user", 4000014): ("user", 4000015, upgrade.upgradeInstanceContainer),
|
||||
},
|
||||
"sources": {
|
||||
"preferences": {
|
8
plugins/VersionUpgrade/VersionUpgrade462to47/plugin.json
Normal file
8
plugins/VersionUpgrade/VersionUpgrade462to47/plugin.json
Normal file
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"name": "Version Upgrade 4.6.2 to 4.7",
|
||||
"author": "Ultimaker B.V.",
|
||||
"version": "1.0.0",
|
||||
"description": "Upgrades configurations from Cura 4.6.2 to Cura 4.7.",
|
||||
"api": "7.2.0",
|
||||
"i18n-catalog": "cura"
|
||||
}
|
|
@ -1,8 +0,0 @@
|
|||
{
|
||||
"name": "Version Upgrade 4.6 to 4.7",
|
||||
"author": "Ultimaker B.V.",
|
||||
"version": "1.0.0",
|
||||
"description": "Upgrades configurations from Cura 4.6 to Cura 4.7.",
|
||||
"api": "7.2.0",
|
||||
"i18n-catalog": "cura"
|
||||
}
|
116
resources/definitions/anycubic_mega_zero.def.json
Normal file
116
resources/definitions/anycubic_mega_zero.def.json
Normal file
|
@ -0,0 +1,116 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Anycubic Mega Zero",
|
||||
"inherits": "fdmprinter",
|
||||
"metadata":
|
||||
{
|
||||
"visible": true,
|
||||
"author": "kad",
|
||||
"manufacturer": "Anycubic",
|
||||
"file_formats": "text/x-gcode",
|
||||
"platform": "anycubic_mega_zero_platform.stl",
|
||||
"has_materials": true,
|
||||
"has_machine_quality": true,
|
||||
"preferred_quality_type": "normal",
|
||||
"preferred_material": "generic_pla",
|
||||
"machine_extruder_trains":
|
||||
{
|
||||
"0": "anycubic_mega_zero_extruder_0"
|
||||
}
|
||||
},
|
||||
|
||||
"overrides":
|
||||
{
|
||||
"machine_name":
|
||||
{
|
||||
"default_value": "Anycubic Mega Zero"
|
||||
},
|
||||
"machine_heated_bed":
|
||||
{
|
||||
"default_value": false
|
||||
},
|
||||
"machine_width":
|
||||
{
|
||||
"default_value": 220
|
||||
},
|
||||
"machine_depth":
|
||||
{
|
||||
"default_value": 220
|
||||
},
|
||||
"machine_height":
|
||||
{
|
||||
"default_value": 250
|
||||
},
|
||||
"machine_center_is_zero":
|
||||
{
|
||||
"default_value": false
|
||||
},
|
||||
"gantry_height":
|
||||
{
|
||||
"value": 25
|
||||
},
|
||||
"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}\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nM117 Start heating ...\nM104 S{material_print_temperature_layer_0}\nM117 Homing X/Y ...\nG28 X0 Y0 ;move X/Y to min endstops\nM117 Homing Z ...\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F{speed_travel} ;move the platform down 15mm\nM117 Heating ...\nM109 S{material_print_temperature_layer_0}\nM117 Start cleaning ...\nG92 E0 ;zero the extruded length\nG1 F200 E10 ;extrude 10mm of feed stock\nG92 E0 ;zero the extruded length again\nM117 Intro line ...\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X0.1 Y20 Z{layer_height} F5000.0 ; Move to start position\nG1 X0.1 Y200.0 Z{layer_height} F1500.0 E15 ; Draw the first line\nG1 X0.4 Y200.0 Z{layer_height} F5000.0 ; Move to side a little\nG1 X0.4 Y20 Z0.3 F1500.0 E30 ; Draw the second line\nG92 E0 ; Reset Extruder\nG1 E-1 F500 ; Retract filiment by 1 mm\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X5 Y20 Z0.3 F{speed_travel} ; Move over to prevent blob squish\nG1 F{speed_travel}\nG92 E0 ; Reset Extruder\nM117 Printing...\n"
|
||||
},
|
||||
"machine_end_gcode":
|
||||
{
|
||||
"default_value": "M117 Cooling down...\nM104 S0 ; turn off extruder\nM84 ; disable motors\nM107 ; Fan off\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 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 X0 ;move X to min endstops, so the head is out of the way\nG90 ;Absolute positionning\nG1 Y200 F3000 ;Present print\nM84 ;steppers off\nM300 P300 S4000\nM117 Finished.\n"
|
||||
},
|
||||
"machine_max_feedrate_x": { "value": 500 },
|
||||
"machine_max_feedrate_y": { "value": 500 },
|
||||
"machine_max_feedrate_z": { "value": 5 },
|
||||
"machine_max_feedrate_e": { "value": 30 },
|
||||
|
||||
"machine_max_acceleration_x": { "value": 500 },
|
||||
"machine_max_acceleration_y": { "value": 500 },
|
||||
"machine_max_acceleration_z": { "value": 100 },
|
||||
"machine_max_acceleration_e": { "value": 5000 },
|
||||
"machine_acceleration": { "value": 500 },
|
||||
"acceleration_print": { "value": 500 },
|
||||
"acceleration_travel": { "value": 500 },
|
||||
"acceleration_enabled": { "value": false },
|
||||
|
||||
"machine_max_jerk_xy": { "value": 10 },
|
||||
"machine_max_jerk_z": { "value": 0.4 },
|
||||
"machine_max_jerk_e": { "value": 5 },
|
||||
"jerk_print": { "value": 10 },
|
||||
"jerk_travel": { "value": "jerk_print" },
|
||||
"jerk_travel_layer_0": { "value": "jerk_travel" },
|
||||
"jerk_enabled": { "value": false },
|
||||
|
||||
"speed_print": { "value": 50.0 },
|
||||
"speed_z_hop": { "value": "machine_max_feedrate_z" },
|
||||
|
||||
"optimize_wall_printing_order": { "value": "True" },
|
||||
"material_initial_print_temperature": { "value": "material_print_temperature" },
|
||||
"material_final_print_temperature": { "value": "material_print_temperature" },
|
||||
|
||||
"retraction_hop_enabled": { "value": "True" },
|
||||
"retraction_hop": { "value": 0.2 },
|
||||
"retraction_combing": { "default_value": "noskin" },
|
||||
"retraction_combing_max_distance": { "value": 30 },
|
||||
|
||||
"travel_avoid_other_parts": { "value": true },
|
||||
"travel_avoid_supports": { "value": true },
|
||||
"travel_retract_before_outer_wall": { "value": true },
|
||||
|
||||
"retraction_enable": { "value": true },
|
||||
"retraction_speed": { "value": 30 },
|
||||
"retraction_amount": { "value": 7 },
|
||||
"retraction_count_max": { "value": 100 },
|
||||
"retraction_extrusion_window": { "value": 10 },
|
||||
"retraction_min_travel": { "value": 1.5 },
|
||||
|
||||
"cool_fan_full_at_height": { "value": "layer_height_0" },
|
||||
"adhesion_type": { "value": "'skirt'" },
|
||||
"skirt_line_count": {"default_value": 3},
|
||||
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
|
||||
"support_xy_distance_overhang": { "value": "wall_line_width_0" },
|
||||
"support_z_distance": { "value": "layer_height if layer_height > 0.1 else layer_height*2" }
|
||||
}
|
||||
}
|
|
@ -6,7 +6,7 @@
|
|||
"type": "extruder",
|
||||
"author": "Ultimaker",
|
||||
"manufacturer": "Unknown",
|
||||
"setting_version": 13,
|
||||
"setting_version": 15,
|
||||
"visible": false,
|
||||
"position": "0"
|
||||
},
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
"type": "machine",
|
||||
"author": "Ultimaker",
|
||||
"manufacturer": "Unknown",
|
||||
"setting_version": 13,
|
||||
"setting_version": 15,
|
||||
"file_formats": "text/x-gcode;application/x-stl-ascii;application/x-stl-binary;application/x-wavefront-obj;application/x3g",
|
||||
"visible": false,
|
||||
"has_materials": true,
|
||||
|
|
|
@ -17,12 +17,13 @@
|
|||
"fabtotum_abs", "fabtotum_nylon", "fabtotum_pla", "fabtotum_tpu",
|
||||
"fiberlogy_hd_pla",
|
||||
"filo3d_pla", "filo3d_pla_green", "filo3d_pla_red",
|
||||
"generic_abs", "generic_abs_175", "generic_cpe_175", "generic_hips_175", "generic_nylon_175", "generic_pc_175", "generic_petg_175", "generic_pla_175", "generic_pva_175", "generic_tpu_175",
|
||||
"generic_abs", "generic_abs_175", "generic_cpe_175", "generic_hips_175", "generic_nylon_175", "generic_pc_175", "generic_petg_175", "generic_pva_175", "generic_tpu_175",
|
||||
"imade3d_petg_175", "imade3d_pla_175",
|
||||
"innofill_innoflex60_175",
|
||||
"leapfrog_abs_natural", "leapfrog_epla_natural","leapfrog_pva_natural",
|
||||
"octofiber_pla",
|
||||
"polyflex_pla", "polymax_pla", "polyplus_pla", "polywood_pla",
|
||||
"redd_abs", "redd_asa", "redd_hips", "redd_nylon", "redd_petg", "redd_pla", "redd_tpe",
|
||||
"verbatim_bvoh_175",
|
||||
"Vertex_Delta_ABS", "Vertex_Delta_PET", "Vertex_Delta_PLA", "Vertex_Delta_PLA_Glitter", "Vertex_Delta_PLA_Mat", "Vertex_Delta_PLA_Satin", "Vertex_Delta_PLA_Wood", "Vertex_Delta_TPU",
|
||||
"tizyx_abs", "tizyx_flex", "tizyx_petg", "tizyx_pla", "tizyx_pla_bois", "tizyx_pva",
|
||||
|
@ -34,7 +35,7 @@
|
|||
"preferred_variant_name": "0.4mm TP extruder",
|
||||
|
||||
"has_machine_quality": true,
|
||||
"preferred_quality_type": "normal",
|
||||
"preferred_quality_type": "high",
|
||||
|
||||
"machine_extruder_trains":
|
||||
{
|
||||
|
|
35
resources/definitions/leapfrog_creatr_hs.def.json
Normal file
35
resources/definitions/leapfrog_creatr_hs.def.json
Normal file
|
@ -0,0 +1,35 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Leapfrog Creatr HS",
|
||||
"inherits": "fdmprinter",
|
||||
"metadata": {
|
||||
"visible": true,
|
||||
"author": "Psychometer",
|
||||
"manufacturer": "Leapfrog B.V.",
|
||||
"file_formats": "text/x-gcode",
|
||||
"supports_usb_connection": true,
|
||||
"machine_extruder_trains":
|
||||
{
|
||||
"0": "leapfrog_creatr_hs_extruder_right",
|
||||
"1": "leapfrog_creatr_hs_extruder_left"
|
||||
}
|
||||
},
|
||||
"overrides": {
|
||||
"machine_name": {"default_value": "Leapfrog Creatr HS" },
|
||||
"machine_width": {"default_value": 270},
|
||||
"machine_depth": {"default_value": 280},
|
||||
"machine_height": {"default_value": 180},
|
||||
"machine_shape": { "default_value": "Rectangular"},
|
||||
"machine_center_is_zero": {"default_value": false},
|
||||
"machine_heated_bed": {"default_value": true},
|
||||
"build_volume_temperature": {"enabled": false},
|
||||
"machine_gcode_flavor": {"default_value": "Marlin"},
|
||||
|
||||
"machine_head_with_fans_polygon": {"default_value": [[-40, -50 ], [-40, 100], [40, -50 ], [40, 100]]},
|
||||
"gantry_height": {"value": "2"},
|
||||
"machine_extruder_count": {"default_value": 2},
|
||||
|
||||
"machine_start_gcode": {"default_value": "M107 ; start with the fan off\nG28 X0 Y0 ; home XY axes\nG28 Z0 ; home Z\nG92 X0 Y0 Z0 E0 ; reset software positions\nG1 Z15.0 F180\nT0\nG92 E0 ; zero the extruded length\nG1 E3 F200\nG92 E0 ; zero the extruded length again\nG1 F225"},
|
||||
"machine_end_gcode": {"default_value": "M104 S0 T0 ; turn off right extruder\nM104 S0 T1 ; turn off left extruder\nM140 S0 T0 ; turn off bed\nG1 Z200 F1200 ; drop bed\nG28 X0 ; home X axis\nM84 ; disable motors"}
|
||||
}
|
||||
}
|
35
resources/definitions/leapfrog_creatr_hs_xl.def.json
Normal file
35
resources/definitions/leapfrog_creatr_hs_xl.def.json
Normal file
|
@ -0,0 +1,35 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Leapfrog Creatr HS XL",
|
||||
"inherits": "fdmprinter",
|
||||
"metadata": {
|
||||
"visible": true,
|
||||
"author": "Psychometer",
|
||||
"manufacturer": "Leapfrog B.V.",
|
||||
"file_formats": "text/x-gcode",
|
||||
"supports_usb_connection": true,
|
||||
"machine_extruder_trains":
|
||||
{
|
||||
"0": "leapfrog_creatr_hs_xl_extruder_right",
|
||||
"1": "leapfrog_creatr_hs_xl_extruder_left"
|
||||
}
|
||||
},
|
||||
"overrides": {
|
||||
"machine_name": {"default_value": "Leapfrog Creatr HS XL" },
|
||||
"machine_width": {"default_value": 270},
|
||||
"machine_depth": {"default_value": 280},
|
||||
"machine_height": {"default_value": 590},
|
||||
"machine_shape": { "default_value": "Rectangular"},
|
||||
"machine_center_is_zero": {"default_value": false},
|
||||
"machine_heated_bed": {"default_value": true},
|
||||
"build_volume_temperature": {"enabled": false},
|
||||
"machine_gcode_flavor": {"default_value": "Marlin"},
|
||||
|
||||
"machine_head_with_fans_polygon": {"default_value": [[-40, -50 ], [-40, 100], [40, -50 ], [40, 100]]},
|
||||
"gantry_height": {"value": "2"},
|
||||
"machine_extruder_count": {"default_value": 2},
|
||||
|
||||
"machine_start_gcode": {"default_value": "M107 ; start with the fan off\nG28 X0 Y0 ; home XY axes\nG28 Z0 ; home Z\nG92 X0 Y0 Z0 E0 ; reset software positions\nG1 Z15.0 F180\nT0\nG92 E0 ; zero the extruded length\nG1 E3 F200\nG92 E0 ; zero the extruded length again\nG1 F225"},
|
||||
"machine_end_gcode": {"default_value": "G92 E0 ; Zero extruder\nG1 E-6.00 F1500 ; Retract filament\nM104 S0 T0 ; turn off right extruder\nM104 S0 T1 ; turn off left extruder\nM140 S0 T0 ; turn off bed\nG1 Z590 F1200 ; drop bed\nG28 X0 ; home X axis\nG1 Y270 F12000 ; Move Y axis to the backside\nM84 ; disable motors"}
|
||||
}
|
||||
}
|
|
@ -171,7 +171,7 @@
|
|||
"value": "0.1"
|
||||
},
|
||||
"meshfix_maximum_deviation": {
|
||||
"value": "0.0015"
|
||||
"value": "0.002"
|
||||
},
|
||||
"skin_outline_count": {
|
||||
"value": 0
|
||||
|
|
|
@ -591,7 +591,7 @@
|
|||
"value": "0.2"
|
||||
},
|
||||
"meshfix_maximum_deviation": {
|
||||
"default_value": 0.005
|
||||
"default_value": 0.003
|
||||
},
|
||||
"jerk_roofing": {
|
||||
"value": "10"
|
||||
|
|
37
resources/definitions/tronxy_d01.def.json
Normal file
37
resources/definitions/tronxy_d01.def.json
Normal file
|
@ -0,0 +1,37 @@
|
|||
{
|
||||
"name": "Tronxy D01",
|
||||
"version": 2,
|
||||
"inherits": "tronxy_x",
|
||||
"metadata": {
|
||||
"quality_definition": "tronxy_x",
|
||||
"visible": true,
|
||||
"author": "AdderMk2",
|
||||
"platform": "tronxy.stl"
|
||||
},
|
||||
"overrides": {
|
||||
"machine_name": { "default_value": "Tronxy D01" },
|
||||
"machine_width": { "default_value": 220 },
|
||||
"machine_depth": { "default_value": 220 },
|
||||
"machine_height": { "default_value": 220 },
|
||||
"machine_head_with_fans_polygon": { "default_value": [
|
||||
[-32, 45],
|
||||
[-32, -30],
|
||||
[32, -30],
|
||||
[32, 45]
|
||||
]
|
||||
},
|
||||
"gantry_height": { "value": 30 },
|
||||
|
||||
"machine_start_gcode": { "default_value": "; XY-2 Start Code\nG21\nG90\nM82\nM107 T0\nM140 S{material_bed_temperature}\nM104 S{material_print_temperature} T0\nM190 S{material_bed_temperature}\nM109 S{material_print_temperature} T0\nG28\nG92 E0\nG1 Z2.0 F3000 ; Move Z Axis up little to preventscratching of Heat Bed\nG1 X1 Y20 Z0.3 F3600.0 ; Move to start position\nG1 X1 Y220.0 Z0.3 F1500.0 E25 ; Draw the first line\nG1 X1.6 Y220.0 Z0.3 F3600.0 ; Move to side a little\nG1 X1.6 Y20 Z0.3 F1500.0 E50 ; Draw the second line\nG92 E0 ; Reset Extruder\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X5 Y20 Z0.3 F3600.0 ; Move over to prevent blob squish" },
|
||||
|
||||
"machine_max_feedrate_x": { "value": 150 },
|
||||
"machine_max_feedrate_y": { "value": 150 },
|
||||
"machine_max_feedrate_z": { "value": 20 },
|
||||
"machine_max_feedrate_e": { "value": 120 },
|
||||
"machine_max_acceleration_x": { "value": 150 },
|
||||
"machine_max_acceleration_y": { "value": 150 },
|
||||
"machine_max_acceleration_z": { "value": 150 },
|
||||
"machine_max_acceleration_e": { "value": 150 },
|
||||
"machine_acceleration": { "value": 120 }
|
||||
}
|
||||
}
|
166
resources/definitions/tronxy_x.def.json
Normal file
166
resources/definitions/tronxy_x.def.json
Normal file
|
@ -0,0 +1,166 @@
|
|||
{
|
||||
"name": "Tronxy Base Printer",
|
||||
"version": 2,
|
||||
"inherits": "fdmprinter",
|
||||
"metadata": {
|
||||
"visible": false,
|
||||
"author": "AdderMk2",
|
||||
"manufacturer": "Tronxy",
|
||||
"file_formats": "text/x-gcode",
|
||||
"first_start_actions": ["MachineSettingsAction"],
|
||||
|
||||
"machine_extruder_trains": {
|
||||
"0": "tronxy_base_extruder_0"
|
||||
},
|
||||
|
||||
"has_materials": true,
|
||||
"has_variants": true,
|
||||
"has_machine_quality": true,
|
||||
"variants_name": "Nozzle Size",
|
||||
|
||||
"preferred_variant_name": "0.4mm Nozzle",
|
||||
"preferred_quality_type": "normal",
|
||||
"preferred_material": "generic_pla"
|
||||
},
|
||||
"overrides": {
|
||||
"machine_name": { "default_value": "Tronxy Base Printer" },
|
||||
"machine_start_gcode": { "default_value": "G21\nG90\nM82\nM107 T0\nM140 S{material_bed_temperature}\nM104 S{material_print_temperature} T0\nM190 S{material_bed_temperature}\nM109 S{material_print_temperature} T0\nG28\nG92 E0\nG1 Z15.0 F{speed_travel}\nG0 E3 F200\nG92 E0\n" },
|
||||
"machine_end_gcode": { "default_value": "M107 T0\nM104 S0\nM104 S0 T1\nM140 S0\nG92 E0\nG91\nG1 E-1 F300 \nG1 Z+0.5 E-5 X-20 Y-20 F9000\nG28 X0 Y0\nM84 ;steppers off\nG90 ;absolute positioning\n" },
|
||||
|
||||
"machine_max_feedrate_x": { "value": 100 },
|
||||
"machine_max_feedrate_y": { "value": 100 },
|
||||
"machine_max_feedrate_z": { "value": 10 },
|
||||
"machine_max_feedrate_e": { "value": 50 },
|
||||
|
||||
"machine_max_acceleration_x": { "value": 120 },
|
||||
"machine_max_acceleration_y": { "value": 120 },
|
||||
"machine_max_acceleration_z": { "value": 120 },
|
||||
"machine_max_acceleration_e": { "value": 120 },
|
||||
"machine_acceleration": { "value": 100 },
|
||||
|
||||
"machine_max_jerk_xy": { "value": 20 },
|
||||
"machine_max_jerk_z": { "value": 0.4 },
|
||||
"machine_max_jerk_e": { "value": 5 },
|
||||
|
||||
"machine_heated_bed": { "default_value": true },
|
||||
|
||||
"material_diameter": { "default_value": 1.75 },
|
||||
|
||||
"acceleration_print": { "value": "machine_acceleration" },
|
||||
"acceleration_travel": { "value": "machine_acceleration" },
|
||||
"acceleration_travel_layer_0": { "value": "acceleration_travel" },
|
||||
"acceleration_roofing": { "enabled": "acceleration_enabled and roofing_layer_count > 0 and top_layers > 0" },
|
||||
|
||||
"jerk_print": { "value": 20 },
|
||||
"jerk_travel": { "value": "jerk_print" },
|
||||
"jerk_travel_layer_0": { "value": "jerk_travel" },
|
||||
|
||||
"acceleration_enabled": { "value": false },
|
||||
"jerk_enabled": { "value": false },
|
||||
|
||||
"speed_print": { "value": 60.0 } ,
|
||||
"speed_infill": { "value": "speed_print" },
|
||||
"speed_wall": { "value": "speed_print / 1.33" },
|
||||
"speed_wall_0": { "value": "speed_wall" },
|
||||
"speed_wall_x": { "value": "speed_wall" },
|
||||
"speed_topbottom": { "value": "speed_print / 1.5" },
|
||||
"speed_roofing": { "value": "speed_topbottom" },
|
||||
"speed_travel": { "value": "60.0 if speed_print < 50 else 120.0 if speed_print > 80 else speed_print * 1.25" },
|
||||
"speed_layer_0": { "value": 30.0 },
|
||||
"speed_print_layer_0": { "value": "speed_layer_0" },
|
||||
"speed_travel_layer_0": { "value": "45 if speed_layer_0 < 20 else 60 if speed_layer_0 > 30 else speed_layer_0 * 1.5" },
|
||||
"speed_prime_tower": { "value": "speed_topbottom" },
|
||||
"speed_support": { "value": "speed_wall_0" },
|
||||
"speed_support_interface": { "value": "speed_topbottom" },
|
||||
"speed_z_hop": { "value": 5 },
|
||||
|
||||
"skirt_brim_speed": { "value": "speed_layer_0" },
|
||||
|
||||
"line_width": { "value": "machine_nozzle_size" },
|
||||
|
||||
"optimize_wall_printing_order": { "value": "True" },
|
||||
|
||||
"material_initial_print_temperature": { "value": "material_print_temperature" },
|
||||
"material_final_print_temperature": { "value": "material_print_temperature" },
|
||||
"material_flow": { "value": 100 },
|
||||
"travel_compensate_overlapping_walls_0_enabled": { "value": "False" },
|
||||
|
||||
"z_seam_type": { "value": "'back'" },
|
||||
"z_seam_corner": { "value": "'z_seam_corner_weighted'" },
|
||||
|
||||
"infill_sparse_density": { "value": "20" },
|
||||
"infill_pattern": { "value": "'lines' if infill_sparse_density > 50 else 'cubic'" },
|
||||
"infill_before_walls": { "value": false },
|
||||
"infill_overlap": { "value": 30.0 },
|
||||
"skin_overlap": { "value": 10.0 },
|
||||
"infill_wipe_dist": { "value": 0.0 },
|
||||
"wall_0_wipe_dist": { "value": 0.0 },
|
||||
|
||||
"fill_perimeter_gaps": { "value": "'everywhere'" },
|
||||
"fill_outline_gaps": { "value": false },
|
||||
"filter_out_tiny_gaps": { "value": false },
|
||||
|
||||
"retraction_speed": {
|
||||
"maximum_value_warning": "machine_max_feedrate_e",
|
||||
"maximum_value": 200
|
||||
},
|
||||
"retraction_retract_speed": {
|
||||
"maximum_value_warning": "machine_max_feedrate_e",
|
||||
"maximum_value": 200
|
||||
},
|
||||
"retraction_prime_speed": {
|
||||
"maximum_value_warning": "machine_max_feedrate_e",
|
||||
"maximum_value": 200
|
||||
},
|
||||
|
||||
"retraction_hop_enabled": { "value": "False" },
|
||||
"retraction_hop": { "value": 0.2 },
|
||||
"retraction_combing": { "value": "'off' if retraction_hop_enabled else 'noskin'" },
|
||||
"retraction_combing_max_distance": { "value": 30 },
|
||||
"travel_avoid_other_parts": { "value": true },
|
||||
"travel_avoid_supports": { "value": true },
|
||||
"travel_retract_before_outer_wall": { "value": true },
|
||||
|
||||
"retraction_enable": { "value": true },
|
||||
"retraction_count_max": { "value": 100 },
|
||||
"retraction_extrusion_window": { "value": 10 },
|
||||
"retraction_min_travel": { "value": 1.5 },
|
||||
|
||||
"cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" },
|
||||
"cool_fan_enabled": { "value": true },
|
||||
"cool_min_layer_time": { "value": 10 },
|
||||
|
||||
"adhesion_type": { "value": "'skirt'" },
|
||||
"brim_replaces_support": { "value": false },
|
||||
"skirt_gap": { "value": 10.0 },
|
||||
"skirt_line_count": { "value": 3 },
|
||||
|
||||
"adaptive_layer_height_variation": { "value": 0.04 },
|
||||
"adaptive_layer_height_variation_step": { "value": 0.04 },
|
||||
|
||||
"meshfix_maximum_resolution": { "value": "0.05" },
|
||||
"meshfix_maximum_travel_resolution": { "value": "meshfix_maximum_resolution" },
|
||||
|
||||
"support_angle": { "value": "math.floor(math.degrees(math.atan(line_width/2.0/layer_height)))" },
|
||||
"support_pattern": { "value": "'zigzag'" },
|
||||
"support_infill_rate": { "value": "0 if support_tree_enable else 20" },
|
||||
"support_use_towers": { "value": false },
|
||||
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
|
||||
"support_xy_distance_overhang": { "value": "wall_line_width_0" },
|
||||
"support_z_distance": { "value": "layer_height if layer_height >= 0.16 else layer_height*2" },
|
||||
"support_xy_overrides_z": { "value": "'xy_overrides_z'" },
|
||||
"support_wall_count": { "value": 1 },
|
||||
"support_brim_enable": { "value": true },
|
||||
"support_brim_width": { "value": 4 },
|
||||
|
||||
"support_interface_enable": { "value": true },
|
||||
"support_interface_height": { "value": "layer_height * 4" },
|
||||
"support_interface_density": { "value": 33.333 },
|
||||
"support_interface_pattern": { "value": "'grid'" },
|
||||
"support_interface_skip_height": { "value": 0.2 },
|
||||
"minimum_support_area": { "value": 2 },
|
||||
"minimum_interface_area": { "value": 10 },
|
||||
"top_bottom_thickness": {"value": "layer_height_0 + layer_height * 3" },
|
||||
"wall_thickness": {"value": "line_width * 2" }
|
||||
}
|
||||
}
|
28
resources/definitions/tronxy_x5sa.def.json
Normal file
28
resources/definitions/tronxy_x5sa.def.json
Normal file
|
@ -0,0 +1,28 @@
|
|||
{
|
||||
"name": "Tronxy X5SA/X5ST/Pro",
|
||||
"version": 2,
|
||||
"inherits": "tronxy_x",
|
||||
"metadata": {
|
||||
"quality_definition": "tronxy_x",
|
||||
"visible": true,
|
||||
"author": "AdderMk2",
|
||||
"platform": "tronxy.stl"
|
||||
},
|
||||
"overrides": {
|
||||
"machine_name": { "default_value": "Tronxy X5SA" },
|
||||
"machine_width": { "default_value": 330 },
|
||||
"machine_depth": { "default_value": 330 },
|
||||
"machine_height": { "default_value": 400 },
|
||||
"machine_head_with_fans_polygon": { "default_value": [
|
||||
[-48, 45],
|
||||
[-48, -30],
|
||||
[27, -30],
|
||||
[27, 45]
|
||||
]
|
||||
},
|
||||
"gantry_height": { "value": 40 },
|
||||
|
||||
"machine_start_gcode": { "default_value": "; X5SA Pro Start Code\nG21\nG90\nM82\nM107 T0\nM140 S{material_bed_temperature}\nM104 S{material_print_temperature} T0\nM190 S{material_bed_temperature}\nM109 S{material_print_temperature} T0\nG28\nG92 E0\n"},
|
||||
"machine_end_gcode": { "default_value": "G91\nG1 E-2 F3000\nG1 E-2 Z0.2 F1200\nG1 X5 Y5 F3600\nG1 Z10\nG90\nG1 X0 Y0\nM106 S0\nM104 S0\nM140 S0\n\nM84 X Y E\n" }
|
||||
}
|
||||
}
|
33
resources/definitions/tronxy_x5sa_400.def.json
Normal file
33
resources/definitions/tronxy_x5sa_400.def.json
Normal file
|
@ -0,0 +1,33 @@
|
|||
{
|
||||
"name": "Tronxy X5SA/X5ST/Pro 400",
|
||||
"version": 2,
|
||||
"inherits": "tronxy_x",
|
||||
"metadata": {
|
||||
"quality_definition": "tronxy_x",
|
||||
"visible": true,
|
||||
"author": "AdderMk2",
|
||||
"platform": "tronxy.stl"
|
||||
},
|
||||
"overrides": {
|
||||
"machine_name": { "default_value": "Tronxy X5SA 400" },
|
||||
"machine_width": { "default_value": 400 },
|
||||
"machine_depth": { "default_value": 400 },
|
||||
"machine_height": { "default_value": 400 },
|
||||
"machine_head_with_fans_polygon": { "default_value": [
|
||||
[-48, 45],
|
||||
[-48, -30],
|
||||
[27, -30],
|
||||
[27, 45]
|
||||
]
|
||||
},
|
||||
"gantry_height": { "value": 40 },
|
||||
|
||||
"machine_start_gcode": { "default_value": "; X5SA Start Code\nG21\nG90\nM82\nM107 T0\nM140 S{material_bed_temperature}\nM104 S{material_print_temperature} T0\nM190 S{material_bed_temperature}\nM109 S{material_print_temperature} T0\nG28\nG92 E0\nG1 Z2.0 F3000 ; Move Z Axis up little to preventscratching of Heat Bed\nG1 X1 Y20 Z0.3 F3600.0 ; Move to start position\nG1 X1 Y370.0 Z0.3 F1500.0 E25 ; Draw the first line\nG1 X1.6 Y370.0 Z0.3 F3600.0 ; Move to side a little\nG1 X1.6 Y20 Z0.3 F1500.0 E50 ; Draw the second line\nG92 E0 ; Reset Extruder\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X5 Y20 Z0.3 F3600.0 ; Move over to prevent blob squish"},
|
||||
"machine_end_gcode": { "default_value": "G91 ;Relative positioning\nG1 E-2 F2700 \nG1 E-2 Z0.2 F2400 \nG1 X5 Y5 F3000\nG1 Z10\nG90\n\nG1 X0 Y0 \nM106 S0\nM104 S0\nM140 S0\n\nM84 X Y E \n" },
|
||||
|
||||
"machine_max_feedrate_x": { "value": 100 },
|
||||
"machine_max_feedrate_y": { "value": 100 },
|
||||
"machine_max_feedrate_z": { "value": 20 },
|
||||
"machine_max_feedrate_e": { "value": 120 }
|
||||
}
|
||||
}
|
33
resources/definitions/tronxy_x5sa_500.def.json
Normal file
33
resources/definitions/tronxy_x5sa_500.def.json
Normal file
|
@ -0,0 +1,33 @@
|
|||
{
|
||||
"name": "Tronxy X5SA/X5ST/Pro 500",
|
||||
"version": 2,
|
||||
"inherits": "tronxy_x",
|
||||
"metadata": {
|
||||
"quality_definition": "tronxy_x",
|
||||
"visible": true,
|
||||
"author": "AdderMk2",
|
||||
"platform": "tronxy.stl"
|
||||
},
|
||||
"overrides": {
|
||||
"machine_name": { "default_value": "Tronxy X5SA 500" },
|
||||
"machine_width": { "default_value": 500 },
|
||||
"machine_depth": { "default_value": 500 },
|
||||
"machine_height": { "default_value": 600 },
|
||||
"machine_head_with_fans_polygon": { "default_value": [
|
||||
[-48, 45],
|
||||
[-48, -30],
|
||||
[27, -30],
|
||||
[27, 45]
|
||||
]
|
||||
},
|
||||
"gantry_height": { "value": 40 },
|
||||
|
||||
"machine_start_gcode": { "default_value": "; X5SA Start Code\nG21\nG90\nM82\nM107 T0\nM140 S{material_bed_temperature}\nM104 S{material_print_temperature} T0\nM190 S{material_bed_temperature}\nM109 S{material_print_temperature} T0\nG28\nG92 E0\n "},
|
||||
"machine_end_gcode": { "default_value": "G91 ;Relative positioning\nG1 E-2 F2700 \nG1 E-2 Z0.2 F2400 \nG1 X5 Y5 F3000\nG1 Z10\nG90\n\nG1 X0 Y0 \nM106 S0\nM104 S0\nM140 S0\n\nM84 X Y E \n" },
|
||||
|
||||
"machine_max_feedrate_x": { "value": 150 },
|
||||
"machine_max_feedrate_y": { "value": 150 },
|
||||
"machine_max_feedrate_z": { "value": 20 },
|
||||
"machine_max_feedrate_e": { "value": 120 }
|
||||
}
|
||||
}
|
38
resources/definitions/tronxy_xy2.def.json
Normal file
38
resources/definitions/tronxy_xy2.def.json
Normal file
|
@ -0,0 +1,38 @@
|
|||
{
|
||||
"name": "Tronxy XY-2",
|
||||
"version": 2,
|
||||
"inherits": "tronxy_x",
|
||||
"metadata": {
|
||||
"quality_definition": "tronxy_x",
|
||||
"visible": true,
|
||||
"author": "AdderMk2",
|
||||
"platform": "tronxy.stl"
|
||||
},
|
||||
"overrides": {
|
||||
"machine_name": { "default_value": "Tronxy XY-2" },
|
||||
"machine_width": { "default_value": 220 },
|
||||
"machine_depth": { "default_value": 220 },
|
||||
"machine_height": { "default_value": 260 },
|
||||
"machine_head_with_fans_polygon": { "default_value": [
|
||||
[-30, 45],
|
||||
[-30, -30],
|
||||
[27, -30],
|
||||
[27, 45]
|
||||
]
|
||||
},
|
||||
"gantry_height": { "value": 40 },
|
||||
|
||||
"machine_start_gcode": { "default_value": "; XY-2 Start Code\nG21\nG90\nM82\nM107 T0\nM140 S{material_bed_temperature}\nM104 S{material_print_temperature} T0\nM190 S{material_bed_temperature}\nM109 S{material_print_temperature} T0\nG28\nG92 E0\n"},
|
||||
"machine_end_gcode": { "default_value": "G91\nG1 E-2 F3000\nG1 E-2 Z0.2 F1200\nG1 X5 Y5 F3600\nG1 Z10\nG90\nG1 X0 Y{machine_depth}\nM106 S0 ;Turn-off fan\nM104 S0\nM140 S0\n\nM84 X Y E\n" },
|
||||
|
||||
"machine_max_feedrate_x": { "value": 100 },
|
||||
"machine_max_feedrate_y": { "value": 100 },
|
||||
"machine_max_feedrate_z": { "value": 20 },
|
||||
"machine_max_feedrate_e": { "value": 120 },
|
||||
"machine_max_acceleration_x": { "value": 150 },
|
||||
"machine_max_acceleration_y": { "value": 150 },
|
||||
"machine_max_acceleration_z": { "value": 150 },
|
||||
"machine_max_acceleration_e": { "value": 150 },
|
||||
"machine_acceleration": { "value": 80 }
|
||||
}
|
||||
}
|
43
resources/definitions/tronxy_xy2pro.def.json
Normal file
43
resources/definitions/tronxy_xy2pro.def.json
Normal file
|
@ -0,0 +1,43 @@
|
|||
{
|
||||
"name": "Tronxy XY-2 Pro",
|
||||
"version": 2,
|
||||
"inherits": "tronxy_x",
|
||||
"metadata": {
|
||||
"quality_definition": "tronxy_x",
|
||||
"visible": true,
|
||||
"author": "AdderMk2",
|
||||
"platform": "tronxy.stl"
|
||||
},
|
||||
"overrides": {
|
||||
"machine_name": { "default_value": "Tronxy XY-2 Pro" },
|
||||
"machine_width": { "default_value": 255 },
|
||||
"machine_depth": { "default_value": 255 },
|
||||
"machine_height": { "default_value": 260 },
|
||||
"machine_head_with_fans_polygon": { "default_value": [
|
||||
[-48, 45],
|
||||
[-48, -30],
|
||||
[27, -30],
|
||||
[27, 45]
|
||||
]
|
||||
},
|
||||
"gantry_height": { "value": 40 },
|
||||
|
||||
"machine_start_gcode": { "default_value": "; XY-2 Start Code\nG21\nG90\nM82\nM107 T0\nM140 S{material_bed_temperature}\nM104 S{material_print_temperature} T0\nM190 S{material_bed_temperature}\nM109 S{material_print_temperature} T0\nG28\nG92 E0\n"},
|
||||
"machine_end_gcode": { "default_value": "G91\nG1 E-2 F3000\nG1 E-2 Z0.2 F1200\nG1 X5 Y5 F3600\nG1 Z10\nG90\nG1 X0 Y{machine_depth}\nM106 S0\nM104 S0\nM140 S0\n\nM84 X Y E\n" },
|
||||
|
||||
"machine_max_feedrate_x": { "value": 100 },
|
||||
"machine_max_feedrate_y": { "value": 100 },
|
||||
"machine_max_feedrate_z": { "value": 20 },
|
||||
"machine_max_feedrate_e": { "value": 120 },
|
||||
|
||||
"machine_max_acceleration_x": { "value": 120 },
|
||||
"machine_max_acceleration_y": { "value": 120 },
|
||||
"machine_max_acceleration_z": { "value": 120 },
|
||||
"machine_max_acceleration_e": { "value": 120 },
|
||||
"machine_acceleration": { "value": 150 },
|
||||
|
||||
"machine_max_jerk_xy": { "value": 20 },
|
||||
"machine_max_jerk_z": { "value": 0.4 },
|
||||
"machine_max_jerk_e": { "value": 5 }
|
||||
}
|
||||
}
|
38
resources/definitions/tronxy_xy3.def.json
Normal file
38
resources/definitions/tronxy_xy3.def.json
Normal file
|
@ -0,0 +1,38 @@
|
|||
{
|
||||
"name": "Tronxy XY-3",
|
||||
"version": 2,
|
||||
"inherits": "tronxy_x",
|
||||
"metadata": {
|
||||
"quality_definition": "tronxy_x",
|
||||
"visible": true,
|
||||
"author": "AdderMk2",
|
||||
"platform": "tronxy.stl"
|
||||
},
|
||||
"overrides": {
|
||||
"machine_name": { "default_value": "Tronxy XY-3" },
|
||||
"machine_width": { "default_value": 310 },
|
||||
"machine_depth": { "default_value": 310 },
|
||||
"machine_height": { "default_value": 330 },
|
||||
"machine_head_with_fans_polygon": { "default_value": [
|
||||
[-30, 45],
|
||||
[-30, -30],
|
||||
[27, -30],
|
||||
[27, 45]
|
||||
]
|
||||
},
|
||||
"gantry_height": { "value": 30 },
|
||||
|
||||
"machine_start_gcode": { "default_value": "; XY-2 Start Code\nG21\nG90\nM82\nM107 T0\nM140 S{material_bed_temperature}\nM104 S{material_print_temperature} T0\nM190 S{material_bed_temperature}\nM109 S{material_print_temperature} T0\nG28\nG92 E0\n"},
|
||||
"machine_end_gcode": { "default_value": "G91\nG1 E-2 F3000\nG1 E-2 Z0.2 F1200\nG1 X5 Y5 F3600\nG1 Z10\nG90\nG1 X0 Y{machine_depth}\nM106 S0\nM104 S0\nM140 S0\n\nM84 X Y E\n" },
|
||||
|
||||
"machine_max_feedrate_x": { "value": 100 },
|
||||
"machine_max_feedrate_y": { "value": 100 },
|
||||
"machine_max_feedrate_z": { "value": 20 },
|
||||
"machine_max_feedrate_e": { "value": 120 },
|
||||
"machine_max_acceleration_x": { "value": 150 },
|
||||
"machine_max_acceleration_y": { "value": 150 },
|
||||
"machine_max_acceleration_z": { "value": 150 },
|
||||
"machine_max_acceleration_e": { "value": 150 },
|
||||
"machine_acceleration": { "value": 80 }
|
||||
}
|
||||
}
|
15
resources/extruders/anycubic_mega_zero_extruder_0.def.json
Normal file
15
resources/extruders/anycubic_mega_zero_extruder_0.def.json
Normal file
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Extruder 1",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata": {
|
||||
"machine": "anycubic_mega_zero",
|
||||
"position": "0"
|
||||
},
|
||||
|
||||
"overrides": {
|
||||
"extruder_nr": { "default_value": 0 },
|
||||
"machine_nozzle_size": { "default_value": 0.4 },
|
||||
"material_diameter": { "default_value": 1.75 }
|
||||
}
|
||||
}
|
|
@ -19,7 +19,7 @@
|
|||
"default_value": "\n;changing to tool1\nM83\nM109 T0 S{material_print_temperature}\nG1 E{switch_extruder_retraction_amount} F300\nG1 E{switch_extruder_retraction_amount} F300\nG1 E{switch_extruder_retraction_amount} F300\nG1 E{switch_extruder_retraction_amount} F300\nG1 E-{switch_extruder_retraction_amount} F2400\nG1 Y40 F3000\nG1 X10 F12000\n\n"
|
||||
},
|
||||
"machine_extruder_end_code": {
|
||||
"default_value": "\nG1 X10 Y120 F12000\nG1 X-25 F12000\nM109 T0 R{material_standby_temperature}\nG1 Y20 F3000\n; ending tool1\n\n"
|
||||
"default_value": "\nG1 X10 Y40 F12000\nG1 X-25 F12000\nM109 T0 R{material_standby_temperature}\nG1 Y20 F3000\n; ending tool1\n\n"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
"default_value": "\n;changing to tool2\nM83\nM109 T1 S{material_print_temperature}\nG1 E{switch_extruder_retraction_amount} F300\nG1 E{switch_extruder_retraction_amount} F300\nG1 E{switch_extruder_retraction_amount} F300\nG1 E{switch_extruder_retraction_amount} F300\nG1 E-{switch_extruder_retraction_amount} F2400\nG1 Y40 F3000\nG1 X10 F12000\n\n"
|
||||
},
|
||||
"machine_extruder_end_code": {
|
||||
"default_value": "\nG1 X10 Y120 F12000\nG1 X-25 F12000\nM109 T1 R{material_standby_temperature}\nG1 Y20 F3000\n; ending tool2\n\n"
|
||||
"default_value": "\nG1 X10 Y40 F12000\nG1 X-25 F12000\nM109 T1 R{material_standby_temperature}\nG1 Y20 F3000\n; ending tool2\n\n"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Left extruder",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata": {
|
||||
"machine": "leapfrog_creatr_hs",
|
||||
"position": "1"
|
||||
},
|
||||
"overrides": {
|
||||
"extruder_nr": {
|
||||
"default_value": 1
|
||||
},
|
||||
"machine_nozzle_size": { "default_value": 0.35 },
|
||||
"material_diameter": { "default_value": 1.75 },
|
||||
"machine_nozzle_offset_x": { "default_value": 20 },
|
||||
"machine_nozzle_offset_y": { "default_value": 25 }
|
||||
}
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Right extruder",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata": {
|
||||
"machine": "leapfrog_creatr_hs",
|
||||
"position": "0"
|
||||
},
|
||||
"overrides": {
|
||||
"extruder_nr": {
|
||||
"default_value": 0
|
||||
},
|
||||
"machine_nozzle_size": { "default_value": 0.35 },
|
||||
"material_diameter": { "default_value": 1.75 },
|
||||
"machine_nozzle_offset_x": { "default_value": 35 },
|
||||
"machine_nozzle_offset_y": { "default_value": 25 }
|
||||
}
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Left extruder",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata": {
|
||||
"machine": "leapfrog_creatr_hs_xl",
|
||||
"position": "1"
|
||||
},
|
||||
"overrides": {
|
||||
"extruder_nr": {
|
||||
"default_value": 1
|
||||
},
|
||||
"machine_nozzle_size": { "default_value": 0.35 },
|
||||
"material_diameter": { "default_value": 1.75 },
|
||||
"machine_nozzle_offset_x": { "default_value": 20 },
|
||||
"machine_nozzle_offset_y": { "default_value": 25 }
|
||||
}
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Right extruder",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata": {
|
||||
"machine": "leapfrog_creatr_hs_xl",
|
||||
"position": "0"
|
||||
},
|
||||
"overrides": {
|
||||
"extruder_nr": {
|
||||
"default_value": 0
|
||||
},
|
||||
"machine_nozzle_size": { "default_value": 0.35 },
|
||||
"material_diameter": { "default_value": 1.75 },
|
||||
"machine_nozzle_offset_x": { "default_value": 35 },
|
||||
"machine_nozzle_offset_y": { "default_value": 25 }
|
||||
}
|
||||
}
|
16
resources/extruders/tronxy_base_extruder_0.def.json
Normal file
16
resources/extruders/tronxy_base_extruder_0.def.json
Normal file
|
@ -0,0 +1,16 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Extruder 1",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata": {
|
||||
"machine": "tronxy_x",
|
||||
"position": "0"
|
||||
},
|
||||
|
||||
"overrides": {
|
||||
"extruder_nr": { "default_value": 0 },
|
||||
"machine_nozzle_size": { "default_value": 0.4 },
|
||||
"material_diameter": { "default_value": 1.75 }
|
||||
|
||||
}
|
||||
}
|
|
@ -4,7 +4,7 @@ name = Quick
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
intent_category = quick
|
||||
quality_type = draft
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = fast
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Visual
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
quality_type = fast
|
||||
intent_category = visual
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Visual
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
quality_type = high
|
||||
intent_category = visual
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = normal
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Visual
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
quality_type = normal
|
||||
intent_category = visual
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = fast
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = normal
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = fast
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = normal
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = fast
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = normal
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = fast
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = normal
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Quick
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
intent_category = quick
|
||||
quality_type = draft
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = fast
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Visual
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
quality_type = fast
|
||||
intent_category = visual
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Visual
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
quality_type = high
|
||||
intent_category = visual
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = normal
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Visual
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
quality_type = normal
|
||||
intent_category = visual
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Quick
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
intent_category = quick
|
||||
quality_type = draft
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = fast
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Visual
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
quality_type = fast
|
||||
intent_category = visual
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Visual
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
quality_type = high
|
||||
intent_category = visual
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = normal
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Visual
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
quality_type = normal
|
||||
intent_category = visual
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Quick
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
intent_category = quick
|
||||
quality_type = draft
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = fast
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Visual
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
quality_type = fast
|
||||
intent_category = visual
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Visual
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
quality_type = high
|
||||
intent_category = visual
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = normal
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Visual
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
quality_type = normal
|
||||
intent_category = visual
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = fast
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = normal
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = fast
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = normal
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = fast
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = normal
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = fast
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = normal
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Quick
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
intent_category = quick
|
||||
quality_type = draft
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = fast
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Visual
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
quality_type = fast
|
||||
intent_category = visual
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Visual
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
quality_type = high
|
||||
intent_category = visual
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 13
|
||||
setting_version = 15
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = normal
|
||||
|
|
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