Merge remote-tracking branch 'origin/main' into CURA-9278_choose_printer_dialog

This commit is contained in:
Remco Burema 2022-09-06 23:33:45 +02:00
commit 5866560540
57 changed files with 200 additions and 185 deletions

View file

@ -53,7 +53,6 @@ env:
jobs:
conan-package-create:
if: ${{ github.event.pull_request.head.repo.full_name == github.repository }}
runs-on: ${{ inputs.runs_on }}
steps:

View file

@ -157,8 +157,8 @@ jobs:
channel_metadata = f"{channel}_{no_commits}"
# FIXME: for when we create a new release branch
if latest_branch_version.prerelease == "":
bump_up_minor = int(latest_branch_version.minor) + 1
actual_version = f"{latest_branch_version.major}.{bump_up_minor}.{latest_branch_version.patch}-alpha+{buildmetadata}{channel_metadata}"
bump_up_patch = int(latest_branch_version.patch) + 1
actual_version = f"{latest_branch_version.major}.{latest_branch_version.minor}.{bump_up_patch}-alpha+{buildmetadata}{channel_metadata}"
else:
actual_version = f"{latest_branch_version.major}.{latest_branch_version.minor}.{latest_branch_version.patch}-{latest_branch_version.prerelease.lower()}+{buildmetadata}{channel_metadata}"
else:

View file

@ -1,2 +1,2 @@
conan!=1.51.0,!=1.51.1,!=1.51.2,!=1.51.3,!=1.52.0
conan!=1.51.0,!=1.51.1,!=1.51.2,!=1.51.3
sip

View file

@ -103,7 +103,18 @@ jobs:
- name: Install Linux system requirements
if: ${{ runner.os == 'Linux' }}
run: sudo apt install build-essential checkinstall libegl-dev zlib1g-dev libssl-dev ninja-build autoconf libx11-dev libx11-xcb-dev libfontenc-dev libice-dev libsm-dev libxau-dev libxaw7-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev libxi-dev libxinerama-dev libxkbfile-dev libxmu-dev libxmuu-dev libxpm-dev libxrandr-dev libxrender-dev libxres-dev libxss-dev libxt-dev libxtst-dev libxv-dev libxvmc-dev libxxf86vm-dev xtrans-dev libxcb-render0-dev libxcb-render-util0-dev libxcb-xkb-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-xinerama0-dev xkb-data libxcb-dri3-dev uuid-dev libxcb-util-dev libxkbcommon-x11-dev -y
run: |
sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y
sudo apt update
sudo apt upgrade
sudo apt install build-essential checkinstall libegl-dev zlib1g-dev libssl-dev ninja-build autoconf libx11-dev libx11-xcb-dev libfontenc-dev libice-dev libsm-dev libxau-dev libxaw7-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev libxi-dev libxinerama-dev libxkbfile-dev libxmu-dev libxmuu-dev libxpm-dev libxrandr-dev libxrender-dev libxres-dev libxss-dev libxt-dev libxtst-dev libxv-dev libxvmc-dev libxxf86vm-dev xtrans-dev libxcb-render0-dev libxcb-render-util0-dev libxcb-xkb-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-xinerama0-dev xkb-data libxcb-dri3-dev uuid-dev libxcb-util-dev libxkbcommon-x11-dev pkg-config -y
- name: Install GCC-12 on ubuntu-22.04
if: ${{ startsWith(inputs.runs_on, 'ubuntu-22.04') }}
run: |
sudo apt install g++-12 gcc-12 -y
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 12
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 12
- name: Get Conan configuration
run: conan config install https://github.com/Ultimaker/conan-config.git

View file

@ -16,4 +16,6 @@ Making pull requests
--------------------
If you want to propose a change to Cura's source code, please create a pull request in the appropriate repository (being [Cura](https://github.com/Ultimaker/Cura), [Uranium](https://github.com/Ultimaker/Uranium), [CuraEngine](https://github.com/Ultimaker/CuraEngine), [fdm_materials](https://github.com/Ultimaker/fdm_materials), [libArcus](https://github.com/Ultimaker/libArcus), [cura-build](https://github.com/Ultimaker/cura-build), [cura-build-environment](https://github.com/Ultimaker/cura-build-environment), [libSavitar](https://github.com/Ultimaker/libSavitar), [libCharon](https://github.com/Ultimaker/libCharon) or [cura-binary-data](https://github.com/Ultimaker/cura-binary-data)) and if your change requires changes on multiple of these repositories, please link them together so that we know to merge them together.
The style guide for code contributions to Cura and other Ultimaker projects can be found [here](https://github.com/Ultimaker/Meta/blob/master/general/generic_code_conventions.md).
Some of these repositories will have automated tests running when you create a pull request, indicated by green check marks or red crosses in the Github web page. If you see a red cross, that means that a test has failed. If the test doesn't fail on the Master branch but does fail on your branch, that indicates that you've probably made a mistake and you need to do that. Click on the cross for more details, or run the test locally by running `cmake . && ctest --verbose`.

View file

@ -24,9 +24,12 @@ class LayerPolygon:
PrimeTowerType = 11
__number_of_types = 12
__jump_map = numpy.logical_or(numpy.logical_or(numpy.arange(__number_of_types) == NoneType, numpy.arange(__number_of_types) == MoveCombingType), numpy.arange(__number_of_types) == MoveRetractionType)
__jump_map = numpy.logical_or(numpy.logical_or(numpy.arange(__number_of_types) == NoneType,
numpy.arange(__number_of_types) == MoveCombingType),
numpy.arange(__number_of_types) == MoveRetractionType)
def __init__(self, extruder: int, line_types: numpy.ndarray, data: numpy.ndarray, line_widths: numpy.ndarray, line_thicknesses: numpy.ndarray, line_feedrates: numpy.ndarray) -> None:
def __init__(self, extruder: int, line_types: numpy.ndarray, data: numpy.ndarray,
line_widths: numpy.ndarray, line_thicknesses: numpy.ndarray, line_feedrates: numpy.ndarray) -> None:
"""LayerPolygon, used in ProcessSlicedLayersJob
:param extruder: The position of the extruder
@ -39,10 +42,12 @@ class LayerPolygon:
self._extruder = extruder
self._types = line_types
for i in range(len(self._types)):
if self._types[i] >= self.__number_of_types: # Got faulty line data from the engine.
Logger.log("w", "Found an unknown line type: %s", i)
self._types[i] = self.NoneType
unknown_types = np.where(self_types >= self_number_of_types)
if unknown_types:
# Got faulty line data from the engine.
for idx in unknown_types:
Logger.warn(f"Found an unknown line type at: {idx}")
self._types[idx] = self.NoneType
self._data = data
self._line_widths = line_widths
self._line_thicknesses = line_thicknesses
@ -63,9 +68,11 @@ class LayerPolygon:
self._color_map = LayerPolygon.getColorMap()
self._colors = self._color_map[self._types] # type: numpy.ndarray
# When type is used as index returns true if type == LayerPolygon.InfillType or type == LayerPolygon.SkinType or type == LayerPolygon.SupportInfillType
# When type is used as index returns true if type == LayerPolygon.InfillType
# or type == LayerPolygon.SkinType
# or type == LayerPolygon.SupportInfillType
# Should be generated in better way, not hardcoded.
self._is_infill_or_skin_type_map = numpy.array([0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0], dtype = bool)
self._is_infill_or_skin_type_map = numpy.array([0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0], dtype=bool)
self._build_cache_line_mesh_mask = None # type: Optional[numpy.ndarray]
self._build_cache_needed_points = None # type: Optional[numpy.ndarray]
@ -80,12 +87,14 @@ class LayerPolygon:
# Only if the type of line segment changes do we need to add an extra vertex to change colors
self._build_cache_needed_points[1:, 0][:, numpy.newaxis] = self._types[1:] != self._types[:-1]
# Mark points as unneeded if they are of types we don't want in the line mesh according to the calculated mask
numpy.logical_and(self._build_cache_needed_points, self._build_cache_line_mesh_mask, self._build_cache_needed_points )
numpy.logical_and(self._build_cache_needed_points, self._build_cache_line_mesh_mask, self._build_cache_needed_points)
self._vertex_begin = 0
self._vertex_end = cast(int, numpy.sum(self._build_cache_needed_points))
def build(self, vertex_offset: int, index_offset: int, vertices: numpy.ndarray, colors: numpy.ndarray, line_dimensions: numpy.ndarray, feedrates: numpy.ndarray, extruders: numpy.ndarray, line_types: numpy.ndarray, indices: numpy.ndarray) -> None:
def build(self, vertex_offset: int, index_offset: int, vertices: numpy.ndarray,
colors: numpy.ndarray, line_dimensions: numpy.ndarray, feedrates: numpy.ndarray,
extruders: numpy.ndarray, line_types: numpy.ndarray, indices: numpy.ndarray) -> None:
"""Set all the arrays provided by the function caller, representing the LayerPolygon
The arrays are either by vertex or by indices.
@ -111,10 +120,11 @@ class LayerPolygon:
line_mesh_mask = self._build_cache_line_mesh_mask
needed_points_list = self._build_cache_needed_points
# Index to the points we need to represent the line mesh. This is constructed by generating simple
# start and end points for each line. For line segment n these are points n and n+1. Row n reads [n n+1]
# Then then the indices for the points we don't need are thrown away based on the pre-calculated list.
index_list = ( numpy.arange(len(self._types)).reshape((-1, 1)) + numpy.array([[0, 1]]) ).reshape((-1, 1))[needed_points_list.reshape((-1, 1))]
# Index to the points we need to represent the line mesh.
# This is constructed by generating simple start and end points for each line.
# For line segment n, these are points n and n+1. Row n reads [n n+1]
# Then the indices for the points we don't need are thrown away based on the pre-calculated list.
index_list = (numpy.arange(len(self._types)).reshape((-1, 1)) + numpy.array([[0, 1]])).reshape((-1, 1))[needed_points_list.reshape((-1, 1))]
# The relative values of begin and end indices have already been set in buildCache, so we only need to offset them to the parents offset.
self._vertex_begin += vertex_offset
@ -138,11 +148,12 @@ class LayerPolygon:
# Convert type per vertex to type per line
line_types[self._vertex_begin:self._vertex_end] = numpy.tile(self._types, (1, 2)).reshape((-1, 1))[needed_points_list.ravel()][:, 0]
# The relative values of begin and end indices have already been set in buildCache, so we only need to offset them to the parents offset.
# The relative values of begin and end indices have already been set in buildCache,
# so we only need to offset them to the parents offset.
self._index_begin += index_offset
self._index_end += index_offset
indices[self._index_begin:self._index_end, :] = numpy.arange(self._index_end-self._index_begin, dtype = numpy.int32).reshape((-1, 1))
indices[self._index_begin:self._index_end, :] = numpy.arange(self._index_end-self._index_begin, dtype=numpy.int32).reshape((-1, 1))
# 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))
# Each line segment goes from it's starting point p to p+1, offset by the vertex index.
@ -217,10 +228,9 @@ class LayerPolygon:
normals[:, 1] = 0.0 # We are only interested in 2D normals
# Calculate the edges between points.
# The call to numpy.roll shifts the entire array by one so that
# we end up subtracting each next point from the current, wrapping
# around. This gives us the edges from the next point to the current
# point.
# The call to numpy.roll shifts the entire array by one
# so that we end up subtracting each next point from the current, wrapping around.
# This gives us the edges from the next point to the current point.
normals = numpy.diff(normals, 1, 0)
# Calculate the length of each edge using standard Pythagoras

View file

@ -43,7 +43,7 @@ class MachineErrorChecker(QObject):
self._application = cura.CuraApplication.CuraApplication.getInstance()
self._machine_manager = self._application.getMachineManager()
self._start_time = 0. # measure checking time
self._check_start_time = time.time()
self._setCheckTimer()
@ -160,7 +160,7 @@ class MachineErrorChecker(QObject):
self._stacks_and_keys_to_check.append((stack, key))
self._application.callLater(self._checkStack)
self._start_time = time.time()
self._check_start_time = time.time()
Logger.log("d", "New error check scheduled.")
def _checkStack(self) -> None:
@ -212,12 +212,10 @@ class MachineErrorChecker(QObject):
self._has_errors = result
self.hasErrorUpdated.emit()
self._machine_manager.stacksValidationChanged.emit()
if keys_to_recheck is None:
self._keys_to_check = set()
else:
self._keys_to_check = keys_to_recheck
self._keys_to_check = keys_to_recheck if keys_to_recheck else set()
self._need_to_check = False
self._check_in_progress = False
self.needToWaitForResultChanged.emit()
self.errorCheckFinished.emit()
Logger.log("i", "Error check finished, result = %s, time = %0.1fs", result, time.time() - self._start_time)
execution_time = time.time() - self._check_start_time
Logger.info(f"Error check finished, result = {result}, time = {execution_time:.2f}s")

View file

@ -44,6 +44,7 @@ class GlobalStacksModel(ListModel):
self._filter_connection_type = None # type: Optional[ConnectionType]
self._filter_online_only = False
self._filter_capabilities: List[str] = [] # Required capabilities that all listed printers must have.
self._filter_abstract_machines: Optional[bool] = None
# Listen to changes
CuraContainerRegistry.getInstance().containerAdded.connect(self._onContainerChanged)
@ -54,6 +55,7 @@ class GlobalStacksModel(ListModel):
filterConnectionTypeChanged = pyqtSignal()
filterCapabilitiesChanged = pyqtSignal()
filterOnlineOnlyChanged = pyqtSignal()
filterAbstractMachinesChanged = pyqtSignal()
def setFilterConnectionType(self, new_filter: Optional[ConnectionType]) -> None:
if self._filter_connection_type != new_filter:
@ -98,6 +100,22 @@ class GlobalStacksModel(ListModel):
"""
return self._filter_capabilities
def setFilterAbstractMachines(self, new_filter: Optional[bool]) -> None:
if self._filter_abstract_machines != new_filter:
self._filter_abstract_machines = new_filter
self.filterAbstractMachinesChanged.emit()
@pyqtProperty(bool, fset = setFilterAbstractMachines, notify = filterAbstractMachinesChanged)
def filterAbstractMachines(self) -> Optional[bool]:
"""
Weather we include abstract printers, non-abstract printers or both
if this is set to None both abstract and non-abstract printers will be included in the list
set to True will only include abstract printers
set to False will only inclde non-abstract printers
"""
return self._filter_abstract_machines
def _onContainerChanged(self, container) -> None:
"""Handler for container added/removed events from registry"""
@ -130,6 +148,10 @@ class GlobalStacksModel(ListModel):
if self._filter_online_only and not is_online:
continue
is_abstract_machine = parseBool(container_stack.getMetaDataEntry("is_abstract_machine", False))
if self._filter_abstract_machines is not None and self._filter_abstract_machines is not is_abstract_machine:
continue
capabilities = set(container_stack.getMetaDataEntry(META_CAPABILITIES, "").split(","))
if set(self._filter_capabilities) - capabilities: # Not all required capabilities are met.
continue

View file

@ -93,16 +93,19 @@ class MachineListModel(ListModel):
definition_id = abstract_machine.definition.getId()
online_machine_stacks = machines_manager.getMachinesWithDefinition(definition_id, online_only = True)
# Create a list item for abstract machine
self.addItem(abstract_machine, len(online_machine_stacks))
online_machine_stacks = list(filter(lambda machine: machine.hasNetworkedConnection(), online_machine_stacks))
other_machine_stacks.remove(abstract_machine)
if abstract_machine in online_machine_stacks:
online_machine_stacks.remove(abstract_machine)
# Create a list item for abstract machine
self.addItem(abstract_machine, True, len(online_machine_stacks))
# Create list of machines that are children of the abstract machine
for stack in online_machine_stacks:
if self._show_cloud_printers:
self.addItem(stack)
self.addItem(stack, True)
# Remove this machine from the other stack list
if stack in other_machine_stacks:
other_machine_stacks.remove(stack)
@ -122,25 +125,18 @@ class MachineListModel(ListModel):
})
for stack in other_machine_stacks:
self.addItem(stack)
self.addItem(stack, False)
def addItem(self, container_stack: ContainerStack, machine_count: int = 0) -> None:
def addItem(self, container_stack: ContainerStack, is_online: bool, machine_count: int = 0) -> None:
if parseBool(container_stack.getMetaDataEntry("hidden", False)):
return
# This is required because machines loaded from projects have the is_online="True" but no connection type.
# We want to display them the same way as unconnected printers in this case.
has_connection = False
has_connection |= parseBool(container_stack.getMetaDataEntry("is_abstract_machine", False))
for connection_type in [ConnectionType.NetworkConnection.value, ConnectionType.CloudConnection.value]:
has_connection |= connection_type in container_stack.configuredConnectionTypes
self.appendItem({
"componentType": "MACHINE",
"name": container_stack.getName(),
"id": container_stack.getId(),
"metadata": container_stack.getMetaData().copy(),
"isOnline": parseBool(container_stack.getMetaDataEntry("is_online", False)) and has_connection,
"isOnline": is_online,
"isAbstractMachine": parseBool(container_stack.getMetaDataEntry("is_abstract_machine", False)),
"machineCount": machine_count,
})

View file

@ -347,6 +347,12 @@ class GlobalStack(CuraContainerStack):
nameChanged = pyqtSignal()
name = pyqtProperty(str, fget=getName, fset=setName, notify=nameChanged)
def hasNetworkedConnection(self) -> bool:
has_connection = False
for connection_type in [ConnectionType.NetworkConnection.value, ConnectionType.CloudConnection.value]:
has_connection |= connection_type in self.configuredConnectionTypes
return has_connection
## private:
global_stack_mime = MimeType(
name = "application/x-cura-globalstack",

View file

@ -186,7 +186,7 @@ class PrintInformation(QObject):
if time != time: # Check for NaN. Engine can sometimes give us weird values.
duration.setDuration(0)
Logger.log("w", "Received NaN for print duration message")
Logger.warning("Received NaN for print duration message")
continue
total_estimated_time += time
@ -368,7 +368,7 @@ class PrintInformation(QObject):
mime_type = MimeTypeDatabase.getMimeTypeForFile(name)
data = mime_type.stripExtension(name)
except MimeTypeNotFoundError:
Logger.log("w", "Unsupported Mime Type Database file extension %s", name)
Logger.warning(f"Unsupported Mime Type Database file extension {name}")
if data is not None and check_name is not None:
self._base_name = data

View file

@ -62,15 +62,21 @@ class WhatsNewPagesModel(WelcomePagesModel):
def initialize(self) -> None:
self._pages = []
try:
self._pages.append({"id": "whats_new",
"page_url": self._getBuiltinWelcomePagePath("WhatsNewContent.qml"),
"next_page_button_text": self._catalog.i18nc("@action:button", "Skip"),
"next_page_id": "changelog"
})
except FileNotFoundError:
Logger.warning("Unable to find what's new page")
try:
self._pages.append({"id": "changelog",
"page_url": self._getBuiltinWelcomePagePath("ChangelogContent.qml"),
"next_page_button_text": self._catalog.i18nc("@action:button", "Close"),
})
except FileNotFoundError:
Logger.warning("Unable to find changelog page")
self.setItems(self._pages)
images, max_image = WhatsNewPagesModel._collectOrdinalFiles(Resources.Images, WhatsNewPagesModel.image_formats)

View file

@ -664,10 +664,22 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
cura_file_names = [name for name in archive.namelist() if name.startswith("Cura/")]
# Create a shadow copy of the preferences (we don't want all of the preferences, but we do want to re-use its
# Create a shadow copy of the preferences (We don't want all of the preferences, but we do want to re-use its
# parsing code.
temp_preferences = Preferences()
try:
serialized = archive.open("Cura/preferences.cfg").read().decode("utf-8")
except KeyError:
# If there is no preferences file, it's not a workspace, so notify user of failure.
Logger.log("w", "File %s is not a valid workspace.", file_name)
message = Message(i18n_catalog.i18nc("@info:error Don't translate the XML tags <filename> or <message>!",
"Project file <filename>{0}</filename> is corrupt: <message>{1}</message>.",
file_name, str(e)),
title=i18n_catalog.i18nc("@info:title", "Can't Open Project File"),
message_type=Message.MessageType.ERROR)
message.show()
self.setWorkspaceName("")
return [], {}
temp_preferences.deserialize(serialized)
# Copy a number of settings from the temp preferences to the global

View file

@ -31,7 +31,7 @@ class RemovedPrintersMessage(Message):
super().__init__(title=self.i18n_catalog.i18ncp("info:status",
"A cloud connection is not available for a printer",
"A cloud connection is not available for some printers",
len(self.removed_devices)),
len(self._removed_devices)),
message_type=Message.MessageType.WARNING,
text = message_text)

View file

@ -7,6 +7,7 @@
"author": "Abax 3D Technologies",
"manufacturer": "Abax 3D Technologies",
"file_formats": "text/x-gcode",
"has_machine_quality": "true",
"machine_extruder_trains":
{
"0": "abax_pri3_extruder_0"

View file

@ -7,6 +7,7 @@
"author": "Abax 3D Technologies",
"manufacturer": "Abax 3D Technologies",
"file_formats": "text/x-gcode",
"has_machine_quality": "true",
"machine_extruder_trains":
{
"0": "abax_pri5_extruder_0"

View file

@ -18,55 +18,55 @@
"default_value": "skirt"
},
"bottom_thickness": {
"value": "0.6"
"value": 0.6
},
"brim_width": {
"value": "3.0"
"value": 3.0
},
"cool_fan_enabled": {
"value": "True"
"value": true
},
"cool_fan_full_at_height": {
"value": "0.5"
"value": 0.5
},
"cool_fan_speed_max": {
"value": "100.0"
"value": 100.0
},
"cool_fan_speed_min": {
"value": "100.0"
"value": 100.0
},
"cool_lift_head": {
"value": "True"
"value": true
},
"cool_min_layer_time": {
"value": "1.0"
"value": 1.0
},
"cool_min_speed": {
"value": "5.0"
"value": 5.0
},
"infill_before_walls": {
"value": "True"
"value": true
},
"infill_line_width": {
"value": "0.6"
"value": 0.6
},
"infill_overlap": {
"value": "15.0"
"value": 15.0
},
"infill_sparse_density": {
"value": "26.0"
"value": 26.0
},
"ironing_enabled": {
"value": "True"
"value": true
},
"layer_0_z_overlap": {
"value": "0.11"
"value": 0.11
},
"layer_height_0": {
"value": "0.3"
"value": 0.3
},
"machine_depth": {
"value": "200"
"value": 200
},
"machine_end_gcode": {
"default_value": ";End GCode\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-4 F300 ;move Z up a bit and retract filament even more\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG0 Z{machine_height} F1800 ;move the platform all the way down\nG28 X0 Y0 F1800 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning\nM117 Done"
@ -75,10 +75,10 @@
"default_value": "RepRap (Marlin/Sprinter)"
},
"machine_heated_bed": {
"default_value": "true"
"default_value": true
},
"machine_height": {
"value": "200"
"value": 200
},
"machine_name": {
"default_value": "Renkforce RF100 XL"
@ -87,109 +87,109 @@
"default_value": ";Sliced at: {day} {date} {time}\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG1 Z5.0 F1800 ;move Z to 5mm\nG28 X0 Y0 F1800 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstop\nG92 E0 ;zero the extruded length\nG1 F200 E6.0 ;extrude 6.0mm of feed stock to build pressure\nG1 Z5.0 F300 ;move the platform down 5mm\nG92 E0 ;zero the extruded length again\nG1 F1800\n;Put printing message on LCD screen\nM117 Printing..."
},
"machine_width": {
"value": "200"
"value": 200
},
"material_bed_temperature": {
"value": "70"
"value": 70
},
"ooze_shield_enabled": {
"value": "True"
"value": true
},
"raft_airgap": {
"value": "0.33"
"value": 0.33
},
"raft_base_line_spacing": {
"value": "3.0"
"value": 3.0
},
"raft_base_line_width": {
"value": "1.0"
"value": 1.0
},
"raft_base_thickness": {
"value": "0.3"
"value": 0.3
},
"raft_interface_line_spacing": {
"value": "3.0"
"value": 3.0
},
"raft_interface_line_width": {
"value": "0.4"
"value": 0.4
},
"raft_interface_thickness": {
"value": "0.27"
"value": 0.27
},
"raft_margin": {
"value": "6.0"
"value": 6.0
},
"raft_speed": {
"value": "20.0"
"value": 20.0
},
"raft_surface_layers": {
"value": "2"
"value": 2
},
"raft_surface_line_spacing": {
"value": "0.4"
"value": 0.4
},
"raft_surface_line_width": {
"value": "0.4"
"value": 0.4
},
"raft_surface_thickness": {
"value": "0.1"
"value": 0.1
},
"retraction_amount": {
"value": "5.0"
"value": 5.0
},
"retraction_combing": {
"value": "'all'"
"value": "all"
},
"retraction_enable": {
"value": "True"
"value": true
},
"retraction_min_travel": {
"value": "1.5"
"value": 1.5
},
"skin_overlap": {
"value": "15.0"
"value": 15.0
},
"skirt_brim_minimal_length": {
"value": "150.0"
"value": 150.0
},
"skirt_gap": {
"value": "3.0"
"value": 3.0
},
"skirt_line_count": {
"value": "3"
"value": 3
},
"speed_infill": {
"value": "50.0"
"value": 50.0
},
"speed_layer_0": {
"value": "15.0"
"value": 15.0
},
"speed_print": {
"value": "50.0"
"value": 50.0
},
"speed_topbottom": {
"value": "30.0"
"value": 30.0
},
"speed_travel": {
"value": "50.0"
"value": 50.0
},
"speed_wall_0": {
"value": "25.0"
"value": 25.0
},
"speed_wall_x": {
"value": "35.0"
"value": 35.0
},
"support_angle": {
"value": "60.0"
"value": 60.0
},
"support_enable": {
"value": "False"
"value": false
},
"support_infill_rate": {
"value": "15 if support_enable and support_structure == 'normal' else 0 if support_enable and support_structure == 'tree' else 15"
},
"support_line_width": {
"value": "0.6"
"value": 0.6
},
"support_pattern": {
"default_value": "lines"
@ -198,16 +198,16 @@
"default_value": "everywhere"
},
"support_xy_distance": {
"value": "0.7"
"value": 0.7
},
"support_z_distance": {
"value": "0.35"
"value": 0.35
},
"top_bottom_thickness": {
"value": "0.8"
"value": 0.8
},
"wall_thickness": {
"value": "0.8"
"value": 0.8
}
}
}

View file

@ -35,7 +35,7 @@
"update_url": "https://ultimaker.com/firmware?utm_source=cura&utm_medium=software&utm_campaign=fw-update"
},
"bom_numbers": [
213482
213482, 213483
]
},

View file

@ -36,7 +36,7 @@
"update_url": "https://ultimaker.com/firmware?utm_source=cura&utm_medium=software&utm_campaign=fw-update"
},
"bom_numbers": [
9051, 214475
9051, 214475, 214476
]
},

View file

@ -17,7 +17,7 @@ UM.ManagementPage
title: catalog.i18nc("@title:tab", "Printers")
detailsPlaneCaption: base.currentItem && base.currentItem.name ? base.currentItem.name : ""
model: Cura.GlobalStacksModel { }
model: Cura.GlobalStacksModel { filterAbstractMachines: false }
sectionRole: "discoverySource"

View file

@ -11,7 +11,6 @@ weight = 0
material = generic_pla
[values]
layer_height = 0.2
wall_thickness = 1.05
top_bottom_thickness = 0.8
infill_sparse_density = 20

View file

@ -11,7 +11,6 @@ weight = 1
material = generic_pla
[values]
layer_height = 0.1
wall_thickness = 1.05
top_bottom_thickness = 0.8
infill_sparse_density = 20

View file

@ -11,7 +11,6 @@ weight = 0
material = generic_pla
[values]
layer_height = 0.2
wall_thickness = 1.05
top_bottom_thickness = 0.8
infill_sparse_density = 20

View file

@ -11,7 +11,6 @@ weight = 0
material = generic_pla
[values]
layer_height = 0.2
wall_thickness = 1.05
top_bottom_thickness = 0.8
infill_sparse_density = 20

View file

@ -11,7 +11,6 @@ weight = 1
material = generic_pla
[values]
layer_height = 0.1
wall_thickness = 1.05
top_bottom_thickness = 0.8
infill_sparse_density = 20

View file

@ -11,7 +11,6 @@ weight = 0
material = generic_pla
[values]
layer_height = 0.2
wall_thickness = 1.05
top_bottom_thickness = 0.8
infill_sparse_density = 20

View file

@ -11,7 +11,6 @@ weight = -2
material = chromatik_pla
[values]
layer_height = 0.2
line_width = =machine_nozzle_size * 0.875
material_print_temperature = =default_material_print_temperature + 10

View file

@ -11,7 +11,6 @@ weight = 0
material = chromatik_pla
[values]
layer_height = 0.1
line_width = =machine_nozzle_size * 0.875
speed_print = 35

View file

@ -11,7 +11,6 @@ weight = -1
material = chromatik_pla
[values]
layer_height = 0.15
line_width = =machine_nozzle_size * 0.875
material_print_temperature = =default_material_print_temperature + 5

View file

@ -11,7 +11,6 @@ weight = -2
material = chromatik_pla
[values]
layer_height = 0.2
line_width = =machine_nozzle_size * 0.875
material_print_temperature = =default_material_print_temperature + 10

View file

@ -11,7 +11,6 @@ weight = 0
material = chromatik_pla
[values]
layer_height = 0.1
line_width = =machine_nozzle_size * 0.875
speed_print = 35

View file

@ -11,7 +11,6 @@ weight = -1
material = chromatik_pla
[values]
layer_height = 0.15
line_width = =machine_nozzle_size * 0.875
material_print_temperature = =default_material_print_temperature + 5

View file

@ -11,7 +11,6 @@ weight = -2
material = chromatik_pla
[values]
layer_height = 0.2
line_width = =machine_nozzle_size * 0.875
material_print_temperature = =default_material_print_temperature + 10

View file

@ -11,7 +11,6 @@ weight = 0
material = chromatik_pla
[values]
layer_height = 0.1
line_width = =machine_nozzle_size * 0.875
speed_print = 35

View file

@ -11,7 +11,6 @@ weight = -1
material = chromatik_pla
[values]
layer_height = 0.15
line_width = =machine_nozzle_size * 0.875
material_print_temperature = =default_material_print_temperature + 5

View file

@ -11,7 +11,6 @@ weight = -2
material = chromatik_pla
[values]
layer_height = 0.2
line_width = =machine_nozzle_size * 0.875
material_print_temperature = =default_material_print_temperature + 10

View file

@ -11,7 +11,6 @@ weight = 0
material = chromatik_pla
[values]
layer_height = 0.1
line_width = =machine_nozzle_size * 0.875
speed_print = 35

View file

@ -11,7 +11,6 @@ weight = -1
material = chromatik_pla
[values]
layer_height = 0.15
line_width = =machine_nozzle_size * 0.875
material_print_temperature = =default_material_print_temperature + 5

View file

@ -11,7 +11,6 @@ weight = -2
material = chromatik_pla
[values]
layer_height = 0.2
line_width = =machine_nozzle_size * 0.875
material_print_temperature = =default_material_print_temperature + 10

View file

@ -11,7 +11,6 @@ weight = 0
material = chromatik_pla
[values]
layer_height = 0.1
line_width = =machine_nozzle_size * 0.875
speed_print = 30

View file

@ -11,7 +11,6 @@ weight = -1
material = chromatik_pla
[values]
layer_height = 0.15
line_width = =machine_nozzle_size * 0.875
material_print_temperature = =default_material_print_temperature + 5

View file

@ -11,7 +11,6 @@ weight = -2
material = chromatik_pla
[values]
layer_height = 0.2
line_width = =machine_nozzle_size * 0.875
material_print_temperature = =default_material_print_temperature + 10

View file

@ -11,7 +11,6 @@ weight = 0
material = chromatik_pla
[values]
layer_height = 0.1
line_width = =machine_nozzle_size * 0.875
speed_print = 30

View file

@ -11,7 +11,6 @@ weight = -1
material = chromatik_pla
[values]
layer_height = 0.15
line_width = =machine_nozzle_size * 0.875
material_print_temperature = =default_material_print_temperature + 5

View file

@ -14,8 +14,6 @@ variant = Lite 0.4 mm
[values]
adhesion_type = raft
speed_print = 80
layer_height = 0.2
layer_height_0 = 0.2
cool_fan_enabled = False
cool_fan_full_at_height = 0.4
cool_fan_speed = 50

View file

@ -14,8 +14,6 @@ variant = Lite 0.4 mm
[values]
adhesion_type = raft
speed_print = 45
layer_height = 0.1
layer_height_0 = 0.1
cool_fan_enabled = False
cool_fan_full_at_height = 0.2
cool_fan_speed = 50

View file

@ -14,8 +14,6 @@ variant = Lite 0.4 mm
[values]
adhesion_type = raft
speed_print = 60
layer_height = 0.15
layer_height_0 = 0.15
cool_fan_enabled = False
cool_fan_full_at_height = 0.3
cool_fan_speed = 50

View file

@ -23,8 +23,6 @@ cool_min_layer_time = 5
cool_min_speed = 0
infill_overlap = 15
infill_sparse_density = 24
layer_height = 0.20
layer_height_0 = 0.15
line_width = =machine_nozzle_size
material_flow = 100
raft_airgap = 0.22

View file

@ -23,8 +23,6 @@ cool_min_layer_time = 5
cool_min_speed = 0
infill_overlap = 15
infill_sparse_density = 24
layer_height = 0.10
layer_height_0 = 0.10
line_width = =machine_nozzle_size
material_flow = 100
raft_airgap = 0.22

View file

@ -23,8 +23,6 @@ cool_min_layer_time = 5
cool_min_speed = 0
infill_overlap = 15
infill_sparse_density = 24
layer_height = 0.15
layer_height_0 = 0.10
line_width = =machine_nozzle_size
material_flow = 100
raft_airgap = 0.22

View file

@ -14,8 +14,6 @@ variant = Lite 0.4 mm
[values]
adhesion_type = skirt
speed_print = 80
layer_height = 0.2
layer_height_0 = 0.2
cool_fan_enabled = True
cool_fan_full_at_height = 0.4
cool_fan_speed = 100

View file

@ -14,8 +14,6 @@ variant = Lite 0.4 mm
[values]
adhesion_type = skirt
speed_print = 45
layer_height = 0.1
layer_height_0 = 0.1
cool_fan_enabled = True
cool_fan_full_at_height = 0.2
cool_fan_speed = 100

View file

@ -14,8 +14,6 @@ variant = Lite 0.4 mm
[values]
adhesion_type = skirt
speed_print = 60
layer_height = 0.15
layer_height_0 = 0.15
cool_fan_enabled = True
cool_fan_full_at_height = 0.3
cool_fan_speed = 100

View file

@ -14,8 +14,6 @@ weight = -1
[values]
adhesion_type = skirt
speed_print = 80
layer_height = 0.2
layer_height_0 = 0.2
cool_fan_enabled = True
cool_fan_full_at_height = 0.4
cool_fan_speed = 100

View file

@ -13,8 +13,6 @@ weight = 1
[values]
adhesion_type = skirt
layer_height = 0.1
layer_height_0 = 0.1
cool_fan_enabled = True
cool_fan_full_at_height = 0.2
cool_fan_speed = 100

View file

@ -14,8 +14,6 @@ weight = 0
[values]
adhesion_type = skirt
speed_print = 80
layer_height = 0.15
layer_height_0 = 0.15
cool_fan_enabled = True
cool_fan_full_at_height = 0.3
cool_fan_speed = 100

View file

@ -11,7 +11,6 @@ weight = -2
material = redd_abs
global_quality = True
[values]
layer_height = 0.3
layer_height_0 = 0.35