mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-09 07:56:22 -06:00
Merge remote-tracking branch 'origin/main' into CURA-9278_choose_printer_dialog
This commit is contained in:
commit
5866560540
57 changed files with 200 additions and 185 deletions
1
.github/workflows/conan-package-create.yml
vendored
1
.github/workflows/conan-package-create.yml
vendored
|
@ -53,7 +53,6 @@ env:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
conan-package-create:
|
conan-package-create:
|
||||||
if: ${{ github.event.pull_request.head.repo.full_name == github.repository }}
|
|
||||||
runs-on: ${{ inputs.runs_on }}
|
runs-on: ${{ inputs.runs_on }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
|
4
.github/workflows/conan-recipe-version.yml
vendored
4
.github/workflows/conan-recipe-version.yml
vendored
|
@ -157,8 +157,8 @@ jobs:
|
||||||
channel_metadata = f"{channel}_{no_commits}"
|
channel_metadata = f"{channel}_{no_commits}"
|
||||||
# FIXME: for when we create a new release branch
|
# FIXME: for when we create a new release branch
|
||||||
if latest_branch_version.prerelease == "":
|
if latest_branch_version.prerelease == "":
|
||||||
bump_up_minor = int(latest_branch_version.minor) + 1
|
bump_up_patch = int(latest_branch_version.patch) + 1
|
||||||
actual_version = f"{latest_branch_version.major}.{bump_up_minor}.{latest_branch_version.patch}-alpha+{buildmetadata}{channel_metadata}"
|
actual_version = f"{latest_branch_version.major}.{latest_branch_version.minor}.{bump_up_patch}-alpha+{buildmetadata}{channel_metadata}"
|
||||||
else:
|
else:
|
||||||
actual_version = f"{latest_branch_version.major}.{latest_branch_version.minor}.{latest_branch_version.patch}-{latest_branch_version.prerelease.lower()}+{buildmetadata}{channel_metadata}"
|
actual_version = f"{latest_branch_version.major}.{latest_branch_version.minor}.{latest_branch_version.patch}-{latest_branch_version.prerelease.lower()}+{buildmetadata}{channel_metadata}"
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -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
|
sip
|
||||||
|
|
13
.github/workflows/unit-test.yml
vendored
13
.github/workflows/unit-test.yml
vendored
|
@ -103,7 +103,18 @@ jobs:
|
||||||
|
|
||||||
- name: Install Linux system requirements
|
- name: Install Linux system requirements
|
||||||
if: ${{ runner.os == 'Linux' }}
|
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
|
- name: Get Conan configuration
|
||||||
run: conan config install https://github.com/Ultimaker/conan-config.git
|
run: conan config install https://github.com/Ultimaker/conan-config.git
|
||||||
|
|
|
@ -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.
|
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`.
|
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`.
|
|
@ -24,9 +24,12 @@ class LayerPolygon:
|
||||||
PrimeTowerType = 11
|
PrimeTowerType = 11
|
||||||
__number_of_types = 12
|
__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
|
"""LayerPolygon, used in ProcessSlicedLayersJob
|
||||||
|
|
||||||
:param extruder: The position of the extruder
|
:param extruder: The position of the extruder
|
||||||
|
@ -39,10 +42,12 @@ class LayerPolygon:
|
||||||
|
|
||||||
self._extruder = extruder
|
self._extruder = extruder
|
||||||
self._types = line_types
|
self._types = line_types
|
||||||
for i in range(len(self._types)):
|
unknown_types = np.where(self_types >= self_number_of_types)
|
||||||
if self._types[i] >= self.__number_of_types: # Got faulty line data from the engine.
|
if unknown_types:
|
||||||
Logger.log("w", "Found an unknown line type: %s", i)
|
# Got faulty line data from the engine.
|
||||||
self._types[i] = self.NoneType
|
for idx in unknown_types:
|
||||||
|
Logger.warn(f"Found an unknown line type at: {idx}")
|
||||||
|
self._types[idx] = self.NoneType
|
||||||
self._data = data
|
self._data = data
|
||||||
self._line_widths = line_widths
|
self._line_widths = line_widths
|
||||||
self._line_thicknesses = line_thicknesses
|
self._line_thicknesses = line_thicknesses
|
||||||
|
@ -63,9 +68,11 @@ class LayerPolygon:
|
||||||
self._color_map = LayerPolygon.getColorMap()
|
self._color_map = LayerPolygon.getColorMap()
|
||||||
self._colors = self._color_map[self._types] # type: numpy.ndarray
|
self._colors = self._color_map[self._types] # type: numpy.ndarray
|
||||||
|
|
||||||
# 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.
|
# 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_line_mesh_mask = None # type: Optional[numpy.ndarray]
|
||||||
self._build_cache_needed_points = 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
|
# 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]
|
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
|
# 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_begin = 0
|
||||||
self._vertex_end = cast(int, numpy.sum(self._build_cache_needed_points))
|
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
|
"""Set all the arrays provided by the function caller, representing the LayerPolygon
|
||||||
|
|
||||||
The arrays are either by vertex or by indices.
|
The arrays are either by vertex or by indices.
|
||||||
|
@ -111,10 +120,11 @@ class LayerPolygon:
|
||||||
line_mesh_mask = self._build_cache_line_mesh_mask
|
line_mesh_mask = self._build_cache_line_mesh_mask
|
||||||
needed_points_list = self._build_cache_needed_points
|
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
|
# Index to the points we need to represent the line mesh.
|
||||||
# start and end points for each line. For line segment n these are points n and n+1. Row n reads [n n+1]
|
# This is constructed by generating simple start and end points for each line.
|
||||||
# Then then the indices for the points we don't need are thrown away based on the pre-calculated list.
|
# For line segment n, these are points n and n+1. Row n reads [n n+1]
|
||||||
index_list = ( numpy.arange(len(self._types)).reshape((-1, 1)) + numpy.array([[0, 1]]) ).reshape((-1, 1))[needed_points_list.reshape((-1, 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.
|
# 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
|
self._vertex_begin += vertex_offset
|
||||||
|
@ -138,11 +148,12 @@ class LayerPolygon:
|
||||||
# Convert type per vertex to type per line
|
# 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]
|
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_begin += index_offset
|
||||||
self._index_end += 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.
|
# When the line type changes the index needs to be increased by 2.
|
||||||
indices[self._index_begin:self._index_end, :] += numpy.cumsum(needed_points_list[line_mesh_mask.ravel(), 0], dtype = numpy.int32).reshape((-1, 1))
|
indices[self._index_begin:self._index_end, :] += numpy.cumsum(needed_points_list[line_mesh_mask.ravel(), 0], dtype = numpy.int32).reshape((-1, 1))
|
||||||
# Each line segment goes from it's starting point p to p+1, offset by the vertex index.
|
# Each line segment goes from it's starting point p to p+1, offset by the vertex index.
|
||||||
|
@ -217,10 +228,9 @@ class LayerPolygon:
|
||||||
normals[:, 1] = 0.0 # We are only interested in 2D normals
|
normals[:, 1] = 0.0 # We are only interested in 2D normals
|
||||||
|
|
||||||
# Calculate the edges between points.
|
# Calculate the edges between points.
|
||||||
# The call to numpy.roll shifts the entire array by one so that
|
# The call to numpy.roll shifts the entire array by one
|
||||||
# we end up subtracting each next point from the current, wrapping
|
# so that we end up subtracting each next point from the current, wrapping around.
|
||||||
# around. This gives us the edges from the next point to the current
|
# This gives us the edges from the next point to the current point.
|
||||||
# point.
|
|
||||||
normals = numpy.diff(normals, 1, 0)
|
normals = numpy.diff(normals, 1, 0)
|
||||||
|
|
||||||
# Calculate the length of each edge using standard Pythagoras
|
# Calculate the length of each edge using standard Pythagoras
|
||||||
|
|
|
@ -43,7 +43,7 @@ class MachineErrorChecker(QObject):
|
||||||
self._application = cura.CuraApplication.CuraApplication.getInstance()
|
self._application = cura.CuraApplication.CuraApplication.getInstance()
|
||||||
self._machine_manager = self._application.getMachineManager()
|
self._machine_manager = self._application.getMachineManager()
|
||||||
|
|
||||||
self._start_time = 0. # measure checking time
|
self._check_start_time = time.time()
|
||||||
|
|
||||||
self._setCheckTimer()
|
self._setCheckTimer()
|
||||||
|
|
||||||
|
@ -160,7 +160,7 @@ class MachineErrorChecker(QObject):
|
||||||
self._stacks_and_keys_to_check.append((stack, key))
|
self._stacks_and_keys_to_check.append((stack, key))
|
||||||
|
|
||||||
self._application.callLater(self._checkStack)
|
self._application.callLater(self._checkStack)
|
||||||
self._start_time = time.time()
|
self._check_start_time = time.time()
|
||||||
Logger.log("d", "New error check scheduled.")
|
Logger.log("d", "New error check scheduled.")
|
||||||
|
|
||||||
def _checkStack(self) -> None:
|
def _checkStack(self) -> None:
|
||||||
|
@ -212,12 +212,10 @@ class MachineErrorChecker(QObject):
|
||||||
self._has_errors = result
|
self._has_errors = result
|
||||||
self.hasErrorUpdated.emit()
|
self.hasErrorUpdated.emit()
|
||||||
self._machine_manager.stacksValidationChanged.emit()
|
self._machine_manager.stacksValidationChanged.emit()
|
||||||
if keys_to_recheck is None:
|
self._keys_to_check = keys_to_recheck if keys_to_recheck else set()
|
||||||
self._keys_to_check = set()
|
|
||||||
else:
|
|
||||||
self._keys_to_check = keys_to_recheck
|
|
||||||
self._need_to_check = False
|
self._need_to_check = False
|
||||||
self._check_in_progress = False
|
self._check_in_progress = False
|
||||||
self.needToWaitForResultChanged.emit()
|
self.needToWaitForResultChanged.emit()
|
||||||
self.errorCheckFinished.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")
|
||||||
|
|
|
@ -44,6 +44,7 @@ class GlobalStacksModel(ListModel):
|
||||||
self._filter_connection_type = None # type: Optional[ConnectionType]
|
self._filter_connection_type = None # type: Optional[ConnectionType]
|
||||||
self._filter_online_only = False
|
self._filter_online_only = False
|
||||||
self._filter_capabilities: List[str] = [] # Required capabilities that all listed printers must have.
|
self._filter_capabilities: List[str] = [] # Required capabilities that all listed printers must have.
|
||||||
|
self._filter_abstract_machines: Optional[bool] = None
|
||||||
|
|
||||||
# Listen to changes
|
# Listen to changes
|
||||||
CuraContainerRegistry.getInstance().containerAdded.connect(self._onContainerChanged)
|
CuraContainerRegistry.getInstance().containerAdded.connect(self._onContainerChanged)
|
||||||
|
@ -54,6 +55,7 @@ class GlobalStacksModel(ListModel):
|
||||||
filterConnectionTypeChanged = pyqtSignal()
|
filterConnectionTypeChanged = pyqtSignal()
|
||||||
filterCapabilitiesChanged = pyqtSignal()
|
filterCapabilitiesChanged = pyqtSignal()
|
||||||
filterOnlineOnlyChanged = pyqtSignal()
|
filterOnlineOnlyChanged = pyqtSignal()
|
||||||
|
filterAbstractMachinesChanged = pyqtSignal()
|
||||||
|
|
||||||
def setFilterConnectionType(self, new_filter: Optional[ConnectionType]) -> None:
|
def setFilterConnectionType(self, new_filter: Optional[ConnectionType]) -> None:
|
||||||
if self._filter_connection_type != new_filter:
|
if self._filter_connection_type != new_filter:
|
||||||
|
@ -98,6 +100,22 @@ class GlobalStacksModel(ListModel):
|
||||||
"""
|
"""
|
||||||
return self._filter_capabilities
|
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:
|
def _onContainerChanged(self, container) -> None:
|
||||||
"""Handler for container added/removed events from registry"""
|
"""Handler for container added/removed events from registry"""
|
||||||
|
|
||||||
|
@ -130,6 +148,10 @@ class GlobalStacksModel(ListModel):
|
||||||
if self._filter_online_only and not is_online:
|
if self._filter_online_only and not is_online:
|
||||||
continue
|
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(","))
|
capabilities = set(container_stack.getMetaDataEntry(META_CAPABILITIES, "").split(","))
|
||||||
if set(self._filter_capabilities) - capabilities: # Not all required capabilities are met.
|
if set(self._filter_capabilities) - capabilities: # Not all required capabilities are met.
|
||||||
continue
|
continue
|
||||||
|
|
|
@ -93,16 +93,19 @@ class MachineListModel(ListModel):
|
||||||
definition_id = abstract_machine.definition.getId()
|
definition_id = abstract_machine.definition.getId()
|
||||||
online_machine_stacks = machines_manager.getMachinesWithDefinition(definition_id, online_only = True)
|
online_machine_stacks = machines_manager.getMachinesWithDefinition(definition_id, online_only = True)
|
||||||
|
|
||||||
# Create a list item for abstract machine
|
online_machine_stacks = list(filter(lambda machine: machine.hasNetworkedConnection(), online_machine_stacks))
|
||||||
self.addItem(abstract_machine, len(online_machine_stacks))
|
|
||||||
other_machine_stacks.remove(abstract_machine)
|
other_machine_stacks.remove(abstract_machine)
|
||||||
if abstract_machine in online_machine_stacks:
|
if abstract_machine in online_machine_stacks:
|
||||||
online_machine_stacks.remove(abstract_machine)
|
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
|
# Create list of machines that are children of the abstract machine
|
||||||
for stack in online_machine_stacks:
|
for stack in online_machine_stacks:
|
||||||
if self._show_cloud_printers:
|
if self._show_cloud_printers:
|
||||||
self.addItem(stack)
|
self.addItem(stack, True)
|
||||||
# Remove this machine from the other stack list
|
# Remove this machine from the other stack list
|
||||||
if stack in other_machine_stacks:
|
if stack in other_machine_stacks:
|
||||||
other_machine_stacks.remove(stack)
|
other_machine_stacks.remove(stack)
|
||||||
|
@ -122,25 +125,18 @@ class MachineListModel(ListModel):
|
||||||
})
|
})
|
||||||
|
|
||||||
for stack in other_machine_stacks:
|
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)):
|
if parseBool(container_stack.getMetaDataEntry("hidden", False)):
|
||||||
return
|
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({
|
self.appendItem({
|
||||||
"componentType": "MACHINE",
|
"componentType": "MACHINE",
|
||||||
"name": container_stack.getName(),
|
"name": container_stack.getName(),
|
||||||
"id": container_stack.getId(),
|
"id": container_stack.getId(),
|
||||||
"metadata": container_stack.getMetaData().copy(),
|
"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)),
|
"isAbstractMachine": parseBool(container_stack.getMetaDataEntry("is_abstract_machine", False)),
|
||||||
"machineCount": machine_count,
|
"machineCount": machine_count,
|
||||||
})
|
})
|
||||||
|
|
|
@ -347,6 +347,12 @@ class GlobalStack(CuraContainerStack):
|
||||||
nameChanged = pyqtSignal()
|
nameChanged = pyqtSignal()
|
||||||
name = pyqtProperty(str, fget=getName, fset=setName, notify=nameChanged)
|
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:
|
## private:
|
||||||
global_stack_mime = MimeType(
|
global_stack_mime = MimeType(
|
||||||
name = "application/x-cura-globalstack",
|
name = "application/x-cura-globalstack",
|
||||||
|
|
|
@ -186,7 +186,7 @@ class PrintInformation(QObject):
|
||||||
|
|
||||||
if time != time: # Check for NaN. Engine can sometimes give us weird values.
|
if time != time: # Check for NaN. Engine can sometimes give us weird values.
|
||||||
duration.setDuration(0)
|
duration.setDuration(0)
|
||||||
Logger.log("w", "Received NaN for print duration message")
|
Logger.warning("Received NaN for print duration message")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
total_estimated_time += time
|
total_estimated_time += time
|
||||||
|
@ -368,7 +368,7 @@ class PrintInformation(QObject):
|
||||||
mime_type = MimeTypeDatabase.getMimeTypeForFile(name)
|
mime_type = MimeTypeDatabase.getMimeTypeForFile(name)
|
||||||
data = mime_type.stripExtension(name)
|
data = mime_type.stripExtension(name)
|
||||||
except MimeTypeNotFoundError:
|
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:
|
if data is not None and check_name is not None:
|
||||||
self._base_name = data
|
self._base_name = data
|
||||||
|
|
|
@ -62,15 +62,21 @@ class WhatsNewPagesModel(WelcomePagesModel):
|
||||||
|
|
||||||
def initialize(self) -> None:
|
def initialize(self) -> None:
|
||||||
self._pages = []
|
self._pages = []
|
||||||
|
try:
|
||||||
self._pages.append({"id": "whats_new",
|
self._pages.append({"id": "whats_new",
|
||||||
"page_url": self._getBuiltinWelcomePagePath("WhatsNewContent.qml"),
|
"page_url": self._getBuiltinWelcomePagePath("WhatsNewContent.qml"),
|
||||||
"next_page_button_text": self._catalog.i18nc("@action:button", "Skip"),
|
"next_page_button_text": self._catalog.i18nc("@action:button", "Skip"),
|
||||||
"next_page_id": "changelog"
|
"next_page_id": "changelog"
|
||||||
})
|
})
|
||||||
|
except FileNotFoundError:
|
||||||
|
Logger.warning("Unable to find what's new page")
|
||||||
|
try:
|
||||||
self._pages.append({"id": "changelog",
|
self._pages.append({"id": "changelog",
|
||||||
"page_url": self._getBuiltinWelcomePagePath("ChangelogContent.qml"),
|
"page_url": self._getBuiltinWelcomePagePath("ChangelogContent.qml"),
|
||||||
"next_page_button_text": self._catalog.i18nc("@action:button", "Close"),
|
"next_page_button_text": self._catalog.i18nc("@action:button", "Close"),
|
||||||
})
|
})
|
||||||
|
except FileNotFoundError:
|
||||||
|
Logger.warning("Unable to find changelog page")
|
||||||
self.setItems(self._pages)
|
self.setItems(self._pages)
|
||||||
|
|
||||||
images, max_image = WhatsNewPagesModel._collectOrdinalFiles(Resources.Images, WhatsNewPagesModel.image_formats)
|
images, max_image = WhatsNewPagesModel._collectOrdinalFiles(Resources.Images, WhatsNewPagesModel.image_formats)
|
||||||
|
|
|
@ -664,10 +664,22 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
||||||
|
|
||||||
cura_file_names = [name for name in archive.namelist() if name.startswith("Cura/")]
|
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.
|
# parsing code.
|
||||||
temp_preferences = Preferences()
|
temp_preferences = Preferences()
|
||||||
|
try:
|
||||||
serialized = archive.open("Cura/preferences.cfg").read().decode("utf-8")
|
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)
|
temp_preferences.deserialize(serialized)
|
||||||
|
|
||||||
# Copy a number of settings from the temp preferences to the global
|
# Copy a number of settings from the temp preferences to the global
|
||||||
|
|
|
@ -31,7 +31,7 @@ class RemovedPrintersMessage(Message):
|
||||||
super().__init__(title=self.i18n_catalog.i18ncp("info:status",
|
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 a printer",
|
||||||
"A cloud connection is not available for some printers",
|
"A cloud connection is not available for some printers",
|
||||||
len(self.removed_devices)),
|
len(self._removed_devices)),
|
||||||
message_type=Message.MessageType.WARNING,
|
message_type=Message.MessageType.WARNING,
|
||||||
text = message_text)
|
text = message_text)
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
"author": "Abax 3D Technologies",
|
"author": "Abax 3D Technologies",
|
||||||
"manufacturer": "Abax 3D Technologies",
|
"manufacturer": "Abax 3D Technologies",
|
||||||
"file_formats": "text/x-gcode",
|
"file_formats": "text/x-gcode",
|
||||||
|
"has_machine_quality": "true",
|
||||||
"machine_extruder_trains":
|
"machine_extruder_trains":
|
||||||
{
|
{
|
||||||
"0": "abax_pri3_extruder_0"
|
"0": "abax_pri3_extruder_0"
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
"author": "Abax 3D Technologies",
|
"author": "Abax 3D Technologies",
|
||||||
"manufacturer": "Abax 3D Technologies",
|
"manufacturer": "Abax 3D Technologies",
|
||||||
"file_formats": "text/x-gcode",
|
"file_formats": "text/x-gcode",
|
||||||
|
"has_machine_quality": "true",
|
||||||
"machine_extruder_trains":
|
"machine_extruder_trains":
|
||||||
{
|
{
|
||||||
"0": "abax_pri5_extruder_0"
|
"0": "abax_pri5_extruder_0"
|
||||||
|
|
|
@ -18,55 +18,55 @@
|
||||||
"default_value": "skirt"
|
"default_value": "skirt"
|
||||||
},
|
},
|
||||||
"bottom_thickness": {
|
"bottom_thickness": {
|
||||||
"value": "0.6"
|
"value": 0.6
|
||||||
},
|
},
|
||||||
"brim_width": {
|
"brim_width": {
|
||||||
"value": "3.0"
|
"value": 3.0
|
||||||
},
|
},
|
||||||
"cool_fan_enabled": {
|
"cool_fan_enabled": {
|
||||||
"value": "True"
|
"value": true
|
||||||
},
|
},
|
||||||
"cool_fan_full_at_height": {
|
"cool_fan_full_at_height": {
|
||||||
"value": "0.5"
|
"value": 0.5
|
||||||
},
|
},
|
||||||
"cool_fan_speed_max": {
|
"cool_fan_speed_max": {
|
||||||
"value": "100.0"
|
"value": 100.0
|
||||||
},
|
},
|
||||||
"cool_fan_speed_min": {
|
"cool_fan_speed_min": {
|
||||||
"value": "100.0"
|
"value": 100.0
|
||||||
},
|
},
|
||||||
"cool_lift_head": {
|
"cool_lift_head": {
|
||||||
"value": "True"
|
"value": true
|
||||||
},
|
},
|
||||||
"cool_min_layer_time": {
|
"cool_min_layer_time": {
|
||||||
"value": "1.0"
|
"value": 1.0
|
||||||
},
|
},
|
||||||
"cool_min_speed": {
|
"cool_min_speed": {
|
||||||
"value": "5.0"
|
"value": 5.0
|
||||||
},
|
},
|
||||||
"infill_before_walls": {
|
"infill_before_walls": {
|
||||||
"value": "True"
|
"value": true
|
||||||
},
|
},
|
||||||
"infill_line_width": {
|
"infill_line_width": {
|
||||||
"value": "0.6"
|
"value": 0.6
|
||||||
},
|
},
|
||||||
"infill_overlap": {
|
"infill_overlap": {
|
||||||
"value": "15.0"
|
"value": 15.0
|
||||||
},
|
},
|
||||||
"infill_sparse_density": {
|
"infill_sparse_density": {
|
||||||
"value": "26.0"
|
"value": 26.0
|
||||||
},
|
},
|
||||||
"ironing_enabled": {
|
"ironing_enabled": {
|
||||||
"value": "True"
|
"value": true
|
||||||
},
|
},
|
||||||
"layer_0_z_overlap": {
|
"layer_0_z_overlap": {
|
||||||
"value": "0.11"
|
"value": 0.11
|
||||||
},
|
},
|
||||||
"layer_height_0": {
|
"layer_height_0": {
|
||||||
"value": "0.3"
|
"value": 0.3
|
||||||
},
|
},
|
||||||
"machine_depth": {
|
"machine_depth": {
|
||||||
"value": "200"
|
"value": 200
|
||||||
},
|
},
|
||||||
"machine_end_gcode": {
|
"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"
|
"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)"
|
"default_value": "RepRap (Marlin/Sprinter)"
|
||||||
},
|
},
|
||||||
"machine_heated_bed": {
|
"machine_heated_bed": {
|
||||||
"default_value": "true"
|
"default_value": true
|
||||||
},
|
},
|
||||||
"machine_height": {
|
"machine_height": {
|
||||||
"value": "200"
|
"value": 200
|
||||||
},
|
},
|
||||||
"machine_name": {
|
"machine_name": {
|
||||||
"default_value": "Renkforce RF100 XL"
|
"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..."
|
"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": {
|
"machine_width": {
|
||||||
"value": "200"
|
"value": 200
|
||||||
},
|
},
|
||||||
"material_bed_temperature": {
|
"material_bed_temperature": {
|
||||||
"value": "70"
|
"value": 70
|
||||||
},
|
},
|
||||||
"ooze_shield_enabled": {
|
"ooze_shield_enabled": {
|
||||||
"value": "True"
|
"value": true
|
||||||
},
|
},
|
||||||
"raft_airgap": {
|
"raft_airgap": {
|
||||||
"value": "0.33"
|
"value": 0.33
|
||||||
},
|
},
|
||||||
"raft_base_line_spacing": {
|
"raft_base_line_spacing": {
|
||||||
"value": "3.0"
|
"value": 3.0
|
||||||
},
|
},
|
||||||
"raft_base_line_width": {
|
"raft_base_line_width": {
|
||||||
"value": "1.0"
|
"value": 1.0
|
||||||
},
|
},
|
||||||
"raft_base_thickness": {
|
"raft_base_thickness": {
|
||||||
"value": "0.3"
|
"value": 0.3
|
||||||
},
|
},
|
||||||
"raft_interface_line_spacing": {
|
"raft_interface_line_spacing": {
|
||||||
"value": "3.0"
|
"value": 3.0
|
||||||
},
|
},
|
||||||
"raft_interface_line_width": {
|
"raft_interface_line_width": {
|
||||||
"value": "0.4"
|
"value": 0.4
|
||||||
},
|
},
|
||||||
"raft_interface_thickness": {
|
"raft_interface_thickness": {
|
||||||
"value": "0.27"
|
"value": 0.27
|
||||||
},
|
},
|
||||||
"raft_margin": {
|
"raft_margin": {
|
||||||
"value": "6.0"
|
"value": 6.0
|
||||||
},
|
},
|
||||||
"raft_speed": {
|
"raft_speed": {
|
||||||
"value": "20.0"
|
"value": 20.0
|
||||||
},
|
},
|
||||||
"raft_surface_layers": {
|
"raft_surface_layers": {
|
||||||
"value": "2"
|
"value": 2
|
||||||
},
|
},
|
||||||
"raft_surface_line_spacing": {
|
"raft_surface_line_spacing": {
|
||||||
"value": "0.4"
|
"value": 0.4
|
||||||
},
|
},
|
||||||
"raft_surface_line_width": {
|
"raft_surface_line_width": {
|
||||||
"value": "0.4"
|
"value": 0.4
|
||||||
},
|
},
|
||||||
"raft_surface_thickness": {
|
"raft_surface_thickness": {
|
||||||
"value": "0.1"
|
"value": 0.1
|
||||||
},
|
},
|
||||||
"retraction_amount": {
|
"retraction_amount": {
|
||||||
"value": "5.0"
|
"value": 5.0
|
||||||
},
|
},
|
||||||
"retraction_combing": {
|
"retraction_combing": {
|
||||||
"value": "'all'"
|
"value": "all"
|
||||||
},
|
},
|
||||||
"retraction_enable": {
|
"retraction_enable": {
|
||||||
"value": "True"
|
"value": true
|
||||||
},
|
},
|
||||||
"retraction_min_travel": {
|
"retraction_min_travel": {
|
||||||
"value": "1.5"
|
"value": 1.5
|
||||||
},
|
},
|
||||||
"skin_overlap": {
|
"skin_overlap": {
|
||||||
"value": "15.0"
|
"value": 15.0
|
||||||
},
|
},
|
||||||
"skirt_brim_minimal_length": {
|
"skirt_brim_minimal_length": {
|
||||||
"value": "150.0"
|
"value": 150.0
|
||||||
},
|
},
|
||||||
"skirt_gap": {
|
"skirt_gap": {
|
||||||
"value": "3.0"
|
"value": 3.0
|
||||||
},
|
},
|
||||||
"skirt_line_count": {
|
"skirt_line_count": {
|
||||||
"value": "3"
|
"value": 3
|
||||||
},
|
},
|
||||||
"speed_infill": {
|
"speed_infill": {
|
||||||
"value": "50.0"
|
"value": 50.0
|
||||||
},
|
},
|
||||||
"speed_layer_0": {
|
"speed_layer_0": {
|
||||||
"value": "15.0"
|
"value": 15.0
|
||||||
},
|
},
|
||||||
"speed_print": {
|
"speed_print": {
|
||||||
"value": "50.0"
|
"value": 50.0
|
||||||
},
|
},
|
||||||
"speed_topbottom": {
|
"speed_topbottom": {
|
||||||
"value": "30.0"
|
"value": 30.0
|
||||||
},
|
},
|
||||||
"speed_travel": {
|
"speed_travel": {
|
||||||
"value": "50.0"
|
"value": 50.0
|
||||||
},
|
},
|
||||||
"speed_wall_0": {
|
"speed_wall_0": {
|
||||||
"value": "25.0"
|
"value": 25.0
|
||||||
},
|
},
|
||||||
"speed_wall_x": {
|
"speed_wall_x": {
|
||||||
"value": "35.0"
|
"value": 35.0
|
||||||
},
|
},
|
||||||
"support_angle": {
|
"support_angle": {
|
||||||
"value": "60.0"
|
"value": 60.0
|
||||||
},
|
},
|
||||||
"support_enable": {
|
"support_enable": {
|
||||||
"value": "False"
|
"value": false
|
||||||
},
|
},
|
||||||
"support_infill_rate": {
|
"support_infill_rate": {
|
||||||
"value": "15 if support_enable and support_structure == 'normal' else 0 if support_enable and support_structure == 'tree' else 15"
|
"value": "15 if support_enable and support_structure == 'normal' else 0 if support_enable and support_structure == 'tree' else 15"
|
||||||
},
|
},
|
||||||
"support_line_width": {
|
"support_line_width": {
|
||||||
"value": "0.6"
|
"value": 0.6
|
||||||
},
|
},
|
||||||
"support_pattern": {
|
"support_pattern": {
|
||||||
"default_value": "lines"
|
"default_value": "lines"
|
||||||
|
@ -198,16 +198,16 @@
|
||||||
"default_value": "everywhere"
|
"default_value": "everywhere"
|
||||||
},
|
},
|
||||||
"support_xy_distance": {
|
"support_xy_distance": {
|
||||||
"value": "0.7"
|
"value": 0.7
|
||||||
},
|
},
|
||||||
"support_z_distance": {
|
"support_z_distance": {
|
||||||
"value": "0.35"
|
"value": 0.35
|
||||||
},
|
},
|
||||||
"top_bottom_thickness": {
|
"top_bottom_thickness": {
|
||||||
"value": "0.8"
|
"value": 0.8
|
||||||
},
|
},
|
||||||
"wall_thickness": {
|
"wall_thickness": {
|
||||||
"value": "0.8"
|
"value": 0.8
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,7 +35,7 @@
|
||||||
"update_url": "https://ultimaker.com/firmware?utm_source=cura&utm_medium=software&utm_campaign=fw-update"
|
"update_url": "https://ultimaker.com/firmware?utm_source=cura&utm_medium=software&utm_campaign=fw-update"
|
||||||
},
|
},
|
||||||
"bom_numbers": [
|
"bom_numbers": [
|
||||||
213482
|
213482, 213483
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
"update_url": "https://ultimaker.com/firmware?utm_source=cura&utm_medium=software&utm_campaign=fw-update"
|
"update_url": "https://ultimaker.com/firmware?utm_source=cura&utm_medium=software&utm_campaign=fw-update"
|
||||||
},
|
},
|
||||||
"bom_numbers": [
|
"bom_numbers": [
|
||||||
9051, 214475
|
9051, 214475, 214476
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ UM.ManagementPage
|
||||||
title: catalog.i18nc("@title:tab", "Printers")
|
title: catalog.i18nc("@title:tab", "Printers")
|
||||||
detailsPlaneCaption: base.currentItem && base.currentItem.name ? base.currentItem.name : ""
|
detailsPlaneCaption: base.currentItem && base.currentItem.name ? base.currentItem.name : ""
|
||||||
|
|
||||||
model: Cura.GlobalStacksModel { }
|
model: Cura.GlobalStacksModel { filterAbstractMachines: false }
|
||||||
|
|
||||||
sectionRole: "discoverySource"
|
sectionRole: "discoverySource"
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,6 @@ weight = 0
|
||||||
material = generic_pla
|
material = generic_pla
|
||||||
|
|
||||||
[values]
|
[values]
|
||||||
layer_height = 0.2
|
|
||||||
wall_thickness = 1.05
|
wall_thickness = 1.05
|
||||||
top_bottom_thickness = 0.8
|
top_bottom_thickness = 0.8
|
||||||
infill_sparse_density = 20
|
infill_sparse_density = 20
|
||||||
|
|
|
@ -11,7 +11,6 @@ weight = 1
|
||||||
material = generic_pla
|
material = generic_pla
|
||||||
|
|
||||||
[values]
|
[values]
|
||||||
layer_height = 0.1
|
|
||||||
wall_thickness = 1.05
|
wall_thickness = 1.05
|
||||||
top_bottom_thickness = 0.8
|
top_bottom_thickness = 0.8
|
||||||
infill_sparse_density = 20
|
infill_sparse_density = 20
|
||||||
|
|
|
@ -11,7 +11,6 @@ weight = 0
|
||||||
material = generic_pla
|
material = generic_pla
|
||||||
|
|
||||||
[values]
|
[values]
|
||||||
layer_height = 0.2
|
|
||||||
wall_thickness = 1.05
|
wall_thickness = 1.05
|
||||||
top_bottom_thickness = 0.8
|
top_bottom_thickness = 0.8
|
||||||
infill_sparse_density = 20
|
infill_sparse_density = 20
|
||||||
|
|
|
@ -11,7 +11,6 @@ weight = 0
|
||||||
material = generic_pla
|
material = generic_pla
|
||||||
|
|
||||||
[values]
|
[values]
|
||||||
layer_height = 0.2
|
|
||||||
wall_thickness = 1.05
|
wall_thickness = 1.05
|
||||||
top_bottom_thickness = 0.8
|
top_bottom_thickness = 0.8
|
||||||
infill_sparse_density = 20
|
infill_sparse_density = 20
|
||||||
|
|
|
@ -11,7 +11,6 @@ weight = 1
|
||||||
material = generic_pla
|
material = generic_pla
|
||||||
|
|
||||||
[values]
|
[values]
|
||||||
layer_height = 0.1
|
|
||||||
wall_thickness = 1.05
|
wall_thickness = 1.05
|
||||||
top_bottom_thickness = 0.8
|
top_bottom_thickness = 0.8
|
||||||
infill_sparse_density = 20
|
infill_sparse_density = 20
|
||||||
|
|
|
@ -11,7 +11,6 @@ weight = 0
|
||||||
material = generic_pla
|
material = generic_pla
|
||||||
|
|
||||||
[values]
|
[values]
|
||||||
layer_height = 0.2
|
|
||||||
wall_thickness = 1.05
|
wall_thickness = 1.05
|
||||||
top_bottom_thickness = 0.8
|
top_bottom_thickness = 0.8
|
||||||
infill_sparse_density = 20
|
infill_sparse_density = 20
|
||||||
|
|
|
@ -11,7 +11,6 @@ weight = -2
|
||||||
material = chromatik_pla
|
material = chromatik_pla
|
||||||
|
|
||||||
[values]
|
[values]
|
||||||
layer_height = 0.2
|
|
||||||
line_width = =machine_nozzle_size * 0.875
|
line_width = =machine_nozzle_size * 0.875
|
||||||
|
|
||||||
material_print_temperature = =default_material_print_temperature + 10
|
material_print_temperature = =default_material_print_temperature + 10
|
||||||
|
|
|
@ -11,7 +11,6 @@ weight = 0
|
||||||
material = chromatik_pla
|
material = chromatik_pla
|
||||||
|
|
||||||
[values]
|
[values]
|
||||||
layer_height = 0.1
|
|
||||||
line_width = =machine_nozzle_size * 0.875
|
line_width = =machine_nozzle_size * 0.875
|
||||||
|
|
||||||
speed_print = 35
|
speed_print = 35
|
||||||
|
|
|
@ -11,7 +11,6 @@ weight = -1
|
||||||
material = chromatik_pla
|
material = chromatik_pla
|
||||||
|
|
||||||
[values]
|
[values]
|
||||||
layer_height = 0.15
|
|
||||||
line_width = =machine_nozzle_size * 0.875
|
line_width = =machine_nozzle_size * 0.875
|
||||||
|
|
||||||
material_print_temperature = =default_material_print_temperature + 5
|
material_print_temperature = =default_material_print_temperature + 5
|
||||||
|
|
|
@ -11,7 +11,6 @@ weight = -2
|
||||||
material = chromatik_pla
|
material = chromatik_pla
|
||||||
|
|
||||||
[values]
|
[values]
|
||||||
layer_height = 0.2
|
|
||||||
line_width = =machine_nozzle_size * 0.875
|
line_width = =machine_nozzle_size * 0.875
|
||||||
|
|
||||||
material_print_temperature = =default_material_print_temperature + 10
|
material_print_temperature = =default_material_print_temperature + 10
|
||||||
|
|
|
@ -11,7 +11,6 @@ weight = 0
|
||||||
material = chromatik_pla
|
material = chromatik_pla
|
||||||
|
|
||||||
[values]
|
[values]
|
||||||
layer_height = 0.1
|
|
||||||
line_width = =machine_nozzle_size * 0.875
|
line_width = =machine_nozzle_size * 0.875
|
||||||
|
|
||||||
speed_print = 35
|
speed_print = 35
|
||||||
|
|
|
@ -11,7 +11,6 @@ weight = -1
|
||||||
material = chromatik_pla
|
material = chromatik_pla
|
||||||
|
|
||||||
[values]
|
[values]
|
||||||
layer_height = 0.15
|
|
||||||
line_width = =machine_nozzle_size * 0.875
|
line_width = =machine_nozzle_size * 0.875
|
||||||
|
|
||||||
material_print_temperature = =default_material_print_temperature + 5
|
material_print_temperature = =default_material_print_temperature + 5
|
||||||
|
|
|
@ -11,7 +11,6 @@ weight = -2
|
||||||
material = chromatik_pla
|
material = chromatik_pla
|
||||||
|
|
||||||
[values]
|
[values]
|
||||||
layer_height = 0.2
|
|
||||||
line_width = =machine_nozzle_size * 0.875
|
line_width = =machine_nozzle_size * 0.875
|
||||||
|
|
||||||
material_print_temperature = =default_material_print_temperature + 10
|
material_print_temperature = =default_material_print_temperature + 10
|
||||||
|
|
|
@ -11,7 +11,6 @@ weight = 0
|
||||||
material = chromatik_pla
|
material = chromatik_pla
|
||||||
|
|
||||||
[values]
|
[values]
|
||||||
layer_height = 0.1
|
|
||||||
line_width = =machine_nozzle_size * 0.875
|
line_width = =machine_nozzle_size * 0.875
|
||||||
|
|
||||||
speed_print = 35
|
speed_print = 35
|
||||||
|
|
|
@ -11,7 +11,6 @@ weight = -1
|
||||||
material = chromatik_pla
|
material = chromatik_pla
|
||||||
|
|
||||||
[values]
|
[values]
|
||||||
layer_height = 0.15
|
|
||||||
line_width = =machine_nozzle_size * 0.875
|
line_width = =machine_nozzle_size * 0.875
|
||||||
|
|
||||||
material_print_temperature = =default_material_print_temperature + 5
|
material_print_temperature = =default_material_print_temperature + 5
|
||||||
|
|
|
@ -11,7 +11,6 @@ weight = -2
|
||||||
material = chromatik_pla
|
material = chromatik_pla
|
||||||
|
|
||||||
[values]
|
[values]
|
||||||
layer_height = 0.2
|
|
||||||
line_width = =machine_nozzle_size * 0.875
|
line_width = =machine_nozzle_size * 0.875
|
||||||
|
|
||||||
material_print_temperature = =default_material_print_temperature + 10
|
material_print_temperature = =default_material_print_temperature + 10
|
||||||
|
|
|
@ -11,7 +11,6 @@ weight = 0
|
||||||
material = chromatik_pla
|
material = chromatik_pla
|
||||||
|
|
||||||
[values]
|
[values]
|
||||||
layer_height = 0.1
|
|
||||||
line_width = =machine_nozzle_size * 0.875
|
line_width = =machine_nozzle_size * 0.875
|
||||||
|
|
||||||
speed_print = 35
|
speed_print = 35
|
||||||
|
|
|
@ -11,7 +11,6 @@ weight = -1
|
||||||
material = chromatik_pla
|
material = chromatik_pla
|
||||||
|
|
||||||
[values]
|
[values]
|
||||||
layer_height = 0.15
|
|
||||||
line_width = =machine_nozzle_size * 0.875
|
line_width = =machine_nozzle_size * 0.875
|
||||||
|
|
||||||
material_print_temperature = =default_material_print_temperature + 5
|
material_print_temperature = =default_material_print_temperature + 5
|
||||||
|
|
|
@ -11,7 +11,6 @@ weight = -2
|
||||||
material = chromatik_pla
|
material = chromatik_pla
|
||||||
|
|
||||||
[values]
|
[values]
|
||||||
layer_height = 0.2
|
|
||||||
line_width = =machine_nozzle_size * 0.875
|
line_width = =machine_nozzle_size * 0.875
|
||||||
|
|
||||||
material_print_temperature = =default_material_print_temperature + 10
|
material_print_temperature = =default_material_print_temperature + 10
|
||||||
|
|
|
@ -11,7 +11,6 @@ weight = 0
|
||||||
material = chromatik_pla
|
material = chromatik_pla
|
||||||
|
|
||||||
[values]
|
[values]
|
||||||
layer_height = 0.1
|
|
||||||
line_width = =machine_nozzle_size * 0.875
|
line_width = =machine_nozzle_size * 0.875
|
||||||
|
|
||||||
speed_print = 30
|
speed_print = 30
|
||||||
|
|
|
@ -11,7 +11,6 @@ weight = -1
|
||||||
material = chromatik_pla
|
material = chromatik_pla
|
||||||
|
|
||||||
[values]
|
[values]
|
||||||
layer_height = 0.15
|
|
||||||
line_width = =machine_nozzle_size * 0.875
|
line_width = =machine_nozzle_size * 0.875
|
||||||
|
|
||||||
material_print_temperature = =default_material_print_temperature + 5
|
material_print_temperature = =default_material_print_temperature + 5
|
||||||
|
|
|
@ -11,7 +11,6 @@ weight = -2
|
||||||
material = chromatik_pla
|
material = chromatik_pla
|
||||||
|
|
||||||
[values]
|
[values]
|
||||||
layer_height = 0.2
|
|
||||||
line_width = =machine_nozzle_size * 0.875
|
line_width = =machine_nozzle_size * 0.875
|
||||||
|
|
||||||
material_print_temperature = =default_material_print_temperature + 10
|
material_print_temperature = =default_material_print_temperature + 10
|
||||||
|
|
|
@ -11,7 +11,6 @@ weight = 0
|
||||||
material = chromatik_pla
|
material = chromatik_pla
|
||||||
|
|
||||||
[values]
|
[values]
|
||||||
layer_height = 0.1
|
|
||||||
line_width = =machine_nozzle_size * 0.875
|
line_width = =machine_nozzle_size * 0.875
|
||||||
|
|
||||||
speed_print = 30
|
speed_print = 30
|
||||||
|
|
|
@ -11,7 +11,6 @@ weight = -1
|
||||||
material = chromatik_pla
|
material = chromatik_pla
|
||||||
|
|
||||||
[values]
|
[values]
|
||||||
layer_height = 0.15
|
|
||||||
line_width = =machine_nozzle_size * 0.875
|
line_width = =machine_nozzle_size * 0.875
|
||||||
|
|
||||||
material_print_temperature = =default_material_print_temperature + 5
|
material_print_temperature = =default_material_print_temperature + 5
|
||||||
|
|
|
@ -14,8 +14,6 @@ variant = Lite 0.4 mm
|
||||||
[values]
|
[values]
|
||||||
adhesion_type = raft
|
adhesion_type = raft
|
||||||
speed_print = 80
|
speed_print = 80
|
||||||
layer_height = 0.2
|
|
||||||
layer_height_0 = 0.2
|
|
||||||
cool_fan_enabled = False
|
cool_fan_enabled = False
|
||||||
cool_fan_full_at_height = 0.4
|
cool_fan_full_at_height = 0.4
|
||||||
cool_fan_speed = 50
|
cool_fan_speed = 50
|
||||||
|
|
|
@ -14,8 +14,6 @@ variant = Lite 0.4 mm
|
||||||
[values]
|
[values]
|
||||||
adhesion_type = raft
|
adhesion_type = raft
|
||||||
speed_print = 45
|
speed_print = 45
|
||||||
layer_height = 0.1
|
|
||||||
layer_height_0 = 0.1
|
|
||||||
cool_fan_enabled = False
|
cool_fan_enabled = False
|
||||||
cool_fan_full_at_height = 0.2
|
cool_fan_full_at_height = 0.2
|
||||||
cool_fan_speed = 50
|
cool_fan_speed = 50
|
||||||
|
|
|
@ -14,8 +14,6 @@ variant = Lite 0.4 mm
|
||||||
[values]
|
[values]
|
||||||
adhesion_type = raft
|
adhesion_type = raft
|
||||||
speed_print = 60
|
speed_print = 60
|
||||||
layer_height = 0.15
|
|
||||||
layer_height_0 = 0.15
|
|
||||||
cool_fan_enabled = False
|
cool_fan_enabled = False
|
||||||
cool_fan_full_at_height = 0.3
|
cool_fan_full_at_height = 0.3
|
||||||
cool_fan_speed = 50
|
cool_fan_speed = 50
|
||||||
|
|
|
@ -23,8 +23,6 @@ cool_min_layer_time = 5
|
||||||
cool_min_speed = 0
|
cool_min_speed = 0
|
||||||
infill_overlap = 15
|
infill_overlap = 15
|
||||||
infill_sparse_density = 24
|
infill_sparse_density = 24
|
||||||
layer_height = 0.20
|
|
||||||
layer_height_0 = 0.15
|
|
||||||
line_width = =machine_nozzle_size
|
line_width = =machine_nozzle_size
|
||||||
material_flow = 100
|
material_flow = 100
|
||||||
raft_airgap = 0.22
|
raft_airgap = 0.22
|
||||||
|
|
|
@ -23,8 +23,6 @@ cool_min_layer_time = 5
|
||||||
cool_min_speed = 0
|
cool_min_speed = 0
|
||||||
infill_overlap = 15
|
infill_overlap = 15
|
||||||
infill_sparse_density = 24
|
infill_sparse_density = 24
|
||||||
layer_height = 0.10
|
|
||||||
layer_height_0 = 0.10
|
|
||||||
line_width = =machine_nozzle_size
|
line_width = =machine_nozzle_size
|
||||||
material_flow = 100
|
material_flow = 100
|
||||||
raft_airgap = 0.22
|
raft_airgap = 0.22
|
||||||
|
|
|
@ -23,8 +23,6 @@ cool_min_layer_time = 5
|
||||||
cool_min_speed = 0
|
cool_min_speed = 0
|
||||||
infill_overlap = 15
|
infill_overlap = 15
|
||||||
infill_sparse_density = 24
|
infill_sparse_density = 24
|
||||||
layer_height = 0.15
|
|
||||||
layer_height_0 = 0.10
|
|
||||||
line_width = =machine_nozzle_size
|
line_width = =machine_nozzle_size
|
||||||
material_flow = 100
|
material_flow = 100
|
||||||
raft_airgap = 0.22
|
raft_airgap = 0.22
|
||||||
|
|
|
@ -14,8 +14,6 @@ variant = Lite 0.4 mm
|
||||||
[values]
|
[values]
|
||||||
adhesion_type = skirt
|
adhesion_type = skirt
|
||||||
speed_print = 80
|
speed_print = 80
|
||||||
layer_height = 0.2
|
|
||||||
layer_height_0 = 0.2
|
|
||||||
cool_fan_enabled = True
|
cool_fan_enabled = True
|
||||||
cool_fan_full_at_height = 0.4
|
cool_fan_full_at_height = 0.4
|
||||||
cool_fan_speed = 100
|
cool_fan_speed = 100
|
||||||
|
|
|
@ -14,8 +14,6 @@ variant = Lite 0.4 mm
|
||||||
[values]
|
[values]
|
||||||
adhesion_type = skirt
|
adhesion_type = skirt
|
||||||
speed_print = 45
|
speed_print = 45
|
||||||
layer_height = 0.1
|
|
||||||
layer_height_0 = 0.1
|
|
||||||
cool_fan_enabled = True
|
cool_fan_enabled = True
|
||||||
cool_fan_full_at_height = 0.2
|
cool_fan_full_at_height = 0.2
|
||||||
cool_fan_speed = 100
|
cool_fan_speed = 100
|
||||||
|
|
|
@ -14,8 +14,6 @@ variant = Lite 0.4 mm
|
||||||
[values]
|
[values]
|
||||||
adhesion_type = skirt
|
adhesion_type = skirt
|
||||||
speed_print = 60
|
speed_print = 60
|
||||||
layer_height = 0.15
|
|
||||||
layer_height_0 = 0.15
|
|
||||||
cool_fan_enabled = True
|
cool_fan_enabled = True
|
||||||
cool_fan_full_at_height = 0.3
|
cool_fan_full_at_height = 0.3
|
||||||
cool_fan_speed = 100
|
cool_fan_speed = 100
|
||||||
|
|
|
@ -14,8 +14,6 @@ weight = -1
|
||||||
[values]
|
[values]
|
||||||
adhesion_type = skirt
|
adhesion_type = skirt
|
||||||
speed_print = 80
|
speed_print = 80
|
||||||
layer_height = 0.2
|
|
||||||
layer_height_0 = 0.2
|
|
||||||
cool_fan_enabled = True
|
cool_fan_enabled = True
|
||||||
cool_fan_full_at_height = 0.4
|
cool_fan_full_at_height = 0.4
|
||||||
cool_fan_speed = 100
|
cool_fan_speed = 100
|
||||||
|
|
|
@ -13,8 +13,6 @@ weight = 1
|
||||||
|
|
||||||
[values]
|
[values]
|
||||||
adhesion_type = skirt
|
adhesion_type = skirt
|
||||||
layer_height = 0.1
|
|
||||||
layer_height_0 = 0.1
|
|
||||||
cool_fan_enabled = True
|
cool_fan_enabled = True
|
||||||
cool_fan_full_at_height = 0.2
|
cool_fan_full_at_height = 0.2
|
||||||
cool_fan_speed = 100
|
cool_fan_speed = 100
|
||||||
|
|
|
@ -14,8 +14,6 @@ weight = 0
|
||||||
[values]
|
[values]
|
||||||
adhesion_type = skirt
|
adhesion_type = skirt
|
||||||
speed_print = 80
|
speed_print = 80
|
||||||
layer_height = 0.15
|
|
||||||
layer_height_0 = 0.15
|
|
||||||
cool_fan_enabled = True
|
cool_fan_enabled = True
|
||||||
cool_fan_full_at_height = 0.3
|
cool_fan_full_at_height = 0.3
|
||||||
cool_fan_speed = 100
|
cool_fan_speed = 100
|
||||||
|
|
|
@ -11,7 +11,6 @@ weight = -2
|
||||||
material = redd_abs
|
material = redd_abs
|
||||||
global_quality = True
|
global_quality = True
|
||||||
|
|
||||||
|
|
||||||
[values]
|
[values]
|
||||||
layer_height = 0.3
|
layer_height = 0.3
|
||||||
layer_height_0 = 0.35
|
layer_height_0 = 0.35
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue