mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-10 08:17:49 -06:00
Merge branch 'master' into bremco-graphics_buffer_update
This commit is contained in:
commit
a987b9972a
660 changed files with 20420 additions and 11012 deletions
|
@ -33,7 +33,7 @@ configure_file(${CMAKE_SOURCE_DIR}/com.ultimaker.cura.desktop.in ${CMAKE_BINARY_
|
||||||
configure_file(cura/CuraVersion.py.in CuraVersion.py @ONLY)
|
configure_file(cura/CuraVersion.py.in CuraVersion.py @ONLY)
|
||||||
|
|
||||||
|
|
||||||
# FIXME: The new FindPython3 finds the system's Python3.6 reather than the Python3.5 that we built for Cura's environment.
|
# FIXME: The new FindPython3 finds the system's Python3.6 rather than the Python3.5 that we built for Cura's environment.
|
||||||
# So we're using the old method here, with FindPythonInterp for now.
|
# So we're using the old method here, with FindPythonInterp for now.
|
||||||
find_package(PythonInterp 3 REQUIRED)
|
find_package(PythonInterp 3 REQUIRED)
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
include(CTest)
|
include(CTest)
|
||||||
include(CMakeParseArguments)
|
include(CMakeParseArguments)
|
||||||
|
|
||||||
# FIXME: The new FindPython3 finds the system's Python3.6 reather than the Python3.5 that we built for Cura's environment.
|
# FIXME: The new FindPython3 finds the system's Python3.6 rather than the Python3.5 that we built for Cura's environment.
|
||||||
# So we're using the old method here, with FindPythonInterp for now.
|
# So we're using the old method here, with FindPythonInterp for now.
|
||||||
find_package(PythonInterp 3 REQUIRED)
|
find_package(PythonInterp 3 REQUIRED)
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,6 @@
|
||||||
<image>https://raw.githubusercontent.com/Ultimaker/Cura/master/screenshot.png</image>
|
<image>https://raw.githubusercontent.com/Ultimaker/Cura/master/screenshot.png</image>
|
||||||
</screenshot>
|
</screenshot>
|
||||||
</screenshots>
|
</screenshots>
|
||||||
<url type="homepage">https://ultimaker.com/en/products/cura-software?utm_source=cura&utm_medium=software&utm_campaign=resources</url>
|
<url type="homepage">https://ultimaker.com/software/ultimaker-cura?utm_source=cura&utm_medium=software&utm_campaign=cura-update-linux</url>
|
||||||
<translation type="gettext">Cura</translation>
|
<translation type="gettext">Cura</translation>
|
||||||
</component>
|
</component>
|
||||||
|
|
|
@ -13,7 +13,7 @@ DEFAULT_CURA_DEBUG_MODE = False
|
||||||
# Each release has a fixed SDK version coupled with it. It doesn't make sense to make it configurable because, for
|
# Each release has a fixed SDK version coupled with it. It doesn't make sense to make it configurable because, for
|
||||||
# example Cura 3.2 with SDK version 6.1 will not work. So the SDK version is hard-coded here and left out of the
|
# example Cura 3.2 with SDK version 6.1 will not work. So the SDK version is hard-coded here and left out of the
|
||||||
# CuraVersion.py.in template.
|
# CuraVersion.py.in template.
|
||||||
CuraSDKVersion = "7.6.0"
|
CuraSDKVersion = "7.7.0"
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from cura.CuraVersion import CuraAppName # type: ignore
|
from cura.CuraVersion import CuraAppName # type: ignore
|
||||||
|
|
|
@ -35,7 +35,7 @@ class CuraActions(QObject):
|
||||||
# Starting a web browser from a signal handler connected to a menu will crash on windows.
|
# Starting a web browser from a signal handler connected to a menu will crash on windows.
|
||||||
# So instead, defer the call to the next run of the event loop, since that does work.
|
# So instead, defer the call to the next run of the event loop, since that does work.
|
||||||
# Note that weirdly enough, only signal handlers that open a web browser fail like that.
|
# Note that weirdly enough, only signal handlers that open a web browser fail like that.
|
||||||
event = CallFunctionEvent(self._openUrl, [QUrl("https://ultimaker.com/en/resources/manuals/software")], {})
|
event = CallFunctionEvent(self._openUrl, [QUrl("https://ultimaker.com/en/resources/manuals/software?utm_source=cura&utm_medium=software&utm_campaign=dropdown-documentation")], {})
|
||||||
cura.CuraApplication.CuraApplication.getInstance().functionEvent(event)
|
cura.CuraApplication.CuraApplication.getInstance().functionEvent(event)
|
||||||
|
|
||||||
@pyqtSlot()
|
@pyqtSlot()
|
||||||
|
|
|
@ -161,7 +161,7 @@ class CuraApplication(QtApplication):
|
||||||
|
|
||||||
self.default_theme = "cura-light"
|
self.default_theme = "cura-light"
|
||||||
|
|
||||||
self.change_log_url = "https://ultimaker.com/ultimaker-cura-latest-features"
|
self.change_log_url = "https://ultimaker.com/ultimaker-cura-latest-features?utm_source=cura&utm_medium=software&utm_campaign=cura-update-features"
|
||||||
|
|
||||||
self._boot_loading_time = time.time()
|
self._boot_loading_time = time.time()
|
||||||
|
|
||||||
|
@ -320,7 +320,7 @@ class CuraApplication(QtApplication):
|
||||||
super().initialize()
|
super().initialize()
|
||||||
|
|
||||||
self._preferences.addPreference("cura/single_instance", False)
|
self._preferences.addPreference("cura/single_instance", False)
|
||||||
self._use_single_instance = self._preferences.getValue("cura/single_instance")
|
self._use_single_instance = self._preferences.getValue("cura/single_instance") or self._cli_args.single_instance
|
||||||
|
|
||||||
self.__sendCommandToSingleInstance()
|
self.__sendCommandToSingleInstance()
|
||||||
self._initializeSettingDefinitions()
|
self._initializeSettingDefinitions()
|
||||||
|
@ -471,6 +471,8 @@ class CuraApplication(QtApplication):
|
||||||
("definition_changes", InstanceContainer.Version * 1000000 + self.SettingVersion): (self.ResourceTypes.DefinitionChangesContainer, "application/x-uranium-instancecontainer"),
|
("definition_changes", InstanceContainer.Version * 1000000 + self.SettingVersion): (self.ResourceTypes.DefinitionChangesContainer, "application/x-uranium-instancecontainer"),
|
||||||
("variant", InstanceContainer.Version * 1000000 + self.SettingVersion): (self.ResourceTypes.VariantInstanceContainer, "application/x-uranium-instancecontainer"),
|
("variant", InstanceContainer.Version * 1000000 + self.SettingVersion): (self.ResourceTypes.VariantInstanceContainer, "application/x-uranium-instancecontainer"),
|
||||||
("setting_visibility", SettingVisibilityPresetsModel.Version * 1000000 + self.SettingVersion): (self.ResourceTypes.SettingVisibilityPreset, "application/x-uranium-preferences"),
|
("setting_visibility", SettingVisibilityPresetsModel.Version * 1000000 + self.SettingVersion): (self.ResourceTypes.SettingVisibilityPreset, "application/x-uranium-preferences"),
|
||||||
|
("machine", 2): (Resources.DefinitionContainers, "application/x-uranium-definitioncontainer"),
|
||||||
|
("extruder", 2): (Resources.DefinitionContainers, "application/x-uranium-definitioncontainer")
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -1310,9 +1312,9 @@ class CuraApplication(QtApplication):
|
||||||
if not isinstance(node, SceneNode):
|
if not isinstance(node, SceneNode):
|
||||||
continue
|
continue
|
||||||
if not node.getMeshData() and not node.callDecoration("isGroup"):
|
if not node.getMeshData() and not node.callDecoration("isGroup"):
|
||||||
continue # Node that doesnt have a mesh and is not a group.
|
continue # Node that doesn't have a mesh and is not a group.
|
||||||
if node.getParent() and node.getParent().callDecoration("isGroup") or node.getParent().callDecoration("isSliceable"):
|
if node.getParent() and node.getParent().callDecoration("isGroup") or node.getParent().callDecoration("isSliceable"):
|
||||||
continue # Grouped nodes don't need resetting as their parent (the group) is resetted)
|
continue # Grouped nodes don't need resetting as their parent (the group) is reset)
|
||||||
if not node.isSelectable():
|
if not node.isSelectable():
|
||||||
continue # i.e. node with layer data
|
continue # i.e. node with layer data
|
||||||
if not node.callDecoration("isSliceable") and not node.callDecoration("isGroup"):
|
if not node.callDecoration("isSliceable") and not node.callDecoration("isGroup"):
|
||||||
|
@ -1330,9 +1332,9 @@ class CuraApplication(QtApplication):
|
||||||
if not isinstance(node, SceneNode):
|
if not isinstance(node, SceneNode):
|
||||||
continue
|
continue
|
||||||
if not node.getMeshData() and not node.callDecoration("isGroup"):
|
if not node.getMeshData() and not node.callDecoration("isGroup"):
|
||||||
continue # Node that doesnt have a mesh and is not a group.
|
continue # Node that doesn't have a mesh and is not a group.
|
||||||
if node.getParent() and node.getParent().callDecoration("isGroup"):
|
if node.getParent() and node.getParent().callDecoration("isGroup"):
|
||||||
continue # Grouped nodes don't need resetting as their parent (the group) is resetted)
|
continue # Grouped nodes don't need resetting as their parent (the group) is reset)
|
||||||
if not node.isSelectable():
|
if not node.isSelectable():
|
||||||
continue # i.e. node with layer data
|
continue # i.e. node with layer data
|
||||||
nodes.append(node)
|
nodes.append(node)
|
||||||
|
@ -1359,9 +1361,9 @@ class CuraApplication(QtApplication):
|
||||||
if not isinstance(node, SceneNode):
|
if not isinstance(node, SceneNode):
|
||||||
continue
|
continue
|
||||||
if not node.getMeshData() and not node.callDecoration("isGroup"):
|
if not node.getMeshData() and not node.callDecoration("isGroup"):
|
||||||
continue # Node that doesnt have a mesh and is not a group.
|
continue # Node that doesn't have a mesh and is not a group.
|
||||||
if node.getParent() and node.getParent().callDecoration("isGroup"):
|
if node.getParent() and node.getParent().callDecoration("isGroup"):
|
||||||
continue # Grouped nodes don't need resetting as their parent (the group) is resetted)
|
continue # Grouped nodes don't need resetting as their parent (the group) is reset)
|
||||||
if not node.callDecoration("isSliceable") and not node.callDecoration("isGroup"):
|
if not node.callDecoration("isSliceable") and not node.callDecoration("isGroup"):
|
||||||
continue # i.e. node with layer data
|
continue # i.e. node with layer data
|
||||||
nodes.append(node)
|
nodes.append(node)
|
||||||
|
@ -1388,7 +1390,7 @@ class CuraApplication(QtApplication):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if not node.getMeshData() and not node.callDecoration("isGroup"):
|
if not node.getMeshData() and not node.callDecoration("isGroup"):
|
||||||
continue # Node that doesnt have a mesh and is not a group.
|
continue # Node that doesn't have a mesh and is not a group.
|
||||||
|
|
||||||
parent_node = node.getParent()
|
parent_node = node.getParent()
|
||||||
if parent_node and parent_node.callDecoration("isGroup"):
|
if parent_node and parent_node.callDecoration("isGroup"):
|
||||||
|
@ -1416,11 +1418,11 @@ class CuraApplication(QtApplication):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if not node.getMeshData() and not node.callDecoration("isGroup"):
|
if not node.getMeshData() and not node.callDecoration("isGroup"):
|
||||||
continue # Node that doesnt have a mesh and is not a group.
|
continue # Node that doesn't have a mesh and is not a group.
|
||||||
|
|
||||||
parent_node = node.getParent()
|
parent_node = node.getParent()
|
||||||
if parent_node and parent_node.callDecoration("isGroup"):
|
if parent_node and parent_node.callDecoration("isGroup"):
|
||||||
continue # Grouped nodes don't need resetting as their parent (the group) is resetted)
|
continue # Grouped nodes don't need resetting as their parent (the group) is reset)
|
||||||
|
|
||||||
if not node.isSelectable():
|
if not node.isSelectable():
|
||||||
continue # i.e. node with layer data
|
continue # i.e. node with layer data
|
||||||
|
@ -2037,11 +2039,11 @@ class CuraApplication(QtApplication):
|
||||||
if not node.isEnabled():
|
if not node.isEnabled():
|
||||||
continue
|
continue
|
||||||
if (not node.getMeshData() and not node.callDecoration("getLayerData")) and not node.callDecoration("isGroup"):
|
if (not node.getMeshData() and not node.callDecoration("getLayerData")) and not node.callDecoration("isGroup"):
|
||||||
continue # Node that doesnt have a mesh and is not a group.
|
continue # Node that doesn't have a mesh and is not a group.
|
||||||
if only_selectable and not node.isSelectable():
|
if only_selectable and not node.isSelectable():
|
||||||
continue # Only remove nodes that are selectable.
|
continue # Only remove nodes that are selectable.
|
||||||
if not node.callDecoration("isSliceable") and not node.callDecoration("getLayerData") and not node.callDecoration("isGroup"):
|
if not node.callDecoration("isSliceable") and not node.callDecoration("getLayerData") and not node.callDecoration("isGroup"):
|
||||||
continue # Grouped nodes don't need resetting as their parent (the group) is resetted)
|
continue # Grouped nodes don't need resetting as their parent (the group) is reset)
|
||||||
nodes.append(node)
|
nodes.append(node)
|
||||||
if nodes:
|
if nodes:
|
||||||
from UM.Operations.GroupedOperation import GroupedOperation
|
from UM.Operations.GroupedOperation import GroupedOperation
|
||||||
|
|
|
@ -12,7 +12,7 @@ from cura.CuraApplication import CuraApplication
|
||||||
# Since Cura has a few pre-defined "space claims" for the locations of certain components, we've provided some structure
|
# Since Cura has a few pre-defined "space claims" for the locations of certain components, we've provided some structure
|
||||||
# to indicate this.
|
# to indicate this.
|
||||||
# MainComponent works in the same way the MainComponent of a stage.
|
# MainComponent works in the same way the MainComponent of a stage.
|
||||||
# the stageMenuComponent returns an item that should be used somehwere in the stage menu. It's up to the active stage
|
# the stageMenuComponent returns an item that should be used somewhere in the stage menu. It's up to the active stage
|
||||||
# to actually do something with this.
|
# to actually do something with this.
|
||||||
class CuraView(View):
|
class CuraView(View):
|
||||||
def __init__(self, parent = None, use_empty_menu_placeholder: bool = False) -> None:
|
def __init__(self, parent = None, use_empty_menu_placeholder: bool = False) -> None:
|
||||||
|
|
|
@ -67,7 +67,7 @@ class LayerPolygon:
|
||||||
self._vertex_count = self._mesh_line_count + numpy.sum(self._types[1:] == self._types[:-1])
|
self._vertex_count = self._mesh_line_count + numpy.sum(self._types[1:] == self._types[:-1])
|
||||||
|
|
||||||
# Buffering the colors shouldn't be necessary as it is not
|
# Buffering the colors shouldn't be necessary as it is not
|
||||||
# re-used and can save alot of memory usage.
|
# re-used and can save a lot of memory usage.
|
||||||
self._color_map = LayerPolygon.getColorMap()
|
self._color_map = LayerPolygon.getColorMap()
|
||||||
self._colors = self._color_map[self._types] # type: numpy.ndarray
|
self._colors = self._color_map[self._types] # type: numpy.ndarray
|
||||||
|
|
||||||
|
@ -154,7 +154,7 @@ class LayerPolygon:
|
||||||
# When the line type changes the index needs to be increased by 2.
|
# When the line type changes the index needs to be increased by 2.
|
||||||
indices[self._index_begin:self._index_end, :] += numpy.cumsum(needed_points_list[line_mesh_mask.ravel(), 0], dtype = numpy.int32).reshape((-1, 1))
|
indices[self._index_begin:self._index_end, :] += numpy.cumsum(needed_points_list[line_mesh_mask.ravel(), 0], dtype = numpy.int32).reshape((-1, 1))
|
||||||
# Each line segment goes from it's starting point p to p+1, offset by the vertex index.
|
# Each line segment goes from it's starting point p to p+1, offset by the vertex index.
|
||||||
# The -1 is to compensate for the neccecarily True value of needed_points_list[0,0] which causes an unwanted +1 in cumsum above.
|
# The -1 is to compensate for the necessarily True value of needed_points_list[0,0] which causes an unwanted +1 in cumsum above.
|
||||||
indices[self._index_begin:self._index_end, :] += numpy.array([self._vertex_begin - 1, self._vertex_begin])
|
indices[self._index_begin:self._index_end, :] += numpy.array([self._vertex_begin - 1, self._vertex_begin])
|
||||||
|
|
||||||
self._build_cache_line_mesh_mask = None
|
self._build_cache_line_mesh_mask = None
|
||||||
|
|
|
@ -97,8 +97,7 @@ class MachineErrorChecker(QObject):
|
||||||
|
|
||||||
def startErrorCheckPropertyChanged(self, key: str, property_name: str) -> None:
|
def startErrorCheckPropertyChanged(self, key: str, property_name: str) -> None:
|
||||||
"""Start the error check for property changed
|
"""Start the error check for property changed
|
||||||
|
this is separate from the startErrorCheck because it ignores a number property types
|
||||||
this is seperate from the startErrorCheck because it ignores a number property types
|
|
||||||
|
|
||||||
:param key:
|
:param key:
|
||||||
:param property_name:
|
:param property_name:
|
||||||
|
|
|
@ -33,7 +33,7 @@ class SettingVisibilityPresetsModel(QObject):
|
||||||
if basic_item is not None:
|
if basic_item is not None:
|
||||||
basic_visibile_settings = ";".join(basic_item.settings)
|
basic_visibile_settings = ";".join(basic_item.settings)
|
||||||
else:
|
else:
|
||||||
Logger.log("w", "Unable to find the basic visiblity preset.")
|
Logger.log("w", "Unable to find the basic visibility preset.")
|
||||||
basic_visibile_settings = ""
|
basic_visibile_settings = ""
|
||||||
|
|
||||||
self._preferences = preferences
|
self._preferences = preferences
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
import json
|
import json
|
||||||
import random
|
import secrets
|
||||||
from hashlib import sha512
|
from hashlib import sha512
|
||||||
from base64 import b64encode
|
from base64 import b64encode
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
@ -48,8 +48,8 @@ class AuthorizationHelpers:
|
||||||
}
|
}
|
||||||
try:
|
try:
|
||||||
return self.parseTokenResponse(requests.post(self._token_url, data = data)) # type: ignore
|
return self.parseTokenResponse(requests.post(self._token_url, data = data)) # type: ignore
|
||||||
except requests.exceptions.ConnectionError:
|
except requests.exceptions.ConnectionError as connection_error:
|
||||||
return AuthenticationResponse(success=False, err_message="Unable to connect to remote server")
|
return AuthenticationResponse(success = False, err_message = f"Unable to connect to remote server: {connection_error}")
|
||||||
|
|
||||||
def getAccessTokenUsingRefreshToken(self, refresh_token: str) -> "AuthenticationResponse":
|
def getAccessTokenUsingRefreshToken(self, refresh_token: str) -> "AuthenticationResponse":
|
||||||
"""Request the access token from the authorization server using a refresh token.
|
"""Request the access token from the authorization server using a refresh token.
|
||||||
|
@ -139,11 +139,11 @@ class AuthorizationHelpers:
|
||||||
def generateVerificationCode(code_length: int = 32) -> str:
|
def generateVerificationCode(code_length: int = 32) -> str:
|
||||||
"""Generate a verification code of arbitrary length.
|
"""Generate a verification code of arbitrary length.
|
||||||
|
|
||||||
:param code_length:: How long should the code be? This should never be lower than 16, but it's probably
|
:param code_length:: How long should the code be in bytes? This should never be lower than 16, but it's probably
|
||||||
better to leave it at 32
|
better to leave it at 32
|
||||||
"""
|
"""
|
||||||
|
|
||||||
return "".join(random.choice("0123456789ABCDEF") for i in range(code_length))
|
return secrets.token_hex(code_length)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def generateVerificationCodeChallenge(verification_code: str) -> str:
|
def generateVerificationCodeChallenge(verification_code: str) -> str:
|
||||||
|
|
|
@ -24,7 +24,7 @@ if TYPE_CHECKING:
|
||||||
from cura.OAuth2.Models import UserProfile, OAuth2Settings
|
from cura.OAuth2.Models import UserProfile, OAuth2Settings
|
||||||
from UM.Preferences import Preferences
|
from UM.Preferences import Preferences
|
||||||
|
|
||||||
MYCLOUD_LOGOFF_URL = "https://mycloud.ultimaker.com/logoff"
|
MYCLOUD_LOGOFF_URL = "https://account.ultimaker.com/logoff?utm_source=cura&utm_medium=software&utm_campaign=change-account-before-adding-printers"
|
||||||
|
|
||||||
class AuthorizationService:
|
class AuthorizationService:
|
||||||
"""The authorization service is responsible for handling the login flow, storing user credentials and providing
|
"""The authorization service is responsible for handling the login flow, storing user credentials and providing
|
||||||
|
@ -120,7 +120,7 @@ class AuthorizationService:
|
||||||
return self._auth_helpers.parseJWT(self._auth_data.access_token)
|
return self._auth_helpers.parseJWT(self._auth_data.access_token)
|
||||||
|
|
||||||
def getAccessToken(self) -> Optional[str]:
|
def getAccessToken(self) -> Optional[str]:
|
||||||
"""Get the access token as provided by the repsonse data."""
|
"""Get the access token as provided by the response data."""
|
||||||
|
|
||||||
if self._auth_data is None:
|
if self._auth_data is None:
|
||||||
Logger.log("d", "No auth data to retrieve the access_token from")
|
Logger.log("d", "No auth data to retrieve the access_token from")
|
||||||
|
@ -209,25 +209,27 @@ class AuthorizationService:
|
||||||
link to force the a browser logout from mycloud.ultimaker.com
|
link to force the a browser logout from mycloud.ultimaker.com
|
||||||
:return: The authentication URL, properly formatted and encoded
|
:return: The authentication URL, properly formatted and encoded
|
||||||
"""
|
"""
|
||||||
auth_url = "{}?{}".format(self._auth_url, urlencode(query_parameters_dict))
|
auth_url = f"{self._auth_url}?{urlencode(query_parameters_dict)}"
|
||||||
if force_browser_logout:
|
if force_browser_logout:
|
||||||
# The url after '?next=' should be urlencoded
|
connecting_char = "&" if "?" in MYCLOUD_LOGOFF_URL else "?"
|
||||||
auth_url = "{}?next={}".format(MYCLOUD_LOGOFF_URL, quote_plus(auth_url))
|
# The url after 'next=' should be urlencoded
|
||||||
|
auth_url = f"{MYCLOUD_LOGOFF_URL}{connecting_char}next={quote_plus(auth_url)}"
|
||||||
return auth_url
|
return auth_url
|
||||||
|
|
||||||
def _onAuthStateChanged(self, auth_response: AuthenticationResponse) -> None:
|
def _onAuthStateChanged(self, auth_response: AuthenticationResponse) -> None:
|
||||||
"""Callback method for the authentication flow."""
|
"""Callback method for the authentication flow."""
|
||||||
|
|
||||||
if auth_response.success:
|
if auth_response.success:
|
||||||
|
Logger.log("d", "Got callback from Authorization state. The user should now be logged in!")
|
||||||
self._storeAuthData(auth_response)
|
self._storeAuthData(auth_response)
|
||||||
self.onAuthStateChanged.emit(logged_in = True)
|
self.onAuthStateChanged.emit(logged_in = True)
|
||||||
else:
|
else:
|
||||||
|
Logger.log("d", "Got callback from Authorization state. Something went wrong: [%s]", auth_response.err_message)
|
||||||
self.onAuthenticationError.emit(logged_in = False, error_message = auth_response.err_message)
|
self.onAuthenticationError.emit(logged_in = False, error_message = auth_response.err_message)
|
||||||
self._server.stop() # Stop the web server at all times.
|
self._server.stop() # Stop the web server at all times.
|
||||||
|
|
||||||
def loadAuthDataFromPreferences(self) -> None:
|
def loadAuthDataFromPreferences(self) -> None:
|
||||||
"""Load authentication data from preferences."""
|
"""Load authentication data from preferences."""
|
||||||
|
Logger.log("d", "Attempting to load the auth data from preferences.")
|
||||||
if self._preferences is None:
|
if self._preferences is None:
|
||||||
Logger.log("e", "Unable to load authentication data, since no preference has been set!")
|
Logger.log("e", "Unable to load authentication data, since no preference has been set!")
|
||||||
return
|
return
|
||||||
|
@ -239,6 +241,7 @@ class AuthorizationService:
|
||||||
user_profile = self.getUserProfile()
|
user_profile = self.getUserProfile()
|
||||||
if user_profile is not None:
|
if user_profile is not None:
|
||||||
self.onAuthStateChanged.emit(logged_in = True)
|
self.onAuthStateChanged.emit(logged_in = True)
|
||||||
|
Logger.log("d", "Auth data was successfully loaded")
|
||||||
else:
|
else:
|
||||||
if self._unable_to_get_data_message is not None:
|
if self._unable_to_get_data_message is not None:
|
||||||
self._unable_to_get_data_message.hide()
|
self._unable_to_get_data_message.hide()
|
||||||
|
@ -247,6 +250,7 @@ class AuthorizationService:
|
||||||
"Unable to reach the Ultimaker account server."),
|
"Unable to reach the Ultimaker account server."),
|
||||||
title = i18n_catalog.i18nc("@info:title", "Warning"),
|
title = i18n_catalog.i18nc("@info:title", "Warning"),
|
||||||
message_type = Message.MessageType.ERROR)
|
message_type = Message.MessageType.ERROR)
|
||||||
|
Logger.log("w", "Unable to load auth data from preferences")
|
||||||
self._unable_to_get_data_message.show()
|
self._unable_to_get_data_message.show()
|
||||||
except (ValueError, TypeError):
|
except (ValueError, TypeError):
|
||||||
Logger.logException("w", "Could not load auth data from preferences")
|
Logger.logException("w", "Could not load auth data from preferences")
|
||||||
|
@ -264,6 +268,7 @@ class AuthorizationService:
|
||||||
self._user_profile = self.getUserProfile()
|
self._user_profile = self.getUserProfile()
|
||||||
self._preferences.setValue(self._settings.AUTH_DATA_PREFERENCE_KEY, json.dumps(auth_data.dump()))
|
self._preferences.setValue(self._settings.AUTH_DATA_PREFERENCE_KEY, json.dumps(auth_data.dump()))
|
||||||
else:
|
else:
|
||||||
|
Logger.log("d", "Clearing the user profile")
|
||||||
self._user_profile = None
|
self._user_profile = None
|
||||||
self._preferences.resetPreference(self._settings.AUTH_DATA_PREFERENCE_KEY)
|
self._preferences.resetPreference(self._settings.AUTH_DATA_PREFERENCE_KEY)
|
||||||
|
|
||||||
|
|
|
@ -14,13 +14,18 @@ if TYPE_CHECKING:
|
||||||
# Need to do some extra workarounds on windows:
|
# Need to do some extra workarounds on windows:
|
||||||
import sys
|
import sys
|
||||||
from UM.Platform import Platform
|
from UM.Platform import Platform
|
||||||
if Platform.isWindows() and hasattr(sys, "frozen"):
|
if Platform.isWindows():
|
||||||
import win32timezone
|
if hasattr(sys, "frozen"):
|
||||||
|
import win32timezone
|
||||||
from keyring.backends.Windows import WinVaultKeyring
|
from keyring.backends.Windows import WinVaultKeyring
|
||||||
keyring.set_keyring(WinVaultKeyring())
|
keyring.set_keyring(WinVaultKeyring())
|
||||||
if Platform.isOSX() and hasattr(sys, "frozen"):
|
if Platform.isOSX():
|
||||||
from keyring.backends.macOS import Keyring
|
from keyring.backends.macOS import Keyring
|
||||||
keyring.set_keyring(Keyring())
|
keyring.set_keyring(Keyring())
|
||||||
|
if Platform.isLinux():
|
||||||
|
# We do not support the keyring on Linux, so make sure no Keyring backend is loaded, even if there is a system one.
|
||||||
|
from keyring.backends.fail import Keyring as NoKeyringBackend
|
||||||
|
keyring.set_keyring(NoKeyringBackend())
|
||||||
|
|
||||||
# Even if errors happen, we don't want this stored locally:
|
# Even if errors happen, we don't want this stored locally:
|
||||||
DONT_EVER_STORE_LOCALLY: List[str] = ["refresh_token"]
|
DONT_EVER_STORE_LOCALLY: List[str] = ["refresh_token"]
|
||||||
|
@ -43,6 +48,10 @@ class KeyringAttribute:
|
||||||
self._store_secure = False
|
self._store_secure = False
|
||||||
Logger.log("i", "Access to the keyring was denied.")
|
Logger.log("i", "Access to the keyring was denied.")
|
||||||
return getattr(instance, self._name)
|
return getattr(instance, self._name)
|
||||||
|
except UnicodeDecodeError:
|
||||||
|
self._store_secure = False
|
||||||
|
Logger.log("w", "The password retrieved from the keyring cannot be used because it contains characters that cannot be decoded.")
|
||||||
|
return getattr(instance, self._name)
|
||||||
else:
|
else:
|
||||||
return getattr(instance, self._name)
|
return getattr(instance, self._name)
|
||||||
|
|
||||||
|
|
|
@ -79,7 +79,7 @@ class PickingPass(RenderPass):
|
||||||
return -1
|
return -1
|
||||||
|
|
||||||
distance = output.pixel(px, py) # distance in micron, from in r, g & b channels
|
distance = output.pixel(px, py) # distance in micron, from in r, g & b channels
|
||||||
distance = (distance & 0x00ffffff) / 1000. # drop the alpha channel and covert to mm
|
distance = (distance & 0x00ffffff) / 1000. # drop the alpha channel and convert to mm
|
||||||
return distance
|
return distance
|
||||||
|
|
||||||
def getPickedPosition(self, x: int, y: int) -> Vector:
|
def getPickedPosition(self, x: int, y: int) -> Vector:
|
||||||
|
|
|
@ -49,7 +49,7 @@ class FirmwareUpdater(QObject):
|
||||||
raise NotImplementedError("_updateFirmware needs to be implemented")
|
raise NotImplementedError("_updateFirmware needs to be implemented")
|
||||||
|
|
||||||
def _cleanupAfterUpdate(self) -> None:
|
def _cleanupAfterUpdate(self) -> None:
|
||||||
"""Cleanup after a succesful update"""
|
"""Cleanup after a successful update"""
|
||||||
|
|
||||||
# Clean up for next attempt.
|
# Clean up for next attempt.
|
||||||
self._update_firmware_thread = Thread(target=self._updateFirmware, daemon=True, name = "FirmwareUpdateThread")
|
self._update_firmware_thread = Thread(target=self._updateFirmware, daemon=True, name = "FirmwareUpdateThread")
|
||||||
|
|
|
@ -414,6 +414,6 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice):
|
||||||
|
|
||||||
@pyqtProperty(str, constant = True)
|
@pyqtProperty(str, constant = True)
|
||||||
def ipAddress(self) -> str:
|
def ipAddress(self) -> str:
|
||||||
"""IP adress of this printer"""
|
"""IP address of this printer"""
|
||||||
|
|
||||||
return self._address
|
return self._address
|
||||||
|
|
|
@ -319,7 +319,7 @@ class ContainerManager(QObject):
|
||||||
stack.qualityChanges = quality_changes
|
stack.qualityChanges = quality_changes
|
||||||
|
|
||||||
if not quality_changes or container_registry.isReadOnly(quality_changes.getId()):
|
if not quality_changes or container_registry.isReadOnly(quality_changes.getId()):
|
||||||
Logger.log("e", "Could not update quality of a nonexistant or read only quality profile in stack %s", stack.getId())
|
Logger.log("e", "Could not update quality of a nonexistent or read only quality profile in stack %s", stack.getId())
|
||||||
continue
|
continue
|
||||||
|
|
||||||
self._performMerge(quality_changes, stack.getTop())
|
self._performMerge(quality_changes, stack.getTop())
|
||||||
|
|
|
@ -32,6 +32,10 @@ from cura.Machines.ContainerTree import ContainerTree
|
||||||
from cura.ReaderWriters.ProfileReader import NoProfileException, ProfileReader
|
from cura.ReaderWriters.ProfileReader import NoProfileException, ProfileReader
|
||||||
|
|
||||||
from UM.i18n import i18nCatalog
|
from UM.i18n import i18nCatalog
|
||||||
|
from .DatabaseHandlers.IntentDatabaseHandler import IntentDatabaseHandler
|
||||||
|
from .DatabaseHandlers.QualityDatabaseHandler import QualityDatabaseHandler
|
||||||
|
from .DatabaseHandlers.VariantDatabaseHandler import VariantDatabaseHandler
|
||||||
|
|
||||||
catalog = i18nCatalog("cura")
|
catalog = i18nCatalog("cura")
|
||||||
|
|
||||||
|
|
||||||
|
@ -44,6 +48,10 @@ class CuraContainerRegistry(ContainerRegistry):
|
||||||
# is added, we check to see if an extruder stack needs to be added.
|
# is added, we check to see if an extruder stack needs to be added.
|
||||||
self.containerAdded.connect(self._onContainerAdded)
|
self.containerAdded.connect(self._onContainerAdded)
|
||||||
|
|
||||||
|
self._database_handlers["variant"] = VariantDatabaseHandler()
|
||||||
|
self._database_handlers["quality"] = QualityDatabaseHandler()
|
||||||
|
self._database_handlers["intent"] = IntentDatabaseHandler()
|
||||||
|
|
||||||
@override(ContainerRegistry)
|
@override(ContainerRegistry)
|
||||||
def addContainer(self, container: ContainerInterface) -> bool:
|
def addContainer(self, container: ContainerInterface) -> bool:
|
||||||
"""Overridden from ContainerRegistry
|
"""Overridden from ContainerRegistry
|
||||||
|
|
|
@ -66,7 +66,7 @@ class CuraStackBuilder:
|
||||||
Logger.logException("e", "Failed to create an extruder stack for position {pos}: {err}".format(pos = position, err = str(e)))
|
Logger.logException("e", "Failed to create an extruder stack for position {pos}: {err}".format(pos = position, err = str(e)))
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# If given, set the machine_extruder_count when creating the machine, or else the extruderList used bellow will
|
# If given, set the machine_extruder_count when creating the machine, or else the extruderList used below will
|
||||||
# not return the correct extruder list (since by default, the machine_extruder_count is 1) in machines with
|
# not return the correct extruder list (since by default, the machine_extruder_count is 1) in machines with
|
||||||
# settable number of extruders.
|
# settable number of extruders.
|
||||||
if machine_extruder_count and 0 <= machine_extruder_count <= len(extruder_dict):
|
if machine_extruder_count and 0 <= machine_extruder_count <= len(extruder_dict):
|
||||||
|
|
25
cura/Settings/DatabaseHandlers/IntentDatabaseHandler.py
Normal file
25
cura/Settings/DatabaseHandlers/IntentDatabaseHandler.py
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
# Copyright (c) 2021 Ultimaker B.V.
|
||||||
|
# Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
|
from UM.Settings.SQLQueryFactory import SQLQueryFactory
|
||||||
|
from UM.Settings.DatabaseContainerMetadataController import DatabaseMetadataContainerController
|
||||||
|
from UM.Settings.InstanceContainer import InstanceContainer
|
||||||
|
|
||||||
|
|
||||||
|
class IntentDatabaseHandler(DatabaseMetadataContainerController):
|
||||||
|
"""The Database handler for Intent containers"""
|
||||||
|
|
||||||
|
def __init__(self) -> None:
|
||||||
|
super().__init__(SQLQueryFactory(table = "intent",
|
||||||
|
fields = {
|
||||||
|
"id": "text",
|
||||||
|
"name": "text",
|
||||||
|
"quality_type": "text",
|
||||||
|
"intent_category": "text",
|
||||||
|
"variant": "text",
|
||||||
|
"definition": "text",
|
||||||
|
"material": "text",
|
||||||
|
"version": "text",
|
||||||
|
"setting_version": "text"
|
||||||
|
}))
|
||||||
|
self._container_type = InstanceContainer
|
38
cura/Settings/DatabaseHandlers/QualityDatabaseHandler.py
Normal file
38
cura/Settings/DatabaseHandlers/QualityDatabaseHandler.py
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
# Copyright (c) 2021 Ultimaker B.V.
|
||||||
|
# Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
|
from UM.Settings.SQLQueryFactory import SQLQueryFactory, metadata_type
|
||||||
|
from UM.Settings.DatabaseContainerMetadataController import DatabaseMetadataContainerController
|
||||||
|
from UM.Settings.InstanceContainer import InstanceContainer
|
||||||
|
|
||||||
|
|
||||||
|
class QualityDatabaseHandler(DatabaseMetadataContainerController):
|
||||||
|
"""The Database handler for Quality containers"""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__(SQLQueryFactory(table = "quality",
|
||||||
|
fields = {
|
||||||
|
"id": "text",
|
||||||
|
"name": "text",
|
||||||
|
"quality_type": "text",
|
||||||
|
"material": "text",
|
||||||
|
"variant": "text",
|
||||||
|
"global_quality": "bool",
|
||||||
|
"definition": "text",
|
||||||
|
"version": "text",
|
||||||
|
"setting_version": "text"
|
||||||
|
}))
|
||||||
|
self._container_type = InstanceContainer
|
||||||
|
|
||||||
|
def groomMetadata(self, metadata: metadata_type) -> metadata_type:
|
||||||
|
"""
|
||||||
|
Ensures that the metadata is in the order of the field keys and has the right size.
|
||||||
|
if the metadata doesn't contains a key which is stored in the DB it will add it as
|
||||||
|
an empty string. Key, value pairs that are not stored in the DB are dropped.
|
||||||
|
If the `global_quality` isn't set it well default to 'False'
|
||||||
|
|
||||||
|
:param metadata: The container metadata
|
||||||
|
"""
|
||||||
|
if "global_quality" not in metadata:
|
||||||
|
metadata["global_quality"] = "False"
|
||||||
|
return super().groomMetadata(metadata)
|
22
cura/Settings/DatabaseHandlers/VariantDatabaseHandler.py
Normal file
22
cura/Settings/DatabaseHandlers/VariantDatabaseHandler.py
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
# Copyright (c) 2021 Ultimaker B.V.
|
||||||
|
# Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
|
from UM.Settings.SQLQueryFactory import SQLQueryFactory
|
||||||
|
from UM.Settings.DatabaseContainerMetadataController import DatabaseMetadataContainerController
|
||||||
|
from UM.Settings.InstanceContainer import InstanceContainer
|
||||||
|
|
||||||
|
|
||||||
|
class VariantDatabaseHandler(DatabaseMetadataContainerController):
|
||||||
|
"""The Database handler for Variant containers"""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__(SQLQueryFactory(table = "variant",
|
||||||
|
fields = {
|
||||||
|
"id": "text",
|
||||||
|
"name": "text",
|
||||||
|
"hardware_type": "text",
|
||||||
|
"definition": "text",
|
||||||
|
"version": "text",
|
||||||
|
"setting_version": "text"
|
||||||
|
}))
|
||||||
|
self._container_type = InstanceContainer
|
0
cura/Settings/DatabaseHandlers/__init__.py
Normal file
0
cura/Settings/DatabaseHandlers/__init__.py
Normal file
|
@ -627,7 +627,7 @@ class MachineManager(QObject):
|
||||||
return ""
|
return ""
|
||||||
return global_container_stack.getIntentCategory()
|
return global_container_stack.getIntentCategory()
|
||||||
|
|
||||||
# Provies a list of extruder positions that have a different intent from the active one.
|
# Provides a list of extruder positions that have a different intent from the active one.
|
||||||
@pyqtProperty("QStringList", notify=activeIntentChanged)
|
@pyqtProperty("QStringList", notify=activeIntentChanged)
|
||||||
def extruderPositionsWithNonActiveIntent(self):
|
def extruderPositionsWithNonActiveIntent(self):
|
||||||
global_container_stack = self._application.getGlobalContainerStack()
|
global_container_stack = self._application.getGlobalContainerStack()
|
||||||
|
|
|
@ -18,6 +18,8 @@ class SingleInstance:
|
||||||
|
|
||||||
self._single_instance_server = None
|
self._single_instance_server = None
|
||||||
|
|
||||||
|
self._application.getPreferences().addPreference("cura/single_instance_clear_before_load", True)
|
||||||
|
|
||||||
# Starts a client that checks for a single instance server and sends the files that need to opened if the server
|
# Starts a client that checks for a single instance server and sends the files that need to opened if the server
|
||||||
# exists. Returns True if the single instance server is found, otherwise False.
|
# exists. Returns True if the single instance server is found, otherwise False.
|
||||||
def startClient(self) -> bool:
|
def startClient(self) -> bool:
|
||||||
|
@ -42,8 +44,9 @@ class SingleInstance:
|
||||||
# "command" field is required and holds the name of the command to execute.
|
# "command" field is required and holds the name of the command to execute.
|
||||||
# Other fields depend on the command.
|
# Other fields depend on the command.
|
||||||
|
|
||||||
payload = {"command": "clear-all"}
|
if self._application.getPreferences().getValue("cura/single_instance_clear_before_load"):
|
||||||
single_instance_socket.write(bytes(json.dumps(payload) + "\n", encoding = "ascii"))
|
payload = {"command": "clear-all"}
|
||||||
|
single_instance_socket.write(bytes(json.dumps(payload) + "\n", encoding = "ascii"))
|
||||||
|
|
||||||
payload = {"command": "focus"}
|
payload = {"command": "focus"}
|
||||||
single_instance_socket.write(bytes(json.dumps(payload) + "\n", encoding = "ascii"))
|
single_instance_socket.write(bytes(json.dumps(payload) + "\n", encoding = "ascii"))
|
||||||
|
@ -68,7 +71,7 @@ class SingleInstance:
|
||||||
Logger.log("e", "Single instance server was not created.")
|
Logger.log("e", "Single instance server was not created.")
|
||||||
|
|
||||||
def _onClientConnected(self) -> None:
|
def _onClientConnected(self) -> None:
|
||||||
Logger.log("i", "New connection recevied on our single-instance server")
|
Logger.log("i", "New connection received on our single-instance server")
|
||||||
connection = None #type: Optional[QLocalSocket]
|
connection = None #type: Optional[QLocalSocket]
|
||||||
if self._single_instance_server:
|
if self._single_instance_server:
|
||||||
connection = self._single_instance_server.nextPendingConnection()
|
connection = self._single_instance_server.nextPendingConnection()
|
||||||
|
|
|
@ -56,8 +56,8 @@ class OnExitCallbackManager:
|
||||||
self._application.callLater(self._application.closeApplication)
|
self._application.callLater(self._application.closeApplication)
|
||||||
|
|
||||||
# This is the callback function which an on-exit callback should call when it finishes, it should provide the
|
# This is the callback function which an on-exit callback should call when it finishes, it should provide the
|
||||||
# "should_proceed" flag indicating whether this check has "passed", or in other words, whether quiting the
|
# "should_proceed" flag indicating whether this check has "passed", or in other words, whether quitting the
|
||||||
# application should be blocked. If the last on-exit callback doesn't block the quiting, it will call the next
|
# application should be blocked. If the last on-exit callback doesn't block the quitting, it will call the next
|
||||||
# registered on-exit callback if available.
|
# registered on-exit callback if available.
|
||||||
def onCurrentCallbackFinished(self, should_proceed: bool = True) -> None:
|
def onCurrentCallbackFinished(self, should_proceed: bool = True) -> None:
|
||||||
if not should_proceed:
|
if not should_proceed:
|
||||||
|
|
|
@ -90,7 +90,7 @@ class ObjectsModel(ListModel):
|
||||||
|
|
||||||
parent = node.getParent()
|
parent = node.getParent()
|
||||||
if parent and parent.callDecoration("isGroup"):
|
if parent and parent.callDecoration("isGroup"):
|
||||||
return False # Grouped nodes don't need resetting as their parent (the group) is resetted)
|
return False # Grouped nodes don't need resetting as their parent (the group) is reset)
|
||||||
|
|
||||||
node_build_plate_number = node.callDecoration("getBuildPlateNumber")
|
node_build_plate_number = node.callDecoration("getBuildPlateNumber")
|
||||||
if Application.getInstance().getPreferences().getValue("view/filter_current_build_plate") and node_build_plate_number != self._build_plate_number:
|
if Application.getInstance().getPreferences().getValue("view/filter_current_build_plate") and node_build_plate_number != self._build_plate_number:
|
||||||
|
|
|
@ -50,7 +50,7 @@ do
|
||||||
echo "Found Uranium branch [${URANIUM_BRANCH}]."
|
echo "Found Uranium branch [${URANIUM_BRANCH}]."
|
||||||
break
|
break
|
||||||
else
|
else
|
||||||
echo "Could not find Uranium banch [${URANIUM_BRANCH}], try next."
|
echo "Could not find Uranium branch [${URANIUM_BRANCH}], try next."
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ The build volume draws a cube (for rectangular build plates) that represents the
|
||||||
|
|
||||||
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.
|
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.
|
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 tessellated circle, but with the same shader.
|
||||||
|
|
||||||
Disallowed areas
|
Disallowed areas
|
||||||
----
|
----
|
||||||
|
|
|
@ -159,7 +159,8 @@ class CuraEngineBackend(QObject, Backend):
|
||||||
|
|
||||||
self._slicing_error_message = Message(
|
self._slicing_error_message = Message(
|
||||||
text = catalog.i18nc("@message", "Slicing failed with an unexpected error. Please consider reporting a bug on our issue tracker."),
|
text = catalog.i18nc("@message", "Slicing failed with an unexpected error. Please consider reporting a bug on our issue tracker."),
|
||||||
title = catalog.i18nc("@message:title", "Slicing failed")
|
title = catalog.i18nc("@message:title", "Slicing failed"),
|
||||||
|
message_type = Message.MessageType.ERROR
|
||||||
)
|
)
|
||||||
self._slicing_error_message.addAction(
|
self._slicing_error_message.addAction(
|
||||||
action_id = "report_bug",
|
action_id = "report_bug",
|
||||||
|
@ -467,6 +468,7 @@ class CuraEngineBackend(QObject, Backend):
|
||||||
self._error_message.show()
|
self._error_message.show()
|
||||||
self.setState(BackendState.Error)
|
self.setState(BackendState.Error)
|
||||||
self.backendError.emit(job)
|
self.backendError.emit(job)
|
||||||
|
return
|
||||||
else:
|
else:
|
||||||
self.setState(BackendState.NotStarted)
|
self.setState(BackendState.NotStarted)
|
||||||
|
|
||||||
|
@ -645,7 +647,7 @@ class CuraEngineBackend(QObject, Backend):
|
||||||
for node in DepthFirstIterator(self._scene.getRoot()):
|
for node in DepthFirstIterator(self._scene.getRoot()):
|
||||||
if node.callDecoration("getLayerData"):
|
if node.callDecoration("getLayerData"):
|
||||||
if not build_plate_numbers or node.callDecoration("getBuildPlateNumber") in build_plate_numbers:
|
if not build_plate_numbers or node.callDecoration("getBuildPlateNumber") in build_plate_numbers:
|
||||||
# We can asume that all nodes have a parent as we're looping through the scene (and filter out root)
|
# We can assume that all nodes have a parent as we're looping through the scene (and filter out root)
|
||||||
cast(SceneNode, node.getParent()).removeChild(node)
|
cast(SceneNode, node.getParent()).removeChild(node)
|
||||||
|
|
||||||
def markSliceAll(self) -> None:
|
def markSliceAll(self) -> None:
|
||||||
|
|
|
@ -195,7 +195,7 @@ class StartSliceJob(Job):
|
||||||
# Remove old layer data.
|
# Remove old layer data.
|
||||||
for node in DepthFirstIterator(self._scene.getRoot()):
|
for node in DepthFirstIterator(self._scene.getRoot()):
|
||||||
if node.callDecoration("getLayerData") and node.callDecoration("getBuildPlateNumber") == self._build_plate_number:
|
if node.callDecoration("getLayerData") and node.callDecoration("getBuildPlateNumber") == self._build_plate_number:
|
||||||
# Singe we walk through all nodes in the scene, they always have a parent.
|
# Since we walk through all nodes in the scene, they always have a parent.
|
||||||
cast(SceneNode, node.getParent()).removeChild(node)
|
cast(SceneNode, node.getParent()).removeChild(node)
|
||||||
break
|
break
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
"name": "Ultimaker Digital Library",
|
"name": "Ultimaker Digital Library",
|
||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"description": "Connects to the Digital Library, allowing Cura to open files from and save files to the Digital Library.",
|
"description": "Connects to the Digital Library, allowing Cura to open files from and save files to the Digital Library.",
|
||||||
"version": "1.0.0",
|
"version": "1.1.0",
|
||||||
"api": 7,
|
"api": 7,
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
|
|
@ -200,7 +200,7 @@ Item
|
||||||
anchors.bottom: parent.bottom
|
anchors.bottom: parent.bottom
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
text: "Save"
|
text: "Save"
|
||||||
enabled: (asProjectCheckbox.checked || asSlicedCheckbox.checked) && dfFilenameTextfield.text.length >= 1
|
enabled: (asProjectCheckbox.checked || asSlicedCheckbox.checked) && dfFilenameTextfield.text.length >= 1 && dfFilenameTextfield.state !== 'invalid'
|
||||||
|
|
||||||
onClicked:
|
onClicked:
|
||||||
{
|
{
|
||||||
|
|
|
@ -49,11 +49,27 @@ Item
|
||||||
id: searchBar
|
id: searchBar
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
implicitHeight: createNewProjectButton.height
|
implicitHeight: createNewProjectButton.height
|
||||||
|
leftPadding: searchIcon.width + UM.Theme.getSize("default_margin").width * 2
|
||||||
|
|
||||||
onTextEdited: manager.projectFilter = text //Update the search filter when editing this text field.
|
onTextEdited: manager.projectFilter = text //Update the search filter when editing this text field.
|
||||||
|
|
||||||
leftIcon: UM.Theme.getIcon("Magnifier")
|
|
||||||
placeholderText: "Search"
|
placeholderText: "Search"
|
||||||
|
|
||||||
|
UM.RecolorImage
|
||||||
|
{
|
||||||
|
id: searchIcon
|
||||||
|
|
||||||
|
anchors
|
||||||
|
{
|
||||||
|
verticalCenter: parent.verticalCenter
|
||||||
|
left: parent.left
|
||||||
|
leftMargin: UM.Theme.getSize("default_margin").width
|
||||||
|
}
|
||||||
|
source: UM.Theme.getIcon("search")
|
||||||
|
height: UM.Theme.getSize("small_button_icon").height
|
||||||
|
width: height
|
||||||
|
color: UM.Theme.getColor("text")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Cura.SecondaryButton
|
Cura.SecondaryButton
|
||||||
|
@ -76,12 +92,11 @@ Item
|
||||||
id: upgradePlanButton
|
id: upgradePlanButton
|
||||||
|
|
||||||
text: "Upgrade plan"
|
text: "Upgrade plan"
|
||||||
iconSource: UM.Theme.getIcon("LinkExternal")
|
iconSource: UM.Theme.getIcon("external_link")
|
||||||
visible: createNewProjectButtonVisible && !manager.userAccountCanCreateNewLibraryProject && (manager.retrievingProjectsStatus == DF.RetrievalStatus.Success || manager.retrievingProjectsStatus == DF.RetrievalStatus.Failed)
|
visible: createNewProjectButtonVisible && !manager.userAccountCanCreateNewLibraryProject && (manager.retrievingProjectsStatus == DF.RetrievalStatus.Success || manager.retrievingProjectsStatus == DF.RetrievalStatus.Failed)
|
||||||
tooltip: "You have reached the maximum number of projects allowed by your subscription. Please upgrade to the Professional subscription to create more projects."
|
tooltip: "Maximum number of projects reached. Please upgrade your subscription to create more projects."
|
||||||
tooltipWidth: parent.width * 0.5
|
|
||||||
|
|
||||||
onClicked: Qt.openUrlExternally("https://ultimaker.com/software/ultimaker-essentials/sign-up-cura?utm_source=cura&utm_medium=software&utm_campaign=lib-max")
|
onClicked: Qt.openUrlExternally("https://ultimaker.com/software/enterprise-software?utm_source=cura&utm_medium=software&utm_campaign=MaxProjLink")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -124,7 +139,7 @@ Item
|
||||||
id: visitDigitalLibraryButton
|
id: visitDigitalLibraryButton
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
text: "Visit Digital Library"
|
text: "Visit Digital Library"
|
||||||
onClicked: Qt.openUrlExternally(CuraApplication.ultimakerDigitalFactoryUrl + "/app/library")
|
onClicked: Qt.openUrlExternally(CuraApplication.ultimakerDigitalFactoryUrl + "/app/library?utm_source=cura&utm_medium=software&utm_campaign=empty-library")
|
||||||
visible: searchBar.text === "" //Show the link to Digital Library when there are no projects in the user's Library.
|
visible: searchBar.text === "" //Show the link to Digital Library when there are no projects in the user's Library.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
17
plugins/DigitalLibrary/src/BackwardsCompatibleMessage.py
Normal file
17
plugins/DigitalLibrary/src/BackwardsCompatibleMessage.py
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
# Copyright (c) 2021 Ultimaker B.V.
|
||||||
|
# Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
from cura.CuraApplication import CuraApplication
|
||||||
|
from UM.Message import Message
|
||||||
|
from UM.Version import Version
|
||||||
|
|
||||||
|
|
||||||
|
def getBackwardsCompatibleMessage(text: str, title: str, message_type_str: str, lifetime: Optional[int] = 30) -> Message:
|
||||||
|
if CuraApplication.getInstance().getAPIVersion() < Version("7.7.0"):
|
||||||
|
return Message(text=text, title=title, lifetime=lifetime)
|
||||||
|
else:
|
||||||
|
message_type = Message.MessageType.NEUTRAL
|
||||||
|
if ("MessageType." + message_type_str) in [str(item) for item in Message.MessageType]:
|
||||||
|
message_type = Message.MessageType[message_type_str]
|
||||||
|
return Message(text=text, title=title, lifetime=lifetime, message_type=message_type)
|
|
@ -14,6 +14,7 @@ from UM.Logger import Logger
|
||||||
from UM.Message import Message
|
from UM.Message import Message
|
||||||
from UM.Scene.SceneNode import SceneNode
|
from UM.Scene.SceneNode import SceneNode
|
||||||
from cura.CuraApplication import CuraApplication
|
from cura.CuraApplication import CuraApplication
|
||||||
|
from .BackwardsCompatibleMessage import getBackwardsCompatibleMessage
|
||||||
from .DFLibraryFileUploadRequest import DFLibraryFileUploadRequest
|
from .DFLibraryFileUploadRequest import DFLibraryFileUploadRequest
|
||||||
from .DFLibraryFileUploadResponse import DFLibraryFileUploadResponse
|
from .DFLibraryFileUploadResponse import DFLibraryFileUploadResponse
|
||||||
from .DFPrintJobUploadRequest import DFPrintJobUploadRequest
|
from .DFPrintJobUploadRequest import DFPrintJobUploadRequest
|
||||||
|
@ -69,11 +70,11 @@ class DFFileExportAndUploadManager:
|
||||||
use_inactivity_timer = False
|
use_inactivity_timer = False
|
||||||
)
|
)
|
||||||
|
|
||||||
self._generic_success_message = Message(
|
self._generic_success_message = getBackwardsCompatibleMessage(
|
||||||
text = "Your {} uploaded to '{}'.".format("file was" if len(self._file_upload_job_metadata) <= 1 else "files were", self._library_project_name),
|
text = "Your {} uploaded to '{}'.".format("file was" if len(self._file_upload_job_metadata) <= 1 else "files were", self._library_project_name),
|
||||||
title = "Upload successful",
|
title = "Upload successful",
|
||||||
lifetime = 0,
|
lifetime = 30,
|
||||||
message_type = Message.MessageType.POSITIVE
|
message_type_str = "POSITIVE"
|
||||||
)
|
)
|
||||||
self._generic_success_message.addAction(
|
self._generic_success_message.addAction(
|
||||||
"open_df_project",
|
"open_df_project",
|
||||||
|
@ -217,11 +218,11 @@ class DFFileExportAndUploadManager:
|
||||||
# Set the progress to 100% when the upload job fails, to avoid having the progress message stuck
|
# Set the progress to 100% when the upload job fails, to avoid having the progress message stuck
|
||||||
self._file_upload_job_metadata[filename]["upload_status"] = "failed"
|
self._file_upload_job_metadata[filename]["upload_status"] = "failed"
|
||||||
self._file_upload_job_metadata[filename]["upload_progress"] = 100
|
self._file_upload_job_metadata[filename]["upload_progress"] = 100
|
||||||
self._file_upload_job_metadata[filename]["file_upload_failed_message"] = Message(
|
self._file_upload_job_metadata[filename]["file_upload_failed_message"] = getBackwardsCompatibleMessage(
|
||||||
text = "Failed to export the file '{}'. The upload process is aborted.".format(filename),
|
text = "Failed to export the file '{}'. The upload process is aborted.".format(filename),
|
||||||
title = "Export error",
|
title = "Export error",
|
||||||
lifetime = 0,
|
message_type_str = "ERROR",
|
||||||
message_type = Message.MessageType.ERROR
|
lifetime = 30
|
||||||
)
|
)
|
||||||
self._on_upload_error()
|
self._on_upload_error()
|
||||||
self._onFileUploadFinished(filename)
|
self._onFileUploadFinished(filename)
|
||||||
|
@ -240,11 +241,11 @@ class DFFileExportAndUploadManager:
|
||||||
self._file_upload_job_metadata[filename_3mf]["upload_progress"] = 100
|
self._file_upload_job_metadata[filename_3mf]["upload_progress"] = 100
|
||||||
|
|
||||||
human_readable_error = self.extractErrorTitle(reply_string)
|
human_readable_error = self.extractErrorTitle(reply_string)
|
||||||
self._file_upload_job_metadata[filename_3mf]["file_upload_failed_message"] = Message(
|
self._file_upload_job_metadata[filename_3mf]["file_upload_failed_message"] = getBackwardsCompatibleMessage(
|
||||||
text = "Failed to upload the file '{}' to '{}'. {}".format(filename_3mf, self._library_project_name, human_readable_error),
|
text = "Failed to upload the file '{}' to '{}'. {}".format(filename_3mf, self._library_project_name, human_readable_error),
|
||||||
title = "File upload error",
|
title = "File upload error",
|
||||||
lifetime = 0,
|
message_type_str = "ERROR",
|
||||||
message_type = Message.MessageType.ERROR
|
lifetime = 30
|
||||||
)
|
)
|
||||||
self._on_upload_error()
|
self._on_upload_error()
|
||||||
self._onFileUploadFinished(filename_3mf)
|
self._onFileUploadFinished(filename_3mf)
|
||||||
|
@ -263,11 +264,11 @@ class DFFileExportAndUploadManager:
|
||||||
self._file_upload_job_metadata[filename_ufp]["upload_progress"] = 100
|
self._file_upload_job_metadata[filename_ufp]["upload_progress"] = 100
|
||||||
|
|
||||||
human_readable_error = self.extractErrorTitle(reply_string)
|
human_readable_error = self.extractErrorTitle(reply_string)
|
||||||
self._file_upload_job_metadata[filename_ufp]["file_upload_failed_message"] = Message(
|
self._file_upload_job_metadata[filename_ufp]["file_upload_failed_message"] = getBackwardsCompatibleMessage(
|
||||||
title = "File upload error",
|
title = "File upload error",
|
||||||
text = "Failed to upload the file '{}' to '{}'. {}".format(filename_ufp, self._library_project_name, human_readable_error),
|
text = "Failed to upload the file '{}' to '{}'. {}".format(filename_ufp, self._library_project_name, human_readable_error),
|
||||||
lifetime = 0,
|
message_type_str = "ERROR",
|
||||||
message_type = Message.MessageType.ERROR
|
lifetime = 30
|
||||||
)
|
)
|
||||||
self._on_upload_error()
|
self._on_upload_error()
|
||||||
self._onFileUploadFinished(filename_ufp)
|
self._onFileUploadFinished(filename_ufp)
|
||||||
|
@ -300,11 +301,11 @@ class DFFileExportAndUploadManager:
|
||||||
self._file_upload_job_metadata[filename]["upload_status"] = "failed"
|
self._file_upload_job_metadata[filename]["upload_status"] = "failed"
|
||||||
self._file_upload_job_metadata[filename]["upload_progress"] = 100
|
self._file_upload_job_metadata[filename]["upload_progress"] = 100
|
||||||
human_readable_error = self.extractErrorTitle(reply_string)
|
human_readable_error = self.extractErrorTitle(reply_string)
|
||||||
self._file_upload_job_metadata[filename]["file_upload_failed_message"] = Message(
|
self._file_upload_job_metadata[filename]["file_upload_failed_message"] = getBackwardsCompatibleMessage(
|
||||||
title = "File upload error",
|
title = "File upload error",
|
||||||
text = "Failed to upload the file '{}' to '{}'. {}".format(self._file_name, self._library_project_name, human_readable_error),
|
text = "Failed to upload the file '{}' to '{}'. {}".format(self._file_name, self._library_project_name, human_readable_error),
|
||||||
lifetime = 0,
|
message_type_str = "ERROR",
|
||||||
message_type = Message.MessageType.ERROR
|
lifetime = 30
|
||||||
)
|
)
|
||||||
|
|
||||||
self._on_upload_error()
|
self._on_upload_error()
|
||||||
|
@ -319,7 +320,7 @@ class DFFileExportAndUploadManager:
|
||||||
|
|
||||||
def _onMessageActionTriggered(self, message, action):
|
def _onMessageActionTriggered(self, message, action):
|
||||||
if action == "open_df_project":
|
if action == "open_df_project":
|
||||||
project_url = "{}/app/library/project/{}?wait_for_new_files=true".format(CuraApplication.getInstance().ultimakerDigitalFactoryUrl, self._library_project_id)
|
project_url = "{}/app/library/project/{}?wait_for_new_files=true&utm_source=cura&utm_medium=software&utm_campaign=saved-library-file-message".format(CuraApplication.getInstance().ultimakerDigitalFactoryUrl, self._library_project_id)
|
||||||
QDesktopServices.openUrl(QUrl(project_url))
|
QDesktopServices.openUrl(QUrl(project_url))
|
||||||
message.hide()
|
message.hide()
|
||||||
|
|
||||||
|
@ -337,17 +338,17 @@ class DFFileExportAndUploadManager:
|
||||||
"upload_progress" : -1,
|
"upload_progress" : -1,
|
||||||
"upload_status" : "",
|
"upload_status" : "",
|
||||||
"file_upload_response": None,
|
"file_upload_response": None,
|
||||||
"file_upload_success_message": Message(
|
"file_upload_success_message": getBackwardsCompatibleMessage(
|
||||||
text = "'{}' was uploaded to '{}'.".format(filename_3mf, self._library_project_name),
|
text = "'{}' was uploaded to '{}'.".format(filename_3mf, self._library_project_name),
|
||||||
title = "Upload successful",
|
title = "Upload successful",
|
||||||
lifetime = 0,
|
message_type_str = "POSITIVE",
|
||||||
message_type = Message.MessageType.POSITIVE
|
lifetime = 30
|
||||||
),
|
),
|
||||||
"file_upload_failed_message": Message(
|
"file_upload_failed_message": getBackwardsCompatibleMessage(
|
||||||
text = "Failed to upload the file '{}' to '{}'.".format(filename_3mf, self._library_project_name),
|
text = "Failed to upload the file '{}' to '{}'.".format(filename_3mf, self._library_project_name),
|
||||||
title = "File upload error",
|
title = "File upload error",
|
||||||
lifetime = 0,
|
message_type_str = "ERROR",
|
||||||
message_type = Message.MessageType.ERROR
|
lifetime = 30
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
job_3mf = ExportFileJob(self._file_handlers["3mf"], self._nodes, self._file_name, "3mf")
|
job_3mf = ExportFileJob(self._file_handlers["3mf"], self._nodes, self._file_name, "3mf")
|
||||||
|
@ -361,17 +362,17 @@ class DFFileExportAndUploadManager:
|
||||||
"upload_progress" : -1,
|
"upload_progress" : -1,
|
||||||
"upload_status" : "",
|
"upload_status" : "",
|
||||||
"file_upload_response": None,
|
"file_upload_response": None,
|
||||||
"file_upload_success_message": Message(
|
"file_upload_success_message": getBackwardsCompatibleMessage(
|
||||||
text = "'{}' was uploaded to '{}'.".format(filename_ufp, self._library_project_name),
|
text = "'{}' was uploaded to '{}'.".format(filename_ufp, self._library_project_name),
|
||||||
title = "Upload successful",
|
title = "Upload successful",
|
||||||
lifetime = 0,
|
message_type_str = "POSITIVE",
|
||||||
message_type = Message.MessageType.POSITIVE
|
lifetime = 30,
|
||||||
),
|
),
|
||||||
"file_upload_failed_message": Message(
|
"file_upload_failed_message": getBackwardsCompatibleMessage(
|
||||||
text = "Failed to upload the file '{}' to '{}'.".format(filename_ufp, self._library_project_name),
|
text = "Failed to upload the file '{}' to '{}'.".format(filename_ufp, self._library_project_name),
|
||||||
title = "File upload error",
|
title = "File upload error",
|
||||||
lifetime = 0,
|
message_type_str = "ERROR",
|
||||||
message_type = Message.MessageType.ERROR
|
lifetime = 30
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
job_ufp = ExportFileJob(self._file_handlers["ufp"], self._nodes, self._file_name, "ufp")
|
job_ufp = ExportFileJob(self._file_handlers["ufp"], self._nodes, self._file_name, "ufp")
|
||||||
|
|
|
@ -23,6 +23,7 @@ from UM.TaskManagement.HttpRequestManager import HttpRequestManager
|
||||||
from cura.API import Account
|
from cura.API import Account
|
||||||
from cura.CuraApplication import CuraApplication
|
from cura.CuraApplication import CuraApplication
|
||||||
from cura.UltimakerCloud.UltimakerCloudScope import UltimakerCloudScope
|
from cura.UltimakerCloud.UltimakerCloudScope import UltimakerCloudScope
|
||||||
|
from .BackwardsCompatibleMessage import getBackwardsCompatibleMessage
|
||||||
from .DFFileExportAndUploadManager import DFFileExportAndUploadManager
|
from .DFFileExportAndUploadManager import DFFileExportAndUploadManager
|
||||||
from .DigitalFactoryApiClient import DigitalFactoryApiClient
|
from .DigitalFactoryApiClient import DigitalFactoryApiClient
|
||||||
from .DigitalFactoryFileModel import DigitalFactoryFileModel
|
from .DigitalFactoryFileModel import DigitalFactoryFileModel
|
||||||
|
@ -527,11 +528,11 @@ class DigitalFactoryController(QObject):
|
||||||
except IOError as ex:
|
except IOError as ex:
|
||||||
Logger.logException("e", "Can't write Digital Library file {0}/{1} download to temp-directory {2}.",
|
Logger.logException("e", "Can't write Digital Library file {0}/{1} download to temp-directory {2}.",
|
||||||
ex, project_name, file_name, temp_dir)
|
ex, project_name, file_name, temp_dir)
|
||||||
Message(
|
getBackwardsCompatibleMessage(
|
||||||
text = "Failed to write to temporary file for '{}'.".format(file_name),
|
text = "Failed to write to temporary file for '{}'.".format(file_name),
|
||||||
title = "File-system error",
|
title = "File-system error",
|
||||||
lifetime = 10,
|
message_type_str="ERROR",
|
||||||
message_type=Message.MessageType.ERROR
|
lifetime = 10
|
||||||
).show()
|
).show()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -542,11 +543,11 @@ class DigitalFactoryController(QObject):
|
||||||
f = file_name) -> None:
|
f = file_name) -> None:
|
||||||
progress_message.hide()
|
progress_message.hide()
|
||||||
Logger.error("An error {0} {1} occurred while downloading {2}/{3}".format(str(error), str(reply), p, f))
|
Logger.error("An error {0} {1} occurred while downloading {2}/{3}".format(str(error), str(reply), p, f))
|
||||||
Message(
|
getBackwardsCompatibleMessage(
|
||||||
text = "Failed Digital Library download for '{}'.".format(f),
|
text = "Failed Digital Library download for '{}'.".format(f),
|
||||||
title = "Network error {}".format(error),
|
title = "Network error {}".format(error),
|
||||||
lifetime = 10,
|
message_type_str="ERROR",
|
||||||
message_type=Message.MessageType.ERROR
|
lifetime = 10
|
||||||
).show()
|
).show()
|
||||||
|
|
||||||
download_manager = HttpRequestManager.getInstance()
|
download_manager = HttpRequestManager.getInstance()
|
||||||
|
@ -591,17 +592,19 @@ class DigitalFactoryController(QObject):
|
||||||
|
|
||||||
if filename == "":
|
if filename == "":
|
||||||
Logger.log("w", "The file name cannot be empty.")
|
Logger.log("w", "The file name cannot be empty.")
|
||||||
Message(text = "Cannot upload file with an empty name to the Digital Library",
|
getBackwardsCompatibleMessage(
|
||||||
|
text = "Cannot upload file with an empty name to the Digital Library",
|
||||||
title = "Empty file name provided",
|
title = "Empty file name provided",
|
||||||
lifetime = 0,
|
message_type_str = "ERROR",
|
||||||
message_type = Message.MessageType.ERROR).show()
|
lifetime = 0
|
||||||
|
).show()
|
||||||
return
|
return
|
||||||
|
|
||||||
self._saveFileToSelectedProjectHelper(filename, formats)
|
self._saveFileToSelectedProjectHelper(filename, formats)
|
||||||
|
|
||||||
def _saveFileToSelectedProjectHelper(self, filename: str, formats: List[str]) -> None:
|
def _saveFileToSelectedProjectHelper(self, filename: str, formats: List[str]) -> None:
|
||||||
# Indicate we have started sending a job.
|
# Indicate we have started sending a job (and propagate any user file name changes back to the open project)
|
||||||
self.uploadStarted.emit()
|
self.uploadStarted.emit(filename if "3mf" in formats else None)
|
||||||
|
|
||||||
library_project_id = self._project_model.items[self._selected_project_idx]["libraryProjectId"]
|
library_project_id = self._project_model.items[self._selected_project_idx]["libraryProjectId"]
|
||||||
library_project_name = self._project_model.items[self._selected_project_idx]["displayName"]
|
library_project_name = self._project_model.items[self._selected_project_idx]["displayName"]
|
||||||
|
|
|
@ -8,6 +8,8 @@ from UM.Logger import Logger
|
||||||
from UM.OutputDevice import OutputDeviceError
|
from UM.OutputDevice import OutputDeviceError
|
||||||
from UM.OutputDevice.ProjectOutputDevice import ProjectOutputDevice
|
from UM.OutputDevice.ProjectOutputDevice import ProjectOutputDevice
|
||||||
from UM.Scene.SceneNode import SceneNode
|
from UM.Scene.SceneNode import SceneNode
|
||||||
|
from UM.Version import Version
|
||||||
|
from cura import ApplicationMetadata
|
||||||
from cura.API import Account
|
from cura.API import Account
|
||||||
from cura.CuraApplication import CuraApplication
|
from cura.CuraApplication import CuraApplication
|
||||||
from .DigitalFactoryController import DigitalFactoryController
|
from .DigitalFactoryController import DigitalFactoryController
|
||||||
|
@ -105,8 +107,11 @@ class DigitalFactoryOutputDevice(ProjectOutputDevice):
|
||||||
self.enabled = logged_in and self._controller.userAccountHasLibraryAccess()
|
self.enabled = logged_in and self._controller.userAccountHasLibraryAccess()
|
||||||
self.enabledChanged.emit()
|
self.enabledChanged.emit()
|
||||||
|
|
||||||
def _onWriteStarted(self) -> None:
|
def _onWriteStarted(self, new_name: Optional[str] = None) -> None:
|
||||||
self._writing = True
|
self._writing = True
|
||||||
|
if new_name and Version(ApplicationMetadata.CuraSDKVersion) >= Version("7.8.0"):
|
||||||
|
# setLastOutputName is only supported in sdk version 7.8.0 and up
|
||||||
|
self.setLastOutputName(new_name)
|
||||||
self.writeStarted.emit(self)
|
self.writeStarted.emit(self)
|
||||||
|
|
||||||
def _onWriteFinished(self) -> None:
|
def _onWriteFinished(self) -> None:
|
||||||
|
|
|
@ -112,7 +112,7 @@ class FirmwareUpdateCheckerJob(Job):
|
||||||
# The first time we want to store the current version, the notification will not be shown,
|
# The first time we want to store the current version, the notification will not be shown,
|
||||||
# because the new version of Cura will be release before the firmware and we don't want to
|
# because the new version of Cura will be release before the firmware and we don't want to
|
||||||
# notify the user when no new firmware version is available.
|
# notify the user when no new firmware version is available.
|
||||||
if (checked_version != "") and (checked_version != current_version):
|
if checked_version != "" and checked_version != current_version:
|
||||||
Logger.log("i", "Showing firmware update message for new version: {version}".format(version = current_version))
|
Logger.log("i", "Showing firmware update message for new version: {version}".format(version = current_version))
|
||||||
message = FirmwareUpdateCheckerMessage(machine_id, self._machine_name, current_version,
|
message = FirmwareUpdateCheckerMessage(machine_id, self._machine_name, current_version,
|
||||||
self._lookups.getRedirectUserUrl())
|
self._lookups.getRedirectUserUrl())
|
||||||
|
|
|
@ -14,12 +14,12 @@ class FirmwareUpdateCheckerMessage(Message):
|
||||||
def __init__(self, machine_id: int, machine_name: str, latest_version: str, download_url: str) -> None:
|
def __init__(self, machine_id: int, machine_name: str, latest_version: str, download_url: str) -> None:
|
||||||
super().__init__(i18n_catalog.i18nc(
|
super().__init__(i18n_catalog.i18nc(
|
||||||
"@info Don't translate {machine_name}, since it gets replaced by a printer name!",
|
"@info Don't translate {machine_name}, since it gets replaced by a printer name!",
|
||||||
"New features or bug-fixes may be available for your {machine_name}! If not already at the latest version, "
|
"New features or bug-fixes may be available for your {machine_name}! If you haven't done so already, "
|
||||||
"it is recommended to update the firmware on your printer to version {latest_version}.").format(
|
"it is recommended to update the firmware on your printer to version {latest_version}.").format(
|
||||||
machine_name = machine_name, latest_version = latest_version),
|
machine_name = machine_name, latest_version = latest_version),
|
||||||
title = i18n_catalog.i18nc(
|
title = i18n_catalog.i18nc(
|
||||||
"@info:title The %s gets replaced with the printer name.",
|
"@info:title The %s gets replaced with the printer name.",
|
||||||
"New %s firmware available") % machine_name)
|
"New %s stable firmware available") % machine_name)
|
||||||
|
|
||||||
self._machine_id = machine_id
|
self._machine_id = machine_id
|
||||||
self._download_url = download_url
|
self._download_url = download_url
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Copyright (c) 2020 Ultimaker B.V.
|
# Copyright (c) 2021 Ultimaker B.V.
|
||||||
# Cura is released under the terms of the LGPLv3 or higher.
|
# Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
import math
|
import math
|
||||||
|
@ -153,7 +153,7 @@ class FlavorParser:
|
||||||
Af = (self._filament_diameter / 2) ** 2 * numpy.pi
|
Af = (self._filament_diameter / 2) ** 2 * numpy.pi
|
||||||
# Length of the extruded filament
|
# Length of the extruded filament
|
||||||
de = current_extrusion - previous_extrusion
|
de = current_extrusion - previous_extrusion
|
||||||
# Volumne of the extruded filament
|
# Volume of the extruded filament
|
||||||
dVe = de * Af
|
dVe = de * Af
|
||||||
# Length of the printed line
|
# Length of the printed line
|
||||||
dX = numpy.sqrt((current_point[0] - previous_point[0])**2 + (current_point[2] - previous_point[2])**2)
|
dX = numpy.sqrt((current_point[0] - previous_point[0])**2 + (current_point[2] - previous_point[2])**2)
|
||||||
|
@ -428,7 +428,7 @@ class FlavorParser:
|
||||||
|
|
||||||
G = self._getInt(line, "G")
|
G = self._getInt(line, "G")
|
||||||
if G is not None:
|
if G is not None:
|
||||||
# When find a movement, the new posistion is calculated and added to the current_path, but
|
# When find a movement, the new position is calculated and added to the current_path, but
|
||||||
# don't need to create a polygon until the end of the layer
|
# don't need to create a polygon until the end of the layer
|
||||||
current_position = self.processGCode(G, line, current_position, current_path)
|
current_position = self.processGCode(G, line, current_position, current_path)
|
||||||
continue
|
continue
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
from . import FlavorParser
|
from . import FlavorParser
|
||||||
|
|
||||||
# This parser is intented for interpret the Marlin/Sprinter Firmware flavor
|
# This parser is intended to interpret the Marlin/Sprinter Firmware flavor
|
||||||
class MarlinFlavorParser(FlavorParser.FlavorParser):
|
class MarlinFlavorParser(FlavorParser.FlavorParser):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|
|
@ -159,7 +159,7 @@ Rectangle
|
||||||
{
|
{
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
hoverEnabled: true
|
hoverEnabled: true
|
||||||
onClicked: Qt.openUrlExternally("https://ultimaker.com/en/resources/manuals/ultimaker-3d-printers")
|
onClicked: Qt.openUrlExternally("https://ultimaker.com/in/cura/troubleshooting/network?utm_source=cura&utm_medium=software&utm_campaign=monitor-not-connected")
|
||||||
onEntered: manageQueueText.font.underline = true
|
onEntered: manageQueueText.font.underline = true
|
||||||
onExited: manageQueueText.font.underline = false
|
onExited: manageQueueText.font.underline = false
|
||||||
}
|
}
|
||||||
|
|
|
@ -312,7 +312,7 @@ Item
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Specialty provider that only watches global_inherits (we cant filter on what property changed we get events
|
// Specialty provider that only watches global_inherits (we can't filter on what property changed we get events
|
||||||
// so we bypass that to make a dedicated provider).
|
// so we bypass that to make a dedicated provider).
|
||||||
UM.SettingPropertyProvider
|
UM.SettingPropertyProvider
|
||||||
{
|
{
|
||||||
|
|
|
@ -403,7 +403,7 @@ UM.Dialog
|
||||||
storeIndex: 0
|
storeIndex: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// Specialty provider that only watches global_inherits (we cant filter on what property changed we get events
|
// Specialty provider that only watches global_inherits (we can't filter on what property changed we get events
|
||||||
// so we bypass that to make a dedicated provider).
|
// so we bypass that to make a dedicated provider).
|
||||||
UM.SettingPropertyProvider
|
UM.SettingPropertyProvider
|
||||||
{
|
{
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
# V4.9.93: Minor bugfixes (input settings) / documentation
|
# V4.9.93: Minor bugfixes (input settings) / documentation
|
||||||
# V4.9.94: Bugfix Combobox-selection; remove logger
|
# V4.9.94: Bugfix Combobox-selection; remove logger
|
||||||
# V5.0: Bugfix for fall back after one layer and doubled G0 commands when using print speed tweak, Initial version for Cura 2.x
|
# V5.0: Bugfix for fall back after one layer and doubled G0 commands when using print speed tweak, Initial version for Cura 2.x
|
||||||
# V5.0.1: Bugfix for calling unknown property 'bedTemp' of previous settings storage and unkown variable 'speed'
|
# V5.0.1: Bugfix for calling unknown property 'bedTemp' of previous settings storage and unknown variable 'speed'
|
||||||
# V5.1: API Changes included for use with Cura 2.2
|
# V5.1: API Changes included for use with Cura 2.2
|
||||||
# V5.2.0: Wes Hanney. Added support for changing Retract Length and Speed. Removed layer spread option. Fixed issue of cumulative ChangeZ
|
# V5.2.0: Wes Hanney. Added support for changing Retract Length and Speed. Removed layer spread option. Fixed issue of cumulative ChangeZ
|
||||||
# mods so they can now properly be stacked on top of each other. Applied code refactoring to clean up various coding styles. Added comments.
|
# mods so they can now properly be stacked on top of each other. Applied code refactoring to clean up various coding styles. Added comments.
|
||||||
|
@ -657,7 +657,7 @@ class ChangeAtZProcessor:
|
||||||
# Indicates if the user has opted for linear move retractions or firmware retractions
|
# Indicates if the user has opted for linear move retractions or firmware retractions
|
||||||
linearRetraction = True
|
linearRetraction = True
|
||||||
|
|
||||||
# Indicates if we're targetting by layer or height value
|
# Indicates if we're targeting by layer or height value
|
||||||
targetByLayer = True
|
targetByLayer = True
|
||||||
|
|
||||||
# Indicates if we have injected our changed values for the given layer yet
|
# Indicates if we have injected our changed values for the given layer yet
|
||||||
|
@ -1079,7 +1079,7 @@ class ChangeAtZProcessor:
|
||||||
else:
|
else:
|
||||||
modified_gcode += line + "\n"
|
modified_gcode += line + "\n"
|
||||||
|
|
||||||
# if we're targetting by layer we want to add our values just after the layer label
|
# if we're targeting by layer we want to add our values just after the layer label
|
||||||
if ";LAYER:" in line:
|
if ";LAYER:" in line:
|
||||||
modified_gcode += self.getInjectCode()
|
modified_gcode += self.getInjectCode()
|
||||||
|
|
||||||
|
@ -1367,11 +1367,11 @@ class ChangeAtZProcessor:
|
||||||
# handle extruder temp changes
|
# handle extruder temp changes
|
||||||
if command.command == "M104" or command.command == "M109":
|
if command.command == "M104" or command.command == "M109":
|
||||||
|
|
||||||
# get our tempurature
|
# get our temperature
|
||||||
tempurature = command.getArgumentAsFloat("S")
|
temperature = command.getArgumentAsFloat("S")
|
||||||
|
|
||||||
# don't bother if we don't have a tempurature
|
# don't bother if we don't have a temperature
|
||||||
if tempurature is None:
|
if temperature is None:
|
||||||
return
|
return
|
||||||
|
|
||||||
# get our extruder, default to extruder one
|
# get our extruder, default to extruder one
|
||||||
|
@ -1379,10 +1379,10 @@ class ChangeAtZProcessor:
|
||||||
|
|
||||||
# set our extruder temp based on the extruder
|
# set our extruder temp based on the extruder
|
||||||
if extruder is None or extruder == 0:
|
if extruder is None or extruder == 0:
|
||||||
self.lastValues["extruderOne"] = tempurature
|
self.lastValues["extruderOne"] = temperature
|
||||||
|
|
||||||
if extruder is None or extruder == 1:
|
if extruder is None or extruder == 1:
|
||||||
self.lastValues["extruderTwo"] = tempurature
|
self.lastValues["extruderTwo"] = temperature
|
||||||
|
|
||||||
# move to the next command
|
# move to the next command
|
||||||
return
|
return
|
||||||
|
@ -1401,10 +1401,10 @@ class ChangeAtZProcessor:
|
||||||
if command.command == "M221":
|
if command.command == "M221":
|
||||||
|
|
||||||
# get our flow rate
|
# get our flow rate
|
||||||
tempurature = command.getArgumentAsFloat("S")
|
temperature = command.getArgumentAsFloat("S")
|
||||||
|
|
||||||
# don't bother if we don't have a flow rate (for some reason)
|
# don't bother if we don't have a flow rate (for some reason)
|
||||||
if tempurature is None:
|
if temperature is None:
|
||||||
return
|
return
|
||||||
|
|
||||||
# get our extruder, default to global
|
# get our extruder, default to global
|
||||||
|
@ -1412,11 +1412,11 @@ class ChangeAtZProcessor:
|
||||||
|
|
||||||
# set our extruder temp based on the extruder
|
# set our extruder temp based on the extruder
|
||||||
if extruder is None:
|
if extruder is None:
|
||||||
self.lastValues["flowrate"] = tempurature
|
self.lastValues["flowrate"] = temperature
|
||||||
elif extruder == 1:
|
elif extruder == 1:
|
||||||
self.lastValues["flowrateOne"] = tempurature
|
self.lastValues["flowrateOne"] = temperature
|
||||||
elif extruder == 1:
|
elif extruder == 1:
|
||||||
self.lastValues["flowrateTwo"] = tempurature
|
self.lastValues["flowrateTwo"] = temperature
|
||||||
|
|
||||||
# move to the next command
|
# move to the next command
|
||||||
return
|
return
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
# Description: This plugin shows custom messages about your print on the Status bar...
|
# Description: This plugin shows custom messages about your print on the Status bar...
|
||||||
# Please look at the 3 options
|
# Please look at the 3 options
|
||||||
# - Scolling (SCROLL_LONG_FILENAMES) if enabled in Marlin and you arent printing a small item select this option.
|
# - Scrolling (SCROLL_LONG_FILENAMES) if enabled in Marlin and you aren't printing a small item select this option.
|
||||||
# - Name: By default it will use the name generated by Cura (EG: TT_Test_Cube) - Type a custom name in here
|
# - Name: By default it will use the name generated by Cura (EG: TT_Test_Cube) - Type a custom name in here
|
||||||
# - Max Layer: Enabling this will show how many layers are in the entire print (EG: Layer 1 of 265!)
|
# - Max Layer: Enabling this will show how many layers are in the entire print (EG: Layer 1 of 265!)
|
||||||
|
|
||||||
|
|
|
@ -54,10 +54,10 @@ class PauseAtHeight(Script):
|
||||||
"label": "Method",
|
"label": "Method",
|
||||||
"description": "The method or gcode command to use for pausing.",
|
"description": "The method or gcode command to use for pausing.",
|
||||||
"type": "enum",
|
"type": "enum",
|
||||||
"options": {"marlin": "Marlin (M0)", "griffin": "Griffin (M0, firmware retract)", "bq": "BQ (M25)", "reprap": "RepRap (M226)", "repetier": "Repetier (@pause)"},
|
"options": {"marlin": "Marlin (M0)", "griffin": "Griffin (M0, firmware retract)", "bq": "BQ (M25)", "reprap": "RepRap (M226)", "repetier": "Repetier/OctoPrint (@pause)"},
|
||||||
"default_value": "marlin",
|
"default_value": "marlin",
|
||||||
"value": "\\\"griffin\\\" if machine_gcode_flavor==\\\"Griffin\\\" else \\\"reprap\\\" if machine_gcode_flavor==\\\"RepRap (RepRap)\\\" else \\\"repetier\\\" if machine_gcode_flavor==\\\"Repetier\\\" else \\\"bq\\\" if \\\"BQ\\\" in machine_name or \\\"Flying Bear Ghost 4S\\\" in machine_name else \\\"marlin\\\""
|
"value": "\\\"griffin\\\" if machine_gcode_flavor==\\\"Griffin\\\" else \\\"reprap\\\" if machine_gcode_flavor==\\\"RepRap (RepRap)\\\" else \\\"repetier\\\" if machine_gcode_flavor==\\\"Repetier\\\" else \\\"bq\\\" if \\\"BQ\\\" in machine_name or \\\"Flying Bear Ghost 4S\\\" in machine_name else \\\"marlin\\\""
|
||||||
},
|
},
|
||||||
"disarm_timeout":
|
"disarm_timeout":
|
||||||
{
|
{
|
||||||
"label": "Disarm timeout",
|
"label": "Disarm timeout",
|
||||||
|
@ -69,6 +69,14 @@ class PauseAtHeight(Script):
|
||||||
"maximum_value_warning": "1800",
|
"maximum_value_warning": "1800",
|
||||||
"unit": "s"
|
"unit": "s"
|
||||||
},
|
},
|
||||||
|
"head_park_enabled":
|
||||||
|
{
|
||||||
|
"label": "Park Print",
|
||||||
|
"description": "Instruct the head to move to a safe location when pausing. Leave this unchecked if your printer handles parking for you.",
|
||||||
|
"type": "bool",
|
||||||
|
"default_value": true,
|
||||||
|
"enabled": "pause_method != \\\"griffin\\\""
|
||||||
|
},
|
||||||
"head_park_x":
|
"head_park_x":
|
||||||
{
|
{
|
||||||
"label": "Park Print Head X",
|
"label": "Park Print Head X",
|
||||||
|
@ -76,7 +84,7 @@ class PauseAtHeight(Script):
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default_value": 190,
|
"default_value": 190,
|
||||||
"enabled": "pause_method != \\\"griffin\\\""
|
"enabled": "head_park_enabled and pause_method != \\\"griffin\\\""
|
||||||
},
|
},
|
||||||
"head_park_y":
|
"head_park_y":
|
||||||
{
|
{
|
||||||
|
@ -85,7 +93,7 @@ class PauseAtHeight(Script):
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default_value": 190,
|
"default_value": 190,
|
||||||
"enabled": "pause_method != \\\"griffin\\\""
|
"enabled": "head_park_enabled and pause_method != \\\"griffin\\\""
|
||||||
},
|
},
|
||||||
"head_move_z":
|
"head_move_z":
|
||||||
{
|
{
|
||||||
|
@ -94,7 +102,7 @@ class PauseAtHeight(Script):
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default_value": 15.0,
|
"default_value": 15.0,
|
||||||
"enabled": "pause_method == \\\"repetier\\\""
|
"enabled": "head_park_enabled and pause_method == \\\"repetier\\\""
|
||||||
},
|
},
|
||||||
"retraction_amount":
|
"retraction_amount":
|
||||||
{
|
{
|
||||||
|
@ -239,6 +247,7 @@ class PauseAtHeight(Script):
|
||||||
retraction_speed = self.getSettingValueByKey("retraction_speed")
|
retraction_speed = self.getSettingValueByKey("retraction_speed")
|
||||||
extrude_amount = self.getSettingValueByKey("extrude_amount")
|
extrude_amount = self.getSettingValueByKey("extrude_amount")
|
||||||
extrude_speed = self.getSettingValueByKey("extrude_speed")
|
extrude_speed = self.getSettingValueByKey("extrude_speed")
|
||||||
|
park_enabled = self.getSettingValueByKey("head_park_enabled")
|
||||||
park_x = self.getSettingValueByKey("head_park_x")
|
park_x = self.getSettingValueByKey("head_park_x")
|
||||||
park_y = self.getSettingValueByKey("head_park_y")
|
park_y = self.getSettingValueByKey("head_park_y")
|
||||||
move_z = self.getSettingValueByKey("head_move_z")
|
move_z = self.getSettingValueByKey("head_move_z")
|
||||||
|
@ -389,11 +398,12 @@ class PauseAtHeight(Script):
|
||||||
if retraction_amount != 0:
|
if retraction_amount != 0:
|
||||||
prepend_gcode += self.putValue(G = 1, E = -retraction_amount, F = 6000) + "\n"
|
prepend_gcode += self.putValue(G = 1, E = -retraction_amount, F = 6000) + "\n"
|
||||||
|
|
||||||
#Move the head away
|
if park_enabled:
|
||||||
prepend_gcode += self.putValue(G = 1, Z = current_z + 1, F = 300) + " ; move up a millimeter to get out of the way\n"
|
#Move the head away
|
||||||
prepend_gcode += self.putValue(G = 1, X = park_x, Y = park_y, F = 9000) + "\n"
|
prepend_gcode += self.putValue(G = 1, Z = current_z + 1, F = 300) + " ; move up a millimeter to get out of the way\n"
|
||||||
if current_z < move_z:
|
prepend_gcode += self.putValue(G = 1, X = park_x, Y = park_y, F = 9000) + "\n"
|
||||||
prepend_gcode += self.putValue(G = 1, Z = current_z + move_z, F = 300) + "\n"
|
if current_z < move_z:
|
||||||
|
prepend_gcode += self.putValue(G = 1, Z = current_z + move_z, F = 300) + "\n"
|
||||||
|
|
||||||
#Disable the E steppers
|
#Disable the E steppers
|
||||||
prepend_gcode += self.putValue(M = 84, E = 0) + "\n"
|
prepend_gcode += self.putValue(M = 84, E = 0) + "\n"
|
||||||
|
@ -409,14 +419,15 @@ class PauseAtHeight(Script):
|
||||||
else:
|
else:
|
||||||
prepend_gcode += self.putValue(G = 1, E = -retraction_amount, F = retraction_speed * 60) + "\n"
|
prepend_gcode += self.putValue(G = 1, E = -retraction_amount, F = retraction_speed * 60) + "\n"
|
||||||
|
|
||||||
# Move the head away
|
if park_enabled:
|
||||||
prepend_gcode += self.putValue(G = 1, Z = current_z + 1, F = 300) + " ; move up a millimeter to get out of the way\n"
|
# Move the head away
|
||||||
|
prepend_gcode += self.putValue(G = 1, Z = current_z + 1, F = 300) + " ; move up a millimeter to get out of the way\n"
|
||||||
|
|
||||||
# This line should be ok
|
# This line should be ok
|
||||||
prepend_gcode += self.putValue(G = 1, X = park_x, Y = park_y, F = 9000) + "\n"
|
prepend_gcode += self.putValue(G = 1, X = park_x, Y = park_y, F = 9000) + "\n"
|
||||||
|
|
||||||
if current_z < 15:
|
if current_z < 15:
|
||||||
prepend_gcode += self.putValue(G = 1, Z = 15, F = 300) + " ; too close to bed--move to at least 15mm\n"
|
prepend_gcode += self.putValue(G = 1, Z = 15, F = 300) + " ; too close to bed--move to at least 15mm\n"
|
||||||
|
|
||||||
if control_temperatures:
|
if control_temperatures:
|
||||||
# Set extruder standby temperature
|
# Set extruder standby temperature
|
||||||
|
@ -456,8 +467,10 @@ class PauseAtHeight(Script):
|
||||||
prepend_gcode += self.putValue(G = 1, E = -retraction_amount, F = 6000) + "\n"
|
prepend_gcode += self.putValue(G = 1, E = -retraction_amount, F = 6000) + "\n"
|
||||||
|
|
||||||
#Move the head back
|
#Move the head back
|
||||||
prepend_gcode += self.putValue(G = 1, Z = current_z, F = 300) + "\n"
|
if park_enabled:
|
||||||
prepend_gcode += self.putValue(G = 1, X = x, Y = y, F = 9000) + "\n"
|
prepend_gcode += self.putValue(G = 1, X = x, Y = y, F = 9000) + "\n"
|
||||||
|
prepend_gcode += self.putValue(G = 1, Z = current_z, F = 300) + "\n"
|
||||||
|
|
||||||
if retraction_amount != 0:
|
if retraction_amount != 0:
|
||||||
prepend_gcode += self.putValue(G = 1, E = retraction_amount, F = 6000) + "\n"
|
prepend_gcode += self.putValue(G = 1, E = retraction_amount, F = 6000) + "\n"
|
||||||
|
|
||||||
|
@ -490,10 +503,12 @@ class PauseAtHeight(Script):
|
||||||
prepend_gcode += self.putValue(G = 1, E = -retraction_amount, F = retraction_speed * 60) + "\n"
|
prepend_gcode += self.putValue(G = 1, E = -retraction_amount, F = retraction_speed * 60) + "\n"
|
||||||
|
|
||||||
# Move the head back
|
# Move the head back
|
||||||
if current_z < 15:
|
if park_enabled:
|
||||||
prepend_gcode += self.putValue(G = 1, Z = current_z + 1, F = 300) + "\n"
|
if current_z < 15:
|
||||||
prepend_gcode += self.putValue(G = 1, X = x, Y = y, F = 9000) + "\n"
|
prepend_gcode += self.putValue(G = 1, Z = current_z, F = 300) + "\n"
|
||||||
prepend_gcode += self.putValue(G = 1, Z = current_z, F = 300) + " ; move back down to resume height\n"
|
prepend_gcode += self.putValue(G = 1, X = x, Y = y, F = 9000) + "\n"
|
||||||
|
prepend_gcode += self.putValue(G = 1, Z = current_z, F = 300) + " ; move back down to resume height\n"
|
||||||
|
|
||||||
if retraction_amount != 0:
|
if retraction_amount != 0:
|
||||||
if firmware_retract: #Can't set the distance directly to what the user wants. We have to choose ourselves.
|
if firmware_retract: #Can't set the distance directly to what the user wants. We have to choose ourselves.
|
||||||
retraction_count = 1 if control_temperatures else 3 #Retract more if we don't control the temperature.
|
retraction_count = 1 if control_temperatures else 3 #Retract more if we don't control the temperature.
|
||||||
|
|
|
@ -195,7 +195,7 @@ class Stretcher:
|
||||||
i.e. it is a travel move
|
i.e. it is a travel move
|
||||||
"""
|
"""
|
||||||
if i_pos == 0:
|
if i_pos == 0:
|
||||||
return True # Begining a layer always breaks filament (for simplicity)
|
return True # Beginning a layer always breaks filament (for simplicity)
|
||||||
step = layer_steps[i_pos]
|
step = layer_steps[i_pos]
|
||||||
prev_step = layer_steps[i_pos - 1]
|
prev_step = layer_steps[i_pos - 1]
|
||||||
if step.step_e != prev_step.step_e:
|
if step.step_e != prev_step.step_e:
|
||||||
|
|
|
@ -136,7 +136,7 @@ class RemovableDriveOutputDevice(OutputDevice):
|
||||||
self._stream.close()
|
self._stream.close()
|
||||||
self._stream = None
|
self._stream = None
|
||||||
except:
|
except:
|
||||||
Logger.logException("w", "An execption occured while trying to write to removable drive.")
|
Logger.logException("w", "An exception occurred while trying to write to removable drive.")
|
||||||
message = Message(catalog.i18nc("@info:status", "Could not save to removable drive {0}: {1}").format(self.getName(),str(job.getError())),
|
message = Message(catalog.i18nc("@info:status", "Could not save to removable drive {0}: {1}").format(self.getName(),str(job.getError())),
|
||||||
title = catalog.i18nc("@info:title", "Error"),
|
title = catalog.i18nc("@info:title", "Error"),
|
||||||
message_type = Message.MessageType.ERROR)
|
message_type = Message.MessageType.ERROR)
|
||||||
|
|
|
@ -48,7 +48,7 @@ class RemovableDrivePlugin(OutputDevicePlugin):
|
||||||
result = False
|
result = False
|
||||||
|
|
||||||
if result:
|
if result:
|
||||||
Logger.log("i", "Succesfully ejected the device")
|
Logger.log("i", "Successfully ejected the device")
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def performEjectDevice(self, device):
|
def performEjectDevice(self, device):
|
||||||
|
|
|
@ -187,7 +187,7 @@ Item
|
||||||
{
|
{
|
||||||
sliderRoot.manuallyChanged = true
|
sliderRoot.manuallyChanged = true
|
||||||
|
|
||||||
// don't allow the lower handle to be heigher than the upper handle
|
// don't allow the lower handle to be higher than the upper handle
|
||||||
if (lowerHandle.y - (y + height) < sliderRoot.minimumRangeHandleSize)
|
if (lowerHandle.y - (y + height) < sliderRoot.minimumRangeHandleSize)
|
||||||
{
|
{
|
||||||
lowerHandle.y = y + height + sliderRoot.minimumRangeHandleSize
|
lowerHandle.y = y + height + sliderRoot.minimumRangeHandleSize
|
||||||
|
@ -300,7 +300,7 @@ Item
|
||||||
// don't allow the upper handle to be lower than the lower handle
|
// don't allow the upper handle to be lower than the lower handle
|
||||||
if (y - (upperHandle.y + upperHandle.height) < sliderRoot.minimumRangeHandleSize)
|
if (y - (upperHandle.y + upperHandle.height) < sliderRoot.minimumRangeHandleSize)
|
||||||
{
|
{
|
||||||
upperHandle.y = y - (upperHandle.heigth + sliderRoot.minimumRangeHandleSize)
|
upperHandle.y = y - (upperHandle.height + sliderRoot.minimumRangeHandleSize)
|
||||||
}
|
}
|
||||||
|
|
||||||
// update the range handle
|
// update the range handle
|
||||||
|
|
|
@ -59,7 +59,7 @@ UM.PointingRectangle {
|
||||||
text: sliderLabelRoot.value + startFrom // the current handle value, add 1 because layers is an array
|
text: sliderLabelRoot.value + startFrom // the current handle value, add 1 because layers is an array
|
||||||
horizontalAlignment: TextInput.AlignHCenter
|
horizontalAlignment: TextInput.AlignHCenter
|
||||||
|
|
||||||
// key bindings, work when label is currenctly focused (active handle in LayerSlider)
|
// key bindings, work when label is currently focused (active handle in LayerSlider)
|
||||||
Keys.onUpPressed: sliderLabelRoot.setValue(sliderLabelRoot.value + ((event.modifiers & Qt.ShiftModifier) ? 10 : 1))
|
Keys.onUpPressed: sliderLabelRoot.setValue(sliderLabelRoot.value + ((event.modifiers & Qt.ShiftModifier) ? 10 : 1))
|
||||||
Keys.onDownPressed: sliderLabelRoot.setValue(sliderLabelRoot.value - ((event.modifiers & Qt.ShiftModifier) ? 10 : 1))
|
Keys.onDownPressed: sliderLabelRoot.setValue(sliderLabelRoot.value - ((event.modifiers & Qt.ShiftModifier) ? 10 : 1))
|
||||||
|
|
||||||
|
|
|
@ -190,11 +190,11 @@ Item
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Scrolls trough Z layers
|
// Scrolls through Z layers
|
||||||
LayerSlider
|
LayerSlider
|
||||||
{
|
{
|
||||||
property var preferredHeight: UM.Theme.getSize("slider_layerview_size").height
|
property var preferredHeight: UM.Theme.getSize("slider_layerview_size").height
|
||||||
property double heightMargin: UM.Theme.getSize("default_margin").height * 3 // extra margin to accomodate layer number tooltips
|
property double heightMargin: UM.Theme.getSize("default_margin").height * 3 // extra margin to accommodate layer number tooltips
|
||||||
property double layerSliderSafeHeight: layerSliderSafeYMax - layerSliderSafeYMin
|
property double layerSliderSafeHeight: layerSliderSafeYMax - layerSliderSafeYMin
|
||||||
|
|
||||||
id: layerSlider
|
id: layerSlider
|
||||||
|
|
|
@ -8,7 +8,7 @@ import UM 1.1 as UM
|
||||||
|
|
||||||
Rectangle
|
Rectangle
|
||||||
{
|
{
|
||||||
color: UM.Theme.getColor("secondary")
|
color: UM.Theme.getColor("toolbox_premium_packages_background")
|
||||||
height: childrenRect.height
|
height: childrenRect.height
|
||||||
width: parent.width
|
width: parent.width
|
||||||
Column
|
Column
|
||||||
|
@ -39,7 +39,7 @@ Rectangle
|
||||||
text: catalog.i18nc("@info:tooltip", "Go to Web Marketplace")
|
text: catalog.i18nc("@info:tooltip", "Go to Web Marketplace")
|
||||||
Label
|
Label
|
||||||
{
|
{
|
||||||
text: "<a href='%2'>".arg(toolbox.getWebMarketplaceUrl("materials")) + catalog.i18nc("@label", "Search materials") + "</a>"
|
text: "<a href='%2'>".arg(toolbox.getWebMarketplaceUrl("materials") + "?utm_source=cura&utm_medium=software&utm_campaign=marketplace-search") + catalog.i18nc("@label", "Search materials") + "</a>"
|
||||||
width: contentWidth
|
width: contentWidth
|
||||||
height: contentHeight
|
height: contentHeight
|
||||||
horizontalAlignment: Text.AlignRight
|
horizontalAlignment: Text.AlignRight
|
||||||
|
|
|
@ -91,7 +91,7 @@ Item
|
||||||
verticalCenter: parent.verticalCenter
|
verticalCenter: parent.verticalCenter
|
||||||
}
|
}
|
||||||
acceptedButtons: Qt.LeftButton
|
acceptedButtons: Qt.LeftButton
|
||||||
onClicked: Qt.openUrlExternally(toolbox.getWebMarketplaceUrl("plugins"))
|
onClicked: Qt.openUrlExternally(toolbox.getWebMarketplaceUrl("plugins") + "?utm_source=cura&utm_medium=software&utm_campaign=marketplace-button")
|
||||||
UM.RecolorImage
|
UM.RecolorImage
|
||||||
{
|
{
|
||||||
id: cloudMarketplaceButton
|
id: cloudMarketplaceButton
|
||||||
|
|
|
@ -71,6 +71,7 @@ ScrollView
|
||||||
padding: UM.Theme.getSize("default_margin").width
|
padding: UM.Theme.getSize("default_margin").width
|
||||||
text: catalog.i18nc("@info", "No plugin has been installed.")
|
text: catalog.i18nc("@info", "No plugin has been installed.")
|
||||||
font: UM.Theme.getFont("medium")
|
font: UM.Theme.getFont("medium")
|
||||||
|
color: UM.Theme.getColor("lining")
|
||||||
renderType: Text.NativeRendering
|
renderType: Text.NativeRendering
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -123,6 +124,7 @@ ScrollView
|
||||||
visible: toolbox.materialsInstalledModel.count < 1
|
visible: toolbox.materialsInstalledModel.count < 1
|
||||||
padding: UM.Theme.getSize("default_margin").width
|
padding: UM.Theme.getSize("default_margin").width
|
||||||
text: catalog.i18nc("@info", "No material has been installed.")
|
text: catalog.i18nc("@info", "No material has been installed.")
|
||||||
|
color: UM.Theme.getColor("lining")
|
||||||
font: UM.Theme.getFont("medium")
|
font: UM.Theme.getFont("medium")
|
||||||
renderType: Text.NativeRendering
|
renderType: Text.NativeRendering
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,7 +37,7 @@ class CloudPackageChecker(QObject):
|
||||||
self._i18n_catalog = i18nCatalog("cura")
|
self._i18n_catalog = i18nCatalog("cura")
|
||||||
self._sdk_version = ApplicationMetadata.CuraSDKVersion
|
self._sdk_version = ApplicationMetadata.CuraSDKVersion
|
||||||
self._last_notified_packages = set() # type: Set[str]
|
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"""
|
"""Packages for which a notification has been shown. No need to bother the user twice for equal content"""
|
||||||
|
|
||||||
# This is a plugin, so most of the components required are not ready when
|
# 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.
|
# this is initialized. Therefore, we wait until the application is ready.
|
||||||
|
|
|
@ -6,7 +6,7 @@ from typing import Dict, List, Any
|
||||||
|
|
||||||
from PyQt5.QtNetwork import QNetworkReply
|
from PyQt5.QtNetwork import QNetworkReply
|
||||||
|
|
||||||
from UM import i18n_catalog
|
from UM.i18n import i18nCatalog
|
||||||
from UM.Logger import Logger
|
from UM.Logger import Logger
|
||||||
from UM.Message import Message
|
from UM.Message import Message
|
||||||
from UM.Signal import Signal
|
from UM.Signal import Signal
|
||||||
|
@ -15,6 +15,8 @@ from cura.CuraApplication import CuraApplication
|
||||||
from cura.UltimakerCloud.UltimakerCloudScope import UltimakerCloudScope
|
from cura.UltimakerCloud.UltimakerCloudScope import UltimakerCloudScope
|
||||||
from .SubscribedPackagesModel import SubscribedPackagesModel
|
from .SubscribedPackagesModel import SubscribedPackagesModel
|
||||||
|
|
||||||
|
i18n_catalog = i18nCatalog("cura")
|
||||||
|
|
||||||
|
|
||||||
class DownloadPresenter:
|
class DownloadPresenter:
|
||||||
"""Downloads a set of packages from the Ultimaker Cloud Marketplace
|
"""Downloads a set of packages from the Ultimaker Cloud Marketplace
|
||||||
|
@ -90,7 +92,7 @@ class DownloadPresenter:
|
||||||
lifetime = 0,
|
lifetime = 0,
|
||||||
use_inactivity_timer = False,
|
use_inactivity_timer = False,
|
||||||
progress = 0.0,
|
progress = 0.0,
|
||||||
title = i18n_catalog.i18nc("@info:title", "Changes detected from your Ultimaker account", ))
|
title = i18n_catalog.i18nc("@info:title", "Changes detected from your Ultimaker account"))
|
||||||
|
|
||||||
def _onFinished(self, package_id: str, reply: QNetworkReply) -> None:
|
def _onFinished(self, package_id: str, reply: QNetworkReply) -> None:
|
||||||
self._progress[package_id]["received"] = self._progress[package_id]["total"]
|
self._progress[package_id]["received"] = self._progress[package_id]["total"]
|
||||||
|
|
|
@ -58,7 +58,6 @@ class PackagesModel(ListModel):
|
||||||
items = []
|
items = []
|
||||||
|
|
||||||
if self._metadata is None:
|
if self._metadata is None:
|
||||||
Logger.logException("w", "Failed to load packages for Marketplace")
|
|
||||||
self.setItems(items)
|
self.setItems(items)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
|
@ -183,12 +183,15 @@ class Toolbox(QObject, Extension):
|
||||||
|
|
||||||
self._application.getCuraAPI().account.loginStateChanged.connect(self._restart)
|
self._application.getCuraAPI().account.loginStateChanged.connect(self._restart)
|
||||||
|
|
||||||
|
preferences = CuraApplication.getInstance().getPreferences()
|
||||||
|
|
||||||
|
preferences.addPreference("info/automatic_plugin_update_check", True)
|
||||||
|
|
||||||
# On boot we check which packages have updates.
|
# On boot we check which packages have updates.
|
||||||
if CuraApplication.getInstance().getPreferences().getValue("info/automatic_update_check") and len(installed_package_ids_with_versions) > 0:
|
if preferences.getValue("info/automatic_plugin_update_check") and len(installed_package_ids_with_versions) > 0:
|
||||||
# Request the latest and greatest!
|
# Request the latest and greatest!
|
||||||
self._makeRequestByType("updates")
|
self._makeRequestByType("updates")
|
||||||
|
|
||||||
|
|
||||||
def _fetchPackageData(self) -> None:
|
def _fetchPackageData(self) -> None:
|
||||||
self._makeRequestByType("packages")
|
self._makeRequestByType("packages")
|
||||||
self._makeRequestByType("authors")
|
self._makeRequestByType("authors")
|
||||||
|
@ -648,8 +651,11 @@ class Toolbox(QObject, Extension):
|
||||||
self.resetDownload()
|
self.resetDownload()
|
||||||
|
|
||||||
if reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) != 200:
|
if reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) != 200:
|
||||||
Logger.log("w", "Failed to download package. The following error was returned: %s",
|
try:
|
||||||
json.loads(reply.readAll().data().decode("utf-8")))
|
reply_error = json.loads(reply.readAll().data().decode("utf-8"))
|
||||||
|
except Exception as e:
|
||||||
|
reply_error = str(e)
|
||||||
|
Logger.log("w", "Failed to download package. The following error was returned: %s", reply_error)
|
||||||
return
|
return
|
||||||
# Must not delete the temporary file on Windows
|
# Must not delete the temporary file on Windows
|
||||||
self._temp_plugin_file = tempfile.NamedTemporaryFile(mode = "w+b", suffix = ".curapackage", delete = False)
|
self._temp_plugin_file = tempfile.NamedTemporaryFile(mode = "w+b", suffix = ".curapackage", delete = False)
|
||||||
|
|
|
@ -3,6 +3,6 @@
|
||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "Provides support for reading Ultimaker Format Packages.",
|
"description": "Provides support for reading Ultimaker Format Packages.",
|
||||||
"supported_sdk_versions": ["7.6.0"],
|
"supported_sdk_versions": ["7.7.0"],
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
|
@ -30,7 +30,7 @@ Button
|
||||||
horizontalCenter: parent.horizontalCenter
|
horizontalCenter: parent.horizontalCenter
|
||||||
verticalCenter: parent.verticalCenter
|
verticalCenter: parent.verticalCenter
|
||||||
}
|
}
|
||||||
color: UM.Theme.getColor("primary")
|
color: enabled ? UM.Theme.getColor("primary") : UM.Theme.getColor("main_background")
|
||||||
height: width
|
height: width
|
||||||
source: iconSource
|
source: iconSource
|
||||||
width: Math.round(parent.width / 2)
|
width: Math.round(parent.width / 2)
|
||||||
|
|
|
@ -173,7 +173,7 @@ Cura.MachineAction
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
wrapMode: Text.WordWrap
|
wrapMode: Text.WordWrap
|
||||||
renderType: Text.NativeRendering
|
renderType: Text.NativeRendering
|
||||||
text: catalog.i18nc("@label", "If your printer is not listed, read the <a href='%1'>network printing troubleshooting guide</a>").arg("https://support.ultimaker.com/hc/en-us/articles/360012795419");
|
text: catalog.i18nc("@label", "If your printer is not listed, read the <a href='%1'>network printing troubleshooting guide</a>").arg("https://ultimaker.com/en/cura/troubleshooting/network?utm_source=cura&utm_medium=software&utm_campaign=manage-network-printer");
|
||||||
onLinkActivated: Qt.openUrlExternally(link)
|
onLinkActivated: Qt.openUrlExternally(link)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -51,7 +51,7 @@ Item
|
||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
color: UM.Theme.getColor("monitor_icon_primary")
|
color: UM.Theme.getColor("monitor_icon_primary")
|
||||||
height: UM.Theme.getSize("medium_button_icon").width
|
height: UM.Theme.getSize("medium_button_icon").width
|
||||||
source: "../svg/icons/Buildplate.svg"
|
source: UM.Theme.getIcon("Buildplate")
|
||||||
width: height
|
width: height
|
||||||
visible: buildplate
|
visible: buildplate
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,6 @@ Item
|
||||||
width: 240 * screenScaleFactor // TODO: Theme!
|
width: 240 * screenScaleFactor // TODO: Theme!
|
||||||
color: UM.Theme.getColor("monitor_tooltip_text")
|
color: UM.Theme.getColor("monitor_tooltip_text")
|
||||||
font: UM.Theme.getFont("default")
|
font: UM.Theme.getFont("default")
|
||||||
renderType: Text.NativeRendering
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ Item
|
||||||
{
|
{
|
||||||
id: base
|
id: base
|
||||||
|
|
||||||
// The print job which all other information is dervied from
|
// The print job which all other information is derived from
|
||||||
property var printJob: null
|
property var printJob: null
|
||||||
|
|
||||||
width: childrenRect.width
|
width: childrenRect.width
|
||||||
|
|
|
@ -172,7 +172,7 @@ Item
|
||||||
MouseArea
|
MouseArea
|
||||||
{
|
{
|
||||||
anchors.fill: managePrinterLink
|
anchors.fill: managePrinterLink
|
||||||
onClicked: OutputDevice.openPrintJobControlPanel()
|
onClicked: OutputDevice.openPrinterControlPanel()
|
||||||
onEntered:
|
onEntered:
|
||||||
{
|
{
|
||||||
manageQueueText.font.underline = true
|
manageQueueText.font.underline = true
|
||||||
|
@ -271,8 +271,8 @@ Item
|
||||||
}
|
}
|
||||||
|
|
||||||
// For cloud printing, add this mouse area over the disabled cameraButton to indicate that it's not available
|
// For cloud printing, add this mouse area over the disabled cameraButton to indicate that it's not available
|
||||||
//Warning message is commented out because it's factually incorrect. Fix CURA-7637 to allow camera connections via cloud.
|
// Fix CURA-7637 to allow camera connections via cloud.
|
||||||
/* MouseArea
|
MouseArea
|
||||||
{
|
{
|
||||||
id: cameraDisabledButtonArea
|
id: cameraDisabledButtonArea
|
||||||
anchors.fill: cameraButton
|
anchors.fill: cameraButton
|
||||||
|
@ -282,13 +282,13 @@ Item
|
||||||
enabled: !cameraButton.enabled
|
enabled: !cameraButton.enabled
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
MonitorInfoBlurb
|
MonitorInfoBlurb
|
||||||
{
|
{
|
||||||
id: cameraDisabledInfo
|
id: cameraDisabledInfo
|
||||||
text: catalog.i18nc("@info", "The webcam is not available because you are monitoring a cloud printer.")
|
text: catalog.i18nc("@info", "Webcam feeds for cloud printers cannot be viewed from Ultimaker Cura." +
|
||||||
|
" Click \"Manage printer\" to visit Ultimaker Digital Factory and view this webcam.")
|
||||||
target: cameraButton
|
target: cameraButton
|
||||||
}*/
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Divider
|
// Divider
|
||||||
|
|
|
@ -2,7 +2,9 @@
|
||||||
// Cura is released under the terms of the LGPLv3 or higher.
|
// Cura is released under the terms of the LGPLv3 or higher.
|
||||||
import QtQuick 2.2
|
import QtQuick 2.2
|
||||||
import QtQuick.Window 2.2
|
import QtQuick.Window 2.2
|
||||||
import QtQuick.Controls 1.2
|
import QtQuick.Controls 1.1
|
||||||
|
import QtQuick.Controls 2.15 as NewControls
|
||||||
|
|
||||||
import UM 1.1 as UM
|
import UM 1.1 as UM
|
||||||
|
|
||||||
UM.Dialog {
|
UM.Dialog {
|
||||||
|
@ -82,8 +84,9 @@ UM.Dialog {
|
||||||
renderType: Text.NativeRendering;
|
renderType: Text.NativeRendering;
|
||||||
}
|
}
|
||||||
|
|
||||||
ComboBox {
|
NewControls.ComboBox {
|
||||||
id: printerComboBox;
|
id: printerComboBox;
|
||||||
|
currentIndex: 0;
|
||||||
Behavior on height { NumberAnimation { duration: 100 } }
|
Behavior on height { NumberAnimation { duration: 100 } }
|
||||||
height: 40 * screenScaleFactor;
|
height: 40 * screenScaleFactor;
|
||||||
model: ListModel {
|
model: ListModel {
|
||||||
|
|
|
@ -1,27 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<svg width="291px" height="209px" viewBox="0 0 291 209" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
||||||
<!-- Generator: Sketch 52.5 (67469) - http://www.bohemiancoding.com/sketch -->
|
|
||||||
<title>Group 2</title>
|
|
||||||
<desc>Created with Sketch.</desc>
|
|
||||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
|
||||||
<g id="CC--Cloud-connection-succes" transform="translate(-570.000000, -132.000000)">
|
|
||||||
<g id="Group-2" transform="translate(570.000000, 132.000000)">
|
|
||||||
<g id="Icon/-group-printer/-connected" fill="#08073F" fill-rule="nonzero">
|
|
||||||
<g id="printer-group">
|
|
||||||
<g id="Group-Copy" transform="translate(0.000000, 0.218255)">
|
|
||||||
<g id="UM3">
|
|
||||||
<path d="M151.645765,136.481718 C149.925833,142.069331 149,148.004918 149,154.156745 C149,157.125641 149.215633,160.044173 149.632091,162.897534 L94.5646946,162.897534 C92.6599327,163.073639 90.7551708,163.778061 89.3698894,165.010799 L88.3309283,166.067432 C87.2919673,167.828487 85.2140452,168.180697 83.1361231,168.180697 L73.7854738,168.180697 C73.2659933,168.180697 72.7465127,167.652381 72.7465127,167.124065 L72.7465127,152.918227 L19.3939394,152.918227 C17.7008177,153.074764 16.007696,153.700917 14.7763348,154.796684 L13.8528138,155.735914 C12.9292929,157.301296 11.0822511,157.614372 9.23520921,157.614372 L0.923520928,157.614372 C0.461760462,157.614372 1.42108547e-13,157.144757 1.42108547e-13,156.675142 L1.42108547e-13,9.0596475 C1.42108547e-13,8.59003299 0.461760462,8.12041848 0.923520928,8.12041848 L72.7465127,8.12041848 L72.7465127,1.05663265 C72.7465127,0.528316328 73.2659933,-2.84217094e-14 73.7854738,-2.84217094e-14 L216.815777,-2.84217094e-14 C217.335257,-2.84217094e-14 217.854738,0.528316328 217.854738,1.05663265 L217.854738,8.12041848 L289.677732,8.12041848 C290.139493,8.12041848 290.601253,8.59003299 290.601253,9.0596475 L290.601253,156.675142 C290.601253,157.144757 290.139493,157.614372 289.677732,157.614372 L281.366043,157.614372 C279.672922,157.457833 277.9798,156.831681 276.748439,155.735914 L275.824918,154.796684 C274.901397,153.231303 273.054355,152.918227 271.207313,152.918227 L268.987471,152.918227 C268.818229,144.560013 266.939851,136.621364 263.687558,129.437501 L268.590671,129.437501 C272.900435,129.437501 276.440598,125.837123 276.440598,121.454054 L276.594519,121.454054 L276.594519,24.5569264 C276.594519,22.8350065 275.209237,21.5827012 273.670035,21.5827012 L217.854738,21.5827012 L217.854738,94.8055789 C214.965144,94.3781586 212.008429,94.1567452 209,94.1567452 C206.665515,94.1567452 204.362169,94.2900687 202.097162,94.5495169 L202.097162,21.5827012 L202.097162,18.4910714 C202.097162,16.5539116 200.538721,15.145068 198.807119,15.145068 L161.616164,15.145068 L128.985089,15.145068 L91.6209717,15.145068 C89.7162098,15.145068 88.3309283,16.730017 88.3309283,18.4910714 L88.3309283,21.5827012 L88.3309283,127.50034 C88.3309283,128.164624 88.4032089,128.812928 88.5401496,129.437501 C89.4197136,133.449106 92.9667866,136.481718 97.1620971,136.481718 L128.985089,136.481718 L151.645765,136.481718 Z M72.7465127,129.437501 L72.7465127,21.5827012 L16.7772968,21.5827012 C15.0841751,21.5827012 13.8528138,22.9915447 13.8528138,24.5569264 L13.8528138,121.454054 C13.8528138,125.837123 17.3929774,129.437501 21.7027417,129.437501 L72.7465127,129.437501 Z" id="Combined-Shape"></path>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
<g id="Group-cloud" transform="translate(156.000000, 103.000000)">
|
|
||||||
<g id="Group" transform="translate(0.394933, 0.724044)">
|
|
||||||
<circle id="Oval-Copy" fill="#3282FF" cx="52.6050671" cy="52.601776" r="52.1311475"></circle>
|
|
||||||
<path d="M74.8002981,45.4035747 C74.1684054,39.8133538 69.4292101,35.538479 63.7421759,35.538479 C62.1624441,35.538479 60.8986587,35.8673156 59.6348733,36.5249886 C56.7913562,31.9212773 51.7362146,28.9617486 46.3651267,28.9617486 C37.5186289,28.9617486 30.5678092,36.1961521 30.5678092,45.4035747 C30.5678092,45.4035747 30.5678092,45.4035747 30.5678092,45.7324112 C25.1967213,46.3900842 21.0894188,51.322632 21.0894188,56.9128529 C21.0894188,63.1607468 26.1445604,68.4221311 32.147541,68.4221311 C36.8867362,68.4221311 67.533532,68.4221311 73.2205663,68.4221311 C79.2235469,68.4221311 84.2786885,63.1607468 84.2786885,56.9128529 C84.2786885,50.9937956 80.171386,46.3900842 74.8002981,45.4035747 Z" id="Path" fill="#FFFFFF"></path>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.6 KiB |
|
@ -262,7 +262,7 @@ class CloudOutputDevice(UltimakerNetworkedPrinterOutputDevice):
|
||||||
icon="",
|
icon="",
|
||||||
description=I18N_CATALOG.i18nc("@action:tooltip", "Track the print in Ultimaker Digital Factory"),
|
description=I18N_CATALOG.i18nc("@action:tooltip", "Track the print in Ultimaker Digital Factory"),
|
||||||
button_align=message.ActionButtonAlignment.ALIGN_RIGHT)
|
button_align=message.ActionButtonAlignment.ALIGN_RIGHT)
|
||||||
df_url = f"https://digitalfactory.ultimaker.com/app/jobs/{self._cluster.cluster_id}?utm_source=cura&utm_medium=software&utm_campaign=monitor-button"
|
df_url = f"https://digitalfactory.ultimaker.com/app/jobs/{self._cluster.cluster_id}?utm_source=cura&utm_medium=software&utm_campaign=message-printjob-sent"
|
||||||
message.pyQtActionTriggered.connect(lambda message, action: (QDesktopServices.openUrl(QUrl(df_url)), message.hide()))
|
message.pyQtActionTriggered.connect(lambda message, action: (QDesktopServices.openUrl(QUrl(df_url)), message.hide()))
|
||||||
|
|
||||||
message.show()
|
message.show()
|
||||||
|
@ -334,11 +334,11 @@ class CloudOutputDevice(UltimakerNetworkedPrinterOutputDevice):
|
||||||
|
|
||||||
@pyqtSlot(name="openPrintJobControlPanel")
|
@pyqtSlot(name="openPrintJobControlPanel")
|
||||||
def openPrintJobControlPanel(self) -> None:
|
def openPrintJobControlPanel(self) -> None:
|
||||||
QDesktopServices.openUrl(QUrl(self.clusterCloudUrl))
|
QDesktopServices.openUrl(QUrl(self.clusterCloudUrl + "?utm_source=cura&utm_medium=software&utm_campaign=monitor-manage-browser"))
|
||||||
|
|
||||||
@pyqtSlot(name="openPrinterControlPanel")
|
@pyqtSlot(name="openPrinterControlPanel")
|
||||||
def openPrinterControlPanel(self) -> None:
|
def openPrinterControlPanel(self) -> None:
|
||||||
QDesktopServices.openUrl(QUrl(self.clusterCloudUrl))
|
QDesktopServices.openUrl(QUrl(self.clusterCloudUrl + "?utm_source=cura&utm_medium=software&utm_campaign=monitor-manage-printer"))
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def clusterData(self) -> CloudClusterResponse:
|
def clusterData(self) -> CloudClusterResponse:
|
||||||
|
@ -357,4 +357,4 @@ class CloudOutputDevice(UltimakerNetworkedPrinterOutputDevice):
|
||||||
"""Gets the URL on which to monitor the cluster via the cloud."""
|
"""Gets the URL on which to monitor the cluster via the cloud."""
|
||||||
|
|
||||||
root_url_prefix = "-staging" if self._account.is_staging else ""
|
root_url_prefix = "-staging" if self._account.is_staging else ""
|
||||||
return "https://mycloud{}.ultimaker.com/app/jobs/{}".format(root_url_prefix, self.clusterData.cluster_id)
|
return "https://digitalfactory{}.ultimaker.com/app/jobs/{}".format(root_url_prefix, self.clusterData.cluster_id)
|
||||||
|
|
|
@ -216,11 +216,6 @@ class CloudOutputDeviceManager:
|
||||||
online_cluster_names = {c.friendly_name.lower() for c in clusters if c.is_online and not c.friendly_name is None}
|
online_cluster_names = {c.friendly_name.lower() for c in clusters if c.is_online and not c.friendly_name is None}
|
||||||
new_devices.sort(key = lambda x: ("a{}" if x.name.lower() in online_cluster_names else "b{}").format(x.name.lower()))
|
new_devices.sort(key = lambda x: ("a{}" if x.name.lower() in online_cluster_names else "b{}").format(x.name.lower()))
|
||||||
|
|
||||||
image_path = os.path.join(
|
|
||||||
CuraApplication.getInstance().getPluginRegistry().getPluginPath("UM3NetworkPrinting") or "",
|
|
||||||
"resources", "svg", "cloud-flow-completed.svg"
|
|
||||||
)
|
|
||||||
|
|
||||||
message = Message(
|
message = Message(
|
||||||
title = self.i18n_catalog.i18ncp(
|
title = self.i18n_catalog.i18ncp(
|
||||||
"info:status",
|
"info:status",
|
||||||
|
@ -230,7 +225,6 @@ class CloudOutputDeviceManager:
|
||||||
),
|
),
|
||||||
progress = 0,
|
progress = 0,
|
||||||
lifetime = 0,
|
lifetime = 0,
|
||||||
image_source = image_path,
|
|
||||||
message_type = Message.MessageType.POSITIVE
|
message_type = Message.MessageType.POSITIVE
|
||||||
)
|
)
|
||||||
message.show()
|
message.show()
|
||||||
|
@ -332,7 +326,7 @@ class CloudOutputDeviceManager:
|
||||||
|
|
||||||
message_text += self.i18n_catalog.i18nc(
|
message_text += self.i18n_catalog.i18nc(
|
||||||
"info:status",
|
"info:status",
|
||||||
"To establish a connection, please visit the {website_link}".format(website_link = "<a href='https://digitalfactory.ultimaker.com/'>{}</a>.".format(digital_factory_string))
|
"To establish a connection, please visit the {website_link}".format(website_link = "<a href='https://digitalfactory.ultimaker.com?utm_source=cura&utm_medium=software&utm_campaign=change-account-connect-printer'>{}</a>.".format(digital_factory_string))
|
||||||
)
|
)
|
||||||
self._removed_printers_message.setText(message_text)
|
self._removed_printers_message.setText(message_text)
|
||||||
self._removed_printers_message.addAction("keep_printer_configurations_action",
|
self._removed_printers_message.addAction("keep_printer_configurations_action",
|
||||||
|
@ -419,7 +413,7 @@ class CloudOutputDeviceManager:
|
||||||
machine.setMetaDataEntry("group_name", device.name)
|
machine.setMetaDataEntry("group_name", device.name)
|
||||||
machine.setMetaDataEntry("group_size", device.clusterSize)
|
machine.setMetaDataEntry("group_size", device.clusterSize)
|
||||||
digital_factory_string = self.i18n_catalog.i18nc("info:name", "Ultimaker Digital Factory")
|
digital_factory_string = self.i18n_catalog.i18nc("info:name", "Ultimaker Digital Factory")
|
||||||
digital_factory_link = "<a href='https://digitalfactory.ultimaker.com/'>{digital_factory_string}</a>".format(digital_factory_string = digital_factory_string)
|
digital_factory_link = "<a href='https://digitalfactory.ultimaker.com?utm_source=cura&utm_medium=software&utm_campaign=change-account-remove-printer'>{digital_factory_string}</a>".format(digital_factory_string = digital_factory_string)
|
||||||
removal_warning_string = self.i18n_catalog.i18nc("@message {printer_name} is replaced with the name of the printer", "{printer_name} will be removed until the next account sync.").format(printer_name = device.name) \
|
removal_warning_string = self.i18n_catalog.i18nc("@message {printer_name} is replaced with the name of the printer", "{printer_name} will be removed until the next account sync.").format(printer_name = device.name) \
|
||||||
+ "<br>" + self.i18n_catalog.i18nc("@message {printer_name} is replaced with the name of the printer", "To remove {printer_name} permanently, visit {digital_factory_link}").format(printer_name = device.name, digital_factory_link = digital_factory_link) \
|
+ "<br>" + self.i18n_catalog.i18nc("@message {printer_name} is replaced with the name of the printer", "To remove {printer_name} permanently, visit {digital_factory_link}").format(printer_name = device.name, digital_factory_link = digital_factory_link) \
|
||||||
+ "<br><br>" + self.i18n_catalog.i18nc("@message {printer_name} is replaced with the name of the printer", "Are you sure you want to remove {printer_name} temporarily?").format(printer_name = device.name)
|
+ "<br><br>" + self.i18n_catalog.i18nc("@message {printer_name} is replaced with the name of the printer", "Are you sure you want to remove {printer_name} temporarily?").format(printer_name = device.name)
|
||||||
|
|
|
@ -52,11 +52,11 @@ class AvrFirmwareUpdater(FirmwareUpdater):
|
||||||
try:
|
try:
|
||||||
programmer.programChip(hex_file)
|
programmer.programChip(hex_file)
|
||||||
except SerialException as e:
|
except SerialException as e:
|
||||||
Logger.log("e", "A serial port exception occured during firmware update: %s" % e)
|
Logger.log("e", "A serial port exception occurred during firmware update: %s" % e)
|
||||||
self._setFirmwareUpdateState(FirmwareUpdateState.io_error)
|
self._setFirmwareUpdateState(FirmwareUpdateState.io_error)
|
||||||
return
|
return
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
Logger.log("e", "An unknown exception occured during firmware update: %s" % e)
|
Logger.log("e", "An unknown exception occurred during firmware update: %s" % e)
|
||||||
self._setFirmwareUpdateState(FirmwareUpdateState.unknown_error)
|
self._setFirmwareUpdateState(FirmwareUpdateState.unknown_error)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
|
@ -311,7 +311,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
|
||||||
if line == b"":
|
if line == b"":
|
||||||
# An empty line means that the firmware is idle
|
# An empty line means that the firmware is idle
|
||||||
# Multiple empty lines probably means that the firmware and Cura are waiting
|
# Multiple empty lines probably means that the firmware and Cura are waiting
|
||||||
# for eachother due to a missed "ok", so we keep track of empty lines
|
# for each other due to a missed "ok", so we keep track of empty lines
|
||||||
self._firmware_idle_count += 1
|
self._firmware_idle_count += 1
|
||||||
else:
|
else:
|
||||||
self._firmware_idle_count = 0
|
self._firmware_idle_count = 0
|
||||||
|
|
|
@ -122,7 +122,7 @@ class VersionUpgrade42to43(VersionUpgrade):
|
||||||
# Update version number.
|
# Update version number.
|
||||||
parser["metadata"]["setting_version"] = "9"
|
parser["metadata"]["setting_version"] = "9"
|
||||||
# Handle changes for the imade3d jellybox. The machine was split up into parts (eg; a 2 fan version and a single
|
# Handle changes for the imade3d jellybox. The machine was split up into parts (eg; a 2 fan version and a single
|
||||||
# fan version. Perviously it used variants for this. The only upgrade we can do here is strip that variant.
|
# fan version. Previously it used variants for this. The only upgrade we can do here is strip that variant.
|
||||||
# This is because we only upgrade per stack (and to fully do these changes, we'd need to switch out something
|
# This is because we only upgrade per stack (and to fully do these changes, we'd need to switch out something
|
||||||
# in the global container based on changes made to the extruder stack)
|
# in the global container based on changes made to the extruder stack)
|
||||||
if parser["containers"]["6"] == "imade3d_jellybox_extruder_0":
|
if parser["containers"]["6"] == "imade3d_jellybox_extruder_0":
|
||||||
|
|
|
@ -104,6 +104,25 @@ class VersionUpgrade49to410(VersionUpgrade):
|
||||||
"g" : "D060"
|
"g" : "D060"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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"] = "17"
|
||||||
|
|
||||||
|
result = io.StringIO()
|
||||||
|
parser.write(result)
|
||||||
|
return [filename], [result.getvalue()]
|
||||||
|
|
||||||
|
|
||||||
def upgradeInstanceContainer(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
|
def upgradeInstanceContainer(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
|
||||||
"""Upgrades instance containers to have the new version number.
|
"""Upgrades instance containers to have the new version number.
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,7 @@ def getMetaData() -> Dict[str, Any]:
|
||||||
("quality_changes", 4000016): ("quality_changes", 4000017, upgrade.upgradeInstanceContainer),
|
("quality_changes", 4000016): ("quality_changes", 4000017, upgrade.upgradeInstanceContainer),
|
||||||
("quality", 4000016): ("quality", 4000017, upgrade.upgradeInstanceContainer),
|
("quality", 4000016): ("quality", 4000017, upgrade.upgradeInstanceContainer),
|
||||||
("user", 4000016): ("user", 4000017, upgrade.upgradeInstanceContainer),
|
("user", 4000016): ("user", 4000017, upgrade.upgradeInstanceContainer),
|
||||||
|
("preferences", 7000016): ("preferences", 7000017, upgrade.upgradePreferences),
|
||||||
},
|
},
|
||||||
"sources": {
|
"sources": {
|
||||||
"machine_stack": {
|
"machine_stack": {
|
||||||
|
|
|
@ -250,7 +250,7 @@ class X3DReader(MeshReader):
|
||||||
else:
|
else:
|
||||||
nr = ns = DEFAULT_SUBDIV
|
nr = ns = DEFAULT_SUBDIV
|
||||||
|
|
||||||
lau = pi / nr # Unit angle of latitude (rings) for the given tesselation
|
lau = pi / nr # Unit angle of latitude (rings) for the given tessellation
|
||||||
lou = 2 * pi / ns # Unit angle of longitude (segments)
|
lou = 2 * pi / ns # Unit angle of longitude (segments)
|
||||||
|
|
||||||
self.reserveFaceAndVertexCount(ns*(nr*2 - 2), 2 + (nr - 1)*ns)
|
self.reserveFaceAndVertexCount(ns*(nr*2 - 2), 2 + (nr - 1)*ns)
|
||||||
|
|
|
@ -3,7 +3,7 @@ any resources here, they will not be seen or upgraded by next versions of Cura.
|
||||||
|
|
||||||
If you want your (unbundled or altered) resources to work after an upgrade,
|
If you want your (unbundled or altered) resources to work after an upgrade,
|
||||||
please don't put them here, but install them either;
|
please don't put them here, but install them either;
|
||||||
- for materials: via the Marketplace (recommended if avialable),
|
- for materials: via the Marketplace (recommended if available),
|
||||||
- by dragging a `.curapackage` file onto Cura,
|
- by dragging a `.curapackage` file onto Cura,
|
||||||
- or place it in the right sub-folder in the configuration folder* for Cura.
|
- or place it in the right sub-folder in the configuration folder* for Cura.
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
"display_name": "3MF Reader",
|
"display_name": "3MF Reader",
|
||||||
"description": "Provides support for reading 3MF files.",
|
"description": "Provides support for reading 3MF files.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -23,7 +23,7 @@
|
||||||
"display_name": "3MF Writer",
|
"display_name": "3MF Writer",
|
||||||
"description": "Provides support for writing 3MF files.",
|
"description": "Provides support for writing 3MF files.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -40,7 +40,7 @@
|
||||||
"display_name": "AMF Reader",
|
"display_name": "AMF Reader",
|
||||||
"description": "Provides support for reading AMF files.",
|
"description": "Provides support for reading AMF files.",
|
||||||
"package_version": "1.0.0",
|
"package_version": "1.0.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "fieldOfView",
|
"author_id": "fieldOfView",
|
||||||
|
@ -57,7 +57,7 @@
|
||||||
"display_name": "Cura Backups",
|
"display_name": "Cura Backups",
|
||||||
"description": "Backup and restore your configuration.",
|
"description": "Backup and restore your configuration.",
|
||||||
"package_version": "1.2.0",
|
"package_version": "1.2.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -74,7 +74,7 @@
|
||||||
"display_name": "CuraEngine Backend",
|
"display_name": "CuraEngine Backend",
|
||||||
"description": "Provides the link to the CuraEngine slicing backend.",
|
"description": "Provides the link to the CuraEngine slicing backend.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -91,7 +91,7 @@
|
||||||
"display_name": "Cura Profile Reader",
|
"display_name": "Cura Profile Reader",
|
||||||
"description": "Provides support for importing Cura profiles.",
|
"description": "Provides support for importing Cura profiles.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -108,7 +108,7 @@
|
||||||
"display_name": "Cura Profile Writer",
|
"display_name": "Cura Profile Writer",
|
||||||
"description": "Provides support for exporting Cura profiles.",
|
"description": "Provides support for exporting Cura profiles.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -125,7 +125,7 @@
|
||||||
"display_name": "Ultimaker Digital Library",
|
"display_name": "Ultimaker Digital Library",
|
||||||
"description": "Connects to the Digital Library, allowing Cura to open files from and save files to the Digital Library.",
|
"description": "Connects to the Digital Library, allowing Cura to open files from and save files to the Digital Library.",
|
||||||
"package_version": "1.0.0",
|
"package_version": "1.0.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -142,7 +142,7 @@
|
||||||
"display_name": "Firmware Update Checker",
|
"display_name": "Firmware Update Checker",
|
||||||
"description": "Checks for firmware updates.",
|
"description": "Checks for firmware updates.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -159,7 +159,7 @@
|
||||||
"display_name": "Firmware Updater",
|
"display_name": "Firmware Updater",
|
||||||
"description": "Provides a machine actions for updating firmware.",
|
"description": "Provides a machine actions for updating firmware.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -176,7 +176,7 @@
|
||||||
"display_name": "Compressed G-code Reader",
|
"display_name": "Compressed G-code Reader",
|
||||||
"description": "Reads g-code from a compressed archive.",
|
"description": "Reads g-code from a compressed archive.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -193,7 +193,7 @@
|
||||||
"display_name": "Compressed G-code Writer",
|
"display_name": "Compressed G-code Writer",
|
||||||
"description": "Writes g-code to a compressed archive.",
|
"description": "Writes g-code to a compressed archive.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -210,7 +210,7 @@
|
||||||
"display_name": "G-Code Profile Reader",
|
"display_name": "G-Code Profile Reader",
|
||||||
"description": "Provides support for importing profiles from g-code files.",
|
"description": "Provides support for importing profiles from g-code files.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -227,7 +227,7 @@
|
||||||
"display_name": "G-Code Reader",
|
"display_name": "G-Code Reader",
|
||||||
"description": "Allows loading and displaying G-code files.",
|
"description": "Allows loading and displaying G-code files.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "VictorLarchenko",
|
"author_id": "VictorLarchenko",
|
||||||
|
@ -244,7 +244,7 @@
|
||||||
"display_name": "G-Code Writer",
|
"display_name": "G-Code Writer",
|
||||||
"description": "Writes g-code to a file.",
|
"description": "Writes g-code to a file.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -261,7 +261,7 @@
|
||||||
"display_name": "Image Reader",
|
"display_name": "Image Reader",
|
||||||
"description": "Enables ability to generate printable geometry from 2D image files.",
|
"description": "Enables ability to generate printable geometry from 2D image files.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -278,7 +278,7 @@
|
||||||
"display_name": "Legacy Cura Profile Reader",
|
"display_name": "Legacy Cura Profile Reader",
|
||||||
"description": "Provides support for importing profiles from legacy Cura versions.",
|
"description": "Provides support for importing profiles from legacy Cura versions.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -295,7 +295,7 @@
|
||||||
"display_name": "Machine Settings Action",
|
"display_name": "Machine Settings Action",
|
||||||
"description": "Provides a way to change machine settings (such as build volume, nozzle size, etc.).",
|
"description": "Provides a way to change machine settings (such as build volume, nozzle size, etc.).",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "fieldOfView",
|
"author_id": "fieldOfView",
|
||||||
|
@ -312,7 +312,7 @@
|
||||||
"display_name": "Model Checker",
|
"display_name": "Model Checker",
|
||||||
"description": "Checks models and print configuration for possible printing issues and give suggestions.",
|
"description": "Checks models and print configuration for possible printing issues and give suggestions.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -329,7 +329,7 @@
|
||||||
"display_name": "Monitor Stage",
|
"display_name": "Monitor Stage",
|
||||||
"description": "Provides a monitor stage in Cura.",
|
"description": "Provides a monitor stage in Cura.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -346,7 +346,7 @@
|
||||||
"display_name": "Per-Object Settings Tool",
|
"display_name": "Per-Object Settings Tool",
|
||||||
"description": "Provides the per-model settings.",
|
"description": "Provides the per-model settings.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -363,7 +363,7 @@
|
||||||
"display_name": "Post Processing",
|
"display_name": "Post Processing",
|
||||||
"description": "Extension that allows for user created scripts for post processing.",
|
"description": "Extension that allows for user created scripts for post processing.",
|
||||||
"package_version": "2.2.1",
|
"package_version": "2.2.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -380,7 +380,7 @@
|
||||||
"display_name": "Prepare Stage",
|
"display_name": "Prepare Stage",
|
||||||
"description": "Provides a prepare stage in Cura.",
|
"description": "Provides a prepare stage in Cura.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -397,7 +397,7 @@
|
||||||
"display_name": "Preview Stage",
|
"display_name": "Preview Stage",
|
||||||
"description": "Provides a preview stage in Cura.",
|
"description": "Provides a preview stage in Cura.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -414,7 +414,7 @@
|
||||||
"display_name": "Removable Drive Output Device",
|
"display_name": "Removable Drive Output Device",
|
||||||
"description": "Provides removable drive hotplugging and writing support.",
|
"description": "Provides removable drive hotplugging and writing support.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -431,7 +431,7 @@
|
||||||
"display_name": "Sentry Logger",
|
"display_name": "Sentry Logger",
|
||||||
"description": "Logs certain events so that they can be used by the crash reporter",
|
"description": "Logs certain events so that they can be used by the crash reporter",
|
||||||
"package_version": "1.0.0",
|
"package_version": "1.0.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -448,7 +448,7 @@
|
||||||
"display_name": "Simulation View",
|
"display_name": "Simulation View",
|
||||||
"description": "Provides the Simulation view.",
|
"description": "Provides the Simulation view.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -465,7 +465,7 @@
|
||||||
"display_name": "Slice Info",
|
"display_name": "Slice Info",
|
||||||
"description": "Submits anonymous slice info. Can be disabled through preferences.",
|
"description": "Submits anonymous slice info. Can be disabled through preferences.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -482,7 +482,7 @@
|
||||||
"display_name": "Solid View",
|
"display_name": "Solid View",
|
||||||
"description": "Provides a normal solid mesh view.",
|
"description": "Provides a normal solid mesh view.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -499,7 +499,7 @@
|
||||||
"display_name": "Support Eraser Tool",
|
"display_name": "Support Eraser Tool",
|
||||||
"description": "Creates an eraser mesh to block the printing of support in certain places.",
|
"description": "Creates an eraser mesh to block the printing of support in certain places.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -516,7 +516,7 @@
|
||||||
"display_name": "Trimesh Reader",
|
"display_name": "Trimesh Reader",
|
||||||
"description": "Provides support for reading model files.",
|
"description": "Provides support for reading model files.",
|
||||||
"package_version": "1.0.0",
|
"package_version": "1.0.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -533,7 +533,7 @@
|
||||||
"display_name": "Toolbox",
|
"display_name": "Toolbox",
|
||||||
"description": "Find, manage and install new Cura packages.",
|
"description": "Find, manage and install new Cura packages.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -550,7 +550,7 @@
|
||||||
"display_name": "UFP Reader",
|
"display_name": "UFP Reader",
|
||||||
"description": "Provides support for reading Ultimaker Format Packages.",
|
"description": "Provides support for reading Ultimaker Format Packages.",
|
||||||
"package_version": "1.0.0",
|
"package_version": "1.0.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -567,7 +567,7 @@
|
||||||
"display_name": "UFP Writer",
|
"display_name": "UFP Writer",
|
||||||
"description": "Provides support for writing Ultimaker Format Packages.",
|
"description": "Provides support for writing Ultimaker Format Packages.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -584,7 +584,7 @@
|
||||||
"display_name": "Ultimaker Machine Actions",
|
"display_name": "Ultimaker Machine Actions",
|
||||||
"description": "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc.).",
|
"description": "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc.).",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -601,7 +601,7 @@
|
||||||
"display_name": "UM3 Network Printing",
|
"display_name": "UM3 Network Printing",
|
||||||
"description": "Manages network connections to Ultimaker 3 printers.",
|
"description": "Manages network connections to Ultimaker 3 printers.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -618,7 +618,7 @@
|
||||||
"display_name": "USB Printing",
|
"display_name": "USB Printing",
|
||||||
"description": "Accepts G-Code and sends them to a printer. Plugin can also update firmware.",
|
"description": "Accepts G-Code and sends them to a printer. Plugin can also update firmware.",
|
||||||
"package_version": "1.0.2",
|
"package_version": "1.0.2",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -635,7 +635,7 @@
|
||||||
"display_name": "Version Upgrade 2.1 to 2.2",
|
"display_name": "Version Upgrade 2.1 to 2.2",
|
||||||
"description": "Upgrades configurations from Cura 2.1 to Cura 2.2.",
|
"description": "Upgrades configurations from Cura 2.1 to Cura 2.2.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -652,7 +652,7 @@
|
||||||
"display_name": "Version Upgrade 2.2 to 2.4",
|
"display_name": "Version Upgrade 2.2 to 2.4",
|
||||||
"description": "Upgrades configurations from Cura 2.2 to Cura 2.4.",
|
"description": "Upgrades configurations from Cura 2.2 to Cura 2.4.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -669,7 +669,7 @@
|
||||||
"display_name": "Version Upgrade 2.5 to 2.6",
|
"display_name": "Version Upgrade 2.5 to 2.6",
|
||||||
"description": "Upgrades configurations from Cura 2.5 to Cura 2.6.",
|
"description": "Upgrades configurations from Cura 2.5 to Cura 2.6.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -686,7 +686,7 @@
|
||||||
"display_name": "Version Upgrade 2.6 to 2.7",
|
"display_name": "Version Upgrade 2.6 to 2.7",
|
||||||
"description": "Upgrades configurations from Cura 2.6 to Cura 2.7.",
|
"description": "Upgrades configurations from Cura 2.6 to Cura 2.7.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -703,7 +703,7 @@
|
||||||
"display_name": "Version Upgrade 2.7 to 3.0",
|
"display_name": "Version Upgrade 2.7 to 3.0",
|
||||||
"description": "Upgrades configurations from Cura 2.7 to Cura 3.0.",
|
"description": "Upgrades configurations from Cura 2.7 to Cura 3.0.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -720,7 +720,7 @@
|
||||||
"display_name": "Version Upgrade 3.0 to 3.1",
|
"display_name": "Version Upgrade 3.0 to 3.1",
|
||||||
"description": "Upgrades configurations from Cura 3.0 to Cura 3.1.",
|
"description": "Upgrades configurations from Cura 3.0 to Cura 3.1.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -737,7 +737,7 @@
|
||||||
"display_name": "Version Upgrade 3.2 to 3.3",
|
"display_name": "Version Upgrade 3.2 to 3.3",
|
||||||
"description": "Upgrades configurations from Cura 3.2 to Cura 3.3.",
|
"description": "Upgrades configurations from Cura 3.2 to Cura 3.3.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -754,7 +754,7 @@
|
||||||
"display_name": "Version Upgrade 3.3 to 3.4",
|
"display_name": "Version Upgrade 3.3 to 3.4",
|
||||||
"description": "Upgrades configurations from Cura 3.3 to Cura 3.4.",
|
"description": "Upgrades configurations from Cura 3.3 to Cura 3.4.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -771,7 +771,7 @@
|
||||||
"display_name": "Version Upgrade 3.4 to 3.5",
|
"display_name": "Version Upgrade 3.4 to 3.5",
|
||||||
"description": "Upgrades configurations from Cura 3.4 to Cura 3.5.",
|
"description": "Upgrades configurations from Cura 3.4 to Cura 3.5.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -788,7 +788,7 @@
|
||||||
"display_name": "Version Upgrade 3.5 to 4.0",
|
"display_name": "Version Upgrade 3.5 to 4.0",
|
||||||
"description": "Upgrades configurations from Cura 3.5 to Cura 4.0.",
|
"description": "Upgrades configurations from Cura 3.5 to Cura 4.0.",
|
||||||
"package_version": "1.0.0",
|
"package_version": "1.0.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -805,7 +805,7 @@
|
||||||
"display_name": "Version Upgrade 4.0 to 4.1",
|
"display_name": "Version Upgrade 4.0 to 4.1",
|
||||||
"description": "Upgrades configurations from Cura 4.0 to Cura 4.1.",
|
"description": "Upgrades configurations from Cura 4.0 to Cura 4.1.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -822,7 +822,7 @@
|
||||||
"display_name": "Version Upgrade 4.1 to 4.2",
|
"display_name": "Version Upgrade 4.1 to 4.2",
|
||||||
"description": "Upgrades configurations from Cura 4.1 to Cura 4.2.",
|
"description": "Upgrades configurations from Cura 4.1 to Cura 4.2.",
|
||||||
"package_version": "1.0.0",
|
"package_version": "1.0.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -839,7 +839,7 @@
|
||||||
"display_name": "Version Upgrade 4.2 to 4.3",
|
"display_name": "Version Upgrade 4.2 to 4.3",
|
||||||
"description": "Upgrades configurations from Cura 4.2 to Cura 4.3.",
|
"description": "Upgrades configurations from Cura 4.2 to Cura 4.3.",
|
||||||
"package_version": "1.0.0",
|
"package_version": "1.0.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -856,7 +856,7 @@
|
||||||
"display_name": "Version Upgrade 4.3 to 4.4",
|
"display_name": "Version Upgrade 4.3 to 4.4",
|
||||||
"description": "Upgrades configurations from Cura 4.3 to Cura 4.4.",
|
"description": "Upgrades configurations from Cura 4.3 to Cura 4.4.",
|
||||||
"package_version": "1.0.0",
|
"package_version": "1.0.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -873,7 +873,7 @@
|
||||||
"display_name": "Version Upgrade 4.4 to 4.5",
|
"display_name": "Version Upgrade 4.4 to 4.5",
|
||||||
"description": "Upgrades configurations from Cura 4.4 to Cura 4.5.",
|
"description": "Upgrades configurations from Cura 4.4 to Cura 4.5.",
|
||||||
"package_version": "1.0.0",
|
"package_version": "1.0.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -890,7 +890,7 @@
|
||||||
"display_name": "Version Upgrade 4.5 to 4.6",
|
"display_name": "Version Upgrade 4.5 to 4.6",
|
||||||
"description": "Upgrades configurations from Cura 4.5 to Cura 4.6.",
|
"description": "Upgrades configurations from Cura 4.5 to Cura 4.6.",
|
||||||
"package_version": "1.0.0",
|
"package_version": "1.0.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -907,7 +907,7 @@
|
||||||
"display_name": "Version Upgrade 4.6.0 to 4.6.2",
|
"display_name": "Version Upgrade 4.6.0 to 4.6.2",
|
||||||
"description": "Upgrades configurations from Cura 4.6.0 to Cura 4.6.2.",
|
"description": "Upgrades configurations from Cura 4.6.0 to Cura 4.6.2.",
|
||||||
"package_version": "1.0.0",
|
"package_version": "1.0.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -924,7 +924,7 @@
|
||||||
"display_name": "Version Upgrade 4.6.2 to 4.7",
|
"display_name": "Version Upgrade 4.6.2 to 4.7",
|
||||||
"description": "Upgrades configurations from Cura 4.6.2 to Cura 4.7.",
|
"description": "Upgrades configurations from Cura 4.6.2 to Cura 4.7.",
|
||||||
"package_version": "1.0.0",
|
"package_version": "1.0.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -941,7 +941,7 @@
|
||||||
"display_name": "Version Upgrade 4.7.0 to 4.8.0",
|
"display_name": "Version Upgrade 4.7.0 to 4.8.0",
|
||||||
"description": "Upgrades configurations from Cura 4.7.0 to Cura 4.8.0",
|
"description": "Upgrades configurations from Cura 4.7.0 to Cura 4.8.0",
|
||||||
"package_version": "1.0.0",
|
"package_version": "1.0.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -958,7 +958,7 @@
|
||||||
"display_name": "Version Upgrade 4.8.0 to 4.9.0",
|
"display_name": "Version Upgrade 4.8.0 to 4.9.0",
|
||||||
"description": "Upgrades configurations from Cura 4.8.0 to Cura 4.9.0",
|
"description": "Upgrades configurations from Cura 4.8.0 to Cura 4.9.0",
|
||||||
"package_version": "1.0.0",
|
"package_version": "1.0.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -976,7 +976,7 @@
|
||||||
"description": "Upgrades configurations from Cura 4.9 to Cura 4.10",
|
"description": "Upgrades configurations from Cura 4.9 to Cura 4.10",
|
||||||
"package_version": "1.0.0",
|
"package_version": "1.0.0",
|
||||||
"sdk_version": 7,
|
"sdk_version": 7,
|
||||||
"sdk_version_semver": "7.6.0",
|
"sdk_version_semver": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -993,7 +993,7 @@
|
||||||
"display_name": "X3D Reader",
|
"display_name": "X3D Reader",
|
||||||
"description": "Provides support for reading X3D files.",
|
"description": "Provides support for reading X3D files.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "SevaAlekseyev",
|
"author_id": "SevaAlekseyev",
|
||||||
|
@ -1010,7 +1010,7 @@
|
||||||
"display_name": "XML Material Profiles",
|
"display_name": "XML Material Profiles",
|
||||||
"description": "Provides capabilities to read and write XML-based material profiles.",
|
"description": "Provides capabilities to read and write XML-based material profiles.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -1027,7 +1027,7 @@
|
||||||
"display_name": "X-Ray View",
|
"display_name": "X-Ray View",
|
||||||
"description": "Provides the X-Ray view.",
|
"description": "Provides the X-Ray view.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -1044,7 +1044,7 @@
|
||||||
"display_name": "Generic ABS",
|
"display_name": "Generic ABS",
|
||||||
"description": "The generic ABS profile which other profiles can be based upon.",
|
"description": "The generic ABS profile which other profiles can be based upon.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
|
@ -1062,7 +1062,7 @@
|
||||||
"display_name": "Generic BAM",
|
"display_name": "Generic BAM",
|
||||||
"description": "The generic BAM profile which other profiles can be based upon.",
|
"description": "The generic BAM profile which other profiles can be based upon.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
|
@ -1080,7 +1080,7 @@
|
||||||
"display_name": "Generic CFF CPE",
|
"display_name": "Generic CFF CPE",
|
||||||
"description": "The generic CFF CPE profile which other profiles can be based upon.",
|
"description": "The generic CFF CPE profile which other profiles can be based upon.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
|
@ -1098,7 +1098,7 @@
|
||||||
"display_name": "Generic CFF PA",
|
"display_name": "Generic CFF PA",
|
||||||
"description": "The generic CFF PA profile which other profiles can be based upon.",
|
"description": "The generic CFF PA profile which other profiles can be based upon.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
|
@ -1116,7 +1116,7 @@
|
||||||
"display_name": "Generic CPE",
|
"display_name": "Generic CPE",
|
||||||
"description": "The generic CPE profile which other profiles can be based upon.",
|
"description": "The generic CPE profile which other profiles can be based upon.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
|
@ -1134,7 +1134,7 @@
|
||||||
"display_name": "Generic CPE+",
|
"display_name": "Generic CPE+",
|
||||||
"description": "The generic CPE+ profile which other profiles can be based upon.",
|
"description": "The generic CPE+ profile which other profiles can be based upon.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
|
@ -1152,7 +1152,7 @@
|
||||||
"display_name": "Generic GFF CPE",
|
"display_name": "Generic GFF CPE",
|
||||||
"description": "The generic GFF CPE profile which other profiles can be based upon.",
|
"description": "The generic GFF CPE profile which other profiles can be based upon.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
|
@ -1170,7 +1170,7 @@
|
||||||
"display_name": "Generic GFF PA",
|
"display_name": "Generic GFF PA",
|
||||||
"description": "The generic GFF PA profile which other profiles can be based upon.",
|
"description": "The generic GFF PA profile which other profiles can be based upon.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
|
@ -1188,7 +1188,7 @@
|
||||||
"display_name": "Generic HIPS",
|
"display_name": "Generic HIPS",
|
||||||
"description": "The generic HIPS profile which other profiles can be based upon.",
|
"description": "The generic HIPS profile which other profiles can be based upon.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
|
@ -1206,7 +1206,7 @@
|
||||||
"display_name": "Generic Nylon",
|
"display_name": "Generic Nylon",
|
||||||
"description": "The generic Nylon profile which other profiles can be based upon.",
|
"description": "The generic Nylon profile which other profiles can be based upon.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
|
@ -1224,7 +1224,7 @@
|
||||||
"display_name": "Generic PC",
|
"display_name": "Generic PC",
|
||||||
"description": "The generic PC profile which other profiles can be based upon.",
|
"description": "The generic PC profile which other profiles can be based upon.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
|
@ -1242,7 +1242,7 @@
|
||||||
"display_name": "Generic PETG",
|
"display_name": "Generic PETG",
|
||||||
"description": "The generic PETG profile which other profiles can be based upon.",
|
"description": "The generic PETG profile which other profiles can be based upon.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
|
@ -1260,7 +1260,7 @@
|
||||||
"display_name": "Generic PLA",
|
"display_name": "Generic PLA",
|
||||||
"description": "The generic PLA profile which other profiles can be based upon.",
|
"description": "The generic PLA profile which other profiles can be based upon.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
|
@ -1278,7 +1278,7 @@
|
||||||
"display_name": "Generic PP",
|
"display_name": "Generic PP",
|
||||||
"description": "The generic PP profile which other profiles can be based upon.",
|
"description": "The generic PP profile which other profiles can be based upon.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
|
@ -1296,7 +1296,7 @@
|
||||||
"display_name": "Generic PVA",
|
"display_name": "Generic PVA",
|
||||||
"description": "The generic PVA profile which other profiles can be based upon.",
|
"description": "The generic PVA profile which other profiles can be based upon.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
|
@ -1314,7 +1314,7 @@
|
||||||
"display_name": "Generic Tough PLA",
|
"display_name": "Generic Tough PLA",
|
||||||
"description": "The generic Tough PLA profile which other profiles can be based upon.",
|
"description": "The generic Tough PLA profile which other profiles can be based upon.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
|
@ -1332,7 +1332,7 @@
|
||||||
"display_name": "Generic TPU",
|
"display_name": "Generic TPU",
|
||||||
"description": "The generic TPU profile which other profiles can be based upon.",
|
"description": "The generic TPU profile which other profiles can be based upon.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
|
@ -1350,7 +1350,7 @@
|
||||||
"display_name": "Dagoma Chromatik PLA",
|
"display_name": "Dagoma Chromatik PLA",
|
||||||
"description": "Filament testé et approuvé pour les imprimantes 3D Dagoma. Chromatik est l'idéal pour débuter et suivre les tutoriels premiers pas. Il vous offre qualité et résistance pour chacune de vos impressions.",
|
"description": "Filament testé et approuvé pour les imprimantes 3D Dagoma. Chromatik est l'idéal pour débuter et suivre les tutoriels premiers pas. Il vous offre qualité et résistance pour chacune de vos impressions.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://dagoma.fr/boutique/filaments.html",
|
"website": "https://dagoma.fr/boutique/filaments.html",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Dagoma",
|
"author_id": "Dagoma",
|
||||||
|
@ -1367,7 +1367,7 @@
|
||||||
"display_name": "FABtotum ABS",
|
"display_name": "FABtotum ABS",
|
||||||
"description": "This material is easy to be extruded but it is not the simplest to use. It is one of the most used in 3D printing to get very well finished objects. It is not sustainable and its smoke can be dangerous if inhaled. The reason to prefer this filament to PLA is mainly because of its precision and mechanical specs. ABS (for plastic) stands for Acrylonitrile Butadiene Styrene and it is a thermoplastic which is widely used in everyday objects. It can be printed with any FFF 3D printer which can get to high temperatures as it must be extruded in a range between 220° and 245°, so it’s compatible with all versions of the FABtotum Personal fabricator.",
|
"description": "This material is easy to be extruded but it is not the simplest to use. It is one of the most used in 3D printing to get very well finished objects. It is not sustainable and its smoke can be dangerous if inhaled. The reason to prefer this filament to PLA is mainly because of its precision and mechanical specs. ABS (for plastic) stands for Acrylonitrile Butadiene Styrene and it is a thermoplastic which is widely used in everyday objects. It can be printed with any FFF 3D printer which can get to high temperatures as it must be extruded in a range between 220° and 245°, so it’s compatible with all versions of the FABtotum Personal fabricator.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://store.fabtotum.com/eu/products/filaments.html?filament_type=40",
|
"website": "https://store.fabtotum.com/eu/products/filaments.html?filament_type=40",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "FABtotum",
|
"author_id": "FABtotum",
|
||||||
|
@ -1384,7 +1384,7 @@
|
||||||
"display_name": "FABtotum Nylon",
|
"display_name": "FABtotum Nylon",
|
||||||
"description": "When 3D printing started this material was not listed among the extrudable filaments. It is flexible as well as resistant to tractions. It is well known for its uses in textile but also in industries which require a strong and flexible material. There are different kinds of Nylon: 3D printing mostly uses Nylon 6 and Nylon 6.6, which are the most common. It requires higher temperatures to be printed, so a 3D printer must be able to reach them (around 240°C): the FABtotum, of course, can.",
|
"description": "When 3D printing started this material was not listed among the extrudable filaments. It is flexible as well as resistant to tractions. It is well known for its uses in textile but also in industries which require a strong and flexible material. There are different kinds of Nylon: 3D printing mostly uses Nylon 6 and Nylon 6.6, which are the most common. It requires higher temperatures to be printed, so a 3D printer must be able to reach them (around 240°C): the FABtotum, of course, can.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://store.fabtotum.com/eu/products/filaments.html?filament_type=53",
|
"website": "https://store.fabtotum.com/eu/products/filaments.html?filament_type=53",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "FABtotum",
|
"author_id": "FABtotum",
|
||||||
|
@ -1401,7 +1401,7 @@
|
||||||
"display_name": "FABtotum PLA",
|
"display_name": "FABtotum PLA",
|
||||||
"description": "It is the most common filament used for 3D printing. It is studied to be bio-degradable as it comes from corn starch’s sugar mainly. It is completely made of renewable sources and has no footprint on polluting. PLA stands for PolyLactic Acid and it is a thermoplastic that today is still considered the easiest material to be 3D printed. It can be extruded at lower temperatures: the standard range of FABtotum’s one is between 185° and 195°.",
|
"description": "It is the most common filament used for 3D printing. It is studied to be bio-degradable as it comes from corn starch’s sugar mainly. It is completely made of renewable sources and has no footprint on polluting. PLA stands for PolyLactic Acid and it is a thermoplastic that today is still considered the easiest material to be 3D printed. It can be extruded at lower temperatures: the standard range of FABtotum’s one is between 185° and 195°.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://store.fabtotum.com/eu/products/filaments.html?filament_type=39",
|
"website": "https://store.fabtotum.com/eu/products/filaments.html?filament_type=39",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "FABtotum",
|
"author_id": "FABtotum",
|
||||||
|
@ -1418,7 +1418,7 @@
|
||||||
"display_name": "FABtotum TPU Shore 98A",
|
"display_name": "FABtotum TPU Shore 98A",
|
||||||
"description": "",
|
"description": "",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://store.fabtotum.com/eu/products/filaments.html?filament_type=66",
|
"website": "https://store.fabtotum.com/eu/products/filaments.html?filament_type=66",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "FABtotum",
|
"author_id": "FABtotum",
|
||||||
|
@ -1435,7 +1435,7 @@
|
||||||
"display_name": "Fiberlogy HD PLA",
|
"display_name": "Fiberlogy HD PLA",
|
||||||
"description": "With our HD PLA you have many more options. You can use this material in two ways. Choose the one you like best. You can use it as a normal PLA and get prints characterized by a very good adhesion between the layers and high precision. You can also make your prints acquire similar properties to that of ABS – better impact resistance and high temperature resistance. All you need is an oven. Yes, an oven! By annealing our HD PLA in an oven, in accordance with the manual, you will avoid all the inconveniences of printing with ABS, such as unpleasant odour or hazardous fumes.",
|
"description": "With our HD PLA you have many more options. You can use this material in two ways. Choose the one you like best. You can use it as a normal PLA and get prints characterized by a very good adhesion between the layers and high precision. You can also make your prints acquire similar properties to that of ABS – better impact resistance and high temperature resistance. All you need is an oven. Yes, an oven! By annealing our HD PLA in an oven, in accordance with the manual, you will avoid all the inconveniences of printing with ABS, such as unpleasant odour or hazardous fumes.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "http://fiberlogy.com/en/fiberlogy-filaments/filament-hd-pla/",
|
"website": "http://fiberlogy.com/en/fiberlogy-filaments/filament-hd-pla/",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Fiberlogy",
|
"author_id": "Fiberlogy",
|
||||||
|
@ -1452,7 +1452,7 @@
|
||||||
"display_name": "Filo3D PLA",
|
"display_name": "Filo3D PLA",
|
||||||
"description": "Fast, safe and reliable printing. PLA is ideal for the fast and reliable printing of parts and prototypes with a great surface quality.",
|
"description": "Fast, safe and reliable printing. PLA is ideal for the fast and reliable printing of parts and prototypes with a great surface quality.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://dagoma.fr",
|
"website": "https://dagoma.fr",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Dagoma",
|
"author_id": "Dagoma",
|
||||||
|
@ -1469,7 +1469,7 @@
|
||||||
"display_name": "IMADE3D JellyBOX PETG",
|
"display_name": "IMADE3D JellyBOX PETG",
|
||||||
"description": "",
|
"description": "",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "http://shop.imade3d.com/filament.html",
|
"website": "http://shop.imade3d.com/filament.html",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "IMADE3D",
|
"author_id": "IMADE3D",
|
||||||
|
@ -1486,7 +1486,7 @@
|
||||||
"display_name": "IMADE3D JellyBOX PLA",
|
"display_name": "IMADE3D JellyBOX PLA",
|
||||||
"description": "",
|
"description": "",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "http://shop.imade3d.com/filament.html",
|
"website": "http://shop.imade3d.com/filament.html",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "IMADE3D",
|
"author_id": "IMADE3D",
|
||||||
|
@ -1503,7 +1503,7 @@
|
||||||
"display_name": "Octofiber PLA",
|
"display_name": "Octofiber PLA",
|
||||||
"description": "PLA material from Octofiber.",
|
"description": "PLA material from Octofiber.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://nl.octofiber.com/3d-printing-filament/pla.html",
|
"website": "https://nl.octofiber.com/3d-printing-filament/pla.html",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Octofiber",
|
"author_id": "Octofiber",
|
||||||
|
@ -1520,7 +1520,7 @@
|
||||||
"display_name": "PolyFlex™ PLA",
|
"display_name": "PolyFlex™ PLA",
|
||||||
"description": "PolyFlex™ is a highly flexible yet easy to print 3D printing material. Featuring good elasticity and a large strain-to- failure, PolyFlex™ opens up a completely new realm of applications.",
|
"description": "PolyFlex™ is a highly flexible yet easy to print 3D printing material. Featuring good elasticity and a large strain-to- failure, PolyFlex™ opens up a completely new realm of applications.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "http://www.polymaker.com/shop/polyflex/",
|
"website": "http://www.polymaker.com/shop/polyflex/",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Polymaker",
|
"author_id": "Polymaker",
|
||||||
|
@ -1537,7 +1537,7 @@
|
||||||
"display_name": "PolyMax™ PLA",
|
"display_name": "PolyMax™ PLA",
|
||||||
"description": "PolyMax™ PLA is a 3D printing material with excellent mechanical properties and printing quality. PolyMax™ PLA has an impact resistance of up to nine times that of regular PLA, and better overall mechanical properties than ABS.",
|
"description": "PolyMax™ PLA is a 3D printing material with excellent mechanical properties and printing quality. PolyMax™ PLA has an impact resistance of up to nine times that of regular PLA, and better overall mechanical properties than ABS.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "http://www.polymaker.com/shop/polymax/",
|
"website": "http://www.polymaker.com/shop/polymax/",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Polymaker",
|
"author_id": "Polymaker",
|
||||||
|
@ -1554,7 +1554,7 @@
|
||||||
"display_name": "PolyPlus™ PLA True Colour",
|
"display_name": "PolyPlus™ PLA True Colour",
|
||||||
"description": "PolyPlus™ PLA is a premium PLA designed for all desktop FDM/FFF 3D printers. It is produced with our patented Jam-Free™ technology that ensures consistent extrusion and prevents jams.",
|
"description": "PolyPlus™ PLA is a premium PLA designed for all desktop FDM/FFF 3D printers. It is produced with our patented Jam-Free™ technology that ensures consistent extrusion and prevents jams.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "http://www.polymaker.com/shop/polyplus-true-colour/",
|
"website": "http://www.polymaker.com/shop/polyplus-true-colour/",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Polymaker",
|
"author_id": "Polymaker",
|
||||||
|
@ -1571,7 +1571,7 @@
|
||||||
"display_name": "PolyWood™ PLA",
|
"display_name": "PolyWood™ PLA",
|
||||||
"description": "PolyWood™ is a wood mimic printing material that contains no actual wood ensuring a clean Jam-Free™ printing experience.",
|
"description": "PolyWood™ is a wood mimic printing material that contains no actual wood ensuring a clean Jam-Free™ printing experience.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "http://www.polymaker.com/shop/polywood/",
|
"website": "http://www.polymaker.com/shop/polywood/",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Polymaker",
|
"author_id": "Polymaker",
|
||||||
|
@ -1588,7 +1588,7 @@
|
||||||
"display_name": "Ultimaker ABS",
|
"display_name": "Ultimaker ABS",
|
||||||
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com/products/materials/abs",
|
"website": "https://ultimaker.com/products/materials/abs",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -1607,7 +1607,7 @@
|
||||||
"display_name": "Ultimaker Breakaway",
|
"display_name": "Ultimaker Breakaway",
|
||||||
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com/products/materials/breakaway",
|
"website": "https://ultimaker.com/products/materials/breakaway",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -1626,7 +1626,7 @@
|
||||||
"display_name": "Ultimaker CPE",
|
"display_name": "Ultimaker CPE",
|
||||||
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com/products/materials/abs",
|
"website": "https://ultimaker.com/products/materials/abs",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -1645,7 +1645,7 @@
|
||||||
"display_name": "Ultimaker CPE+",
|
"display_name": "Ultimaker CPE+",
|
||||||
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com/products/materials/cpe",
|
"website": "https://ultimaker.com/products/materials/cpe",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -1664,7 +1664,7 @@
|
||||||
"display_name": "Ultimaker Nylon",
|
"display_name": "Ultimaker Nylon",
|
||||||
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com/products/materials/abs",
|
"website": "https://ultimaker.com/products/materials/abs",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -1683,7 +1683,7 @@
|
||||||
"display_name": "Ultimaker PC",
|
"display_name": "Ultimaker PC",
|
||||||
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com/products/materials/pc",
|
"website": "https://ultimaker.com/products/materials/pc",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -1702,7 +1702,7 @@
|
||||||
"display_name": "Ultimaker PLA",
|
"display_name": "Ultimaker PLA",
|
||||||
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com/products/materials/abs",
|
"website": "https://ultimaker.com/products/materials/abs",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -1721,7 +1721,7 @@
|
||||||
"display_name": "Ultimaker PP",
|
"display_name": "Ultimaker PP",
|
||||||
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com/products/materials/pp",
|
"website": "https://ultimaker.com/products/materials/pp",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -1740,7 +1740,7 @@
|
||||||
"display_name": "Ultimaker PVA",
|
"display_name": "Ultimaker PVA",
|
||||||
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com/products/materials/abs",
|
"website": "https://ultimaker.com/products/materials/abs",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -1759,7 +1759,7 @@
|
||||||
"display_name": "Ultimaker TPU 95A",
|
"display_name": "Ultimaker TPU 95A",
|
||||||
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com/products/materials/tpu-95a",
|
"website": "https://ultimaker.com/products/materials/tpu-95a",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -1778,7 +1778,7 @@
|
||||||
"display_name": "Ultimaker Tough PLA",
|
"display_name": "Ultimaker Tough PLA",
|
||||||
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://ultimaker.com/products/materials/tough-pla",
|
"website": "https://ultimaker.com/products/materials/tough-pla",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
|
@ -1797,7 +1797,7 @@
|
||||||
"display_name": "Vertex Delta ABS",
|
"display_name": "Vertex Delta ABS",
|
||||||
"description": "ABS material and quality files for the Delta Vertex K8800.",
|
"description": "ABS material and quality files for the Delta Vertex K8800.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://vertex3dprinter.eu",
|
"website": "https://vertex3dprinter.eu",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Velleman",
|
"author_id": "Velleman",
|
||||||
|
@ -1814,7 +1814,7 @@
|
||||||
"display_name": "Vertex Delta PET",
|
"display_name": "Vertex Delta PET",
|
||||||
"description": "ABS material and quality files for the Delta Vertex K8800.",
|
"description": "ABS material and quality files for the Delta Vertex K8800.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://vertex3dprinter.eu",
|
"website": "https://vertex3dprinter.eu",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Velleman",
|
"author_id": "Velleman",
|
||||||
|
@ -1831,7 +1831,7 @@
|
||||||
"display_name": "Vertex Delta PLA",
|
"display_name": "Vertex Delta PLA",
|
||||||
"description": "ABS material and quality files for the Delta Vertex K8800.",
|
"description": "ABS material and quality files for the Delta Vertex K8800.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://vertex3dprinter.eu",
|
"website": "https://vertex3dprinter.eu",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Velleman",
|
"author_id": "Velleman",
|
||||||
|
@ -1848,7 +1848,7 @@
|
||||||
"display_name": "Vertex Delta TPU",
|
"display_name": "Vertex Delta TPU",
|
||||||
"description": "ABS material and quality files for the Delta Vertex K8800.",
|
"description": "ABS material and quality files for the Delta Vertex K8800.",
|
||||||
"package_version": "1.4.0",
|
"package_version": "1.4.0",
|
||||||
"sdk_version": "7.6.0",
|
"sdk_version": "7.7.0",
|
||||||
"website": "https://vertex3dprinter.eu",
|
"website": "https://vertex3dprinter.eu",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Velleman",
|
"author_id": "Velleman",
|
||||||
|
|
|
@ -8,7 +8,6 @@
|
||||||
"author": "Jason Scurtu",
|
"author": "Jason Scurtu",
|
||||||
"manufacturer": "Anycubic",
|
"manufacturer": "Anycubic",
|
||||||
"file_formats": "text/x-gcode",
|
"file_formats": "text/x-gcode",
|
||||||
"icon": "icon_ultimaker2",
|
|
||||||
"platform": "anycubic_4max_platform.3mf",
|
"platform": "anycubic_4max_platform.3mf",
|
||||||
"has_materials": true,
|
"has_materials": true,
|
||||||
"quality_definition": "anycubic_4max",
|
"quality_definition": "anycubic_4max",
|
||||||
|
|
|
@ -8,7 +8,6 @@
|
||||||
"author": "Patrick Glatt",
|
"author": "Patrick Glatt",
|
||||||
"manufacturer": "Anycubic",
|
"manufacturer": "Anycubic",
|
||||||
"file_formats": "text/x-gcode",
|
"file_formats": "text/x-gcode",
|
||||||
"icon": "icon_ultimaker2",
|
|
||||||
"platform": "anycubic_chiron_platform.obj",
|
"platform": "anycubic_chiron_platform.obj",
|
||||||
"platform_texture": "anycubic-chiron.png",
|
"platform_texture": "anycubic-chiron.png",
|
||||||
"has_materials": true,
|
"has_materials": true,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"version": 2,
|
"version": 2,
|
||||||
"name": "Anycubic i3 Mega (S, Pro)",
|
"name": "Anycubic i3 Mega S/Pro",
|
||||||
"inherits": "fdmprinter",
|
"inherits": "fdmprinter",
|
||||||
"metadata":
|
"metadata":
|
||||||
{
|
{
|
||||||
|
@ -21,7 +21,7 @@
|
||||||
|
|
||||||
"overrides":
|
"overrides":
|
||||||
{
|
{
|
||||||
"machine_name": { "default_value": "Anycubic i3 Mega (S, Pro)" },
|
"machine_name": { "default_value": "Anycubic i3 Mega S/Pro" },
|
||||||
"machine_heated_bed": { "default_value": true },
|
"machine_heated_bed": { "default_value": true },
|
||||||
"machine_width": { "default_value": 210 },
|
"machine_width": { "default_value": 210 },
|
||||||
"machine_height": { "default_value": 205 },
|
"machine_height": { "default_value": 205 },
|
||||||
|
@ -44,7 +44,7 @@
|
||||||
|
|
||||||
"material_diameter": { "default_value": 1.75 },
|
"material_diameter": { "default_value": 1.75 },
|
||||||
|
|
||||||
"acceleration_print": { "value": 1800 },
|
"acceleration_print": { "value": 1500 },
|
||||||
"acceleration_travel": { "value": 3000 },
|
"acceleration_travel": { "value": 3000 },
|
||||||
"acceleration_travel_layer_0": { "value": "acceleration_travel" },
|
"acceleration_travel_layer_0": { "value": "acceleration_travel" },
|
||||||
"acceleration_roofing": { "enabled": "acceleration_enabled and roofing_layer_count > 0 and top_layers > 0" },
|
"acceleration_roofing": { "enabled": "acceleration_enabled and roofing_layer_count > 0 and top_layers > 0" },
|
||||||
|
|
|
@ -12,6 +12,9 @@
|
||||||
"machine_name": { "default_value": "Anycubic i3 Mega X" },
|
"machine_name": { "default_value": "Anycubic i3 Mega X" },
|
||||||
"machine_width": { "default_value": 300 },
|
"machine_width": { "default_value": 300 },
|
||||||
"machine_height": { "default_value": 305 },
|
"machine_height": { "default_value": 305 },
|
||||||
"machine_depth": { "default_value": 300 }
|
"machine_depth": { "default_value": 300 },
|
||||||
|
|
||||||
|
"acceleration_print": { "value": 400 },
|
||||||
|
"acceleration_travel": { "value": 400 }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
47
resources/definitions/anycubic_vyper.def.json
Normal file
47
resources/definitions/anycubic_vyper.def.json
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
{
|
||||||
|
"version": 2,
|
||||||
|
"name": "Anycubic Vyper",
|
||||||
|
"inherits": "fdmprinter",
|
||||||
|
"metadata": {
|
||||||
|
"visible": true,
|
||||||
|
"author": "ThatGuyZim",
|
||||||
|
"manufacturer": "Anycubic",
|
||||||
|
"file_formats": "text/x-gcode",
|
||||||
|
"platform": "anycubic_vyper_platform.stl",
|
||||||
|
"machine_extruder_trains": {
|
||||||
|
"0": "anycubic_vyper_extruder_0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"overrides": {
|
||||||
|
"machine_name": {
|
||||||
|
"default_value": "Anycubic Vyper"
|
||||||
|
},
|
||||||
|
"machine_heated_bed": {
|
||||||
|
"default_value": true
|
||||||
|
},
|
||||||
|
"machine_width": {
|
||||||
|
"default_value": 250
|
||||||
|
},
|
||||||
|
"machine_height": {
|
||||||
|
"default_value": 265
|
||||||
|
},
|
||||||
|
"machine_depth": {
|
||||||
|
"default_value": 255
|
||||||
|
},
|
||||||
|
"machine_center_is_zero": {
|
||||||
|
"default_value": false
|
||||||
|
},
|
||||||
|
"gantry_height": {
|
||||||
|
"value": "0"
|
||||||
|
},
|
||||||
|
"machine_gcode_flavor": {
|
||||||
|
"default_value": "RepRap (Marlin/Sprinter)"
|
||||||
|
},
|
||||||
|
"machine_start_gcode": {
|
||||||
|
"default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nM300 S1318 P266\nG28 Z0 ;move Z to min endstops\nG0 Z0.2\nG92 E0 ;zero the extruded length\nG1 X40 E25 F400 ; Extrude 25mm of filament in a 4cm line. Reduce speed (F) if you have a nozzle smaller than 0.4mm!\nG92 E0 ;zero the extruded length again\nG1 E-1 F500 ; Retract a little\nG1 X80 F4000 ; Quickly wipe away from the filament line\nM117 ; Printing…\nG5"
|
||||||
|
},
|
||||||
|
"machine_end_gcode": {
|
||||||
|
"default_value": "M104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nM84 ; disable motors\nM107\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 ;Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y180 F2000\nM84 ;steppers off\nG90\nM300 S1318 P266"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
29
resources/definitions/atomstack_cambrian_base.def.json
Normal file
29
resources/definitions/atomstack_cambrian_base.def.json
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
{
|
||||||
|
"version": 2,
|
||||||
|
"name": "AtomStack Cambrian Base Printer",
|
||||||
|
"inherits": "fdmprinter",
|
||||||
|
"metadata": {
|
||||||
|
"visible": false,
|
||||||
|
"author": "AtomStack",
|
||||||
|
"manufacturer": "AtomStack",
|
||||||
|
"file_formats": "text/x-gcode",
|
||||||
|
"has_materials": true,
|
||||||
|
"machine_extruder_trains": {
|
||||||
|
"0": "atomstack_cambrianmaxe175_extruder_0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"overrides": {
|
||||||
|
"machine_heated_bed": {
|
||||||
|
"default_value": true
|
||||||
|
},
|
||||||
|
"machine_extruder_count": {
|
||||||
|
"default_value": 1
|
||||||
|
},
|
||||||
|
"machine_start_gcode": {
|
||||||
|
"default_value": "; AtomStack Cambrian Start G-code\nG92 E0 ; Reset Extruder\nG28 ; Home all axes\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X0.1 Y20 Z0.3 F5000.0 ; Move to start position\nG1 X0.1 Y200.0 Z0.3 F1500.0 E15 ; Draw the first line\nG1 X0.9 Y200.0 Z0.3 F5000.0 ; Move to side a little\nG1 X0.9 Y20 Z0.3 F1500.0 E30 ; Draw the second line\nG1 E29 ;Retract the filament\nG92 E0 ; Reset Extruder\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X5 Y20 Z0.3 F5000.0 ; Move over to prevent blob squish"
|
||||||
|
},
|
||||||
|
"machine_end_gcode": {
|
||||||
|
"default_value": "; AtomStack Cambrian End G-code\nG91 ;Relative positioning\nG1 E-2 F2700 ;Retract a bit\nG1 E-8 Z0.2 F2400 ;Retract and raise Z\nG1 X5 Y5 F3000 ;Wipe out\nG1 Z10 ;Raise Z more\nG90 ;Absolute position\n\nG1 X0 Y210 ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off nozzle\nM140 S0 ;Turn-off bed\n\nM84 X Y E ;Disable all steppers but Z"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
29
resources/definitions/atomstack_cambrianmaxe175.def.json
Normal file
29
resources/definitions/atomstack_cambrianmaxe175.def.json
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
{
|
||||||
|
"version": 2,
|
||||||
|
"name": "Cambrian Max E175",
|
||||||
|
"inherits": "atomstack_cambrian_base",
|
||||||
|
"metadata": {
|
||||||
|
"visible": true,
|
||||||
|
"author": "AtomStack",
|
||||||
|
"manufacturer": "AtomStack",
|
||||||
|
"file_formats": "text/x-gcode",
|
||||||
|
"has_materials": true,
|
||||||
|
"machine_extruder_trains": {
|
||||||
|
"0": "atomstack_cambrianmaxe175_extruder_0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"overrides": {
|
||||||
|
"machine_name": {
|
||||||
|
"default_value": "Cambrian MAX E175"
|
||||||
|
},
|
||||||
|
"machine_width": {
|
||||||
|
"default_value": 320
|
||||||
|
},
|
||||||
|
"machine_height": {
|
||||||
|
"default_value": 380
|
||||||
|
},
|
||||||
|
"machine_depth": {
|
||||||
|
"default_value": 330
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
29
resources/definitions/atomstack_cambrianmaxe285.def.json
Normal file
29
resources/definitions/atomstack_cambrianmaxe285.def.json
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
{
|
||||||
|
"version": 2,
|
||||||
|
"name": "Cambrian Max E285",
|
||||||
|
"inherits": "atomstack_cambrian_base",
|
||||||
|
"metadata": {
|
||||||
|
"visible": true,
|
||||||
|
"author": "AtomStack",
|
||||||
|
"manufacturer": "AtomStack",
|
||||||
|
"file_formats": "text/x-gcode",
|
||||||
|
"has_materials": true,
|
||||||
|
"machine_extruder_trains": {
|
||||||
|
"0": "atomstack_cambrianmaxe285_extruder_0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"overrides": {
|
||||||
|
"machine_name": {
|
||||||
|
"default_value": "Cambrian MAX E285"
|
||||||
|
},
|
||||||
|
"machine_width": {
|
||||||
|
"default_value": 320
|
||||||
|
},
|
||||||
|
"machine_height": {
|
||||||
|
"default_value": 380
|
||||||
|
},
|
||||||
|
"machine_depth": {
|
||||||
|
"default_value": 330
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
29
resources/definitions/atomstack_cambrianproe175.def.json
Normal file
29
resources/definitions/atomstack_cambrianproe175.def.json
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
{
|
||||||
|
"version": 2,
|
||||||
|
"name": "Cambrian Pro E175",
|
||||||
|
"inherits": "atomstack_cambrian_base",
|
||||||
|
"metadata": {
|
||||||
|
"visible": true,
|
||||||
|
"author": "AtomStack",
|
||||||
|
"manufacturer": "AtomStack",
|
||||||
|
"file_formats": "text/x-gcode",
|
||||||
|
"has_materials": true,
|
||||||
|
"machine_extruder_trains": {
|
||||||
|
"0": "atomstack_cambrianproe175_extruder_0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"overrides": {
|
||||||
|
"machine_name": {
|
||||||
|
"default_value": "Cambrian Pro E175"
|
||||||
|
},
|
||||||
|
"machine_width": {
|
||||||
|
"default_value": 235
|
||||||
|
},
|
||||||
|
"machine_height": {
|
||||||
|
"default_value": 250
|
||||||
|
},
|
||||||
|
"machine_depth": {
|
||||||
|
"default_value": 235
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
29
resources/definitions/atomstack_cambrianproe285.def.json
Normal file
29
resources/definitions/atomstack_cambrianproe285.def.json
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
{
|
||||||
|
"version": 2,
|
||||||
|
"name": "Cambrian Pro E285",
|
||||||
|
"inherits": "atomstack_cambrian_base",
|
||||||
|
"metadata": {
|
||||||
|
"visible": true,
|
||||||
|
"author": "AtomStack",
|
||||||
|
"manufacturer": "AtomStack",
|
||||||
|
"file_formats": "text/x-gcode",
|
||||||
|
"has_materials": true,
|
||||||
|
"machine_extruder_trains": {
|
||||||
|
"0": "atomstack_cambrianproe285_extruder_0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"overrides": {
|
||||||
|
"machine_name": {
|
||||||
|
"default_value": "Cambrian Pro E285"
|
||||||
|
},
|
||||||
|
"machine_width": {
|
||||||
|
"default_value": 235
|
||||||
|
},
|
||||||
|
"machine_height": {
|
||||||
|
"default_value": 250
|
||||||
|
},
|
||||||
|
"machine_depth": {
|
||||||
|
"default_value": 235
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
44
resources/definitions/crazy3dprint_base.def.json
Normal file
44
resources/definitions/crazy3dprint_base.def.json
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
{
|
||||||
|
"version": 2,
|
||||||
|
"name": "Crazy3DPrint CZ-300",
|
||||||
|
"inherits": "fdmprinter",
|
||||||
|
"metadata": {
|
||||||
|
"visible": false,
|
||||||
|
"author": "XYZprinting Software",
|
||||||
|
"manufacturer": "Crazy3DPrint",
|
||||||
|
"file_formats": "text/x-gcode",
|
||||||
|
"first_start_actions": ["MachineSettingsAction"],
|
||||||
|
"machine_extruder_trains":
|
||||||
|
{
|
||||||
|
"0": "crazy3dprint_cz300_extruder_0"
|
||||||
|
},
|
||||||
|
"has_materials": true,
|
||||||
|
"has_variants": true,
|
||||||
|
"has_machine_quality": true,
|
||||||
|
"preferred_variant_name": "0.4mm Nozzle",
|
||||||
|
"preferred_quality_type": "normal",
|
||||||
|
"preferred_material": "generic_pla",
|
||||||
|
"variants_name": "Nozzle Size"
|
||||||
|
},
|
||||||
|
"overrides": {
|
||||||
|
"machine_heated_bed": {"default_value": true},
|
||||||
|
"machine_max_feedrate_x": { "value": 500 },
|
||||||
|
"machine_max_feedrate_y": { "value": 500 },
|
||||||
|
"machine_max_feedrate_z": { "value": 10 },
|
||||||
|
"machine_max_feedrate_e": { "value": 50 },
|
||||||
|
"machine_max_acceleration_x": { "value": 1500 },
|
||||||
|
"machine_max_acceleration_y": { "value": 1500 },
|
||||||
|
"machine_max_acceleration_z": { "value": 500 },
|
||||||
|
"machine_max_acceleration_e": { "value": 5000 },
|
||||||
|
"machine_acceleration": { "value": 500 },
|
||||||
|
"machine_max_jerk_xy": { "value": 10 },
|
||||||
|
"machine_max_jerk_z": { "value": 0.4 },
|
||||||
|
"machine_max_jerk_e": { "value": 5 }
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
"machine_gcode_flavor": {"default_value": "RepRap (Marlin/Sprinter)"},
|
||||||
|
"machine_start_gcode": {"default_value": ";Start Gcode\nG90 ;absolute positioning\nM118 X25.00 Y25.00 Z20.00 T0\nM140 S{material_bed_temperature_layer_0} T0 ;Heat bed up to first layer temperature\nM104 S{material_print_temperature_layer_0} T0 ;Set nozzle temperature to first layer temperature\nM107 ;start with the fan off\nG90\nG28\nM132 X Y Z A B\nG1 Z50.000 F420\nG161 X Y F3300\nM7 T0\nM6 T0\nM651\nM907 X100 Y100 Z40 A100 B20 ;Digital potentiometer value\nM108 T0\n;Purge line\nG1 X-110.00 Y-60.00 F4800\nG1 Z{layer_height_0} F420\nG1 X-110.00 Y60.00 E17,4 F1200\n;Purge line end"},
|
||||||
|
"machine_end_gcode": {"default_value": ";end gcode\nM104 S0 T0\nM140 S0 T0\nG162 Z F1800\nG28 X Y\nM652\nM132 X Y Z A B\nG91\nM18"
|
||||||
|
}
|
||||||
|
}
|
65
resources/definitions/crazy3dprint_cz_300.def.json
Normal file
65
resources/definitions/crazy3dprint_cz_300.def.json
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
{
|
||||||
|
"version": 2,
|
||||||
|
"name": "Crazy3DPrint CZ-300",
|
||||||
|
"inherits": "crazy3dprint_base",
|
||||||
|
"metadata": {
|
||||||
|
"visible": true,
|
||||||
|
"author": "XYZprinting Software",
|
||||||
|
"manufacturer": "Crazy3DPrint",
|
||||||
|
"file_formats": "text/x-gcode",
|
||||||
|
"supports_usb_connection": true,
|
||||||
|
"preferred_quality_type": "normal",
|
||||||
|
"quality_definition": "crazy3dprint_base"
|
||||||
|
},
|
||||||
|
|
||||||
|
"overrides": {
|
||||||
|
"machine_name": { "default_value": "CZ-300" },
|
||||||
|
"machine_shape": { "default_value": "rectangular"},
|
||||||
|
"machine_heated_bed": { "default_value": true },
|
||||||
|
"machine_width": { "default_value": 300.00 },
|
||||||
|
"machine_depth": { "default_value": 300.00 },
|
||||||
|
"machine_height": { "default_value":300.00 },
|
||||||
|
"machine_center_is_zero": { "default_value": false },
|
||||||
|
"machine_head_with_fans_polygon": {
|
||||||
|
"default_value": [
|
||||||
|
[ -20, -10 ],
|
||||||
|
[ -20, 10 ],
|
||||||
|
[ 10, 10 ],
|
||||||
|
[ 10, -10 ]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"layer_height": { "default_value": 0.2 },
|
||||||
|
"infill_sparse_density": { "default_value": 15 },
|
||||||
|
"infill_line_distance": { "value": 2.6667 },
|
||||||
|
"infill_pattern": { "value": "'lines'" },
|
||||||
|
"infill_overlap": { "value": 8.0 },
|
||||||
|
"min_infill_area": { "default_value": 2.0 },
|
||||||
|
"retract_at_layer_change": { "default_value": true },
|
||||||
|
"default_material_print_temperature": { "default_value": 210 },
|
||||||
|
"material_print_temperature": { "value": 210 },
|
||||||
|
"material_final_print_temperature": { "value": 210 },
|
||||||
|
"material_bed_temperature": { "value": 70 },
|
||||||
|
"material_bed_temperature_layer_0": { "value": 70 },
|
||||||
|
"material_flow_layer_0": {"value": 140},
|
||||||
|
"retraction_amount": { "default_value": 10 },
|
||||||
|
"retraction_speed": { "default_value": 70 },
|
||||||
|
"speed_print": { "default_value": 40 },
|
||||||
|
"speed_travel": { "value": 60 },
|
||||||
|
"cool_fan_enabled": { "default_value": true },
|
||||||
|
"cool_fan_speed_0": { "value": 100 },
|
||||||
|
"adhesion_type": { "default_value" : "skirt" },
|
||||||
|
"brim_line_count": { "value" : 5 },
|
||||||
|
"skirt_line_count": { "default_value" : 5 },
|
||||||
|
"initial_layer_line_width_factor": { "default_value" : 140 },
|
||||||
|
"top_bottom_pattern": { "default_value" : "concentric" },
|
||||||
|
"outer_inset_first": { "default_value": true },
|
||||||
|
"fill_outline_gaps": { "default_value": true },
|
||||||
|
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
|
||||||
|
"machine_start_gcode": {
|
||||||
|
"default_value": "G28 ; home all axes\nG1 Z15 F5000 ; lift nozzle\nG92 E0\nG1 F200 E3\n"
|
||||||
|
},
|
||||||
|
"machine_end_gcode": {
|
||||||
|
"default_value": "M104 S0 ; turn off temperature\nM105 S0; \nG28 X0 ; home X axis\nM84 ; disable motors\n"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,7 +7,6 @@
|
||||||
"author": "Creatable Labs",
|
"author": "Creatable Labs",
|
||||||
"manufacturer": "Ateam Ventures Co. Ltd.",
|
"manufacturer": "Ateam Ventures Co. Ltd.",
|
||||||
"file_formats": "text/x-gcode",
|
"file_formats": "text/x-gcode",
|
||||||
"icon": "icon_ultimaker.png",
|
|
||||||
"platform": "rostock_platform.3mf",
|
"platform": "rostock_platform.3mf",
|
||||||
"machine_extruder_trains":
|
"machine_extruder_trains":
|
||||||
{
|
{
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
"has_variant_materials": false,
|
"has_variant_materials": false,
|
||||||
"weight": 0,
|
"weight": 0,
|
||||||
"file_formats": "text/x-gcode",
|
"file_formats": "text/x-gcode",
|
||||||
"icon": "icon_ultimaker.png",
|
|
||||||
"platform": "ultimaker2_platform.obj",
|
"platform": "ultimaker2_platform.obj",
|
||||||
"platform_texture": "dxu_backplate.png",
|
"platform_texture": "dxu_backplate.png",
|
||||||
"platform_offset": [1.5, 0, 0],
|
"platform_offset": [1.5, 0, 0],
|
||||||
|
|
|
@ -1519,6 +1519,16 @@
|
||||||
"limit_to_extruder": "top_bottom_extruder_nr",
|
"limit_to_extruder": "top_bottom_extruder_nr",
|
||||||
"settable_per_mesh": true
|
"settable_per_mesh": true
|
||||||
},
|
},
|
||||||
|
"skin_monotonic":
|
||||||
|
{
|
||||||
|
"label": "Monotonic Top/Bottom Order",
|
||||||
|
"description": "Print top/bottom lines in an ordering that causes them to always overlap with adjacent lines in a single direction. This takes slightly more time to print, but makes flat surfaces look more consistent.",
|
||||||
|
"type": "bool",
|
||||||
|
"default_value": false,
|
||||||
|
"enabled": "(top_layers > 0 or bottom_layers > 0) and (top_bottom_pattern != 'concentric' or top_bottom_pattern_0 != 'concentric')",
|
||||||
|
"limit_to_extruder": "top_bottom_extruder_nr",
|
||||||
|
"settable_per_mesh": true
|
||||||
|
},
|
||||||
"skin_angles":
|
"skin_angles":
|
||||||
{
|
{
|
||||||
"label": "Top/Bottom Line Directions",
|
"label": "Top/Bottom Line Directions",
|
||||||
|
@ -1586,6 +1596,16 @@
|
||||||
"limit_to_extruder": "top_bottom_extruder_nr",
|
"limit_to_extruder": "top_bottom_extruder_nr",
|
||||||
"settable_per_mesh": true
|
"settable_per_mesh": true
|
||||||
},
|
},
|
||||||
|
"ironing_monotonic":
|
||||||
|
{
|
||||||
|
"label": "Monotonic Ironing Order",
|
||||||
|
"description": "Print ironing lines in an ordering that causes them to always overlap with adjacent lines in a single direction. This takes slightly more time to print, but makes flat surfaces look more consistent.",
|
||||||
|
"type": "bool",
|
||||||
|
"default_value": false,
|
||||||
|
"enabled": "ironing_enabled and ironing_pattern != 'concentric'",
|
||||||
|
"limit_to_extruder": "top_bottom_extruder_nr",
|
||||||
|
"settable_per_mesh": true
|
||||||
|
},
|
||||||
"ironing_line_spacing":
|
"ironing_line_spacing":
|
||||||
{
|
{
|
||||||
"label": "Ironing Line Spacing",
|
"label": "Ironing Line Spacing",
|
||||||
|
@ -1889,7 +1909,7 @@
|
||||||
"gyroid": "Gyroid"
|
"gyroid": "Gyroid"
|
||||||
},
|
},
|
||||||
"default_value": "grid",
|
"default_value": "grid",
|
||||||
"enabled": "infill_sparse_density > 0",
|
"enabled": "infill_line_distance > 0",
|
||||||
"value": "'lines' if infill_sparse_density > 25 else 'grid'",
|
"value": "'lines' if infill_sparse_density > 25 else 'grid'",
|
||||||
"limit_to_extruder": "infill_extruder_nr",
|
"limit_to_extruder": "infill_extruder_nr",
|
||||||
"settable_per_mesh": true
|
"settable_per_mesh": true
|
||||||
|
@ -2539,7 +2559,7 @@
|
||||||
"unit": "%",
|
"unit": "%",
|
||||||
"default_value": 100,
|
"default_value": 100,
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"minimum_value": "5",
|
"minimum_value": "0.0001",
|
||||||
"minimum_value_warning": "50",
|
"minimum_value_warning": "50",
|
||||||
"maximum_value_warning": "150",
|
"maximum_value_warning": "150",
|
||||||
"enabled": "machine_gcode_flavor != \"UltiGCode\"",
|
"enabled": "machine_gcode_flavor != \"UltiGCode\"",
|
||||||
|
@ -2554,7 +2574,7 @@
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default_value": 100,
|
"default_value": 100,
|
||||||
"value": "material_flow",
|
"value": "material_flow",
|
||||||
"minimum_value": "5",
|
"minimum_value": "0.0001",
|
||||||
"minimum_value_warning": "50",
|
"minimum_value_warning": "50",
|
||||||
"maximum_value_warning": "150",
|
"maximum_value_warning": "150",
|
||||||
"limit_to_extruder": "wall_0_extruder_nr if wall_x_extruder_nr == wall_0_extruder_nr else -1",
|
"limit_to_extruder": "wall_0_extruder_nr if wall_x_extruder_nr == wall_0_extruder_nr else -1",
|
||||||
|
@ -2569,7 +2589,7 @@
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default_value": 100,
|
"default_value": 100,
|
||||||
"value": "wall_material_flow",
|
"value": "wall_material_flow",
|
||||||
"minimum_value": "5",
|
"minimum_value": "0.0001",
|
||||||
"minimum_value_warning": "50",
|
"minimum_value_warning": "50",
|
||||||
"maximum_value_warning": "150",
|
"maximum_value_warning": "150",
|
||||||
"limit_to_extruder": "wall_0_extruder_nr",
|
"limit_to_extruder": "wall_0_extruder_nr",
|
||||||
|
@ -2583,7 +2603,7 @@
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default_value": 100,
|
"default_value": 100,
|
||||||
"value": "wall_material_flow",
|
"value": "wall_material_flow",
|
||||||
"minimum_value": "5",
|
"minimum_value": "0.0001",
|
||||||
"minimum_value_warning": "50",
|
"minimum_value_warning": "50",
|
||||||
"maximum_value_warning": "150",
|
"maximum_value_warning": "150",
|
||||||
"limit_to_extruder": "wall_x_extruder_nr",
|
"limit_to_extruder": "wall_x_extruder_nr",
|
||||||
|
@ -2599,7 +2619,7 @@
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default_value": 100,
|
"default_value": 100,
|
||||||
"value": "material_flow",
|
"value": "material_flow",
|
||||||
"minimum_value": "5",
|
"minimum_value": "0.0001",
|
||||||
"minimum_value_warning": "50",
|
"minimum_value_warning": "50",
|
||||||
"maximum_value_warning": "150",
|
"maximum_value_warning": "150",
|
||||||
"enabled": "top_layers > 0 or bottom_layers > 0",
|
"enabled": "top_layers > 0 or bottom_layers > 0",
|
||||||
|
@ -2614,7 +2634,7 @@
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default_value": 100,
|
"default_value": 100,
|
||||||
"value": "skin_material_flow",
|
"value": "skin_material_flow",
|
||||||
"minimum_value": "5",
|
"minimum_value": "0.0001",
|
||||||
"minimum_value_warning": "50",
|
"minimum_value_warning": "50",
|
||||||
"maximum_value_warning": "150",
|
"maximum_value_warning": "150",
|
||||||
"limit_to_extruder": "roofing_extruder_nr",
|
"limit_to_extruder": "roofing_extruder_nr",
|
||||||
|
@ -2629,7 +2649,7 @@
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default_value": 100,
|
"default_value": 100,
|
||||||
"value": "material_flow",
|
"value": "material_flow",
|
||||||
"minimum_value": "5",
|
"minimum_value": "0.0001",
|
||||||
"minimum_value_warning": "50",
|
"minimum_value_warning": "50",
|
||||||
"maximum_value_warning": "150",
|
"maximum_value_warning": "150",
|
||||||
"enabled": "infill_sparse_density > 0",
|
"enabled": "infill_sparse_density > 0",
|
||||||
|
@ -2644,7 +2664,7 @@
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default_value": 100,
|
"default_value": 100,
|
||||||
"value": "material_flow",
|
"value": "material_flow",
|
||||||
"minimum_value": "5",
|
"minimum_value": "0.0001",
|
||||||
"minimum_value_warning": "50",
|
"minimum_value_warning": "50",
|
||||||
"maximum_value_warning": "150",
|
"maximum_value_warning": "150",
|
||||||
"enabled": "resolveOrValue('adhesion_type') == 'skirt' or resolveOrValue('adhesion_type') == 'brim' or resolveOrValue('draft_shield_enabled') or resolveOrValue('ooze_shield_enabled')",
|
"enabled": "resolveOrValue('adhesion_type') == 'skirt' or resolveOrValue('adhesion_type') == 'brim' or resolveOrValue('draft_shield_enabled') or resolveOrValue('ooze_shield_enabled')",
|
||||||
|
@ -2659,7 +2679,7 @@
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default_value": 100,
|
"default_value": 100,
|
||||||
"value": "material_flow",
|
"value": "material_flow",
|
||||||
"minimum_value": "5",
|
"minimum_value": "0.0001",
|
||||||
"minimum_value_warning": "50",
|
"minimum_value_warning": "50",
|
||||||
"maximum_value_warning": "150",
|
"maximum_value_warning": "150",
|
||||||
"enabled": "support_enable or support_meshes_present",
|
"enabled": "support_enable or support_meshes_present",
|
||||||
|
@ -2675,7 +2695,7 @@
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default_value": 100,
|
"default_value": 100,
|
||||||
"value": "material_flow",
|
"value": "material_flow",
|
||||||
"minimum_value": "5",
|
"minimum_value": "0.0001",
|
||||||
"minimum_value_warning": "50",
|
"minimum_value_warning": "50",
|
||||||
"maximum_value_warning": "150",
|
"maximum_value_warning": "150",
|
||||||
"enabled": "(support_enable or support_meshes_present) and support_interface_enable",
|
"enabled": "(support_enable or support_meshes_present) and support_interface_enable",
|
||||||
|
@ -2692,7 +2712,7 @@
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default_value": 100,
|
"default_value": 100,
|
||||||
"value": "extruderValue(support_roof_extruder_nr, 'support_interface_material_flow')",
|
"value": "extruderValue(support_roof_extruder_nr, 'support_interface_material_flow')",
|
||||||
"minimum_value": "5",
|
"minimum_value": "0.0001",
|
||||||
"minimum_value_warning": "50",
|
"minimum_value_warning": "50",
|
||||||
"maximum_value_warning": "150",
|
"maximum_value_warning": "150",
|
||||||
"enabled": "(support_enable or support_meshes_present) and support_roof_enable",
|
"enabled": "(support_enable or support_meshes_present) and support_roof_enable",
|
||||||
|
@ -2708,7 +2728,7 @@
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default_value": 100,
|
"default_value": 100,
|
||||||
"value": "extruderValue(support_bottom_extruder_nr, 'support_interface_material_flow')",
|
"value": "extruderValue(support_bottom_extruder_nr, 'support_interface_material_flow')",
|
||||||
"minimum_value": "5",
|
"minimum_value": "0.0001",
|
||||||
"minimum_value_warning": "50",
|
"minimum_value_warning": "50",
|
||||||
"maximum_value_warning": "150",
|
"maximum_value_warning": "150",
|
||||||
"enabled": "(support_enable or support_meshes_present) and support_bottom_enable",
|
"enabled": "(support_enable or support_meshes_present) and support_bottom_enable",
|
||||||
|
@ -2726,7 +2746,7 @@
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"default_value": 100,
|
"default_value": 100,
|
||||||
"value": "material_flow",
|
"value": "material_flow",
|
||||||
"minimum_value": "5",
|
"minimum_value": "0.0001",
|
||||||
"minimum_value_warning": "50",
|
"minimum_value_warning": "50",
|
||||||
"maximum_value_warning": "150",
|
"maximum_value_warning": "150",
|
||||||
"settable_per_mesh": false,
|
"settable_per_mesh": false,
|
||||||
|
@ -6229,7 +6249,7 @@
|
||||||
"mold_width":
|
"mold_width":
|
||||||
{
|
{
|
||||||
"label": "Minimal Mold Width",
|
"label": "Minimal Mold Width",
|
||||||
"description": "The minimal distance between the ouside of the mold and the outside of the model.",
|
"description": "The minimal distance between the outside of the mold and the outside of the model.",
|
||||||
"unit": "mm",
|
"unit": "mm",
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"minimum_value_warning": "wall_line_width_0 * 2",
|
"minimum_value_warning": "wall_line_width_0 * 2",
|
||||||
|
@ -6385,6 +6405,17 @@
|
||||||
"settable_per_mesh": true,
|
"settable_per_mesh": true,
|
||||||
"enabled": "roofing_layer_count > 0 and top_layers > 0"
|
"enabled": "roofing_layer_count > 0 and top_layers > 0"
|
||||||
},
|
},
|
||||||
|
"roofing_monotonic":
|
||||||
|
{
|
||||||
|
"label": "Monotonic Top Surface Order",
|
||||||
|
"description": "Print top surface lines in an ordering that causes them to always overlap with adjacent lines in a single direction. This takes slightly more time to print, but makes flat surfaces look more consistent.",
|
||||||
|
"type": "bool",
|
||||||
|
"default_value": false,
|
||||||
|
"value": "skin_monotonic",
|
||||||
|
"enabled": "roofing_layer_count > 0 and top_layers > 0 and roofing_pattern != 'concentric'",
|
||||||
|
"limit_to_extruder": "roofing_extruder_nr",
|
||||||
|
"settable_per_mesh": true
|
||||||
|
},
|
||||||
"roofing_angles":
|
"roofing_angles":
|
||||||
{
|
{
|
||||||
"label": "Top Surface Skin Line Directions",
|
"label": "Top Surface Skin Line Directions",
|
||||||
|
|
|
@ -1,16 +1,17 @@
|
||||||
{
|
{
|
||||||
"version": 2,
|
"version": 2,
|
||||||
"name": "FlSun SuperRacer",
|
"name": "Flsun Super Racer",
|
||||||
"inherits": "fdmprinter",
|
"inherits": "fdmprinter",
|
||||||
"metadata": {
|
"metadata": {
|
||||||
"visible": true,
|
"visible": true,
|
||||||
"author": "Thushan Fernando",
|
"author": "Thushan Fernando, Guislain Cyril",
|
||||||
"manufacturer": "Flsun",
|
"manufacturer": "Flsun",
|
||||||
"platform": "flsun_sr.3mf",
|
"platform": "flsun_sr.stl",
|
||||||
|
"platform_offset": [0,-81,-43.5],
|
||||||
"file_formats": "text/x-gcode",
|
"file_formats": "text/x-gcode",
|
||||||
"has_materials": true,
|
"has_materials": true,
|
||||||
"has_machine_quality": false,
|
"has_machine_quality": true,
|
||||||
"preferred_quality_type": "fast",
|
"preferred_quality_type": "normal",
|
||||||
"machine_extruder_trains": {
|
"machine_extruder_trains": {
|
||||||
"0": "flsun_sr_extruder_0"
|
"0": "flsun_sr_extruder_0"
|
||||||
}
|
}
|
||||||
|
@ -26,13 +27,13 @@
|
||||||
"default_value": true
|
"default_value": true
|
||||||
},
|
},
|
||||||
"machine_width": {
|
"machine_width": {
|
||||||
"default_value": 260
|
"default_value": 264
|
||||||
},
|
},
|
||||||
"machine_depth": {
|
"machine_depth": {
|
||||||
"default_value": 260
|
"default_value": 264
|
||||||
},
|
},
|
||||||
"machine_height": {
|
"machine_height": {
|
||||||
"default_value": 330
|
"default_value": 320
|
||||||
},
|
},
|
||||||
"machine_center_is_zero": {
|
"machine_center_is_zero": {
|
||||||
"default_value": true
|
"default_value": true
|
||||||
|
@ -64,13 +65,13 @@
|
||||||
"default_value": 15
|
"default_value": 15
|
||||||
},
|
},
|
||||||
"machine_start_gcode": {
|
"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\n"
|
"default_value": "G21 ; millimeter units\nG90 ; absolute coordinates\nM82 ; E absolute\nM140 S{material_bed_temperature}\nM104 S{material_print_temperature}\nM190 S{material_bed_temperature}\nM109 S{material_print_temperature}\nG28 ; home axis\nM420 S1 ; enable mesh leveling\n; Lower nozzle and move to start position\nG1 Z150\nG1 X-130 Y0 Z0.4 F3000\n; Extrude about 40 mm by printing a 90 degree arc\nG3 X0 Y-130 I130 Z0.3 E40 F2700\n; Retract and move nozzle up\nG92 E0\nG1 E-1.5 F1800\nG0 Z0.5\nG1 E0 F300\n"
|
||||||
},
|
},
|
||||||
"machine_end_gcode": {
|
"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 F6000\nG28 X0 Y0\nG90 ;absolute positioning\n"
|
"default_value": "G91 ; relative coordinates\nG1 E-1 F300 ; retract filament a bit before lifting\nG1 Z+5 E-5 F6000 ; raise platform from current position\nG28 X0 Y0 ; home axis\nG90 ; absolute coordinates\nG92 E0 ; reset extruder\nM104 S0 ; turn off hotend\nM140 S0 ; turn off heat bed\nM107 ; turn off fans\nM84 ; disable motors\n"
|
||||||
},
|
},
|
||||||
"machine_gcode_flavor": {
|
"machine_gcode_flavor": {
|
||||||
"default_value": "RepRap (Marlin/Sprinter)"
|
"default_value": "Marlin"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
141
resources/definitions/goofoo_base.def.json
Normal file
141
resources/definitions/goofoo_base.def.json
Normal file
|
@ -0,0 +1,141 @@
|
||||||
|
{
|
||||||
|
"name": "Goofoo Base Printer",
|
||||||
|
"version": 2,
|
||||||
|
"inherits": "fdmprinter",
|
||||||
|
"metadata": {
|
||||||
|
"visible": false,
|
||||||
|
"author": "goofoo3d.com",
|
||||||
|
"manufacturer": "GooFoo",
|
||||||
|
"file_formats": "text/x-gcode",
|
||||||
|
"first_start_actions": ["MachineSettingsAction"],
|
||||||
|
|
||||||
|
"machine_extruder_trains": {
|
||||||
|
"0": "goofoo_base_extruder"
|
||||||
|
},
|
||||||
|
|
||||||
|
"has_materials": true,
|
||||||
|
"preferred_material": "goofoo_pla",
|
||||||
|
|
||||||
|
"has_variants": true,
|
||||||
|
"variants_name": "Nozzle Size",
|
||||||
|
"preferred_variant_name": "0.4mm Nozzle",
|
||||||
|
|
||||||
|
"has_machine_quality": true,
|
||||||
|
"preferred_quality_type": "normal"
|
||||||
|
|
||||||
|
},
|
||||||
|
"overrides": {
|
||||||
|
|
||||||
|
"machine_end_gcode": { "default_value": "G91 ;Relative positioning\nG1 E-2 F2700 ;Retract the filament\nG1 E-2 Z0.2 F2400 ;Retract and raise Z\nG1 X5 Y5 F3000 ;Wipe out\nG1 Z10 ;Raise Z more\nG90 ;Absolute positioning\n\nG28 X0 Y0 ;Home X and Y\n\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\n\nM84 X Y E ;Disable all steppers but Z" },
|
||||||
|
|
||||||
|
"machine_max_feedrate_x": { "value": 500 },
|
||||||
|
"machine_max_feedrate_y": { "value": 500 },
|
||||||
|
"machine_max_feedrate_z": { "value": 10 },
|
||||||
|
"machine_max_feedrate_e": { "value": 50 },
|
||||||
|
|
||||||
|
"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 },
|
||||||
|
|
||||||
|
"machine_max_jerk_xy": { "value": 10 },
|
||||||
|
"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": 500 },
|
||||||
|
"acceleration_travel": { "value": 500 },
|
||||||
|
"acceleration_travel_layer_0": { "value": "acceleration_travel" },
|
||||||
|
"acceleration_roofing": { "enabled": "acceleration_enabled and roofing_layer_count > 0 and top_layers > 0" },
|
||||||
|
|
||||||
|
"jerk_print": { "value": 8 },
|
||||||
|
"jerk_travel": { "value": "jerk_print" },
|
||||||
|
"jerk_travel_layer_0": { "value": "jerk_travel" },
|
||||||
|
|
||||||
|
"acceleration_enabled": { "value": false },
|
||||||
|
"jerk_enabled": { "value": false },
|
||||||
|
|
||||||
|
"speed_print": { "value": 40.0 } ,
|
||||||
|
"speed_infill": { "value": "speed_print" },
|
||||||
|
"speed_wall": { "value": "speed_print" },
|
||||||
|
"speed_wall_0": { "value": "speed_wall" },
|
||||||
|
"speed_wall_x": { "value": "speed_wall" },
|
||||||
|
"speed_topbottom": { "value": "speed_print" },
|
||||||
|
"speed_roofing": { "value": "speed_topbottom" },
|
||||||
|
"speed_travel": { "value": "80" },
|
||||||
|
"speed_layer_0": { "value": 20.0 },
|
||||||
|
"speed_print_layer_0": { "value": "speed_layer_0" },
|
||||||
|
"speed_travel_layer_0": { "value": "60" },
|
||||||
|
"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 if retraction_enable else float('inf')",
|
||||||
|
"maximum_value": 200
|
||||||
|
},
|
||||||
|
"retraction_retract_speed": {
|
||||||
|
"maximum_value_warning": "machine_max_feedrate_e if retraction_enable else float('inf')",
|
||||||
|
"maximum_value": 200
|
||||||
|
},
|
||||||
|
"retraction_prime_speed": {
|
||||||
|
"maximum_value_warning": "machine_max_feedrate_e if retraction_enable else float('inf')",
|
||||||
|
"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": "3 * layer_height" },
|
||||||
|
"cool_fan_enabled": { "value": true },
|
||||||
|
"cool_min_layer_time": { "value": 10 },
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
"top_bottom_thickness": {"value": "layer_height_0 + layer_height * 3" },
|
||||||
|
"wall_thickness": {"value": "line_width * 2" }
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
29
resources/definitions/goofoo_e-one.def.json
Normal file
29
resources/definitions/goofoo_e-one.def.json
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
{
|
||||||
|
"name": "Goofoo E-one",
|
||||||
|
"version": 2,
|
||||||
|
"inherits": "goofoo_open",
|
||||||
|
"overrides": {
|
||||||
|
"machine_name": { "default_value": "Goofoo E-one" },
|
||||||
|
"machine_width": { "default_value": 300 },
|
||||||
|
"machine_depth": { "default_value": 300 },
|
||||||
|
"machine_height": { "default_value": 400 }
|
||||||
|
},
|
||||||
|
"metadata": {
|
||||||
|
"visible": true,
|
||||||
|
"exclude_materials": [
|
||||||
|
"goofoo_bronze_pla",
|
||||||
|
"goofoo_peek",
|
||||||
|
"goofoo_tpe_83a",
|
||||||
|
"goofoo_tpu_87a",
|
||||||
|
"goofoo_tpu_95a",
|
||||||
|
"goofoo_pa_cf",
|
||||||
|
"goofoo_pc",
|
||||||
|
"goofoo_pa",
|
||||||
|
"goofoo_asa",
|
||||||
|
"goofoo_abs",
|
||||||
|
"goofoo_pva",
|
||||||
|
"goofoo_hips",
|
||||||
|
"goofoo_pva"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
15
resources/definitions/goofoo_far.def.json
Normal file
15
resources/definitions/goofoo_far.def.json
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
{
|
||||||
|
"name": "Goofoo Far",
|
||||||
|
"version": 2,
|
||||||
|
"inherits": "goofoo_base",
|
||||||
|
"metadata": {
|
||||||
|
"quality_definition": "goofoo_far",
|
||||||
|
"visible": false,
|
||||||
|
"exclude_materials": [
|
||||||
|
"goofoo_bronze_pla",
|
||||||
|
"goofoo_tpe_83a",
|
||||||
|
"goofoo_tpu_87a",
|
||||||
|
"goofoo_tpu_95a"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
22
resources/definitions/goofoo_gemini.def.json
Normal file
22
resources/definitions/goofoo_gemini.def.json
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
{
|
||||||
|
"name": "Goofoo Gemini",
|
||||||
|
"version": 2,
|
||||||
|
"inherits": "goofoo_far",
|
||||||
|
"overrides": {
|
||||||
|
"machine_name": { "default_value": "Goofoo Gemini" },
|
||||||
|
"machine_width": { "default_value": 360 },
|
||||||
|
"machine_depth": { "default_value": 250 },
|
||||||
|
"machine_height": { "default_value": 200 },
|
||||||
|
"machine_head_with_fans_polygon":{"default_value":[[0, 0], [0, 0], [0, 0], [0, 0]]},
|
||||||
|
"machine_extruder_count": {
|
||||||
|
"default_value": 2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"metadata": {
|
||||||
|
"machine_extruder_trains": {
|
||||||
|
"0": "goofoo_gemini_1st",
|
||||||
|
"1": "goofoo_gemini_2st"
|
||||||
|
},
|
||||||
|
"visible": true
|
||||||
|
}
|
||||||
|
}
|
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