diff --git a/.github/workflows/find-packages.yml b/.github/workflows/find-packages.yml new file mode 100644 index 0000000000..ad8fb6271d --- /dev/null +++ b/.github/workflows/find-packages.yml @@ -0,0 +1,25 @@ +name: Conan Package Discovery by Jira Ticket + +on: + workflow_dispatch: + inputs: + jira_ticket_number: + description: 'Jira ticket number for Conan package discovery (e.g., cura_12345)' + required: true + type: string + start_builds: + default: false + required: false + type: boolean + +permissions: + contents: read + +jobs: + find-packages: + name: Find packages for Jira ticket + uses: ultimaker/cura-workflows/.github/workflows/find-package-by-ticket.yml@jira_find_package + with: + jira_ticket_number: ${{ inputs.jira_ticket_number }} + start_builds: ${{ inputs.start_builds }} + secrets: inherit diff --git a/.github/workflows/nightly-stable.yml b/.github/workflows/nightly-stable.yml index 2790947ae8..badcef44e6 100644 --- a/.github/workflows/nightly-stable.yml +++ b/.github/workflows/nightly-stable.yml @@ -1,7 +1,8 @@ name: Nightly build - stable release run-name: Nightly build - stable release -# on: +on: + workflow_dispatch: # schedule: # # Daily at 5:15 CET # - cron: '15 4 * * *' diff --git a/.github/workflows/nightly-testing.yml b/.github/workflows/nightly-testing.yml index 13f3670514..08d43570ec 100644 --- a/.github/workflows/nightly-testing.yml +++ b/.github/workflows/nightly-testing.yml @@ -1,10 +1,11 @@ name: Nightly build - dev release run-name: Nightly build - dev release -# on: +on: + workflow_dispatch: # schedule: -# # Daily at 4:15 CET -# - cron: '15 3 * * *' +# # Daily at 5:15 CET +# - cron: '15 4 * * *' jobs: build-nightly: diff --git a/.github/workflows/printer-linter-pr-diagnose.yml b/.github/workflows/printer-linter-pr-diagnose.yml index 8feecdb3ee..64892e0db1 100644 --- a/.github/workflows/printer-linter-pr-diagnose.yml +++ b/.github/workflows/printer-linter-pr-diagnose.yml @@ -2,7 +2,7 @@ name: printer-linter-pr-diagnose on: pull_request: - path: + paths: - "resources/**" permissions: diff --git a/.github/workflows/slicing-error-check.yml b/.github/workflows/slicing-error-check.yml new file mode 100644 index 0000000000..9869ef9721 --- /dev/null +++ b/.github/workflows/slicing-error-check.yml @@ -0,0 +1,65 @@ +name: Slicing Error Check + +on: + issues: + types: [opened, edited] + +permissions: + issues: write + +jobs: + processSlicingError: + runs-on: ubuntu-latest + steps: + - name: Check for project file and set output + id: check_issue_details + uses: actions/github-script@v7 + with: + script: | + const issue = context.payload.issue; + const issueNumber = issue.number; + + console.log(`Processing issue #${issueNumber}: "${issue.title}"`); + + const hasSlicingErrorLabel = issue.labels.some(label => label.name.toLowerCase().includes('slicing error')); + const titleContainsSliceFailed = issue.title.toLowerCase().includes('slice failed'); + const bodyText = issue.body || ""; + const bodyContainsSliceFailed = bodyText.toLowerCase().includes('slice failed'); + let setNeedsInfoOutput = false; + + if (hasSlicingErrorLabel || titleContainsSliceFailed || bodyContainsSliceFailed) { + console.log(`Issue #${issueNumber} matches slicing error criteria.`); + + const zipRegex = /(\[[^\]]*?\]\(.*?\.zip\)|https?:\/\/[^\s]*?\.zip)/i; + let hasZipAttachment = zipRegex.test(bodyText); + + if (hasZipAttachment) { + console.log(`Issue #${issueNumber} appears to have a .zip file linked in the body.`); + } else { + console.log(`Issue #${issueNumber} does not appear to have a .zip file linked in the body. Flagging for further action.`); + setNeedsInfoOutput = true; + } + } else { + console.log(`Issue #${issueNumber} does not match slicing error criteria. No action needed.`); + } + core.setOutput('needs_info', setNeedsInfoOutput.toString()); + + - name: Add comment if project file is missing + if: ${{ steps.check_issue_details.outputs.needs_info == 'true' }} + uses: peter-evans/create-or-update-comment@v4 + with: + issue-number: ${{ github.event.issue.number }} + body: | + This issue is related to a slicing error, but it seems a project file (`.zip`) is missing. + Please attach a `.zip` file containing your project (including models and profiles) so we can reproduce the issue. + This will help us investigate and resolve the problem more effectively. + Have Cura open with your project that fails to slice, go to `Help` > `Export Package For Technical Support`, and save the package. + Then create a .zip file with the package, attach the `.zip` file to this issue. + If you have already attached a `.zip` file, please ensure it is correctly linked in the issue body. + + - name: Add Status Needs Info Label + if: ${{ steps.check_issue_details.outputs.needs_info == 'true' }} + uses: actions-ecosystem/action-add-labels@v1 + with: + labels: | + Status: Needs Info diff --git a/.github/workflows/update-translation.yml b/.github/workflows/update-translation.yml index 189390410b..2134467ec9 100644 --- a/.github/workflows/update-translation.yml +++ b/.github/workflows/update-translation.yml @@ -11,5 +11,5 @@ on: jobs: update-translations: uses: ultimaker/cura-workflows/.github/workflows/update-translations.yml@main - with: - branch: ${{ inputs.branch }} + with: + branch: ${{ inputs.branch }} diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 87657af5f5..8af98c2d0e 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1895,36 +1895,39 @@ class CuraApplication(QtApplication): query = QUrlQuery(url.query()) model_url = QUrl(query.queryItemValue("file", options=QUrl.ComponentFormattingOption.FullyDecoded)) - def on_finish(response): - content_disposition_header_key = QByteArray("content-disposition".encode()) - - filename = model_url.path().split("/")[-1] + ".stl" - - if response.hasRawHeader(content_disposition_header_key): - # content_disposition is in the format - # ``` - # content_disposition attachment; filename="[FILENAME]" - # ``` - # Use a regex to extract the filename - content_disposition = str(response.rawHeader(content_disposition_header_key).data(), - encoding='utf-8') - content_disposition_match = re.match(r'attachment; filename=(?P.*)', - content_disposition) - if content_disposition_match is not None: - filename = content_disposition_match.group("filename").strip("\"") - - tmp = tempfile.NamedTemporaryFile(suffix=filename, delete=False) - with open(tmp.name, "wb") as f: - f.write(response.readAll()) - - self.readLocalFile(QUrl.fromLocalFile(tmp.name), add_to_recent_files=False) - def on_error(*args, **kwargs): - Logger.log("w", "Could not download file from {0}".format(model_url.url())) - Message("Could not download file: " + str(model_url.url()), + Logger.warning(f"Could not download file from {model_url.url()}") + Message(f"Could not download file: {str(model_url.url())}", title= "Loading Model failed", message_type=Message.MessageType.ERROR).show() - return + + def on_finish(response): + try: + content_disposition_header_key = QByteArray("content-disposition".encode()) + + filename = model_url.path().split("/")[-1] + ".stl" + + if response.hasRawHeader(content_disposition_header_key): + # content_disposition is in the format + # ``` + # content_disposition attachment; filename="[FILENAME]" + # ``` + # Use a regex to extract the filename + content_disposition = str(response.rawHeader(content_disposition_header_key).data(), + encoding='utf-8') + content_disposition_match = re.match(r'attachment; filename=(?P.*)', + content_disposition) + if content_disposition_match is not None: + filename = content_disposition_match.group("filename").strip("\"") + + tmp = tempfile.NamedTemporaryFile(suffix=filename, delete=False) + with open(tmp.name, "wb") as f: + f.write(response.readAll()) + + self.readLocalFile(QUrl.fromLocalFile(tmp.name), add_to_recent_files=False) + except Exception as ex: + Logger.warning(f"Exception {str(ex)}") + on_error() self.getHttpRequestManager().get( model_url.url(), diff --git a/cura/LayerDataBuilder.py b/cura/LayerDataBuilder.py index d8801c9e7b..ff80307223 100755 --- a/cura/LayerDataBuilder.py +++ b/cura/LayerDataBuilder.py @@ -80,9 +80,13 @@ class LayerDataBuilder(MeshBuilder): material_colors = numpy.zeros((line_dimensions.shape[0], 4), dtype=numpy.float32) for extruder_nr in range(material_color_map.shape[0]): material_colors[extruders == extruder_nr] = material_color_map[extruder_nr] - # Set material_colors with indices where line_types (also numpy array) == MoveCombingType - material_colors[line_types == LayerPolygon.MoveCombingType] = colors[line_types == LayerPolygon.MoveCombingType] - material_colors[line_types == LayerPolygon.MoveRetractionType] = colors[line_types == LayerPolygon.MoveRetractionType] + # Set material_colors with indices where line_types (also numpy array) == MoveUnretractedType + material_colors[line_types == LayerPolygon.MoveUnretractedType] = colors[line_types == LayerPolygon.MoveUnretractedType] + material_colors[line_types == LayerPolygon.MoveRetractedType] = colors[line_types == LayerPolygon.MoveRetractedType] + material_colors[line_types == LayerPolygon.MoveWhileRetractingType] = colors[ + line_types == LayerPolygon.MoveWhileRetractingType] + material_colors[line_types == LayerPolygon.MoveWhileUnretractingType] = colors[ + line_types == LayerPolygon.MoveWhileUnretractingType] attributes = { "line_dimensions": { diff --git a/cura/LayerPolygon.py b/cura/LayerPolygon.py index e772a8b78e..cd4642d719 100644 --- a/cura/LayerPolygon.py +++ b/cura/LayerPolygon.py @@ -19,15 +19,22 @@ class LayerPolygon: SkirtType = 5 InfillType = 6 SupportInfillType = 7 - MoveCombingType = 8 - MoveRetractionType = 9 + MoveUnretractedType = 8 + MoveRetractedType = 9 SupportInterfaceType = 10 PrimeTowerType = 11 - __number_of_types = 12 + MoveWhileRetractingType = 12 + MoveWhileUnretractingType = 13 + StationaryRetractUnretract = 14 + __number_of_types = 15 - __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.logical_or( + numpy.arange(__number_of_types) == NoneType, + numpy.arange(__number_of_types) == MoveUnretractedType), + numpy.logical_or( + numpy.arange(__number_of_types) == MoveRetractedType, + numpy.arange(__number_of_types) == MoveWhileRetractingType)), + numpy.arange(__number_of_types) == MoveWhileUnretractingType) 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: @@ -269,10 +276,13 @@ class LayerPolygon: theme.getColor("layerview_skirt").getRgbF(), # SkirtType theme.getColor("layerview_infill").getRgbF(), # InfillType theme.getColor("layerview_support_infill").getRgbF(), # SupportInfillType - theme.getColor("layerview_move_combing").getRgbF(), # MoveCombingType - theme.getColor("layerview_move_retraction").getRgbF(), # MoveRetractionType + theme.getColor("layerview_move_combing").getRgbF(), # MoveUnretractedType + theme.getColor("layerview_move_retraction").getRgbF(), # MoveRetractedType theme.getColor("layerview_support_interface").getRgbF(), # SupportInterfaceType - theme.getColor("layerview_prime_tower").getRgbF() # PrimeTowerType + theme.getColor("layerview_prime_tower").getRgbF(), # PrimeTowerType + theme.getColor("layerview_move_while_retracting").getRgbF(), # MoveWhileRetracting + theme.getColor("layerview_move_while_unretracting").getRgbF(), # MoveWhileUnretracting + theme.getColor("layerview_move_retraction").getRgbF(), # StationaryRetractUnretract ]) return cls.__color_map diff --git a/plugins/CuraEngineBackend/Cura.proto b/plugins/CuraEngineBackend/Cura.proto index 238829ba64..cdbe463d81 100644 --- a/plugins/CuraEngineBackend/Cura.proto +++ b/plugins/CuraEngineBackend/Cura.proto @@ -78,10 +78,14 @@ message Polygon { SkirtType = 5; InfillType = 6; SupportInfillType = 7; - MoveCombingType = 8; - MoveRetractionType = 9; + MoveUnretracted = 8; + MoveRetracted = 9; SupportInterfaceType = 10; PrimeTowerType = 11; + MoveWhileRetracting = 12; + MoveWhileUnretracting = 13; + StationaryRetractUnretract = 14; + NumPrintFeatureTypes = 15; } Type type = 1; // Type of move bytes points = 2; // The points of the polygon, or two points if only a line segment (Currently only line segments are used) diff --git a/plugins/GCodeReader/FlavorParser.py b/plugins/GCodeReader/FlavorParser.py index 74dbeadec0..f83a9bbb34 100644 --- a/plugins/GCodeReader/FlavorParser.py +++ b/plugins/GCodeReader/FlavorParser.py @@ -133,7 +133,10 @@ class FlavorParser: if i > 0: line_feedrates[i - 1] = point[3] line_types[i - 1] = point[5] - if point[5] in [LayerPolygon.MoveCombingType, LayerPolygon.MoveRetractionType]: + if point[5] in [LayerPolygon.MoveUnretractedType, + LayerPolygon.MoveRetractedType, + LayerPolygon.MoveWhileRetractingType, + LayerPolygon.MoveWhileUnretractingType]: line_widths[i - 1] = 0.1 line_thicknesses[i - 1] = 0.0 # Travels are set as zero thickness lines else: @@ -196,7 +199,7 @@ class FlavorParser: path.append([x, y, z, f, new_extrusion_value + self._extrusion_length_offset[self._extruder_number], self._layer_type]) # extrusion self._previous_extrusion_value = new_extrusion_value else: - path.append([x, y, z, f, new_extrusion_value + self._extrusion_length_offset[self._extruder_number], LayerPolygon.MoveRetractionType]) # retraction + path.append([x, y, z, f, new_extrusion_value + self._extrusion_length_offset[self._extruder_number], LayerPolygon.MoveRetractedType]) # retraction e[self._extruder_number] = new_extrusion_value # Only when extruding we can determine the latest known "layer height" which is the difference in height between extrusions @@ -205,9 +208,9 @@ class FlavorParser: self._current_layer_thickness = z - self._previous_z # allow a tiny overlap self._previous_z = z elif self._previous_extrusion_value > e[self._extruder_number]: - path.append([x, y, z, f, e[self._extruder_number] + self._extrusion_length_offset[self._extruder_number], LayerPolygon.MoveRetractionType]) + path.append([x, y, z, f, e[self._extruder_number] + self._extrusion_length_offset[self._extruder_number], LayerPolygon.MoveRetractedType]) else: - path.append([x, y, z, f, e[self._extruder_number] + self._extrusion_length_offset[self._extruder_number], LayerPolygon.MoveCombingType]) + path.append([x, y, z, f, e[self._extruder_number] + self._extrusion_length_offset[self._extruder_number], LayerPolygon.MoveUnretractedType]) return self._position(x, y, z, f, e) @@ -419,7 +422,7 @@ class FlavorParser: self._createPolygon(self._current_layer_thickness, current_path, self._extruder_offsets.get(self._extruder_number, [0, 0])) current_path.clear() # Start the new layer at the end position of the last layer - current_path.append([current_position.x, current_position.y, current_position.z, current_position.f, current_position.e[self._extruder_number], LayerPolygon.MoveCombingType]) + current_path.append([current_position.x, current_position.y, current_position.z, current_position.f, current_position.e[self._extruder_number], LayerPolygon.MoveUnretractedType]) # When using a raft, the raft layers are stored as layers < 0, it mimics the same behavior # as in ProcessSlicedLayersJob @@ -461,9 +464,9 @@ class FlavorParser: # When changing tool, store the end point of the previous path, then process the code and finally # add another point with the new position of the head. - current_path.append([current_position.x, current_position.y, current_position.z, current_position.f, current_position.e[self._extruder_number], LayerPolygon.MoveCombingType]) + current_path.append([current_position.x, current_position.y, current_position.z, current_position.f, current_position.e[self._extruder_number], LayerPolygon.MoveUnretractedType]) current_position = self.processTCode(global_stack, T, line, current_position, current_path) - current_path.append([current_position.x, current_position.y, current_position.z, current_position.f, current_position.e[self._extruder_number], LayerPolygon.MoveCombingType]) + current_path.append([current_position.x, current_position.y, current_position.z, current_position.f, current_position.e[self._extruder_number], LayerPolygon.MoveUnretractedType]) if line.startswith("M"): M = self._getInt(line, "M") diff --git a/plugins/PostProcessingPlugin/scripts/AddCoolingProfile.py b/plugins/PostProcessingPlugin/scripts/AddCoolingProfile.py index 44709afd24..b046a77c2f 100644 --- a/plugins/PostProcessingPlugin/scripts/AddCoolingProfile.py +++ b/plugins/PostProcessingPlugin/scripts/AddCoolingProfile.py @@ -1,16 +1,21 @@ -# Designed in January 2023 by GregValiant (Greg Foresi) -## My design intent was to make this as full featured and "industrial strength" as I could. People printing exotic materials on large custom printers may want to turn the fans off for certain layers, and then back on again later in the print. This script allows that. -# Functions: -## Remove all fan speed lines from the file (optional). This should be enabled for the first instance of the script. It is disabled by default in any following instances. -## "By Layer" allows the user to adjust the fan speed up, or down, or off, within the print. "By Feature" allows different fan speeds for different features (;TYPE:WALL-OUTER, etc.). -## If 'By Feature' then a Start Layer and/or an End Layer can be defined. -## Fan speeds are scaled PWM (0 - 255) or RepRap (0.0 - 1.0) depending on {machine_scale_fan_speed_zero_to_one}. -## A minimum fan speed of 12% is enforced. It is the slowest speed that my cooling fan will turn on so that's what I used. 'M106 S14' (as Cura might insert) was pretty useless. -## If multiple extruders have separate fan circuits the speeds are set at tool changes and conform to the layer or feature setting. There is support for up to 4 layer cooling fan circuits. -## My thanks to @5axes(@CUQ), @fieldOfView(@AHoeben), @Ghostkeeper, and @Torgeir. A special thanks to @RBurema for his patience in reviewing my 'non-pythonic' script. -## 9/14/23 (Greg Foresi) Added support for One-at-a-Time print sequence. -## 12/15/23 (Greg Foresi) Split off 'Single Fan By Layer', 'Multi-fan By Layer', 'Single Fan By Feature', and 'Multi-fan By Feature' from the main 'execute' script. -## 1/5/24 (Greg Foresi) Revised the regex replacements. +""" +Designed in January 2023 by GregValiant (Greg Foresi) + My design intent was to make this as full featured and "industrial strength" as I could. People printing exotic materials on large custom printers may want to turn the fans off for certain layers, and then back on again later in the print. This script allows that. + Functions: + Remove all fan speed lines from the file (optional). This should be enabled for the first instance of the script. It is disabled by default in any following instances. + "By Layer" allows the user to adjust the fan speed up, or down, or off, within the print. "By Feature" allows different fan speeds for different features (;TYPE:WALL-OUTER, etc.). + If 'By Feature' then a Start Layer and/or an End Layer can be defined. + Fan speeds are scaled PWM (0 - 255) or RepRap (0.0 - 1.0) depending on {machine_scale_fan_speed_zero_to_one}. + A minimum fan speed of 12% is enforced. It is the slowest speed that my cooling fan will turn on so that's what I used. 'M106 S14' (as Cura might insert) was pretty useless. + If multiple extruders have separate fan circuits the speeds are set at tool changes and conform to the layer or feature setting. There is support for up to 4 layer cooling fan circuits. + My thanks to @5axes(@CUQ), @fieldOfView(@AHoeben), @Ghostkeeper, and @Torgeir. A special thanks to @RBurema for his patience in reviewing my 'non-pythonic' script. + Changes: + 09/14/23 (GV) Added support for One-at-a-Time print sequence. + 12/15/23 (GV) Split off 'Single Fan By Layer', 'Multi-fan By Layer', 'Single Fan By Feature', and 'Multi-fan By Feature' from the main 'execute' script. + 01/05/24 (GV) Revised the regex replacements. + 12/11/24 (GV) Added 'off_fan_speed' for the idle nozzle layer cooling fan. It does not have to go to 0%. + 03/22/25 (GV) Added 'Chamber Cooling Fan / Auxiliary Fan' control. +""" from ..Script import Script from UM.Application import Application @@ -43,7 +48,8 @@ class AddCoolingProfile(Script): "type": "bool", "enabled": true, "value": true, - "default_value": true + "default_value": true, + "read_only": true }, "feature_fan_start_layer": { @@ -273,67 +279,180 @@ class AddCoolingProfile(Script): "maximum_value": 100, "unit": "% ", "enabled": "fan_enable_raft" + }, + "enable_off_fan_speed": + { + "label": "Enable 'Off speed' of the idle fan", + "description": "For machines with independent layer cooling fans. Leaving a fan running while the other nozzle is printing can help with oozing. You can pick the speed % for the idle nozzle layer cooling fan to hold at.", + "type": "bool", + "default_value": false, + "enabled": "enable_off_fan_speed_enable and self.extruder_count > 1" + }, + "off_fan_speed": + { + "label": " 'Off' speed of idle nozzle fan", + "description": "This is the speed that the 'idle nozzle' layer cooling fan will maintain rather than being turned off completely.", + "type": "int", + "default_value": 35, + "minimum_value": 0, + "maximum_value": 100, + "unit": "% ", + "enabled": "enable_off_fan_speed_enable and enable_off_fan_speed and self.extruder_count > 1" + }, + "enable_off_fan_speed_enable": + { + "label": "Hidden setting", + "description": "For dual extruder printers, this enables 'enable_off_fan_speed'.", + "type": "bool", + "default_value": false, + "enabled": false + }, + "bv_fan_speed_control_enable": + { + "label": "Enable 'Chamber/Aux Fan' control", + "description": "Controls the 'Build Volume Fan' or an 'Auxiliary Fan' on printers with that hardware. Provides: 'On' layer, 'Off' layer, and PWM speed control of a secondary fan.", + "type": "bool", + "default_value": false, + "enabled": "enable_bv_fan" + }, + "bv_fan_nr": + { + "label": " Chamber/Aux Fan Number", + "description": "The mainboard circuit number of the Chamber or Auxiliary Fan.", + "type": "int", + "unit": "# ", + "default_value": 0, + "minimum_value": 0, + "enabled": "enable_bv_fan and bv_fan_speed_control_enable" + }, + "bv_fan_speed": + { + "label": " Chamber/Aux Fan Speed %", + "description": "The speed of the Chamber or Auxiliary Fan. This will be converted to PWM Duty Cycle (0-255) or (RepRap 0-1 if that is enabled in Cura). If your specified fan does not operate on variable speeds then set this to '100'.", + "type": "int", + "unit": "% ", + "default_value": 50, + "maximum_value": 100, + "minimum_value": 0, + "enabled": "enable_bv_fan and bv_fan_speed_control_enable" + }, + "bv_fan_start_layer": + { + "label": " Chamber/Aux Fan Start Layer", + "description": "The layer to start the Chamber or Auxiliary Fan. Use the Cura preview layer number and the fan will start at the beginning of the layer.", + "type": "int", + "unit": "Layer# ", + "default_value": 1, + "minimum_value": 1, + "enabled": "enable_bv_fan and bv_fan_speed_control_enable" + }, + "bv_fan_end_layer": + { + "label": " Chamber/Aux Fan End Layer", + "description": "The layer number for Chamber or Auxiliary Fan to turn off. Use the Cura preview layer number or '-1' to indicate the end of the print. The fan will run until the end of the layer", + "type": "int", + "unit": "Layer# ", + "default_value": -1, + "minimum_value": -1, + "enabled": "enable_bv_fan and bv_fan_speed_control_enable" + }, + "enable_bv_fan": + { + "label": "Hidden setting", + "description": "This is enabled when machine_heated_bed is true, and in turn this enables 'bv_fan_speed_control_enable'.", + "type": "bool", + "default_value": false, + "enabled": false } } }""" def initialize(self) -> None: super().initialize() - scripts = Application.getInstance().getGlobalContainerStack().getMetaDataEntry("post_processing_scripts") + self.global_stack = Application.getInstance().getGlobalContainerStack() + self.extruder_list = self.global_stack.extruderList + self.extruder_count = self.global_stack.getProperty("machine_extruder_count", "value") + scripts = self.global_stack.getMetaDataEntry("post_processing_scripts") if scripts != None: script_count = scripts.count("AddCoolingProfile") if script_count > 0: - ## Set 'Remove M106 lines' to "false" if there is already an instance of this script running. + # Set 'Remove M106 lines' to "false" if there is already an instance of this script running. self._instance.setProperty("delete_existing_m106", "value", False) + self._instance.setProperty("enable_off_fan_speed_enable", "value", False) + if self.extruder_count > 1: + if self.extruder_list[0].getProperty("machine_extruder_cooling_fan_number", "value") != self.extruder_list[1].getProperty("machine_extruder_cooling_fan_number", "value"): + self._instance.setProperty("enable_off_fan_speed_enable", "value", True) + if bool(self.global_stack.getProperty("machine_heated_bed", "value")): + self._instance.setProperty("enable_bv_fan", "value", True) def execute(self, data): - #Initialize variables that are buried in if statements. - mycura = Application.getInstance().getGlobalContainerStack() + """ + Collect the settings from Cura and from this script + params: + t0_fan thru t3_fan: The fan numbers for up to 4 layer cooling circuits + fan_mode: Whether the fan scale will be 0-255 PWM (when true) or 0-1 RepRap (when false) + bed_adhesion: Is only important if a raft is enabled + print_seuence: Options are slightly different if in One-at-a-Time mode + is_multi-fan: Used to distinguish between a multi-extruder with a single fan for each nozzle, or one fan for both nozzles. + is_multi_extr_print: For the slight difference in handling a multi-extruder printer and a print that only uses one of the extruders. + fan_list: A list of fan speeds (even numbered items) and layer numbers (odd numbered items) + feature_speed_list: A list of the speeds for each ';TYPE:' in the gcode + feature_name_list: The list of each 'TYPE' in the gcode + off_fan_speed: The speed that will be maintained by the fan for the inactive extruder (for an anti-oozing effect) + init_fan: The fan number of the first extruder used in a print + delete_existing_m106: The first instance of the script in the post processing list should remove the CUra M106 lines. Following instances should not delete the changes made by the first instance. + feature_fan_combing: Whether or not to shut the cooling fan off during travel moves. + the_start_layer: When in By Feature this is the user selected start of the fan changes. + the_end_layer: When in By Feature this is the user selected end of the fan changes + the_end_is_enabled: When in By Feature, if the fan control ends before the print ends, then this will enable the Final Fan Speed to carry through to the print end. + + """ + # Exit if the gcode has been previously post-processed. + if ";POSTPROCESSED" in data[0]: + return data + # Initialize variables that are buried in if statements. t0_fan = " P0"; t1_fan = " P0"; t2_fan = " P0"; t3_fan = " P0"; is_multi_extr_print = True - #Get some information from Cura----------------------------------- - extruder = mycura.extruderList - - #This will be true when fan scale is 0-255pwm and false when it's RepRap 0-1 (Cura 5.x) + # This will be true when fan scale is 0-255pwm and false when it's RepRap 0-1 (Cura 5.x) fan_mode = True - ##For 4.x versions that don't have the 0-1 option + # For 4.x versions that don't have the 0-1 option try: - fan_mode = not bool(extruder[0].getProperty("machine_scale_fan_speed_zero_to_one", "value")) - except: + fan_mode = not bool(self.extruder_list[0].getProperty("machine_scale_fan_speed_zero_to_one", "value")) + except AttributeError: pass - bed_adhesion = (extruder[0].getProperty("adhesion_type", "value")) - extruder_count = mycura.getProperty("machine_extruder_count", "value") - print_sequence = str(mycura.getProperty("print_sequence", "value")) - #Assign the fan numbers to the tools------------------------------ - if extruder_count == 1: + bed_adhesion = (self.extruder_list[0].getProperty("adhesion_type", "value")) + print_sequence = str(self.global_stack.getProperty("print_sequence", "value")) + + # Assign the fan numbers to the tools + if self.extruder_count == 1: is_multi_fan = False is_multi_extr_print = False - if int((extruder[0].getProperty("machine_extruder_cooling_fan_number", "value"))) > 0: - t0_fan = " P" + str((extruder[0].getProperty("machine_extruder_cooling_fan_number", "value"))) + if int((self.extruder_list[0].getProperty("machine_extruder_cooling_fan_number", "value"))) > 0: + t0_fan = " P" + str((self.extruder_list[0].getProperty("machine_extruder_cooling_fan_number", "value"))) else: - #No P parameter if there is a single fan circuit------------------ + # No P parameter if there is a single fan circuit t0_fan = "" - #Get the cooling fan numbers for each extruder if the printer has multiple extruders - elif extruder_count > 1: + # Get the cooling fan numbers for each extruder if the printer has multiple extruders + elif self.extruder_count > 1: is_multi_fan = True - t0_fan = " P" + str((extruder[0].getProperty("machine_extruder_cooling_fan_number", "value"))) + t0_fan = " P" + str((self.extruder_list[0].getProperty("machine_extruder_cooling_fan_number", "value"))) if is_multi_fan: - if extruder_count > 1: t1_fan = " P" + str((extruder[1].getProperty("machine_extruder_cooling_fan_number", "value"))) - if extruder_count > 2: t2_fan = " P" + str((extruder[2].getProperty("machine_extruder_cooling_fan_number", "value"))) - if extruder_count > 3: t3_fan = " P" + str((extruder[3].getProperty("machine_extruder_cooling_fan_number", "value"))) + if self.extruder_count > 1: t1_fan = " P" + str((self.extruder_list[1].getProperty("machine_extruder_cooling_fan_number", "value"))) + if self.extruder_count > 2: t2_fan = " P" + str((self.extruder_list[2].getProperty("machine_extruder_cooling_fan_number", "value"))) + if self.extruder_count > 3: t3_fan = " P" + str((self.extruder_list[3].getProperty("machine_extruder_cooling_fan_number", "value"))) - #Initialize the fan_list with defaults---------------------------- + # Initialize the fan_list with defaults fan_list = ["z"] * 16 for num in range(0,15,2): fan_list[num] = len(data) fan_list[num + 1] = "M106 S0" - #Assign the variable values if "By Layer"------------------------- + # Assign the variable values if "By Layer" by_layer_or_feature = self.getSettingValueByKey("fan_layer_or_feature") if by_layer_or_feature == "by_layer": - ## By layer doesn't do any feature search so there is no need to look for combing moves + # By layer doesn't do any feature search so there is no need to look for combing moves feature_fan_combing = False fan_list[0] = self.getSettingValueByKey("layer_fan_1") fan_list[2] = self.getSettingValueByKey("layer_fan_2") @@ -343,25 +462,25 @@ class AddCoolingProfile(Script): fan_list[10] = self.getSettingValueByKey("layer_fan_6") fan_list[12] = self.getSettingValueByKey("layer_fan_7") fan_list[14] = self.getSettingValueByKey("layer_fan_8") - ## If there is no '/' delimiter then ignore the line else put the settings in a list + # If there is no '/' delimiter then ignore the line else put the settings in a list for num in range(0,15,2): if "/" in fan_list[num]: fan_list[num + 1] = self._layer_checker(fan_list[num], "p", fan_mode) fan_list[num] = self._layer_checker(fan_list[num], "l", fan_mode) - ## Assign the variable values if "By Feature" + # Assign the variable values if "By Feature" elif by_layer_or_feature == "by_feature": the_start_layer = self.getSettingValueByKey("feature_fan_start_layer") - 1 the_end_layer = self.getSettingValueByKey("feature_fan_end_layer") try: if int(the_end_layer) != -1: - ## Catch a possible input error. + # Catch a possible input error. if the_end_layer < the_start_layer: the_end_layer = the_start_layer - except: - the_end_layer = -1 ## If there is an input error default to the entire gcode file. + except ValueError: + the_end_layer = -1 # If there is an input error then default to the entire gcode file. - ## Get the speed for each feature + # Get the speed for each feature feature_name_list = [] feature_speed_list = [] feature_speed_list.append(self._feature_checker(self.getSettingValueByKey("feature_fan_skirt"), fan_mode)); feature_name_list.append(";TYPE:SKIRT") @@ -376,20 +495,29 @@ class AddCoolingProfile(Script): feature_speed_list.append(self._feature_checker(self.getSettingValueByKey("feature_fan_feature_final"), fan_mode)); feature_name_list.append("FINAL_FAN") feature_fan_combing = self.getSettingValueByKey("feature_fan_combing") if the_end_layer > -1 and by_layer_or_feature == "by_feature": - ## Required so the final speed input can be determined + # Required so the final speed input can be determined the_end_is_enabled = True else: - ## There is no ending layer so do the whole file + # There is no ending layer so do the whole file the_end_is_enabled = False if the_end_layer == -1 or the_end_is_enabled == False: the_end_layer = len(data) + 2 - ## Find the Layer0Index and the RaftIndex + # For multi-extruder printers with separate cooling fans the 'idle' nozzle fan can be left on for ooze control + off_fan_speed = 0 + if self.extruder_count > 1: + if self.getSettingValueByKey("enable_off_fan_speed"): + if fan_mode: + off_fan_speed = round(int(self.getSettingValueByKey("off_fan_speed")) * 2.55) + else: + off_fan_speed = round(int(self.getSettingValueByKey("off_fan_speed")) * .01, 2) + + # Find the Layer0Index and the RaftIndex raft_start_index = 0 number_of_raft_layers = 0 layer_0_index = 0 - ## Catch the number of raft layers. - for l_num in range(1,10,1): + # Catch the number of raft layers. + for l_num in range(1,len(data) - 1): layer = data[l_num] if ";LAYER:-" in layer: number_of_raft_layers += 1 @@ -399,14 +527,14 @@ class AddCoolingProfile(Script): layer_0_index = l_num break - ## Is this a single extruder print on a multi-extruder printer? - get the correct fan number for the extruder being used. + # Is this a single extruder print on a multi-extruder printer? - get the correct fan number for the extruder being used. if is_multi_fan: T0_used = False T1_used = False T2_used = False T3_used = False - ## Bypass the file header and ending gcode. - for num in range(1,len(data)-1,1): + # Bypass the file header and ending gcode. + for num in range(1,len(data)-1): lines = data[num] if "T0" in lines: T0_used = True @@ -418,7 +546,7 @@ class AddCoolingProfile(Script): T3_used = True is_multi_extr_print = True if sum([T0_used, T1_used, T2_used, T3_used]) > 1 else False - ## On a multi-extruder printer and single extruder print find out which extruder starts the file. + # On a multi-extruder printer and single extruder print find out which extruder starts the file. init_fan = t0_fan if not is_multi_extr_print: startup = data[1] @@ -431,7 +559,7 @@ class AddCoolingProfile(Script): elif line == "T3": t0_fan = t3_fan elif is_multi_extr_print: - ## On a multi-extruder printer and multi extruder print find out which extruder starts the file. + # On a multi-extruder printer and multi extruder print find out which extruder starts the file. startup = data[1] lines = startup.split("\n") for line in lines: @@ -445,23 +573,23 @@ class AddCoolingProfile(Script): init_fan = t3_fan else: init_fan = "" - ## Assign the variable values if "Raft Enabled" + # Assign the variable values if "Raft Enabled" raft_enabled = self.getSettingValueByKey("fan_enable_raft") if raft_enabled and bed_adhesion == "raft": fan_sp_raft = self._feature_checker(self.getSettingValueByKey("fan_raft_percent"), fan_mode) else: fan_sp_raft = "M106 S0" - # Start to alter the data----------------------------------------- - ## Strip the existing M106 lines from the file up to the end of the last layer. If a user wants to use more than one instance of this plugin then they won't want to erase the M106 lines that the preceding plugins inserted so 'delete_existing_m106' is an option. + # Start to alter the data + # Strip the existing M106 lines from the file up to the end of the last layer. If a user wants to use more than one instance of this plugin then they won't want to erase the M106 lines that the preceding plugins inserted so 'delete_existing_m106' is an option. delete_existing_m106 = self.getSettingValueByKey("delete_existing_m106") if delete_existing_m106: - ## Start deleting from the beginning + # Start deleting from the beginning start_from = int(raft_start_index) else: if by_layer_or_feature == "by_layer": altered_start_layer = str(len(data)) - ## The fan list layers don't need to be in ascending order. Get the lowest. + # The fan list layers don't need to be in ascending order. Get the lowest. for num in range(0,15,2): try: if int(fan_list[num]) < int(altered_start_layer): @@ -471,12 +599,12 @@ class AddCoolingProfile(Script): elif by_layer_or_feature == "by_feature": altered_start_layer = int(the_start_layer) - 1 start_from = int(layer_0_index) + int(altered_start_layer) - ## Strip the M106 and M107 lines from the file + # Strip the M106 and M107 lines from the file for l_index in range(int(start_from), len(data) - 1, 1): data[l_index] = re.sub(re.compile("M106(.*)\n"), "", data[l_index]) data[l_index] = re.sub(re.compile("M107(.*)\n"), "", data[l_index]) - ## Deal with a raft and with One-At-A-Time print sequence + # Deal with a raft and with One-At-A-Time print sequence if raft_enabled and bed_adhesion == "raft": if print_sequence == "one_at_a_time": for r_index in range(2,len(data)-2,1): @@ -486,9 +614,9 @@ class AddCoolingProfile(Script): lines.insert(1, "M106 S0" + str(t0_fan)) if raft_enabled and bed_adhesion == "raft": if ";LAYER:-" in data[r_index]: - ## Turn the raft fan on + # Turn the raft fan on lines.insert(1, fan_sp_raft + str(t0_fan)) - ## Shut the raft fan off at layer 0 + # Shut the raft fan off at layer 0 if ";LAYER:0" in data[r_index]: lines.insert(1,"M106 S0" + str(t0_fan)) data[r_index] = "\n".join(lines) @@ -496,13 +624,13 @@ class AddCoolingProfile(Script): layer = data[raft_start_index] lines = layer.split("\n") if ";LAYER:-" in layer: - ## Turn the raft fan on + # Turn the raft fan on lines.insert(1, fan_sp_raft + str(init_fan)) layer = "\n".join(lines) data[raft_start_index] = layer layer = data[layer_0_index] lines = layer.split("\n") - ## Shut the raft fan off + # Shut the raft fan off lines.insert(1, "M106 S0" + str(init_fan)) data[layer_0_index] = "\n".join(lines) else: @@ -513,41 +641,44 @@ class AddCoolingProfile(Script): lines.insert(1, "M106 S0" + str(t0_fan)) data[r_index] = "\n".join(lines) - ## Turn off all fans at the end of data[1]. If more than one instance of this script is running then this will result in multiple M106 lines. + # Turn off all fans at the end of data[1]. If more than one instance of this script is running then this will result in multiple M106 lines. temp_startup = data[1].split("\n") temp_startup.insert(len(temp_startup)-2,"M106 S0" + str(t0_fan)) - ## If there are multiple cooling fans shut them all off + # If there are multiple cooling fans shut them all off if is_multi_fan: - if extruder_count > 1 and t1_fan != t0_fan: temp_startup.insert(len(temp_startup)-2,"M106 S0" + str(t1_fan)) - if extruder_count > 2 and t2_fan != t1_fan and t2_fan != t0_fan: temp_startup.insert(len(temp_startup)-2,"M106 S0" + str(t2_fan)) - if extruder_count > 3 and t3_fan != t2_fan and t3_fan != t1_fan and t3_fan != t0_fan: temp_startup.insert(len(temp_startup)-2,"M106 S0" + str(t3_fan)) + if self.extruder_count > 1 and t1_fan != t0_fan: temp_startup.insert(len(temp_startup)-2,"M106 S0" + str(t1_fan)) + if self.extruder_count > 2 and t2_fan != t1_fan and t2_fan != t0_fan: temp_startup.insert(len(temp_startup)-2,"M106 S0" + str(t2_fan)) + if self.extruder_count > 3 and t3_fan != t2_fan and t3_fan != t1_fan and t3_fan != t0_fan: temp_startup.insert(len(temp_startup)-2,"M106 S0" + str(t3_fan)) data[1] = "\n".join(temp_startup) - ## If 'feature_fan_combing' is True then add additional 'MESH:NONMESH' lines for travel moves over 5 lines long - ## For compatibility with 5.3.0 change any MESH:NOMESH to MESH:NONMESH. + # If 'feature_fan_combing' is True then add additional 'MESH:NONMESH' lines for travel moves over 5 lines long + # For compatibility with 5.3.0 change any MESH:NOMESH to MESH:NONMESH. if feature_fan_combing: for layer_num in range(2,len(data)): layer = data[layer_num] data[layer_num] = re.sub(";MESH:NOMESH", ";MESH:NONMESH", layer) data = self._add_travel_comment(data, layer_0_index) - # Single Fan "By Layer"-------------------------------------------- + if bool(self.getSettingValueByKey("bv_fan_speed_control_enable")): + data = self._control_bv_fan(data) + + # Single Fan "By Layer" if by_layer_or_feature == "by_layer" and not is_multi_fan: return self._single_fan_by_layer(data, layer_0_index, fan_list, t0_fan) - # Multi-Fan "By Layer"--------------------------------------------- + # Multi-Fan "By Layer" if by_layer_or_feature == "by_layer" and is_multi_fan: - return self._multi_fan_by_layer(data, layer_0_index, fan_list, t0_fan, t1_fan, t2_fan, t3_fan) + return self._multi_fan_by_layer(data, layer_0_index, fan_list, t0_fan, t1_fan, t2_fan, t3_fan, fan_mode, off_fan_speed) - #Single Fan "By Feature"------------------------------------------ + # Single Fan "By Feature" if by_layer_or_feature == "by_feature" and (not is_multi_fan or not is_multi_extr_print): return self._single_fan_by_feature(data, layer_0_index, the_start_layer, the_end_layer, the_end_is_enabled, fan_list, t0_fan, feature_speed_list, feature_name_list, feature_fan_combing) - #Multi Fan "By Feature"------------------------------------------- + # Multi Fan "By Feature" if by_layer_or_feature == "by_feature" and is_multi_fan: - return self._multi_fan_by_feature(data, layer_0_index, the_start_layer, the_end_layer, the_end_is_enabled, fan_list, t0_fan, t1_fan, t2_fan, t3_fan, feature_speed_list, feature_name_list, feature_fan_combing) + return self._multi_fan_by_feature(data, layer_0_index, the_start_layer, the_end_layer, the_end_is_enabled, fan_list, t0_fan, t1_fan, t2_fan, t3_fan, feature_speed_list, feature_name_list, feature_fan_combing, fan_mode, off_fan_speed) - # The Single Fan "By Layer"---------------------------------------- + # The Single Fan "By Layer" def _single_fan_by_layer(self, data: str, layer_0_index: int, fan_list: str, t0_fan: str)->str: layer_number = "0" single_fan_data = data @@ -557,15 +688,15 @@ class AddCoolingProfile(Script): for fan_line in fan_lines: if ";LAYER:" in fan_line: layer_number = str(fan_line.split(":")[1]) - ## If there is a match for the current layer number make the insertion + # If there is a match for the current layer number make the insertion for num in range(0,15,2): if layer_number == str(fan_list[num]): layer = layer.replace(fan_lines[0],fan_lines[0] + "\n" + fan_list[num + 1] + str(t0_fan)) single_fan_data[l_index] = layer return single_fan_data - # Multi-Fan "By Layer"----------------------------------------- - def _multi_fan_by_layer(self, data: str, layer_0_index: int, fan_list: str, t0_fan: str, t1_fan: str, t2_fan: str, t3_fan: str)->str: + # Multi-Fan "By Layer" + def _multi_fan_by_layer(self, data: str, layer_0_index: int, fan_list: str, t0_fan: str, t1_fan: str, t2_fan: str, t3_fan: str, fan_mode: bool, off_fan_speed: str)->str: multi_fan_data = data layer_number = "0" current_fan_speed = "0" @@ -573,15 +704,16 @@ class AddCoolingProfile(Script): this_fan = str(t0_fan) start_index = str(len(multi_fan_data)) for num in range(0,15,2): - ## The fan_list may not be in ascending order. Get the lowest layer number + + # The fan_list may not be in ascending order. Get the lowest layer number try: if int(fan_list[num]) < int(start_index): start_index = str(fan_list[num]) - except: + except ValueError: pass - ## Move the start point if delete_existing_m106 is false + # Move the start point if delete_existing_m106 is false start_index = int(start_index) + int(layer_0_index) - ## Track the tool number + # Track the tool number for num in range(1,int(start_index),1): layer = multi_fan_data[num] lines = layer.split("\n") @@ -598,18 +730,19 @@ class AddCoolingProfile(Script): elif line == "T3": prev_fan = this_fan this_fan = t3_fan + # With Active Tool tracked - now the body of changes can start for l_index in range(int(start_index),len(multi_fan_data)-1,1): modified_data = "" layer = multi_fan_data[l_index] fan_lines = layer.split("\n") for fan_line in fan_lines: - ## Prepare to shut down the previous fan and start the next one. + # Prepare to turn off the previous fan and start the next one. if fan_line.startswith("T"): if fan_line == "T0": this_fan = str(t0_fan) if fan_line == "T1": this_fan = str(t1_fan) if fan_line == "T2": this_fan = str(t2_fan) if fan_line == "T3": this_fan = str(t3_fan) - modified_data += "M106 S0" + prev_fan + "\n" + modified_data += f"M106 S{off_fan_speed}" + prev_fan + "\n" modified_data += fan_line + "\n" modified_data += "M106 S" + str(current_fan_speed) + this_fan + "\n" prev_fan = this_fan @@ -620,19 +753,22 @@ class AddCoolingProfile(Script): if layer_number == str(fan_list[num]): modified_data += fan_list[num + 1] + this_fan + "\n" current_fan_speed = str(fan_list[num + 1].split("S")[1]) - current_fan_speed = str(current_fan_speed.split(" ")[0]) ## Just in case + current_fan_speed = str(current_fan_speed.split(" ")[0]) # Just in case else: modified_data += fan_line + "\n" if modified_data.endswith("\n"): modified_data = modified_data[0:-1] multi_fan_data[l_index] = modified_data + # Insure the fans get shut off if 'off_fan_speed' was enabled + if self.extruder_count > 1 and self.getSettingValueByKey("enable_off_fan_speed"): + multi_fan_data[-1] += "M106 S0 P1\nM106 S0 P0\n" return multi_fan_data - # Single fan by feature----------------------------------------------- + # Single fan by feature def _single_fan_by_feature(self, data: str, layer_0_index: int, the_start_layer: str, the_end_layer: str, the_end_is_enabled: str, fan_list: str, t0_fan: str, feature_speed_list: str, feature_name_list: str, feature_fan_combing: bool)->str: single_fan_data = data layer_number = "0" index = 1 - ## Start with layer:0 + # Start with layer:0 for l_index in range(layer_0_index,len(single_fan_data)-1,1): modified_data = "" layer = single_fan_data[l_index] @@ -652,15 +788,16 @@ class AddCoolingProfile(Script): if feature_fan_combing == True: modified_data += "M106 S0" + t0_fan + "\n" modified_data += line + "\n" - ## If an End Layer is defined and is less than the last layer then insert the Final Speed + + # If an End Layer is defined and is less than the last layer then insert the Final Speed if line == ";LAYER:" + str(the_end_layer) and the_end_is_enabled == True: modified_data += feature_speed_list[len(feature_speed_list) - 1] + t0_fan + "\n" if modified_data.endswith("\n"): modified_data = modified_data[0: - 1] single_fan_data[l_index] = modified_data return single_fan_data - # Multi-fan by feature------------------------------------------------ - def _multi_fan_by_feature(self, data: str, layer_0_index: int, the_start_layer: str, the_end_layer: str, the_end_is_enabled: str, fan_list: str, t0_fan: str, t1_fan: str, t2_fan: str, t3_fan: str, feature_speed_list: str, feature_name_list: str, feature_fan_combing: bool)->str: + # Multi-fan by feature + def _multi_fan_by_feature(self, data: str, layer_0_index: int, the_start_layer: str, the_end_layer: str, the_end_is_enabled: str, fan_list: str, t0_fan: str, t1_fan: str, t2_fan: str, t3_fan: str, feature_speed_list: str, feature_name_list: str, feature_fan_combing: bool, fan_mode: bool, off_fan_speed: str)->str: multi_fan_data = data layer_number = "0" start_index = 1 @@ -673,7 +810,7 @@ class AddCoolingProfile(Script): if ";LAYER:" + str(the_start_layer) + "\n" in layer: start_index = int(my_index) - 1 break - ## Track the previous tool changes + # Track the previous tool changes for num in range(1,start_index,1): layer = multi_fan_data[num] lines = layer.split("\n") @@ -690,7 +827,7 @@ class AddCoolingProfile(Script): elif line == "T3": prev_fan = this_fan this_fan = t3_fan - ## Get the current tool. + # Get the current tool. for l_index in range(start_index,start_index + 1,1): layer = multi_fan_data[l_index] lines = layer.split("\n") @@ -702,7 +839,7 @@ class AddCoolingProfile(Script): if line == "T3": this_fan = t3_fan prev_fan = this_fan - ## Start to make insertions------------------------------------- + # Start to make insertions for l_index in range(start_index+1,len(multi_fan_data)-1,1): layer = multi_fan_data[l_index] lines = layer.split("\n") @@ -712,10 +849,10 @@ class AddCoolingProfile(Script): if line == "T1": this_fan = t1_fan if line == "T2": this_fan = t2_fan if line == "T3": this_fan = t3_fan - ## Turn off the prev fan - modified_data += "M106 S0" + prev_fan + "\n" + # Turn off the prev fan + modified_data += f"M106 S{off_fan_speed}" + prev_fan + "\n" modified_data += line + "\n" - ## Turn on the current fan + # Turn on the current fan modified_data += "M106 S" + str(current_fan_speed) + this_fan + "\n" prev_fan = this_fan if ";LAYER:" in line: @@ -725,34 +862,39 @@ class AddCoolingProfile(Script): temp = line.split(" ")[0] try: name_index = feature_name_list.index(temp) - except: + except IndexError: name_index = -1 + if name_index != -1: modified_data += line + "\n" + feature_speed_list[name_index] + this_fan + "\n" - #modified_data += feature_speed_list[name_index] + this_fan + "\n" current_fan_speed = str(feature_speed_list[name_index].split("S")[1]) elif ";MESH:NONMESH" in line: if feature_fan_combing == True: modified_data += line + "\n" - modified_data += "M106 S0" + this_fan + "\n" + modified_data += f"M106 S{off_fan_speed}" + this_fan + "\n" current_fan_speed = "0" else: modified_data += line + "\n" - ## If an end layer is defined - Insert the final speed and set the other variables to Final Speed to finish the file - ## There cannot be a break here because if there are multiple fan numbers they still need to be shut off and turned on. + + # If an end layer is defined - Insert the final speed and set the other variables to Final Speed to finish the file + # There cannot be a 'break' here because if there are multiple fan numbers they still need to be shut off and turned on. elif line == ";LAYER:" + str(the_end_layer): modified_data += feature_speed_list[len(feature_speed_list) - 1] + this_fan + "\n" for set_speed in range(0, len(feature_speed_list) - 2): feature_speed_list[set_speed] = feature_speed_list[len(feature_speed_list) - 1] else: - ## Layer and Tool get inserted into modified_data above. All other lines go into modified_data here + # Layer and Tool get inserted into modified_data above. All other lines go into modified_data here if not line.startswith("T") and not line.startswith(";LAYER:"): modified_data += line + "\n" + if modified_data.endswith("\n"): modified_data = modified_data[0: - 1] multi_fan_data[l_index] = modified_data modified_data = "" + # Insure the fans get shut off if 'off_fan_speed' was enabled + if self.extruder_count > 1 and self.getSettingValueByKey("enable_off_fan_speed"): + multi_fan_data[-1] += "M106 S0 P1\nM106 S0 P0\n" return multi_fan_data - #Try to catch layer input errors, set the minimum speed to 12%, and put the strings together + # Try to catch layer input errors, set the minimum speed to 12%, and put the strings together def _layer_checker(self, fan_string: str, ty_pe: str, fan_mode: bool) -> str: fan_string_l = str(fan_string.split("/")[0]) try: @@ -768,7 +910,7 @@ class AddCoolingProfile(Script): if int(fan_string_p) > 100: fan_string_p = "100" except ValueError: fan_string_p = "0" - ## Set the minimum fan speed to 12% + # Set the minimum fan speed to 12% if int(fan_string_p) < 12 and int(fan_string_p) != 0: fan_string_p = "12" fan_layer_line = str(fan_string_l) @@ -784,7 +926,7 @@ class AddCoolingProfile(Script): #Try to catch feature input errors, set the minimum speed to 12%, and put the strings together when 'By Feature' def _feature_checker(self, fan_feat_string: int, fan_mode: bool) -> str: if fan_feat_string < 0: fan_feat_string = 0 - ## Set the minimum fan speed to 12% + # Set the minimum fan speed to 12% if fan_feat_string > 0 and fan_feat_string < 12: fan_feat_string = 12 if fan_feat_string > 100: fan_feat_string = 100 if fan_mode: @@ -798,7 +940,7 @@ class AddCoolingProfile(Script): for lay_num in range(int(lay_0_index), len(comment_data)-1,1): layer = comment_data[lay_num] lines = layer.split("\n") - ## Copy the data to new_data and make the insertions there + # Copy the data to new_data and make the insertions there new_data = lines g0_count = 0 g0_index = -1 @@ -818,12 +960,12 @@ class AddCoolingProfile(Script): if g0_index == -1: g0_index = lines.index(line) elif not line.startswith("G0 ") and not is_travel: - ## Add additional 'NONMESH' lines to shut the fan off during long combing moves-------- + # Add additional 'NONMESH' lines to shut the fan off during long combing moves if g0_count > 5: if not is_travel: new_data.insert(g0_index + insert_index, ";MESH:NONMESH") insert_index += 1 - ## Add the feature_type at the end of the combing move to turn the fan back on + # Add the feature_type at the end of the combing move to turn the fan back on new_data.insert(g0_index + g0_count + 1, feature_type) insert_index += 1 g0_count = 0 @@ -834,4 +976,35 @@ class AddCoolingProfile(Script): g0_index = -1 is_travel = False comment_data[lay_num] = "\n".join(new_data) - return comment_data \ No newline at end of file + return comment_data + + def _control_bv_fan(self, bv_data: str) -> str: + # Control any secondary fan. Can be used for an Auxilliary/Chamber fan + bv_start_layer = self.getSettingValueByKey("bv_fan_start_layer") - 1 + bv_end_layer = self.getSettingValueByKey("bv_fan_end_layer") + bv_fan_nr = self.getSettingValueByKey("bv_fan_nr") + if bv_end_layer != -1: + bv_end_layer -= 1 + # Get the PWM speed or if RepRap then the 0-1 speed + if self.extruder_list[0].getProperty("machine_scale_fan_speed_zero_to_one", "value"): + bv_fan_speed = round(self.getSettingValueByKey("bv_fan_speed") * .01, 1) + else: + bv_fan_speed = int(self.getSettingValueByKey("bv_fan_speed") * 2.55) + # Turn the chamber fan on + for index, layer in enumerate(bv_data): + if f";LAYER:{bv_start_layer}\n" in layer: + bv_data[index] = re.sub(f";LAYER:{bv_start_layer}", f";LAYER:{bv_start_layer}\nM106 S{bv_fan_speed} P{bv_fan_nr}",layer) + break + # Turn the chamber fan off + if bv_end_layer == -1: + bv_data[len(bv_data)-2] += f"M106 S0 P{bv_fan_nr}\n" + else: + for index, layer in enumerate(bv_data): + if f";LAYER:{bv_end_layer}\n" in layer: + lines = layer.split("\n") + for fdex, line in enumerate(lines): + if ";TIME_ELAPSED:" in line: + lines[fdex] = f"M106 S0 P{bv_fan_nr}\n" + line + bv_data[index] = "\n".join(lines) + break + return bv_data \ No newline at end of file diff --git a/plugins/PostProcessingPlugin/scripts/CreateThumbnail.py b/plugins/PostProcessingPlugin/scripts/CreateThumbnail.py index 7d6094ade3..1ee85bdc0b 100644 --- a/plugins/PostProcessingPlugin/scripts/CreateThumbnail.py +++ b/plugins/PostProcessingPlugin/scripts/CreateThumbnail.py @@ -35,16 +35,21 @@ class CreateThumbnail(Script): def _convertSnapshotToGcode(self, encoded_snapshot, width, height, chunk_size=78): gcode = [] + use_thumbnail = self.getSettingValueByKey("use_thumbnail") + use_star = self.getSettingValueByKey("use_star") + encoded_snapshot_length = len(encoded_snapshot) + image_type = "thumbnail" if use_thumbnail else "png" + resolution_symbol = '*' if use_star else 'x' gcode.append(";") - gcode.append("; thumbnail begin {}x{} {}".format( - width, height, encoded_snapshot_length)) + gcode.append("; {} begin {}{}{} {}".format( + image_type, width, resolution_symbol, height, encoded_snapshot_length)) chunks = ["; {}".format(encoded_snapshot[i:i+chunk_size]) for i in range(0, len(encoded_snapshot), chunk_size)] gcode.extend(chunks) - gcode.append("; thumbnail end") + gcode.append("; {} end".format(image_type)) gcode.append(";") gcode.append("") @@ -79,6 +84,20 @@ class CreateThumbnail(Script): "minimum_value": "0", "minimum_value_warning": "12", "maximum_value_warning": "600" + }, + "use_thumbnail": + { + "label": "Thumbnail Begin/End", + "description": "Use Thumbnail Begin/End rather than PNG", + "type": "bool", + "default_value": true + }, + "use_star": + { + "label": "Use '*' for size of image", + "description": "Use '*' instead of 'x' for size of image as Width '*' Height", + "type": "bool", + "default_value": false } } }""" diff --git a/plugins/PostProcessingPlugin/scripts/FilamentChange.py b/plugins/PostProcessingPlugin/scripts/FilamentChange.py index 6fe28ef2f2..f51ba73ffb 100644 --- a/plugins/PostProcessingPlugin/scripts/FilamentChange.py +++ b/plugins/PostProcessingPlugin/scripts/FilamentChange.py @@ -92,7 +92,7 @@ class FilamentChange(Script): "type": "float", "default_value": 0, "minimum_value": 0, - "enabled": "enabled" + "enabled": "enabled and not firmware_config" }, "retract_method": { diff --git a/plugins/PostProcessingPlugin/scripts/InsertAtLayerChange.py b/plugins/PostProcessingPlugin/scripts/InsertAtLayerChange.py index ea783b08d8..d2a51a28fa 100644 --- a/plugins/PostProcessingPlugin/scripts/InsertAtLayerChange.py +++ b/plugins/PostProcessingPlugin/scripts/InsertAtLayerChange.py @@ -1,6 +1,7 @@ # Copyright (c) 2020 Ultimaker B.V. # Created by Wayne Porter # Re-write in April of 2024 by GregValiant (Greg Foresi) +# Made convert inserted text to upper-case optional March 2025 by HellAholic # Changes: # Added an 'Enable' setting # Added support for multi-line insertions (comma delimited) @@ -82,6 +83,14 @@ class InsertAtLayerChange(Script): "type": "str", "default_value": "", "enabled": "enabled" + }, + "convert_to_upper": + { + "label": "Convert to upper-case", + "description": "Convert all inserted text to upper-case as some firmwares don't understand lower-case.", + "type": "bool", + "default_value": true, + "enabled": "enabled" } } }""" @@ -91,7 +100,7 @@ class InsertAtLayerChange(Script): if not bool(self.getSettingValueByKey("enabled")): return data #Initialize variables - mycode = self.getSettingValueByKey("gcode_to_add").upper() + mycode = self.getSettingValueByKey("gcode_to_add").upper() if self.getSettingValueByKey("convert_to_upper") else self.getSettingValueByKey("gcode_to_add") start_layer = int(self.getSettingValueByKey("start_layer")) end_layer = int(self.getSettingValueByKey("end_layer")) when_to_insert = self.getSettingValueByKey("insert_frequency") diff --git a/plugins/PostProcessingPlugin/scripts/PurgeLinesAndUnload.py b/plugins/PostProcessingPlugin/scripts/PurgeLinesAndUnload.py index ca95359e29..44c2b50f9e 100644 --- a/plugins/PostProcessingPlugin/scripts/PurgeLinesAndUnload.py +++ b/plugins/PostProcessingPlugin/scripts/PurgeLinesAndUnload.py @@ -35,8 +35,9 @@ class Position(tuple, Enum): class PurgeLinesAndUnload(Script): - def __init__(self): - super().__init__() + def initialize(self) -> None: + super().initialize() + # Get required values from the global stack and set default values for the script self.global_stack = Application.getInstance().getGlobalContainerStack() self.extruder = self.global_stack.extruderList self.end_purge_location = None @@ -56,9 +57,6 @@ class PurgeLinesAndUnload(Script): self.machine_back = self.machine_depth - 1.0 self.start_x = None self.start_y = None - - def initialize(self) -> None: - super().initialize() # Get the StartUp Gcode from Cura and attempt to catch if it contains purge lines. Message the user if an extrusion is in the startup. startup_gcode = self.global_stack.getProperty("machine_start_gcode", "value") start_lines = startup_gcode.splitlines() diff --git a/plugins/SimulationView/SimulationPass.py b/plugins/SimulationView/SimulationPass.py index 436d5b8723..a7411a2ed0 100644 --- a/plugins/SimulationView/SimulationPass.py +++ b/plugins/SimulationView/SimulationPass.py @@ -203,9 +203,9 @@ class SimulationPass(RenderPass): self._layer_shader.setUniformValue("u_next_vertex", not_a_vector) self._layer_shader.setUniformValue("u_last_line_ratio", 1.0) - # The first line does not have a previous line: add a MoveCombingType in front for start detection + # The first line does not have a previous line: add a MoveUnretractedType in front for start detection # this way the first start of the layer can also be drawn - prev_line_types = numpy.concatenate([numpy.asarray([LayerPolygon.MoveCombingType], dtype = numpy.float32), layer_data._attributes["line_types"]["value"]]) + prev_line_types = numpy.concatenate([numpy.asarray([LayerPolygon.MoveUnretractedType], dtype = numpy.float32), layer_data._attributes["line_types"]["value"]]) # Remove the last element prev_line_types = prev_line_types[0:layer_data._attributes["line_types"]["value"].size] layer_data._attributes["prev_line_types"] = {'opengl_type': 'float', 'value': prev_line_types, 'opengl_name': 'a_prev_line_type'} diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index 10861acfd0..083fc73bf1 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -608,8 +608,10 @@ class SimulationView(CuraView): visible_line_types.append(LayerPolygon.SupportInterfaceType) visible_line_types_with_extrusion = visible_line_types.copy() # Copy before travel moves are added if self.getShowTravelMoves(): - visible_line_types.append(LayerPolygon.MoveCombingType) - visible_line_types.append(LayerPolygon.MoveRetractionType) + visible_line_types.append(LayerPolygon.MoveUnretractedType) + visible_line_types.append(LayerPolygon.MoveRetractedType) + visible_line_types.append(LayerPolygon.MoveWhileRetractingType) + visible_line_types.append(LayerPolygon.MoveWhileUnretractingType) for node in DepthFirstIterator(self.getController().getScene().getRoot()): layer_data = node.callDecoration("getLayerData") diff --git a/plugins/SimulationView/SimulationViewMenuComponent.qml b/plugins/SimulationView/SimulationViewMenuComponent.qml index d434d883eb..78b0b2b74f 100644 --- a/plugins/SimulationView/SimulationViewMenuComponent.qml +++ b/plugins/SimulationView/SimulationViewMenuComponent.qml @@ -227,29 +227,52 @@ Cura.ExpandableComponent id: typesLegendModel Component.onCompleted: { + const travelsTypesModel = [ + { + label: catalog.i18nc("@label", "Not retracted"), + colorId: "layerview_move_combing" + }, + { + label: catalog.i18nc("@label", "Retracted"), + colorId: "layerview_move_retraction" + }, + { + label: catalog.i18nc("@label", "Retracting"), + colorId: "layerview_move_while_retracting" + }, + { + label: catalog.i18nc("@label", "Priming"), + colorId: "layerview_move_while_unretracting" + } + ]; + typesLegendModel.append({ label: catalog.i18nc("@label", "Travels"), initialValue: viewSettings.show_travel_moves, preference: "layerview/show_travel_moves", - colorId: "layerview_move_combing" + colorId: "layerview_move_combing", + subTypesModel: travelsTypesModel }); typesLegendModel.append({ label: catalog.i18nc("@label", "Helpers"), initialValue: viewSettings.show_helpers, preference: "layerview/show_helpers", - colorId: "layerview_support" + colorId: "layerview_support", + subTypesModel: [] }); typesLegendModel.append({ label: catalog.i18nc("@label", "Shell"), initialValue: viewSettings.show_skin, preference: "layerview/show_skin", - colorId: "layerview_inset_0" + colorId: "layerview_inset_0", + subTypesModel: [] }); typesLegendModel.append({ label: catalog.i18nc("@label", "Infill"), initialValue: viewSettings.show_infill, preference: "layerview/show_infill", - colorId: "layerview_infill" + colorId: "layerview_infill", + subTypesModel: [] }); if (! UM.SimulationView.compatibilityMode) { @@ -257,7 +280,8 @@ Cura.ExpandableComponent label: catalog.i18nc("@label", "Starts"), initialValue: viewSettings.show_starts, preference: "layerview/show_starts", - colorId: "layerview_starts" + colorId: "layerview_starts", + subTypesModel: [] }); } } @@ -273,6 +297,7 @@ Cura.ExpandableComponent Rectangle { + id: rectangleColor anchors.verticalCenter: parent.verticalCenter anchors.right: legendModelCheckBox.right width: UM.Theme.getSize("layerview_legend_size").width @@ -281,6 +306,58 @@ Cura.ExpandableComponent border.width: UM.Theme.getSize("default_lining").width border.color: UM.Theme.getColor("lining") visible: viewSettings.show_legend + + MouseArea + { + anchors.fill: parent + hoverEnabled: true + acceptedButtons: Qt.NoButton + enabled: subTypesModel.count > 0 + + onEntered: tooltip.show() + onExited: tooltip.hide() + + UM.ToolTip + { + id: tooltip + delay: 0 + width: subTypesColumn.implicitWidth + 2 * UM.Theme.getSize("thin_margin").width + height: subTypesColumn.implicitHeight + 2 * UM.Theme.getSize("thin_margin").width + + contentItem: Column + { + id: subTypesColumn + padding: 0 + spacing: UM.Theme.getSize("layerview_row_spacing").height + + Repeater + { + model: subTypesModel + UM.Label + { + text: label + + height: UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("default_lining").height + width: UM.Theme.getSize("layerview_menu_size").width + color: UM.Theme.getColor("tooltip_text") + Rectangle + { + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + + width: UM.Theme.getSize("layerview_legend_size").width + height: UM.Theme.getSize("layerview_legend_size").height + + color: UM.Theme.getColor(model.colorId) + + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("lining") + } + } + } + } + } + } } UM.Label diff --git a/plugins/SimulationView/layers.shader b/plugins/SimulationView/layers.shader index e6210c2b65..d5079fd82b 100644 --- a/plugins/SimulationView/layers.shader +++ b/plugins/SimulationView/layers.shader @@ -22,8 +22,8 @@ vertex = gl_Position = u_projectionMatrix * u_viewMatrix * u_modelMatrix * a_vertex; // shade the color depending on the extruder index v_color = a_color; - // 8 and 9 are travel moves - if ((a_line_type != 8.0) && (a_line_type != 9.0)) { + // 8, 9, 12 and 13 are travel moves + if ((a_line_type != 8.0) && (a_line_type != 9.0) && (a_line_type != 12.0) && (a_line_type != 13.0)) { v_color = (a_extruder == u_active_extruder) ? v_color : vec4(u_shade_factor * v_color.rgb, v_color.a); } @@ -48,7 +48,9 @@ fragment = void main() { - if ((u_show_travel_moves == 0) && (v_line_type >= 7.5) && (v_line_type <= 9.5)) { // actually, 8 and 9 + // travel moves: 8, 9, 12, 13 + if ((u_show_travel_moves == 0) && (((v_line_type >= 7.5) && (v_line_type <= 9.5)) || + ((v_line_type >= 11.5) && (v_line_type <= 13.5)))) { // discard movements discard; } @@ -100,7 +102,7 @@ vertex41core = { gl_Position = u_projectionMatrix * u_viewMatrix * u_modelMatrix * a_vertex; v_color = a_color; - if ((a_line_type != 8) && (a_line_type != 9)) { + if ((a_line_type != 8) && (a_line_type != 9) && (a_line_type != 12) && (a_line_type != 13)) { v_color = (a_extruder == u_active_extruder) ? v_color : vec4(u_shade_factor * v_color.rgb, v_color.a); } @@ -120,7 +122,9 @@ fragment41core = void main() { - if ((u_show_travel_moves == 0) && (v_line_type >= 7.5) && (v_line_type <= 9.5)) { // actually, 8 and 9 + // travel moves: 8, 9, 12, 13 + if ((u_show_travel_moves == 0) && (((v_line_type >= 7.5) && (v_line_type <= 9.5)) || + ((v_line_type >= 11.5) && (v_line_type <= 13.5)))) { // discard movements discard; } diff --git a/plugins/SimulationView/layers3d.shader b/plugins/SimulationView/layers3d.shader index 494a07083d..e2f57823f3 100644 --- a/plugins/SimulationView/layers3d.shader +++ b/plugins/SimulationView/layers3d.shader @@ -228,22 +228,26 @@ geometry41core = { highp mat4 viewProjectionMatrix = u_projectionMatrix * u_viewMatrix; - vec4 g_vertex_delta; - vec3 g_vertex_normal_horz; // horizontal and vertical in respect to layers - vec4 g_vertex_offset_horz; // vec4 to match gl_in[x].gl_Position + // Vertices are declared as vec4 so that they can be used for calculations with gl_in[x].gl_Position + vec3 g_vertex_delta; + vec3 g_vertex_normal_horz; + vec4 g_vertex_offset_horz; vec3 g_vertex_normal_vert; vec4 g_vertex_offset_vert; vec3 g_vertex_normal_horz_head; vec4 g_vertex_offset_horz_head; + vec3 g_axial_plan_vector; + vec3 g_radial_plan_vector; float size_x; float size_y; - if ((v_extruder_opacity[0][int(mod(v_extruder[0], 4))][v_extruder[0] / 4] == 0.0) && (v_line_type[0] != 8) && (v_line_type[0] != 9)) { + if ((v_extruder_opacity[0][int(mod(v_extruder[0], 4))][v_extruder[0] / 4] == 0.0) && + (v_line_type[0] != 8) && (v_line_type[0] != 9) && (v_line_type[0] != 12) && (v_line_type[0] != 13)) { return; } - // See LayerPolygon; 8 is MoveCombingType, 9 is RetractionType - if ((u_show_travel_moves == 0) && ((v_line_type[0] == 8) || (v_line_type[0] == 9))) { + // See LayerPolygon; 8 is MoveUnretractedType, 9 is RetractionType, 12 is MoveWhileRetractingType, 13 is MoveWhileUnretractingType + if ((u_show_travel_moves == 0) && ((v_line_type[0] == 8) || (v_line_type[0] == 9) || (v_line_type[0] == 12) || (v_line_type[0] == 13))) { return; } if ((u_show_helpers == 0) && ((v_line_type[0] == 4) || (v_line_type[0] == 5) || (v_line_type[0] == 7) || (v_line_type[0] == 10) || v_line_type[0] == 11)) { @@ -256,7 +260,7 @@ geometry41core = return; } - if ((v_line_type[0] == 8) || (v_line_type[0] == 9)) { + if ((v_line_type[0] == 8) || (v_line_type[0] == 9) || (v_line_type[0] == 12) || (v_line_type[0] == 13)) { // fixed size for movements size_x = 0.05; } else { @@ -264,26 +268,47 @@ geometry41core = } size_y = v_line_dim[1].y / 2 + 0.01; - g_vertex_delta = gl_in[1].gl_Position - gl_in[0].gl_Position; //Actual movement exhibited by the line. - g_vertex_normal_horz_head = normalize(vec3(-g_vertex_delta.x, -g_vertex_delta.y, -g_vertex_delta.z)); //Lengthwise normal vector pointing backwards. - g_vertex_offset_horz_head = vec4(g_vertex_normal_horz_head * size_x, 0.0); //Lengthwise offset vector pointing backwards. + g_vertex_delta = (gl_in[1].gl_Position - gl_in[0].gl_Position).xyz; //Actual movement exhibited by the line. - g_vertex_normal_horz = normalize(vec3(g_vertex_delta.z, g_vertex_delta.y, -g_vertex_delta.x)); //Normal vector pointing right. + if (g_vertex_delta == vec3(0.0)) { + return; + } + + if (g_vertex_delta.y == 0.0) + { + // vector is in the horizontal plan, radial vector is a simple rotation around Y axis + g_radial_plan_vector = vec3(g_vertex_delta.z, 0.0, -g_vertex_delta.x); + } + else if(g_vertex_delta.x == 0.0 && g_vertex_delta.z == 0.0) + { + // delta vector is purely vertical, display the line rotated vertically so that it is visible in front and side views + g_radial_plan_vector = vec3(1.0, 0.0, -1.0); + } + else + { + // delta vector is completely 3D + g_axial_plan_vector = vec3(g_vertex_delta.x, 0.0, g_vertex_delta.z); // Vector projected in the horizontal plan + g_radial_plan_vector = cross(g_vertex_delta, g_axial_plan_vector); // Radial vector in the horizontal plan, pointing right. + } + + g_vertex_normal_horz_head = normalize(g_vertex_delta); //Lengthwise normal vector + g_vertex_offset_horz_head = vec4(g_vertex_normal_horz_head * size_x, 0.0); //Lengthwise offset vector + + g_vertex_normal_horz = normalize(g_radial_plan_vector); //Normal vector pointing right. g_vertex_offset_horz = vec4(g_vertex_normal_horz * size_x, 0.0); //Offset vector pointing right. g_vertex_normal_vert = vec3(0.0, 1.0, 0.0); //Upwards normal vector. g_vertex_offset_vert = vec4(g_vertex_normal_vert * size_y, 0.0); //Upwards offset vector. Goes up by half the layer thickness. - if ((v_line_type[0] == 8) || (v_line_type[0] == 9)) { //Travel or retraction moves. - vec4 va_head = viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head + g_vertex_offset_vert); + if ((v_line_type[0] == 8) || (v_line_type[0] == 9) || (v_line_type[0] == 12) || (v_line_type[0] == 13)) { //Travel or retraction moves. + vec4 va_head = viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz_head + g_vertex_offset_vert); vec4 va_up = viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert); vec4 va_down = viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert); - vec4 vb_head = viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz_head + g_vertex_offset_vert); + vec4 vb_head = viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz_head + g_vertex_offset_vert); vec4 vb_down = viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert); vec4 vb_up = viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert); // Travels: flat plane with pointy ends - myEmitVertex(v_vertex[0], v_color[1], g_vertex_normal_vert, va_up); myEmitVertex(v_vertex[0], v_color[1], g_vertex_normal_vert, va_head); myEmitVertex(v_vertex[0], v_color[1], g_vertex_normal_vert, va_down); myEmitVertex(v_vertex[0], v_color[1], g_vertex_normal_vert, va_up); @@ -308,8 +333,8 @@ geometry41core = vec4 vb_p_horz = viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz); //Line end, right vertex. vec4 va_m_vert = viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_vert); //Line start, bottom vertex. vec4 vb_m_vert = viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_vert); //Line end, bottom vertex. - vec4 va_head = viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head); //Line start, tip. - vec4 vb_head = viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz_head); //Line end, tip. + vec4 va_head = viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz_head); //Line start, tip. + vec4 vb_head = viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz_head); //Line end, tip. // All normal lines are rendered as 3d tubes. myEmitVertex(v_vertex[0], v_color[1], -g_vertex_normal_horz, va_m_horz); @@ -328,14 +353,14 @@ geometry41core = // left side myEmitVertex(v_vertex[0], v_color[1], -g_vertex_normal_horz, va_m_horz); myEmitVertex(v_vertex[0], v_color[1], g_vertex_normal_vert, va_p_vert); - myEmitVertex(v_vertex[0], v_color[1], g_vertex_normal_horz_head, va_head); + myEmitVertex(v_vertex[0], v_color[1], -g_vertex_normal_horz_head, va_head); myEmitVertex(v_vertex[0], v_color[1], g_vertex_normal_horz, va_p_horz); EndPrimitive(); myEmitVertex(v_vertex[0], v_color[1], g_vertex_normal_horz, va_p_horz); myEmitVertex(v_vertex[0], v_color[1], -g_vertex_normal_vert, va_m_vert); - myEmitVertex(v_vertex[0], v_color[1], g_vertex_normal_horz_head, va_head); + myEmitVertex(v_vertex[0], v_color[1], -g_vertex_normal_horz_head, va_head); myEmitVertex(v_vertex[0], v_color[1], -g_vertex_normal_horz, va_m_horz); EndPrimitive(); @@ -343,14 +368,14 @@ geometry41core = // right side myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, vb_p_horz); myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, vb_p_vert); - myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz_head, vb_head); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz_head, vb_head); myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, vb_m_horz); EndPrimitive(); myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, vb_m_horz); myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_vert, vb_m_vert); - myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz_head, vb_head); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz_head, vb_head); myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, vb_p_horz); EndPrimitive(); diff --git a/plugins/SimulationView/layers3d_shadow.shader b/plugins/SimulationView/layers3d_shadow.shader index 88268938c9..0cf3e4f75a 100644 --- a/plugins/SimulationView/layers3d_shadow.shader +++ b/plugins/SimulationView/layers3d_shadow.shader @@ -95,22 +95,26 @@ geometry41core = { highp mat4 viewProjectionMatrix = u_projectionMatrix * u_viewMatrix; - vec4 g_vertex_delta; - vec3 g_vertex_normal_horz; // horizontal and vertical in respect to layers - vec4 g_vertex_offset_horz; // vec4 to match gl_in[x].gl_Position + // Vertices are declared as vec4 so that they can be used for calculations with gl_in[x].gl_Position + vec3 g_vertex_delta; + vec3 g_vertex_normal_horz; + vec4 g_vertex_offset_horz; vec3 g_vertex_normal_vert; vec4 g_vertex_offset_vert; vec3 g_vertex_normal_horz_head; vec4 g_vertex_offset_horz_head; + vec3 g_axial_plane_vector; + vec3 g_radial_plane_vector; float size_x; float size_y; - if ((v_extruder_opacity[0][int(mod(v_extruder[0], 4))][v_extruder[0] / 4] == 0.0) && (v_line_type[0] != 8) && (v_line_type[0] != 9)) { + if ((v_extruder_opacity[0][int(mod(v_extruder[0], 4))][v_extruder[0] / 4] == 0.0) && + (v_line_type[0] != 8) && (v_line_type[0] != 9) && (v_line_type[0] != 12) && (v_line_type[0] != 13)) { return; } - // See LayerPolygon; 8 is MoveCombingType, 9 is RetractionType - if ((u_show_travel_moves == 0) && ((v_line_type[0] == 8) || (v_line_type[0] == 9))) { + // See LayerPolygon; 8 is MoveUnretractedType, 9 is RetractionType, 12 is MoveWhileRetractingType, 13 is MoveWhileUnretractingType + if ((u_show_travel_moves == 0) && ((v_line_type[0] == 8) || (v_line_type[0] == 9) || (v_line_type[0] == 12) || (v_line_type[0] == 13))) { return; } if ((u_show_helpers == 0) && ((v_line_type[0] == 4) || (v_line_type[0] == 5) || (v_line_type[0] == 7) || (v_line_type[0] == 10))) { @@ -123,7 +127,7 @@ geometry41core = return; } - if ((v_line_type[0] == 8) || (v_line_type[0] == 9)) { + if ((v_line_type[0] == 8) || (v_line_type[0] == 9) || (v_line_type[0] == 12) || (v_line_type[0] == 13)) { // fixed size for movements size_x = 0.05; } else { @@ -131,93 +135,114 @@ geometry41core = } size_y = v_line_dim[1].y / 2 + 0.01; - g_vertex_delta = gl_in[1].gl_Position - gl_in[0].gl_Position; - g_vertex_normal_horz_head = normalize(vec3(-g_vertex_delta.x, -g_vertex_delta.y, -g_vertex_delta.z)); - g_vertex_offset_horz_head = vec4(g_vertex_normal_horz_head * size_x, 0.0); + g_vertex_delta = (gl_in[1].gl_Position - gl_in[0].gl_Position).xyz; //Actual movement exhibited by the line. - g_vertex_normal_horz = normalize(vec3(g_vertex_delta.z, g_vertex_delta.y, -g_vertex_delta.x)); + if (g_vertex_delta == vec3(0.0)) { + return; + } - g_vertex_offset_horz = vec4(g_vertex_normal_horz * size_x, 0.0); //size * g_vertex_normal_horz; - g_vertex_normal_vert = vec3(0.0, 1.0, 0.0); - g_vertex_offset_vert = vec4(g_vertex_normal_vert * size_y, 0.0); + if (g_vertex_delta.y == 0.0) + { + // vector is in the horizontal plane, radial vector is a simple rotation around Y axis + g_radial_plane_vector = vec3(g_vertex_delta.z, 0.0, -g_vertex_delta.x); + } + else if(g_vertex_delta.x == 0.0 && g_vertex_delta.z == 0.0) + { + // delta vector is purely vertical, display the line rotated vertically so that it is visible in front and side views + g_radial_plane_vector = vec3(1.0, 0.0, -1.0); + } + else + { + // delta vector is completely 3D + g_axial_plane_vector = vec3(g_vertex_delta.x, 0.0, g_vertex_delta.z); // Vector projected in the horizontal plane + g_radial_plane_vector = cross(g_vertex_delta, g_axial_plane_vector); // Radial vector in the horizontal plane, pointing right. + } - if ((v_line_type[0] == 8) || (v_line_type[0] == 9)) { - vec4 va_head = viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head + g_vertex_offset_vert); + g_vertex_normal_horz_head = normalize(g_vertex_delta); //Lengthwise normal vector + g_vertex_offset_horz_head = vec4(g_vertex_normal_horz_head * size_x, 0.0); //Lengthwise offset vector + + g_vertex_normal_horz = normalize(g_radial_plane_vector); //Normal vector pointing right. + g_vertex_offset_horz = vec4(g_vertex_normal_horz * size_x, 0.0); //Offset vector pointing right. + + g_vertex_normal_vert = vec3(0.0, 1.0, 0.0); //Upwards normal vector. + g_vertex_offset_vert = vec4(g_vertex_normal_vert * size_y, 0.0); //Upwards offset vector. Goes up by half the layer thickness. + + if ((v_line_type[0] == 8) || (v_line_type[0] == 9) || (v_line_type[0] == 12) || (v_line_type[0] == 13)) { + vec4 va_head = viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz_head + g_vertex_offset_vert); vec4 va_up = viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert); vec4 va_down = viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert); - vec4 vb_head = viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz_head + g_vertex_offset_vert); + vec4 vb_head = viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz_head + g_vertex_offset_vert); vec4 vb_down = viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert); vec4 vb_up = viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert); // Travels: flat plane with pointy ends - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, va_up); - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, va_head); - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, va_down); - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, va_up); + myEmitVertex(v_vertex[0], v_color[1], g_vertex_normal_vert, va_head); + myEmitVertex(v_vertex[0], v_color[1], g_vertex_normal_vert, va_down); + myEmitVertex(v_vertex[0], v_color[1], g_vertex_normal_vert, va_up); myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, vb_down); myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, vb_up); myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, vb_head); //And reverse so that the line is also visible from the back side. myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, vb_up); myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, vb_down); - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, va_up); - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, va_down); - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, va_head); - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, va_up); + myEmitVertex(v_vertex[0], v_color[1], g_vertex_normal_vert, va_up); + myEmitVertex(v_vertex[0], v_color[1], g_vertex_normal_vert, va_down); + myEmitVertex(v_vertex[0], v_color[1], g_vertex_normal_vert, va_head); + myEmitVertex(v_vertex[0], v_color[1], g_vertex_normal_vert, va_up); EndPrimitive(); } else { - vec4 va_m_horz = viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz); - vec4 vb_m_horz = viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz); - vec4 va_p_vert = viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_vert); - vec4 vb_p_vert = viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_vert); - vec4 va_p_horz = viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz); - vec4 vb_p_horz = viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz); - vec4 va_m_vert = viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_vert); - vec4 vb_m_vert = viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_vert); - vec4 va_head = viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head); - vec4 vb_head = viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz_head); + vec4 va_m_horz = viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz); //Line start, left vertex. + vec4 vb_m_horz = viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz); //Line end, left vertex. + vec4 va_p_vert = viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_vert); //Line start, top vertex. + vec4 vb_p_vert = viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_vert); //Line end, top vertex. + vec4 va_p_horz = viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz); //Line start, right vertex. + vec4 vb_p_horz = viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz); //Line end, right vertex. + vec4 va_m_vert = viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_vert); //Line start, bottom vertex. + vec4 vb_m_vert = viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_vert); //Line end, bottom vertex. + vec4 va_head = viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz_head); //Line start, tip. + vec4 vb_head = viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz_head); //Line end, tip. // All normal lines are rendered as 3d tubes. - myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, va_m_horz); + myEmitVertex(v_vertex[0], v_color[1], -g_vertex_normal_horz, va_m_horz); myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, vb_m_horz); - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, va_p_vert); + myEmitVertex(v_vertex[0], v_color[1], g_vertex_normal_vert, va_p_vert); myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, vb_p_vert); - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, va_p_horz); + myEmitVertex(v_vertex[0], v_color[1], g_vertex_normal_horz, va_p_horz); myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, vb_p_horz); - myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_vert, va_m_vert); + myEmitVertex(v_vertex[0], v_color[1], -g_vertex_normal_vert, va_m_vert); myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_vert, vb_m_vert); - myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, va_m_horz); + myEmitVertex(v_vertex[0], v_color[1], -g_vertex_normal_horz, va_m_horz); myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, vb_m_horz); EndPrimitive(); // left side - myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, va_m_horz); - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, va_p_vert); - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz_head, va_head); - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, va_p_horz); + myEmitVertex(v_vertex[0], v_color[1], -g_vertex_normal_horz, va_m_horz); + myEmitVertex(v_vertex[0], v_color[1], g_vertex_normal_vert, va_p_vert); + myEmitVertex(v_vertex[0], v_color[1], -g_vertex_normal_horz_head, va_head); + myEmitVertex(v_vertex[0], v_color[1], g_vertex_normal_horz, va_p_horz); EndPrimitive(); - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, va_p_horz); - myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_vert, va_m_vert); - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz_head, va_head); - myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, va_m_horz); + myEmitVertex(v_vertex[0], v_color[1], g_vertex_normal_horz, va_p_horz); + myEmitVertex(v_vertex[0], v_color[1], -g_vertex_normal_vert, va_m_vert); + myEmitVertex(v_vertex[0], v_color[1], -g_vertex_normal_horz_head, va_head); + myEmitVertex(v_vertex[0], v_color[1], -g_vertex_normal_horz, va_m_horz); EndPrimitive(); // right side myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, vb_p_horz); myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, vb_p_vert); - myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz_head, vb_head); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz_head, vb_head); myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, vb_m_horz); EndPrimitive(); myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, vb_m_horz); myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_vert, vb_m_vert); - myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz_head, vb_head); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz_head, vb_head); myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, vb_p_horz); EndPrimitive(); diff --git a/plugins/SimulationView/layers_shadow.shader b/plugins/SimulationView/layers_shadow.shader index 4bc2de3d0b..73278914b7 100644 --- a/plugins/SimulationView/layers_shadow.shader +++ b/plugins/SimulationView/layers_shadow.shader @@ -48,8 +48,10 @@ fragment = void main() { - if ((u_show_travel_moves == 0) && (v_line_type >= 7.5) && (v_line_type <= 9.5)) - { // actually, 8 and 9 + // travel moves: 8, 9, 12, 13 + if ((u_show_travel_moves == 0) && (((v_line_type >= 7.5) && (v_line_type <= 9.5)) || + ((v_line_type >= 11.5) && (v_line_type <= 13.5)))) { + { // discard movements discard; } @@ -124,7 +126,9 @@ fragment41core = void main() { - if ((u_show_travel_moves == 0) && (v_line_type >= 7.5) && (v_line_type <= 9.5)) { // actually, 8 and 9 + // travel moves: 8, 9, 12, 13 + if ((u_show_travel_moves == 0) && (((v_line_type >= 7.5) && (v_line_type <= 9.5)) || + ((v_line_type >= 11.5) && (v_line_type <= 13.5)))) { // discard movements discard; } diff --git a/resources/definitions/anycubic_kobra3v2.def.json b/resources/definitions/anycubic_kobra3v2.def.json new file mode 100644 index 0000000000..6b8df0cc4b --- /dev/null +++ b/resources/definitions/anycubic_kobra3v2.def.json @@ -0,0 +1,52 @@ +{ + "version": 2, + "name": "Anycubic Kobra 3 v2", + "inherits": "fdmprinter", + "metadata": + { + "visible": true, + "author": "Sam Bonnekamp", + "manufacturer": "Anycubic", + "file_formats": "text/x-gcode", + "platform": "anycubic_kobra3v2_buildplate.stl", + "has_textured_buildplate": true, + "machine_extruder_trains": { "0": "anycubic_kobra3v2_extruder_0" } + }, + "overrides": + { + "adhesion_type": { "value": "'skirt'" }, + "layer_height": { "default_value": 0.2 }, + "machine_buildplate_type": { "default_value": "PEI Spring Steel" }, + "machine_center_is_zero": { "default_value": false }, + "machine_depth": { "default_value": 250 }, + "machine_end_gcode": { "default_value": "G1 X5 Y{machine_depth*0.95} F{speed_travel*60} ; present print\nM140 S0 ; turn off heat bed\nM104 S0 ; turn off temperature\nM84; disable motors ; disable stepper motors" }, + "machine_heated_bed": { "default_value": true }, + "machine_height": { "default_value": 260 }, + "machine_name": + { + "default_value": "Anycubic Kobra 3 v2", + "description": "Anycubic Kobra 3 v2" + }, + "machine_start_gcode": { "default_value": "; thumbnail begin 32x32\n; iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAX\n; NSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARWSURBVHgB1Vc7bx1FFD5n/cC+YOQ4RBTXlg0STfIH\n; gM78h0SAhGgQjyqARO8eFEQFBaKhCHIoKagcOkJJQUWBI19XJLaJgp+5M8x5zZzdO+sg0ZCR1zM7u3\n; e+73znMbMAT0KLMVqPdKVhvuze+o2NjUafget7Gz4GeO3s7Ow29YiYiXSJ2TPft0BwEmZ2dpYnp+Ec\n; 8NPT09tpyOAhhF4CXSBPwhOvEZk+B/ynNFzd2QvwxlfHMEq9PqR//mVaWcegmqKCIf9FKGS2Px30Ey\n; A/Hh8fE/gWgRPomww+VkxVgYFoWcz3xXpUJo2QsXvEFu8qAQJvmobA13b3I1u+Q+AhQuRfB1kTBDS6\n; FUVmVBx5iwmqNIgNv9ONkUzg4ODgBQNn2b80yyNbCzFQqMsC4MCNg/eveSQGdQM6glhXYDAYbJHvRw\n; q+ux90dQ8eeBxacaD+5T5ZSdLbfIcT61hTgCZTuq1R/zqDjxMOva6SKzBdMQRoO1OsovcLZrpPkmOO\n; ytibCdPejOQCGJHl5l+zlEGNxBiuvjxI1zNwZTgDzw4a6LbV6/fTT8eqSGD/G3hVgTQRT05OOv6Nyl\n; zBwxgW5iN8/e4leOWlOTivESjAlNhvYJoEvTEA6gq7wIqMyZ76zevPw5XlWdi5/wi+2foLNu88hAeH\n; QQKQJG/ScjjFY1cUFD3mYKxmgeef+1z9AstO4KMEfu3zXdi594gXlHIj3hYFY6su5fVQU7OjgAvZNg\n; kpaDFn8jvrC9zf+GEvgZ+16HqX5QRVctl6FmAyXhq3TmHnROBhWuBysp7aj7/+rS+IWybKO8oPWTns\n; zFX2kxalEKTe+6pZXR9kx0X3olhXdmqJ+GIF6lyfC8ArUCnZ8PPvJ9xfXn4KLMCkuBlo306payJMWD\n; 9BoGspE9LrVop4ajfevgQrz82U5xkQyg7onyEWfpUzxSQBlUnjWRZM8t66cwi/jU5h5eIMbH40hKuv\n; LqS6UFwh7mhv1RL4AYojY9VQbqkQRWL34icPtQ5o6dXqR9fwQlLgrYuPLUSrH96TvZDigsg1UwxFc3\n; c/e5rfsRNRI/JFNNns8MBy8QKNvJYKzGgf4NoXf8LH3+5xTDw4jP0szH16ZvBlybdcitMhpJzrwKUB\n; jcmCiDkDvv/liK92qRWLeTdsZYSsQaPhhXOOZD44uLJhqXAIxYKIQUIaSqBGg+Di09CuBiUYxQ0E/t\n; 0Hc2bk9gQB26kiYJEK7a6kJyqdvL/bKSiKOmx9dGumfpnA35/jnsDH4/H6BAH7Qba3dobTTQYrOY0N\n; usOnbr9JieEiCPgSzzH4/Pz8dpVASw3T2OY0Y2V7FkBrdjDOarErkLPmpgNPkb/u5e8l4CqHG1IqhU\n; xEoQuZztlwuIRw8705WFma8uB3a0jcUhb05pQ/zdp+Ufso8R8hdLqygDs6OnptcXHxD+gx9V8R6H6a\n; dQ8WrSwq81XZ/1NToLztuY9T8D3U687/r/0D2siIlZoKRzIAAAAASUVORK5CYII=\n; thumbnail end\n; external perimeters extrusion width = 0.42mm\n; perimeters extrusion width = 0.45mm\n; infill extrusion width = 0.45mm\n; solid infill extrusion width = 0.45mm\n; top infill extrusion width = 0.42mm\n; support material extrusion width = 0.42mm\n; first layer extrusion width = 0.50mm\n;TYPE:Custom\nG9111 bedTemp={material_bed_temperature} extruderTemp={material_print_temperature}\nM117 ;display LCD message\nM900 K0.05 ;linear advance factor, ive only seen this set to k0.05\n;START HEADER\nG21 ; set units to millimeters\nG90 ; use absolute coordinates\nT0 ;set or report the current extruder or other tool\nM107 ; turn fan off" }, + "machine_start_gcode_first": { "default_value": true }, + "machine_width": { "default_value": 250 }, + "material_bed_temperature": + { + "maximum_value": "110", + "maximum_value_warning": "90" + }, + "material_diameter": { "default_value": 1.75 }, + "material_initial_print_temperature": + { + "maximum_value_warning": 295, + "value": "material_print_temperature + 5" + }, + "material_print_temperature": { "maximum_value_warning": 250 }, + "material_print_temperature_layer_0": + { + "maximum_value_warning": 295, + "value": "material_print_temperature + 5" + }, + "relative_extrusion": { "value": true } + } +} \ No newline at end of file diff --git a/resources/definitions/anycubic_kobra3v2_ACE_PRO.def.json b/resources/definitions/anycubic_kobra3v2_ACE_PRO.def.json new file mode 100644 index 0000000000..fc464c9eee --- /dev/null +++ b/resources/definitions/anycubic_kobra3v2_ACE_PRO.def.json @@ -0,0 +1,61 @@ +{ + "version": 2, + "name": "Anycubic Kobra 3 v2 ACE PRO", + "inherits": "fdmprinter", + "metadata": + { + "visible": true, + "author": "Sam Bonnekamp", + "manufacturer": "Anycubic", + "file_formats": "text/x-gcode", + "platform": "anycubic_kobra3v2_buildplate.stl", + "has_textured_buildplate": true, + "machine_extruder_trains": + { + "0": "anycubic_kobra3v2_ACEPRO_extruder_0", + "1": "anycubic_kobra3v2_ACEPRO_extruder_1", + "2": "anycubic_kobra3v2_ACEPRO_extruder_2", + "3": "anycubic_kobra3v2_ACEPRO_extruder_3" + } + }, + "overrides": + { + "adhesion_type": { "value": "'skirt'" }, + "layer_height": { "default_value": 0.2 }, + "machine_buildplate_type": { "default_value": "PEI Spring Steel" }, + "machine_center_is_zero": { "default_value": false }, + "machine_depth": { "default_value": 250 }, + "machine_end_gcode": { "default_value": "G1 X5 Y{machine_depth*0.95} F{speed_travel*60} ; present print\nM140 S0 ; turn off heat bed\nM104 S0 ; turn off temperature\nM84; disable motors ; disable stepper motors" }, + "machine_extruder_count": { "default_value": 4 }, + "machine_heated_bed": { "default_value": true }, + "machine_height": { "default_value": 260 }, + "machine_name": + { + "default_value": "Anycubic Kobra 3 v2", + "description": "Anycubic Kobra 3 v2" + }, + "machine_start_gcode": { "default_value": "; thumbnail begin 32x32\n; iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAX\n; NSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARWSURBVHgB1Vc7bx1FFD5n/cC+YOQ4RBTXlg0STfIH\n; gM78h0SAhGgQjyqARO8eFEQFBaKhCHIoKagcOkJJQUWBI19XJLaJgp+5M8x5zZzdO+sg0ZCR1zM7u3\n; e+73znMbMAT0KLMVqPdKVhvuze+o2NjUafget7Gz4GeO3s7Ow29YiYiXSJ2TPft0BwEmZ2dpYnp+Ec\n; 8NPT09tpyOAhhF4CXSBPwhOvEZk+B/ynNFzd2QvwxlfHMEq9PqR//mVaWcegmqKCIf9FKGS2Px30Ey\n; A/Hh8fE/gWgRPomww+VkxVgYFoWcz3xXpUJo2QsXvEFu8qAQJvmobA13b3I1u+Q+AhQuRfB1kTBDS6\n; FUVmVBx5iwmqNIgNv9ONkUzg4ODgBQNn2b80yyNbCzFQqMsC4MCNg/eveSQGdQM6glhXYDAYbJHvRw\n; q+ux90dQ8eeBxacaD+5T5ZSdLbfIcT61hTgCZTuq1R/zqDjxMOva6SKzBdMQRoO1OsovcLZrpPkmOO\n; ytibCdPejOQCGJHl5l+zlEGNxBiuvjxI1zNwZTgDzw4a6LbV6/fTT8eqSGD/G3hVgTQRT05OOv6Nyl\n; zBwxgW5iN8/e4leOWlOTivESjAlNhvYJoEvTEA6gq7wIqMyZ76zevPw5XlWdi5/wi+2foLNu88hAeH\n; QQKQJG/ScjjFY1cUFD3mYKxmgeef+1z9AstO4KMEfu3zXdi594gXlHIj3hYFY6su5fVQU7OjgAvZNg\n; kpaDFn8jvrC9zf+GEvgZ+16HqX5QRVctl6FmAyXhq3TmHnROBhWuBysp7aj7/+rS+IWybKO8oPWTns\n; zFX2kxalEKTe+6pZXR9kx0X3olhXdmqJ+GIF6lyfC8ArUCnZ8PPvJ9xfXn4KLMCkuBlo306payJMWD\n; 9BoGspE9LrVop4ajfevgQrz82U5xkQyg7onyEWfpUzxSQBlUnjWRZM8t66cwi/jU5h5eIMbH40hKuv\n; LqS6UFwh7mhv1RL4AYojY9VQbqkQRWL34icPtQ5o6dXqR9fwQlLgrYuPLUSrH96TvZDigsg1UwxFc3\n; c/e5rfsRNRI/JFNNns8MBy8QKNvJYKzGgf4NoXf8LH3+5xTDw4jP0szH16ZvBlybdcitMhpJzrwKUB\n; jcmCiDkDvv/liK92qRWLeTdsZYSsQaPhhXOOZD44uLJhqXAIxYKIQUIaSqBGg+Di09CuBiUYxQ0E/t\n; 0Hc2bk9gQB26kiYJEK7a6kJyqdvL/bKSiKOmx9dGumfpnA35/jnsDH4/H6BAH7Qba3dobTTQYrOY0N\n; usOnbr9JieEiCPgSzzH4/Pz8dpVASw3T2OY0Y2V7FkBrdjDOarErkLPmpgNPkb/u5e8l4CqHG1IqhU\n; xEoQuZztlwuIRw8705WFma8uB3a0jcUhb05pQ/zdp+Ufso8R8hdLqygDs6OnptcXHxD+gx9V8R6H6a\n; dQ8WrSwq81XZ/1NToLztuY9T8D3U687/r/0D2siIlZoKRzIAAAAASUVORK5CYII=\n; thumbnail end\n; external perimeters extrusion width = 0.42mm\n; perimeters extrusion width = 0.45mm\n; infill extrusion width = 0.45mm\n; solid infill extrusion width = 0.45mm\n; top infill extrusion width = 0.42mm\n; support material extrusion width = 0.42mm\n; first layer extrusion width = 0.50mm\n;TYPE:Custom\nG9111 bedTemp={material_bed_temperature} extruderTemp={material_print_temperature}\nM117 ;display LCD message\nM900 K0.05 ;linear advance factor, ive only seen this set to k0.05\n;START HEADER\nG21 ; set units to millimeters\nG90 ; use absolute coordinates\nT0 ;set or report the current extruder or other tool\nM107 ; turn fan off" }, + "machine_start_gcode_first": { "default_value": true }, + "machine_width": { "default_value": 250 }, + "material_bed_temperature": + { + "maximum_value": "110", + "maximum_value_warning": "90" + }, + "material_diameter": { "default_value": 1.75 }, + "material_initial_print_temperature": + { + "maximum_value_warning": 295, + "value": "material_print_temperature + 5" + }, + "material_print_temp_wait": { "value": true }, + "material_print_temperature": { "maximum_value": 300 }, + "material_print_temperature_layer_0": + { + "maximum_value_warning": 295, + "value": "material_print_temperature + 5" + }, + "material_standby_temperature": { "default_value": "material_print_temperature" }, + "relative_extrusion": { "value": true } + } +} \ No newline at end of file diff --git a/resources/definitions/biqu_b2.def.json b/resources/definitions/biqu_b2.def.json new file mode 100644 index 0000000000..85139b82c1 --- /dev/null +++ b/resources/definitions/biqu_b2.def.json @@ -0,0 +1,39 @@ +{ + "version": 2, + "name": "Biqu B2", + "inherits": "biqu_b1", + "metadata": + { + "visible": true, + "author": "Boris Juraga", + "has_textured_buildplate": true, + "machine_extruder_trains": + { + "0": "biqu_b2_extruder_0", + "1": "biqu_b2_extruder_1" + }, + "quality_definition": "biqu_b2" + }, + "overrides": + { + "gantry_height": { "value": 27.5 }, + "machine_end_gcode": { "default_value": ";BEGIN OF CUSTOM END GCODE\nM104 S0\nM140 S0\n;Retract the filament\nG91\nG1 E-30 F300\nG1 Z5\nG90\nG28 X0 Y{machine_depth}\n;END OF CUSTOM END GCODE" }, + "machine_extruder_count": { "default_value": 2 }, + "machine_extruders_share_heater": { "default_value": true }, + "machine_extruders_share_nozzle": { "default_value": true }, + "machine_extruders_shared_nozzle_initial_retraction": { "default_value": 30 }, + "machine_head_with_fans_polygon": + { + "default_value": [ + [-33, 35], + [-33, -23], + [33, -23], + [33, 35] + ] + }, + "machine_name": { "default_value": "BIQU B2" }, + "machine_start_gcode": { "default_value": ";BEGIN OF CUSTOM START GCODE\nG28 ;Home\nG1 Z15.0 F6000 ;Move the platform down 15mm\n;Prime the extruder\nM109 S{material_print_temperature_layer_0} ; Wait for Extruder temperature\nT0\nG92 E0\nG1 F1200 E-30\nG92 E0\nM109 S{material_print_temperature_layer_0} ; Wait for Extruder temperature\nT1\nG92 E0\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X6.1 Y20 Z0.3 F5000.0 ; Move to start position\nM117 Purging\nG1 X6.1 Y200.0 Z0.3 F1500.0 E10 ; Draw the first line\nG1 X6.4 Y200.0 Z0.3 F5000.0 ; Move to side a little\nG1 X6.4 Y20 Z0.3 F1500.0 E20 ; Draw the second line\nG1 X6.7 Y20 Z0.3 F5000.0 ; Move to side a little\nG1 X6.7 Y200.0 Z0.3 F1500.0 E30 ; Draw the three line\nG1 X7.0 Y200.0 Z0.3 F5000.0 ; Move to side a little\nG1 X7.0 Y20 Z0.3 F1500.0 E40 ; Draw the four line\nG1 X7.3 Y20 Z0.3 F5000.0 ; Move to side a little\nG1 X7.3 Y200.0 Z0.3 F1500.0 E50 ; Draw the four line\nG92 E0 \nT1\nG92 E0\nG1 F1200 E-30\nG92 E0\nT0\nG92 E0\nG1 F1200 E30\nG92 E0\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X9.1 Y20 Z0.3 F5000.0 ; Move to start position\nM117 Purging\nG1 X9.1 Y200.0 Z0.3 F1500.0 E10 ; Draw the first line\nG1 X9.4 Y200.0 Z0.3 F5000.0 ; Move to side a little\nG1 X9.4 Y20 Z0.3 F1500.0 E20 ; Draw the second line\nG1 X9.7 Y20 Z0.3 F5000.0 ; Move to side a little\nG1 X9.7 Y200.0 Z0.3 F1500.0 E30 ; Draw the three line\nG1 X10.0 Y200.0 Z0.3 F5000.0 ; Move to side a little\nG1 X10.0 Y20 Z0.3 F1500.0 E40 ; Draw the four line\nG1 X10.3 Y20 Z0.3 F5000.0 ; Move to side a little\nG1 X10.3 Y200.0 Z0.3 F1500.0 E50 ; Draw the four line\nT0\nG92 E0\nG1 F1200 E-30\nG92 E0\nG92 E0\nT{initial_extruder_nr} ; RESET EXTRUDER TO INITIAL\n; start print\n;END OF CUSTOM START GCODE" }, + "prime_tower_enable": { "default_value": true }, + "prime_tower_mode": { "default_value": "interleaved" } + } +} \ No newline at end of file diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 6710d0f0bf..6747bf9ceb 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -9311,6 +9311,42 @@ "default_value": true, "settable_per_mesh": true }, + "retraction_during_travel_ratio": + { + "label": "Retraction During Travel Move", + "description": "The ratio of retraction performed during the travel move, with the remainder completed while the nozzle is stationary, before traveling", + "unit": "%", + "type": "float", + "default_value": 0, + "minimum_value": 0, + "maximum_value": 100, + "enabled": "retraction_enable and not machine_firmware_retract and machine_gcode_flavor != \"UltiGCode\" and machine_gcode_flavor != \"BFB\"", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "keep_retracting_during_travel": + { + "label": "Keep Retracting During Travel", + "description": "When retraction during travel is enabled, and there is more than enough time to perform a full retract during a travel move, spread the retraction over the whole travel move with a lower retraction speed, so that we do not travel with a non-retracting nozzle. This can help reducing oozing.", + "type": "bool", + "default_value": false, + "enabled": "retraction_enable and not machine_firmware_retract and machine_gcode_flavor != \"UltiGCode\" and machine_gcode_flavor != \"BFB\" and retraction_during_travel_ratio > 0", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "prime_during_travel_ratio": + { + "label": "Prime During Travel Move", + "description": "The ratio of priming performed during the travel move, with the remainder completed while the nozzle is stationary, after traveling", + "unit": "%", + "type": "float", + "default_value": 0, + "minimum_value": 0, + "maximum_value": 100, + "enabled": "retraction_enable and not machine_firmware_retract and machine_gcode_flavor != \"UltiGCode\" and machine_gcode_flavor != \"BFB\"", + "settable_per_mesh": false, + "settable_per_extruder": true + }, "scarf_joint_seam_length": { "label": "Scarf Seam Length", diff --git a/resources/definitions/geeetech_M1.def.json b/resources/definitions/geeetech_M1.def.json new file mode 100644 index 0000000000..2782c7c87c --- /dev/null +++ b/resources/definitions/geeetech_M1.def.json @@ -0,0 +1,59 @@ +{ + "version": 2, + "name": "Geeetech M1", + "inherits": "Geeetech_Base_Single_Extruder", + "metadata": + { + "visible": true, + "machine_extruder_trains": { "0": "Geeetech_Single_Extruder" } + }, + "overrides": + { + "adhesion_type": { "value": "'brim'" }, + "brim_width": { "value": 2 }, + "gantry_height": { "value": 35 }, + "machine_depth": { "default_value": 105 }, + "machine_end_gcode": { "default_value": "G91 ;Switch to relative positioning\nG1 E-2.5 F2700 ;Retract filament\nG1 E-1.5 Z0.2 F2400 ;Retract and raise Z\nG1 X5 Y5 F3000 ;Move away\nG1 Z10 ;lift print head\nG90 ;Switch to absolute positioning\nG28 X Y ;homing XY\nM106 S0 ;off Fan\nM104 S0 ;Cooldown hotend\nM140 S0 ;Cooldown bed\nM84 X Y E ;Disable steppers" }, + "machine_head_with_fans_polygon": + { + "default_value": [ + [-31, 31], + [34, 31], + [34, -40], + [-31, -40] + ] + }, + "machine_height": { "default_value": 95 }, + "machine_name": { "default_value": "Geeetech M1" }, + "machine_start_gcode": { "default_value": ";Official wiki URL for Geeetech M1:https://www.geeetech.com/wiki/index.php/Geeetech_M1_3D_printer \nM104 S{material_print_temperature_layer_0} ; Set Hotend Temperature\nM140 S{material_bed_temperature_layer_0} ; Set Bed Temperature\n;M190 S{material_bed_temperature_layer_0} ; Wait for Bed Temperature\nM109 S{material_print_temperature_layer_0} ; Wait for Hotend Temperature\nG92 E0 ; Reset Extruder\nG28 ; Home all axes\nM107 ;Off Fan\nM300 S2500 P1000 ;Play a short tune\nG1 Z0.28 ;Move Z Axis up little to prevent scratching of Heat Bed\nG92 E0 ;Reset Extruder\nG1 Y3 F2400 ;Move to start position\nG1 X75 E40 F500 ;Draw a filament line\nG92 E0 ;Reset Extruder\n;G1 E-0.2 F3000 ;Retract a little\nG1 Z2.0 F3000 ;Move Z Axis up little to prevent scratching of Heat Bed\nG1 X70 Y3 Z0.27 F3000 ;Quickly wipe away from the filament line\nG92 E0 ;Reset Extruder" }, + "machine_width": { "default_value": 105 }, + "material_bed_temperature": { "maximum_value": 60 }, + "material_print_temperature": { "maximum_value": 230 }, + "retraction_amount": { "value": 2 }, + "speed_print": + { + "maximum_value_warning": "200", + "value": 120 + }, + "speed_topbottom": + { + "maximum_value_warning": "200", + "value": 60 + }, + "speed_wall": + { + "maximum_value_warning": "200", + "value": 80 + }, + "speed_wall_0": + { + "maximum_value_warning": "200", + "value": 50 + }, + "speed_wall_x": + { + "maximum_value_warning": "200", + "value": 80 + } + } +} \ No newline at end of file diff --git a/resources/definitions/geeetech_M1S.def.json b/resources/definitions/geeetech_M1S.def.json new file mode 100644 index 0000000000..79bfec5a89 --- /dev/null +++ b/resources/definitions/geeetech_M1S.def.json @@ -0,0 +1,59 @@ +{ + "version": 2, + "name": "Geeetech M1S", + "inherits": "Geeetech_Base_Single_Extruder", + "metadata": + { + "visible": true, + "machine_extruder_trains": { "0": "Geeetech_Single_Extruder" } + }, + "overrides": + { + "adhesion_type": { "value": "'brim'" }, + "brim_width": { "value": 2 }, + "gantry_height": { "value": 35 }, + "machine_depth": { "default_value": 105 }, + "machine_end_gcode": { "default_value": "G91 ;Switch to relative positioning\nG1 E-2.5 F2700 ;Retract filament\nG1 E-1.5 Z0.2 F2400 ;Retract and raise Z\nG1 X5 Y5 F3000 ;Move away\nG1 Z10 ;lift print head\nG90 ;Switch to absolute positioning\nG28 X Y ;homing XY\nM106 S0 ;off Fan\nM104 S0 ;Cooldown hotend\nM140 S0 ;Cooldown bed\nM84 X Y E ;Disable steppers" }, + "machine_head_with_fans_polygon": + { + "default_value": [ + [-31, 31], + [34, 31], + [34, -40], + [-31, -40] + ] + }, + "machine_height": { "default_value": 95 }, + "machine_name": { "default_value": "Geeetech M1S" }, + "machine_start_gcode": { "default_value": ";Official wiki URL for Geeetech M1S:https://www.geeetech.com/wiki/index.php/Geeetech_M1S_3D_printer \nM104 S{material_print_temperature_layer_0} ; Set Hotend Temperature\nM140 S{material_bed_temperature_layer_0} ; Set Bed Temperature\n;M190 S{material_bed_temperature_layer_0} ; Wait for Bed Temperature\nM109 S{material_print_temperature_layer_0} ; Wait for Hotend Temperature\nG92 E0 ; Reset Extruder\nG28 ; Home all axes\nM107 ;Off Fan\nM300 S2500 P1000 ;Play a short tune\nG1 Z0.28 ;Move Z Axis up little to prevent scratching of Heat Bed\nG92 E0 ;Reset Extruder\nG1 Y3 F2400 ;Move to start position\nG1 X75 E40 F500 ;Draw a filament line\nG92 E0 ;Reset Extruder\n;G1 E-0.2 F3000 ;Retract a little\nG1 Z2.0 F3000 ;Move Z Axis up little to prevent scratching of Heat Bed\nG1 X70 Y3 Z0.27 F3000 ;Quickly wipe away from the filament line\nG92 E0 ;Reset Extruder" }, + "machine_width": { "default_value": 105 }, + "material_bed_temperature": { "maximum_value": 85 }, + "material_print_temperature": { "maximum_value": 250 }, + "retraction_amount": { "value": 2 }, + "speed_print": + { + "maximum_value_warning": "200", + "value": 120 + }, + "speed_topbottom": + { + "maximum_value_warning": "200", + "value": 60 + }, + "speed_wall": + { + "maximum_value_warning": "200", + "value": 80 + }, + "speed_wall_0": + { + "maximum_value_warning": "200", + "value": 50 + }, + "speed_wall_x": + { + "maximum_value_warning": "200", + "value": 80 + } + } +} \ No newline at end of file diff --git a/resources/definitions/geeetech_Thunder.def.json b/resources/definitions/geeetech_Thunder.def.json index cc3e4044f8..cf0f9dd5e9 100644 --- a/resources/definitions/geeetech_Thunder.def.json +++ b/resources/definitions/geeetech_Thunder.def.json @@ -81,14 +81,10 @@ "machine_max_jerk_xy": { "value": 45 }, "machine_max_jerk_z": { "value": 0.8 }, "machine_name": { "default_value": "Geeetech Thunder" }, - "machine_start_gcode": { "default_value": ";Official viki homepage for Thunder:https://www.geeetech.com/wiki/index.php/Geeetech_Thunder_3D_printer \n\nM104 S{material_print_temperature_layer_0} ; Set Hotend Temperature\nM190 S{material_bed_temperature_layer_0} ; Wait for Bed Temperature\nM109 S{material_print_temperature_layer_0} ; Wait for Hotend Temperature\nG92 E0 ; Reset Extruder\nG28 ; Home all axes\nM107 P0 ;Off Main Fan\nM107 P1 ;Off Aux Fan\nM2012 P8 S1 F100 ; ON Light\n;M106 P0 S383 ; ON MainFan 150% if need\n;M106 P1 S255 ; ON Aux Fan 100% if need\nG1 Z5.0 F3000 ;Move Z Axis up little to prevent scratching of Heat Bed\nG1 X0.1 Y20 Z0.8 F5000 ; Move to start position\nG1 X0.1 Y200.0 Z1.2 F1500 E30 ; Draw the first line\nG92 E0 ; Reset Extruder\nG1 X0.4 Y200.0 Z1.2 F3000 ; Move to side a little\nG1 X0.4 Y20 Z1.2 F1500 E25 ; Draw the second line\nG92 E0 ; Reset Extruder\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X5 Y20 Z0.4 F3000.0 ; Scrape off nozzle residue" }, + "machine_start_gcode": { "default_value": ";Official wiki URL for Thunder:https://www.geeetech.com/wiki/index.php/Geeetech_Thunder_3D_printer \n\nM104 S{material_print_temperature_layer_0} ; Set Hotend Temperature\nM190 S{material_bed_temperature_layer_0} ; Wait for Bed Temperature\nM109 S{material_print_temperature_layer_0} ; Wait for Hotend Temperature\nG92 E0 ; Reset Extruder\nG28 ; Home all axes\nM107 P0 ;Off Main Fan\nM107 P1 ;Off Aux Fan\nM2012 P8 S1 F100 ; ON Light\n;M106 P0 S383 ; ON MainFan 150% if need\n;M106 P1 S255 ; ON Aux Fan 100% if need\nG1 Z5.0 F3000 ;Move Z Axis up little to prevent scratching of Heat Bed\nG1 X0.1 Y20 Z0.8 F5000 ; Move to start position\nG1 X0.1 Y200.0 Z1.2 F1500 E30 ; Draw the first line\nG92 E0 ; Reset Extruder\nG1 X0.4 Y200.0 Z1.2 F3000 ; Move to side a little\nG1 X0.4 Y20 Z1.2 F1500 E25 ; Draw the second line\nG92 E0 ; Reset Extruder\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X5 Y20 Z0.4 F3000.0 ; Scrape off nozzle residue" }, "machine_width": { "default_value": 250 }, "material_flow_layer_0": { "value": 95 }, - "material_print_temperature": - { - "maximum_value": "250", - "value": "200 if speed_infill <=150 else 205 if speed_infill <= 200 else 215 if speed_infill <= 260 else 220" - }, + "material_print_temperature": { "maximum_value": "250" }, "material_print_temperature_layer_0": { "maximum_value_warning": 300, diff --git a/resources/definitions/hellbot_hidra.def.json b/resources/definitions/hellbot_hidra.def.json index fe1d580354..bf8eb16608 100644 --- a/resources/definitions/hellbot_hidra.def.json +++ b/resources/definitions/hellbot_hidra.def.json @@ -21,7 +21,7 @@ 0, 5 ], - "platform_texture": "hellbot_hidra.png" + "platform_texture": "Hellbot_Hidra_and_Hidra_Plus_V2.png" }, "overrides": { diff --git a/resources/definitions/hellbot_hidra_plus.def.json b/resources/definitions/hellbot_hidra_plus.def.json index dc718dc5f2..70938b5b00 100644 --- a/resources/definitions/hellbot_hidra_plus.def.json +++ b/resources/definitions/hellbot_hidra_plus.def.json @@ -21,7 +21,7 @@ 0, 5 ], - "platform_texture": "hellbot_hidra_plus.png" + "platform_texture": "Hellbot_Hidra_and_Hidra_Plus_V2.png" }, "overrides": { diff --git a/resources/definitions/sovol_sv01.def.json b/resources/definitions/sovol_sv01.def.json index 9d77c1c3f6..5c87d8124e 100644 --- a/resources/definitions/sovol_sv01.def.json +++ b/resources/definitions/sovol_sv01.def.json @@ -1,11 +1,11 @@ { "version": 2, "name": "Sovol SV01", - "inherits": "sovol_base_bowden", + "inherits": "sovol_base_titan", "metadata": { "visible": true, - "quality_definition": "sovol_base_bowden" + "quality_definition": "sovol_base_titan" }, "overrides": { diff --git a/resources/definitions/toybox_alpha_one_two.def.json b/resources/definitions/toybox_alpha_one_two.def.json new file mode 100644 index 0000000000..6dc32a5fa7 --- /dev/null +++ b/resources/definitions/toybox_alpha_one_two.def.json @@ -0,0 +1,25 @@ +{ + "version": 2, + "name": "Toybox Alpha One/Two", + "inherits": "fdmprinter", + "metadata": + { + "visible": true, + "author": "lukbrew25", + "manufacturer": "Toybox", + "file_formats": "text/x-gcode", + "has_machine_quality": false, + "machine_extruder_trains": { "0": "toybox_alpha_one_two_extruder_0" } + }, + "overrides": + { + "gantry_height": { "value": "0.0" }, + "machine_depth": { "default_value": 80 }, + "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, + "machine_height": { "default_value": 90 }, + "machine_name": { "default_value": "Toybox Alpha One/Two" }, + "machine_start_gcode": { "default_value": "G90\nM82" }, + "machine_width": { "default_value": 70 }, + "material_diameter": { "default_value": 1.75 } + } +} \ No newline at end of file diff --git a/resources/definitions/ultimaker_s5.def.json b/resources/definitions/ultimaker_s5.def.json index 46d46d33eb..fa6f5a9a38 100644 --- a/resources/definitions/ultimaker_s5.def.json +++ b/resources/definitions/ultimaker_s5.def.json @@ -72,7 +72,11 @@ "brim_width": { "value": "3" }, "build_volume_temperature": { "maximum_value": 50 }, "cool_fan_speed": { "value": "50" }, - "default_material_print_temperature": { "value": "200" }, + "default_material_print_temperature": + { + "maximum_value_warning": "320", + "value": "200" + }, "extruder_prime_pos_abs": { "default_value": true }, "gantry_height": { "value": "55" }, "infill_pattern": { "value": "'zigzag' if infill_sparse_density > 80 else 'triangles'" }, @@ -104,6 +108,7 @@ "machine_nozzle_heat_up_speed": { "default_value": 1.4 }, "machine_start_gcode": { "default_value": "" }, "machine_width": { "default_value": 330 }, + "material_print_temperature_layer_0": { "maximum_value_warning": "320" }, "multiple_mesh_overlap": { "value": "0" }, "optimize_wall_printing_order": { "value": "True" }, "prime_blob_enable": diff --git a/resources/definitions/ultimaker_s7.def.json b/resources/definitions/ultimaker_s7.def.json index 14d9b21168..ac2f927ad4 100644 --- a/resources/definitions/ultimaker_s7.def.json +++ b/resources/definitions/ultimaker_s7.def.json @@ -46,8 +46,6 @@ }, "overrides": { - "default_material_print_temperature": { "maximum_value_warning": "320" }, - "machine_name": { "default_value": "Ultimaker S7" }, - "material_print_temperature_layer_0": { "maximum_value_warning": "320" } + "machine_name": { "default_value": "Ultimaker S7" } } } \ No newline at end of file diff --git a/resources/definitions/ultimaker_s8.def.json b/resources/definitions/ultimaker_s8.def.json index fb8243cd60..b7de27722d 100644 --- a/resources/definitions/ultimaker_s8.def.json +++ b/resources/definitions/ultimaker_s8.def.json @@ -1,7 +1,7 @@ { "version": 2, "name": "UltiMaker S8", - "inherits": "ultimaker_s7", + "inherits": "ultimaker_s5", "metadata": { "visible": true, @@ -48,7 +48,6 @@ "preferred_material": "ultimaker_pla_blue", "preferred_quality_type": "draft", "preferred_variant_name": "AA+ 0.4", - "quality_definition": "ultimaker_s8", "supported_actions": [ "DiscoverUM3Action" ], "supports_material_export": true, "supports_network_connection": true, diff --git a/resources/extruders/anycubic_kobra3v2_ACEPRO_extruder_0.def.json b/resources/extruders/anycubic_kobra3v2_ACEPRO_extruder_0.def.json new file mode 100644 index 0000000000..5537606b12 --- /dev/null +++ b/resources/extruders/anycubic_kobra3v2_ACEPRO_extruder_0.def.json @@ -0,0 +1,16 @@ +{ + "version": 2, + "name": "ACE Pro Color 1", + "inherits": "fdmextruder", + "metadata": + { + "machine": "anycubic_kobra3v2_ACE_PRO", + "position": "0" + }, + "overrides": + { + "extruder_nr": { "default_value": 0 }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 } + } +} \ No newline at end of file diff --git a/resources/extruders/anycubic_kobra3v2_ACEPRO_extruder_1.def.json b/resources/extruders/anycubic_kobra3v2_ACEPRO_extruder_1.def.json new file mode 100644 index 0000000000..2370427eea --- /dev/null +++ b/resources/extruders/anycubic_kobra3v2_ACEPRO_extruder_1.def.json @@ -0,0 +1,16 @@ +{ + "version": 2, + "name": "ACE Pro Color 2", + "inherits": "fdmextruder", + "metadata": + { + "machine": "anycubic_kobra3v2_ACE_PRO", + "position": "1" + }, + "overrides": + { + "extruder_nr": { "default_value": 1 }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 } + } +} \ No newline at end of file diff --git a/resources/extruders/anycubic_kobra3v2_ACEPRO_extruder_2.def.json b/resources/extruders/anycubic_kobra3v2_ACEPRO_extruder_2.def.json new file mode 100644 index 0000000000..ae860e5f7a --- /dev/null +++ b/resources/extruders/anycubic_kobra3v2_ACEPRO_extruder_2.def.json @@ -0,0 +1,16 @@ +{ + "version": 2, + "name": "ACE Pro Color 3", + "inherits": "fdmextruder", + "metadata": + { + "machine": "anycubic_kobra3v2_ACE_PRO", + "position": "2" + }, + "overrides": + { + "extruder_nr": { "default_value": 2 }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 } + } +} \ No newline at end of file diff --git a/resources/extruders/anycubic_kobra3v2_ACEPRO_extruder_3.def.json b/resources/extruders/anycubic_kobra3v2_ACEPRO_extruder_3.def.json new file mode 100644 index 0000000000..fed2c1fc6b --- /dev/null +++ b/resources/extruders/anycubic_kobra3v2_ACEPRO_extruder_3.def.json @@ -0,0 +1,16 @@ +{ + "version": 2, + "name": "ACE Pro Color 4", + "inherits": "fdmextruder", + "metadata": + { + "machine": "anycubic_kobra3v2_ACE_PRO", + "position": "3" + }, + "overrides": + { + "extruder_nr": { "default_value": 3 }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 } + } +} \ No newline at end of file diff --git a/resources/extruders/anycubic_kobra3v2_extruder_0.def.json b/resources/extruders/anycubic_kobra3v2_extruder_0.def.json new file mode 100644 index 0000000000..f5983cf3fb --- /dev/null +++ b/resources/extruders/anycubic_kobra3v2_extruder_0.def.json @@ -0,0 +1,16 @@ +{ + "version": 2, + "name": "Extruder 1", + "inherits": "fdmextruder", + "metadata": + { + "machine": "anycubic_kobra3v2", + "position": "0" + }, + "overrides": + { + "extruder_nr": { "default_value": 0 }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 } + } +} \ No newline at end of file diff --git a/resources/extruders/biqu_b2_extruder_0.def.json b/resources/extruders/biqu_b2_extruder_0.def.json new file mode 100644 index 0000000000..4bfb9686b3 --- /dev/null +++ b/resources/extruders/biqu_b2_extruder_0.def.json @@ -0,0 +1,16 @@ +{ + "version": 2, + "name": "Extruder 1", + "inherits": "fdmextruder", + "metadata": + { + "machine": "biqu_b2", + "position": "0" + }, + "overrides": + { + "extruder_nr": { "default_value": 0 }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 } + } +} \ No newline at end of file diff --git a/resources/extruders/biqu_b2_extruder_1.def.json b/resources/extruders/biqu_b2_extruder_1.def.json new file mode 100644 index 0000000000..fc5778b071 --- /dev/null +++ b/resources/extruders/biqu_b2_extruder_1.def.json @@ -0,0 +1,16 @@ +{ + "version": 2, + "name": "Extruder 2", + "inherits": "fdmextruder", + "metadata": + { + "machine": "biqu_b2", + "position": "1" + }, + "overrides": + { + "extruder_nr": { "default_value": 1 }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 } + } +} \ No newline at end of file diff --git a/resources/extruders/toybox_alpha_one_two_extruder_0.def.json b/resources/extruders/toybox_alpha_one_two_extruder_0.def.json new file mode 100644 index 0000000000..f7f773257c --- /dev/null +++ b/resources/extruders/toybox_alpha_one_two_extruder_0.def.json @@ -0,0 +1,17 @@ +{ + "version": 2, + "name": "Extruder 1", + "inherits": "fdmextruder", + "metadata": + { + "machine": "toybox_alpha_one_two", + "position": "0" + }, + "overrides": + { + "extruder_nr": { "default_value": 0 }, + "machine_nozzle_offset_x": { "default_value": -3.0 }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 } + } +} \ No newline at end of file diff --git a/resources/images/Hellbot_Hidra_and_Hidra_Plus_V2.png b/resources/images/Hellbot_Hidra_and_Hidra_Plus_V2.png new file mode 100644 index 0000000000..1cbdea4aae Binary files /dev/null and b/resources/images/Hellbot_Hidra_and_Hidra_Plus_V2.png differ diff --git a/resources/meshes/anycubic_kobra3v2_buildplate.stl b/resources/meshes/anycubic_kobra3v2_buildplate.stl new file mode 100644 index 0000000000..9d526d0eda Binary files /dev/null and b/resources/meshes/anycubic_kobra3v2_buildplate.stl differ diff --git a/resources/quality/biqu/b2/biqu_b2_0.4_PLA_adaptive.inst.cfg b/resources/quality/biqu/b2/biqu_b2_0.4_PLA_adaptive.inst.cfg new file mode 100644 index 0000000000..b9f8323096 --- /dev/null +++ b/resources/quality/biqu/b2/biqu_b2_0.4_PLA_adaptive.inst.cfg @@ -0,0 +1,14 @@ +[general] +definition = biqu_b2 +name = Dynamic Quality +version = 4 + +[metadata] +material = generic_pla_175 +quality_type = adaptive +setting_version = 25 +type = quality +variant = 0.4mm Nozzle + +[values] + diff --git a/resources/quality/biqu/b2/biqu_b2_0.4_PLA_draft.inst.cfg b/resources/quality/biqu/b2/biqu_b2_0.4_PLA_draft.inst.cfg new file mode 100644 index 0000000000..57b48a55a5 --- /dev/null +++ b/resources/quality/biqu/b2/biqu_b2_0.4_PLA_draft.inst.cfg @@ -0,0 +1,14 @@ +[general] +definition = biqu_b2 +name = Draft Quality +version = 4 + +[metadata] +material = generic_pla_175 +quality_type = draft +setting_version = 25 +type = quality +variant = 0.4mm Nozzle + +[values] + diff --git a/resources/quality/biqu/b2/biqu_b2_0.4_PLA_low.inst.cfg b/resources/quality/biqu/b2/biqu_b2_0.4_PLA_low.inst.cfg new file mode 100644 index 0000000000..d11d6658d4 --- /dev/null +++ b/resources/quality/biqu/b2/biqu_b2_0.4_PLA_low.inst.cfg @@ -0,0 +1,14 @@ +[general] +definition = biqu_b2 +name = Low Quality +version = 4 + +[metadata] +material = generic_pla_175 +quality_type = low +setting_version = 25 +type = quality +variant = 0.4mm Nozzle + +[values] + diff --git a/resources/quality/biqu/b2/biqu_b2_0.4_PLA_standard.inst.cfg b/resources/quality/biqu/b2/biqu_b2_0.4_PLA_standard.inst.cfg new file mode 100644 index 0000000000..fa641937bb --- /dev/null +++ b/resources/quality/biqu/b2/biqu_b2_0.4_PLA_standard.inst.cfg @@ -0,0 +1,14 @@ +[general] +definition = biqu_b2 +name = Standard Quality +version = 4 + +[metadata] +material = generic_pla_175 +quality_type = standard +setting_version = 25 +type = quality +variant = 0.4mm Nozzle + +[values] + diff --git a/resources/quality/biqu/b2/biqu_b2_0.4_PLA_super.inst.cfg b/resources/quality/biqu/b2/biqu_b2_0.4_PLA_super.inst.cfg new file mode 100644 index 0000000000..7aadcb580c --- /dev/null +++ b/resources/quality/biqu/b2/biqu_b2_0.4_PLA_super.inst.cfg @@ -0,0 +1,14 @@ +[general] +definition = biqu_b2 +name = Super Quality +version = 4 + +[metadata] +material = generic_pla_175 +quality_type = super +setting_version = 25 +type = quality +variant = 0.4mm Nozzle + +[values] + diff --git a/resources/quality/biqu/b2/biqu_b2_0.4_PLA_ultra.inst.cfg b/resources/quality/biqu/b2/biqu_b2_0.4_PLA_ultra.inst.cfg new file mode 100644 index 0000000000..fbd8a08905 --- /dev/null +++ b/resources/quality/biqu/b2/biqu_b2_0.4_PLA_ultra.inst.cfg @@ -0,0 +1,14 @@ +[general] +definition = biqu_b2 +name = Ultra Quality +version = 4 + +[metadata] +material = generic_pla_175 +quality_type = ultra +setting_version = 25 +type = quality +variant = 0.4mm Nozzle + +[values] + diff --git a/resources/quality/biqu/b2/biqu_b2_global_adaptive.inst.cfg b/resources/quality/biqu/b2/biqu_b2_global_adaptive.inst.cfg new file mode 100644 index 0000000000..54484e046e --- /dev/null +++ b/resources/quality/biqu/b2/biqu_b2_global_adaptive.inst.cfg @@ -0,0 +1,29 @@ +[general] +definition = biqu_b2 +name = Dynamic Quality +version = 4 + +[metadata] +global_quality = True +quality_type = adaptive +setting_version = 25 +type = quality +weight = -2 + +[values] +adaptive_layer_height_enabled = true +layer_height = 0.16 +layer_height_0 = 0.20 +material_final_print_temperature = 195 +material_initial_print_temperature = 195 +material_print_temperature = 190 +material_standby_temperature = 195 +optimize_wall_printing_order = True +prime_tower_min_volume = 150 +support_interface_height = =layer_height*6 +switch_extruder_prime_speed = 10 +switch_extruder_retraction_amount = 40 +switch_extruder_retraction_speeds = 30 +top_bottom_thickness = =layer_height_0+layer_height*4 +wall_thickness = =line_width*3 + diff --git a/resources/quality/biqu/b2/biqu_b2_global_draft.inst.cfg b/resources/quality/biqu/b2/biqu_b2_global_draft.inst.cfg new file mode 100644 index 0000000000..e5ebe77ad2 --- /dev/null +++ b/resources/quality/biqu/b2/biqu_b2_global_draft.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = biqu_b2 +name = Draft Quality +version = 4 + +[metadata] +global_quality = True +quality_type = draft +setting_version = 25 +type = quality +weight = -5 + +[values] +layer_height = 0.32 +layer_height_0 = 0.32 +material_final_print_temperature = 195 +material_initial_print_temperature = 195 +material_print_temperature = 190 +material_standby_temperature = 195 +optimize_wall_printing_order = True +prime_tower_min_volume = 150 +support_interface_height = =layer_height*4 +switch_extruder_prime_speed = 10 +switch_extruder_retraction_amount = 40 +switch_extruder_retraction_speeds = 30 +top_bottom_thickness = =layer_height_0+layer_height*3 +wall_thickness = =line_width*2 + diff --git a/resources/quality/biqu/b2/biqu_b2_global_low.inst.cfg b/resources/quality/biqu/b2/biqu_b2_global_low.inst.cfg new file mode 100644 index 0000000000..2a0f57981f --- /dev/null +++ b/resources/quality/biqu/b2/biqu_b2_global_low.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = biqu_b2 +name = Low Quality +version = 4 + +[metadata] +global_quality = True +quality_type = low +setting_version = 25 +type = quality +weight = -4 + +[values] +layer_height = 0.28 +layer_height_0 = 0.28 +material_final_print_temperature = 195 +material_initial_print_temperature = 195 +material_print_temperature = 190 +material_standby_temperature = 195 +optimize_wall_printing_order = True +prime_tower_min_volume = 150 +support_interface_height = =layer_height*4 +switch_extruder_prime_speed = 10 +switch_extruder_retraction_amount = 40 +switch_extruder_retraction_speeds = 30 +top_bottom_thickness = =layer_height_0+layer_height*3 +wall_thickness = =line_width*3 + diff --git a/resources/quality/biqu/b2/biqu_b2_global_standard.inst.cfg b/resources/quality/biqu/b2/biqu_b2_global_standard.inst.cfg new file mode 100644 index 0000000000..e2860c23e3 --- /dev/null +++ b/resources/quality/biqu/b2/biqu_b2_global_standard.inst.cfg @@ -0,0 +1,29 @@ +[general] +definition = biqu_b2 +name = Standard Quality +version = 4 + +[metadata] +global_quality = True +position = 0 +quality_type = standard +setting_version = 25 +type = quality +weight = -3 + +[values] +layer_height = 0.2 +layer_height_0 = 0.2 +material_final_print_temperature = 195 +material_initial_print_temperature = 195 +material_print_temperature = 190 +material_standby_temperature = 195 +optimize_wall_printing_order = True +prime_tower_min_volume = 150 +support_interface_height = =layer_height*4 +switch_extruder_prime_speed = 10 +switch_extruder_retraction_amount = 40 +switch_extruder_retraction_speeds = 30 +top_bottom_thickness = =layer_height_0+layer_height*3 +wall_thickness = =line_width*3 + diff --git a/resources/quality/biqu/b2/biqu_b2_global_super.inst.cfg b/resources/quality/biqu/b2/biqu_b2_global_super.inst.cfg new file mode 100644 index 0000000000..9343fe00df --- /dev/null +++ b/resources/quality/biqu/b2/biqu_b2_global_super.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = biqu_b2 +name = Super Quality +version = 4 + +[metadata] +global_quality = True +quality_type = super +setting_version = 25 +type = quality +weight = -1 + +[values] +layer_height = 0.12 +layer_height_0 = 0.12 +material_final_print_temperature = 195 +material_initial_print_temperature = 195 +material_print_temperature = 190 +material_standby_temperature = 195 +optimize_wall_printing_order = True +prime_tower_min_volume = 150 +support_interface_height = =layer_height*8 +switch_extruder_prime_speed = 10 +switch_extruder_retraction_amount = 40 +switch_extruder_retraction_speeds = 30 +top_bottom_thickness = =layer_height_0+layer_height*6 +wall_thickness = =line_width*3 + diff --git a/resources/quality/biqu/b2/biqu_b2_global_ultra.inst.cfg b/resources/quality/biqu/b2/biqu_b2_global_ultra.inst.cfg new file mode 100644 index 0000000000..4625e672e3 --- /dev/null +++ b/resources/quality/biqu/b2/biqu_b2_global_ultra.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = biqu_b2 +name = Ultra Quality +version = 4 + +[metadata] +global_quality = True +quality_type = ultra +setting_version = 25 +type = quality +weight = 0 + +[values] +layer_height = 0.08 +layer_height_0 = 0.12 +material_final_print_temperature = 195 +material_initial_print_temperature = 195 +material_print_temperature = 190 +material_standby_temperature = 195 +optimize_wall_printing_order = True +prime_tower_min_volume = 150 +support_interface_height = =layer_height*12 +switch_extruder_prime_speed = 10 +switch_extruder_retraction_amount = 40 +switch_extruder_retraction_speeds = 30 +top_bottom_thickness = =layer_height_0+layer_height*10 +wall_thickness = =line_width*4 + diff --git a/resources/quality/ultimaker_s8/um_s8_global_High_Quality.inst.cfg b/resources/quality/ultimaker_s8/um_s8_global_High_Quality.inst.cfg new file mode 100644 index 0000000000..d495da9f17 --- /dev/null +++ b/resources/quality/ultimaker_s8/um_s8_global_High_Quality.inst.cfg @@ -0,0 +1,15 @@ +[general] +definition = ultimaker_s8 +name = Extra Fine +version = 4 + +[metadata] +global_quality = True +quality_type = high +setting_version = 25 +type = quality +weight = 1 + +[values] +layer_height = =round(0.06 * material_shrinkage_percentage_z / 100, 5) + diff --git a/resources/quality/ultimaker_s8/um_s8_global_Superdraft_Quality.inst.cfg b/resources/quality/ultimaker_s8/um_s8_global_Superdraft_Quality.inst.cfg new file mode 100644 index 0000000000..026e5701de --- /dev/null +++ b/resources/quality/ultimaker_s8/um_s8_global_Superdraft_Quality.inst.cfg @@ -0,0 +1,15 @@ +[general] +definition = ultimaker_s8 +name = Sprint +version = 4 + +[metadata] +global_quality = True +quality_type = superdraft +setting_version = 25 +type = quality +weight = -4 + +[values] +layer_height = =round(0.4 * material_shrinkage_percentage_z / 100, 5) + diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index 1ae316f96c..377e70f5b6 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -463,6 +463,8 @@ "layerview_support_infill": [0, 230, 230, 127], "layerview_move_combing": [0, 0, 255, 255], "layerview_move_retraction": [128, 127, 255, 255], + "layerview_move_while_retracting": [127, 255, 255, 255], + "layerview_move_while_unretracting": [255, 127, 255, 255], "layerview_support_interface": [63, 127, 255, 127], "layerview_prime_tower": [0, 255, 255, 255], "layerview_nozzle": [224, 192, 16, 64], diff --git a/resources/variants/biqu/biqu_b2_0.2.inst.cfg b/resources/variants/biqu/biqu_b2_0.2.inst.cfg new file mode 100644 index 0000000000..e86b85d50b --- /dev/null +++ b/resources/variants/biqu/biqu_b2_0.2.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = biqu_b2 +name = 0.2mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 25 +type = variant + +[values] +machine_nozzle_size = 0.2 + diff --git a/resources/variants/biqu/biqu_b2_0.3.inst.cfg b/resources/variants/biqu/biqu_b2_0.3.inst.cfg new file mode 100644 index 0000000000..8469c7e211 --- /dev/null +++ b/resources/variants/biqu/biqu_b2_0.3.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = biqu_b2 +name = 0.3mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 25 +type = variant + +[values] +machine_nozzle_size = 0.3 + diff --git a/resources/variants/biqu/biqu_b2_0.4.inst.cfg b/resources/variants/biqu/biqu_b2_0.4.inst.cfg new file mode 100644 index 0000000000..472e03489b --- /dev/null +++ b/resources/variants/biqu/biqu_b2_0.4.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = biqu_b2 +name = 0.4mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 25 +type = variant + +[values] +machine_nozzle_size = 0.4 + diff --git a/resources/variants/biqu/biqu_b2_0.5.inst.cfg b/resources/variants/biqu/biqu_b2_0.5.inst.cfg new file mode 100644 index 0000000000..1ab4eb72d4 --- /dev/null +++ b/resources/variants/biqu/biqu_b2_0.5.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = biqu_b2 +name = 0.5mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 25 +type = variant + +[values] +machine_nozzle_size = 0.5 + diff --git a/resources/variants/biqu/biqu_b2_0.6.inst.cfg b/resources/variants/biqu/biqu_b2_0.6.inst.cfg new file mode 100644 index 0000000000..0ac946844a --- /dev/null +++ b/resources/variants/biqu/biqu_b2_0.6.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = biqu_b2 +name = 0.6mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 25 +type = variant + +[values] +machine_nozzle_size = 0.6 + diff --git a/resources/variants/biqu/biqu_b2_0.8.inst.cfg b/resources/variants/biqu/biqu_b2_0.8.inst.cfg new file mode 100644 index 0000000000..53b6910342 --- /dev/null +++ b/resources/variants/biqu/biqu_b2_0.8.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = biqu_b2 +name = 0.8mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 25 +type = variant + +[values] +machine_nozzle_size = 0.8 + diff --git a/resources/variants/geeetech_variants/geeetech_M1S_0.2.inst.cfg b/resources/variants/geeetech_variants/geeetech_M1S_0.2.inst.cfg new file mode 100644 index 0000000000..2ed913b2a4 --- /dev/null +++ b/resources/variants/geeetech_variants/geeetech_M1S_0.2.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = geeetech_M1S +name = 0.2mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 25 +type = variant + +[values] +machine_nozzle_size = 0.2 + diff --git a/resources/variants/geeetech_variants/geeetech_M1S_0.3.inst.cfg b/resources/variants/geeetech_variants/geeetech_M1S_0.3.inst.cfg new file mode 100644 index 0000000000..032e25592d --- /dev/null +++ b/resources/variants/geeetech_variants/geeetech_M1S_0.3.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = geeetech_M1S +name = 0.3mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 25 +type = variant + +[values] +machine_nozzle_size = 0.3 + diff --git a/resources/variants/geeetech_variants/geeetech_M1S_0.4.inst.cfg b/resources/variants/geeetech_variants/geeetech_M1S_0.4.inst.cfg new file mode 100644 index 0000000000..12306b7acc --- /dev/null +++ b/resources/variants/geeetech_variants/geeetech_M1S_0.4.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = geeetech_M1S +name = 0.4mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 25 +type = variant + +[values] +machine_nozzle_size = 0.4 + diff --git a/resources/variants/geeetech_variants/geeetech_M1S_0.5.inst.cfg b/resources/variants/geeetech_variants/geeetech_M1S_0.5.inst.cfg new file mode 100644 index 0000000000..59db9afec4 --- /dev/null +++ b/resources/variants/geeetech_variants/geeetech_M1S_0.5.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = geeetech_M1S +name = 0.5mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 25 +type = variant + +[values] +machine_nozzle_size = 0.5 + diff --git a/resources/variants/geeetech_variants/geeetech_M1S_0.6.inst.cfg b/resources/variants/geeetech_variants/geeetech_M1S_0.6.inst.cfg new file mode 100644 index 0000000000..ee92dc8c93 --- /dev/null +++ b/resources/variants/geeetech_variants/geeetech_M1S_0.6.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = geeetech_M1S +name = 0.6mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 25 +type = variant + +[values] +machine_nozzle_size = 0.6 + diff --git a/resources/variants/geeetech_variants/geeetech_M1S_0.8.inst.cfg b/resources/variants/geeetech_variants/geeetech_M1S_0.8.inst.cfg new file mode 100644 index 0000000000..0029d6101c --- /dev/null +++ b/resources/variants/geeetech_variants/geeetech_M1S_0.8.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = geeetech_M1S +name = 0.8mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 25 +type = variant + +[values] +machine_nozzle_size = 0.8 + diff --git a/resources/variants/geeetech_variants/geeetech_M1S_1.0.inst.cfg b/resources/variants/geeetech_variants/geeetech_M1S_1.0.inst.cfg new file mode 100644 index 0000000000..225b0b3c06 --- /dev/null +++ b/resources/variants/geeetech_variants/geeetech_M1S_1.0.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = geeetech_M1S +name = 1.0mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 25 +type = variant + +[values] +machine_nozzle_size = 1.0 + diff --git a/resources/variants/geeetech_variants/geeetech_M1_0.2.inst.cfg b/resources/variants/geeetech_variants/geeetech_M1_0.2.inst.cfg new file mode 100644 index 0000000000..77bf14e06e --- /dev/null +++ b/resources/variants/geeetech_variants/geeetech_M1_0.2.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = geeetech_M1 +name = 0.2mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 25 +type = variant + +[values] +machine_nozzle_size = 0.2 + diff --git a/resources/variants/geeetech_variants/geeetech_M1_0.3.inst.cfg b/resources/variants/geeetech_variants/geeetech_M1_0.3.inst.cfg new file mode 100644 index 0000000000..f9ecf2eec2 --- /dev/null +++ b/resources/variants/geeetech_variants/geeetech_M1_0.3.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = geeetech_M1 +name = 0.3mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 25 +type = variant + +[values] +machine_nozzle_size = 0.3 + diff --git a/resources/variants/geeetech_variants/geeetech_M1_0.4.inst.cfg b/resources/variants/geeetech_variants/geeetech_M1_0.4.inst.cfg new file mode 100644 index 0000000000..e3c124c614 --- /dev/null +++ b/resources/variants/geeetech_variants/geeetech_M1_0.4.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = geeetech_M1 +name = 0.4mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 25 +type = variant + +[values] +machine_nozzle_size = 0.4 + diff --git a/resources/variants/geeetech_variants/geeetech_M1_0.5.inst.cfg b/resources/variants/geeetech_variants/geeetech_M1_0.5.inst.cfg new file mode 100644 index 0000000000..5adccce2df --- /dev/null +++ b/resources/variants/geeetech_variants/geeetech_M1_0.5.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = geeetech_M1 +name = 0.5mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 25 +type = variant + +[values] +machine_nozzle_size = 0.5 + diff --git a/resources/variants/geeetech_variants/geeetech_M1_0.6.inst.cfg b/resources/variants/geeetech_variants/geeetech_M1_0.6.inst.cfg new file mode 100644 index 0000000000..f61f2febc0 --- /dev/null +++ b/resources/variants/geeetech_variants/geeetech_M1_0.6.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = geeetech_M1 +name = 0.6mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 25 +type = variant + +[values] +machine_nozzle_size = 0.6 + diff --git a/resources/variants/geeetech_variants/geeetech_M1_0.8.inst.cfg b/resources/variants/geeetech_variants/geeetech_M1_0.8.inst.cfg new file mode 100644 index 0000000000..0677557124 --- /dev/null +++ b/resources/variants/geeetech_variants/geeetech_M1_0.8.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = geeetech_M1 +name = 0.8mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 25 +type = variant + +[values] +machine_nozzle_size = 0.8 + diff --git a/resources/variants/geeetech_variants/geeetech_M1_1.0.inst.cfg b/resources/variants/geeetech_variants/geeetech_M1_1.0.inst.cfg new file mode 100644 index 0000000000..5df54b48df --- /dev/null +++ b/resources/variants/geeetech_variants/geeetech_M1_1.0.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = geeetech_M1 +name = 1.0mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 25 +type = variant + +[values] +machine_nozzle_size = 1.0 + diff --git a/resources/variants/ultimaker_s3_aa04.inst.cfg b/resources/variants/ultimaker_s3_aa04.inst.cfg index 94d27e150b..e3f4aaff2b 100644 --- a/resources/variants/ultimaker_s3_aa04.inst.cfg +++ b/resources/variants/ultimaker_s3_aa04.inst.cfg @@ -12,6 +12,7 @@ type = variant brim_width = 7 machine_nozzle_cool_down_speed = 0.9 machine_nozzle_id = AA 0.4 +machine_nozzle_size = 0.4 machine_nozzle_tip_outer_diameter = 1.0 retraction_amount = 6.5 speed_print = 70 diff --git a/resources/variants/ultimaker_s3_bb04.inst.cfg b/resources/variants/ultimaker_s3_bb04.inst.cfg index 022b4f945c..7923a5a28e 100644 --- a/resources/variants/ultimaker_s3_bb04.inst.cfg +++ b/resources/variants/ultimaker_s3_bb04.inst.cfg @@ -15,6 +15,7 @@ acceleration_support_bottom = =math.ceil(acceleration_support_interface * 100 / acceleration_support_interface = =math.ceil(acceleration_support * 1500 / 2000) machine_nozzle_heat_up_speed = 1.5 machine_nozzle_id = BB 0.4 +machine_nozzle_size = 0.4 machine_nozzle_tip_outer_diameter = 1.0 speed_prime_tower = =math.ceil(speed_print * 10 / 35) speed_support = =math.ceil(speed_print * 25 / 35) diff --git a/resources/variants/ultimaker_s5_aa04.inst.cfg b/resources/variants/ultimaker_s5_aa04.inst.cfg index ef846a089d..69aae0757e 100644 --- a/resources/variants/ultimaker_s5_aa04.inst.cfg +++ b/resources/variants/ultimaker_s5_aa04.inst.cfg @@ -12,6 +12,7 @@ type = variant brim_width = 7 machine_nozzle_cool_down_speed = 0.9 machine_nozzle_id = AA 0.4 +machine_nozzle_size = 0.4 machine_nozzle_tip_outer_diameter = 1.0 retraction_amount = 6.5 speed_print = 70 diff --git a/resources/variants/ultimaker_s5_bb04.inst.cfg b/resources/variants/ultimaker_s5_bb04.inst.cfg index ce287e127b..294b39b8c7 100644 --- a/resources/variants/ultimaker_s5_bb04.inst.cfg +++ b/resources/variants/ultimaker_s5_bb04.inst.cfg @@ -15,6 +15,7 @@ acceleration_support_bottom = =math.ceil(acceleration_support_interface * 100 / acceleration_support_interface = =math.ceil(acceleration_support * 1500 / 2000) machine_nozzle_heat_up_speed = 1.5 machine_nozzle_id = BB 0.4 +machine_nozzle_size = 0.4 machine_nozzle_tip_outer_diameter = 1.0 speed_prime_tower = =math.ceil(speed_print * 10 / 35) speed_support = =math.ceil(speed_print * 25 / 35) diff --git a/resources/variants/ultimaker_s6_bb04.inst.cfg b/resources/variants/ultimaker_s6_bb04.inst.cfg index 756d6fd1d4..e0c62d9596 100644 --- a/resources/variants/ultimaker_s6_bb04.inst.cfg +++ b/resources/variants/ultimaker_s6_bb04.inst.cfg @@ -11,6 +11,7 @@ type = variant [values] machine_nozzle_heat_up_speed = 1.5 machine_nozzle_id = BB 0.4 +machine_nozzle_size = 0.4 machine_nozzle_tip_outer_diameter = 1.0 retraction_amount = 4.5 support_bottom_height = =layer_height * 2 diff --git a/resources/variants/ultimaker_s7_aa04.inst.cfg b/resources/variants/ultimaker_s7_aa04.inst.cfg index 7d5a08d117..ee4ebdceaf 100644 --- a/resources/variants/ultimaker_s7_aa04.inst.cfg +++ b/resources/variants/ultimaker_s7_aa04.inst.cfg @@ -12,6 +12,7 @@ type = variant brim_width = 7 machine_nozzle_cool_down_speed = 0.9 machine_nozzle_id = AA 0.4 +machine_nozzle_size = 0.4 machine_nozzle_tip_outer_diameter = 1.0 retraction_amount = 6.5 speed_print = 70 diff --git a/resources/variants/ultimaker_s7_bb04.inst.cfg b/resources/variants/ultimaker_s7_bb04.inst.cfg index 1bfa216167..18aa61ff4b 100644 --- a/resources/variants/ultimaker_s7_bb04.inst.cfg +++ b/resources/variants/ultimaker_s7_bb04.inst.cfg @@ -15,6 +15,7 @@ acceleration_support_bottom = =math.ceil(acceleration_support_interface * 100 / acceleration_support_interface = =math.ceil(acceleration_support * 1500 / 2000) machine_nozzle_heat_up_speed = 1.5 machine_nozzle_id = BB 0.4 +machine_nozzle_size = 0.4 machine_nozzle_tip_outer_diameter = 1.0 retraction_amount = 4.5 speed_prime_tower = =math.ceil(speed_print * 10 / 35) diff --git a/resources/variants/ultimaker_s8_bb04.inst.cfg b/resources/variants/ultimaker_s8_bb04.inst.cfg index 388ce27ec2..d92874e448 100644 --- a/resources/variants/ultimaker_s8_bb04.inst.cfg +++ b/resources/variants/ultimaker_s8_bb04.inst.cfg @@ -11,6 +11,7 @@ type = variant [values] machine_nozzle_heat_up_speed = 1.5 machine_nozzle_id = BB 0.4 +machine_nozzle_size = 0.4 machine_nozzle_tip_outer_diameter = 1.0 retraction_amount = 4.5 support_bottom_height = =layer_height * 2