diff --git a/.github/workflows/cura-installer.yml b/.github/workflows/cura-installer.yml index 9572b31aee..e5a205a770 100644 --- a/.github/workflows/cura-installer.yml +++ b/.github/workflows/cura-installer.yml @@ -155,7 +155,7 @@ jobs: sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 10 - name: Create the default Conan profile - run: conan profile new default --detect + run: conan profile new default --detect --force - name: Configure GPG Key Linux (Bash) if: ${{ runner.os == 'Linux' }} diff --git a/.github/workflows/installers.yml b/.github/workflows/installers.yml new file mode 100644 index 0000000000..283fc76ee5 --- /dev/null +++ b/.github/workflows/installers.yml @@ -0,0 +1,77 @@ +name: All installers +run-name: ${{ inputs.cura_conan_version }} by @${{ github.actor }} + +on: + workflow_dispatch: + inputs: + cura_conan_version: + description: 'Cura Conan Version' + default: 'cura/latest@ultimaker/testing' + required: true + type: string + conan_args: + description: 'Conan args: eq.: --require-override' + default: '' + required: false + type: string + enterprise: + description: 'Build Cura as an Enterprise edition' + default: false + required: true + type: boolean + staging: + description: 'Use staging API' + default: false + required: true + type: boolean + +jobs: + windows-installer: + uses: ./.github/workflows/windows.yml + with: + cura_conan_version: ${{ inputs.cura_conan_version }} + conan_args: ${{ inputs.conan_args }} + enterprise: ${{ inputs.enterprise }} + staging: ${{ inputs.staging }} + architecture: X64 + operating_system: windows-2022 + + linux-modern-installer: + uses: ./.github/workflows/linux.yml + with: + cura_conan_version: ${{ inputs.cura_conan_version }} + conan_args: ${{ inputs.conan_args }} + enterprise: ${{ inputs.enterprise }} + staging: ${{ inputs.staging }} + architecture: X64 + operating_system: ubuntu-22.04 + + linux-legacy-installer: + uses: ./.github/workflows/linux.yml + with: + cura_conan_version: ${{ inputs.cura_conan_version }} + conan_args: ${{ inputs.conan_args }} + enterprise: ${{ inputs.enterprise }} + staging: ${{ inputs.staging }} + architecture: X64 + operating_system: ubuntu-20.04 + + macos-installer: + uses: ./.github/workflows/macos.yml + with: + cura_conan_version: ${{ inputs.cura_conan_version }} + conan_args: ${{ inputs.conan_args }} + enterprise: ${{ inputs.enterprise }} + staging: ${{ inputs.staging }} + architecture: X64 + operating_system: macos-11.0 + + macos-arm-installer: + uses: ./.github/workflows/macos.yml + with: + cura_conan_version: ${{ inputs.cura_conan_version }} + conan_args: ${{ inputs.conan_args }} + enterprise: ${{ inputs.enterprise }} + staging: ${{ inputs.staging }} + architecture: ARM64 + operating_system: self-hosted \ No newline at end of file diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml new file mode 100644 index 0000000000..e307354c0a --- /dev/null +++ b/.github/workflows/linux.yml @@ -0,0 +1,89 @@ +name: Linux Installer +run-name: ${{ inputs.cura_conan_version }} for Linux-${{ inputs.architecture }} by @${{ github.actor }} + +on: + workflow_dispatch: + inputs: + cura_conan_version: + description: 'Cura Conan Version' + default: 'cura/latest@ultimaker/testing' + required: true + type: string + conan_args: + description: 'Conan args: eq.: --require-override' + default: '' + required: false + type: string + enterprise: + description: 'Build Cura as an Enterprise edition' + default: false + required: true + type: boolean + staging: + description: 'Use staging API' + default: false + required: true + type: boolean + architecture: + description: 'Architecture' + required: true + default: 'X64' + type: choice + options: + - X64 + operating_system: + description: 'OS' + required: true + default: 'ubuntu-22.04' + type: choice + options: + - ubuntu-22.04 + - ubuntu-20.04 + workflow_call: + inputs: + cura_conan_version: + description: 'Cura Conan Version' + default: 'cura/latest@ultimaker/testing' + required: true + type: string + conan_args: + description: 'Conan args: eq.: --require-override' + default: '' + required: false + type: string + enterprise: + description: 'Build Cura as an Enterprise edition' + default: false + required: true + type: boolean + staging: + description: 'Use staging API' + default: false + required: true + type: boolean + architecture: + description: 'Architecture' + required: true + default: 'X64' + type: string + operating_system: + description: 'OS' + required: true + default: 'ubuntu-22.04' + type: string + +env: + CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }} + CONAN_PASSWORD_CURA: ${{ secrets.CONAN_PASS }} + GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} + CURA_CONAN_VERSION: ${{ inputs.cura_conan_version }} + ENTERPRISE: ${{ inputs.enterprise }} + STAGING: ${{ inputs.staging }} + +jobs: + cura-installer-create: + runs-on: ${{ inputs.operating_system }} + + steps: + - name: Checkout + uses: actions/checkout@v3 \ No newline at end of file diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml new file mode 100644 index 0000000000..1a9b8809e3 --- /dev/null +++ b/.github/workflows/macos.yml @@ -0,0 +1,258 @@ +name: Macos Installer +run-name: ${{ inputs.cura_conan_version }} for Macos-${{ inputs.architecture }} by @${{ github.actor }} + +on: + workflow_dispatch: + inputs: + cura_conan_version: + description: 'Cura Conan Version' + default: 'cura/latest@ultimaker/testing' + required: true + type: string + conan_args: + description: 'Conan args: eq.: --require-override' + default: '' + required: false + type: string + enterprise: + description: 'Build Cura as an Enterprise edition' + default: false + required: true + type: boolean + staging: + description: 'Use staging API' + default: false + required: true + type: boolean + architecture: + description: 'Architecture' + required: true + default: 'X64' + type: choice + options: + - X64 + - ARM64 + operating_system: + description: 'OS' + required: true + default: 'macos-11' + type: choice + options: + - self-hosted + - macos-11 + - macos-12 + workflow_call: + inputs: + cura_conan_version: + description: 'Cura Conan Version' + default: 'cura/latest@ultimaker/testing' + required: true + type: string + conan_args: + description: 'Conan args: eq.: --require-override' + default: '' + required: false + type: string + enterprise: + description: 'Build Cura as an Enterprise edition' + default: false + required: true + type: boolean + staging: + description: 'Use staging API' + default: false + required: true + type: boolean + architecture: + description: 'Architecture' + required: true + default: 'X64' + type: string + operating_system: + description: 'OS' + required: true + default: 'macos-11' + type: string + +env: + CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }} + CONAN_PASSWORD_CURA: ${{ secrets.CONAN_PASS }} + CODESIGN_IDENTITY: ${{ secrets.CODESIGN_IDENTITY }} + MAC_NOTARIZE_USER: ${{ secrets.MAC_NOTARIZE_USER }} + MAC_NOTARIZE_PASS: ${{ secrets.MAC_NOTARIZE_PASS }} + MACOS_CERT_P12: ${{ secrets.MACOS_CERT_P12 }} + MACOS_CERT_INSTALLER_P12: ${{ secrets.MACOS_CERT_INSTALLER_P12 }} + MACOS_CERT_USER: ${{ secrets.MACOS_CERT_USER }} + MACOS_CERT_PASSPHRASE: ${{ secrets.MACOS_CERT_PASSPHRASE }} + CURA_CONAN_VERSION: ${{ inputs.cura_conan_version }} + ENTERPRISE: ${{ inputs.enterprise }} + STAGING: ${{ inputs.staging }} + +jobs: + cura-installer-create: + runs-on: ${{ inputs.operating_system }} + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Python and pip + uses: actions/setup-python@v4 + with: + python-version: '3.10.x' + cache: 'pip' + cache-dependency-path: .github/workflows/requirements-conan-package.txt + + - name: Install Python requirements for runner + run: pip install -r .github/workflows/requirements-conan-package.txt + + - name: Install MacOS system requirements + run: brew install cmake autoconf automake ninja create-dmg + + - name: Create the default Conan profile + run: conan profile new default --detect --force + + - name: Remove Macos keychain (Bash) + run: security delete-keychain signing_temp.keychain || true + + - name: Configure Macos keychain Developer Cert(Bash) + id: macos-keychain-developer-cert + uses: apple-actions/import-codesign-certs@v1 + with: + keychain-password: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }} + p12-file-base64: ${{ secrets.MACOS_CERT_P12 }} + p12-password: ${{ secrets.MACOS_CERT_PASSPHRASE }} + + - name: Configure Macos keychain Installer Cert (Bash) + id: macos-keychain-installer-cert + uses: apple-actions/import-codesign-certs@v1 + with: + keychain-password: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }} + create-keychain: false # keychain is created in previous use of action. + p12-file-base64: ${{ secrets.MACOS_CERT_INSTALLER_P12 }} + p12-password: ${{ secrets.MACOS_CERT_PASSPHRASE }} + + - name: Get Conan configuration + run: conan config install https://github.com/Ultimaker/conan-config.git + + - name: Set architecture conan profile + if: ${{ inputs.architecture == 'X64' }} + run: conan profile update settings.arch=x86_64 default + + - name: Set Environment variables for Cura (bash) + run: | + . ./cura_inst/bin/activate_github_actions_env.sh + . ./cura_inst/bin/activate_github_actions_version_env.sh + + - name: Unlock Macos keychain (Bash) + run: security unlock -p $TEMP_KEYCHAIN_PASSWORD signing_temp.keychain + env: + TEMP_KEYCHAIN_PASSWORD: ${{ steps.macos-keychain-developer-cert.outputs.keychain-password }} + + # FIXME: This is a workaround to ensure that we use and pack a shared library for OpenSSL 1.1.1l. We currently compile + # OpenSSL statically for CPython, but our Python Dependenies (such as PyQt6) require a shared library. + # Because Conan won't allow for building the same library with two different options (easily) we need to install it explicitly + # and do a manual copy to the VirtualEnv, such that Pyinstaller can find it. + - name: Install OpenSSL shared + run: conan install openssl/1.1.1l@_/_ --build=missing --update -o openssl:shared=True -g deploy + + - name: Copy OpenSSL shared (Bash) + run: | + cp ./openssl/lib/*.so* ./cura_inst/bin/ || true + cp ./openssl/lib/*.dylib* ./cura_inst/bin/ || true + + - name: Create the Cura dist + run: pyinstaller ./cura_inst/UltiMaker-Cura.spec + + - name: Output the name file name and extension + id: filename + shell: python + run: | + import os + enterprise = "-Enterprise" if "${{ inputs.enterprise }}" == "true" else "" + installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-macos-${{ inputs.arch }}" + output_env = os.environ["GITHUB_OUTPUT"] + content = "" + if os.path.exists(output_env): + with open(output_env, "r") as f: + content = f.read() + with open(output_env, "w") as f: + f.write(content) + f.writelines(f"INSTALLER_FILENAME={installer_filename}\n") + + - name: Summarize the used Conan dependencies + shell: python + run: | + import os + import json + from pathlib import Path + + conan_install_info_path = Path("cura_inst/conan_install_info.json") + conan_info = {"installed": []} + if os.path.exists(conan_install_info_path): + with open(conan_install_info_path, "r") as f: + conan_info = json.load(f) + sorted_deps = sorted([dep["recipe"]["id"].replace('#', r' rev: ') for dep in conan_info["installed"]]) + + summary_env = os.environ["GITHUB_STEP_SUMMARY"] + content = "" + if os.path.exists(summary_env): + with open(summary_env, "r") as f: + content = f.read() + + with open(summary_env, "w") as f: + f.write(content) + f.writelines("# ${{ steps.filename.outputs.INSTALLER_FILENAME }}\n") + f.writelines("## Conan packages:\n") + for dep in sorted_deps: + f.writelines(f"`{dep}`\n") + + - name: Summarize the used Python modules + shell: python + run: | + import os + import pkg_resources + summary_env = os.environ["GITHUB_STEP_SUMMARY"] + content = "" + if os.path.exists(summary_env): + with open(summary_env, "r") as f: + content = f.read() + + with open(summary_env, "w") as f: + f.write(content) + f.writelines("## Python modules:\n") + for package in pkg_resources.working_set: + f.writelines(f"`{package.key}/{package.version}`\n") + + - name: Create the Macos dmg and pkg (Bash) + run: python ../cura_inst/packaging/MacOS/build_macos.py --source_path ../cura_inst --dist_path . --cura_conan_version $CURA_CONAN_VERSION --filename "${{ steps.filename.outputs.INSTALLER_FILENAME }}" --build_pkg --build_dmg --app_name "$CURA_APP_NAME" + working-directory: dist + + - name: Upload the pkg + uses: actions/upload-artifact@v3 + with: + name: ${{ steps.filename.outputs.INSTALLER_FILENAME }}-pkg + path: | + dist/${{ steps.filename.outputs.INSTALLER_FILENAME }}.pkg + retention-days: 5 + + - name: Upload the dmg + uses: actions/upload-artifact@v3 + with: + name: ${{ steps.filename.outputs.INSTALLER_FILENAME }}-dmg + path: | + dist/${{ steps.filename.outputs.INSTALLER_FILENAME }}.dmg + retention-days: 5 + + notify-export: + if: ${{ always() }} + needs: [ cura-installer-create ] + + uses: ultimaker/cura/.github/workflows/notify.yml@main + with: + success: ${{ contains(join(needs.*.result, ','), 'success') }} + success_title: "Create the Cura distributions" + success_body: "Installers for ${{ inputs.cura_conan_version }}" + failure_title: "Failed to create the Cura distributions" + failure_body: "Failed to create at least 1 installer for ${{ inputs.cura_conan_version }}" + secrets: inherit diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml new file mode 100644 index 0000000000..d76a44d917 --- /dev/null +++ b/.github/workflows/windows.yml @@ -0,0 +1,89 @@ +name: Windows Installer +run-name: ${{ inputs.cura_conan_version }} for Windows-${{ inputs.architecture }} by @${{ github.actor }} + +on: + workflow_dispatch: + inputs: + cura_conan_version: + description: 'Cura Conan Version' + default: 'cura/latest@ultimaker/testing' + required: true + type: string + conan_args: + description: 'Conan args: eq.: --require-override' + default: '' + required: false + type: string + enterprise: + description: 'Build Cura as an Enterprise edition' + default: false + required: true + type: boolean + staging: + description: 'Use staging API' + default: false + required: true + type: boolean + architecture: + description: 'Architecture' + required: true + default: 'X64' + type: choice + options: + - X64 + operating_system: + description: 'OS' + required: true + default: 'windows-2022' + type: choice + options: + - windows-2022 + workflow_call: + inputs: + cura_conan_version: + description: 'Cura Conan Version' + default: 'cura/latest@ultimaker/testing' + required: true + type: string + conan_args: + description: 'Conan args: eq.: --require-override' + default: '' + required: false + type: string + enterprise: + description: 'Build Cura as an Enterprise edition' + default: false + required: true + type: boolean + staging: + description: 'Use staging API' + default: false + required: true + type: boolean + architecture: + description: 'Architecture' + required: true + default: 'X64' + type: string + operating_system: + description: 'OS' + required: true + default: 'windows-2022' + type: string + +env: + CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }} + CONAN_PASSWORD_CURA: ${{ secrets.CONAN_PASS }} + WIN_CERT_INSTALLER_CER: ${{ secrets.WIN_CERT_INSTALLER_CER }} + WIN_CERT_INSTALLER_CER_PASS: ${{ secrets.WIN_CERT_INSTALLER_CER_PASS }} + CURA_CONAN_VERSION: ${{ inputs.cura_conan_version }} + ENTERPRISE: ${{ inputs.enterprise }} + STAGING: ${{ inputs.staging }} + +jobs: + cura-installer-create: + runs-on: ${{ inputs.operating_system }} + + steps: + - name: Checkout + uses: actions/checkout@v3 \ No newline at end of file diff --git a/CITATION.cff b/CITATION.cff index 627cfa2515..7a93bbf099 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -18,8 +18,8 @@ url: "https://ultimaker.com/software/ultimaker-cura" repository-code: "https://github.com/Ultimaker/Cura" license: LGPL-3.0 license-url: "https://github.com/Ultimaker/Cura/blob/main/LICENSE" -version: 5.2.1 -date-released: "2022-10-19" +version: 5.4.0 +date-released: "2023-07-04" keywords: - Ultimaker - Cura diff --git a/FUNDING.yml b/FUNDING.yml new file mode 100644 index 0000000000..2d108a74e1 --- /dev/null +++ b/FUNDING.yml @@ -0,0 +1 @@ +github: [ultimaker] diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 1a00d527d3..0cce9ffbc1 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -497,6 +497,36 @@ class CuraApplication(QtApplication): def startSplashWindowPhase(self) -> None: """Runs preparations that needs to be done before the starting process.""" + self.setRequiredPlugins([ + # Misc.: + "ConsoleLogger", # You want to be able to read the log if something goes wrong. + "CuraEngineBackend", # Cura is useless without this one since you can't slice. + "FileLogger", # You want to be able to read the log if something goes wrong. + "XmlMaterialProfile", # Cura crashes without this one. + "Marketplace", + # This contains the interface to enable/disable plug-ins, so if you disable it you can't enable it back. + "PrepareStage", # Cura is useless without this one since you can't load models. + "PreviewStage", # This shows the list of the plugin views that are installed in Cura. + "MonitorStage", # Major part of Cura's functionality. + "LocalFileOutputDevice", # Major part of Cura's functionality. + "LocalContainerProvider", # Cura is useless without any profiles or setting definitions. + + # Views: + "SimpleView", # Dependency of SolidView. + "SolidView", # Displays models. Cura is useless without it. + + # Readers & Writers: + "GCodeWriter", # Cura is useless if it can't write its output. + "STLReader", # Most common model format, so disabling this makes Cura 90% useless. + "3MFWriter", # Required for writing project files. + + # Tools: + "CameraTool", # Needed to see the scene. Cura is useless without it. + "SelectionTool", # Dependency of the rest of the tools. + "TranslateTool", # You'll need this for almost every print. + ]) + # Plugins need to be set here, since in the super the check is done if they are actually loaded. + super().startSplashWindowPhase() if not self.getIsHeadLess(): @@ -505,33 +535,7 @@ class CuraApplication(QtApplication): except FileNotFoundError: Logger.log("w", "Unable to find the window icon.") - self.setRequiredPlugins([ - # Misc.: - "ConsoleLogger", #You want to be able to read the log if something goes wrong. - "CuraEngineBackend", #Cura is useless without this one since you can't slice. - "FileLogger", #You want to be able to read the log if something goes wrong. - "XmlMaterialProfile", #Cura crashes without this one. - "Marketplace", #This contains the interface to enable/disable plug-ins, so if you disable it you can't enable it back. - "PrepareStage", #Cura is useless without this one since you can't load models. - "PreviewStage", #This shows the list of the plugin views that are installed in Cura. - "MonitorStage", #Major part of Cura's functionality. - "LocalFileOutputDevice", #Major part of Cura's functionality. - "LocalContainerProvider", #Cura is useless without any profiles or setting definitions. - # Views: - "SimpleView", #Dependency of SolidView. - "SolidView", #Displays models. Cura is useless without it. - - # Readers & Writers: - "GCodeWriter", #Cura is useless if it can't write its output. - "STLReader", #Most common model format, so disabling this makes Cura 90% useless. - "3MFWriter", #Required for writing project files. - - # Tools: - "CameraTool", #Needed to see the scene. Cura is useless without it. - "SelectionTool", #Dependency of the rest of the tools. - "TranslateTool", #You'll need this for almost every print. - ]) self._i18n_catalog = i18nCatalog("cura") self._update_platform_activity_timer = QTimer() diff --git a/plugins/PostProcessingPlugin/PostProcessingPlugin.py b/plugins/PostProcessingPlugin/PostProcessingPlugin.py index fbb4214021..b3ef761af5 100644 --- a/plugins/PostProcessingPlugin/PostProcessingPlugin.py +++ b/plugins/PostProcessingPlugin/PostProcessingPlugin.py @@ -1,5 +1,5 @@ # Copyright (c) 2018 Jaime van Kessel, Ultimaker B.V. -# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher. +# The PostProcessingPlugin is released under the terms of the LGPLv3 or higher. import configparser # The script lists are stored in metadata as serialised config files. import importlib.util diff --git a/plugins/PostProcessingPlugin/PostProcessingPlugin.qml b/plugins/PostProcessingPlugin/PostProcessingPlugin.qml index a80f304aaa..0f379479ba 100644 --- a/plugins/PostProcessingPlugin/PostProcessingPlugin.qml +++ b/plugins/PostProcessingPlugin/PostProcessingPlugin.qml @@ -1,5 +1,5 @@ // Copyright (c) 2022 Jaime van Kessel, Ultimaker B.V. -// The PostProcessingPlugin is released under the terms of the AGPLv3 or higher. +// The PostProcessingPlugin is released under the terms of the LGPLv3 or higher. import QtQuick 2.2 import QtQuick.Controls 2.15 diff --git a/plugins/PostProcessingPlugin/Script.py b/plugins/PostProcessingPlugin/Script.py index 1cc9b59c9c..be661e0889 100644 --- a/plugins/PostProcessingPlugin/Script.py +++ b/plugins/PostProcessingPlugin/Script.py @@ -1,6 +1,6 @@ # Copyright (c) 2015 Jaime van Kessel # Copyright (c) 2018 Ultimaker B.V. -# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher. +# The PostProcessingPlugin is released under the terms of the LGPLv3 or higher. from typing import Optional, Any, Dict, TYPE_CHECKING, List from UM.Signal import Signal, signalemitter diff --git a/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py b/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py index 91b36389f3..2930623a93 100644 --- a/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py +++ b/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py @@ -1,7 +1,7 @@ # ChangeAtZ script - Change printing parameters at a given height # This script is the successor of the TweakAtZ plugin for legacy Cura. # It contains code from the TweakAtZ plugin V1.0-V4.x and from the ExampleScript by Jaime van Kessel, Ultimaker B.V. -# It runs with the PostProcessingPlugin which is released under the terms of the AGPLv3 or higher. +# It runs with the PostProcessingPlugin which is released under the terms of the LGPLv3 or higher. # This script is licensed under the Creative Commons - Attribution - Share Alike (CC BY-SA) terms # Authors of the ChangeAtZ plugin / script: diff --git a/plugins/PostProcessingPlugin/scripts/ColorMix.py b/plugins/PostProcessingPlugin/scripts/ColorMix.py index dacb40e905..534c0208cf 100644 --- a/plugins/PostProcessingPlugin/scripts/ColorMix.py +++ b/plugins/PostProcessingPlugin/scripts/ColorMix.py @@ -1,6 +1,6 @@ # ColorMix script - 2-1 extruder color mix and blending # This script is specific for the Geeetech A10M dual extruder but should work with other Marlin printers. -# It runs with the PostProcessingPlugin which is released under the terms of the AGPLv3 or higher. +# It runs with the PostProcessingPlugin which is released under the terms of the LGPLv3 or higher. # This script is licensed under the Creative Commons - Attribution - Share Alike (CC BY-SA) terms #Authors of the 2-1 ColorMix plug-in / script: diff --git a/plugins/PostProcessingPlugin/scripts/FilamentChange.py b/plugins/PostProcessingPlugin/scripts/FilamentChange.py index d3c1e60192..93941c0992 100644 --- a/plugins/PostProcessingPlugin/scripts/FilamentChange.py +++ b/plugins/PostProcessingPlugin/scripts/FilamentChange.py @@ -1,5 +1,5 @@ # Copyright (c) 2023 Ultimaker B.V. -# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher. +# The PostProcessingPlugin is released under the terms of the LGPLv3 or higher. # Modification 06.09.2020 # add checkbox, now you can choose and use configuration from the firmware itself. diff --git a/plugins/PostProcessingPlugin/scripts/RetractContinue.py b/plugins/PostProcessingPlugin/scripts/RetractContinue.py index b5ea4d4eda..eaa15e0942 100644 --- a/plugins/PostProcessingPlugin/scripts/RetractContinue.py +++ b/plugins/PostProcessingPlugin/scripts/RetractContinue.py @@ -1,5 +1,5 @@ # Copyright (c) 2023 UltiMaker B.V. -# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher. +# The PostProcessingPlugin is released under the terms of the LGPLv3 or higher. from ..Script import Script diff --git a/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py b/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py index 40a56ace57..7a12c229cc 100644 --- a/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py +++ b/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py @@ -1,5 +1,5 @@ # Copyright (c) 2017 Ghostkeeper -# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher. +# The PostProcessingPlugin is released under the terms of the LGPLv3 or higher. import re #To perform the search and replace. diff --git a/plugins/PostProcessingPlugin/scripts/Stretch.py b/plugins/PostProcessingPlugin/scripts/Stretch.py index 8d35f68822..ab964d160a 100644 --- a/plugins/PostProcessingPlugin/scripts/Stretch.py +++ b/plugins/PostProcessingPlugin/scripts/Stretch.py @@ -1,4 +1,4 @@ -# This PostProcessingPlugin script is released under the terms of the AGPLv3 or higher. +# This PostProcessingPlugin script is released under the terms of the LGPLv3 or higher. """ Copyright (c) 2017 Christophe Baribaud 2017 Python implementation of https://github.com/electrocbd/post_stretch diff --git a/resources/definitions/SV02.def.json b/resources/definitions/SV02.def.json index 95b165075b..728a6c6242 100644 --- a/resources/definitions/SV02.def.json +++ b/resources/definitions/SV02.def.json @@ -59,7 +59,7 @@ "machine_width": { "default_value": 280 }, "material_diameter": { "default_value": 1.75 }, "material_initial_print_temperature": { "value": "material_print_temperature" }, - "prime_tower_min_volume": { "value": "((reveOrValue('layer_height'))/2" }, + "prime_tower_min_volume": { "value": "((resolveOrValue('layer_height'))/2" }, "prime_tower_position_x": { "value": "240" }, "prime_tower_position_y": { "value": "190" }, "prime_tower_size": { "value": "30" }, diff --git a/resources/definitions/elegoo_base.def.json b/resources/definitions/elegoo_base.def.json index b0a0717c59..c54a388806 100644 --- a/resources/definitions/elegoo_base.def.json +++ b/resources/definitions/elegoo_base.def.json @@ -69,7 +69,7 @@ "material_print_temperature_layer_0": { "value": "210 if material_print_temperature < 210 else material_print_temperature" }, "min_infill_area": { "value": "5" }, "minimum_interface_area": { "default_value": 10 }, - "minimum_support_area": { "default_value": 3 }, + "minimum_support_area": { "value": "3 if support_structure == 'normal' else 0" }, "optimize_wall_printing_order": { "default_value": true }, "prime_tower_brim_enable": { "default_value": true }, "prime_tower_min_volume": { "value": "(layer_height) * (prime_tower_size / 2)**2 * 3 * 0.5 " }, diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index fca9e69310..9c83431f54 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1665,16 +1665,14 @@ { "label": "Small Top/Bottom Width", "description": "Small top/bottom regions are filled with walls instead of the default top/bottom pattern. This helps to avoids jerky motions.", - "value": "0", - "default_value": 0, + "value": "skin_line_width * 2", + "default_value": 1, "minimum_value": "0", - "maximum_value_warning": "skin_line_width * 10", "type": "float", - "enabled": false, + "enabled": "(top_layers > 0 or bottom_layers > 0) and top_bottom_pattern != 'concentric'", "limit_to_extruder": "top_bottom_extruder_nr", "settable_per_mesh": true, - "unit": "mm", - "comment": "Disabled for 5.4.x, as we're worried about micro-segments in the infill. Also disabled in the engine, so forcing this > 0 will not do anything at the moment." + "unit": "mm" }, "skin_no_small_gaps_heuristic": { @@ -6805,6 +6803,48 @@ "minimum_value_warning": "500", "maximum_value_warning": "100000", "settable_per_mesh": true + }, + "meshfix_fluid_motion_enabled": + { + "label": "Enable Fluid Motion", + "description": "When enabled tool paths are corrected for printers with smooth motion planners. Small movements that deviate from the general tool path direction are smoothed to improve fluid motions.", + "type": "bool", + "default_value": true + }, + "meshfix_fluid_motion_shift_distance": + { + "label": "Fluid Motion Shift Distance", + "description": "Distance points are shifted to smooth the path", + "enabled": "meshfix_fluid_motion_enabled", + "type": "float", + "unit": "mm", + "default_value": 0.1, + "minimum_value": "0.01", + "maximum_value": "1" + }, + "meshfix_fluid_motion_small_distance": + { + "label": "Fluid Motion Small Distance", + "description": "Distance points are shifted to smooth the path", + "enabled": "meshfix_fluid_motion_enabled", + "unit": "mm", + "type": "float", + "default_value": 0.01, + "minimum_value": "0.01", + "maximum_value": "0.1" + }, + "meshfix_fluid_motion_angle": + { + "label": "Fluid Motion Angle", + "description": "If a toolpath-segment deviates more than this angle from the general motion it is smoothed.", + "enabled": "meshfix_fluid_motion_enabled", + "type": "float", + "unit": "\u00b0", + "default_value": 15, + "maximum_value": "90", + "minimum_value": "0", + "minimum_value_warning": "1", + "maximum_value_warning": "35" } } }, diff --git a/resources/setting_visibility/expert.cfg b/resources/setting_visibility/expert.cfg index 6517728968..9247ad1b9e 100644 --- a/resources/setting_visibility/expert.cfg +++ b/resources/setting_visibility/expert.cfg @@ -365,6 +365,10 @@ multiple_mesh_overlap carve_multiple_volumes alternate_carve_order remove_empty_first_layers +meshfix_fluid_motion_enabled +meshfix_fluid_motion_shift_distance +meshfix_fluid_motion_small_distance +meshfix_fluid_motion_angle [blackmagic] print_sequence