mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-15 02:37:49 -06:00
Merge branch 'master' of github.com:Ultimaker/Cura into sentry_crash_integration
This commit is contained in:
commit
4de28bed28
1251 changed files with 1842 additions and 1456 deletions
35
.github/ISSUE_TEMPLATE.md
vendored
35
.github/ISSUE_TEMPLATE.md
vendored
|
@ -1,12 +1,18 @@
|
|||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us fix issues.
|
||||
title: ''
|
||||
labels: 'Type: Bug'
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
<!--
|
||||
The following template is useful for filing new issues. Processing an issue will go much faster when this is filled out, and issues which do not use this template WILL BE REMOVED.
|
||||
Processing an issue will go much faster when this is filled out, and issues which do not use this template WILL BE REMOVED and no fix will be considered!
|
||||
|
||||
Before filing, PLEASE check if the issue already exists (either open or closed) by using the search bar on the issues page. If it does, comment there. Even if it's closed, we can reopen it based on your comment.
|
||||
|
||||
Also, please note the application version in the title of the issue. For example: "[3.2.1] Cannot connect to 3rd-party printer". Please do not write things like "Request:" or "[BUG]" in the title; this is what labels are for.
|
||||
|
||||
It is also helpful to attach a project (.3mf or .curaproject) file and Cura log file so we can debug issues quicker.
|
||||
Information about how to find the log file can be found at https://github.com/Ultimaker/Cura/wiki/Cura-Preferences-and-Settings-Locations. To upload a project, try changing the extension to e.g. .curaproject.3mf.zip so that github accepts uploading the file. Otherwise we recommend http://wetransfer.com, but other file hosts like Google Drive or Dropbox work well too.
|
||||
Also, please note the application version in the title of the issue. For example: "[3.2.1] Cannot connect to 3rd-party printer". Please do NOT write things like "Request:" or "[BUG]" in the title; this is what labels are for.
|
||||
|
||||
Thank you for using Cura!
|
||||
-->
|
||||
|
@ -15,14 +21,17 @@ Thank you for using Cura!
|
|||
(The version of the application this issue occurs with.)
|
||||
|
||||
**Platform**
|
||||
(Information about the operating system the issue occurs on. Include at least the operating system. In the case of visual glitches/issues, also include information about your graphics drivers and GPU.)
|
||||
(Information about the operating system the issue occurs on. Include at least the operating system and maybe GPU.)
|
||||
|
||||
**Printer**
|
||||
(Which printer was selected in Cura? If possible, please attach project file as .curaproject.3mf.zip.)
|
||||
(Which printer was selected in Cura?)
|
||||
|
||||
**Reproduction steps**
|
||||
1. Something you did.
|
||||
2. Something you did next.
|
||||
1. (Something you did.)
|
||||
2. (Something you did next.)
|
||||
|
||||
**Screenshot(s)**
|
||||
(Image showing the problem, perhaps before/after images.)
|
||||
|
||||
**Actual results**
|
||||
(What happens after the above steps have been followed.)
|
||||
|
@ -30,5 +39,11 @@ Thank you for using Cura!
|
|||
**Expected results**
|
||||
(What should happen after the above steps have been followed.)
|
||||
|
||||
**Project file**
|
||||
(For slicing bugs, provide a project which clearly shows the bug, by going to File->Save. For big files you may need to use WeTransfer or similar file sharing sites.)
|
||||
|
||||
**Log file**
|
||||
(See https://github.com/Ultimaker/Cura#logging-issues to find the log file to upload, or copy a relevant snippet from it.)
|
||||
|
||||
**Additional information**
|
||||
(Extra information relevant to the issue, like screenshots. Don't forget to attach the log files with this issue report.)
|
||||
(Extra information relevant to the issue.)
|
||||
|
|
23
.github/ISSUE_TEMPLATE/bug-report.md
vendored
23
.github/ISSUE_TEMPLATE/bug-report.md
vendored
|
@ -14,10 +14,6 @@ Before filing, PLEASE check if the issue already exists (either open or closed)
|
|||
|
||||
Also, please note the application version in the title of the issue. For example: "[3.2.1] Cannot connect to 3rd-party printer". Please do NOT write things like "Request:" or "[BUG]" in the title; this is what labels are for.
|
||||
|
||||
It is also helpful to attach a project (.3mf or .curaproject) file and Cura log file so we can debug issues quicker. Information about how to find the log file can be found at https://github.com/Ultimaker/Cura#logging-issues
|
||||
|
||||
To upload a project, try changing the extension to e.g. .curaproject.3mf.zip so that GitHub accepts uploading the file. Otherwise, we recommend http://wetransfer.com, but other file hosts like Google Drive or Dropbox work well too.
|
||||
|
||||
Thank you for using Cura!
|
||||
-->
|
||||
|
||||
|
@ -25,14 +21,17 @@ Thank you for using Cura!
|
|||
(The version of the application this issue occurs with.)
|
||||
|
||||
**Platform**
|
||||
(Information about the operating system the issue occurs on. Include at least the operating system. In the case of visual glitches/issues, also include information about your graphics drivers and GPU.)
|
||||
(Information about the operating system the issue occurs on. Include at least the operating system and maybe GPU.)
|
||||
|
||||
**Printer**
|
||||
(Which printer was selected in Cura? If possible, please attach project file as .curaproject.3mf.zip.)
|
||||
(Which printer was selected in Cura?)
|
||||
|
||||
**Reproduction steps**
|
||||
1. Something you did.
|
||||
2. Something you did next.
|
||||
1. (Something you did.)
|
||||
2. (Something you did next.)
|
||||
|
||||
**Screenshot(s)**
|
||||
(Image showing the problem, perhaps before/after images.)
|
||||
|
||||
**Actual results**
|
||||
(What happens after the above steps have been followed.)
|
||||
|
@ -40,5 +39,11 @@ Thank you for using Cura!
|
|||
**Expected results**
|
||||
(What should happen after the above steps have been followed.)
|
||||
|
||||
**Project file**
|
||||
(For slicing bugs, provide a project which clearly shows the bug, by going to File->Save. For big files you may need to use WeTransfer or similar file sharing sites.)
|
||||
|
||||
**Log file**
|
||||
(See https://github.com/Ultimaker/Cura#logging-issues to find the log file to upload, or copy a relevant snippet from it.)
|
||||
|
||||
**Additional information**
|
||||
(Extra information relevant to the issue, like screenshots. Don't forget to attach the log files with this issue report.)
|
||||
(Extra information relevant to the issue.)
|
||||
|
|
13
.github/workflows/cicd.yml
vendored
Normal file
13
.github/workflows/cicd.yml
vendored
Normal file
|
@ -0,0 +1,13 @@
|
|||
---
|
||||
name: CI/CD
|
||||
on: [push, pull_request]
|
||||
jobs:
|
||||
build:
|
||||
name: Build and test
|
||||
runs-on: ubuntu-latest
|
||||
container: ultimaker/cura-build-environment
|
||||
steps:
|
||||
- name: Checkout master
|
||||
uses: actions/checkout@v1.2.0
|
||||
- name: Build and test
|
||||
run: docker/build.sh
|
|
@ -1,16 +0,0 @@
|
|||
image: registry.gitlab.com/ultimaker/cura/cura-build-environment:centos7
|
||||
|
||||
stages:
|
||||
- build
|
||||
|
||||
build and test linux:
|
||||
stage: build
|
||||
tags:
|
||||
- cura
|
||||
- docker
|
||||
- linux
|
||||
script:
|
||||
- docker/build.sh
|
||||
artifacts:
|
||||
paths:
|
||||
- build
|
|
@ -22,13 +22,6 @@ try:
|
|||
except ImportError:
|
||||
CuraAppName = DEFAULT_CURA_APP_NAME
|
||||
|
||||
try:
|
||||
from cura.CuraVersion import CuraAppDisplayName # type: ignore
|
||||
if CuraAppDisplayName == "":
|
||||
CuraAppDisplayName = DEFAULT_CURA_DISPLAY_NAME
|
||||
except ImportError:
|
||||
CuraAppDisplayName = DEFAULT_CURA_DISPLAY_NAME
|
||||
|
||||
try:
|
||||
from cura.CuraVersion import CuraVersion # type: ignore
|
||||
if CuraVersion == "":
|
||||
|
@ -53,3 +46,13 @@ except ImportError:
|
|||
# Various convenience flags indicating what kind of Cura build it is.
|
||||
__ENTERPRISE_VERSION_TYPE = "enterprise"
|
||||
IsEnterpriseVersion = CuraBuildType.lower() == __ENTERPRISE_VERSION_TYPE
|
||||
|
||||
try:
|
||||
from cura.CuraVersion import CuraAppDisplayName # type: ignore
|
||||
if CuraAppDisplayName == "":
|
||||
CuraAppDisplayName = DEFAULT_CURA_DISPLAY_NAME
|
||||
if IsEnterpriseVersion:
|
||||
CuraAppDisplayName = CuraAppDisplayName + " Enterprise"
|
||||
|
||||
except ImportError:
|
||||
CuraAppDisplayName = DEFAULT_CURA_DISPLAY_NAME
|
||||
|
|
|
@ -1102,7 +1102,7 @@ class BuildVolume(SceneNode):
|
|||
|
||||
# If we are printing one at a time, we need to add the bed adhesion size to the disallowed areas of the objects
|
||||
if container_stack.getProperty("print_sequence", "value") == "one_at_a_time":
|
||||
return 0.1 # Return a very small value, so we do draw disallowed area's near the edges.
|
||||
return 0.1
|
||||
|
||||
bed_adhesion_size = self._calculateBedAdhesionSize(used_extruders)
|
||||
support_expansion = self._calculateSupportExpansion(self._global_container_stack)
|
||||
|
|
|
@ -67,11 +67,9 @@ from cura.Scene.BuildPlateDecorator import BuildPlateDecorator
|
|||
from cura.Scene.ConvexHullDecorator import ConvexHullDecorator
|
||||
from cura.Scene.CuraSceneController import CuraSceneController
|
||||
from cura.Scene.CuraSceneNode import CuraSceneNode
|
||||
from cura.Scene.GCodeListDecorator import GCodeListDecorator
|
||||
|
||||
from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator
|
||||
from cura.Scene import ZOffsetDecorator
|
||||
|
||||
from cura.Machines.ContainerTree import ContainerTree
|
||||
from cura.Machines.MachineErrorChecker import MachineErrorChecker
|
||||
|
||||
from cura.Machines.Models.BuildPlateModel import BuildPlateModel
|
||||
|
@ -145,7 +143,7 @@ class CuraApplication(QtApplication):
|
|||
# SettingVersion represents the set of settings available in the machine/extruder definitions.
|
||||
# You need to make sure that this version number needs to be increased if there is any non-backwards-compatible
|
||||
# changes of the settings.
|
||||
SettingVersion = 10
|
||||
SettingVersion = 11
|
||||
|
||||
Created = False
|
||||
|
||||
|
@ -170,7 +168,7 @@ class CuraApplication(QtApplication):
|
|||
app_display_name = ApplicationMetadata.CuraAppDisplayName,
|
||||
version = ApplicationMetadata.CuraVersion,
|
||||
api_version = ApplicationMetadata.CuraSDKVersion,
|
||||
buildtype = ApplicationMetadata.CuraBuildType,
|
||||
build_type = ApplicationMetadata.CuraBuildType,
|
||||
is_debug_mode = ApplicationMetadata.CuraDebugMode,
|
||||
tray_icon_name = "cura-icon-32.png",
|
||||
**kwargs)
|
||||
|
|
|
@ -162,6 +162,7 @@ class MachineNode(ContainerNode):
|
|||
container_registry = ContainerRegistry.getInstance()
|
||||
if not self.has_variants:
|
||||
self.variants["empty"] = VariantNode("empty_variant", machine = self)
|
||||
self.variants["empty"].materialsChanged.connect(self.materialsChanged)
|
||||
else:
|
||||
# Find all the variants for this definition ID.
|
||||
variants = container_registry.findInstanceContainersMetadata(type = "variant", definition = self.container_id, hardware_type = "nozzle")
|
||||
|
|
|
@ -167,15 +167,21 @@ class VariantNode(ContainerNode):
|
|||
# Search for any submaterials from that base file that are still left.
|
||||
materials_same_base_file = ContainerRegistry.getInstance().findContainersMetadata(base_file = base_file)
|
||||
if materials_same_base_file:
|
||||
most_specific_submaterial = materials_same_base_file[0]
|
||||
most_specific_submaterial = None
|
||||
for submaterial in materials_same_base_file:
|
||||
if submaterial["definition"] == self.machine.container_id:
|
||||
if most_specific_submaterial["definition"] == "fdmprinter":
|
||||
if submaterial.get("variant_name", "empty") == self.variant_name:
|
||||
most_specific_submaterial = submaterial
|
||||
if most_specific_submaterial.get("variant_name", "empty") == "empty" and submaterial.get("variant_name", "empty") == self.variant_name:
|
||||
break # most specific match possible
|
||||
if submaterial.get("variant_name", "empty") == "empty":
|
||||
most_specific_submaterial = submaterial
|
||||
self.materials[base_file] = MaterialNode(most_specific_submaterial["id"], variant = self)
|
||||
self.materialsChanged.emit(self.materials[base_file])
|
||||
|
||||
if most_specific_submaterial is None:
|
||||
Logger.log("w", "Material %s removed, but no suitable replacement found", base_file)
|
||||
else:
|
||||
Logger.log("i", "Material %s (%s) overridden by %s", base_file, self.variant_name, most_specific_submaterial.get("id"))
|
||||
self.materials[base_file] = MaterialNode(most_specific_submaterial["id"], variant = self)
|
||||
self.materialsChanged.emit(self.materials[base_file])
|
||||
|
||||
if not self.materials: # The last available material just got deleted and there is nothing with the same base file to replace it.
|
||||
self.materials["empty_material"] = MaterialNode("empty_material", variant = self)
|
||||
|
|
|
@ -154,7 +154,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice):
|
|||
part = QHttpPart()
|
||||
|
||||
if not content_header.startswith("form-data;"):
|
||||
content_header = "form_data; " + content_header
|
||||
content_header = "form-data; " + content_header
|
||||
part.setHeader(QNetworkRequest.ContentDispositionHeader, content_header)
|
||||
|
||||
if content_type is not None:
|
||||
|
|
|
@ -88,27 +88,34 @@ class ConvexHullDecorator(SceneNodeDecorator):
|
|||
|
||||
return self._add2DAdhesionMargin(hull)
|
||||
|
||||
## Get the unmodified 2D projected convex hull with 2D adhesion area of the node (if any)
|
||||
## Get the unmodified 2D projected convex hull of the node (if any)
|
||||
# In case of one-at-a-time, this includes adhesion and head+fans clearance
|
||||
def getConvexHull(self) -> Optional[Polygon]:
|
||||
if self._node is None:
|
||||
return None
|
||||
if self._node.callDecoration("isNonPrintingMesh"):
|
||||
return None
|
||||
hull = self._compute2DConvexHull()
|
||||
|
||||
if self._global_stack and self._node is not None and hull is not None:
|
||||
# Parent can be None if node is just loaded.
|
||||
if self._global_stack.getProperty("print_sequence", "value") == "one_at_a_time" and not self.hasGroupAsParent(self._node):
|
||||
hull = hull.getMinkowskiHull(Polygon(numpy.array(self._global_stack.getProperty("machine_head_polygon", "value"), numpy.float32)))
|
||||
hull = self._add2DAdhesionMargin(hull)
|
||||
return hull
|
||||
# Parent can be None if node is just loaded.
|
||||
if self._isSingularOneAtATimeNode():
|
||||
hull = self.getConvexHullHeadFull()
|
||||
if hull is None:
|
||||
return None
|
||||
hull = self._add2DAdhesionMargin(hull)
|
||||
return hull
|
||||
|
||||
## Get the convex hull of the node with the full head size
|
||||
return self._compute2DConvexHull()
|
||||
|
||||
## For one at the time this is the convex hull of the node with the full head size
|
||||
# In case of printing all at once this is None.
|
||||
def getConvexHullHeadFull(self) -> Optional[Polygon]:
|
||||
if self._node is None:
|
||||
return None
|
||||
|
||||
return self._compute2DConvexHeadFull()
|
||||
if self._isSingularOneAtATimeNode():
|
||||
return self._compute2DConvexHeadFull()
|
||||
|
||||
return None
|
||||
|
||||
@staticmethod
|
||||
def hasGroupAsParent(node: "SceneNode") -> bool:
|
||||
|
@ -118,38 +125,47 @@ class ConvexHullDecorator(SceneNodeDecorator):
|
|||
return bool(parent.callDecoration("isGroup"))
|
||||
|
||||
## Get convex hull of the object + head size
|
||||
# In case of printing all at once this is the same as the convex hull.
|
||||
# In case of printing all at once this is None.
|
||||
# For one at the time this is area with intersection of mirrored head
|
||||
def getConvexHullHead(self) -> Optional[Polygon]:
|
||||
if self._node is None:
|
||||
return None
|
||||
if self._node.callDecoration("isNonPrintingMesh"):
|
||||
return None
|
||||
if self._global_stack:
|
||||
if self._global_stack.getProperty("print_sequence", "value") == "one_at_a_time" and not self.hasGroupAsParent(self._node):
|
||||
head_with_fans = self._compute2DConvexHeadMin()
|
||||
if head_with_fans is None:
|
||||
return None
|
||||
head_with_fans_with_adhesion_margin = self._add2DAdhesionMargin(head_with_fans)
|
||||
return head_with_fans_with_adhesion_margin
|
||||
if self._isSingularOneAtATimeNode():
|
||||
head_with_fans = self._compute2DConvexHeadMin()
|
||||
if head_with_fans is None:
|
||||
return None
|
||||
head_with_fans_with_adhesion_margin = self._add2DAdhesionMargin(head_with_fans)
|
||||
return head_with_fans_with_adhesion_margin
|
||||
return None
|
||||
|
||||
## Get convex hull of the node
|
||||
# In case of printing all at once this is the same as the convex hull.
|
||||
# In case of printing all at once this None??
|
||||
# For one at the time this is the area without the head.
|
||||
def getConvexHullBoundary(self) -> Optional[Polygon]:
|
||||
if self._node is None:
|
||||
return None
|
||||
|
||||
|
||||
if self._node.callDecoration("isNonPrintingMesh"):
|
||||
return None
|
||||
|
||||
if self._global_stack:
|
||||
if self._global_stack.getProperty("print_sequence", "value") == "one_at_a_time" and not self.hasGroupAsParent(self._node):
|
||||
# Printing one at a time and it's not an object in a group
|
||||
return self._compute2DConvexHull()
|
||||
if self._isSingularOneAtATimeNode():
|
||||
# Printing one at a time and it's not an object in a group
|
||||
return self._compute2DConvexHull()
|
||||
return None
|
||||
|
||||
## Get the buildplate polygon where will be printed
|
||||
# In case of printing all at once this is the same as convex hull (no individual adhesion)
|
||||
# For one at the time this includes the adhesion area
|
||||
def getPrintingArea(self) -> Optional[Polygon]:
|
||||
if self._isSingularOneAtATimeNode():
|
||||
# In one-at-a-time mode, every printed object gets it's own adhesion
|
||||
printing_area = self.getAdhesionArea()
|
||||
else:
|
||||
printing_area = self.getConvexHull()
|
||||
return printing_area
|
||||
|
||||
## The same as recomputeConvexHull, but using a timer if it was set.
|
||||
def recomputeConvexHullDelayed(self) -> None:
|
||||
if self._recompute_convex_hull_timer is not None:
|
||||
|
@ -172,10 +188,9 @@ class ConvexHullDecorator(SceneNodeDecorator):
|
|||
self._convex_hull_node = None
|
||||
return
|
||||
|
||||
convex_hull = self.getConvexHull()
|
||||
if self._convex_hull_node:
|
||||
self._convex_hull_node.setParent(None)
|
||||
hull_node = ConvexHullNode.ConvexHullNode(self._node, convex_hull, self._raft_thickness, root)
|
||||
hull_node = ConvexHullNode.ConvexHullNode(self._node, self.getPrintingArea(), self._raft_thickness, root)
|
||||
self._convex_hull_node = hull_node
|
||||
|
||||
def _onSettingValueChanged(self, key: str, property_name: str) -> None:
|
||||
|
@ -416,6 +431,14 @@ class ConvexHullDecorator(SceneNodeDecorator):
|
|||
return True
|
||||
return self.__isDescendant(root, node.getParent())
|
||||
|
||||
## True if print_sequence is one_at_a_time and _node is not part of a group
|
||||
def _isSingularOneAtATimeNode(self) -> bool:
|
||||
if self._node is None:
|
||||
return False
|
||||
return self._global_stack is not None \
|
||||
and self._global_stack.getProperty("print_sequence", "value") == "one_at_a_time" \
|
||||
and not self.hasGroupAsParent(self._node)
|
||||
|
||||
_affected_settings = [
|
||||
"adhesion_type", "raft_margin", "print_sequence",
|
||||
"skirt_gap", "skirt_line_count", "skirt_brim_line_width", "skirt_distance", "brim_line_count"]
|
||||
|
|
|
@ -46,6 +46,7 @@ class ConvexHullNode(SceneNode):
|
|||
|
||||
# The node this mesh is "watching"
|
||||
self._node = node
|
||||
# Area of the head + fans for display as a shadow on the buildplate
|
||||
self._convex_hull_head_mesh = None # type: Optional[MeshData]
|
||||
|
||||
self._node.decoratorsChanged.connect(self._onNodeDecoratorsChanged)
|
||||
|
@ -79,14 +80,17 @@ class ConvexHullNode(SceneNode):
|
|||
|
||||
if self.getParent():
|
||||
if self.getMeshData() and isinstance(self._node, SceneNode) and self._node.callDecoration("getBuildPlateNumber") == Application.getInstance().getMultiBuildPlateModel().activeBuildPlate:
|
||||
# The object itself (+ adhesion in one-at-a-time mode)
|
||||
renderer.queueNode(self, transparent = True, shader = ConvexHullNode.shader, backface_cull = True, sort = -8)
|
||||
if self._convex_hull_head_mesh:
|
||||
# The full head. Rendered as a hint to the user: If this area overlaps another object A; this object
|
||||
# cannot be printed after A, because the head would hit A while printing the current object
|
||||
renderer.queueNode(self, shader = ConvexHullNode.shader, transparent = True, mesh = self._convex_hull_head_mesh, backface_cull = True, sort = -8)
|
||||
|
||||
return True
|
||||
|
||||
def _onNodeDecoratorsChanged(self, node: SceneNode) -> None:
|
||||
convex_hull_head = self._node.callDecoration("getConvexHullHead")
|
||||
convex_hull_head = self._node.callDecoration("getConvexHullHeadFull")
|
||||
if convex_hull_head:
|
||||
convex_hull_head_builder = MeshBuilder()
|
||||
convex_hull_head_builder.addConvexPolygon(convex_hull_head.getPoints(), self._mesh_height - self._thickness)
|
||||
|
|
|
@ -88,7 +88,7 @@ class CuraSceneNode(SceneNode):
|
|||
|
||||
## Return if any area collides with the convex hull of this scene node
|
||||
def collidesWithAreas(self, areas: List[Polygon]) -> bool:
|
||||
convex_hull = self.callDecoration("getConvexHull")
|
||||
convex_hull = self.callDecoration("getPrintingArea")
|
||||
if convex_hull:
|
||||
if not convex_hull.isValid():
|
||||
return False
|
||||
|
|
|
@ -1008,9 +1008,9 @@ class MachineManager(QObject):
|
|||
|
||||
# Set quality and quality_changes for each ExtruderStack
|
||||
for position, node in quality_group.nodes_for_extruders.items():
|
||||
self._global_container_stack.extruders[str(position)].quality = node.container
|
||||
self._global_container_stack.extruderList[position].quality = node.container
|
||||
if empty_quality_changes:
|
||||
self._global_container_stack.extruders[str(position)].qualityChanges = empty_quality_changes_container
|
||||
self._global_container_stack.extruderList[position].qualityChanges = empty_quality_changes_container
|
||||
|
||||
self.activeQualityGroupChanged.emit()
|
||||
self.activeQualityChangesGroupChanged.emit()
|
||||
|
@ -1241,12 +1241,15 @@ class MachineManager(QObject):
|
|||
if not new_machine:
|
||||
new_machine = CuraStackBuilder.createMachine(machine_definition_id + "_sync", machine_definition_id)
|
||||
if not new_machine:
|
||||
Logger.log("e", "Failed to create new machine when switching configuration.")
|
||||
return
|
||||
|
||||
for metadata_key in self._global_container_stack.getMetaData():
|
||||
if metadata_key in new_machine.getMetaData():
|
||||
continue # Don't copy the already preset stuff.
|
||||
new_machine.setMetaDataEntry(metadata_key, self._global_container_stack.getMetaDataEntry(metadata_key))
|
||||
# Special case, group_id should be overwritten!
|
||||
new_machine.setMetaDataEntry("group_id", self._global_container_stack.getMetaDataEntry("group_id"))
|
||||
else:
|
||||
Logger.log("i", "Found a %s with the key %s. Let's use it!", machine_name, self.activeMachineNetworkKey())
|
||||
|
||||
|
@ -1254,8 +1257,22 @@ class MachineManager(QObject):
|
|||
new_machine.setMetaDataEntry("hidden", False)
|
||||
self._global_container_stack.setMetaDataEntry("hidden", True)
|
||||
|
||||
# The new_machine does not contain user changes (global or per-extruder user changes).
|
||||
# Keep a temporary copy of the global and per-extruder user changes and transfer them to the user changes
|
||||
# of the new machine after the new_machine becomes active.
|
||||
global_user_changes = self._global_container_stack.userChanges
|
||||
per_extruder_user_changes = {}
|
||||
for extruder_name, extruder_stack in self._global_container_stack.extruders.items():
|
||||
per_extruder_user_changes[extruder_name] = extruder_stack.userChanges
|
||||
|
||||
self.setActiveMachine(new_machine.getId())
|
||||
|
||||
# Apply the global and per-extruder userChanges to the new_machine (which is of different type than the
|
||||
# previous one).
|
||||
self._global_container_stack.setUserChanges(global_user_changes)
|
||||
for extruder_name in self._global_container_stack.extruders.keys():
|
||||
self._global_container_stack.extruders[extruder_name].setUserChanges(per_extruder_user_changes[extruder_name])
|
||||
|
||||
@pyqtSlot(QObject)
|
||||
def applyRemoteConfiguration(self, configuration: PrinterConfigurationModel) -> None:
|
||||
if self._global_container_stack is None:
|
||||
|
|
|
@ -7,14 +7,21 @@ from PyQt5.QtWidgets import QSplashScreen
|
|||
|
||||
from UM.Resources import Resources
|
||||
from UM.Application import Application
|
||||
from cura import ApplicationMetadata
|
||||
|
||||
|
||||
class CuraSplashScreen(QSplashScreen):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self._scale = 0.7
|
||||
self._version_y_offset = 0 # when extra visual elements are in the background image, move version text down
|
||||
|
||||
if ApplicationMetadata.IsEnterpriseVersion:
|
||||
splash_image = QPixmap(Resources.getPath(Resources.Images, "cura_enterprise.png"))
|
||||
self._version_y_offset = 26
|
||||
else:
|
||||
splash_image = QPixmap(Resources.getPath(Resources.Images, "cura.png"))
|
||||
|
||||
splash_image = QPixmap(Resources.getPath(Resources.Images, "cura.png"))
|
||||
self.setPixmap(splash_image)
|
||||
|
||||
self._current_message = ""
|
||||
|
@ -52,20 +59,17 @@ class CuraSplashScreen(QSplashScreen):
|
|||
painter.setRenderHint(QPainter.Antialiasing, True)
|
||||
|
||||
version = Application.getInstance().getVersion().split("-")
|
||||
buildtype = Application.getInstance().getBuildType()
|
||||
if buildtype:
|
||||
version[0] += " (%s)" % buildtype
|
||||
|
||||
# Draw version text
|
||||
font = QFont() # Using system-default font here
|
||||
font.setPixelSize(37)
|
||||
font.setPixelSize(18)
|
||||
painter.setFont(font)
|
||||
painter.drawText(60, 66, 330 * self._scale, 230 * self._scale, Qt.AlignLeft | Qt.AlignTop, version[0])
|
||||
painter.drawText(60, 70 + self._version_y_offset, 330 * self._scale, 230 * self._scale, Qt.AlignLeft | Qt.AlignTop, version[0])
|
||||
if len(version) > 1:
|
||||
font.setPixelSize(16)
|
||||
painter.setFont(font)
|
||||
painter.setPen(QColor(200, 200, 200, 255))
|
||||
painter.drawText(247, 105, 330 * self._scale, 255 * self._scale, Qt.AlignLeft | Qt.AlignTop, version[1])
|
||||
painter.drawText(247, 105 + self._version_y_offset, 330 * self._scale, 255 * self._scale, Qt.AlignLeft | Qt.AlignTop, version[1])
|
||||
painter.setPen(QColor(255, 255, 255, 255))
|
||||
|
||||
# Draw the loading image
|
||||
|
|
|
@ -298,9 +298,7 @@ class PrintInformation(QObject):
|
|||
|
||||
# Only update the job name when it's not user-specified.
|
||||
if not self._is_user_specified_job_name:
|
||||
if self._pre_sliced:
|
||||
self._job_name = catalog.i18nc("@label", "Pre-sliced file {0}", base_name)
|
||||
elif self._application.getInstance().getPreferences().getValue("cura/jobname_prefix"):
|
||||
if self._application.getInstance().getPreferences().getValue("cura/jobname_prefix") and not self._pre_sliced:
|
||||
# Don't add abbreviation if it already has the exact same abbreviation.
|
||||
if base_name.startswith(self._abbr_machine + "_"):
|
||||
self._job_name = base_name
|
||||
|
|
190
plugins/PostProcessingPlugin/scripts/ColorMix.py
Normal file
190
plugins/PostProcessingPlugin/scripts/ColorMix.py
Normal file
|
@ -0,0 +1,190 @@
|
|||
# ColorMix script - 2-1 extruder color mix and blending
|
||||
# This script is specific for the Geeetech A10M dual extruder but should work with other Marlin printers.
|
||||
# It runs with the PostProcessingPlugin which is released under the terms of the AGPLv3 or higher.
|
||||
# This script is licensed under the Creative Commons - Attribution - Share Alike (CC BY-SA) terms
|
||||
|
||||
#Authors of the 2-1 ColorMix plug-in / script:
|
||||
# Written by John Hryb - john.hryb.4@gmail.com
|
||||
|
||||
##history / change-log:
|
||||
##V1.0.0
|
||||
|
||||
## Uses -
|
||||
## M163 - Set Mix Factor
|
||||
## M164 - Save Mix - saves to T3 as a unique mix
|
||||
|
||||
import re #To perform the search and replace.
|
||||
from ..Script import Script
|
||||
|
||||
class ColorMix(Script):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
def getSettingDataString(self):
|
||||
return """{
|
||||
"name":"ColorMix 2-1",
|
||||
"key":"ColorMix 2-1",
|
||||
"metadata": {},
|
||||
"version": 2,
|
||||
"settings":
|
||||
{
|
||||
"measurement_units":
|
||||
{
|
||||
"label": "Units of measurement",
|
||||
"description": "Input value as mm or layer number.",
|
||||
"type": "enum",
|
||||
"options": {"mm":"mm","layer":"Layer"},
|
||||
"default_value": "layer"
|
||||
},
|
||||
"start_height":
|
||||
{
|
||||
"label": "Start Height",
|
||||
"description": "Value to start at (mm or layer)",
|
||||
"type": "float",
|
||||
"default_value": 0,
|
||||
"minimum_value": "0"
|
||||
},
|
||||
"behavior":
|
||||
{
|
||||
"label": "Fixed or blend",
|
||||
"description": "Select Fixed (set new mixture) or Blend mode (dynamic mix)",
|
||||
"type": "enum",
|
||||
"options": {"fixed_value":"Fixed","blend_value":"Blend"},
|
||||
"default_value": "fixed_value"
|
||||
},
|
||||
"finish_height":
|
||||
{
|
||||
"label": "Finish Height",
|
||||
"description": "Value to stop at (mm or layer)",
|
||||
"type": "float",
|
||||
"default_value": 0,
|
||||
"minimum_value": "0",
|
||||
"minimum_value_warning": "0.1",
|
||||
"enabled": "c_behavior == 'blend_value'"
|
||||
},
|
||||
"mix_start_ratio":
|
||||
{
|
||||
"label": "Start mix ratio",
|
||||
"description": "First extruder percentage 0-100",
|
||||
"type": "float",
|
||||
"default_value": 100,
|
||||
"minimum_value": "0",
|
||||
"minimum_value_warning": "0",
|
||||
"maximum_value_warning": "100"
|
||||
},
|
||||
"mix_finish_ratio":
|
||||
{
|
||||
"label": "End mix ratio",
|
||||
"description": "First extruder percentage 0-100 to finish blend",
|
||||
"type": "float",
|
||||
"default_value": 0,
|
||||
"minimum_value": "0",
|
||||
"minimum_value_warning": "0",
|
||||
"maximum_value_warning": "100",
|
||||
"enabled": "c_behavior == 'blend_value'"
|
||||
},
|
||||
"notes":
|
||||
{
|
||||
"label": "Notes",
|
||||
"description": "A spot to put a note",
|
||||
"type": "str",
|
||||
"default_value": ""
|
||||
}
|
||||
}
|
||||
}"""
|
||||
def getValue(self, line, key, default = None): #replace default getvalue due to comment-reading feature
|
||||
if not key in line or (";" in line and line.find(key) > line.find(";") and
|
||||
not ";ChangeAtZ" in key and not ";LAYER:" in key):
|
||||
return default
|
||||
subPart = line[line.find(key) + len(key):] #allows for string lengths larger than 1
|
||||
if ";ChangeAtZ" in key:
|
||||
m = re.search("^[0-4]", subPart)
|
||||
elif ";LAYER:" in key:
|
||||
m = re.search("^[+-]?[0-9]*", subPart)
|
||||
else:
|
||||
#the minus at the beginning allows for negative values, e.g. for delta printers
|
||||
m = re.search("^[-]?[0-9]*\.?[0-9]*", subPart)
|
||||
if m == None:
|
||||
return default
|
||||
try:
|
||||
return float(m.group(0))
|
||||
except:
|
||||
return default
|
||||
|
||||
def execute(self, data):
|
||||
#get user variables
|
||||
firstHeight = 0.0
|
||||
secondHeight = 0.0
|
||||
firstMix = 0.0
|
||||
SecondMix = 0.0
|
||||
|
||||
firstHeight = self.getSettingValueByKey("start_height")
|
||||
secondHeight = self.getSettingValueByKey("finish_height")
|
||||
firstMix = self.getSettingValueByKey("mix_start_ratio")
|
||||
SecondMix = self.getSettingValueByKey("mix_finish_ratio")
|
||||
|
||||
#locals
|
||||
layer = 0
|
||||
|
||||
#get layer height
|
||||
layerHeight = .2
|
||||
for active_layer in data:
|
||||
lines = active_layer.split("\n")
|
||||
for line in lines:
|
||||
if ";Layer height: " in line:
|
||||
layerHeight = self.getValue(line, ";Layer height: ", layerHeight)
|
||||
break
|
||||
#get layers to use
|
||||
startLayer = 0
|
||||
endLayer = 0
|
||||
if self.getSettingValueByKey("measurement_units") == "mm":
|
||||
if firstHeight == 0:
|
||||
startLayer = 0
|
||||
else:
|
||||
startLayer = firstHeight / layerHeight
|
||||
if secondHeight == 0:
|
||||
endLayer = 0
|
||||
else:
|
||||
endLayer = secondHeight / layerHeight
|
||||
else: #layer height
|
||||
startLayer = firstHeight
|
||||
endLayer = secondHeight
|
||||
#see if one-shot
|
||||
if self.getSettingValueByKey("behavior") == "fixed_value":
|
||||
endLayer = startLayer
|
||||
firstExtruderIncrements = 0
|
||||
else: #blend
|
||||
firstExtruderIncrements = (SecondMix - firstMix) / (endLayer - startLayer)
|
||||
firstExtruderValue = 0
|
||||
index = 0
|
||||
#start scanning
|
||||
for active_layer in data:
|
||||
modified_gcode = ""
|
||||
lineIndex = 0;
|
||||
lines = active_layer.split("\n")
|
||||
for line in lines:
|
||||
#dont leave blanks
|
||||
if line != "":
|
||||
modified_gcode += line + "\n"
|
||||
# find current layer
|
||||
if ";LAYER:" in line:
|
||||
layer = self.getValue(line, ";LAYER:", layer)
|
||||
if (layer >= startLayer) and (layer <= endLayer): #find layers of interest
|
||||
if lines[lineIndex + 4] == "T2": #check if needing to delete old data
|
||||
del lines[(lineIndex + 1):(lineIndex + 5)]
|
||||
firstExtruderValue = int(((layer - startLayer) * firstExtruderIncrements) + firstMix)
|
||||
if firstExtruderValue == 100:
|
||||
modified_gcode += "M163 S0 P1\n"
|
||||
modified_gcode += "M163 S1 P0\n"
|
||||
elif firstExtruderValue == 0:
|
||||
modified_gcode += "M163 S0 P0\n"
|
||||
modified_gcode += "M163 S1 P1\n"
|
||||
else:
|
||||
modified_gcode += "M163 S0 P0.{:02d}\n".format(firstExtruderValue)
|
||||
modified_gcode += "M163 S1 P0.{:02d}\n".format(100 - firstExtruderValue)
|
||||
modified_gcode += "M164 S2\n"
|
||||
modified_gcode += "T2\n"
|
||||
lineIndex += 1 #for deleting index
|
||||
data[index] = modified_gcode
|
||||
index += 1
|
||||
return data
|
|
@ -1,7 +1,7 @@
|
|||
# Cura PostProcessingPlugin
|
||||
# Author: Mathias Lyngklip Kjeldgaard
|
||||
# Date: July 31, 2019
|
||||
# Modified: ---
|
||||
# Modified: November 26, 2019
|
||||
|
||||
# Description: This plugin displayes the remaining time on the LCD of the printer
|
||||
# using the estimated print-time generated by Cura.
|
||||
|
@ -23,7 +23,7 @@ class DisplayRemainingTimeOnLCD(Script):
|
|||
|
||||
def getSettingDataString(self):
|
||||
return """{
|
||||
"name":"Disaplay Remaining Time on LCD",
|
||||
"name":"Display Remaining Time on LCD",
|
||||
"key":"DisplayRemainingTimeOnLCD",
|
||||
"metadata": {},
|
||||
"version": 2,
|
||||
|
@ -32,7 +32,7 @@ class DisplayRemainingTimeOnLCD(Script):
|
|||
"TurnOn":
|
||||
{
|
||||
"label": "Enable",
|
||||
"description": "When enabled, It will write Time Left: HHMMSS on the display",
|
||||
"description": "When enabled, It will write Time Left: HHMMSS on the display. This is updated every layer.",
|
||||
"type": "bool",
|
||||
"default_value": false
|
||||
}
|
||||
|
|
|
@ -18,6 +18,8 @@ from UM.Logger import Logger
|
|||
from UM.PluginRegistry import PluginRegistry
|
||||
from UM.Qt.Duration import DurationFormat
|
||||
|
||||
from cura import ApplicationMetadata
|
||||
|
||||
from .SliceInfoJob import SliceInfoJob
|
||||
|
||||
|
||||
|
@ -119,6 +121,7 @@ class SliceInfo(QObject, Extension):
|
|||
data["time_stamp"] = time.time()
|
||||
data["schema_version"] = 0
|
||||
data["cura_version"] = application.getVersion()
|
||||
data["cura_build_type"] = ApplicationMetadata.CuraBuildType
|
||||
|
||||
active_mode = Application.getInstance().getPreferences().getValue("cura/active_mode")
|
||||
if active_mode == 0:
|
||||
|
|
|
@ -125,11 +125,11 @@ class ZeroConfClient:
|
|||
if not info.address:
|
||||
info = zero_conf.get_service_info(service_type, name)
|
||||
|
||||
if info:
|
||||
if info and info.address:
|
||||
type_of_device = info.properties.get(b"type", None)
|
||||
if type_of_device:
|
||||
if type_of_device == b"printer":
|
||||
address = '.'.join(map(lambda n: str(n), info.address))
|
||||
address = '.'.join(map(str, info.address))
|
||||
self.addedNetworkCluster.emit(str(name), address, info.properties)
|
||||
else:
|
||||
Logger.log("w", "The type of the found device is '%s', not 'printer'." % type_of_device)
|
||||
|
|
|
@ -239,7 +239,7 @@ class VersionUpgrade41to42(VersionUpgrade):
|
|||
#
|
||||
# This renames the renamed settings in the containers.
|
||||
def upgradeInstanceContainer(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
|
||||
parser = configparser.ConfigParser(interpolation = None)
|
||||
parser = configparser.ConfigParser(interpolation = None, comment_prefixes=())
|
||||
parser.read_string(serialized)
|
||||
|
||||
# Update version number.
|
||||
|
|
|
@ -104,7 +104,7 @@ class VersionUpgrade42to43(VersionUpgrade):
|
|||
#
|
||||
# This renames the renamed settings in the containers.
|
||||
def upgradeInstanceContainer(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
|
||||
parser = configparser.ConfigParser(interpolation = None)
|
||||
parser = configparser.ConfigParser(interpolation = None, comment_prefixes=())
|
||||
parser.read_string(serialized)
|
||||
|
||||
# Update version number.
|
||||
|
|
|
@ -52,7 +52,7 @@ class VersionUpgrade43to44(VersionUpgrade):
|
|||
#
|
||||
# This renames the renamed settings in the containers.
|
||||
def upgradeInstanceContainer(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
|
||||
parser = configparser.ConfigParser(interpolation = None)
|
||||
parser = configparser.ConfigParser(interpolation = None, comment_prefixes=())
|
||||
parser.read_string(serialized)
|
||||
|
||||
# Update version number.
|
||||
|
|
|
@ -0,0 +1,69 @@
|
|||
import configparser
|
||||
from typing import Tuple, List
|
||||
import io
|
||||
from UM.VersionUpgrade import VersionUpgrade
|
||||
|
||||
# Merged preferences: machine_head_polygon and machine_head_with_fans_polygon -> machine_head_with_fans_polygon
|
||||
# When both are present, machine_head_polygon will be removed
|
||||
# When only one of the two is present, it's value will be used
|
||||
|
||||
|
||||
class VersionUpgrade44to45(VersionUpgrade):
|
||||
def getCfgVersion(self, serialised: str) -> int:
|
||||
parser = configparser.ConfigParser(interpolation = None)
|
||||
parser.read_string(serialised)
|
||||
format_version = int(parser.get("general", "version")) # Explicitly give an exception when this fails. That means that the file format is not recognised.
|
||||
setting_version = int(parser.get("metadata", "setting_version", fallback = "0"))
|
||||
return format_version * 1000000 + setting_version
|
||||
|
||||
## Upgrades Preferences to have the new version number.
|
||||
#
|
||||
# This renames the renamed settings in the list of visible settings.
|
||||
def upgradePreferences(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
|
||||
parser = configparser.ConfigParser(interpolation = None)
|
||||
parser.read_string(serialized)
|
||||
|
||||
# Update version number.
|
||||
parser["metadata"]["setting_version"] = "11"
|
||||
|
||||
result = io.StringIO()
|
||||
parser.write(result)
|
||||
return [filename], [result.getvalue()]
|
||||
|
||||
## Upgrades instance containers to have the new version
|
||||
# number.
|
||||
#
|
||||
# This renames the renamed settings in the containers.
|
||||
def upgradeInstanceContainer(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
|
||||
parser = configparser.ConfigParser(interpolation = None, comment_prefixes=())
|
||||
parser.read_string(serialized)
|
||||
|
||||
# Update version number.
|
||||
parser["metadata"]["setting_version"] = "11"
|
||||
|
||||
if "values" in parser:
|
||||
# merge machine_head_with_fans_polygon (preferred) and machine_head_polygon
|
||||
if "machine_head_with_fans_polygon" in parser["values"]:
|
||||
if "machine_head_polygon" in parser["values"]:
|
||||
del parser["values"]["machine_head_polygon"]
|
||||
elif "machine_head_polygon" in parser["values"]:
|
||||
parser["values"]["machine_head_with_fans_polygon"] = parser["values"]["machine_head_polygon"]
|
||||
del parser["values"]["machine_head_polygon"]
|
||||
|
||||
result = io.StringIO()
|
||||
parser.write(result)
|
||||
return [filename], [result.getvalue()]
|
||||
|
||||
## Upgrades stacks to have the new version number.
|
||||
def upgradeStack(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
|
||||
parser = configparser.ConfigParser(interpolation = None)
|
||||
parser.read_string(serialized)
|
||||
|
||||
# Update version number.
|
||||
if "metadata" not in parser:
|
||||
parser["metadata"] = {}
|
||||
parser["metadata"]["setting_version"] = "11"
|
||||
|
||||
result = io.StringIO()
|
||||
parser.write(result)
|
||||
return [filename], [result.getvalue()]
|
61
plugins/VersionUpgrade/VersionUpgrade44to45/__init__.py
Normal file
61
plugins/VersionUpgrade/VersionUpgrade44to45/__init__.py
Normal file
|
@ -0,0 +1,61 @@
|
|||
# Copyright (c) 2019 Ultimaker B.V.
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
from typing import Any, Dict, TYPE_CHECKING
|
||||
|
||||
from . import VersionUpgrade44to45
|
||||
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from UM.Application import Application
|
||||
|
||||
upgrade = VersionUpgrade44to45.VersionUpgrade44to45()
|
||||
|
||||
|
||||
def getMetaData() -> Dict[str, Any]:
|
||||
return {
|
||||
"version_upgrade": {
|
||||
# From To Upgrade function
|
||||
("preferences", 6000010): ("preferences", 6000011, upgrade.upgradePreferences),
|
||||
("machine_stack", 4000010): ("machine_stack", 4000011, upgrade.upgradeStack),
|
||||
("extruder_train", 4000010): ("extruder_train", 4000011, upgrade.upgradeStack),
|
||||
("definition_changes", 4000010): ("definition_changes", 4000011, upgrade.upgradeInstanceContainer),
|
||||
("quality_changes", 4000010): ("quality_changes", 4000011, upgrade.upgradeInstanceContainer),
|
||||
("quality", 4000010): ("quality", 4000011, upgrade.upgradeInstanceContainer),
|
||||
("user", 4000010): ("user", 4000011, upgrade.upgradeInstanceContainer),
|
||||
},
|
||||
"sources": {
|
||||
"preferences": {
|
||||
"get_version": upgrade.getCfgVersion,
|
||||
"location": {"."}
|
||||
},
|
||||
"machine_stack": {
|
||||
"get_version": upgrade.getCfgVersion,
|
||||
"location": {"./machine_instances"}
|
||||
},
|
||||
"extruder_train": {
|
||||
"get_version": upgrade.getCfgVersion,
|
||||
"location": {"./extruders"}
|
||||
},
|
||||
"definition_changes": {
|
||||
"get_version": upgrade.getCfgVersion,
|
||||
"location": {"./definition_changes"}
|
||||
},
|
||||
"quality_changes": {
|
||||
"get_version": upgrade.getCfgVersion,
|
||||
"location": {"./quality_changes"}
|
||||
},
|
||||
"quality": {
|
||||
"get_version": upgrade.getCfgVersion,
|
||||
"location": {"./quality"}
|
||||
},
|
||||
"user": {
|
||||
"get_version": upgrade.getCfgVersion,
|
||||
"location": {"./user"}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
def register(app: "Application") -> Dict[str, Any]:
|
||||
return {"version_upgrade": upgrade}
|
8
plugins/VersionUpgrade/VersionUpgrade44to45/plugin.json
Normal file
8
plugins/VersionUpgrade/VersionUpgrade44to45/plugin.json
Normal file
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"name": "Version Upgrade 4.4 to 4.5",
|
||||
"author": "Ultimaker B.V.",
|
||||
"version": "1.0.0",
|
||||
"description": "Upgrades configurations from Cura 4.4 to Cura 4.5.",
|
||||
"api": "7.0",
|
||||
"i18n-catalog": "cura"
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
import configparser
|
||||
|
||||
import VersionUpgrade44to45
|
||||
import pytest
|
||||
|
||||
before_update = """[general]
|
||||
version = 4
|
||||
name = Creality CR-10S_settings
|
||||
definition = creality_cr10s
|
||||
|
||||
[metadata]
|
||||
type = definition_changes
|
||||
setting_version = 11
|
||||
|
||||
[values]
|
||||
%s
|
||||
"""
|
||||
before_after_list = [
|
||||
("machine_head_with_fans_polygon = [[-99, 99], [-99, -44], [45, 99], [45, -44]]", "[[-99, 99], [-99, -44], [45, 99], [45, -44]]"),
|
||||
("", None),
|
||||
("machine_head_polygon = [[-98, 99], [-99, -44], [45, 99], [45, -44]]", "[[-98, 99], [-99, -44], [45, 99], [45, -44]]"),
|
||||
("machine_head_polygon = [[-87, 99], [-99, -44], [45, 99], [45, -44]]\nmachine_head_with_fans_polygon = [[-99, 99], [-99, -44], [45, 99], [45, -44]]", "[[-99, 99], [-99, -44], [45, 99], [45, -44]]"),
|
||||
]
|
||||
|
||||
|
||||
class TestVersionUpgrade44to45:
|
||||
|
||||
@pytest.mark.parametrize("after_string, after_value", before_after_list)
|
||||
def test_upgrade(self, after_string, after_value):
|
||||
upgrader = VersionUpgrade44to45.VersionUpgrade44to45()
|
||||
|
||||
|
||||
file_name, new_data = upgrader.upgradeInstanceContainer(before_update % after_string, "whatever")
|
||||
parser = configparser.ConfigParser(interpolation=None)
|
||||
parser.read_string(new_data[0])
|
||||
|
||||
if after_value is None:
|
||||
assert "machine_head_with_fans_polygon" not in parser["values"]
|
||||
else:
|
||||
assert parser["values"]["machine_head_with_fans_polygon"] == after_value
|
||||
|
||||
assert "machine_head_polygon" not in parser["values"]
|
|
@ -1104,6 +1104,7 @@ class XmlMaterialProfile(InstanceContainer):
|
|||
"anti ooze retract speed": "material_anti_ooze_retraction_speed",
|
||||
"break preparation position": "material_break_preparation_retracted_position",
|
||||
"break preparation speed": "material_break_preparation_speed",
|
||||
"break preparation temperature": "material_break_preparation_temperature",
|
||||
"break position": "material_break_retracted_position",
|
||||
"break speed": "material_break_speed",
|
||||
"break temperature": "material_break_temperature"
|
||||
|
|
|
@ -88,7 +88,7 @@
|
|||
"adhesion_type": { "default_value": "skirt" },
|
||||
"machine_nozzle_heat_up_speed": { "default_value": 2 },
|
||||
"machine_nozzle_cool_down_speed": { "default_value": 2 },
|
||||
"machine_head_polygon": { "default_value": [[-75, -18],[-75, 35],[18, 35],[18, -18]] },
|
||||
"machine_head_with_fans_polygon": { "default_value": [[-75, -18],[-75, 35],[18, 35],[18, -18]] },
|
||||
"gantry_height": { "value": "55" },
|
||||
"machine_max_feedrate_x": { "default_value": 300 },
|
||||
"machine_max_feedrate_y": { "default_value": 300 },
|
||||
|
|
|
@ -88,7 +88,7 @@
|
|||
"adhesion_type": { "default_value": "skirt" },
|
||||
"machine_nozzle_heat_up_speed": { "default_value": 2 },
|
||||
"machine_nozzle_cool_down_speed": { "default_value": 2 },
|
||||
"machine_head_polygon": { "default_value": [[-75, -18],[-75, 35],[18, 35],[18, -18]] },
|
||||
"machine_head_with_fans_polygon": { "default_value": [[-75, -18],[-75, 35],[18, 35],[18, -18]] },
|
||||
"gantry_height": { "value": "55" },
|
||||
"machine_max_feedrate_x": { "default_value": 300 },
|
||||
"machine_max_feedrate_y": { "default_value": 300 },
|
||||
|
|
|
@ -87,7 +87,7 @@
|
|||
"adhesion_type": { "default_value": "skirt" },
|
||||
"machine_nozzle_heat_up_speed": { "default_value": 2 },
|
||||
"machine_nozzle_cool_down_speed": { "default_value": 2 },
|
||||
"machine_head_polygon": { "default_value": [[-75, -18],[-75, 35],[18, 35],[18, -18]] },
|
||||
"machine_head_with_fans_polygon": { "default_value": [[-75, -18],[-75, 35],[18, 35],[18, -18]] },
|
||||
"gantry_height": { "value": "55" },
|
||||
"machine_max_feedrate_x": { "default_value": 300 },
|
||||
"machine_max_feedrate_y": { "default_value": 300 },
|
||||
|
|
|
@ -7,13 +7,6 @@
|
|||
"machine_width": { "default_value": 300 },
|
||||
"machine_depth": { "default_value": 300 },
|
||||
"machine_height": { "default_value": 400 },
|
||||
"machine_head_polygon": { "default_value": [
|
||||
[-26, 34],
|
||||
[-26, -32],
|
||||
[22, -32],
|
||||
[22, 34]
|
||||
]
|
||||
},
|
||||
"machine_head_with_fans_polygon": { "default_value": [
|
||||
[-26, 34],
|
||||
[-26, -32],
|
||||
|
|
|
@ -8,13 +8,6 @@
|
|||
"machine_width": { "default_value": 450 },
|
||||
"machine_depth": { "default_value": 450 },
|
||||
"machine_height": { "default_value": 470 },
|
||||
"machine_head_polygon": { "default_value": [
|
||||
[-44, 34],
|
||||
[-44, -34],
|
||||
[18, -34],
|
||||
[18, 34]
|
||||
]
|
||||
},
|
||||
"machine_head_with_fans_polygon": { "default_value": [
|
||||
[-44, 34],
|
||||
[-44, -34],
|
||||
|
|
|
@ -7,13 +7,6 @@
|
|||
"machine_width": { "default_value": 300 },
|
||||
"machine_depth": { "default_value": 220 },
|
||||
"machine_height": { "default_value": 300 },
|
||||
"machine_head_polygon": { "default_value": [
|
||||
[-26, 34],
|
||||
[-26, -32],
|
||||
[22, -32],
|
||||
[22, 34]
|
||||
]
|
||||
},
|
||||
"machine_head_with_fans_polygon": { "default_value": [
|
||||
[-26, 34],
|
||||
[-26, -32],
|
||||
|
|
|
@ -7,13 +7,6 @@
|
|||
"machine_width": { "default_value": 400 },
|
||||
"machine_depth": { "default_value": 400 },
|
||||
"machine_height": { "default_value": 400 },
|
||||
"machine_head_polygon": { "default_value": [
|
||||
[-26, 34],
|
||||
[-26, -32],
|
||||
[22, -32],
|
||||
[22, 34]
|
||||
]
|
||||
},
|
||||
"machine_head_with_fans_polygon": { "default_value": [
|
||||
[-26, 34],
|
||||
[-26, -32],
|
||||
|
|
|
@ -7,13 +7,6 @@
|
|||
"machine_width": { "default_value": 500 },
|
||||
"machine_depth": { "default_value": 500 },
|
||||
"machine_height": { "default_value": 500 },
|
||||
"machine_head_polygon": { "default_value": [
|
||||
[-26, 34],
|
||||
[-26, -32],
|
||||
[22, -32],
|
||||
[22, 34]
|
||||
]
|
||||
},
|
||||
"machine_head_with_fans_polygon": { "default_value": [
|
||||
[-26, 34],
|
||||
[-26, -32],
|
||||
|
|
|
@ -5,13 +5,6 @@
|
|||
"overrides": {
|
||||
"machine_name": { "default_value": "Creality CR-10S Pro" },
|
||||
"machine_start_gcode": { "default_value": "M201 X500.00 Y500.00 Z100.00 E5000.00 ;Setup machine max acceleration\nM203 X500.00 Y500.00 Z10.00 E50.00 ;Setup machine max feedrate\nM204 P500.00 R1000.00 T500.00 ;Setup Print/Retract/Travel acceleration\nM205 X8.00 Y8.00 Z0.40 E5.00 ;Setup Jerk\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\n\nG28 ;Home\nM420 S1 Z2 ;Enable ABL using saved Mesh and Fade Height\n\nG92 E0 ;Reset Extruder\nG1 Z2.0 F3000 ;Move Z Axis up\nG1 X10.1 Y20 Z0.28 F5000.0 ;Move to start position\nG1 X10.1 Y200.0 Z0.28 F1500.0 E15 ;Draw the first line\nG1 X10.4 Y200.0 Z0.28 F5000.0 ;Move to side a little\nG1 X10.4 Y20 Z0.28 F1500.0 E30 ;Draw the second line\nG92 E0 ;Reset Extruder\nG1 Z2.0 F3000 ;Move Z Axis up\n"},
|
||||
"machine_head_polygon": { "default_value": [
|
||||
[-44, 34],
|
||||
[-44, -34],
|
||||
[18, -34],
|
||||
[18, 34]
|
||||
]
|
||||
},
|
||||
"machine_head_with_fans_polygon": { "default_value": [
|
||||
[-44, 34],
|
||||
[-44, -34],
|
||||
|
|
|
@ -7,13 +7,6 @@
|
|||
"machine_width": { "default_value": 220 },
|
||||
"machine_depth": { "default_value": 220 },
|
||||
"machine_height": { "default_value": 250 },
|
||||
"machine_head_polygon": { "default_value": [
|
||||
[-26, 34],
|
||||
[-26, -32],
|
||||
[22, -32],
|
||||
[22, 34]
|
||||
]
|
||||
},
|
||||
"machine_head_with_fans_polygon": { "default_value": [
|
||||
[-26, 34],
|
||||
[-26, -32],
|
||||
|
|
|
@ -8,13 +8,6 @@
|
|||
"machine_width": { "default_value": 150 },
|
||||
"machine_depth": { "default_value": 150 },
|
||||
"machine_height": { "default_value": 200 },
|
||||
"machine_head_polygon": { "default_value": [
|
||||
[-26, 34],
|
||||
[-26, -32],
|
||||
[22, -32],
|
||||
[22, 34]
|
||||
]
|
||||
},
|
||||
"machine_head_with_fans_polygon": { "default_value": [
|
||||
[-26, 34],
|
||||
[-26, -32],
|
||||
|
|
|
@ -9,16 +9,14 @@
|
|||
},
|
||||
"overrides": {
|
||||
"machine_name": { "default_value": "Creality Ender-3" },
|
||||
"machine_width": { "default_value": 220 },
|
||||
"machine_depth": { "default_value": 220 },
|
||||
"machine_width": { "default_value": 235 },
|
||||
"machine_depth": { "default_value": 235 },
|
||||
"machine_height": { "default_value": 250 },
|
||||
"machine_head_polygon": { "default_value": [
|
||||
[-1, 1],
|
||||
[-1, -1],
|
||||
[1, -1],
|
||||
[1, 1]
|
||||
]
|
||||
},
|
||||
"machine_disallowed_areas": {
|
||||
"default_value": [
|
||||
[[-117.5, 117.5], [-117.5, 108], [117.5, 108], [117.5, 117.5]],
|
||||
[[-117.5, -108], [-117.5, -117.5], [117.5, -117.5], [117.5, -108]]
|
||||
]},
|
||||
"machine_head_with_fans_polygon": { "default_value": [
|
||||
[-26, 34],
|
||||
[-26, -32],
|
||||
|
@ -26,7 +24,10 @@
|
|||
[32, 34]
|
||||
]
|
||||
},
|
||||
"machine_start_gcode": {
|
||||
"default_value": "; Ender 3 Custom 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.4 Y200.0 Z0.3 F5000.0 ; Move to side a little\nG1 X0.4 Y20 Z0.3 F1500.0 E30 ; Draw the second line\nG92 E0 ; Reset Extruder\nG1 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"
|
||||
},
|
||||
|
||||
"gantry_height": { "value": 25 }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,13 +7,6 @@
|
|||
"machine_width": { "default_value": 452 },
|
||||
"machine_depth": { "default_value": 468 },
|
||||
"machine_height": { "default_value": 482 },
|
||||
"machine_head_polygon": { "default_value": [
|
||||
[-26, 34],
|
||||
[-26, -32],
|
||||
[22, -32],
|
||||
[22, 34]
|
||||
]
|
||||
},
|
||||
"machine_head_with_fans_polygon": { "default_value": [
|
||||
[-26, 34],
|
||||
[-26, -32],
|
||||
|
|
|
@ -8,13 +8,6 @@
|
|||
"machine_width": { "default_value": 220 },
|
||||
"machine_depth": { "default_value": 220 },
|
||||
"machine_height": { "default_value": 300 },
|
||||
"machine_head_polygon": { "default_value": [
|
||||
[-26, 34],
|
||||
[-26, -32],
|
||||
[22, -32],
|
||||
[22, 34]
|
||||
]
|
||||
},
|
||||
"machine_head_with_fans_polygon": { "default_value": [
|
||||
[-26, 34],
|
||||
[-26, -32],
|
||||
|
|
|
@ -8,13 +8,6 @@
|
|||
"machine_width": { "default_value": 350 },
|
||||
"machine_depth": { "default_value": 350 },
|
||||
"machine_height": { "default_value": 400 },
|
||||
"machine_head_polygon": { "default_value": [
|
||||
[-26, 34],
|
||||
[-26, -32],
|
||||
[22, -32],
|
||||
[22, 34]
|
||||
]
|
||||
},
|
||||
"machine_head_with_fans_polygon": { "default_value": [
|
||||
[-26, 34],
|
||||
[-26, -32],
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
"type": "extruder",
|
||||
"author": "Ultimaker",
|
||||
"manufacturer": "Unknown",
|
||||
"setting_version": 10,
|
||||
"setting_version": 11,
|
||||
"visible": false,
|
||||
"position": "0"
|
||||
},
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
"author": "Ultimaker",
|
||||
"category": "Other",
|
||||
"manufacturer": "Unknown",
|
||||
"setting_version": 10,
|
||||
"setting_version": 11,
|
||||
"file_formats": "text/x-gcode;application/x-stl-ascii;application/x-stl-binary;application/x-wavefront-obj;application/x3g",
|
||||
"visible": false,
|
||||
"has_materials": true,
|
||||
|
@ -421,34 +421,6 @@
|
|||
"settable_per_extruder": false,
|
||||
"settable_per_meshgroup": false
|
||||
},
|
||||
"machine_head_polygon":
|
||||
{
|
||||
"label": "Machine Head Polygon",
|
||||
"description": "A 2D silhouette of the print head (fan caps excluded).",
|
||||
"type": "polygon",
|
||||
"default_value":
|
||||
[
|
||||
[
|
||||
-1,
|
||||
1
|
||||
],
|
||||
[
|
||||
-1,
|
||||
-1
|
||||
],
|
||||
[
|
||||
1,
|
||||
-1
|
||||
],
|
||||
[
|
||||
1,
|
||||
1
|
||||
]
|
||||
],
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": false,
|
||||
"settable_per_meshgroup": false
|
||||
},
|
||||
"machine_head_with_fans_polygon":
|
||||
{
|
||||
"label": "Machine Head & Fan Polygon",
|
||||
|
@ -2101,6 +2073,36 @@
|
|||
"settable_per_mesh": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"skin_edge_support_thickness":
|
||||
{
|
||||
"label": "Skin Edge Support Thickness",
|
||||
"description": "The thickness of the extra infill that supports skin edges.",
|
||||
"unit": "mm",
|
||||
"default_value": 0.8,
|
||||
"minimum_value": "0",
|
||||
"maximum_value": "machine_height",
|
||||
"type": "float",
|
||||
"value": "0",
|
||||
"comment": "This was put at 0 to keep the default behaviour the same, but in the original PR the 'value' was: resolveOrValue('infill_sparse_thickness') * (4 if infill_sparse_density < 12.5 else (3 if infill_sparse_density < 25 else (2 if infill_sparse_density < 50 else 1)))",
|
||||
"limit_to_extruder": "infill_extruder_nr",
|
||||
"enabled": "infill_sparse_density > 0",
|
||||
"settable_per_mesh": true,
|
||||
"children":
|
||||
{
|
||||
"skin_edge_support_layers":
|
||||
{
|
||||
"label": "Skin Edge Support Layers",
|
||||
"description": "The number of infill layers that supports skin edges.",
|
||||
"default_value": 4,
|
||||
"minimum_value": "0",
|
||||
"type": "int",
|
||||
"value": "math.ceil(round(skin_edge_support_thickness / resolveOrValue('infill_sparse_thickness'), 4))",
|
||||
"limit_to_extruder": "infill_extruder_nr",
|
||||
"enabled": "infill_sparse_density > 0",
|
||||
"settable_per_mesh": true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -2365,6 +2367,20 @@
|
|||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true
|
||||
},
|
||||
"material_break_preparation_temperature":
|
||||
{
|
||||
"label": "Break Preparation Temperature",
|
||||
"description": "The temperature used to purge material, should be roughly equal to the highest possible printing temperature.",
|
||||
"type": "float",
|
||||
"unit": "°C",
|
||||
"default_value": 50,
|
||||
"value": "material_print_temperature",
|
||||
"enabled": false,
|
||||
"minimum_value": "-273.15",
|
||||
"maximum_value_warning": "300",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true
|
||||
},
|
||||
"material_break_retracted_position":
|
||||
{
|
||||
"label": "Break Retracted Position",
|
||||
|
@ -2723,7 +2739,6 @@
|
|||
"minimum_value": "0",
|
||||
"minimum_value_warning": "line_width * 1.5",
|
||||
"maximum_value_warning": "10",
|
||||
"enabled": false,
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true
|
||||
},
|
||||
|
@ -7151,6 +7166,17 @@
|
|||
"enabled": "bridge_settings_enabled",
|
||||
"settable_per_mesh": true
|
||||
},
|
||||
"bridge_sparse_infill_max_density":
|
||||
{
|
||||
"label": "Bridge Sparse Infill Max Density",
|
||||
"description": "Maximum density of infill considered to be sparse. Skin over sparse infill is considered to be unsupported and so may be treated as a bridge skin.",
|
||||
"unit": "%",
|
||||
"type": "float",
|
||||
"default_value": 0,
|
||||
"minimum_value": "0",
|
||||
"enabled": "bridge_settings_enabled",
|
||||
"settable_per_mesh": true
|
||||
},
|
||||
"bridge_wall_coast":
|
||||
{
|
||||
"label": "Bridge Wall Coasting",
|
||||
|
|
|
@ -59,14 +59,6 @@
|
|||
"adhesion_type": {
|
||||
"default_value": "skirt"
|
||||
},
|
||||
"machine_head_polygon": {
|
||||
"default_value": [
|
||||
[-75, 35],
|
||||
[18, 35],
|
||||
[18, -18],
|
||||
[-75, -18]
|
||||
]
|
||||
},
|
||||
"machine_head_with_fans_polygon": {
|
||||
"default_value": [
|
||||
[-75, 35],
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
"machine_center_is_zero": {
|
||||
"default_value": false
|
||||
},
|
||||
"machine_head_polygon": {
|
||||
"machine_head_with_fans_polygon": {
|
||||
"default_value": [
|
||||
[-75, -18],
|
||||
[-75, 35],
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
"machine_center_is_zero": {
|
||||
"default_value": true
|
||||
},
|
||||
"machine_head_polygon": {
|
||||
"machine_head_with_fans_polygon": {
|
||||
"default_value": [
|
||||
[-43.7, -19.2],
|
||||
[-43.7, 55],
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
"machine_depth": {
|
||||
"default_value": 150
|
||||
},
|
||||
"machine_head_polygon": {
|
||||
"machine_head_with_fans_polygon": {
|
||||
"default_value": [
|
||||
[-30, 34],
|
||||
[-30, -32],
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
"machine_center_is_zero": {
|
||||
"default_value": false
|
||||
},
|
||||
"machine_head_polygon": {
|
||||
"machine_head_with_fans_polygon": {
|
||||
"default_value": [
|
||||
[-75, -18],
|
||||
[-75, 35],
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
"machine_center_is_zero": {
|
||||
"default_value": false
|
||||
},
|
||||
"machine_head_polygon": {
|
||||
"machine_head_with_fans_polygon": {
|
||||
"default_value": [
|
||||
[-75, -18],
|
||||
[-75, 35],
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
"machine_depth": {
|
||||
"default_value": 300
|
||||
},
|
||||
"machine_head_polygon": {
|
||||
"machine_head_with_fans_polygon": {
|
||||
"default_value": [
|
||||
[-30, 34],
|
||||
[-30, -32],
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
"machine_depth": {
|
||||
"default_value": 150
|
||||
},
|
||||
"machine_head_polygon": {
|
||||
"machine_head_with_fans_polygon": {
|
||||
"default_value": [
|
||||
[-30, 34],
|
||||
[-30, -32],
|
||||
|
|
|
@ -31,14 +31,6 @@
|
|||
"machine_center_is_zero": {
|
||||
"default_value": false
|
||||
},
|
||||
"machine_head_polygon": {
|
||||
"default_value": [
|
||||
[-75, -18],
|
||||
[-75, 35],
|
||||
[18, 35],
|
||||
[18, -18]
|
||||
]
|
||||
},
|
||||
"machine_head_with_fans_polygon": {
|
||||
"default_value": [
|
||||
[-75, -18],
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
"machine_center_is_zero": {
|
||||
"default_value": false
|
||||
},
|
||||
"machine_head_polygon": {
|
||||
"machine_head_with_fans_polygon": {
|
||||
"default_value": [
|
||||
[-75, -18],
|
||||
[-75, 35],
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
},
|
||||
|
||||
"overrides": {
|
||||
"machine_head_polygon": { "default_value": [[ 0, 0], [ 0, 0], [ 0, 0], [ 0, 0]] },
|
||||
"machine_head_with_fans_polygon": { "default_value": [[ 0, 0], [ 0, 0], [ 0, 0], [ 0, 0]] },
|
||||
"prime_tower_size": { "default_value": 8.660254037844387 },
|
||||
"layer_height": { "default_value": 0.2 },
|
||||
"speed_print": { "default_value": 40 },
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
"machine_end_gcode": {
|
||||
"default_value": " ; -- END GCODE --\n G1 X0 Y230 ; Get extruder out of way.\n M107 ; Turn off fan\n G91 ; Relative positioning\n G0 Z20 ; Lift extruder up\n T0\n G1 E-1 ; Reduce filament pressure\n M104 T0 S0 ; Turn ectruder heater off\n G90 ; Absolute positioning\n G92 E0 ; Reset extruder position\n M140 S0 ; Disable heated bed\n M84 ; Turn steppers off\n ; -- end of END GCODE --\n"
|
||||
},
|
||||
"machine_head_polygon": { "default_value": [[ 22, 67], [ 22, 51], [ 36, 51], [ 36, 67]] },
|
||||
"machine_head_with_fans_polygon": { "default_value": [[ 22, 67], [ 22, 51], [ 36, 51], [ 36, 67]] },
|
||||
"skirt_gap": { "default_value": 5.0 },
|
||||
"cool_min_layer_time": { "default_value": 10 },
|
||||
"prime_tower_size": { "default_value": 7.745966692414834 },
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
"machine_end_gcode": {
|
||||
"default_value": " ; -- END GCODE --\n G1 X0 Y230 ; Get extruder out of way.\n M107 ; Turn off fan\n G91 ; Relative positioning\n G0 Z20 ; Lift extruder up\n T0\n G1 E-1 ; Reduce filament pressure\n M104 T0 S0 ; Turn extruder heater off\n G90 ; Absolute positioning\n G92 E0 ; Reset extruder position\n M140 S0 ; Disable heated bed\n M84 ; Turn steppers off\n ; -- end of END GCODE --\n"
|
||||
},
|
||||
"machine_head_polygon": { "default_value": [[ 18, 0], [ 18, 65], [ 32, 65], [ 32, 0]] },
|
||||
"machine_head_with_fans_polygon": { "default_value": [[ 18, 0], [ 18, 65], [ 32, 65], [ 32, 0]] },
|
||||
"cool_min_layer_time": { "default_value": 10 },
|
||||
"prime_tower_size": { "default_value": 7.745966692414834 },
|
||||
"skirt_gap": { "default_value": 5.0 },
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
},
|
||||
|
||||
"overrides": {
|
||||
"machine_head_polygon": { "default_value": [[ 16, 30], [ 16, 45], [ 16, 45], [ 16, 30]] },
|
||||
"machine_head_with_fans_polygon": { "default_value": [[ 16, 30], [ 16, 45], [ 16, 45], [ 16, 30]] },
|
||||
"prime_tower_size": { "default_value": 8.660254037844387 },
|
||||
"skirt_gap": { "default_value": 5.0 },
|
||||
"cool_min_layer_time": { "default_value": 15 },
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
"machine_end_gcode": {
|
||||
"default_value": " ; -- END GCODE --\n G1 X0 Y230 ; Get extruder out of way.\n M107 ; Turn off fan\n G91 ; Relative positioning\n G0 Z20 ; Lift extruder up\n T0\n G1 E-1 ; Reduce filament pressure\n M104 T0 S0 ; Turn ectruder heater off\n G90 ; Absolute positioning\n G92 E0 ; Reset extruder position\n M140 S0 ; Disable heated bed\n M84 ; Turn steppers off\n ; -- end of END GCODE --\n"
|
||||
},
|
||||
"machine_head_polygon": { "default_value": [[ 40, 15], [ 40, 60], [ 30, 60], [ 30, 15]] },
|
||||
"machine_head_with_fans_polygon": { "default_value": [[ 40, 15], [ 40, 60], [ 30, 60], [ 30, 15]] },
|
||||
"support_pattern": { "default_value": "grid" },
|
||||
"cool_min_layer_time": { "default_value": 10 },
|
||||
"support_angle": { "default_value": 45 },
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
"machine_height": { "default_value": 200 },
|
||||
"machine_depth": { "default_value": 200 },
|
||||
"machine_center_is_zero": { "default_value": false },
|
||||
"machine_head_polygon":
|
||||
"machine_head_with_fans_polygon":
|
||||
{
|
||||
"default_value":
|
||||
[
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
"machine_center_is_zero": {
|
||||
"default_value": false
|
||||
},
|
||||
"machine_head_polygon": {
|
||||
"machine_head_with_fans_polygon": {
|
||||
"default_value": [
|
||||
[-30, 34],
|
||||
[-30, -32],
|
||||
|
|
|
@ -35,14 +35,6 @@
|
|||
"machine_center_is_zero": {
|
||||
"default_value": false
|
||||
},
|
||||
"machine_head_polygon": {
|
||||
"default_value": [
|
||||
[-60, -18],
|
||||
[-60, 40],
|
||||
[18, 40],
|
||||
[18, -18]
|
||||
]
|
||||
},
|
||||
"machine_head_with_fans_polygon": {
|
||||
"default_value": [
|
||||
[-60, -40],
|
||||
|
@ -58,10 +50,10 @@
|
|||
"default_value": "RepRap (Marlin/Sprinter)"
|
||||
},
|
||||
"machine_start_gcode": {
|
||||
"default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..."
|
||||
"default_value": "M104 T0 S{material_print_temperature_layer_0}\nG28 ;Home extruder\nG90 ;Absolute positioning\nM82 ;Extruder in absolute mode\nG1 Z1 F100\nG92 E0 ;Reset extruder position\nM109 T0 S{material_print_temperature_layer_0}\nG1 E20 F100\nG92 E0 ;Reset extruder position"
|
||||
},
|
||||
"machine_end_gcode": {
|
||||
"default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning"
|
||||
"default_value": "G1 X0 Y0 Z130 ;Get extruder out of way\nM107 ;Turn off fan\n;Disable all extruders\nG91 ;Relative positioning\nT0\nG1 E-1 ;Reduce filament pressure\nM104 T0 S0\nG90 ;Absolute positioning\nG92 E0 ;Reset extruder position\nM140 S0 ;Disable heated bed\nM84 ;Turn steppers off"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -36,14 +36,6 @@
|
|||
"machine_use_extruder_offset_to_offset_coords": {
|
||||
"default_value": true
|
||||
},
|
||||
"machine_head_polygon": {
|
||||
"default_value": [
|
||||
[-60, -18],
|
||||
[-60, 40],
|
||||
[18, 40],
|
||||
[18, -18]
|
||||
]
|
||||
},
|
||||
"machine_head_with_fans_polygon": {
|
||||
"default_value": [
|
||||
[-60, -40],
|
||||
|
|
|
@ -2890,7 +2890,7 @@ msgstr "Coste del filamento"
|
|||
#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:276
|
||||
msgctxt "@label"
|
||||
msgid "Filament weight"
|
||||
msgstr "Anchura del filamento"
|
||||
msgstr "Peso del filamento"
|
||||
|
||||
#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:294
|
||||
msgctxt "@label"
|
||||
|
|
BIN
resources/images/cura_enterprise.png
Normal file
BIN
resources/images/cura_enterprise.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 28 KiB |
|
@ -4,7 +4,7 @@ name = Quick
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
intent_category = quick
|
||||
quality_type = draft
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = fast
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Visual
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
quality_type = fast
|
||||
intent_category = visual
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Visual
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
quality_type = high
|
||||
intent_category = visual
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = normal
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Visual
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
quality_type = normal
|
||||
intent_category = visual
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Quick
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
intent_category = quick
|
||||
quality_type = draft
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = fast
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Visual
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
quality_type = fast
|
||||
intent_category = visual
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Visual
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
quality_type = high
|
||||
intent_category = visual
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = normal
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Visual
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
quality_type = normal
|
||||
intent_category = visual
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Quick
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
intent_category = quick
|
||||
quality_type = draft
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = fast
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Visual
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
quality_type = fast
|
||||
intent_category = visual
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Visual
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
quality_type = high
|
||||
intent_category = visual
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = normal
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Visual
|
|||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
quality_type = normal
|
||||
intent_category = visual
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Quick
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
intent_category = quick
|
||||
quality_type = draft
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = fast
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Visual
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
quality_type = fast
|
||||
intent_category = visual
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Visual
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
quality_type = high
|
||||
intent_category = visual
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = normal
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Visual
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
quality_type = normal
|
||||
intent_category = visual
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Quick
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
intent_category = quick
|
||||
quality_type = draft
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = fast
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Visual
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
quality_type = fast
|
||||
intent_category = visual
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Visual
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
quality_type = high
|
||||
intent_category = visual
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = normal
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Visual
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
quality_type = normal
|
||||
intent_category = visual
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Quick
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
intent_category = quick
|
||||
quality_type = draft
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Accurate
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
intent_category = engineering
|
||||
quality_type = fast
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Visual
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
quality_type = fast
|
||||
intent_category = visual
|
||||
|
|
|
@ -4,7 +4,7 @@ name = Visual
|
|||
definition = ultimaker_s5
|
||||
|
||||
[metadata]
|
||||
setting_version = 10
|
||||
setting_version = 11
|
||||
type = intent
|
||||
quality_type = high
|
||||
intent_category = visual
|
||||
|
|
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