Merge branch 'main' into features/detach_profiles
|
|
@ -17,13 +17,6 @@
|
|||
"customizations": {
|
||||
"vscode": {
|
||||
"settings": {
|
||||
"cmake.configureArgs": [
|
||||
"-DSLIC3R_GTK=3",
|
||||
"-DBBL_RELEASE_TO_PUBLIC=1",
|
||||
"-DBBL_INTERNAL_TESTING=0",
|
||||
"-DSLIC3R_STATIC=1",
|
||||
"-DCMAKE_PREFIX_PATH=${workspaceFolder}/deps/build/destdir/usr/local"
|
||||
]
|
||||
},
|
||||
|
||||
// Add the IDs of extensions you want installed when the container is created.
|
||||
|
|
|
|||
11
.github/actions/apt-install-deps/action.yml
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
name: 'Apt Install Deps'
|
||||
description: 'Install the packages needed for building and deploying'
|
||||
runs:
|
||||
using: 'composite'
|
||||
steps:
|
||||
- name: Install dependencies from build_linux.sh
|
||||
shell: bash
|
||||
run: |
|
||||
mkdir -p ${{ github.workspace }}/deps/build/destdir
|
||||
sudo env "ORCA_UPDATER_SIG_KEY=$ORCA_UPDATER_SIG_KEY" ./build_linux.sh -ur
|
||||
sudo chown $USER -R ./
|
||||
69
.github/workflows/build_all.yml
vendored
|
|
@ -31,7 +31,7 @@ on:
|
|||
- 'scripts/flatpak/**'
|
||||
|
||||
schedule:
|
||||
- cron: '35 7 * * *' # run once a day near midnight US Pacific time
|
||||
- cron: '0 17 * * *' # run once a day at 1 AM Singapore time (UTC+8)
|
||||
|
||||
workflow_dispatch: # allows for manual dispatch
|
||||
inputs:
|
||||
|
|
@ -41,23 +41,33 @@ on:
|
|||
default: false
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event.pull_request.number || github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
|
||||
jobs:
|
||||
build_linux:
|
||||
name: Build Linux
|
||||
strategy:
|
||||
fail-fast: false
|
||||
# Don't run scheduled builds on forks:
|
||||
if: ${{ !cancelled() && (github.event_name != 'schedule' || github.repository == 'SoftFever/OrcaSlicer') }}
|
||||
uses: ./.github/workflows/build_check_cache.yml
|
||||
with:
|
||||
os: ubuntu-24.04
|
||||
build-deps-only: ${{ inputs.build-deps-only || false }}
|
||||
secrets: inherit
|
||||
build_all:
|
||||
name: Build All
|
||||
name: Build Non-Linux
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
# Deprecate 20.04appimage
|
||||
# - os: ubuntu-20.04
|
||||
- os: ubuntu-24.04
|
||||
- os: windows-latest
|
||||
- os: macos-14
|
||||
arch: arm64
|
||||
# Don't run scheduled builds on forks:
|
||||
if: ${{ !cancelled() && (github.event_name != 'schedule' || github.repository == 'SoftFever/OrcaSlicer') }}
|
||||
uses: ./.github/workflows/build_check_cache.yml
|
||||
with:
|
||||
os: ${{ matrix.os }}
|
||||
|
|
@ -65,6 +75,43 @@ jobs:
|
|||
build-deps-only: ${{ inputs.build-deps-only || false }}
|
||||
force-build: ${{ github.event_name == 'schedule' }}
|
||||
secrets: inherit
|
||||
unit_tests:
|
||||
name: Unit Tests
|
||||
runs-on: ubuntu-24.04
|
||||
needs: build_linux
|
||||
if: ${{ !cancelled() && success() }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
sparse-checkout: |
|
||||
.github
|
||||
scripts
|
||||
- name: Apt-Install Dependencies
|
||||
uses: ./.github/actions/apt-install-deps
|
||||
- name: Restore Test Artifact
|
||||
uses: actions/download-artifact@v6
|
||||
with:
|
||||
name: ${{ github.sha }}-tests
|
||||
- uses: lukka/get-cmake@latest
|
||||
with:
|
||||
cmakeVersion: "~3.28.0" # use most recent 3.28.x version
|
||||
- name: Unpackage and Run Unit Tests
|
||||
timeout-minutes: 20
|
||||
run: |
|
||||
tar -xvf build_tests.tar
|
||||
scripts/run_unit_tests.sh
|
||||
- name: Upload Test Logs
|
||||
uses: actions/upload-artifact@v5
|
||||
if: ${{ failure() }}
|
||||
with:
|
||||
name: unit-test-logs
|
||||
path: build/tests/**/*.log
|
||||
- name: Publish Test Results
|
||||
if: always()
|
||||
uses: EnricoMi/publish-unit-test-result-action@v2
|
||||
with:
|
||||
files: "ctest_results.xml"
|
||||
flatpak:
|
||||
name: "Flatpak"
|
||||
container:
|
||||
|
|
@ -76,12 +123,15 @@ jobs:
|
|||
- /opt/ghc:/opt/ghc1
|
||||
- /usr/local/share/boost:/usr/local/share/boost1
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
variant:
|
||||
- arch: x86_64
|
||||
runner: ubuntu-24.04
|
||||
- arch: aarch64
|
||||
runner: ubuntu-24.04-arm
|
||||
# Don't run scheduled builds on forks:
|
||||
if: ${{ !cancelled() && (github.event_name != 'schedule' || github.repository == 'SoftFever/OrcaSlicer') }}
|
||||
runs-on: ${{ matrix.variant.runner }}
|
||||
env:
|
||||
date:
|
||||
|
|
@ -97,12 +147,15 @@ jobs:
|
|||
ver_pure=$(grep 'set(SoftFever_VERSION' version.inc | cut -d '"' -f2)
|
||||
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
|
||||
ver="PR-${{ github.event.number }}"
|
||||
git_commit_hash="${{ github.event.pull_request.head.sha }}"
|
||||
else
|
||||
ver=V$ver_pure
|
||||
git_commit_hash=""
|
||||
fi
|
||||
echo "ver=$ver" >> $GITHUB_ENV
|
||||
echo "ver_pure=$ver_pure" >> $GITHUB_ENV
|
||||
echo "date=$(date +'%Y%m%d')" >> $GITHUB_ENV
|
||||
echo "git_commit_hash=$git_commit_hash" >> $GITHUB_ENV
|
||||
shell: bash
|
||||
- uses: flathub-infra/flatpak-github-actions/flatpak-builder@master
|
||||
with:
|
||||
|
|
@ -112,12 +165,12 @@ jobs:
|
|||
arch: ${{ matrix.variant.arch }}
|
||||
upload-artifact: false
|
||||
- name: Upload artifacts Flatpak
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: OrcaSlicer-Linux-flatpak_${{ env.ver }}_${{ matrix.variant.arch }}.flatpak
|
||||
path: '/__w/OrcaSlicer/OrcaSlicer/OrcaSlicer-Linux-flatpak_${{ env.ver }}_${{ matrix.variant.arch }}.flatpak'
|
||||
- name: Deploy Flatpak to nightly release
|
||||
if: ${{github.ref == 'refs/heads/main'}}
|
||||
if: github.repository == 'SoftFever/OrcaSlicer' && github.ref == 'refs/heads/main'
|
||||
uses: WebFreak001/deploy-nightly@v3.2.0
|
||||
with:
|
||||
upload_url: https://uploads.github.com/repos/SoftFever/OrcaSlicer/releases/137995723/assets{?name,label}
|
||||
|
|
|
|||
3
.github/workflows/build_check_cache.yml
vendored
|
|
@ -33,8 +33,7 @@ jobs:
|
|||
- name: set outputs
|
||||
id: set_outputs
|
||||
env:
|
||||
# todo: this is mad! refactor other build scripts to use same name
|
||||
dep-folder-name: ${{ inputs.os == 'windows-latest' && '/OrcaSlicer_dep' || inputs.os == 'macos-14' && '' || inputs.os != 'macos-14' && '/destdir' || '' }}
|
||||
dep-folder-name: ${{ inputs.os != 'macos-14' && '/OrcaSlicer_dep' || '' }}
|
||||
output-cmd: ${{ inputs.os == 'windows-latest' && '$env:GITHUB_OUTPUT' || '"$GITHUB_OUTPUT"'}}
|
||||
run: |
|
||||
echo cache-key=${{ inputs.os }}-cache-orcaslicer_deps-build-${{ hashFiles('deps/**') }} >> ${{ env.output-cmd }}
|
||||
|
|
|
|||
29
.github/workflows/build_deps.yml
vendored
|
|
@ -26,7 +26,7 @@ on:
|
|||
jobs:
|
||||
build_deps:
|
||||
name: Build Deps
|
||||
if: inputs.build-deps-only || inputs.force-build || inputs.valid-cache != true
|
||||
if: ${{ !cancelled() && (inputs.build-deps-only || inputs.force-build || inputs.valid-cache != true) }}
|
||||
runs-on: ${{ inputs.os }}
|
||||
env:
|
||||
date:
|
||||
|
|
@ -88,28 +88,15 @@ jobs:
|
|||
brew install zstd
|
||||
|
||||
|
||||
- name: Install Ubuntu Build Dependencies
|
||||
if: inputs.os == 'ubuntu-20.04' || inputs.os == 'ubuntu-24.04'
|
||||
working-directory: ${{ github.workspace }}
|
||||
env:
|
||||
apt-cmd: ${{ (inputs.os == 'ubuntu-20.04' && 'apt-fast') || (inputs.os == 'ubuntu-24.04' && 'sudo apt-get') || '' }}
|
||||
webkit-ver: ${{ (inputs.os == 'ubuntu-20.04' && '4.0') || (inputs.os == 'ubuntu-24.04' && '4.1') || '' }}
|
||||
run: |
|
||||
${{ env.apt-cmd }} update
|
||||
${{ env.apt-cmd }} install -y cmake git g++ build-essential libgl1-mesa-dev m4 \
|
||||
libwayland-dev libxkbcommon-dev wayland-protocols extra-cmake-modules pkgconf \
|
||||
libglu1-mesa-dev libcairo2-dev libgtk-3-dev libsoup2.4-dev libwebkit2gtk-${{ env.webkit-ver }}-dev \
|
||||
libgstreamer1.0-dev libgstreamer-plugins-good1.0-dev libgstreamer-plugins-base1.0-dev \
|
||||
gstreamer1.0-plugins-bad wget sudo autoconf curl libunwind-dev texinfo
|
||||
- name: Apt-Install Dependencies
|
||||
if: inputs.os == 'ubuntu-24.04'
|
||||
uses: ./.github/actions/apt-install-deps
|
||||
|
||||
- name: Build on Ubuntu
|
||||
if: inputs.os == 'ubuntu-20.04' || inputs.os == 'ubuntu-24.04'
|
||||
working-directory: ${{ github.workspace }}
|
||||
run: |
|
||||
mkdir -p ${{ github.workspace }}/deps/build
|
||||
mkdir -p ${{ github.workspace }}/deps/build/destdir
|
||||
sudo ./build_linux.sh -ur
|
||||
sudo chown $USER -R ./
|
||||
./build_linux.sh -dr
|
||||
cd deps/build
|
||||
tar -czvf OrcaSlicer_dep_ubuntu_$(date +"%Y%m%d").tar.gz destdir
|
||||
|
|
@ -118,14 +105,14 @@ jobs:
|
|||
# Upload Artifacts
|
||||
# - name: Upload Mac ${{ inputs.arch }} artifacts
|
||||
# if: inputs.os == 'macos-14'
|
||||
# uses: actions/upload-artifact@v4
|
||||
# uses: actions/upload-artifact@v5
|
||||
# with:
|
||||
# name: OrcaSlicer_dep_mac_${{ env.date }}
|
||||
# path: ${{ github.workspace }}/deps/build/OrcaSlicer_dep*.tar.gz
|
||||
|
||||
- name: Upload Windows artifacts
|
||||
if: inputs.os == 'windows-latest'
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: OrcaSlicer_dep_win64_${{ env.date }}
|
||||
path: ${{ github.workspace }}/deps/build/OrcaSlicer_dep*.zip
|
||||
|
|
@ -134,7 +121,7 @@ jobs:
|
|||
if: ${{ ! env.ACT && inputs.os == 'ubuntu-20.04' || inputs.os == 'ubuntu-24.04' }}
|
||||
env:
|
||||
ubuntu-ver: ${{ (inputs.os == 'ubuntu-20.04' && '2004') || (inputs.os == 'ubuntu-24.04' && '2404') || '' }}
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: OrcaSlicer_dep_ubuntu_${{ env.ubuntu-ver }}_${{ env.date }}
|
||||
path: ${{ github.workspace }}/deps/build/OrcaSlicer_dep_ubuntu_*.tar.gz
|
||||
|
|
@ -142,7 +129,7 @@ jobs:
|
|||
build_orca:
|
||||
name: Build OrcaSlicer
|
||||
needs: [build_deps]
|
||||
if: ${{ !cancelled() && !inputs.build-deps-only && inputs.force-build || (inputs.valid-cache == true && needs.build_deps.result == 'skipped') || (inputs.valid-cache != true && success()) }}
|
||||
if: ${{ !cancelled() && !inputs.build-deps-only && (inputs.force-build || (inputs.valid-cache == true && needs.build_deps.result == 'skipped') || (inputs.valid-cache != true && success())) }}
|
||||
uses: ./.github/workflows/build_orca.yml
|
||||
with:
|
||||
cache-key: ${{ inputs.cache-key }}
|
||||
|
|
|
|||
110
.github/workflows/build_orca.yml
vendored
|
|
@ -22,6 +22,7 @@ jobs:
|
|||
date:
|
||||
ver:
|
||||
ver_pure:
|
||||
ORCA_UPDATER_SIG_KEY: ${{ secrets.ORCA_UPDATER_SIG_KEY }}
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
|
|
@ -46,12 +47,15 @@ jobs:
|
|||
ver_pure=$(grep 'set(SoftFever_VERSION' version.inc | cut -d '"' -f2)
|
||||
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
|
||||
ver="PR-${{ github.event.number }}"
|
||||
git_commit_hash="${{ github.event.pull_request.head.sha }}"
|
||||
else
|
||||
ver=V$ver_pure
|
||||
git_commit_hash=""
|
||||
fi
|
||||
echo "ver=$ver" >> $GITHUB_ENV
|
||||
echo "ver_pure=$ver_pure" >> $GITHUB_ENV
|
||||
echo "date=$(date +'%Y%m%d')" >> $GITHUB_ENV
|
||||
echo "git_commit_hash=$git_commit_hash" >> $GITHUB_ENV
|
||||
shell: bash
|
||||
|
||||
- name: Get the version and date on Windows
|
||||
|
|
@ -64,16 +68,19 @@ jobs:
|
|||
|
||||
if ($eventName -eq 'pull_request') {
|
||||
$ver = "PR" + $prNumber
|
||||
$git_commit_hash = "${{ github.event.pull_request.head.sha }}"
|
||||
} else {
|
||||
$versionContent = Get-Content version.inc -Raw
|
||||
if ($versionContent -match 'set\(SoftFever_VERSION "(.*?)"\)') {
|
||||
$ver = $matches[1]
|
||||
}
|
||||
$ver = "V$ver"
|
||||
$git_commit_hash = ""
|
||||
}
|
||||
|
||||
echo "ver=$ver" | Out-File -Append -FilePath $env:GITHUB_ENV -Encoding utf8
|
||||
echo "date=$date" | Out-File -Append -FilePath $env:GITHUB_ENV -Encoding utf8
|
||||
echo "git_commit_hash=$git_commit_hash" | Out-File -Append -FilePath $env:GITHUB_ENV -Encoding utf8
|
||||
echo "date: ${{ env.date }} version: ${{ env.ver }}"
|
||||
shell: pwsh
|
||||
|
||||
|
|
@ -101,7 +108,7 @@ jobs:
|
|||
|
||||
# Thanks to RaySajuuk, it's working now
|
||||
- name: Sign app and notary
|
||||
if: (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release/')) && inputs.os == 'macos-14'
|
||||
if: github.repository == 'SoftFever/OrcaSlicer' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release/')) && inputs.os == 'macos-14'
|
||||
working-directory: ${{ github.workspace }}
|
||||
env:
|
||||
BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
|
||||
|
|
@ -124,16 +131,20 @@ jobs:
|
|||
codesign --deep --force --verbose --options runtime --timestamp --entitlements ${{ github.workspace }}/scripts/disable_validation.entitlements --sign "$CERTIFICATE_ID" ${{ github.workspace }}/build/universal/OrcaSlicer/OrcaSlicer_profile_validator.app
|
||||
fi
|
||||
|
||||
# Create main OrcaSlicer DMG
|
||||
ln -s /Applications ${{ github.workspace }}/build/universal/OrcaSlicer/Applications
|
||||
hdiutil create -volname "OrcaSlicer" -srcfolder ${{ github.workspace }}/build/universal/OrcaSlicer -ov -format UDZO OrcaSlicer_Mac_universal_${{ env.ver }}.dmg
|
||||
# Create main OrcaSlicer DMG without the profile validator helper
|
||||
mkdir -p ${{ github.workspace }}/build/universal/OrcaSlicer_dmg
|
||||
rm -rf ${{ github.workspace }}/build/universal/OrcaSlicer_dmg/*
|
||||
cp -R ${{ github.workspace }}/build/universal/OrcaSlicer/OrcaSlicer.app ${{ github.workspace }}/build/universal/OrcaSlicer_dmg/
|
||||
ln -sfn /Applications ${{ github.workspace }}/build/universal/OrcaSlicer_dmg/Applications
|
||||
hdiutil create -volname "OrcaSlicer" -srcfolder ${{ github.workspace }}/build/universal/OrcaSlicer_dmg -ov -format UDZO OrcaSlicer_Mac_universal_${{ env.ver }}.dmg
|
||||
codesign --deep --force --verbose --options runtime --timestamp --entitlements ${{ github.workspace }}/scripts/disable_validation.entitlements --sign "$CERTIFICATE_ID" OrcaSlicer_Mac_universal_${{ env.ver }}.dmg
|
||||
|
||||
# Create separate OrcaSlicer_profile_validator DMG if the app exists
|
||||
if [ -f "${{ github.workspace }}/build/universal/OrcaSlicer/OrcaSlicer_profile_validator.app/Contents/MacOS/OrcaSlicer_profile_validator" ]; then
|
||||
mkdir -p ${{ github.workspace }}/build/universal/OrcaSlicer_profile_validator_dmg
|
||||
rm -rf ${{ github.workspace }}/build/universal/OrcaSlicer_profile_validator_dmg/*
|
||||
cp -R ${{ github.workspace }}/build/universal/OrcaSlicer/OrcaSlicer_profile_validator.app ${{ github.workspace }}/build/universal/OrcaSlicer_profile_validator_dmg/
|
||||
ln -s /Applications ${{ github.workspace }}/build/universal/OrcaSlicer_profile_validator_dmg/Applications
|
||||
ln -sfn /Applications ${{ github.workspace }}/build/universal/OrcaSlicer_profile_validator_dmg/Applications
|
||||
hdiutil create -volname "OrcaSlicer Profile Validator" -srcfolder ${{ github.workspace }}/build/universal/OrcaSlicer_profile_validator_dmg -ov -format UDZO OrcaSlicer_profile_validator_Mac_universal_${{ env.ver }}.dmg
|
||||
codesign --deep --force --verbose --options runtime --timestamp --entitlements ${{ github.workspace }}/scripts/disable_validation.entitlements --sign "$CERTIFICATE_ID" OrcaSlicer_profile_validator_Mac_universal_${{ env.ver }}.dmg
|
||||
fi
|
||||
|
|
@ -153,34 +164,38 @@ jobs:
|
|||
if: github.ref != 'refs/heads/main' && inputs.os == 'macos-14'
|
||||
working-directory: ${{ github.workspace }}
|
||||
run: |
|
||||
ln -s /Applications ${{ github.workspace }}/build/universal/OrcaSlicer/Applications
|
||||
hdiutil create -volname "OrcaSlicer" -srcfolder ${{ github.workspace }}/build/universal/OrcaSlicer -ov -format UDZO OrcaSlicer_Mac_universal_${{ env.ver }}.dmg
|
||||
mkdir -p ${{ github.workspace }}/build/universal/OrcaSlicer_dmg
|
||||
rm -rf ${{ github.workspace }}/build/universal/OrcaSlicer_dmg/*
|
||||
cp -R ${{ github.workspace }}/build/universal/OrcaSlicer/OrcaSlicer.app ${{ github.workspace }}/build/universal/OrcaSlicer_dmg/
|
||||
ln -sfn /Applications ${{ github.workspace }}/build/universal/OrcaSlicer_dmg/Applications
|
||||
hdiutil create -volname "OrcaSlicer" -srcfolder ${{ github.workspace }}/build/universal/OrcaSlicer_dmg -ov -format UDZO OrcaSlicer_Mac_universal_${{ env.ver }}.dmg
|
||||
|
||||
# Create separate OrcaSlicer_profile_validator DMG if the app exists
|
||||
if [ -f "${{ github.workspace }}/build/universal/OrcaSlicer/OrcaSlicer_profile_validator.app/Contents/MacOS/OrcaSlicer_profile_validator" ]; then
|
||||
mkdir -p ${{ github.workspace }}/build/universal/OrcaSlicer_profile_validator_dmg
|
||||
rm -rf ${{ github.workspace }}/build/universal/OrcaSlicer_profile_validator_dmg/*
|
||||
cp -R ${{ github.workspace }}/build/universal/OrcaSlicer/OrcaSlicer_profile_validator.app ${{ github.workspace }}/build/universal/OrcaSlicer_profile_validator_dmg/
|
||||
ln -s /Applications ${{ github.workspace }}/build/universal/OrcaSlicer_profile_validator_dmg/Applications
|
||||
ln -sfn /Applications ${{ github.workspace }}/build/universal/OrcaSlicer_profile_validator_dmg/Applications
|
||||
hdiutil create -volname "OrcaSlicer Profile Validator" -srcfolder ${{ github.workspace }}/build/universal/OrcaSlicer_profile_validator_dmg -ov -format UDZO OrcaSlicer_profile_validator_Mac_universal_${{ env.ver }}.dmg
|
||||
fi
|
||||
|
||||
- name: Upload artifacts mac
|
||||
if: inputs.os == 'macos-14'
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: OrcaSlicer_Mac_universal_${{ env.ver }}
|
||||
path: ${{ github.workspace }}/OrcaSlicer_Mac_universal_${{ env.ver }}.dmg
|
||||
|
||||
- name: Upload OrcaSlicer_profile_validator DMG mac
|
||||
if: inputs.os == 'macos-14'
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: OrcaSlicer_profile_validator_Mac_universal_DMG_${{ env.ver }}
|
||||
path: ${{ github.workspace }}/OrcaSlicer_profile_validator_Mac_universal_${{ env.ver }}.dmg
|
||||
if-no-files-found: ignore
|
||||
|
||||
- name: Deploy Mac release
|
||||
if: github.ref == 'refs/heads/main' && inputs.os == 'macos-14'
|
||||
if: github.repository == 'SoftFever/OrcaSlicer' && github.ref == 'refs/heads/main' && inputs.os == 'macos-14'
|
||||
uses: WebFreak001/deploy-nightly@v3.2.0
|
||||
with:
|
||||
upload_url: https://uploads.github.com/repos/SoftFever/OrcaSlicer/releases/137995723/assets{?name,label}
|
||||
|
|
@ -191,7 +206,7 @@ jobs:
|
|||
max_releases: 1 # optional, if there are more releases than this matching the asset_name, the oldest ones are going to be deleted
|
||||
|
||||
- name: Deploy Mac OrcaSlicer_profile_validator DMG release
|
||||
if: github.ref == 'refs/heads/main' && inputs.os == 'macos-14'
|
||||
if: github.repository == 'SoftFever/OrcaSlicer' && github.ref == 'refs/heads/main' && inputs.os == 'macos-14'
|
||||
uses: WebFreak001/deploy-nightly@v3.2.0
|
||||
with:
|
||||
upload_url: https://uploads.github.com/repos/SoftFever/OrcaSlicer/releases/137995723/assets{?name,label}
|
||||
|
|
@ -240,34 +255,34 @@ jobs:
|
|||
|
||||
- name: Upload artifacts Win zip
|
||||
if: inputs.os == 'windows-latest'
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: OrcaSlicer_Windows_${{ env.ver }}_portable
|
||||
path: ${{ github.workspace }}/build/OrcaSlicer
|
||||
|
||||
- name: Upload artifacts Win installer
|
||||
if: inputs.os == 'windows-latest'
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: OrcaSlicer_Windows_${{ env.ver }}
|
||||
path: ${{ github.workspace }}/build/OrcaSlicer*.exe
|
||||
|
||||
- name: Upload artifacts Win PDB
|
||||
if: inputs.os == 'windows-latest'
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: PDB
|
||||
path: ${{ github.workspace }}/build/src/Release/Debug_PDB_${{ env.ver }}_for_developers_only.7z
|
||||
|
||||
- name: Upload OrcaSlicer_profile_validator Win
|
||||
if: inputs.os == 'windows-latest'
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: OrcaSlicer_profile_validator_Windows_${{ env.ver }}
|
||||
path: ${{ github.workspace }}/build/src/Release/OrcaSlicer_profile_validator.exe
|
||||
|
||||
- name: Deploy Windows release portable
|
||||
if: github.ref == 'refs/heads/main' && inputs.os == 'windows-latest'
|
||||
if: github.repository == 'SoftFever/OrcaSlicer' && github.ref == 'refs/heads/main' && inputs.os == 'windows-latest'
|
||||
uses: WebFreak001/deploy-nightly@v3.2.0
|
||||
with:
|
||||
upload_url: https://uploads.github.com/repos/SoftFever/OrcaSlicer/releases/137995723/assets{?name,label}
|
||||
|
|
@ -278,7 +293,7 @@ jobs:
|
|||
max_releases: 1
|
||||
|
||||
- name: Deploy Windows release installer
|
||||
if: github.ref == 'refs/heads/main' && inputs.os == 'windows-latest'
|
||||
if: github.repository == 'SoftFever/OrcaSlicer' && github.ref == 'refs/heads/main' && inputs.os == 'windows-latest'
|
||||
uses: WebFreak001/deploy-nightly@v3.2.0
|
||||
with:
|
||||
upload_url: https://uploads.github.com/repos/SoftFever/OrcaSlicer/releases/137995723/assets{?name,label}
|
||||
|
|
@ -289,7 +304,7 @@ jobs:
|
|||
max_releases: 1
|
||||
|
||||
- name: Deploy Windows OrcaSlicer_profile_validator release
|
||||
if: github.ref == 'refs/heads/main' && inputs.os == 'windows-latest'
|
||||
if: github.repository == 'SoftFever/OrcaSlicer' && github.ref == 'refs/heads/main' && inputs.os == 'windows-latest'
|
||||
uses: WebFreak001/deploy-nightly@v3.2.0
|
||||
with:
|
||||
upload_url: https://uploads.github.com/repos/SoftFever/OrcaSlicer/releases/137995723/assets{?name,label}
|
||||
|
|
@ -300,39 +315,34 @@ jobs:
|
|||
max_releases: 1
|
||||
|
||||
# Ubuntu
|
||||
- name: Install dependencies
|
||||
if: inputs.os == 'ubuntu-20.04' || inputs.os == 'ubuntu-24.04'
|
||||
env:
|
||||
apt-cmd: ${{ (inputs.os == 'ubuntu-20.04' && 'apt-fast') || (inputs.os == 'ubuntu-24.04' && 'sudo apt-get') || '' }}
|
||||
webkit-ver: ${{ (inputs.os == 'ubuntu-20.04' && '4.0') || (inputs.os == 'ubuntu-24.04' && '4.1') || '' }}
|
||||
libfuse2-pkg: ${{ (inputs.os == 'ubuntu-20.04' && 'libfuse2') || (inputs.os == 'ubuntu-24.04' && 'libfuse2t64') || '' }}
|
||||
run: |
|
||||
${{ env.apt-cmd }} update
|
||||
${{ env.apt-cmd }} install -y autoconf build-essential cmake curl eglexternalplatform-dev \
|
||||
extra-cmake-modules file git libcairo2-dev libcurl4-openssl-dev libdbus-1-dev libglew-dev libglu1-mesa-dev \
|
||||
libglu1-mesa-dev libgstreamer1.0-dev libgstreamerd-3-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-dev \
|
||||
libgtk-3-dev libgtk-3-dev libmspack-dev libsecret-1-dev libsoup2.4-dev libssl-dev libudev-dev libwayland-dev \
|
||||
libwebkit2gtk-${{ env.webkit-ver }}-dev libxkbcommon-dev locales locales-all m4 pkgconf sudo wayland-protocols wget ${{ env.libfuse2-pkg }}
|
||||
- name: Apt-Install Dependencies
|
||||
if: inputs.os == 'ubuntu-24.04'
|
||||
uses: ./.github/actions/apt-install-deps
|
||||
|
||||
- name: Install dependencies from build_linux.sh
|
||||
if: inputs.os == 'ubuntu-20.04' || inputs.os == 'ubuntu-24.04'
|
||||
shell: bash
|
||||
run: sudo ./build_linux.sh -ur
|
||||
|
||||
- name: Fix permissions
|
||||
if: inputs.os == 'ubuntu-20.04' || inputs.os == 'ubuntu-24.04'
|
||||
shell: bash
|
||||
run: sudo chown $USER -R ./
|
||||
|
||||
- name: Build slicer
|
||||
# Tests must built at the same time as the slicer;
|
||||
# if you untangle them feel free to separate them here too
|
||||
- name: Build slicer and tests
|
||||
if: inputs.os == 'ubuntu-20.04' || inputs.os == 'ubuntu-24.04'
|
||||
shell: bash
|
||||
env:
|
||||
ubuntu-ver-str: ${{ (inputs.os == 'ubuntu-24.04' && '_Ubuntu2404') || '' }}
|
||||
run: |
|
||||
./build_linux.sh -isr
|
||||
./build_linux.sh -istr
|
||||
mv -n ./build/OrcaSlicer_Linux_V${{ env.ver_pure }}.AppImage ./build/OrcaSlicer_Linux_AppImage${{ env.ubuntu-ver-str }}_${{ env.ver }}.AppImage
|
||||
chmod +x ./build/OrcaSlicer_Linux_AppImage${{ env.ubuntu-ver-str }}_${{ env.ver }}.AppImage
|
||||
tar -cvpf build_tests.tar build/tests
|
||||
|
||||
# Use tar because upload-artifacts won't always preserve directory structure
|
||||
# and doesn't preserve file permissions
|
||||
- name: Upload Test Artifact
|
||||
if: inputs.os == 'ubuntu-24.04'
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: ${{ github.sha }}-tests
|
||||
overwrite: true
|
||||
path: build_tests.tar
|
||||
retention-days: 5
|
||||
if-no-files-found: error
|
||||
|
||||
- name: Build orca_custom_preset_tests
|
||||
if: github.ref == 'refs/heads/main' && inputs.os == 'ubuntu-24.04'
|
||||
|
|
@ -348,7 +358,7 @@ jobs:
|
|||
env:
|
||||
ubuntu-ver: ${{ (inputs.os == 'ubuntu-20.04' && '2004') || (inputs.os == 'ubuntu-24.04' && '2404') || '' }}
|
||||
ubuntu-ver-str: ${{ (inputs.os == 'ubuntu-24.04' && '_Ubuntu2404') || '' }}
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: OrcaSlicer_Linux_ubuntu_${{ env.ubuntu-ver }}_${{ env.ver }}
|
||||
path: './build/OrcaSlicer_Linux_AppImage${{ env.ubuntu-ver-str }}_${{ env.ver }}.AppImage'
|
||||
|
|
@ -357,13 +367,13 @@ jobs:
|
|||
if: ${{ ! env.ACT && inputs.os == 'ubuntu-20.04' || inputs.os == 'ubuntu-24.04' }}
|
||||
env:
|
||||
ubuntu-ver: ${{ (inputs.os == 'ubuntu-20.04' && '2004') || (inputs.os == 'ubuntu-24.04' && '2404') || '' }}
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: OrcaSlicer_profile_validator_Linux_ubuntu_${{ env.ubuntu-ver }}_${{ env.ver }}
|
||||
path: './build/src/Release/OrcaSlicer_profile_validator'
|
||||
|
||||
- name: Deploy Ubuntu release
|
||||
if: ${{ ! env.ACT && github.ref == 'refs/heads/main' && (inputs.os == 'ubuntu-20.04' || inputs.os == 'ubuntu-24.04') }}
|
||||
if: ${{ github.repository == 'SoftFever/OrcaSlicer' && ! env.ACT && github.ref == 'refs/heads/main' && (inputs.os == 'ubuntu-20.04' || inputs.os == 'ubuntu-24.04') }}
|
||||
env:
|
||||
ubuntu-ver-str: ${{ (inputs.os == 'ubuntu-24.04' && '_Ubuntu2404') || '' }}
|
||||
uses: WebFreak001/deploy-nightly@v3.2.0
|
||||
|
|
@ -375,7 +385,7 @@ jobs:
|
|||
asset_content_type: application/octet-stream
|
||||
max_releases: 1 # optional, if there are more releases than this matching the asset_name, the oldest ones are going to be deleted
|
||||
- name: Deploy Ubuntu release
|
||||
if: ${{ ! env.ACT && github.ref == 'refs/heads/main' && inputs.os == 'ubuntu-24.04' }}
|
||||
if: ${{ github.repository == 'SoftFever/OrcaSlicer' && ! env.ACT && github.ref == 'refs/heads/main' && inputs.os == 'ubuntu-24.04' }}
|
||||
uses: rickstaa/action-create-tag@v1
|
||||
with:
|
||||
tag: "nightly-builds"
|
||||
|
|
@ -384,7 +394,7 @@ jobs:
|
|||
message: "nightly-builds"
|
||||
|
||||
- name: Deploy Ubuntu OrcaSlicer_profile_validator release
|
||||
if: ${{ ! env.ACT && github.ref == 'refs/heads/main' && (inputs.os == 'ubuntu-20.04' || inputs.os == 'ubuntu-24.04') }}
|
||||
if: ${{ github.repository == 'SoftFever/OrcaSlicer' && ! env.ACT && github.ref == 'refs/heads/main' && (inputs.os == 'ubuntu-20.04' || inputs.os == 'ubuntu-24.04') }}
|
||||
env:
|
||||
ubuntu-ver-str: ${{ (inputs.os == 'ubuntu-24.04' && '_Ubuntu2404') || '' }}
|
||||
uses: WebFreak001/deploy-nightly@v3.2.0
|
||||
|
|
@ -397,7 +407,7 @@ jobs:
|
|||
max_releases: 1
|
||||
|
||||
- name: Deploy orca_custom_preset_tests
|
||||
if: ${{ ! env.ACT && github.ref == 'refs/heads/main' && inputs.os == 'ubuntu-24.04' }}
|
||||
if: ${{ github.repository == 'SoftFever/OrcaSlicer' && ! env.ACT && github.ref == 'refs/heads/main' && inputs.os == 'ubuntu-24.04' }}
|
||||
uses: WebFreak001/deploy-nightly@v3.2.0
|
||||
with:
|
||||
upload_url: https://uploads.github.com/repos/SoftFever/OrcaSlicer/releases/137995723/assets{?name,label}
|
||||
|
|
|
|||
71
.github/workflows/claude-code-review.yml
vendored
|
|
@ -1,71 +0,0 @@
|
|||
name: Claude Code Review
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
claude-review:
|
||||
# Optional: Filter by PR author
|
||||
# if: |
|
||||
# github.event.pull_request.user.login == 'external-contributor' ||
|
||||
# github.event.pull_request.user.login == 'new-developer' ||
|
||||
# github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR'
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: read
|
||||
issues: read
|
||||
id-token: write
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 1
|
||||
|
||||
- name: Run Claude Code Review
|
||||
id: claude-review
|
||||
uses: anthropics/claude-code-action@beta
|
||||
with:
|
||||
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
||||
|
||||
# Optional: Specify model (defaults to Claude Sonnet 4, uncomment for Claude Opus 4.1)
|
||||
# model: "claude-opus-4-1-20250805"
|
||||
|
||||
# Direct prompt for automated review (no @claude mention needed)
|
||||
direct_prompt: |
|
||||
Please review this pull request and provide feedback on:
|
||||
- Code quality and best practices
|
||||
- Potential bugs or issues
|
||||
- Performance considerations
|
||||
- Security concerns
|
||||
- Test coverage
|
||||
|
||||
Be constructive and helpful in your feedback.
|
||||
|
||||
# Optional: Use sticky comments to make Claude reuse the same comment on subsequent pushes to the same PR
|
||||
# use_sticky_comment: true
|
||||
|
||||
# Optional: Customize review based on file types
|
||||
# direct_prompt: |
|
||||
# Review this PR focusing on:
|
||||
# - For TypeScript files: Type safety and proper interface usage
|
||||
# - For API endpoints: Security, input validation, and error handling
|
||||
# - For React components: Performance, accessibility, and best practices
|
||||
# - For tests: Coverage, edge cases, and test quality
|
||||
|
||||
# Optional: Different prompts for different authors
|
||||
# direct_prompt: |
|
||||
# ${{ github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR' &&
|
||||
# 'Welcome! Please review this PR from a first-time contributor. Be encouraging and provide detailed explanations for any suggestions.' ||
|
||||
# 'Please provide a thorough code review focusing on our coding standards and best practices.' }}
|
||||
|
||||
# Optional: Add specific tools for running tests or linting
|
||||
# allowed_tools: "Bash(npm run test),Bash(npm run lint),Bash(npm run typecheck)"
|
||||
|
||||
# Optional: Skip review for certain conditions
|
||||
# if: |
|
||||
# !contains(github.event.pull_request.title, '[skip-review]') &&
|
||||
# !contains(github.event.pull_request.title, '[WIP]')
|
||||
|
||||
64
.github/workflows/claude.yml
vendored
|
|
@ -1,64 +0,0 @@
|
|||
name: Claude Code
|
||||
|
||||
on:
|
||||
issue_comment:
|
||||
types: [created]
|
||||
pull_request_review_comment:
|
||||
types: [created]
|
||||
issues:
|
||||
types: [opened, assigned]
|
||||
pull_request_review:
|
||||
types: [submitted]
|
||||
|
||||
jobs:
|
||||
claude:
|
||||
if: |
|
||||
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
|
||||
(github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
|
||||
(github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
|
||||
(github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: read
|
||||
issues: read
|
||||
id-token: write
|
||||
actions: read # Required for Claude to read CI results on PRs
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 1
|
||||
|
||||
- name: Run Claude Code
|
||||
id: claude
|
||||
uses: anthropics/claude-code-action@beta
|
||||
with:
|
||||
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
||||
|
||||
# This is an optional setting that allows Claude to read CI results on PRs
|
||||
additional_permissions: |
|
||||
actions: read
|
||||
|
||||
# Optional: Specify model (defaults to Claude Sonnet 4, uncomment for Claude Opus 4.1)
|
||||
# model: "claude-opus-4-1-20250805"
|
||||
|
||||
# Optional: Customize the trigger phrase (default: @claude)
|
||||
# trigger_phrase: "/claude"
|
||||
|
||||
# Optional: Trigger when specific user is assigned to an issue
|
||||
# assignee_trigger: "claude-bot"
|
||||
|
||||
# Optional: Allow Claude to run specific commands
|
||||
# allowed_tools: "Bash(npm install),Bash(npm run build),Bash(npm run test:*),Bash(npm run lint:*)"
|
||||
|
||||
# Optional: Add custom instructions for Claude to customize its behavior for your project
|
||||
# custom_instructions: |
|
||||
# Follow our coding standards
|
||||
# Ensure all new code has tests
|
||||
# Use TypeScript for new files
|
||||
|
||||
# Optional: Custom environment variables for Claude
|
||||
# claude_env: |
|
||||
# NODE_ENV: test
|
||||
|
||||
2
.github/workflows/orca_bot.yml
vendored
|
|
@ -17,7 +17,7 @@ jobs:
|
|||
pull-requests: write
|
||||
contents: write # only for delete-branch option
|
||||
steps:
|
||||
- uses: actions/stale@v9
|
||||
- uses: actions/stale@v10
|
||||
with:
|
||||
# PAT for GitHub API authentication
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
|
|
|||
2
.github/workflows/update-translation.yml
vendored
|
|
@ -13,7 +13,7 @@ jobs:
|
|||
uses: actions/checkout@v5
|
||||
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v5
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: '3.12'
|
||||
|
||||
|
|
|
|||
169
.github/workflows/validate-documentation.yml
vendored
|
|
@ -23,7 +23,7 @@ jobs:
|
|||
|
||||
- name: Get changed files
|
||||
id: changed-files
|
||||
uses: tj-actions/changed-files@v46
|
||||
uses: tj-actions/changed-files@v47
|
||||
with:
|
||||
files: |
|
||||
src/slic3r/GUI/Tab.cpp
|
||||
|
|
@ -58,6 +58,45 @@ jobs:
|
|||
return $null
|
||||
}
|
||||
|
||||
function Get-ImagesFromLine($line) {
|
||||
$images = @()
|
||||
$lineForParsing = [regex]::Replace($line, '`[^`]*`', '')
|
||||
|
||||
# Process markdown and HTML images
|
||||
$imagePatterns = @(
|
||||
@{ Pattern = "!\[([^\]]*)\]\(([^)]+)\)"; Type = "Markdown"; AltGroup = 1; UrlGroup = 2 }
|
||||
@{ Pattern = '<img\s+[^>]*>'; Type = "HTML"; AltGroup = -1; UrlGroup = -1 }
|
||||
)
|
||||
|
||||
foreach ($pattern in $imagePatterns) {
|
||||
foreach ($match in [regex]::Matches($lineForParsing, $pattern.Pattern)) {
|
||||
$altText = ""
|
||||
$url = ""
|
||||
|
||||
if ($pattern.Type -eq "Markdown") {
|
||||
$altText = $match.Groups[$pattern.AltGroup].Value
|
||||
$url = $match.Groups[$pattern.UrlGroup].Value
|
||||
} else {
|
||||
# Extract from HTML
|
||||
$imgTag = $match.Value
|
||||
if ($imgTag -match 'alt\s*=\s*[`"'']([^`"'']*)[`"'']') { $altText = $matches[1] }
|
||||
if ($imgTag -match 'src\s*=\s*[`"'']([^`"'']*)[`"'']') { $url = $matches[1] }
|
||||
}
|
||||
|
||||
$images += @{
|
||||
Match = $match.Value
|
||||
Type = $pattern.Type
|
||||
AltText = $altText
|
||||
Url = $url
|
||||
StartIndex = $match.Index
|
||||
Length = $match.Length
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $images
|
||||
}
|
||||
|
||||
# Initialize
|
||||
$tabFile = Join-Path $PWD "src/slic3r/GUI/Tab.cpp"
|
||||
$docDir = Join-Path $PWD 'doc'
|
||||
|
|
@ -99,8 +138,35 @@ jobs:
|
|||
if ($inCodeFence) { continue }
|
||||
|
||||
$lineForParsing = [regex]::Replace($line, '`[^`]*`', '')
|
||||
foreach ($linkMatch in [regex]::Matches($lineForParsing, '(?<!!)[^\]]*\]\(([^)]+)\)')) {
|
||||
$destRaw = $linkMatch.Groups[1].Value.Trim()
|
||||
|
||||
# Get all images from this line to skip them in link processing
|
||||
$imagesInLine = Get-ImagesFromLine $line
|
||||
$imageRanges = @()
|
||||
foreach ($img in $imagesInLine) {
|
||||
# Exclude the entire image syntax from link processing
|
||||
$imageRanges += @{ Start = $img.StartIndex; End = $img.StartIndex + $img.Length }
|
||||
}
|
||||
|
||||
# Find all markdown links, but exclude those that are part of images
|
||||
foreach ($linkMatch in [regex]::Matches($lineForParsing, '(?<!!)\[([^\]]*)\]\(([^)]+)\)')) {
|
||||
$linkStart = $linkMatch.Index
|
||||
$linkEnd = $linkMatch.Index + $linkMatch.Length
|
||||
|
||||
# Check if this link overlaps with any image
|
||||
$isPartOfImage = $false
|
||||
foreach ($imageRange in $imageRanges) {
|
||||
if (($linkStart -ge $imageRange.Start -and $linkStart -lt $imageRange.End) -or
|
||||
($linkEnd -gt $imageRange.Start -and $linkEnd -le $imageRange.End) -or
|
||||
($linkStart -le $imageRange.Start -and $linkEnd -ge $imageRange.End)) {
|
||||
$isPartOfImage = $true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if ($isPartOfImage) { continue }
|
||||
|
||||
$linkText = $linkMatch.Groups[1].Value.Trim()
|
||||
$destRaw = $linkMatch.Groups[2].Value.Trim()
|
||||
|
||||
# Handle internal fragments
|
||||
if ($destRaw.StartsWith('#')) {
|
||||
|
|
@ -207,54 +273,39 @@ jobs:
|
|||
}
|
||||
if ($inCodeFence) { continue }
|
||||
|
||||
$lineForParsing = [regex]::Replace($line, '`[^`]*`', '')
|
||||
# Use the unified image detection function
|
||||
$imagesInLine = Get-ImagesFromLine $line
|
||||
|
||||
# Process markdown and HTML images
|
||||
$imagePatterns = @(
|
||||
@{ Pattern = "!\[([^\]]*)\]\(([^)]+)\)"; Type = "Markdown"; AltGroup = 1; UrlGroup = 2 }
|
||||
@{ Pattern = '<img\s+[^>]*>'; Type = "HTML"; AltGroup = -1; UrlGroup = -1 }
|
||||
)
|
||||
|
||||
foreach ($pattern in $imagePatterns) {
|
||||
foreach ($match in [regex]::Matches($lineForParsing, $pattern.Pattern)) {
|
||||
$altText = ""
|
||||
$url = ""
|
||||
|
||||
if ($pattern.Type -eq "Markdown") {
|
||||
$altText = $match.Groups[$pattern.AltGroup].Value
|
||||
$url = $match.Groups[$pattern.UrlGroup].Value
|
||||
} else {
|
||||
# Extract from HTML
|
||||
$imgTag = $match.Value
|
||||
if ($imgTag -match 'alt\s*=\s*[`"'']([^`"'']*)[`"'']') { $altText = $matches[1] }
|
||||
if ($imgTag -match 'src\s*=\s*[`"'']([^`"'']*)[`"'']') { $url = $matches[1] }
|
||||
}
|
||||
|
||||
if (-not $altText.Trim() -and $url) {
|
||||
$brokenReferences += Add-BrokenReference $relPath ($lineNumber + 1) $match.Value "[$($pattern.Type)] Missing alt text for image" "Image"
|
||||
} elseif ($url -and $altText) {
|
||||
# Validate URL format and file existence
|
||||
if ($url -match $expectedUrlPattern) {
|
||||
$relativePathInUrl = $matches[1]
|
||||
$fileNameFromUrl = [System.IO.Path]::GetFileNameWithoutExtension($relativePathInUrl)
|
||||
|
||||
if ($altText -ne $fileNameFromUrl) {
|
||||
$brokenReferences += Add-BrokenReference $relPath ($lineNumber + 1) $match.Value "[$($pattern.Type)] Alt text `"$altText`" ≠ filename `"$fileNameFromUrl`"" "Image"
|
||||
}
|
||||
|
||||
$expectedImagePath = Join-Path $PWD ($relativePathInUrl -replace "/", "\")
|
||||
if (-not (Test-Path $expectedImagePath)) {
|
||||
$brokenReferences += Add-BrokenReference $relPath ($lineNumber + 1) $match.Value "[$($pattern.Type)] Image not found at path: $relativePathInUrl" "Image"
|
||||
}
|
||||
} else {
|
||||
$urlIssues = @()
|
||||
if (-not $url.StartsWith('https://github.com/SoftFever/OrcaSlicer/blob/main/')) { $urlIssues += "URL must start with expected prefix" }
|
||||
if (-not $url.EndsWith('?raw=true')) { $urlIssues += "URL must end with '?raw=true'" }
|
||||
if ($url -match '^https?://(?!github\.com/SoftFever/OrcaSlicer)') { $urlIssues += "External URLs not allowed" }
|
||||
|
||||
$issueText = "[$($pattern.Type)] URL format issues: " + ($urlIssues -join '; ')
|
||||
$brokenReferences += Add-BrokenReference $relPath ($lineNumber + 1) $match.Value $issueText "Image"
|
||||
foreach ($image in $imagesInLine) {
|
||||
$altText = $image.AltText
|
||||
$url = $image.Url
|
||||
$imageMatch = $image.Match
|
||||
$imageType = $image.Type
|
||||
|
||||
if (-not $altText.Trim() -and $url) {
|
||||
$brokenReferences += Add-BrokenReference $relPath ($lineNumber + 1) $imageMatch "[$imageType] Missing alt text for image" "Image"
|
||||
} elseif ($url -and $altText) {
|
||||
# Validate URL format and file existence
|
||||
if ($url -match $expectedUrlPattern) {
|
||||
$relativePathInUrl = $matches[1]
|
||||
$fileNameFromUrl = [System.IO.Path]::GetFileNameWithoutExtension($relativePathInUrl)
|
||||
|
||||
if ($altText -ne $fileNameFromUrl) {
|
||||
$brokenReferences += Add-BrokenReference $relPath ($lineNumber + 1) $imageMatch "[$imageType] Alt text `"$altText`" ≠ filename `"$fileNameFromUrl`"" "Image"
|
||||
}
|
||||
|
||||
$expectedImagePath = Join-Path $PWD ($relativePathInUrl -replace "/", "\")
|
||||
if (-not (Test-Path $expectedImagePath)) {
|
||||
$brokenReferences += Add-BrokenReference $relPath ($lineNumber + 1) $imageMatch "[$imageType] Image not found at path: $relativePathInUrl" "Image"
|
||||
}
|
||||
} else {
|
||||
$urlIssues = @()
|
||||
if (-not $url.StartsWith('https://github.com/SoftFever/OrcaSlicer/blob/main/')) { $urlIssues += "URL must start with expected prefix" }
|
||||
if (-not $url.EndsWith('?raw=true')) { $urlIssues += "URL must end with '?raw=true'" }
|
||||
if ($url -match '^https?://(?!github\.com/SoftFever/OrcaSlicer)') { $urlIssues += "External URLs not allowed" }
|
||||
|
||||
$issueText = "[$imageType] URL format issues: " + ($urlIssues -join '; ')
|
||||
$brokenReferences += Add-BrokenReference $relPath ($lineNumber + 1) $imageMatch $issueText "Image"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -314,22 +365,4 @@ jobs:
|
|||
} else {
|
||||
Write-Host "::notice::All documentation is valid!"
|
||||
exit 0
|
||||
}
|
||||
|
||||
- name: Comment on PR
|
||||
if: failure() && github.event_name == 'pull_request'
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const validationErrors = process.env.VALIDATION_ERRORS || '';
|
||||
|
||||
const body = `❌ **Documentation validation failed**
|
||||
|
||||
${validationErrors || 'Please check the workflow logs for details about the validation errors.'}`;
|
||||
|
||||
github.rest.issues.createComment({
|
||||
issue_number: context.issue.number,
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
body: body
|
||||
})
|
||||
}
|
||||
3
.gitignore
vendored
|
|
@ -39,3 +39,6 @@ src/OrcaSlicer-doc/
|
|||
resources/profiles/user/default
|
||||
*.code-workspace
|
||||
deps_src/build/
|
||||
test.js
|
||||
/.cache/
|
||||
.clangd
|
||||
|
|
|
|||
23
AGENTS.md
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
# Repository Guidelines
|
||||
|
||||
## Project Structure & Module Organization
|
||||
OrcaSlicer’s C++17 sources live in `src/`, split by feature modules and platform adapters. User assets, icons, and printer presets are in `resources/`; translations stay in `localization/`. Tests sit in `tests/`, grouped by domain (`libslic3r/`, `sla_print/`, etc.) with fixtures under `tests/data/`. CMake helpers reside in `cmake/`, and longer references in `doc/` and `SoftFever_doc/`. Automation scripts belong in `scripts/` and `tools/`. Treat everything in `deps/` and `deps_src/` as vendored snapshots—do not modify without mirroring upstream tags.
|
||||
|
||||
## Build, Test, and Development Commands
|
||||
Use out-of-source builds:
|
||||
- `cmake -S . -B build -DCMAKE_BUILD_TYPE=Release` configures dependencies and generates build files.
|
||||
- `cmake --build build --target OrcaSlicer --config Release` compiles the app; add `--parallel` to speed up.
|
||||
- `cmake --build build --target tests` then `ctest --test-dir build --output-on-failure` runs automated suites.
|
||||
Platform helpers such as `build_linux.sh`, `build_release_macos.sh`, and `build_release_vs2022.bat` wrap the same flow with toolchain flags. Use `build_release_macos.sh -sx` when reproducing macOS build issues, and `scripts/DockerBuild.sh` for reproducible container builds.
|
||||
|
||||
## Coding Style & Naming Conventions
|
||||
`.clang-format` enforces 4-space indents, a 140-column limit, aligned initializers, and brace wrapping for classes and functions. Run `clang-format -i <file>` before committing; the CMake `clang-format` target is available when LLVM tools are on your PATH. Prefer `CamelCase` for classes, `snake_case` for functions and locals, and `SCREAMING_CASE` for constants, matching conventions in `src/`. Keep headers self-contained and align include order with the IWYU pragmas.
|
||||
|
||||
## Testing Guidelines
|
||||
Unit tests rely on Catch2 (`tests/catch2/`). Name specs after the component under test—for example `tests/libslic3r/TestPlanarHole.cpp`—and tag long-running cases so `ctest -L fast` remains useful. Cover new algorithms with deterministic fixtures or sample G-code stored in `tests/data/`. Document manual printer validation or regression slicer checks in your PR when automated coverage is insufficient.
|
||||
|
||||
## Commit & Pull Request Guidelines
|
||||
The history favors concise, sentence-style subject lines with optional issue references, e.g., `Fix grid lines origin for multiple plates (#10724)`. Squash fixups locally before opening a PR. Complete `.github/pull_request_template.md`, include reproduction steps or screenshots for UI changes, and mention impacted presets or translations. Link issues via `Closes #NNNN` when applicable, and call out dependency bumps or profile migrations for maintainer review.
|
||||
|
||||
## Security & Configuration Tips
|
||||
Follow `SECURITY.md` for vulnerability reporting. Keep API tokens and printer credentials out of tracked configs; use `sandboxes/` for experimental settings. When touching third-party code in `deps_src/`, record the upstream commit or release in your PR description and run the relevant platform build script to confirm integration.
|
||||
12
CLAUDE.md
|
|
@ -65,7 +65,8 @@ build_release_vs2022.bat slicer
|
|||
# Performance and debug options:
|
||||
./build_linux.sh -j N # limit to N cores
|
||||
./build_linux.sh -1 # single core build
|
||||
./build_linux.sh -b # debug build
|
||||
./build_linux.sh -b # Debug build
|
||||
./build_linux.sh -e # RelWithDebInfo build
|
||||
./build_linux.sh -c # clean build
|
||||
./build_linux.sh -r # skip RAM/disk checks
|
||||
./build_linux.sh -l # use Clang instead of GCC
|
||||
|
|
@ -107,9 +108,10 @@ cd build && ctest --output-on-failure
|
|||
Run individual test suites:
|
||||
```bash
|
||||
# From build directory
|
||||
./tests/libslic3r/libslic3r_tests
|
||||
./tests/fff_print/fff_print_tests
|
||||
./tests/sla_print/sla_print_tests
|
||||
ctest --test-dir ./tests/libslic3r/libslic3r_tests
|
||||
ctest --test-dir ./tests/fff_print/fff_print_tests
|
||||
ctest --test-dir ./tests/sla_print/sla_print_tests
|
||||
# and so on
|
||||
```
|
||||
|
||||
## Architecture
|
||||
|
|
@ -254,4 +256,4 @@ Run individual test suites:
|
|||
- **Regression testing** important due to algorithm complexity
|
||||
- **Performance benchmarks** help catch performance regressions
|
||||
- **Memory leak** detection important for long-running GUI application
|
||||
- **Cross-platform** testing required before releases
|
||||
- **Cross-platform** testing required before releases
|
||||
|
|
|
|||
139
CMakeLists.txt
|
|
@ -55,6 +55,11 @@ endif ()
|
|||
|
||||
project(OrcaSlicer)
|
||||
|
||||
# Backward compatibility for old CMake versions
|
||||
if (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_VERSION VERSION_LESS "3.25")
|
||||
set(LINUX ON CACHE BOOL "" FORCE)
|
||||
endif ()
|
||||
|
||||
include("version.inc")
|
||||
include(GNUInstallDirs)
|
||||
include(CMakeDependentOption)
|
||||
|
|
@ -67,26 +72,41 @@ if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
|||
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type (default Release)" FORCE)
|
||||
endif()
|
||||
|
||||
if (DEFINED BBL_RELEASE_TO_PUBLIC)
|
||||
add_compile_definitions("BBL_RELEASE_TO_PUBLIC=${BBL_RELEASE_TO_PUBLIC}")
|
||||
else ()
|
||||
add_compile_definitions("BBL_RELEASE_TO_PUBLIC=$<CONFIG:Release>")
|
||||
endif ()
|
||||
|
||||
find_package(Git)
|
||||
if(GIT_FOUND AND EXISTS "${CMAKE_SOURCE_DIR}/.git")
|
||||
# Check current Git commit hash
|
||||
execute_process(
|
||||
COMMAND ${GIT_EXECUTABLE} log -1 --format=%h
|
||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||
OUTPUT_VARIABLE GIT_COMMIT_HASH
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
add_definitions("-DGIT_COMMIT_HASH=\"${GIT_COMMIT_HASH}\"")
|
||||
if(DEFINED ENV{git_commit_hash} AND NOT "$ENV{git_commit_hash}" STREQUAL "")
|
||||
message(STATUS "Specified git commit hash: $ENV{git_commit_hash}")
|
||||
|
||||
# Convert the given hash to short hash
|
||||
execute_process(
|
||||
COMMAND ${GIT_EXECUTABLE} rev-parse --short "$ENV{git_commit_hash}"
|
||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||
OUTPUT_VARIABLE GIT_COMMIT_HASH
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
add_definitions("-DGIT_COMMIT_HASH=\"${GIT_COMMIT_HASH}\"")
|
||||
else()
|
||||
# Check current Git commit hash
|
||||
execute_process(
|
||||
COMMAND ${GIT_EXECUTABLE} log -1 --format=%h
|
||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||
OUTPUT_VARIABLE GIT_COMMIT_HASH
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
add_definitions("-DGIT_COMMIT_HASH=\"${GIT_COMMIT_HASH}\"")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(DEFINED ENV{SLIC3R_STATIC})
|
||||
set(SLIC3R_STATIC_INITIAL $ENV{SLIC3R_STATIC})
|
||||
set(SLIC3R_STATIC_INITIAL $ENV{SLIC3R_STATIC})
|
||||
else()
|
||||
if (MSVC OR MINGW OR APPLE)
|
||||
set(SLIC3R_STATIC_INITIAL 1)
|
||||
else()
|
||||
set(SLIC3R_STATIC_INITIAL 0)
|
||||
endif()
|
||||
set(SLIC3R_STATIC_INITIAL 1)
|
||||
endif()
|
||||
|
||||
option(SLIC3R_STATIC "Compile OrcaSlicer with static libraries (Boost, TBB, glew)" ${SLIC3R_STATIC_INITIAL})
|
||||
|
|
@ -97,14 +117,13 @@ option(SLIC3R_PROFILE "Compile OrcaSlicer with an invasive Shiny profiler" 0)
|
|||
option(SLIC3R_PCH "Use precompiled headers" 1)
|
||||
option(SLIC3R_MSVC_COMPILE_PARALLEL "Compile on Visual Studio in parallel" 1)
|
||||
option(SLIC3R_MSVC_PDB "Generate PDB files on MSVC in Release mode" 1)
|
||||
option(SLIC3R_PERL_XS "Compile XS Perl module and enable Perl unit and integration tests" 0)
|
||||
option(SLIC3R_ASAN "Enable ASan on Clang and GCC" 0)
|
||||
# If SLIC3R_FHS is 1 -> SLIC3R_DESKTOP_INTEGRATION is always 0, othrewise variable.
|
||||
CMAKE_DEPENDENT_OPTION(SLIC3R_DESKTOP_INTEGRATION "Allow perfoming desktop integration during runtime" 1 "NOT SLIC3R_FHS" 0)
|
||||
|
||||
set(OPENVDB_FIND_MODULE_PATH "" CACHE PATH "Path to OpenVDB installation's find modules.")
|
||||
|
||||
set(SLIC3R_GTK "2" CACHE STRING "GTK version to use with wxWidgets on Linux")
|
||||
set(SLIC3R_GTK "3" CACHE STRING "GTK version to use with wxWidgets on Linux")
|
||||
|
||||
set(IS_CROSS_COMPILE FALSE)
|
||||
|
||||
|
|
@ -118,6 +137,10 @@ if (${COLORED_OUTPUT})
|
|||
endif ()
|
||||
|
||||
if (APPLE)
|
||||
list(LENGTH CMAKE_OSX_ARCHITECTURES _arch_len)
|
||||
if (_arch_len GREATER 1)
|
||||
message(FATAL_ERROR "OrcaSlicer only supports building for one architecture at a time. Please make sure only one architecture is specified in CMAKE_OSX_ARCHITECTURES")
|
||||
endif ()
|
||||
set(CMAKE_FIND_FRAMEWORK LAST)
|
||||
set(CMAKE_FIND_APPBUNDLE LAST)
|
||||
list(FIND CMAKE_OSX_ARCHITECTURES ${CMAKE_SYSTEM_PROCESSOR} _arch_idx)
|
||||
|
|
@ -137,9 +160,16 @@ option(SLIC3R_BUILD_SANDBOXES "Build development sandboxes" OFF)
|
|||
option(BUILD_TESTS "Build unit tests" OFF)
|
||||
option(ORCA_TOOLS "Build Orca tools" OFF)
|
||||
|
||||
if (FLATPAK)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++20")
|
||||
set(SLIC3R_PCH OFF CACHE BOOL "" FORCE)
|
||||
set(SLIC3R_FHS ON CACHE BOOL "" FORCE)
|
||||
set(BUILD_TESTS OFF CACHE BOOL "" FORCE)
|
||||
set(SLIC3R_DESKTOP_INTEGRATION OFF CACHE BOOL "" FORCE)
|
||||
endif ()
|
||||
|
||||
if (IS_CROSS_COMPILE)
|
||||
message("Detected cross compilation setup. Tests and encoding checks will be forcedly disabled!")
|
||||
set(SLIC3R_PERL_XS OFF CACHE BOOL "" FORCE)
|
||||
set(BUILD_TESTS OFF CACHE BOOL "" FORCE)
|
||||
endif ()
|
||||
|
||||
|
|
@ -160,6 +190,13 @@ if(SLIC3R_DESKTOP_INTEGRATION)
|
|||
add_definitions(-DSLIC3R_DESKTOP_INTEGRATION)
|
||||
endif ()
|
||||
|
||||
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
|
||||
message(STATUS "Automatically setting CMAKE_INSTALL_PREFIX")
|
||||
set_property(CACHE CMAKE_INSTALL_PREFIX PROPERTY VALUE "${CMAKE_BINARY_DIR}/OrcaSlicer")
|
||||
endif()
|
||||
|
||||
message(STATUS "CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}")
|
||||
|
||||
if (MSVC AND CMAKE_CXX_COMPILER_ID STREQUAL Clang)
|
||||
set(IS_CLANG_CL TRUE)
|
||||
|
||||
|
|
@ -205,24 +242,61 @@ if (NOT MSVC)
|
|||
add_compile_options(-fsigned-char)
|
||||
endif ()
|
||||
|
||||
# Display and check CMAKE_PREFIX_PATH
|
||||
message(STATUS "SLIC3R_STATIC: ${SLIC3R_STATIC}")
|
||||
if (NOT "${CMAKE_PREFIX_PATH}" STREQUAL "")
|
||||
message(STATUS "CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH} (from cache or command line)")
|
||||
set(PREFIX_PATH_CHECK ${CMAKE_PREFIX_PATH})
|
||||
elseif (NOT "$ENV{CMAKE_PREFIX_PATH}" STREQUAL "")
|
||||
message(STATUS "CMAKE_PREFIX_PATH: $ENV{CMAKE_PREFIX_PATH} (from environment)")
|
||||
set(PREFIX_PATH_CHECK $ENV{CMAKE_PREFIX_PATH})
|
||||
if ("${DEP_BUILD_DIR}" STREQUAL "")
|
||||
get_filename_component(BIN_DIR_NAME ${CMAKE_BINARY_DIR} NAME)
|
||||
if (APPLE AND BIN_DIR_NAME STREQUAL "${CMAKE_OSX_ARCHITECTURES}")
|
||||
file(RELATIVE_PATH BIN_DIR_NAME ${CMAKE_BINARY_DIR}/../.. ${CMAKE_BINARY_DIR})
|
||||
endif ()
|
||||
set(DEP_BUILD_DIR "${CMAKE_SOURCE_DIR}/deps/${BIN_DIR_NAME}" CACHE PATH "Path to dependencies build directory" FORCE)
|
||||
message(STATUS "DEP_BUILD_DIR: ${DEP_BUILD_DIR} (generated automatically and saved to cache)")
|
||||
set(AUTOGENERATED_DEP_BUILD_DIR ${DEP_BUILD_DIR} CACHE PATH "Provides the last autogenerated DEP_BUILD_DIR" FORCE)
|
||||
else ()
|
||||
message(STATUS "CMAKE_PREFIX_PATH: (default)")
|
||||
message(STATUS "DEP_BUILD_DIR: ${DEP_BUILD_DIR} (from cache or command line)")
|
||||
endif ()
|
||||
|
||||
if ("${CMAKE_PREFIX_PATH}" STREQUAL "" OR "${CMAKE_PREFIX_PATH}" STREQUAL "${AUTOGENERATED_PREFIX_PATH}")
|
||||
if (DEFINED AUTOGENERATED_DEP_BUILD_DIR AND NOT "${DEP_BUILD_DIR}" STREQUAL "${AUTOGENERATED_DEP_BUILD_DIR}")
|
||||
message(STATUS "CMAKE_PREFIX_PATH is being re-generated due to DEP_BUILD_DIR being manually updated")
|
||||
set(REGEN_DESTDIR TRUE)
|
||||
unset(AUTOGENERATED_DEP_BUILD_DIR CACHE)
|
||||
endif ()
|
||||
else ()
|
||||
unset(AUTOGENERATED_PREFIX_PATH CACHE)
|
||||
endif ()
|
||||
|
||||
# Display and check CMAKE_PREFIX_PATH
|
||||
if ("${CMAKE_PREFIX_PATH}" STREQUAL "" OR REGEN_DESTDIR)
|
||||
set(CMAKE_PREFIX_PATH "${DEP_BUILD_DIR}/OrcaSlicer_dep/usr/local" CACHE PATH "Path to dependencies install directory" FORCE)
|
||||
message(STATUS "CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH} (generated automatically and saved to cache)")
|
||||
set(AUTOGENERATED_PREFIX_PATH ${CMAKE_PREFIX_PATH} CACHE STRING "Provides the last autogenerated CMAKE_PREFIX_PATH" FORCE)
|
||||
unset(REGEN_DESTDIR CACHE)
|
||||
else ()
|
||||
message(STATUS "CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH} (from cache or command line)")
|
||||
endif ()
|
||||
set(PREFIX_PATH_CHECK ${CMAKE_PREFIX_PATH})
|
||||
|
||||
# the CMAKE_PREFIX_PATH environment variable is separate from the CMAKE_PREFIX_PATH cache variable and provides additional paths to search for libraries.
|
||||
if (NOT "$ENV{CMAKE_PREFIX_PATH}" STREQUAL "")
|
||||
message(STATUS "CMAKE_PREFIX_PATH: $ENV{CMAKE_PREFIX_PATH} (from environment)")
|
||||
list(APPEND PREFIX_PATH_CHECK $ENV{CMAKE_PREFIX_PATH})
|
||||
endif ()
|
||||
|
||||
# Check all directories in CMAKE_PREFIX_PATH variables
|
||||
foreach (DIR ${PREFIX_PATH_CHECK})
|
||||
if (NOT EXISTS "${DIR}")
|
||||
message(WARNING "CMAKE_PREFIX_PATH element doesn't exist: ${DIR}")
|
||||
endif ()
|
||||
endforeach ()
|
||||
|
||||
if (APPLE)
|
||||
set(CMAKE_MACOSX_RPATH ON CACHE BOOL "")
|
||||
set(CMAKE_MACOSX_BUNDLE ON CACHE BOOL "")
|
||||
endif ()
|
||||
|
||||
if (APPLE AND CMAKE_MACOSX_RPATH AND "${CMAKE_INSTALL_RPATH}" STREQUAL "")
|
||||
set(CMAKE_INSTALL_RPATH ${CMAKE_PREFIX_PATH})
|
||||
endif ()
|
||||
|
||||
# Add our own cmake module path.
|
||||
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/modules/)
|
||||
message(STATUS "PROJECT_SOURCE_DIR: ${PROJECT_SOURCE_DIR}")
|
||||
|
|
@ -263,7 +337,11 @@ if(WIN32)
|
|||
endif()
|
||||
else()
|
||||
# Try to use the default Windows 10 SDK path.
|
||||
set(WIN10SDK_INCLUDE_PATH "$ENV{WindowsSdkDir}/Include/$ENV{WindowsSDKVersion}")
|
||||
if (DEFINED ENV{WindowsSdkDir} AND DEFINED ENV{WindowsSDKVersion})
|
||||
set(WIN10SDK_INCLUDE_PATH "$ENV{WindowsSdkDir}/Include/$ENV{WindowsSDKVersion}")
|
||||
else ()
|
||||
set(WIN10SDK_INCLUDE_PATH "C:/Program Files (x86)/Windows Kits/10/Include/10.0.22000.0")
|
||||
endif ()
|
||||
if (NOT EXISTS "${WIN10SDK_INCLUDE_PATH}/winrt/windows.graphics.printing3d.h")
|
||||
message("${WIN10SDK_INCLUDE_PATH}/winrt/windows.graphics.printing3d.h was not found")
|
||||
message("STL fixing by the Netfabb service will not be compiled")
|
||||
|
|
@ -803,13 +881,6 @@ set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT O
|
|||
|
||||
add_dependencies(gettext_make_pot hintsToPot)
|
||||
|
||||
# Perl bindings, currently only used for the unit / integration tests of libslic3r.
|
||||
# Also runs the unit / integration tests.
|
||||
#FIXME Port the tests into C++ to finally get rid of the Perl!
|
||||
if (SLIC3R_PERL_XS)
|
||||
add_subdirectory(xs)
|
||||
endif ()
|
||||
|
||||
if(SLIC3R_BUILD_SANDBOXES)
|
||||
add_subdirectory(sandboxes)
|
||||
endif()
|
||||
|
|
|
|||
11
README.md
|
|
@ -29,10 +29,13 @@ Optimize your prints with ultra-fast slicing, intelligent support generation, an
|
|||
<table border="2" style="border-color: #ffa500; background-color:rgb(232, 220, 180); color: #856404;">
|
||||
<tr>
|
||||
<td>
|
||||
<strong>⚠️ CAUTION:</strong><br><br>
|
||||
There are several clickbait and malicious websites pretending to be Official OrcaSlicer. These sites may redirect you to dangerous downloads or contain misleading information.
|
||||
<br><br>
|
||||
If you come across any of these in search results, please <a href="https://safebrowsing.google.com/safebrowsing/report_phish/?">report them as unsafe or phishing</a> to help keep the community secure.
|
||||
<strong>⚠️ CAUTION:</strong><br>
|
||||
Several clickbait and malicious websites, such as <b>orca-slicer[.]com</b> and <b>orcaslicer[.]net</b>, are pretending to be the official OrcaSlicer site. These sites may redirect you to dangerous downloads or contain misleading information.<br>
|
||||
<b>Our only official website is <a href="https://www.orcaslicer.com/">www.orcaslicer.com</a>.</b><br><br>
|
||||
If you come across any of these in search results, please <b>report them</b> as unsafe or phishing to help keep the community secure with:<br>
|
||||
- <a href="https://safebrowsing.google.com/safebrowsing/report_phish/">Google Safe Browsing</a><br>
|
||||
- <a href="https://www.microsoft.com/en-us/wdsi/support/report-unsafe-site">Microsoft Security Intelligence</a><br>
|
||||
- <a href="https://ipthreat.net/tools/reportphishing">IPThreat</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
|||
125
build_linux.sh
|
|
@ -7,19 +7,21 @@ SCRIPT_PATH=$(dirname "$(readlink -f "${0}")")
|
|||
pushd "${SCRIPT_PATH}" > /dev/null
|
||||
|
||||
function usage() {
|
||||
echo "Usage: ./${SCRIPT_NAME} [-1][-b][-c][-d][-h][-i][-j N][-p][-r][-s][-t][-u][-l][-L]"
|
||||
echo "Usage: ./${SCRIPT_NAME} [-1][-b][-c][-d][-D][-e][-h][-i][-j N][-p][-r][-s][-t][-u][-l][-L]"
|
||||
echo " -1: limit builds to one core (where possible)"
|
||||
echo " -j N: limit builds to N cores (where possible)"
|
||||
echo " -b: build in debug mode"
|
||||
echo " -b: build in Debug mode"
|
||||
echo " -c: force a clean build"
|
||||
echo " -C: enable ANSI-colored compile output (GNU/Clang only)"
|
||||
echo " -d: download and build dependencies in ./deps/ (build prerequisite)"
|
||||
echo " -D: dry run"
|
||||
echo " -e: build in RelWithDebInfo mode"
|
||||
echo " -h: prints this help text"
|
||||
echo " -i: build the Orca Slicer AppImage (optional)"
|
||||
echo " -p: boost ccache hit rate by disabling precompiled headers (default: ON)"
|
||||
echo " -r: skip RAM and disk checks (low RAM compiling)"
|
||||
echo " -s: build the Orca Slicer (optional)"
|
||||
echo " -t: build tests (optional)"
|
||||
echo " -t: build tests (optional), requires -s flag"
|
||||
echo " -u: install system dependencies (asks for sudo password; build prerequisite)"
|
||||
echo " -l: use Clang instead of GCC (default: GCC)"
|
||||
echo " -L: use ld.lld as linker (if available)"
|
||||
|
|
@ -31,7 +33,9 @@ function usage() {
|
|||
SLIC3R_PRECOMPILED_HEADERS="ON"
|
||||
|
||||
unset name
|
||||
while getopts ":1j:bcCdhiprstulL" opt ; do
|
||||
BUILD_DIR=build
|
||||
BUILD_CONFIG=Release
|
||||
while getopts ":1j:bcCdDehiprstulL" opt ; do
|
||||
case ${opt} in
|
||||
1 )
|
||||
export CMAKE_BUILD_PARALLEL_LEVEL=1
|
||||
|
|
@ -40,7 +44,8 @@ while getopts ":1j:bcCdhiprstulL" opt ; do
|
|||
export CMAKE_BUILD_PARALLEL_LEVEL=$OPTARG
|
||||
;;
|
||||
b )
|
||||
BUILD_DEBUG="1"
|
||||
BUILD_DIR=build-dbg
|
||||
BUILD_CONFIG=Debug
|
||||
;;
|
||||
c )
|
||||
CLEAN_BUILD=1
|
||||
|
|
@ -51,6 +56,13 @@ while getopts ":1j:bcCdhiprstulL" opt ; do
|
|||
d )
|
||||
BUILD_DEPS="1"
|
||||
;;
|
||||
D )
|
||||
DRY_RUN="1"
|
||||
;;
|
||||
e )
|
||||
BUILD_DIR=build-dbginfo
|
||||
BUILD_CONFIG=RelWithDebInfo
|
||||
;;
|
||||
h ) usage
|
||||
exit 1
|
||||
;;
|
||||
|
|
@ -90,6 +102,11 @@ if [ ${OPTIND} -eq 1 ] ; then
|
|||
exit 1
|
||||
fi
|
||||
|
||||
if [[ -n "${BUILD_TESTS}" ]] && [[ -z "${BUILD_ORCA}" ]] ; then
|
||||
echo "-t flag requires -s flag in the same invocation"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
function check_available_memory_and_disk() {
|
||||
FREE_MEM_GB=$(free --gibi --total | grep 'Mem' | rev | cut --delimiter=" " --fields=1 | rev)
|
||||
MIN_MEM_GB=10
|
||||
|
|
@ -112,6 +129,21 @@ function check_available_memory_and_disk() {
|
|||
fi
|
||||
}
|
||||
|
||||
function print_and_run() {
|
||||
cmd=()
|
||||
# Remove empty arguments, leading and trailing spaces
|
||||
for item in "$@" ; do
|
||||
if [[ -n $item ]]; then
|
||||
cmd+=( "$(echo "${item}" | xargs)" )
|
||||
fi
|
||||
done
|
||||
|
||||
echo "${cmd[@]}"
|
||||
if [[ -z "${DRY_RUN}" ]] ; then
|
||||
"${cmd[@]}"
|
||||
fi
|
||||
}
|
||||
|
||||
# cmake 4.x compatibility workaround
|
||||
export CMAKE_POLICY_VERSION_MINIMUM=3.5
|
||||
|
||||
|
|
@ -137,7 +169,7 @@ else
|
|||
source "./scripts/linux.d/${DISTRIBUTION}"
|
||||
fi
|
||||
|
||||
echo "FOUND_GTK3=${FOUND_GTK3}"
|
||||
echo "FOUND_GTK3_DEV=${FOUND_GTK3_DEV}"
|
||||
if [[ -z "${FOUND_GTK3_DEV}" ]] ; then
|
||||
echo "Error, you must install the dependencies before."
|
||||
echo "Use option -u with sudo"
|
||||
|
|
@ -176,93 +208,62 @@ fi
|
|||
if [[ -n "${BUILD_DEPS}" ]] ; then
|
||||
echo "Configuring dependencies..."
|
||||
read -r -a BUILD_ARGS <<< "${DEPS_EXTRA_BUILD_ARGS}"
|
||||
BUILD_ARGS+=(-DDEP_WX_GTK3=ON)
|
||||
if [[ -n "${CLEAN_BUILD}" ]]
|
||||
then
|
||||
rm -fr deps/build
|
||||
print_and_run rm -fr deps/$BUILD_DIR
|
||||
fi
|
||||
mkdir -p deps/build
|
||||
if [[ -n "${BUILD_DEBUG}" ]] ; then
|
||||
# build deps with debug and release else cmake will not find required sources
|
||||
mkdir -p deps/build/release
|
||||
set -x
|
||||
cmake -S deps -B deps/build/release "${CMAKE_C_CXX_COMPILER_CLANG[@]}" "${CMAKE_LLD_LINKER_ARGS[@]}" -G Ninja \
|
||||
-DSLIC3R_PCH="${SLIC3R_PRECOMPILED_HEADERS}" \
|
||||
-DDESTDIR="${SCRIPT_PATH}/deps/build/destdir" \
|
||||
-DDEP_DOWNLOAD_DIR="${SCRIPT_PATH}/deps/DL_CACHE" \
|
||||
"${COLORED_OUTPUT}" \
|
||||
"${BUILD_ARGS[@]}"
|
||||
set +x
|
||||
cmake --build deps/build/release
|
||||
BUILD_ARGS+=(-DCMAKE_BUILD_TYPE=Debug)
|
||||
mkdir -p deps/$BUILD_DIR
|
||||
if [[ $BUILD_CONFIG != Release ]] ; then
|
||||
BUILD_ARGS+=(-DCMAKE_BUILD_TYPE="${BUILD_CONFIG}")
|
||||
fi
|
||||
|
||||
set -x
|
||||
cmake -S deps -B deps/build "${CMAKE_C_CXX_COMPILER_CLANG[@]}" "${CMAKE_LLD_LINKER_ARGS[@]}" -G Ninja \
|
||||
-DSLIC3R_PCH="${SLIC3R_PRECOMPILED_HEADERS}" \
|
||||
-DDESTDIR="${SCRIPT_PATH}/deps/build/destdir" \
|
||||
-DDEP_DOWNLOAD_DIR="${SCRIPT_PATH}/deps/DL_CACHE" \
|
||||
"${COLORED_OUTPUT}" \
|
||||
"${BUILD_ARGS[@]}"
|
||||
set +x
|
||||
cmake --build deps/build
|
||||
print_and_run cmake -S deps -B deps/$BUILD_DIR "${CMAKE_C_CXX_COMPILER_CLANG[@]}" "${CMAKE_LLD_LINKER_ARGS[@]}" -G Ninja "${COLORED_OUTPUT}" "${BUILD_ARGS[@]}"
|
||||
print_and_run cmake --build deps/$BUILD_DIR
|
||||
fi
|
||||
|
||||
if [[ -n "${BUILD_ORCA}" ]] ; then
|
||||
echo "Configuring OrcaSlicer..."
|
||||
if [[ -n "${CLEAN_BUILD}" ]] ; then
|
||||
rm -fr build
|
||||
print_and_run rm -fr $BUILD_DIR
|
||||
fi
|
||||
read -r -a BUILD_ARGS <<< "${ORCA_EXTRA_BUILD_ARGS}"
|
||||
if [[ -n "${FOUND_GTK3_DEV}" ]] ; then
|
||||
BUILD_ARGS+=(-DSLIC3R_GTK=3)
|
||||
fi
|
||||
if [[ -n "${BUILD_DEBUG}" ]] ; then
|
||||
BUILD_ARGS+=(-DCMAKE_BUILD_TYPE=Debug -DBBL_INTERNAL_TESTING=1)
|
||||
else
|
||||
BUILD_ARGS+=(-DBBL_RELEASE_TO_PUBLIC=1 -DBBL_INTERNAL_TESTING=0)
|
||||
if [[ $BUILD_CONFIG != Release ]] ; then
|
||||
BUILD_ARGS+=(-DCMAKE_BUILD_TYPE="${BUILD_CONFIG}")
|
||||
fi
|
||||
if [[ -n "${BUILD_TESTS}" ]] ; then
|
||||
BUILD_ARGS+=(-DBUILD_TESTS=ON)
|
||||
fi
|
||||
if [[ -n "${ORCA_UPDATER_SIG_KEY}" ]] ; then
|
||||
BUILD_ARGS+=(-DORCA_UPDATER_SIG_KEY="${ORCA_UPDATER_SIG_KEY}")
|
||||
fi
|
||||
|
||||
echo "Configuring OrcaSlicer..."
|
||||
set -x
|
||||
cmake -S . -B build "${CMAKE_C_CXX_COMPILER_CLANG[@]}" "${CMAKE_LLD_LINKER_ARGS[@]}" -G "Ninja Multi-Config" \
|
||||
-DSLIC3R_PCH="${SLIC3R_PRECOMPILED_HEADERS}" \
|
||||
-DCMAKE_PREFIX_PATH="${SCRIPT_PATH}/deps/build/destdir/usr/local" \
|
||||
-DSLIC3R_STATIC=1 \
|
||||
-DORCA_TOOLS=ON \
|
||||
"${COLORED_OUTPUT}" \
|
||||
"${BUILD_ARGS[@]}"
|
||||
set +x
|
||||
print_and_run cmake -S . -B $BUILD_DIR "${CMAKE_C_CXX_COMPILER_CLANG[@]}" "${CMAKE_LLD_LINKER_ARGS[@]}" -G "Ninja Multi-Config" \
|
||||
-DSLIC3R_PCH=${SLIC3R_PRECOMPILED_HEADERS} \
|
||||
-DORCA_TOOLS=ON \
|
||||
"${COLORED_OUTPUT}" \
|
||||
"${BUILD_ARGS[@]}"
|
||||
echo "done"
|
||||
echo "Building OrcaSlicer ..."
|
||||
if [[ -n "${BUILD_DEBUG}" ]] ; then
|
||||
cmake --build build --config Debug --target OrcaSlicer
|
||||
else
|
||||
cmake --build build --config Release --target OrcaSlicer
|
||||
fi
|
||||
print_and_run cmake --build $BUILD_DIR --config "${BUILD_CONFIG}" --target OrcaSlicer
|
||||
echo "Building OrcaSlicer_profile_validator .."
|
||||
if [[ -n "${BUILD_DEBUG}" ]] ; then
|
||||
cmake --build build --config Debug --target OrcaSlicer_profile_validator
|
||||
else
|
||||
cmake --build build --config Release --target OrcaSlicer_profile_validator
|
||||
fi
|
||||
print_and_run cmake --build $BUILD_DIR --config "${BUILD_CONFIG}" --target OrcaSlicer_profile_validator
|
||||
./scripts/run_gettext.sh
|
||||
if [[ -n "${BUILD_TESTS}" ]] ; then
|
||||
echo "Building tests ..."
|
||||
print_and_run cmake --build ${BUILD_DIR} --config "${BUILD_CONFIG}" --target tests/all
|
||||
fi
|
||||
echo "done"
|
||||
fi
|
||||
|
||||
if [[ -n "${BUILD_IMAGE}" || -n "${BUILD_ORCA}" ]] ; then
|
||||
pushd build > /dev/null
|
||||
echo "[9/9] Generating Linux app..."
|
||||
pushd $BUILD_DIR > /dev/null
|
||||
build_linux_image="./src/build_linux_image.sh"
|
||||
if [[ -e ${build_linux_image} ]] ; then
|
||||
extra_script_args=""
|
||||
if [[ -n "${BUILD_IMAGE}" ]] ; then
|
||||
extra_script_args="-i"
|
||||
fi
|
||||
${build_linux_image} ${extra_script_args}
|
||||
print_and_run ${build_linux_image} ${extra_script_args} -R "${BUILD_CONFIG}"
|
||||
|
||||
echo "done"
|
||||
fi
|
||||
|
|
|
|||
|
|
@ -24,13 +24,15 @@ cd deps
|
|||
mkdir %build_dir%
|
||||
cd %build_dir%
|
||||
set DEPS=%CD%/OrcaSlicer_dep
|
||||
set "SIG_FLAG="
|
||||
if defined ORCA_UPDATER_SIG_KEY set "SIG_FLAG=-DORCA_UPDATER_SIG_KEY=%ORCA_UPDATER_SIG_KEY%"
|
||||
if "%1"=="slicer" (
|
||||
GOTO :slicer
|
||||
)
|
||||
echo "building deps.."
|
||||
|
||||
echo cmake ../ -G "Visual Studio 16 2019" -A x64 -DDESTDIR="%CD%/OrcaSlicer_dep" -DCMAKE_BUILD_TYPE=%build_type% -DDEP_DEBUG=%debug% -DORCA_INCLUDE_DEBUG_INFO=%debuginfo%
|
||||
cmake ../ -G "Visual Studio 16 2019" -A x64 -DDESTDIR="%CD%/OrcaSlicer_dep" -DCMAKE_BUILD_TYPE=%build_type% -DDEP_DEBUG=%debug% -DORCA_INCLUDE_DEBUG_INFO=%debuginfo%
|
||||
echo cmake ../ -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=%build_type%
|
||||
cmake ../ -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=%build_type%
|
||||
cmake --build . --config %build_type% --target deps -- -m
|
||||
|
||||
if "%1"=="deps" exit /b 0
|
||||
|
|
@ -41,8 +43,8 @@ cd %WP%
|
|||
mkdir %build_dir%
|
||||
cd %build_dir%
|
||||
|
||||
echo cmake .. -G "Visual Studio 16 2019" -A x64 -DBBL_RELEASE_TO_PUBLIC=1 -DCMAKE_PREFIX_PATH="%DEPS%/usr/local" -DCMAKE_INSTALL_PREFIX="./OrcaSlicer" -DCMAKE_BUILD_TYPE=%build_type%
|
||||
cmake .. -G "Visual Studio 16 2019" -A x64 -DBBL_RELEASE_TO_PUBLIC=1 -DCMAKE_PREFIX_PATH="%DEPS%/usr/local" -DCMAKE_INSTALL_PREFIX="./OrcaSlicer" -DCMAKE_BUILD_TYPE=%build_type% -DWIN10SDK_PATH="C:/Program Files (x86)/Windows Kits/10/Include/10.0.19041.0"
|
||||
echo cmake .. -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=%build_type%
|
||||
cmake .. -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=%build_type% %SIG_FLAG%
|
||||
cmake --build . --config %build_type% --target ALL_BUILD -- -m
|
||||
cd ..
|
||||
call scripts/run_gettext.bat
|
||||
|
|
|
|||
|
|
@ -109,8 +109,6 @@ echo
|
|||
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_BUILD_DIR="$PROJECT_DIR/build/$ARCH"
|
||||
DEPS_DIR="$PROJECT_DIR/deps"
|
||||
DEPS_BUILD_DIR="$DEPS_DIR/build/$ARCH"
|
||||
DEPS="$DEPS_BUILD_DIR/OrcaSlicer_deps"
|
||||
|
||||
# For Multi-config generators like Ninja and Xcode
|
||||
export BUILD_DIR_CONFIG_SUBDIR="/$BUILD_CONFIG"
|
||||
|
|
@ -133,8 +131,6 @@ function build_deps() {
|
|||
if [ "1." != "$BUILD_ONLY". ]; then
|
||||
cmake "${DEPS_DIR}" \
|
||||
-G "${DEPS_CMAKE_GENERATOR}" \
|
||||
-DDESTDIR="$DEPS" \
|
||||
-DOPENSSL_ARCH="darwin64-${_ARCH}-cc" \
|
||||
-DCMAKE_BUILD_TYPE="$BUILD_CONFIG" \
|
||||
-DCMAKE_OSX_ARCHITECTURES:STRING="${_ARCH}" \
|
||||
-DCMAKE_OSX_DEPLOYMENT_TARGET="${OSX_DEPLOYMENT_TARGET}"
|
||||
|
|
@ -172,14 +168,9 @@ function build_slicer() {
|
|||
if [ "1." != "$BUILD_ONLY". ]; then
|
||||
cmake "${PROJECT_DIR}" \
|
||||
-G "${SLICER_CMAKE_GENERATOR}" \
|
||||
-DBBL_RELEASE_TO_PUBLIC=1 \
|
||||
-DORCA_TOOLS=ON \
|
||||
-DCMAKE_PREFIX_PATH="$DEPS/usr/local" \
|
||||
-DCMAKE_INSTALL_PREFIX="$PWD/OrcaSlicer" \
|
||||
${ORCA_UPDATER_SIG_KEY:+-DORCA_UPDATER_SIG_KEY="$ORCA_UPDATER_SIG_KEY"} \
|
||||
-DCMAKE_BUILD_TYPE="$BUILD_CONFIG" \
|
||||
-DCMAKE_MACOSX_RPATH=ON \
|
||||
-DCMAKE_INSTALL_RPATH="${DEPS}/usr/local" \
|
||||
-DCMAKE_MACOSX_BUNDLE=ON \
|
||||
-DCMAKE_OSX_ARCHITECTURES="${_ARCH}" \
|
||||
-DCMAKE_OSX_DEPLOYMENT_TARGET="${OSX_DEPLOYMENT_TARGET}"
|
||||
fi
|
||||
|
|
|
|||
|
|
@ -37,7 +37,8 @@ setlocal DISABLEDELAYEDEXPANSION
|
|||
cd deps
|
||||
mkdir %build_dir%
|
||||
cd %build_dir%
|
||||
set DEPS=%CD%/OrcaSlicer_dep
|
||||
set "SIG_FLAG="
|
||||
if defined ORCA_UPDATER_SIG_KEY set "SIG_FLAG=-DORCA_UPDATER_SIG_KEY=%ORCA_UPDATER_SIG_KEY%"
|
||||
|
||||
if "%1"=="slicer" (
|
||||
GOTO :slicer
|
||||
|
|
@ -45,7 +46,7 @@ if "%1"=="slicer" (
|
|||
echo "building deps.."
|
||||
|
||||
echo on
|
||||
cmake ../ -G "Visual Studio 17 2022" -A x64 -DDESTDIR="%DEPS%" -DCMAKE_BUILD_TYPE=%build_type% -DDEP_DEBUG=%debug% -DORCA_INCLUDE_DEBUG_INFO=%debuginfo%
|
||||
cmake ../ -G "Visual Studio 17 2022" -A x64 -DCMAKE_BUILD_TYPE=%build_type%
|
||||
cmake --build . --config %build_type% --target deps -- -m
|
||||
@echo off
|
||||
|
||||
|
|
@ -58,7 +59,7 @@ mkdir %build_dir%
|
|||
cd %build_dir%
|
||||
|
||||
echo on
|
||||
cmake .. -G "Visual Studio 17 2022" -A x64 -DBBL_RELEASE_TO_PUBLIC=1 -DORCA_TOOLS=ON -DCMAKE_PREFIX_PATH="%DEPS%/usr/local" -DCMAKE_INSTALL_PREFIX="./OrcaSlicer" -DCMAKE_BUILD_TYPE=%build_type% -DWIN10SDK_PATH="%WindowsSdkDir%Include\%WindowsSDKVersion%\"
|
||||
cmake .. -G "Visual Studio 17 2022" -A x64 -DORCA_TOOLS=ON %SIG_FLAG% -DCMAKE_BUILD_TYPE=%build_type%
|
||||
cmake --build . --config %build_type% --target ALL_BUILD -- -m
|
||||
@echo off
|
||||
cd ..
|
||||
|
|
|
|||
|
|
@ -152,7 +152,7 @@ find_library(GLEW_STATIC_LIBRARY_RELEASE
|
|||
PATHS ENV GLEW_ROOT)
|
||||
|
||||
find_library(GLEW_STATIC_LIBRARY_DEBUG
|
||||
NAMES GLEWds glewd glewds glew32ds
|
||||
NAMES GLEWds GLEWd glewd glewds glew32ds
|
||||
PATH_SUFFIXES lib lib64
|
||||
PATHS ENV GLEW_ROOT)
|
||||
|
||||
|
|
|
|||
|
|
@ -3,13 +3,6 @@
|
|||
#//
|
||||
#// Description:
|
||||
#// cmake module for finding NLopt installation
|
||||
#// NLopt installation location is defined by environment variable $NLOPT
|
||||
#//
|
||||
#// following variables are defined:
|
||||
#// NLopt_DIR - NLopt installation directory
|
||||
#// NLopt_INCLUDE_DIR - NLopt header directory
|
||||
#// NLopt_LIBRARY_DIR - NLopt library directory
|
||||
#// NLopt_LIBS - NLopt library files
|
||||
#//
|
||||
#// Example usage:
|
||||
#// find_package(NLopt 1.4 REQUIRED)
|
||||
|
|
@ -17,114 +10,27 @@
|
|||
#//
|
||||
#//-------------------------------------------------------------------------
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
|
||||
set(NLopt_FOUND FALSE)
|
||||
set(NLopt_ERROR_REASON "")
|
||||
set(NLopt_DEFINITIONS "")
|
||||
unset(NLopt_LIBS CACHE)
|
||||
|
||||
set(NLopt_DIR $ENV{NLOPT})
|
||||
if(NOT NLopt_DIR)
|
||||
|
||||
set(NLopt_FOUND TRUE)
|
||||
|
||||
set(_NLopt_LIB_NAMES "nlopt")
|
||||
find_library(NLopt_LIBS
|
||||
NAMES ${_NLopt_LIB_NAMES})
|
||||
if(NOT NLopt_LIBS)
|
||||
set(NLopt_FOUND FALSE)
|
||||
set(NLopt_ERROR_REASON "${NLopt_ERROR_REASON} Cannot find NLopt library '${_NLopt_LIB_NAMES}'.")
|
||||
else()
|
||||
get_filename_component(NLopt_DIR ${NLopt_LIBS} PATH)
|
||||
endif()
|
||||
unset(_NLopt_LIB_NAMES)
|
||||
|
||||
set(_NLopt_HEADER_FILE_NAME "nlopt.hpp")
|
||||
find_file(_NLopt_HEADER_FILE
|
||||
NAMES ${_NLopt_HEADER_FILE_NAME})
|
||||
if(NOT _NLopt_HEADER_FILE)
|
||||
set(NLopt_FOUND FALSE)
|
||||
set(NLopt_ERROR_REASON "${NLopt_ERROR_REASON} Cannot find NLopt header file '${_NLopt_HEADER_FILE_NAME}'.")
|
||||
endif()
|
||||
unset(_NLopt_HEADER_FILE_NAME)
|
||||
|
||||
if(NOT NLopt_FOUND)
|
||||
set(NLopt_ERROR_REASON "${NLopt_ERROR_REASON} NLopt not found in system directories (and environment variable NLOPT is not set).")
|
||||
else()
|
||||
get_filename_component(NLopt_INCLUDE_DIR ${_NLopt_HEADER_FILE} DIRECTORY )
|
||||
endif()
|
||||
|
||||
unset(_NLopt_HEADER_FILE CACHE)
|
||||
|
||||
else()
|
||||
|
||||
set(NLopt_FOUND TRUE)
|
||||
|
||||
set(NLopt_INCLUDE_DIR "${NLopt_DIR}/include")
|
||||
if(NOT EXISTS "${NLopt_INCLUDE_DIR}")
|
||||
set(NLopt_FOUND FALSE)
|
||||
set(NLopt_ERROR_REASON "${NLopt_ERROR_REASON} Directory '${NLopt_INCLUDE_DIR}' does not exist.")
|
||||
endif()
|
||||
|
||||
set(NLopt_LIBRARY_DIR "${NLopt_DIR}/lib")
|
||||
if(NOT EXISTS "${NLopt_LIBRARY_DIR}")
|
||||
set(NLopt_FOUND FALSE)
|
||||
set(NLopt_ERROR_REASON "${NLopt_ERROR_REASON} Directory '${NLopt_LIBRARY_DIR}' does not exist.")
|
||||
endif()
|
||||
|
||||
set(_NLopt_LIB_NAMES "nlopt_cxx")
|
||||
find_library(NLopt_LIBS
|
||||
NAMES ${_NLopt_LIB_NAMES}
|
||||
PATHS ${NLopt_LIBRARY_DIR}
|
||||
NO_DEFAULT_PATH)
|
||||
if(NOT NLopt_LIBS)
|
||||
set(NLopt_FOUND FALSE)
|
||||
set(NLopt_ERROR_REASON "${NLopt_ERROR_REASON} Cannot find NLopt library '${_NLopt_LIB_NAMES}' in '${NLopt_LIBRARY_DIR}'.")
|
||||
endif()
|
||||
unset(_NLopt_LIB_NAMES)
|
||||
|
||||
set(_NLopt_HEADER_FILE_NAME "nlopt.hpp")
|
||||
find_file(_NLopt_HEADER_FILE
|
||||
NAMES ${_NLopt_HEADER_FILE_NAME}
|
||||
PATHS ${NLopt_INCLUDE_DIR}
|
||||
NO_DEFAULT_PATH)
|
||||
if(NOT _NLopt_HEADER_FILE)
|
||||
set(NLopt_FOUND FALSE)
|
||||
set(NLopt_ERROR_REASON "${NLopt_ERROR_REASON} Cannot find NLopt header file '${_NLopt_HEADER_FILE_NAME}' in '${NLopt_INCLUDE_DIR}'.")
|
||||
endif()
|
||||
unset(_NLopt_HEADER_FILE_NAME)
|
||||
unset(_NLopt_HEADER_FILE CACHE)
|
||||
|
||||
endif()
|
||||
|
||||
|
||||
# make variables changeable
|
||||
mark_as_advanced(
|
||||
NLopt_INCLUDE_DIR
|
||||
NLopt_LIBRARY_DIR
|
||||
NLopt_LIBS
|
||||
NLopt_DEFINITIONS
|
||||
)
|
||||
unset(_q)
|
||||
if (NLopt_FIND_QUIETLY)
|
||||
set(_q QUIET)
|
||||
endif ()
|
||||
|
||||
find_package(NLopt ${NLopt_VERSION} CONFIG ${_q})
|
||||
find_package_handle_standard_args(NLopt CONFIG_MODE)
|
||||
|
||||
# report result
|
||||
if(NLopt_FOUND)
|
||||
message(STATUS "Found NLopt in '${NLopt_DIR}'.")
|
||||
message(STATUS "Using NLopt include directory '${NLopt_INCLUDE_DIR}'.")
|
||||
message(STATUS "Using NLopt library '${NLopt_LIBS}'.")
|
||||
add_library(NLopt::nlopt INTERFACE IMPORTED)
|
||||
set_target_properties(NLopt::nlopt PROPERTIES INTERFACE_LINK_LIBRARIES ${NLopt_LIBS})
|
||||
set_target_properties(NLopt::nlopt PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${NLopt_INCLUDE_DIR})
|
||||
set_target_properties(NLopt::nlopt PROPERTIES INTERFACE_COMPILE_DEFINITIONS "${NLopt_DEFINITIONS}")
|
||||
# target_link_libraries(Nlopt::Nlopt INTERFACE ${NLopt_LIBS})
|
||||
# target_include_directories(Nlopt::Nlopt INTERFACE ${NLopt_INCLUDE_DIR})
|
||||
# target_compile_definitions(Nlopt::Nlopt INTERFACE ${NLopt_DEFINITIONS})
|
||||
else()
|
||||
if(NLopt_FIND_REQUIRED)
|
||||
message(FATAL_ERROR "Unable to find requested NLopt installation:${NLopt_ERROR_REASON}")
|
||||
else()
|
||||
if(NOT NLopt_FIND_QUIETLY)
|
||||
message(STATUS "NLopt was not found:${NLopt_ERROR_REASON}")
|
||||
endif()
|
||||
endif()
|
||||
if(NLopt_FOUND AND NOT _q)
|
||||
get_filename_component(NLOPT_LIBRARY_DIRS ${NLOPT_LIBRARY_DIRS} ABSOLUTE)
|
||||
get_filename_component(NLOPT_INCLUDE_DIRS ${NLOPT_INCLUDE_DIRS} ABSOLUTE)
|
||||
|
||||
message(STATUS "Found NLopt in '${NLOPT_LIBRARY_DIRS}'.")
|
||||
message(STATUS "Using NLopt include directory '${NLOPT_INCLUDE_DIRS}'.")
|
||||
|
||||
get_target_property(_configs NLopt::nlopt IMPORTED_CONFIGURATIONS)
|
||||
foreach (_config ${_configs})
|
||||
get_target_property(_lib NLopt::nlopt IMPORTED_LOCATION_${_config})
|
||||
message(STATUS "Found NLopt ${_config} library: ${_lib}")
|
||||
endforeach ()
|
||||
endif()
|
||||
|
|
|
|||
|
|
@ -1,15 +1,41 @@
|
|||
find_path(LIBNOISE_INCLUDE_DIR libnoise/noise.h)
|
||||
find_library(LIBNOISE_LIBRARY NAMES libnoise libnoise_static liblibnoise_static)
|
||||
find_library(LIBNOISE_LIBRARY_RELEASE NAMES libnoise libnoise_static liblibnoise_static)
|
||||
find_library(LIBNOISE_LIBRARY_DEBUG NAMES libnoised libnoise_staticd liblibnoise_staticd)
|
||||
|
||||
set(libnoise_LIB_FOUND FALSE)
|
||||
if (LIBNOISE_LIBRARY_RELEASE OR LIBNOISE_LIBRARY_DEBUG)
|
||||
set(libnoise_LIB_FOUND TRUE)
|
||||
endif ()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(libnoise DEFAULT_MSG
|
||||
LIBNOISE_LIBRARY
|
||||
libnoise_LIB_FOUND
|
||||
LIBNOISE_INCLUDE_DIR
|
||||
)
|
||||
|
||||
if(libnoise_FOUND)
|
||||
add_library(noise::noise STATIC IMPORTED)
|
||||
|
||||
set_target_properties(noise::noise PROPERTIES
|
||||
IMPORTED_LOCATION "${LIBNOISE_LIBRARY}"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${LIBNOISE_INCLUDE_DIR}"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${LIBNOISE_INCLUDE_DIR}"
|
||||
)
|
||||
if (NOT libnoise_FIND_QUIETLY)
|
||||
message(STATUS "Found libnoise include directory: ${LIBNOISE_INCLUDE_DIR}")
|
||||
if (LIBNOISE_LIBRARY_RELEASE)
|
||||
message(STATUS "Found libnoise RELEASE library: ${LIBNOISE_LIBRARY_RELEASE}")
|
||||
endif ()
|
||||
if (LIBNOISE_LIBRARY_DEBUG)
|
||||
message(STATUS "Found libnoise DEBUG library: ${LIBNOISE_LIBRARY_DEBUG}")
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
if (LIBNOISE_LIBRARY_RELEASE)
|
||||
set_property(TARGET noise::noise APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
|
||||
set_target_properties(noise::noise PROPERTIES IMPORTED_LOCATION_RELEASE ${LIBNOISE_LIBRARY_RELEASE})
|
||||
endif ()
|
||||
|
||||
if (LIBNOISE_LIBRARY_DEBUG)
|
||||
set_property(TARGET noise::noise APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
|
||||
set_target_properties(noise::noise PROPERTIES IMPORTED_LOCATION_DEBUG ${LIBNOISE_LIBRARY_DEBUG})
|
||||
endif ()
|
||||
endif()
|
||||
112
deps/CMakeLists.txt
vendored
|
|
@ -36,6 +36,11 @@ endif()
|
|||
|
||||
project(OrcaSlicer-deps)
|
||||
|
||||
# Backward compatibility for old CMake versions
|
||||
if (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_VERSION VERSION_LESS "3.25")
|
||||
set(LINUX ON CACHE BOOL "" FORCE)
|
||||
endif ()
|
||||
|
||||
include(ExternalProject)
|
||||
include(ProcessorCount)
|
||||
|
||||
|
|
@ -44,9 +49,36 @@ if (NPROC EQUAL 0)
|
|||
set(NPROC 1)
|
||||
endif ()
|
||||
|
||||
set(DESTDIR "${CMAKE_CURRENT_BINARY_DIR}/destdir" CACHE PATH "Destination directory")
|
||||
set(DEP_DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/DL_CACHE CACHE PATH "Path for downloaded source packages.")
|
||||
set(FLATPAK FALSE CACHE BOOL "Toggles various build settings for flatpak, like /usr/local in DESTDIR or not building wxwidgets")
|
||||
|
||||
if ("${DESTDIR}" STREQUAL "" OR "${DESTDIR}" STREQUAL "${AUTOGENERATED_DESTDIR}")
|
||||
if (LINUX AND (NOT DEFINED USE_OLD_DESTDIR_PREV OR USE_OLD_DESTDIR_PREV) AND EXISTS "${CMAKE_BINARY_DIR}/destdir/usr/local" AND NOT EXISTS "${CMAKE_BINARY_DIR}/OrcaSlicer_dep/usr/local")
|
||||
set(USE_OLD_DESTDIR TRUE)
|
||||
message(WARNING "You are using an old directory name for dependencies that is being deprecated. "
|
||||
"Please remove the \"destdir\" directory and rebuild to update to the new name. "
|
||||
"The current \"destdir\" directory will be used until then.")
|
||||
endif ()
|
||||
if (NOT USE_OLD_DESTDIR AND USE_OLD_DESTDIR_PREV)
|
||||
set(REGEN_DESTDIR TRUE)
|
||||
endif ()
|
||||
else ()
|
||||
unset(AUTOGENERATED_DESTDIR CACHE)
|
||||
endif ()
|
||||
|
||||
if ("${DESTDIR}" STREQUAL "" OR REGEN_DESTDIR)
|
||||
if (USE_OLD_DESTDIR) # backward compatibility for old directory name
|
||||
set(DESTDIR "${CMAKE_BINARY_DIR}/destdir" CACHE PATH "Path to dependencies install directory" FORCE)
|
||||
else ()
|
||||
set(DESTDIR "${CMAKE_BINARY_DIR}/OrcaSlicer_dep" CACHE PATH "Path to dependencies install directory" FORCE)
|
||||
endif ()
|
||||
set(DESTDIR_MSG "(generated automatically and saved to cache)")
|
||||
set(AUTOGENERATED_DESTDIR ${DESTDIR} CACHE STRING "Provides the last autogenerated destdir" FORCE)
|
||||
unset(REGEN_DESTDIR CACHE)
|
||||
else ()
|
||||
set(DESTDIR_MSG "(from cache or command line)")
|
||||
endif ()
|
||||
|
||||
if (NOT FLATPAK)
|
||||
set(DESTDIR "${DESTDIR}/usr/local/")
|
||||
endif()
|
||||
|
|
@ -56,15 +88,32 @@ get_property(_is_multi GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
|||
if (_is_multi)
|
||||
option(DEP_DEBUG "Build debug variants (only applicable on Windows)" OFF)
|
||||
option(ORCA_INCLUDE_DEBUG_INFO "Includes debug information in a release build (like RelWithDebInfo) in a way that works with multi-configuration generators and incompatible dependencies. DEP_DEBUG option takes priority over this." OFF)
|
||||
option(AUTO_DEBUG_WORKAROUND "Automatically sets DEP_DEBUG and ORCA_INCLUDE_DEBUG_INFO based on CMAKE_BUILD_TYPE" ON)
|
||||
|
||||
if (AUTO_DEBUG_WORKAROUND)
|
||||
set(DEP_DEBUG OFF)
|
||||
set(ORCA_INCLUDE_DEBUG_INFO OFF)
|
||||
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
set(DEP_DEBUG ON)
|
||||
message(STATUS "DEP_DEBUG has been automatically turned ON due to CMAKE_BUILD_TYPE being set to Debug")
|
||||
elseif (CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
|
||||
set(ORCA_INCLUDE_DEBUG_INFO ON)
|
||||
message(STATUS "ORCA_INCLUDE_DEBUG_INFO has been automatically turned ON due to CMAKE_BUILD_TYPE being set to RelWithDebInfo")
|
||||
endif ()
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||
option(DEP_WX_GTK3 "Build wxWidgets against GTK3" OFF)
|
||||
option(DEP_WX_GTK3 "Build wxWidgets against GTK3" ON)
|
||||
endif()
|
||||
|
||||
set(IS_CROSS_COMPILE FALSE)
|
||||
|
||||
if (APPLE)
|
||||
list(LENGTH CMAKE_OSX_ARCHITECTURES _arch_len)
|
||||
if (_arch_len GREATER 1)
|
||||
message(FATAL_ERROR "OrcaSlicer only supports building for one architecture at a time. Please make sure only one architecture is specified in CMAKE_OSX_ARCHITECTURES")
|
||||
endif ()
|
||||
set(CMAKE_FIND_FRAMEWORK LAST)
|
||||
set(CMAKE_FIND_APPBUNDLE LAST)
|
||||
list(FIND CMAKE_OSX_ARCHITECTURES ${CMAKE_SYSTEM_PROCESSOR} _arch_idx)
|
||||
|
|
@ -87,7 +136,7 @@ endif ()
|
|||
# Slic3r compiles with a different version which will cause runtime errors.
|
||||
# option(DEP_BUILD_IGL_STATIC "Build IGL as a static library. Might cause link errors and increase binary size." OFF)
|
||||
|
||||
message(STATUS "OrcaSlicer deps DESTDIR: ${DESTDIR}")
|
||||
message(STATUS "OrcaSlicer deps DESTDIR: ${DESTDIR} ${DESTDIR_MSG}")
|
||||
message(STATUS "OrcaSlicer download dir for source packages: ${DEP_DOWNLOAD_DIR}")
|
||||
message(STATUS "OrcaSlicer deps debug build: ${DEP_DEBUG}")
|
||||
|
||||
|
|
@ -144,39 +193,26 @@ if (NOT IS_CROSS_COMPILE OR NOT APPLE)
|
|||
BUILD_COMMAND ${CMAKE_COMMAND} --build . --config Release -- ${_build_j}
|
||||
INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config Release
|
||||
)
|
||||
elseif(FLATPAK)
|
||||
# the only reason this is here is because of the HACK at the bottom for ci
|
||||
#
|
||||
# note for future devs: shared libs may actually create a size reduction
|
||||
# but orcaslicer_deps tends to get really funny regarding linking after that (notably boost)
|
||||
# so, as much as I would like to use that, it's not happening
|
||||
ExternalProject_Add(
|
||||
dep_${projectname}
|
||||
EXCLUDE_FROM_ALL ON
|
||||
INSTALL_DIR ${DESTDIR}
|
||||
DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/${projectname}
|
||||
${_gen}
|
||||
CMAKE_ARGS
|
||||
-DCMAKE_INSTALL_PREFIX:STRING=${DESTDIR}
|
||||
-DCMAKE_MODULE_PATH:STRING=${PROJECT_SOURCE_DIR}/../cmake/modules
|
||||
-DCMAKE_PREFIX_PATH:STRING=${DESTDIR}
|
||||
-DCMAKE_DEBUG_POSTFIX:STRING=d
|
||||
-DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER}
|
||||
-DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER}
|
||||
-DCMAKE_TOOLCHAIN_FILE:STRING=${CMAKE_TOOLCHAIN_FILE}
|
||||
-DBUILD_SHARED_LIBS:BOOL=OFF
|
||||
${_cmake_osx_arch}
|
||||
"${_configs_line}"
|
||||
${DEP_CMAKE_OPTS}
|
||||
${P_ARGS_CMAKE_ARGS}
|
||||
${P_ARGS_UNPARSED_ARGUMENTS}
|
||||
BUILD_COMMAND ${CMAKE_COMMAND} --build . --config Release -- ${_build_j}
|
||||
INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config Release
|
||||
# HACK: save space after each compile job, because CI
|
||||
# reasoning: cmake changes directory after this command, so just keep only the folders
|
||||
# so that it can navigate out
|
||||
COMMAND find "${CMAKE_BINARY_DIR}/dep_${projectname}-prefix/" -type f -delete
|
||||
)
|
||||
|
||||
if (FLATPAK)
|
||||
# Free up space during flatpak builds to prevent running out of space during CI/CD
|
||||
|
||||
# note for future devs: shared libs may actually create a size reduction
|
||||
# but orcaslicer_deps tends to get really funny regarding linking after that (notably boost)
|
||||
# so, as much as I would like to use that, it's not happening
|
||||
ExternalProject_Add_Step(dep_${projectname} free_download_space
|
||||
DEPENDEES download # do after download
|
||||
COMMENT "Freeing Space: Removing source archive"
|
||||
WORKING_DIRECTORY ${DEP_DOWNLOAD_DIR}
|
||||
COMMAND ${CMAKE_COMMAND} -E rm -r ${projectname}
|
||||
)
|
||||
ExternalProject_Add_Step(dep_${projectname} free_build_space
|
||||
DEPENDEES install # do after install
|
||||
COMMENT "Freeing Space: Removing source and build files"
|
||||
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/dep_${projectname}-prefix/src
|
||||
COMMAND ${CMAKE_COMMAND} -E rm -rf dep_${projectname} dep_${projectname}-build
|
||||
)
|
||||
endif ()
|
||||
else()
|
||||
ExternalProject_Add(
|
||||
dep_${projectname}
|
||||
|
|
@ -320,10 +356,10 @@ if (NOT JPEG_FOUND)
|
|||
set(JPEG_PKG dep_JPEG)
|
||||
endif()
|
||||
|
||||
# flatpak builds wxwidgets separately
|
||||
# flatpak builds wxwidgets separately, so it is not included in the deps target
|
||||
set(WXWIDGETS_PKG "")
|
||||
include(wxWidgets/wxWidgets.cmake)
|
||||
if (NOT FLATPAK)
|
||||
include(wxWidgets/wxWidgets.cmake)
|
||||
set(WXWIDGETS_PKG "dep_wxWidgets")
|
||||
endif()
|
||||
|
||||
|
|
|
|||
1
deps/OpenCV/OpenCV.cmake
vendored
|
|
@ -53,6 +53,7 @@ orcaslicer_add_cmake_project(OpenCV
|
|||
-DWITH_OPENJPEG=OFF
|
||||
-DWITH_QUIRC=OFF
|
||||
-DWITH_VTK=OFF
|
||||
-DWITH_JPEG=OFF
|
||||
-DWITH_WEBP=OFF
|
||||
-DENABLE_PRECOMPILED_HEADERS=OFF
|
||||
-DINSTALL_TESTS=OFF
|
||||
|
|
|
|||
2
deps/OpenSSL/OpenSSL.cmake
vendored
|
|
@ -8,7 +8,7 @@ else()
|
|||
if(WIN32)
|
||||
set(_cross_arch "VC-WIN64A")
|
||||
elseif(APPLE)
|
||||
set(_cross_arch "darwin64-arm64-cc")
|
||||
set(_cross_arch "darwin64-${CMAKE_OSX_ARCHITECTURES}-cc")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
|
|
|
|||
23
deps/wxWidgets/wxWidgets.cmake
vendored
|
|
@ -1,5 +1,7 @@
|
|||
set(_wx_toolkit "")
|
||||
set(_wx_private_font "-DwxUSE_PRIVATE_FONTS=1")
|
||||
set(_wx_debug_postfix "")
|
||||
set(_wx_shared -DwxBUILD_SHARED=OFF)
|
||||
set(_wx_flatpak_patch "")
|
||||
|
||||
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||
set(_gtk_ver 2)
|
||||
|
|
@ -9,6 +11,11 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
|||
endif ()
|
||||
|
||||
set(_wx_toolkit "-DwxBUILD_TOOLKIT=gtk${_gtk_ver}")
|
||||
if (FLATPAK)
|
||||
set(_wx_debug_postfix "d")
|
||||
set(_wx_shared -DwxBUILD_SHARED=ON -DBUILD_SHARED_LIBS:BOOL=ON)
|
||||
set(_wx_flatpak_patch PATCH_COMMAND ${PATCH_CMD} ${CMAKE_CURRENT_LIST_DIR}/0001-flatpak.patch)
|
||||
endif ()
|
||||
endif()
|
||||
|
||||
if (MSVC)
|
||||
|
|
@ -17,34 +24,29 @@ else ()
|
|||
set(_wx_edge "-DwxUSE_WEBVIEW_EDGE=OFF")
|
||||
endif ()
|
||||
|
||||
# Note: The flatpak build builds wxwidgets separately due to CI size constraints.
|
||||
# ANY CHANGES MADE IN HERE MUST ALSO BE REFLECTED IN `scripts/flatpak/io.github.SoftFever.OrcaSlicer.yml`.
|
||||
# ** THIS INCLUDES BUILD ARGS. **
|
||||
# ...if you can find a way around this size limitation, be my guest.
|
||||
|
||||
orcaslicer_add_cmake_project(
|
||||
wxWidgets
|
||||
GIT_REPOSITORY "https://github.com/SoftFever/Orca-deps-wxWidgets"
|
||||
GIT_SHALLOW ON
|
||||
DEPENDS ${PNG_PKG} ${ZLIB_PKG} ${EXPAT_PKG} ${JPEG_PKG}
|
||||
${_wx_flatpak_patch}
|
||||
CMAKE_ARGS
|
||||
-DwxBUILD_PRECOMP=ON
|
||||
${_wx_toolkit}
|
||||
"-DCMAKE_DEBUG_POSTFIX:STRING="
|
||||
"-DCMAKE_DEBUG_POSTFIX:STRING=${_wx_debug_postfix}"
|
||||
-DwxBUILD_DEBUG_LEVEL=0
|
||||
-DwxBUILD_SAMPLES=OFF
|
||||
-DwxBUILD_SHARED=OFF
|
||||
${_wx_shared}
|
||||
-DwxUSE_MEDIACTRL=ON
|
||||
-DwxUSE_DETECT_SM=OFF
|
||||
-DwxUSE_UNICODE=ON
|
||||
${_wx_private_font}
|
||||
-DwxUSE_PRIVATE_FONTS=ON
|
||||
-DwxUSE_OPENGL=ON
|
||||
-DwxUSE_WEBREQUEST=ON
|
||||
-DwxUSE_WEBVIEW=ON
|
||||
${_wx_edge}
|
||||
-DwxUSE_WEBVIEW_IE=OFF
|
||||
-DwxUSE_REGEX=builtin
|
||||
-DwxUSE_LIBXPM=builtin
|
||||
-DwxUSE_LIBSDL=OFF
|
||||
-DwxUSE_XTEST=OFF
|
||||
-DwxUSE_STC=OFF
|
||||
|
|
@ -53,7 +55,6 @@ orcaslicer_add_cmake_project(
|
|||
-DwxUSE_ZLIB=sys
|
||||
-DwxUSE_LIBJPEG=sys
|
||||
-DwxUSE_LIBTIFF=OFF
|
||||
-DwxUSE_NANOSVG=OFF
|
||||
-DwxUSE_EXPAT=sys
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ project(deps_src)
|
|||
# Header-only libraries (INTERFACE)
|
||||
add_subdirectory(agg)
|
||||
add_subdirectory(ankerl)
|
||||
add_subdirectory(earcut)
|
||||
add_subdirectory(fast_float)
|
||||
add_subdirectory(nanosvg)
|
||||
add_subdirectory(nlohmann)
|
||||
|
|
|
|||
27
deps_src/earcut/CHANGELOG.md
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
## Earcut.hpp changelog
|
||||
|
||||
### master
|
||||
|
||||
- Fixed a bunch of rare edge cases that led to bad triangulation (parity with Earcut v2.2.2)
|
||||
- Removed use of deprecated `std::allocator::construct`
|
||||
- Fixed a minor z-order hashing bug
|
||||
- Improved visualization app, better docs
|
||||
|
||||
### v0.12.4
|
||||
|
||||
- Fixed a crash in Crash in Earcut::findHoleBridge
|
||||
- Added coverage checks
|
||||
- Added macOS, MinGW builds
|
||||
|
||||
### v0.12.3
|
||||
|
||||
- Fixed -Wunused-lambda-capture
|
||||
|
||||
### v0.12.2
|
||||
|
||||
- Fixed potential division by zero
|
||||
- Fixed -fsanitize=integer warning
|
||||
|
||||
### v0.12.1
|
||||
|
||||
- Fixed cast precision warning
|
||||
13
deps_src/earcut/CMakeLists.txt
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
cmake_minimum_required(VERSION 3.13)
|
||||
project(earcut)
|
||||
|
||||
add_library(earcut INTERFACE)
|
||||
|
||||
target_include_directories(earcut SYSTEM
|
||||
INTERFACE
|
||||
${CMAKE_CURRENT_SOURCE_DIR}
|
||||
)
|
||||
|
||||
target_sources(earcut INTERFACE
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/earcut.hpp
|
||||
)
|
||||
15
deps_src/earcut/LICENSE
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
ISC License
|
||||
|
||||
Copyright (c) 2015, Mapbox
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any purpose
|
||||
with or without fee is hereby granted, provided that the above copyright notice
|
||||
and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||||
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
||||
OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
|
||||
THIS SOFTWARE.
|
||||
131
deps_src/earcut/README.md
Normal file
|
|
@ -0,0 +1,131 @@
|
|||
## Earcut
|
||||
|
||||
A C++ port of [earcut.js](https://github.com/mapbox/earcut), a fast, [header-only](https://github.com/mapbox/earcut.hpp/blob/master/include/mapbox/earcut.hpp) polygon triangulation library.
|
||||
|
||||
[](https://travis-ci.com/github/mapbox/earcut.hpp)
|
||||
[](https://ci.appveyor.com/project/Mapbox/earcut-hpp-8wm4o/branch/master)
|
||||
[](https://coveralls.io/github/mapbox/earcut.hpp)
|
||||
[](https://scan.coverity.com/projects/14000)
|
||||
[](http://isitmaintained.com/project/mapbox/earcut.hpp "Average time to resolve an issue")
|
||||
[](http://isitmaintained.com/project/mapbox/earcut.hpp "Percentage of issues still open")
|
||||
[](https://github.com/mourner/projects)
|
||||
|
||||
The library implements a modified ear slicing algorithm, optimized by [z-order curve](http://en.wikipedia.org/wiki/Z-order_curve) hashing and extended to handle holes, twisted polygons, degeneracies and self-intersections in a way that doesn't _guarantee_ correctness of triangulation, but attempts to always produce acceptable results for practical data like geographical shapes.
|
||||
|
||||
It's based on ideas from [FIST: Fast Industrial-Strength Triangulation of Polygons](http://www.cosy.sbg.ac.at/~held/projects/triang/triang.html) by Martin Held and [Triangulation by Ear Clipping](http://www.geometrictools.com/Documentation/TriangulationByEarClipping.pdf) by David Eberly.
|
||||
|
||||
## Usage
|
||||
|
||||
```cpp
|
||||
#include <earcut.hpp>
|
||||
```
|
||||
```cpp
|
||||
// The number type to use for tessellation
|
||||
using Coord = double;
|
||||
|
||||
// The index type. Defaults to uint32_t, but you can also pass uint16_t if you know that your
|
||||
// data won't have more than 65536 vertices.
|
||||
using N = uint32_t;
|
||||
|
||||
// Create array
|
||||
using Point = std::array<Coord, 2>;
|
||||
std::vector<std::vector<Point>> polygon;
|
||||
|
||||
// Fill polygon structure with actual data. Any winding order works.
|
||||
// The first polyline defines the main polygon.
|
||||
polygon.push_back({{100, 0}, {100, 100}, {0, 100}, {0, 0}});
|
||||
// Following polylines define holes.
|
||||
polygon.push_back({{75, 25}, {75, 75}, {25, 75}, {25, 25}});
|
||||
|
||||
// Run tessellation
|
||||
// Returns array of indices that refer to the vertices of the input polygon.
|
||||
// e.g: the index 6 would refer to {25, 75} in this example.
|
||||
// Three subsequent indices form a triangle. Output triangles are clockwise.
|
||||
std::vector<N> indices = mapbox::earcut<N>(polygon);
|
||||
```
|
||||
|
||||
Earcut can triangulate a simple, planar polygon of any winding order including holes. It will even return a robust, acceptable solution for non-simple poygons. Earcut works on a 2D plane. If you have three or more dimensions, you can project them onto a 2D surface before triangulation, or use a more suitable library for the task (e.g [CGAL](https://doc.cgal.org/latest/Triangulation_3/index.html)).
|
||||
|
||||
|
||||
It is also possible to use your custom point type as input. There are default accessors defined for `std::tuple`, `std::pair`, and `std::array`. For a custom type (like Clipper's `IntPoint` type), do this:
|
||||
|
||||
```cpp
|
||||
// struct IntPoint {
|
||||
// int64_t X, Y;
|
||||
// };
|
||||
|
||||
namespace mapbox {
|
||||
namespace util {
|
||||
|
||||
template <>
|
||||
struct nth<0, IntPoint> {
|
||||
inline static auto get(const IntPoint &t) {
|
||||
return t.X;
|
||||
};
|
||||
};
|
||||
template <>
|
||||
struct nth<1, IntPoint> {
|
||||
inline static auto get(const IntPoint &t) {
|
||||
return t.Y;
|
||||
};
|
||||
};
|
||||
|
||||
} // namespace util
|
||||
} // namespace mapbox
|
||||
```
|
||||
|
||||
You can also use a custom container type for your polygon. Similar to std::vector<T>, it has to meet the requirements of [Container](https://en.cppreference.com/w/cpp/named_req/Container), in particular `size()`, `empty()` and `operator[]`.
|
||||
|
||||
<p align="center">
|
||||
<img src="https://camo.githubusercontent.com/01836f8ba21af844c93d8d3145f4e9976025a696/68747470733a2f2f692e696d6775722e636f6d2f67314e704c54712e706e67" alt="example triangulation"/>
|
||||
</p>
|
||||
|
||||
## Additional build instructions
|
||||
In case you just want to use the earcut triangulation library; copy and include the header file [`<earcut.hpp>`](https://github.com/mapbox/earcut.hpp/blob/master/include/mapbox/earcut.hpp) in your project and follow the steps documented in the section [Usage](#usage).
|
||||
|
||||
If you want to build the test, benchmark and visualization programs instead, follow these instructions:
|
||||
|
||||
### Dependencies
|
||||
|
||||
Before you continue, make sure to have the following tools and libraries installed:
|
||||
* git ([Ubuntu](https://help.ubuntu.com/lts/serverguide/git.html)/[Windows/macOS](http://git-scm.com/downloads))
|
||||
* cmake 3.2+ ([Ubuntu](https://launchpad.net/~george-edison55/+archive/ubuntu/cmake-3.x)/[Windows/macOS](https://cmake.org/download/))
|
||||
* OpenGL SDK ([Ubuntu](http://packages.ubuntu.com/de/trusty/libgl1-mesa-dev)/[Windows](https://dev.windows.com/en-us/downloads/windows-10-sdk)/[macOS](https://developer.apple.com/opengl/))
|
||||
* Compiler such as [GCC 4.9+, Clang 3.4+](https://launchpad.net/~ubuntu-toolchain-r/+archive/ubuntu/test), [MSVC12+](https://www.visualstudio.com/)
|
||||
|
||||
Note: On some operating systems such as Windows, manual steps are required to add cmake and [git](http://blog.countableset.ch/2012/06/07/adding-git-to-windows-7-path/) to your PATH environment variable.
|
||||
|
||||
### Manual compilation
|
||||
|
||||
```bash
|
||||
git clone --recursive https://github.com/mapbox/earcut.hpp.git
|
||||
cd earcut.hpp
|
||||
mkdir build
|
||||
cd build
|
||||
cmake ..
|
||||
make
|
||||
# ./tests
|
||||
# ./bench
|
||||
# ./viz
|
||||
```
|
||||
|
||||
### [Visual Studio](https://www.visualstudio.com/), [Eclipse](https://eclipse.org/), [XCode](https://developer.apple.com/xcode/), ...
|
||||
|
||||
```batch
|
||||
git clone --recursive https://github.com/mapbox/earcut.hpp.git
|
||||
cd earcut.hpp
|
||||
mkdir project
|
||||
cd project
|
||||
cmake .. -G "Visual Studio 14 2015"
|
||||
::you can also generate projects for "Visual Studio 12 2013", "XCode", "Eclipse CDT4 - Unix Makefiles"
|
||||
```
|
||||
After completion, open the generated project with your IDE.
|
||||
|
||||
|
||||
### [CLion](https://www.jetbrains.com/clion/), [Visual Studio 2017+](https://www.visualstudio.com/)
|
||||
|
||||
Import the project from https://github.com/mapbox/earcut.hpp.git and you should be good to go!
|
||||
|
||||
## Status
|
||||
|
||||
This is currently based on [earcut 2.2.4](https://github.com/mapbox/earcut#224-jul-5-2022).
|
||||
814
deps_src/earcut/earcut.hpp
Normal file
|
|
@ -0,0 +1,814 @@
|
|||
#pragma once
|
||||
|
||||
#include <algorithm>
|
||||
#include <cassert>
|
||||
#include <cmath>
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <limits>
|
||||
#include <memory>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
namespace mapbox {
|
||||
|
||||
namespace util {
|
||||
|
||||
template <std::size_t I, typename T> struct nth {
|
||||
inline static typename std::tuple_element<I, T>::type
|
||||
get(const T& t) { return std::get<I>(t); };
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
namespace detail {
|
||||
|
||||
template <typename N = uint32_t>
|
||||
class Earcut {
|
||||
public:
|
||||
std::vector<N> indices;
|
||||
std::size_t vertices = 0;
|
||||
|
||||
template <typename Polygon>
|
||||
void operator()(const Polygon& points);
|
||||
|
||||
private:
|
||||
struct Node {
|
||||
Node(N index, double x_, double y_) : i(index), x(x_), y(y_) {}
|
||||
Node(const Node&) = delete;
|
||||
Node& operator=(const Node&) = delete;
|
||||
Node(Node&&) = delete;
|
||||
Node& operator=(Node&&) = delete;
|
||||
|
||||
const N i;
|
||||
const double x;
|
||||
const double y;
|
||||
|
||||
// previous and next vertice nodes in a polygon ring
|
||||
Node* prev = nullptr;
|
||||
Node* next = nullptr;
|
||||
|
||||
// z-order curve value
|
||||
int32_t z = 0;
|
||||
|
||||
// previous and next nodes in z-order
|
||||
Node* prevZ = nullptr;
|
||||
Node* nextZ = nullptr;
|
||||
|
||||
// indicates whether this is a steiner point
|
||||
bool steiner = false;
|
||||
};
|
||||
|
||||
template <typename Ring> Node* linkedList(const Ring& points, const bool clockwise);
|
||||
Node* filterPoints(Node* start, Node* end = nullptr);
|
||||
void earcutLinked(Node* ear, int pass = 0);
|
||||
bool isEar(Node* ear);
|
||||
bool isEarHashed(Node* ear);
|
||||
Node* cureLocalIntersections(Node* start);
|
||||
void splitEarcut(Node* start);
|
||||
template <typename Polygon> Node* eliminateHoles(const Polygon& points, Node* outerNode);
|
||||
Node* eliminateHole(Node* hole, Node* outerNode);
|
||||
Node* findHoleBridge(Node* hole, Node* outerNode);
|
||||
bool sectorContainsSector(const Node* m, const Node* p);
|
||||
void indexCurve(Node* start);
|
||||
Node* sortLinked(Node* list);
|
||||
int32_t zOrder(const double x_, const double y_);
|
||||
Node* getLeftmost(Node* start);
|
||||
bool pointInTriangle(double ax, double ay, double bx, double by, double cx, double cy, double px, double py) const;
|
||||
bool isValidDiagonal(Node* a, Node* b);
|
||||
double area(const Node* p, const Node* q, const Node* r) const;
|
||||
bool equals(const Node* p1, const Node* p2);
|
||||
bool intersects(const Node* p1, const Node* q1, const Node* p2, const Node* q2);
|
||||
bool onSegment(const Node* p, const Node* q, const Node* r);
|
||||
int sign(double val);
|
||||
bool intersectsPolygon(const Node* a, const Node* b);
|
||||
bool locallyInside(const Node* a, const Node* b);
|
||||
bool middleInside(const Node* a, const Node* b);
|
||||
Node* splitPolygon(Node* a, Node* b);
|
||||
template <typename Point> Node* insertNode(std::size_t i, const Point& p, Node* last);
|
||||
void removeNode(Node* p);
|
||||
|
||||
bool hashing;
|
||||
double minX, maxX;
|
||||
double minY, maxY;
|
||||
double inv_size = 0;
|
||||
|
||||
template <typename T, typename Alloc = std::allocator<T>>
|
||||
class ObjectPool {
|
||||
public:
|
||||
ObjectPool() { }
|
||||
ObjectPool(std::size_t blockSize_) {
|
||||
reset(blockSize_);
|
||||
}
|
||||
~ObjectPool() {
|
||||
clear();
|
||||
}
|
||||
template <typename... Args>
|
||||
T* construct(Args&&... args) {
|
||||
if (currentIndex >= blockSize) {
|
||||
currentBlock = alloc_traits::allocate(alloc, blockSize);
|
||||
allocations.emplace_back(currentBlock);
|
||||
currentIndex = 0;
|
||||
}
|
||||
T* object = ¤tBlock[currentIndex++];
|
||||
alloc_traits::construct(alloc, object, std::forward<Args>(args)...);
|
||||
return object;
|
||||
}
|
||||
void reset(std::size_t newBlockSize) {
|
||||
for (auto allocation : allocations) {
|
||||
alloc_traits::deallocate(alloc, allocation, blockSize);
|
||||
}
|
||||
allocations.clear();
|
||||
blockSize = std::max<std::size_t>(1, newBlockSize);
|
||||
currentBlock = nullptr;
|
||||
currentIndex = blockSize;
|
||||
}
|
||||
void clear() { reset(blockSize); }
|
||||
private:
|
||||
T* currentBlock = nullptr;
|
||||
std::size_t currentIndex = 1;
|
||||
std::size_t blockSize = 1;
|
||||
std::vector<T*> allocations;
|
||||
Alloc alloc;
|
||||
typedef typename std::allocator_traits<Alloc> alloc_traits;
|
||||
};
|
||||
ObjectPool<Node> nodes;
|
||||
};
|
||||
|
||||
template <typename N> template <typename Polygon>
|
||||
void Earcut<N>::operator()(const Polygon& points) {
|
||||
// reset
|
||||
indices.clear();
|
||||
vertices = 0;
|
||||
|
||||
if (points.empty()) return;
|
||||
|
||||
double x;
|
||||
double y;
|
||||
int threshold = 80;
|
||||
std::size_t len = 0;
|
||||
|
||||
for (size_t i = 0; threshold >= 0 && i < points.size(); i++) {
|
||||
threshold -= static_cast<int>(points[i].size());
|
||||
len += points[i].size();
|
||||
}
|
||||
|
||||
//estimate size of nodes and indices
|
||||
nodes.reset(len * 3 / 2);
|
||||
indices.reserve(len + points[0].size());
|
||||
|
||||
Node* outerNode = linkedList(points[0], true);
|
||||
if (!outerNode || outerNode->prev == outerNode->next) return;
|
||||
|
||||
if (points.size() > 1) outerNode = eliminateHoles(points, outerNode);
|
||||
|
||||
// if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox
|
||||
hashing = threshold < 0;
|
||||
if (hashing) {
|
||||
Node* p = outerNode->next;
|
||||
minX = maxX = outerNode->x;
|
||||
minY = maxY = outerNode->y;
|
||||
do {
|
||||
x = p->x;
|
||||
y = p->y;
|
||||
minX = std::min<double>(minX, x);
|
||||
minY = std::min<double>(minY, y);
|
||||
maxX = std::max<double>(maxX, x);
|
||||
maxY = std::max<double>(maxY, y);
|
||||
p = p->next;
|
||||
} while (p != outerNode);
|
||||
|
||||
// minX, minY and inv_size are later used to transform coords into integers for z-order calculation
|
||||
inv_size = std::max<double>(maxX - minX, maxY - minY);
|
||||
inv_size = inv_size != .0 ? (32767. / inv_size) : .0;
|
||||
}
|
||||
|
||||
earcutLinked(outerNode);
|
||||
|
||||
nodes.clear();
|
||||
}
|
||||
|
||||
// create a circular doubly linked list from polygon points in the specified winding order
|
||||
template <typename N> template <typename Ring>
|
||||
typename Earcut<N>::Node*
|
||||
Earcut<N>::linkedList(const Ring& points, const bool clockwise) {
|
||||
using Point = typename Ring::value_type;
|
||||
double sum = 0;
|
||||
const std::size_t len = points.size();
|
||||
std::size_t i, j;
|
||||
Node* last = nullptr;
|
||||
|
||||
// calculate original winding order of a polygon ring
|
||||
for (i = 0, j = len > 0 ? len - 1 : 0; i < len; j = i++) {
|
||||
const auto& p1 = points[i];
|
||||
const auto& p2 = points[j];
|
||||
const double p20 = util::nth<0, Point>::get(p2);
|
||||
const double p10 = util::nth<0, Point>::get(p1);
|
||||
const double p11 = util::nth<1, Point>::get(p1);
|
||||
const double p21 = util::nth<1, Point>::get(p2);
|
||||
sum += (p20 - p10) * (p11 + p21);
|
||||
}
|
||||
|
||||
// link points into circular doubly-linked list in the specified winding order
|
||||
if (clockwise == (sum > 0)) {
|
||||
for (i = 0; i < len; i++) last = insertNode(vertices + i, points[i], last);
|
||||
} else {
|
||||
for (i = len; i-- > 0;) last = insertNode(vertices + i, points[i], last);
|
||||
}
|
||||
|
||||
if (last && equals(last, last->next)) {
|
||||
removeNode(last);
|
||||
last = last->next;
|
||||
}
|
||||
|
||||
vertices += len;
|
||||
|
||||
return last;
|
||||
}
|
||||
|
||||
// eliminate colinear or duplicate points
|
||||
template <typename N>
|
||||
typename Earcut<N>::Node*
|
||||
Earcut<N>::filterPoints(Node* start, Node* end) {
|
||||
if (!end) end = start;
|
||||
|
||||
Node* p = start;
|
||||
bool again;
|
||||
do {
|
||||
again = false;
|
||||
|
||||
if (!p->steiner && (equals(p, p->next) || area(p->prev, p, p->next) == 0)) {
|
||||
removeNode(p);
|
||||
p = end = p->prev;
|
||||
|
||||
if (p == p->next) break;
|
||||
again = true;
|
||||
|
||||
} else {
|
||||
p = p->next;
|
||||
}
|
||||
} while (again || p != end);
|
||||
|
||||
return end;
|
||||
}
|
||||
|
||||
// main ear slicing loop which triangulates a polygon (given as a linked list)
|
||||
template <typename N>
|
||||
void Earcut<N>::earcutLinked(Node* ear, int pass) {
|
||||
if (!ear) return;
|
||||
|
||||
// interlink polygon nodes in z-order
|
||||
if (!pass && hashing) indexCurve(ear);
|
||||
|
||||
Node* stop = ear;
|
||||
Node* prev;
|
||||
Node* next;
|
||||
|
||||
// iterate through ears, slicing them one by one
|
||||
while (ear->prev != ear->next) {
|
||||
prev = ear->prev;
|
||||
next = ear->next;
|
||||
|
||||
if (hashing ? isEarHashed(ear) : isEar(ear)) {
|
||||
// cut off the triangle
|
||||
indices.emplace_back(prev->i);
|
||||
indices.emplace_back(ear->i);
|
||||
indices.emplace_back(next->i);
|
||||
|
||||
removeNode(ear);
|
||||
|
||||
// skipping the next vertice leads to less sliver triangles
|
||||
ear = next->next;
|
||||
stop = next->next;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
ear = next;
|
||||
|
||||
// if we looped through the whole remaining polygon and can't find any more ears
|
||||
if (ear == stop) {
|
||||
// try filtering points and slicing again
|
||||
if (!pass) earcutLinked(filterPoints(ear), 1);
|
||||
|
||||
// if this didn't work, try curing all small self-intersections locally
|
||||
else if (pass == 1) {
|
||||
ear = cureLocalIntersections(filterPoints(ear));
|
||||
earcutLinked(ear, 2);
|
||||
|
||||
// as a last resort, try splitting the remaining polygon into two
|
||||
} else if (pass == 2) splitEarcut(ear);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// check whether a polygon node forms a valid ear with adjacent nodes
|
||||
template <typename N>
|
||||
bool Earcut<N>::isEar(Node* ear) {
|
||||
const Node* a = ear->prev;
|
||||
const Node* b = ear;
|
||||
const Node* c = ear->next;
|
||||
|
||||
if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
|
||||
|
||||
// now make sure we don't have other points inside the potential ear
|
||||
Node* p = ear->next->next;
|
||||
|
||||
while (p != ear->prev) {
|
||||
if (pointInTriangle(a->x, a->y, b->x, b->y, c->x, c->y, p->x, p->y) &&
|
||||
area(p->prev, p, p->next) >= 0) return false;
|
||||
p = p->next;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename N>
|
||||
bool Earcut<N>::isEarHashed(Node* ear) {
|
||||
const Node* a = ear->prev;
|
||||
const Node* b = ear;
|
||||
const Node* c = ear->next;
|
||||
|
||||
if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
|
||||
|
||||
// triangle bbox; min & max are calculated like this for speed
|
||||
const double minTX = std::min<double>(a->x, std::min<double>(b->x, c->x));
|
||||
const double minTY = std::min<double>(a->y, std::min<double>(b->y, c->y));
|
||||
const double maxTX = std::max<double>(a->x, std::max<double>(b->x, c->x));
|
||||
const double maxTY = std::max<double>(a->y, std::max<double>(b->y, c->y));
|
||||
|
||||
// z-order range for the current triangle bbox;
|
||||
const int32_t minZ = zOrder(minTX, minTY);
|
||||
const int32_t maxZ = zOrder(maxTX, maxTY);
|
||||
|
||||
// first look for points inside the triangle in increasing z-order
|
||||
Node* p = ear->nextZ;
|
||||
|
||||
while (p && p->z <= maxZ) {
|
||||
if (p != ear->prev && p != ear->next &&
|
||||
pointInTriangle(a->x, a->y, b->x, b->y, c->x, c->y, p->x, p->y) &&
|
||||
area(p->prev, p, p->next) >= 0) return false;
|
||||
p = p->nextZ;
|
||||
}
|
||||
|
||||
// then look for points in decreasing z-order
|
||||
p = ear->prevZ;
|
||||
|
||||
while (p && p->z >= minZ) {
|
||||
if (p != ear->prev && p != ear->next &&
|
||||
pointInTriangle(a->x, a->y, b->x, b->y, c->x, c->y, p->x, p->y) &&
|
||||
area(p->prev, p, p->next) >= 0) return false;
|
||||
p = p->prevZ;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// go through all polygon nodes and cure small local self-intersections
|
||||
template <typename N>
|
||||
typename Earcut<N>::Node*
|
||||
Earcut<N>::cureLocalIntersections(Node* start) {
|
||||
Node* p = start;
|
||||
do {
|
||||
Node* a = p->prev;
|
||||
Node* b = p->next->next;
|
||||
|
||||
// a self-intersection where edge (v[i-1],v[i]) intersects (v[i+1],v[i+2])
|
||||
if (!equals(a, b) && intersects(a, p, p->next, b) && locallyInside(a, b) && locallyInside(b, a)) {
|
||||
indices.emplace_back(a->i);
|
||||
indices.emplace_back(p->i);
|
||||
indices.emplace_back(b->i);
|
||||
|
||||
// remove two nodes involved
|
||||
removeNode(p);
|
||||
removeNode(p->next);
|
||||
|
||||
p = start = b;
|
||||
}
|
||||
p = p->next;
|
||||
} while (p != start);
|
||||
|
||||
return filterPoints(p);
|
||||
}
|
||||
|
||||
// try splitting polygon into two and triangulate them independently
|
||||
template <typename N>
|
||||
void Earcut<N>::splitEarcut(Node* start) {
|
||||
// look for a valid diagonal that divides the polygon into two
|
||||
Node* a = start;
|
||||
do {
|
||||
Node* b = a->next->next;
|
||||
while (b != a->prev) {
|
||||
if (a->i != b->i && isValidDiagonal(a, b)) {
|
||||
// split the polygon in two by the diagonal
|
||||
Node* c = splitPolygon(a, b);
|
||||
|
||||
// filter colinear points around the cuts
|
||||
a = filterPoints(a, a->next);
|
||||
c = filterPoints(c, c->next);
|
||||
|
||||
// run earcut on each half
|
||||
earcutLinked(a);
|
||||
earcutLinked(c);
|
||||
return;
|
||||
}
|
||||
b = b->next;
|
||||
}
|
||||
a = a->next;
|
||||
} while (a != start);
|
||||
}
|
||||
|
||||
// link every hole into the outer loop, producing a single-ring polygon without holes
|
||||
template <typename N> template <typename Polygon>
|
||||
typename Earcut<N>::Node*
|
||||
Earcut<N>::eliminateHoles(const Polygon& points, Node* outerNode) {
|
||||
const size_t len = points.size();
|
||||
|
||||
std::vector<Node*> queue;
|
||||
for (size_t i = 1; i < len; i++) {
|
||||
Node* list = linkedList(points[i], false);
|
||||
if (list) {
|
||||
if (list == list->next) list->steiner = true;
|
||||
queue.push_back(getLeftmost(list));
|
||||
}
|
||||
}
|
||||
std::sort(queue.begin(), queue.end(), [](const Node* a, const Node* b) {
|
||||
return a->x < b->x;
|
||||
});
|
||||
|
||||
// process holes from left to right
|
||||
for (size_t i = 0; i < queue.size(); i++) {
|
||||
outerNode = eliminateHole(queue[i], outerNode);
|
||||
}
|
||||
|
||||
return outerNode;
|
||||
}
|
||||
|
||||
// find a bridge between vertices that connects hole with an outer ring and and link it
|
||||
template <typename N>
|
||||
typename Earcut<N>::Node*
|
||||
Earcut<N>::eliminateHole(Node* hole, Node* outerNode) {
|
||||
Node* bridge = findHoleBridge(hole, outerNode);
|
||||
if (!bridge) {
|
||||
return outerNode;
|
||||
}
|
||||
|
||||
Node* bridgeReverse = splitPolygon(bridge, hole);
|
||||
|
||||
// filter collinear points around the cuts
|
||||
filterPoints(bridgeReverse, bridgeReverse->next);
|
||||
|
||||
// Check if input node was removed by the filtering
|
||||
return filterPoints(bridge, bridge->next);
|
||||
}
|
||||
|
||||
// David Eberly's algorithm for finding a bridge between hole and outer polygon
|
||||
template <typename N>
|
||||
typename Earcut<N>::Node*
|
||||
Earcut<N>::findHoleBridge(Node* hole, Node* outerNode) {
|
||||
Node* p = outerNode;
|
||||
double hx = hole->x;
|
||||
double hy = hole->y;
|
||||
double qx = -std::numeric_limits<double>::infinity();
|
||||
Node* m = nullptr;
|
||||
|
||||
// find a segment intersected by a ray from the hole's leftmost Vertex to the left;
|
||||
// segment's endpoint with lesser x will be potential connection Vertex
|
||||
do {
|
||||
if (hy <= p->y && hy >= p->next->y && p->next->y != p->y) {
|
||||
double x = p->x + (hy - p->y) * (p->next->x - p->x) / (p->next->y - p->y);
|
||||
if (x <= hx && x > qx) {
|
||||
qx = x;
|
||||
m = p->x < p->next->x ? p : p->next;
|
||||
if (x == hx) return m; // hole touches outer segment; pick leftmost endpoint
|
||||
}
|
||||
}
|
||||
p = p->next;
|
||||
} while (p != outerNode);
|
||||
|
||||
if (!m) return 0;
|
||||
|
||||
// look for points inside the triangle of hole Vertex, segment intersection and endpoint;
|
||||
// if there are no points found, we have a valid connection;
|
||||
// otherwise choose the Vertex of the minimum angle with the ray as connection Vertex
|
||||
|
||||
const Node* stop = m;
|
||||
double tanMin = std::numeric_limits<double>::infinity();
|
||||
double tanCur = 0;
|
||||
|
||||
p = m;
|
||||
double mx = m->x;
|
||||
double my = m->y;
|
||||
|
||||
do {
|
||||
if (hx >= p->x && p->x >= mx && hx != p->x &&
|
||||
pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p->x, p->y)) {
|
||||
|
||||
tanCur = std::abs(hy - p->y) / (hx - p->x); // tangential
|
||||
|
||||
if (locallyInside(p, hole) &&
|
||||
(tanCur < tanMin || (tanCur == tanMin && (p->x > m->x || sectorContainsSector(m, p))))) {
|
||||
m = p;
|
||||
tanMin = tanCur;
|
||||
}
|
||||
}
|
||||
|
||||
p = p->next;
|
||||
} while (p != stop);
|
||||
|
||||
return m;
|
||||
}
|
||||
|
||||
// whether sector in vertex m contains sector in vertex p in the same coordinates
|
||||
template <typename N>
|
||||
bool Earcut<N>::sectorContainsSector(const Node* m, const Node* p) {
|
||||
return area(m->prev, m, p->prev) < 0 && area(p->next, m, m->next) < 0;
|
||||
}
|
||||
|
||||
// interlink polygon nodes in z-order
|
||||
template <typename N>
|
||||
void Earcut<N>::indexCurve(Node* start) {
|
||||
assert(start);
|
||||
Node* p = start;
|
||||
|
||||
do {
|
||||
p->z = p->z ? p->z : zOrder(p->x, p->y);
|
||||
p->prevZ = p->prev;
|
||||
p->nextZ = p->next;
|
||||
p = p->next;
|
||||
} while (p != start);
|
||||
|
||||
p->prevZ->nextZ = nullptr;
|
||||
p->prevZ = nullptr;
|
||||
|
||||
sortLinked(p);
|
||||
}
|
||||
|
||||
// Simon Tatham's linked list merge sort algorithm
|
||||
// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html
|
||||
template <typename N>
|
||||
typename Earcut<N>::Node*
|
||||
Earcut<N>::sortLinked(Node* list) {
|
||||
assert(list);
|
||||
Node* p;
|
||||
Node* q;
|
||||
Node* e;
|
||||
Node* tail;
|
||||
int i, numMerges, pSize, qSize;
|
||||
int inSize = 1;
|
||||
|
||||
for (;;) {
|
||||
p = list;
|
||||
list = nullptr;
|
||||
tail = nullptr;
|
||||
numMerges = 0;
|
||||
|
||||
while (p) {
|
||||
numMerges++;
|
||||
q = p;
|
||||
pSize = 0;
|
||||
for (i = 0; i < inSize; i++) {
|
||||
pSize++;
|
||||
q = q->nextZ;
|
||||
if (!q) break;
|
||||
}
|
||||
|
||||
qSize = inSize;
|
||||
|
||||
while (pSize > 0 || (qSize > 0 && q)) {
|
||||
|
||||
if (pSize == 0) {
|
||||
e = q;
|
||||
q = q->nextZ;
|
||||
qSize--;
|
||||
} else if (qSize == 0 || !q) {
|
||||
e = p;
|
||||
p = p->nextZ;
|
||||
pSize--;
|
||||
} else if (p->z <= q->z) {
|
||||
e = p;
|
||||
p = p->nextZ;
|
||||
pSize--;
|
||||
} else {
|
||||
e = q;
|
||||
q = q->nextZ;
|
||||
qSize--;
|
||||
}
|
||||
|
||||
if (tail) tail->nextZ = e;
|
||||
else list = e;
|
||||
|
||||
e->prevZ = tail;
|
||||
tail = e;
|
||||
}
|
||||
|
||||
p = q;
|
||||
}
|
||||
|
||||
tail->nextZ = nullptr;
|
||||
|
||||
if (numMerges <= 1) return list;
|
||||
|
||||
inSize *= 2;
|
||||
}
|
||||
}
|
||||
|
||||
// z-order of a Vertex given coords and size of the data bounding box
|
||||
template <typename N>
|
||||
int32_t Earcut<N>::zOrder(const double x_, const double y_) {
|
||||
// coords are transformed into non-negative 15-bit integer range
|
||||
int32_t x = static_cast<int32_t>((x_ - minX) * inv_size);
|
||||
int32_t y = static_cast<int32_t>((y_ - minY) * inv_size);
|
||||
|
||||
x = (x | (x << 8)) & 0x00FF00FF;
|
||||
x = (x | (x << 4)) & 0x0F0F0F0F;
|
||||
x = (x | (x << 2)) & 0x33333333;
|
||||
x = (x | (x << 1)) & 0x55555555;
|
||||
|
||||
y = (y | (y << 8)) & 0x00FF00FF;
|
||||
y = (y | (y << 4)) & 0x0F0F0F0F;
|
||||
y = (y | (y << 2)) & 0x33333333;
|
||||
y = (y | (y << 1)) & 0x55555555;
|
||||
|
||||
return x | (y << 1);
|
||||
}
|
||||
|
||||
// find the leftmost node of a polygon ring
|
||||
template <typename N>
|
||||
typename Earcut<N>::Node*
|
||||
Earcut<N>::getLeftmost(Node* start) {
|
||||
Node* p = start;
|
||||
Node* leftmost = start;
|
||||
do {
|
||||
if (p->x < leftmost->x || (p->x == leftmost->x && p->y < leftmost->y))
|
||||
leftmost = p;
|
||||
p = p->next;
|
||||
} while (p != start);
|
||||
|
||||
return leftmost;
|
||||
}
|
||||
|
||||
// check if a point lies within a convex triangle
|
||||
template <typename N>
|
||||
bool Earcut<N>::pointInTriangle(double ax, double ay, double bx, double by, double cx, double cy, double px, double py) const {
|
||||
return (cx - px) * (ay - py) >= (ax - px) * (cy - py) &&
|
||||
(ax - px) * (by - py) >= (bx - px) * (ay - py) &&
|
||||
(bx - px) * (cy - py) >= (cx - px) * (by - py);
|
||||
}
|
||||
|
||||
// check if a diagonal between two polygon nodes is valid (lies in polygon interior)
|
||||
template <typename N>
|
||||
bool Earcut<N>::isValidDiagonal(Node* a, Node* b) {
|
||||
return a->next->i != b->i && a->prev->i != b->i && !intersectsPolygon(a, b) && // dones't intersect other edges
|
||||
((locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible
|
||||
(area(a->prev, a, b->prev) != 0.0 || area(a, b->prev, b) != 0.0)) || // does not create opposite-facing sectors
|
||||
(equals(a, b) && area(a->prev, a, a->next) > 0 && area(b->prev, b, b->next) > 0)); // special zero-length case
|
||||
}
|
||||
|
||||
// signed area of a triangle
|
||||
template <typename N>
|
||||
double Earcut<N>::area(const Node* p, const Node* q, const Node* r) const {
|
||||
return (q->y - p->y) * (r->x - q->x) - (q->x - p->x) * (r->y - q->y);
|
||||
}
|
||||
|
||||
// check if two points are equal
|
||||
template <typename N>
|
||||
bool Earcut<N>::equals(const Node* p1, const Node* p2) {
|
||||
return p1->x == p2->x && p1->y == p2->y;
|
||||
}
|
||||
|
||||
// check if two segments intersect
|
||||
template <typename N>
|
||||
bool Earcut<N>::intersects(const Node* p1, const Node* q1, const Node* p2, const Node* q2) {
|
||||
int o1 = sign(area(p1, q1, p2));
|
||||
int o2 = sign(area(p1, q1, q2));
|
||||
int o3 = sign(area(p2, q2, p1));
|
||||
int o4 = sign(area(p2, q2, q1));
|
||||
|
||||
if (o1 != o2 && o3 != o4) return true; // general case
|
||||
|
||||
if (o1 == 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1
|
||||
if (o2 == 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1
|
||||
if (o3 == 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2
|
||||
if (o4 == 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// for collinear points p, q, r, check if point q lies on segment pr
|
||||
template <typename N>
|
||||
bool Earcut<N>::onSegment(const Node* p, const Node* q, const Node* r) {
|
||||
return q->x <= std::max<double>(p->x, r->x) &&
|
||||
q->x >= std::min<double>(p->x, r->x) &&
|
||||
q->y <= std::max<double>(p->y, r->y) &&
|
||||
q->y >= std::min<double>(p->y, r->y);
|
||||
}
|
||||
|
||||
template <typename N>
|
||||
int Earcut<N>::sign(double val) {
|
||||
return (0.0 < val) - (val < 0.0);
|
||||
}
|
||||
|
||||
// check if a polygon diagonal intersects any polygon segments
|
||||
template <typename N>
|
||||
bool Earcut<N>::intersectsPolygon(const Node* a, const Node* b) {
|
||||
const Node* p = a;
|
||||
do {
|
||||
if (p->i != a->i && p->next->i != a->i && p->i != b->i && p->next->i != b->i &&
|
||||
intersects(p, p->next, a, b)) return true;
|
||||
p = p->next;
|
||||
} while (p != a);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// check if a polygon diagonal is locally inside the polygon
|
||||
template <typename N>
|
||||
bool Earcut<N>::locallyInside(const Node* a, const Node* b) {
|
||||
return area(a->prev, a, a->next) < 0 ?
|
||||
area(a, b, a->next) >= 0 && area(a, a->prev, b) >= 0 :
|
||||
area(a, b, a->prev) < 0 || area(a, a->next, b) < 0;
|
||||
}
|
||||
|
||||
// check if the middle Vertex of a polygon diagonal is inside the polygon
|
||||
template <typename N>
|
||||
bool Earcut<N>::middleInside(const Node* a, const Node* b) {
|
||||
const Node* p = a;
|
||||
bool inside = false;
|
||||
double px = (a->x + b->x) / 2;
|
||||
double py = (a->y + b->y) / 2;
|
||||
do {
|
||||
if (((p->y > py) != (p->next->y > py)) && p->next->y != p->y &&
|
||||
(px < (p->next->x - p->x) * (py - p->y) / (p->next->y - p->y) + p->x))
|
||||
inside = !inside;
|
||||
p = p->next;
|
||||
} while (p != a);
|
||||
|
||||
return inside;
|
||||
}
|
||||
|
||||
// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits
|
||||
// polygon into two; if one belongs to the outer ring and another to a hole, it merges it into a
|
||||
// single ring
|
||||
template <typename N>
|
||||
typename Earcut<N>::Node*
|
||||
Earcut<N>::splitPolygon(Node* a, Node* b) {
|
||||
Node* a2 = nodes.construct(a->i, a->x, a->y);
|
||||
Node* b2 = nodes.construct(b->i, b->x, b->y);
|
||||
Node* an = a->next;
|
||||
Node* bp = b->prev;
|
||||
|
||||
a->next = b;
|
||||
b->prev = a;
|
||||
|
||||
a2->next = an;
|
||||
an->prev = a2;
|
||||
|
||||
b2->next = a2;
|
||||
a2->prev = b2;
|
||||
|
||||
bp->next = b2;
|
||||
b2->prev = bp;
|
||||
|
||||
return b2;
|
||||
}
|
||||
|
||||
// create a node and util::optionally link it with previous one (in a circular doubly linked list)
|
||||
template <typename N> template <typename Point>
|
||||
typename Earcut<N>::Node*
|
||||
Earcut<N>::insertNode(std::size_t i, const Point& pt, Node* last) {
|
||||
Node* p = nodes.construct(static_cast<N>(i), util::nth<0, Point>::get(pt), util::nth<1, Point>::get(pt));
|
||||
|
||||
if (!last) {
|
||||
p->prev = p;
|
||||
p->next = p;
|
||||
|
||||
} else {
|
||||
assert(last);
|
||||
p->next = last->next;
|
||||
p->prev = last;
|
||||
last->next->prev = p;
|
||||
last->next = p;
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
template <typename N>
|
||||
void Earcut<N>::removeNode(Node* p) {
|
||||
p->next->prev = p->prev;
|
||||
p->prev->next = p->next;
|
||||
|
||||
if (p->prevZ) p->prevZ->nextZ = p->nextZ;
|
||||
if (p->nextZ) p->nextZ->prevZ = p->prevZ;
|
||||
}
|
||||
}
|
||||
|
||||
template <typename N = uint32_t, typename Polygon>
|
||||
std::vector<N> earcut(const Polygon& poly) {
|
||||
mapbox::detail::Earcut<N> earcut;
|
||||
earcut(poly);
|
||||
return std::move(earcut.indices);
|
||||
}
|
||||
}
|
||||
|
|
@ -228,5 +228,7 @@ namespace ImGui
|
|||
const wchar_t OpenHoverDarkButton = 0x085B;
|
||||
|
||||
// void MyFunction(const char* name, const MyMatrix44& v);
|
||||
|
||||
const wchar_t FilamentGreen = 0x0850;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -152,6 +152,7 @@ OrcaSlicer is a powerful open source slicer for FFF (FDM) 3D Printers. This wiki
|
|||
 This is a documentation from someone exploring the code and is by no means complete or even completely accurate. Please edit the parts you might find inaccurate. This is probably going to be helpful nonetheless.
|
||||
|
||||
- [How to build OrcaSlicer](How-to-build)
|
||||
- [How to run tests](How-to-test)
|
||||
- [Localization and translation guide](Localization_guide)
|
||||
- [How to create profiles](How-to-create-profiles)
|
||||
- [How to contribute to the wiki](How-to-wiki)
|
||||
|
|
|
|||
|
|
@ -2,69 +2,132 @@
|
|||
|
||||
Cornering is a critical aspect of 3D printing that affects print quality and accuracy. It's how the printer handles changes in direction during movement, particularly at corners and curves. Proper cornering settings can reduce artifacts such as ringing, ghosting, and overshooting, resulting in cleaner and more precise prints.
|
||||
|
||||
## Jerk
|
||||
## Types of Cornering Settings
|
||||
|
||||
TODO: Jerk calibration not implemented yet.
|
||||
> [!TIP]
|
||||
> Read more in [Jerk XY](speed_settings_jerk_xy) and check [Cornering Control Types](speed_settings_jerk_xy#cornering-control-types)
|
||||
|
||||
## Junction Deviation
|
||||
## Calibration
|
||||
|
||||
Junction Deviation is the default method for controlling cornering speed in **Marlin firmware (Marlin 2.x)**.
|
||||
Higher values allow more aggressive cornering, while lower values produce smoother, more controlled corners.
|
||||
The default value in Marlin is often `0.08mm`, which may be too high for some printers and may cause ringing. Consider lowering this value to reduce ringing, but avoid setting it too low that could lead to excessively slow cornering speed.
|
||||
This test will be set detect automatically your printer firmware type and will adapt to the specific calibration process.
|
||||
|
||||
```math
|
||||
JD = 0.4 \cdot \frac{\text{Jerk}^2}{\text{Acceleration}}
|
||||
```
|
||||
- Klipper: [square_corner_velocity](https://www.klipper3d.org/Config_Reference.html#printer)
|
||||
- Marlin 2:
|
||||
- [Junction Deviation](https://marlinfw.org/docs/configuration/configuration.html#junction-deviation-) if `Maximum Junction Deviation` in Printer settings/Motion ability/Jerk limitations is bigger than `0`.
|
||||
- [Classic Jerk](https://marlinfw.org/docs/configuration/configuration.html#jerk-) if `Maximum Junction Deviation` is set to `0`.
|
||||
- Marlin Legacy: [Classic Jerk](https://marlinfw.org/docs/configuration/configuration.html#jerk-).
|
||||
- RepRap: [Maximum instantaneous speed changes](https://docs.duet3d.com/User_manual/Reference/Gcodes#m566-set-allowable-instantaneous-speed-change)
|
||||
|
||||
> [!NOTE]
|
||||
> This calibration example uses Junction Deviation as an example. The process is similar for Jerk calibration; just read the Jerk values instead of JD values.
|
||||
> JD values are between `0.0` and `0.3` (in mm) while Jerk values are usually between `1` and `20` or higher (in mm/s).
|
||||
|
||||
1. Pre-requisites:
|
||||
1. Check if your printer has Junction Deviation enabled. Look for `Junction deviation` in the printer's advanced settings.
|
||||
1. If using Marlin 2 firmware, Check if your printer has Junction Deviation enabled. Look for `Junction deviation` in the printer's advanced settings.
|
||||
2. In OrcaSlicer, set:
|
||||
1. Acceleration high enough to trigger ringing (e.g., 2000 mm/s²).
|
||||
1. Acceleration high enough to trigger ringing or the speed you want to check out (e.g., 2000 mm/s²).
|
||||
2. Speed high enough to trigger ringing (e.g., 100 mm/s).
|
||||
3. Use an opaque, high-gloss filament to make ringing more visible.
|
||||
2. You need to print the Junction Deviation test.
|
||||
2. Open the Cornering test.
|
||||

|
||||
1. Measure the X and Y heights and read the frequency set at that point in OrcaSlicer.
|
||||
1. In this first approximation, set a wide range of Start and End values.
|
||||
- If you don't see any loss of quality, increase the End value and retry.
|
||||
- If you do see a loss of quality, measure the maximum height when the corners start losing sharpness and read the Cornering/Jerk/JunctionDeviation value set at that point in OrcaSlicer.
|
||||

|
||||

|
||||
2. You will likely need values lower than `0.08mm`, as in the example. To find a better maximum JD value, print a new calibration tower with a maximum set near the point where corners start losing sharpness.
|
||||
3. Print the second Junction Deviation test with the new maximum value.
|
||||
2. Print a new calibration tower with a maximum set near the point where corners start losing sharpness.
|
||||
**RECOMMENDED:** Use the *Ringing Tower* test model to more easily visualize the jerk limit.
|
||||
3. Print the second Cornering test with the new maximum value.
|
||||

|
||||
4. Measure the X and Y heights and read the frequency set at that point in OrcaSlicer.
|
||||
4. Measure the maximum height when the corners start losing sharpness and read the Cornering/Jerk/JunctionDeviation value set at that point in OrcaSlicer.
|
||||

|
||||

|
||||
3. Save the settings
|
||||
1. Set your Maximum Junction Deviation value in [Printer settings/Motion ability/Jerk limitation].
|
||||

|
||||
2. Use the following G-code to set the value:
|
||||
- Into your OrcaSlicer printer profile (**RECOMMENDED**):
|
||||
1. Go to Printer settings → Motion ability → Jerk limitation:
|
||||
2. Set your maximum Jerk X and Y or Junction Deviation values.
|
||||

|
||||
- Directly into your printer firmware:
|
||||
- Restore your 3D Printer settings to avoid keeping high acceleration and jerk values used for the test.
|
||||
|
||||
```gcode
|
||||
M205 J#JunctionDeviationValue
|
||||
M500
|
||||
```
|
||||
- Klipper:
|
||||
- Skeleton
|
||||
|
||||
Example
|
||||
```gcode
|
||||
SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY=#SquareCornerVelocity
|
||||
```
|
||||
|
||||
```gcode
|
||||
M205 J0.012
|
||||
M500
|
||||
```
|
||||
Example:
|
||||
|
||||
3. Recompile your MarlinFW
|
||||
1. In Configuration.h uncomment and set:
|
||||
```gcode
|
||||
SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY=5.0
|
||||
```
|
||||
|
||||
```cpp
|
||||
#define JUNCTION_DEVIATION_MM 0.012 // (mm) Distance from real junction edge
|
||||
```
|
||||
Note: You can also set `square_corner_velocity` persistently in your `printer.cfg` (restart required).
|
||||
|
||||
2. Ensure Classic Jerk is disabled (commented out):
|
||||
- Marlin 2 (Junction Deviation enabled):
|
||||
- Skeleton
|
||||
|
||||
```cpp
|
||||
//#define CLASSIC_JERK
|
||||
```
|
||||
```gcode
|
||||
M205 J#JunctionDeviationValue
|
||||
M500
|
||||
```
|
||||
|
||||
Example:
|
||||
|
||||
```gcode
|
||||
M205 J0.012
|
||||
M500
|
||||
```
|
||||
|
||||
- To make the change permanent in firmware, set in `Configuration.h` and recompile:
|
||||
|
||||
```cpp
|
||||
#define JUNCTION_DEVIATION_MM 0.012 // (mm) Distance from real junction edge
|
||||
```
|
||||
|
||||
Also ensure classic jerk is disabled if using junction deviation:
|
||||
|
||||
```cpp
|
||||
//#define CLASSIC_JERK
|
||||
```
|
||||
|
||||
- Marlin Classic Jerk / Marlin Legacy:
|
||||
- Skeleton — set the per-axis jerk limits using `M205` (X/Y optional depending on firmware build):
|
||||
|
||||
```gcode
|
||||
M205 X#JerkX Y#JerkY
|
||||
M500
|
||||
```
|
||||
|
||||
Example:
|
||||
|
||||
```gcode
|
||||
M205 X10 Y10
|
||||
M500
|
||||
```
|
||||
|
||||
- RepRap (Duet / RepRapFirmware):
|
||||
**IMPORTANT:** Set in mm/min so convert from mm/s to mm/min multiply by 60.
|
||||
- Skeleton
|
||||
|
||||
```gcode
|
||||
M566 X#max_instantaneous_change Y#max_instantaneous_change
|
||||
M500 ; if supported by your board
|
||||
```
|
||||
|
||||
Example (Duet-style):
|
||||
|
||||
```gcode
|
||||
M566 X3000 Y3000
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> RepRapFirmware exposes `M566` to set allowable instantaneous speed changes; some boards may persist settings with `M500` or via their web/config files.
|
||||
|
||||
## Credits
|
||||
|
||||
- **Junction Deviation Machine Limit** [@RF47](https://github.com/RF47)
|
||||
- **Junction Deviation Calibration** [@IanAlexis](https://github.com/IanAlexis)
|
||||
- **Cornering Calibration** [@IanAlexis](https://github.com/IanAlexis)
|
||||
- **Fast tower model** [@RF47](https://github.com/RF47)
|
||||
- **SCV-V2 model** [@chrisheib](https://www.thingiverse.com/chrisheib)
|
||||
|
|
|
|||
|
|
@ -2,130 +2,124 @@
|
|||
|
||||
During high-speed movements, vibrations can cause a phenomenon called "ringing," where periodic ripples appear on the print surface. Input Shaping provides an effective solution by counteracting these vibrations, improving print quality and reducing wear on components without needing to significantly lower print speeds.
|
||||
|
||||
- [Klipper](#klipper)
|
||||
- [Resonance Compensation](#resonance-compensation)
|
||||
- [Marlin](#marlin)
|
||||
- [ZV Input Shaping](#zv-input-shaping)
|
||||
> [!IMPORTANT]
|
||||
> RepRap can only set one frequency for both X and Y axes so you will need to select a frequency that works well for both axes.
|
||||
|
||||
- [Types](#types)
|
||||
- [Default](#default)
|
||||
- [Version Table](#version-table)
|
||||
- [Calibration Steps](#calibration-steps)
|
||||
- [Fixed-Time Motion](#fixed-time-motion)
|
||||
- [Credits](#credits)
|
||||
|
||||
## Klipper
|
||||
## Types
|
||||
|
||||
### Resonance Compensation
|
||||
It is usually recommended to use MZV, EI (specially for Delta printers) or ZV as a simple and effective solution.
|
||||
Not all Input Shaping types are available in all firmware and their performance may vary depending on the firmware implementation and the printer's mechanics.
|
||||
|
||||
The Klipper Resonance Compensation is a set of Input Shaping modes that can be used to reduce ringing and improve print quality.
|
||||
Ussualy the recommended values modes are `MZV` or `EI` for Delta printers.
|
||||
### Default
|
||||
|
||||
1. Pre-requisites:
|
||||
1. In OrcaSlicer, set:
|
||||
1. Acceleration high enough to trigger ringing (e.g., 2000 mm/s²).
|
||||
2. Speed high enough to trigger ringing (e.g., 100 mm/s).
|
||||
When "Default" is selected, the firmware's default input shaper will be used.
|
||||
Every firmware and even its version may have a different default type but usually are:
|
||||
|
||||
> [!NOTE]
|
||||
> These settings depend on your printer's motion ability and the filament's max volumetric speed. If you can't reach speeds that cause ringing, try increasing the filament's max volumetric speed (avoid materials below 10 mm³/s).
|
||||
3. Jerk [Klipper Square Corner Velocity](https://www.klipper3d.org/Kinematics.html?h=square+corner+velocity#look-ahead) to 5 or a high value (e.g., 20).
|
||||
- Klipper: MZV
|
||||
- Marlin: ZV
|
||||
- RepRap:
|
||||
- Version >= 3.4: MZV
|
||||
- Version < 3.4: DAA
|
||||
- Version < 3.2: DAA (without damping option)
|
||||
|
||||
2. In printer settigs:
|
||||
1. Set the Shaper Type to `MZV` or `EI`.
|
||||
```gcode
|
||||
SET_INPUT_SHAPER SHAPER_TYPE=MZV
|
||||
```
|
||||
2. Disable [Minimun Cruise Ratio](https://www.klipper3d.org/Kinematics.html#minimum-cruise-ratio) with:
|
||||
```gcode
|
||||
SET_VELOCITY_LIMIT MINIMUM_CRUISE_RATIO=0
|
||||
```
|
||||
3. Use an opaque, high-gloss filament to make the ringing more visible.
|
||||
2. Print the Input Shaping Frequency test with a range of frequencies.
|
||||
### Version Table
|
||||
|
||||

|
||||
| Type | Name | [Klipper](https://www.klipper3d.org/Resonance_Compensation.html#technical-details) | [RepRap](https://docs.duet3d.com/User_manual/Reference/Gcodes#m593-configure-input-shaping) | [Marlin 2](https://marlinfw.org/docs/features/ft_motion.html#more-complexity-zv-input-shaper) | Marlin Legacy |
|
||||
|---|---|---|---|---|---|
|
||||
| MZV | Modified Zero Vibration | >=0.9.0 | >=3.4 | - | - |
|
||||
| ZV | Zero Vibration | >=0.9.0 | = 3.5 | >2.1.2 | - |
|
||||
| ZVD | Zero Vibration Derivative | >=0.9.0 | >=3.4 | - | - |
|
||||
| ZVDD | Zero Vibration Double Derivative | - | >=3.4 | - | - |
|
||||
| ZVDDD | Zero Vibration Triple Derivative | - | >=3.4 | - | - |
|
||||
| EI | Extra Insensitive | >=0.9.0 | - | - | - |
|
||||
| 2HUMP_EI / EI2 | Two-Hump Extra Insensitive | >=0.9.0 | >=3.4 | - | - |
|
||||
| 3HUMP_EI / EI3 | Three-Hump Extra Insensitive | >=0.9.0 | >=3.4 | - | - |
|
||||
| [FT_MOTION](https://marlinfw.org/docs/features/ft_motion.html#fixed-time-motion-by-ulendo) | Fixed-Time Motion | - | - | >2.1.3 | - |
|
||||
| DAA | Damped Anti-Resonance | - | < 3.4 | - | - |
|
||||
|
||||
1. Measure the X and Y heights and read the frequency set at that point in OrcaSlicer.
|
||||
## Calibration Steps
|
||||
|
||||

|
||||

|
||||
|
||||
2. If not a clear result, you can measure a X and Y min and max acceptable heights and repeat the test with that min and max value.
|
||||
|
||||
> [!WARNING]
|
||||
> There is a chance you will need to set higher than 60Hz frequencies. Some printers with very rigid frames and excellent mechanics may exhibit frequencies exceeding 100Hz.
|
||||
|
||||
3. Print the Damping test setting your X and Y frequency to the value you found in the previous step.
|
||||
|
||||

|
||||
|
||||
1. Measure the X and Y heights and read the damping set at that point in OrcaSlicer.
|
||||
|
||||

|
||||

|
||||
0. Pre-requisites:
|
||||
1. Use an opaque, high-gloss filament to make the ringing more visible.
|
||||
2. In OrcaSlicer, set:
|
||||
1. Acceleration high enough to trigger ringing (e.g., 20000 mm/s²).
|
||||
2. Speed high enough to trigger ringing (e.g., 200 mm/s).
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Not all Resonance Compensation modes support damping.
|
||||
|
||||
4. Restore your 3D Printer settings to avoid keep using high acceleration and jerk values.
|
||||
5. Save the settings
|
||||
1. You need to go to the printer settings and set the X and Y frequency and damp to the value you found in the previous step.
|
||||
|
||||
## Marlin
|
||||
|
||||
### ZV Input Shaping
|
||||
|
||||
ZV Input Shaping introduces an anti-vibration signal into the stepper motion for the X and Y axes. It works by splitting the step count into two halves: the first at half the frequency and the second as an "echo," delayed by half the ringing interval. This simple approach effectively reduces vibrations, improving print quality and allowing for higher speeds.
|
||||
|
||||
1. Pre-requisites:
|
||||
1. In OrcaSlicer, set:
|
||||
1. Acceleration high enough to trigger ringing (e.g., 2000 mm/s²).
|
||||
2. Speed high enough to trigger ringing (e.g., 100 mm/s).
|
||||
|
||||
> [!NOTE]
|
||||
> These settings depend on your printer's motion ability and the filament's max volumetric speed. If you can't reach speeds that cause ringing, try increasing the filament's max volumetric speed (avoid materials below 10 mm³/s).
|
||||
|
||||
3. Jerk
|
||||
1. If using [Classic Jerk](https://marlinfw.org/docs/configuration/configuration.html#jerk-) use a high value (e.g., 20).
|
||||
2. If using [Junction Deviation](https://marlinfw.org/docs/features/junction_deviation.html) (new Marlin default mode) this test will use 0.25 (high enough to most printers).
|
||||
2. Use an opaque, high-gloss filament to make the ringing more visible.
|
||||
2. Print the Input Shaping Frequency test with a range of frequencies.
|
||||
> It's recommended to use the fastest [acceleration](speed_settings_acceleration), [speed](speed_settings_other_layers_speed) and [Jerk/Junction Deviation](speed_settings_jerk_xy) your printer can handle without losing steps.
|
||||
> This test **will set the values to high values** limited by your printer's motion ability and the filament's max volumetric speed (avoid materials below 10 mm³/s).
|
||||
|
||||
1. Select the Test Model ´Ringing Tower´ (Recommended) or ´Fast Tower´ (Reduced version useful for printers with high ringing).
|
||||
2. Select the [Input Shaper Type](#types) you want to test. Each firmware has different types available and each type has different performance.
|
||||
3. Select a range of frequencies to test. The Default 15hz to 110hz range is usually a good start.
|
||||
4. Select your damping. Usually, a value between 0.1 and 0.2 is a good start but you can change it to 0 and your printer will use the firmware default value (if available).
|
||||

|
||||
|
||||
1. Measure the X and Y heights and read the frequency set at that point in OrcaSlicer.
|
||||
|
||||

|
||||

|
||||
|
||||
1. Measure the X and Y heights and read the frequency set at that point in OrcaSlicer.
|
||||

|
||||
- Marlin:
|
||||

|
||||
- Klipper:
|
||||

|
||||
2. If not a clear result, you can measure a X and Y min and max acceptable heights and repeat the test with that min and max value.
|
||||
|
||||
> [!WARNING]
|
||||
> There is a chance you will need to set higher than 60Hz frequencies. Some printers with very rigid frames and excellent mechanics may exhibit frequencies exceeding 100Hz.
|
||||
|
||||
3. Print the Damping test setting your X and Y frequency to the value you found in the previous step.
|
||||
|
||||
5. Print the Damping test setting your X and Y frequency to the value you found in the previous step.
|
||||

|
||||
1. Measure the X and Y heights and read the damping set at that point in OrcaSlicer.
|
||||

|
||||
- Marlin:
|
||||

|
||||
- Klipper:
|
||||

|
||||
|
||||
1. Measure the X and Y heights and read the damping set at that point in OrcaSlicer.
|
||||
|
||||

|
||||

|
||||
|
||||
4. Restore your 3D Printer settings to avoid keep using high acceleration and jerk values.
|
||||
1. Reboot your printer.
|
||||
2. Use the following G-code to restore your printer settings:
|
||||
```gcode
|
||||
M501
|
||||
```
|
||||
5. Save the settings
|
||||
1. You need to go to the printer settings and set the X and Y frequency and damp to the value you found in the previous step.
|
||||
2. Use the following G-code to set the frequency:
|
||||
```gcode
|
||||
M593 X F#Xfrequency D#XDamping
|
||||
M593 Y F#Yfrequency D#YDamping
|
||||
M500
|
||||
```
|
||||
Example
|
||||
```gcode
|
||||
M593 X F37.25 D0.16
|
||||
M593 Y F37.5 D0.06
|
||||
M500
|
||||
```
|
||||
6. **Restore your 3D Printer settings to avoid keep using high acceleration and jerk values.**
|
||||
7. Save the settings
|
||||
- Into your printer firmware settings save the values you found (Type, frequency/cies and damp)
|
||||
- Save it into Orca's printer profile settings in Printer settings/ Machine G-code/ Machine start G-code using the following G-code:
|
||||
- Klipper:
|
||||
- Skeleton
|
||||
```gcode
|
||||
SET_INPUT_SHAPER SHAPER_TYPE=TYPE SHAPER_FREQ_X=#Xfrequency DAMPING_RATIO_X=#XDamping SHAPER_FREQ_Y=#Yfrequency DAMPING_RATIO_Y=#YDamping
|
||||
```
|
||||
Example
|
||||
```gcode
|
||||
SET_INPUT_SHAPER SHAPER_TYPE=MZV SHAPER_FREQ_X=37.25 DAMPING_RATIO_X=0.16 SHAPER_FREQ_Y=37.5 DAMPING_RATIO_Y=0.06
|
||||
```
|
||||
- Marlin:
|
||||
- Skeleton
|
||||
```gcode
|
||||
M593 X F#Xfrequency D#XDamping
|
||||
M593 Y F#Yfrequency D#YDamping
|
||||
M500
|
||||
```
|
||||
Example
|
||||
```gcode
|
||||
M593 X F37.25 D0.16
|
||||
M593 Y F37.5 D0.06
|
||||
M500
|
||||
```
|
||||
- RepRap:
|
||||
- Skeleton for RepRap 3.3 and later
|
||||
```gcode
|
||||
M593 P#Type F#frequency S#Damping
|
||||
```
|
||||
Example RepRap 3.4 and later
|
||||
```gcode
|
||||
M593 P"ZVD" F37.25 S0.16
|
||||
```
|
||||
- Skeleton for RepRap 3.2 and earlier
|
||||
```gcode
|
||||
M593 F#frequency
|
||||
```
|
||||
Example Legacy (RepRap 3.2 and earlier)
|
||||
```gcode
|
||||
M593 F37.25
|
||||
```
|
||||
|
||||
### Fixed-Time Motion
|
||||
|
||||
|
|
|
|||
|
|
@ -84,19 +84,34 @@ How to building with Visual Studio 2022 on Windows 64-bit.
|
|||
```
|
||||
|
||||
> [!NOTE]
|
||||
> The build process will take a long time depending on your system but even with high-end hardware it can take up to 40 minutes.
|
||||
|
||||
> [!TIP]
|
||||
> If you encounter issues, you can try to uninstall ZLIB from your Vcpkg library.
|
||||
|
||||
3. If successful, you will find the VS 2022 solution file in:
|
||||
3. If successful, you will find the Visual Studio solution file in:
|
||||
```shell
|
||||
build\OrcaSlicer.sln
|
||||
```
|
||||
4. Open the solution in Visual Studio, set the build configuration to `Release` and run the `Local Windows Debugger`.
|
||||

|
||||
5. Your resulting executable will be located in:
|
||||
```shell
|
||||
\build\src\Release\orca-slicer.exe
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> The first time you build a branch, it will take a long time.
|
||||
> Changes to .cpp files are quickly compiled.
|
||||
> Changes to .hpp files take longer, depending on what you change.
|
||||
> If you switch back and forth between branches, it also takes a long time to rebuild, even if you haven't made any changes.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Make sure that CMake version 3.31.x is actually being used. Run `cmake --version` and verify it returns a **3.31.x** version.
|
||||
> If you see an older version (e.g. 3.29), it's likely due to another copy in your system's PATH (e.g. from Strawberry Perl).
|
||||
> You can run where cmake to check the active paths and rearrange your **System Environment Variables** > PATH, ensuring the correct CMake (e.g. C:\Program Files\CMake\bin) appears before others like C:\Strawberry\c\bin.
|
||||
|
||||
> [!NOTE]
|
||||
> [!TIP]
|
||||
> If the build fails, try deleting the `build/` and `deps/build/` directories to clear any cached build data. Rebuilding after a clean-up is usually sufficient to resolve most issues.
|
||||
|
||||
## MacOS 64-bit
|
||||
|
|
@ -264,9 +279,9 @@ The build system supports multiple Linux distributions including Ubuntu/Debian a
|
|||
./build_linux.sh -d
|
||||
```
|
||||
|
||||
3. **Build OrcaSlicer:**
|
||||
3. **Build OrcaSlicer with tests:**
|
||||
```shell
|
||||
./build_linux.sh -s
|
||||
./build_linux.sh -st
|
||||
```
|
||||
|
||||
4. **Build AppImage (optional):**
|
||||
|
|
@ -276,14 +291,15 @@ The build system supports multiple Linux distributions including Ubuntu/Debian a
|
|||
|
||||
5. **All-in-one build (recommended):**
|
||||
```shell
|
||||
./build_linux.sh -dsi
|
||||
./build_linux.sh -dsti
|
||||
```
|
||||
|
||||
**Additional build options:**
|
||||
|
||||
- `-b`: Build in debug mode
|
||||
- `-b`: Build in debug mode (mostly broken at runtime for a long time; avoid unless you want to be fixing failed assertions)
|
||||
- `-c`: Force a clean build
|
||||
- `-C`: Enable ANSI-colored compile output (GNU/Clang only)
|
||||
- `-e`: Build RelWithDebInfo (release + symbols)
|
||||
- `-j N`: Limit builds to N cores (useful for low-memory systems)
|
||||
- `-1`: Limit builds to one core
|
||||
- `-l`: Use Clang instead of GCC
|
||||
|
|
@ -294,10 +310,14 @@ The build system supports multiple Linux distributions including Ubuntu/Debian a
|
|||
> The build script automatically detects your Linux distribution and uses the appropriate package manager (apt, pacman) to install dependencies.
|
||||
|
||||
> [!TIP]
|
||||
> For first-time builds, use `./build_linux.sh -u` to install dependencies, then `./build_linux.sh -dsi` to build everything.
|
||||
> For first-time builds, use `./build_linux.sh -u` to install dependencies, then `./build_linux.sh -dsti` to build everything.
|
||||
|
||||
> [!WARNING]
|
||||
> If you encounter memory issues during compilation, use `-j 1` or `-1` to limit parallel compilation, or `-r` to skip memory checks.
|
||||
> If you encounter memory issues during compilation, use `-j 1` or `-1` to limit parallel compilation and `-r` to skip memory checks.
|
||||
|
||||
#### Unit Testing
|
||||
|
||||
See [How to Test](How-to-test) for more details.
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -139,9 +139,9 @@ The following sample JSON file shows how to create a new generic filament profil
|
|||
> When developing profiles, you may notice that changes aren't reflected in OrcaSlicer after editing profile files. This happens because OrcaSlicer caches profiles in the system folder.
|
||||
> To force OrcaSlicer to load your updated profiles:
|
||||
> 1. **Access the configuration folder**: Go to **Help** → **Show Configuration Folder**
|
||||
> 
|
||||
> 
|
||||
> 2. **Clear the cache**: Delete the `system` folder to remove cached profiles
|
||||
> 
|
||||
> 
|
||||
> 3. **Restart OrcaSlicer**: Launch the application to load your updated profiles
|
||||
> This process forces OrcaSlicer to update its profile cache from the source files in the `resources/profiles/` directory.
|
||||
|
||||
|
|
|
|||
27
doc/developer-reference/How-to-test.md
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
# How to Test
|
||||
|
||||
This wiki page describes how to build and run tests on Linux. It should eventually provide guidance on how to add tests for a new feature.
|
||||
|
||||
## Build Tests
|
||||
|
||||
Can be built when you are building Orca Slicer binary by including the `-t` flag for `build_linux.sh`:
|
||||
|
||||
```
|
||||
build_linux.sh -st
|
||||
```
|
||||
|
||||
Test binaries will then appear under `build/tests`. As of this writing, not all tests will be built.
|
||||
|
||||
## Run Unit Tests
|
||||
|
||||
### Run All
|
||||
|
||||
```
|
||||
ctest --test-dir build/tests
|
||||
```
|
||||
|
||||
### Run a Specific Set
|
||||
|
||||
```
|
||||
ctest --test-dir build/tests/slic3rutils
|
||||
```
|
||||
|
Before Width: | Height: | Size: 406 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 298 KiB |
|
Before Width: | Height: | Size: 134 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 6.5 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 148 KiB After Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 148 KiB After Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 4.7 KiB |
BIN
doc/images/develop/compile_vs2022_local_debugger.png
Normal file
|
After Width: | Height: | Size: 830 B |
|
Before Width: | Height: | Size: 28 KiB |
BIN
doc/images/develop/go-to-configuration-folder.png
Normal file
|
After Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 24 KiB |
BIN
doc/images/develop/profile-delete-system-folder.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 1.8 MiB After Width: | Height: | Size: 344 KiB |
BIN
doc/images/fill/fill-layer-time-variability.png
Normal file
|
After Width: | Height: | Size: 78 KiB |
|
|
@ -68,6 +68,9 @@ This creates a smooth, vase-like appearance.
|
|||
When enabled, Smooth Spiral smooths out X and Y moves as well, resulting in no visible seams even on non-vertical walls.
|
||||
This produces the smoothest possible spiral print.
|
||||
|
||||
> [!NOTE]
|
||||
> If you are using absolute e distances, the smoothing may not work as expected.
|
||||
|
||||
#### Max XY Smoothing
|
||||
|
||||
Maximum distance to move points in XY to achieve a smooth spiral. If expressed as a percentage, it is calculated relative to the nozzle diameter.
|
||||
|
|
|
|||
|
|
@ -33,7 +33,9 @@ The pattern that will be used when ironing. Usually, the best pattern is the one
|
|||
## Flow
|
||||
|
||||
The amount of material to extrude during ironing.
|
||||
This % is a percentage of the normal flow rate. A lower value will result in a smoother finish but may not cover the surface completely. A higher value may cover the surface better but can lead to over extrusion or rougher finish.
|
||||
This % is a percentage of the normal flow rate. A lower value will result in a smoother finish but may not cover the surface completely. A higher value may cover the surface better but can lead to over extrusion or rougher finish.
|
||||
|
||||
A lower layer height may require higher flow due to less volumetric extrusion per distance.
|
||||
|
||||
## Line spacing
|
||||
|
||||
|
|
@ -48,10 +50,19 @@ The distance to keep from the edges, which can help prevent over-extrusion at th
|
|||
|
||||
If this value is set to 0, the ironing toolpath will start directly at the perimeter edges without any inward offset. This means the [ironing pattern](#pattern) will extend all the way to the outer boundaries of the top surface being ironed.
|
||||
|
||||
## Angle
|
||||
## Angle Offset
|
||||
|
||||
The angle ironing is done at.
|
||||
A negative number disables this function and uses the [sparse infill direction](strength_settings_infill#direction).
|
||||
The angle of ironing lines offset relative to the top surface solid infill direction.
|
||||
|
||||
Commonly used ironing angle offsets are 0°, 45°, and 90° each producing a [different surface finish](https://github.com/SoftFever/OrcaSlicer/issues/10834#issuecomment-3322628589) which will depend on your printer nozzle.
|
||||
|
||||
## Fixed Angle
|
||||
|
||||
Use a fixed absolute angle for ironing that is not offset from the top surface infill direction. This results in an ironing finish that does not have alternating line directions and may result in a more uniform surface finish and reduced tiger striping effect when reflecting light.
|
||||
|
||||
Set the Ironing Angle Offset to an angle with optimal ironing angle offsets from all affected top surface solid infill directions.
|
||||
|
||||
Suggested fixed ironing angles are 0° and 90° if you are using the default solid infill direction of 45°.
|
||||
|
||||
## Speed
|
||||
|
||||
|
|
|
|||
|
|
@ -30,7 +30,8 @@ Fallback value used when a specific line width is not set (set to `0`).
|
|||
|
||||
### First Layer
|
||||
|
||||
A wider first layer (with a higher [first layer height](quality_settings_layer_height#first-layer-height)) improves bed adhesion and compensates for uneven build surfaces.
|
||||
A wider first layer (with a higher [first layer height](quality_settings_layer_height#first-layer-height)) improves bed adhesion and compensates for uneven build surfaces.
|
||||
First layer line width also overrides [Brim's](others_settings_brim) and [Skirt's](others_settings_skirt) line width.
|
||||
|
||||
### Outer Wall
|
||||
|
||||
|
|
|
|||
|
|
@ -61,9 +61,36 @@ To mitigate this effect, OrcaSlicer allows you to specify a negative distance th
|
|||
|
||||

|
||||
|
||||
The compensation works as follows:
|
||||
When the `current_layer` is <= `input_compensation_layers`
|
||||
```c++
|
||||
compensation = input_compensation_distance - (input_compensation_distance / input_compensation_layers) × (current_layer - 1)
|
||||
```
|
||||
According to the equation, we can establish the following rules:
|
||||
- In the 1st layer, since it is layer `1 - 1 = 0`, compensation is 100%.
|
||||
- The intermediate layers (between the first and input_compensation_layers) will have linear compensation.
|
||||
- Layers above the specified amount will not be compensated.
|
||||
|
||||
Assuming the compensation value is 0.25 mm:
|
||||
|
||||
- Elephant Foot Compensation Layers = 1 :
|
||||
- 1st layer: `0.25mm` compensation (100%)
|
||||
- 2nd layer and beyond: No compensation (0 mm)
|
||||
- Elephant Foot Compensation Layers = 2 :
|
||||
- 1st layer: `0.25mm` compensation (100%)
|
||||
- 2nd layer: `0.25 − (0.25 / 2) × (2 - 1) = 0.125mm` compensation (50%)
|
||||
- 3rd layer and beyond: No compensation (0 mm).
|
||||
- Elephant Foot Compensation Layers = 5 :
|
||||
- 1st layer: `0.25mm` compensation (100%)
|
||||
- 2nd layer: `0.25 − (0.25 / 5) × (2 - 1) = 0.2mm` compensation (80%)
|
||||
- 3rd layer: `0.25 − (0.25 / 5) × (3 - 1) = 0.15mm` compensation (60%)
|
||||
- 4th layer: `0.25 − (0.25 / 5) × (4 - 1) = 0.1mm` compensation (40%)
|
||||
- 5th layer: `0.25 − (0.25 / 5) × (5 - 1) = 0.05mm` compensation (20%)
|
||||
- 6th layer and beyond: No compensation (0 mm).
|
||||
|
||||
## Precise wall
|
||||
|
||||
The 'Precise Wall' is a distinctive feature introduced by OrcaSlicer, aimed at improving the dimensional accuracy of prints and minimizing layer inconsistencies by slightly increasing the spacing between the outer wall and the inner wall.
|
||||
The 'Precise Wall' is a distinctive feature introduced by OrcaSlicer, aimed at improving the dimensional accuracy of prints and minimizing layer inconsistencies by slightly increasing the spacing between the outer wall and the inner wall when printing in [Inner Outer wall order](quality_settings_wall_and_surfaces#innerouter).
|
||||
|
||||
### Technical explanation
|
||||
|
||||
|
|
|
|||
|
|
@ -60,7 +60,9 @@ Set this to any option other than Auto will force the wall direction regardless
|
|||
## Surface flow ratio
|
||||
|
||||
This factor affects the amount of material for [top or bottom solid infill](strength_settings_top_bottom_shells). You can decrease it slightly to have smooth surface finish.
|
||||
The actual top surface flow used is calculated by multiplying this value with the filament flow ratio, and if set, the object's flow ratio.
|
||||
The actual top or bottom surface flow used is calculated by multiplying this value by the filament flow ratio, and if set, the object's flow ratio.
|
||||
|
||||
Other flow ratios, such as ratios for the first layer (does not affect brims and skirts), outer and inner walls, overhang perimeters, sparse infill, internal solid infill, gap fill, support, and support interfaces, can also be adjusted after enabling the "Set other flow ratios" option.
|
||||
|
||||
> [!TIP]
|
||||
> Before using a value other than 1, it is recommended to [calibrate the flow ratio](flow-rate-calib) to ensure that the flow ratio is set correctly for your printer and filament.
|
||||
|
|
@ -92,6 +94,9 @@ Highly recommended for detailed or aesthetic prints.
|
|||
|
||||

|
||||
|
||||
> [!NOTE]
|
||||
> This feature is not compatible with Timelapse mode, as it can cause unexpected travel moves.
|
||||
|
||||
### Max detour length
|
||||
|
||||
Defines the maximum distance the printer is allowed to detour to avoid crossing a wall.
|
||||
|
|
|
|||
|
|
@ -5,8 +5,15 @@
|
|||
## Cornering Control Types
|
||||
|
||||
- **Jerk**: Traditional method, sets a maximum speed for direction changes.
|
||||
- Klipper: [Square corner velocity](https://www.klipper3d.org/Config_Reference.html#printer)
|
||||
- RepRapFirmware: [Maximum instantaneous speed changes](https://docs.duet3d.com/User_manual/Reference/Gcodes#m566-set-allowable-instantaneous-speed-change)
|
||||
- Marlin 2: [Classic Jerk](https://marlinfw.org/docs/configuration/configuration.html#jerk-) (deprecated in favor of [Junction Deviation](https://marlinfw.org/docs/configuration/configuration.html#junction-deviation-)) but can still be used.
|
||||
- Marlin Legacy: [Classic Jerk](https://marlinfw.org/docs/configuration/configuration.html#jerk-).
|
||||
- **[Junction Deviation](#junction-deviation)**: Modern method, calculates cornering speed based on acceleration and speed.
|
||||
|
||||
> [!TIP]
|
||||
> Calibrate your Cornering Values using the [Cornering Calibration guide](cornering-calib).
|
||||
|
||||
## Key Effects
|
||||
|
||||
- **Corner Control**: Lower values = smoother corners, better quality. Higher values = faster cornering, potential artifacts
|
||||
|
|
@ -16,7 +23,7 @@
|
|||
This setting overrides firmware jerk values when different motion types need specific settings. Orca limits jerk to not exceed the Printer's Motion Ability settings.
|
||||
|
||||
> [!TIP]
|
||||
> Jerk can work in conjunction with [Pressure Advance](pressure-advance-calib), [Adaptive Pressure Advance](adaptive-pressure-advance-calib), and [Input Shaping](input-shaping-calib) to optimize print quality and speed.
|
||||
> Jerk can work in conjunction with [Pressure Advance](pressure-advance-calib), [Adaptive Pressure Advance](adaptive-pressure-advance-calib), and [Input Shaping](input-shaping-calib) to optimize print quality and speed.
|
||||
> It's recommended to follow the [calibration guide](calibration) order for best results.
|
||||
|
||||
- [Cornering Control Types](#cornering-control-types)
|
||||
|
|
@ -64,12 +71,14 @@ Jerk for travel printing. This is usually set to a higher value than infill to r
|
|||
|
||||
## Junction Deviation
|
||||
|
||||
Alternative to Jerk, Junction Deviation is the default method for controlling cornering speed in MarlinFW (Marlin2) printers.
|
||||
Alternative to Jerk, Junction Deviation is the default method for controlling cornering speed in Marlin 2 printers.
|
||||
Higher values result in more aggressive cornering speeds, while lower values produce smoother, more controlled cornering.
|
||||
|
||||
This value will **only be overwritten** if it is lower than the Junction Deviation value set in Printer settings > Motion ability. If it is higher, the value configured in Motion ability will be used.
|
||||
> [!NOTE]
|
||||
> Classic Jerk can still be used in Marlin 2, but it is deprecated in favor of Junction Deviation.
|
||||
> If your printer uses Classic Jerk, you need to set your Junction Deviation to `0` to enable the use of Classic Jerk.
|
||||
|
||||
To Calculate your Junction Deviation value, please refer to the [Junction Deviation Calibration guide](cornering-calib#junction-deviation).
|
||||
This value will **only be overwritten** if it is lower than the Junction Deviation value set in Printer settings > Motion ability. If it is higher, the value configured in Motion ability will be used.
|
||||
|
||||
```math
|
||||
JD = 0,4 \cdot \frac{\text{Jerk}^2}{\text{Accel.}}
|
||||
|
|
|
|||
BIN
doc/print_settings/strength/infill-analysis/infill-analysis.7z
Normal file
|
|
@ -1,58 +1,95 @@
|
|||
# Patterns
|
||||
|
||||
Patterns determine how material is distributed within a print. Different patterns can affect strength, flexibility and print speed using the same density setting.
|
||||
Patterns determine how material is distributed within a print. Different patterns can affect strength, flexibility and print speed using the same density setting.
|
||||
The infill pattern also impacts the uniformity of the layer times, since the patterns may be constant, or present significant variations between adjacent layers.
|
||||
|
||||
There is no one-size-fits-all solution, as the best pattern depends on the specific print and its requirements.
|
||||
|
||||
Many patterns may look similar and have similar overall specifications, but they can behave very differently in practice.
|
||||
As most settings in 3D printing, experience is the best way to determine which pattern works best for your specific needs.
|
||||
|
||||
## Patterns Quick Reference
|
||||
## Analysis parameters
|
||||
|
||||
| | Pattern | Applies to | X-Y Strength | Z Strength | Material Usage | Print Time |
|
||||
|---|---|---|---|---|---|---|
|
||||
|  | [Monotonic](#monotonic) | - **[Solid Infill](strength_settings_infill#internal-solid-infill)** - **[Surface](strength_settings_top_bottom_shells)** | Normal | Normal | Normal-High | Normal-Low |
|
||||
|  | [Monotonic line](#monotonic-line) | - **[Solid Infill](strength_settings_infill#internal-solid-infill)** - **[Surface](strength_settings_top_bottom_shells)** | Normal | Normal | Normal | Normal |
|
||||
|  | [Rectilinear](#rectilinear) | - **[Sparse Infill](strength_settings_infill#sparse-infill-density)** - **[Solid Infill](strength_settings_infill#internal-solid-infill)** - **[Surface](strength_settings_top_bottom_shells)** - **[Ironing](quality_settings_ironing)** | Normal-Low | Low | Normal | Normal-Low |
|
||||
|  | [Aligned Rectilinear](#aligned-rectilinear) | - **[Sparse Infill](strength_settings_infill#sparse-infill-density)** - **[Solid Infill](strength_settings_infill#internal-solid-infill)** - **[Surface](strength_settings_top_bottom_shells)** | Normal-Low | Normal | Normal | Normal-Low |
|
||||
|  | [Zig Zag](#zig-zag) | - **[Sparse Infill](strength_settings_infill#sparse-infill-density)** | Normal-Low | Low | Normal | Normal-Low |
|
||||
|  | [Cross Zag](#cross-zag) | - **[Sparse Infill](strength_settings_infill#sparse-infill-density)** | Normal | Low | Normal | Normal-Low |
|
||||
|  | [Locked Zag](#locked-zag) | - **[Sparse Infill](strength_settings_infill#sparse-infill-density)** | Normal-Low | Normal-Low | Low | Extra-High |
|
||||
|  | [Line](#line) | - **[Sparse Infill](strength_settings_infill#sparse-infill-density)** | Low | Low | Normal-High | Normal-Low |
|
||||
|  | [Grid](#grid) | - **[Sparse Infill](strength_settings_infill#sparse-infill-density)** | High | High | Normal-High | Normal-Low |
|
||||
|  | [Triangles](#triangles) | - **[Sparse Infill](strength_settings_infill#sparse-infill-density)** | High | Normal | Normal-High | Normal-Low |
|
||||
|  | [Tri-hexagon](#tri-hexagon) | - **[Sparse Infill](strength_settings_infill#sparse-infill-density)** | High | Normal-High | Normal-High | Normal-Low |
|
||||
|  | [Cubic](#cubic) | - **[Sparse Infill](strength_settings_infill#sparse-infill-density)** | High | High | Normal-High | Normal-Low |
|
||||
|  | [Adaptive Cubic](#adaptive-cubic) | - **[Sparse Infill](strength_settings_infill#sparse-infill-density)** | Normal-High | Normal-High | Normal | Low |
|
||||
|  | [Quarter Cubic](#quarter-cubic) | - **[Sparse Infill](strength_settings_infill#sparse-infill-density)** | High | High | Normal-High | Normal-Low |
|
||||
|  | [Support Cubic](#support-cubic) | - **[Sparse Infill](strength_settings_infill#sparse-infill-density)** | Low | Low | Normal | Extra-Low |
|
||||
|  | [Lightning](#lightning) | - **[Sparse Infill](strength_settings_infill#sparse-infill-density)** | Low | Low | Low | Ultra-Low |
|
||||
|  | [Honeycomb](#honeycomb) | - **[Sparse Infill](strength_settings_infill#sparse-infill-density)** | High | High | Low | Ultra-High |
|
||||
|  | [3D Honeycomb](#3d-honeycomb) | - **[Sparse Infill](strength_settings_infill#sparse-infill-density)** | Normal-High | Normal-High | Low | High |
|
||||
|  | [Lateral Honeycomb](#lateral-honeycomb) | - **[Sparse Infill](strength_settings_infill#sparse-infill-density)** | Normal-Low | Normal-Low | Normal-High | Normal-Low |
|
||||
|  | [Lateral Lattice](#lateral-lattice) | - **[Sparse Infill](strength_settings_infill#sparse-infill-density)** | Normal-Low | Low | Normal-High | Normal-Low |
|
||||
|  | [Cross Hatch](#cross-hatch) | - **[Sparse Infill](strength_settings_infill#sparse-infill-density)** | Normal-High | Normal-High | Normal-Low | Normal-High |
|
||||
|  | [TPMS-D](#tpms-d) | - **[Sparse Infill](strength_settings_infill#sparse-infill-density)** | High | High | Normal-Low | High |
|
||||
|  | [TPMS-FK](#tpms-fk) | - **[Sparse Infill](strength_settings_infill#sparse-infill-density)** | Normal-High | Normal-High | Low | High |
|
||||
|  | [Gyroid](#gyroid) | - **[Sparse Infill](strength_settings_infill#sparse-infill-density)** | High | High | Normal-Low | Normal-High |
|
||||
|  | [Concentric](#concentric) | - **[Sparse Infill](strength_settings_infill#sparse-infill-density)** - **[Solid Infill](strength_settings_infill#internal-solid-infill)** - **[Surface](strength_settings_top_bottom_shells)** - **[Ironing](quality_settings_ironing)** | Low | Normal | Normal-High | Normal-Low |
|
||||
|  | [Hilbert Curve](#hilbert-curve) | - **[Sparse Infill](strength_settings_infill#sparse-infill-density)** - **[Solid Infill](strength_settings_infill#internal-solid-infill)** - **[Surface](strength_settings_top_bottom_shells)** | Low | Normal | Low | High |
|
||||
|  | [Archimedean Chords](#archimedean-chords) | - **[Sparse Infill](strength_settings_infill#sparse-infill-density)** - **[Solid Infill](strength_settings_infill#internal-solid-infill)** - **[Surface](strength_settings_top_bottom_shells)** | Low | Normal | Normal-High | Normal-Low |
|
||||
|  | [Octagram Spiral](#octagram-spiral) | - **[Sparse Infill](strength_settings_infill#sparse-infill-density)** - **[Solid Infill](strength_settings_infill#internal-solid-infill)** - **[Surface](strength_settings_top_bottom_shells)** | Low | Normal | Normal-Low | Normal |
|
||||
### Strength
|
||||
|
||||
- **X-Y Direction**: The strength of the print in the "Horizontal" X-Y plane. Affected by the pattern's connections between walls, contact between layers, and path.
|
||||
- **Z Direction**: The strength of the print in the "Vertical" Z direction. Affected by contact between layers.
|
||||
|
||||
### Material Usage
|
||||
|
||||
Not all patterns use the same amount of material due to their **Density Calculations** and adjustments to the paths.
|
||||
This leads to patterns that do not use the specified percentage but rather variations of it.
|
||||
|
||||
### Print Time
|
||||
|
||||
Print time can vary significantly between patterns due to differences in their pathing and infill strategies.
|
||||
Some patterns may complete faster due to more efficient use of the print head's movement, while others may take longer due to more complex paths.
|
||||
|
||||
> [!NOTE]
|
||||
> You can download [infill_desc_calculator.xlsx](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/print_settings/strength/infill_desc_calculator.xlsx?raw=true) used to calculate the values above.
|
||||
> OrcaSlicer Time estimations are not always accurate, especially with complex patterns.
|
||||
> This analysis was estimated with [Klipper Estimator](https://github.com/Annex-Engineering/klipper_estimator).
|
||||
|
||||
### Layer Time Variability
|
||||
|
||||
Layer time variability refers to the differences in time it takes to print each layer of a pattern. Some patterns may have consistent layer times, while others may experience significant fluctuations. These variations can potentially impact the outer appearance of the print due to differences in cooling and material flow between layers.
|
||||
|
||||

|
||||
|
||||
## Patterns Quick Reference
|
||||
|
||||
| - | Pattern | Strength | Material Usage | Print Time | Layer time Variability |
|
||||
|---|---|---|---|---|---|
|
||||
| <img alt="param_monotonic" src="https://github.com/SoftFever/OrcaSlicer/blob/main/resources/images/param_monotonic.svg?raw=true" height="45"> | [Monotonic](#monotonic) | X-Y: ⚪️ Normal<br> Z: ⚪️ Normal | ⚪️ Normal | 🔘 Normal-Low | 🟢 None |
|
||||
| <img alt="param_monotonicline" src="https://github.com/SoftFever/OrcaSlicer/blob/main/resources/images/param_monotonicline.svg?raw=true" height="45"> | [Monotonic line](#monotonic-line) | X-Y: ⚪️ Normal<br> Z: ⚪️ Normal | ⚪️ Normal | 🔘 Normal-Low | 🟢 None |
|
||||
| <img alt="param_rectilinear" src="https://github.com/SoftFever/OrcaSlicer/blob/main/resources/images/param_rectilinear.svg?raw=true" height="45"> | [Rectilinear](#rectilinear) | X-Y: ⚪️ Normal-Low<br> Z: 🟡 Low | ⚪️ Normal | 🔘 Normal-Low | 🔵 Unnoticeable |
|
||||
| <img alt="param_alignedrectilinear" src="https://github.com/SoftFever/OrcaSlicer/blob/main/resources/images/param_alignedrectilinear.svg?raw=true" height="45"> | [Aligned Rectilinear](#aligned-rectilinear) | X-Y: ⚪️ Normal-Low<br> Z: ⚪️ Normal | ⚪️ Normal | 🔘 Normal-Low | 🔵 Unnoticeable |
|
||||
| <img alt="param_zigzag" src="https://github.com/SoftFever/OrcaSlicer/blob/main/resources/images/param_zigzag.svg?raw=true" height="45"> | [Zig Zag](#zig-zag) | X-Y: ⚪️ Normal-Low<br> Z: 🟡 Low | ⚪️ Normal | 🔘 Normal-Low | 🔵 Unnoticeable |
|
||||
| <img alt="param_crosszag" src="https://github.com/SoftFever/OrcaSlicer/blob/main/resources/images/param_crosszag.svg?raw=true" height="45"> | [Cross Zag](#cross-zag) | X-Y: ⚪️ Normal<br> Z: 🟡 Low | ⚪️ Normal | 🔘 Normal-Low | 🔵 Unnoticeable |
|
||||
| <img alt="param_lockedzag" src="https://github.com/SoftFever/OrcaSlicer/blob/main/resources/images/param_lockedzag.svg?raw=true" height="45"> | [Locked Zag](#locked-zag) | X-Y: ⚪️ Normal-Low<br> Z: ⚪️ Normal-Low | ⚪️ Normal-High | ⚪️ Normal-High | 🟢 None |
|
||||
| <img alt="param_line" src="https://github.com/SoftFever/OrcaSlicer/blob/main/resources/images/param_line.svg?raw=true" height="45"> | [Line](#line) | X-Y: 🟡 Low<br> Z: 🟡 Low | ⚪️ Normal | 🔘 Normal-Low | 🟢 None |
|
||||
| <img alt="param_grid" src="https://github.com/SoftFever/OrcaSlicer/blob/main/resources/images/param_grid.svg?raw=true" height="45"> | [Grid](#grid) | X-Y: 🟣 High<br> Z: 🟣 High | ⚪️ Normal | 🟣 Low | 🟢 None |
|
||||
| <img alt="param_triangles" src="https://github.com/SoftFever/OrcaSlicer/blob/main/resources/images/param_triangles.svg?raw=true" height="45"> | [Triangles](#triangles) | X-Y: 🟣 High<br> Z: ⚪️ Normal | ⚪️ Normal | 🔘 Normal-Low | 🟢 None |
|
||||
| <img alt="param_tri-hexagon" src="https://github.com/SoftFever/OrcaSlicer/blob/main/resources/images/param_tri-hexagon.svg?raw=true" height="45"> | [Tri-hexagon](#tri-hexagon) | X-Y: 🟣 High<br> Z: 🔘 Normal-High | ⚪️ Normal | 🔘 Normal-Low | 🟢 None |
|
||||
| <img alt="param_cubic" src="https://github.com/SoftFever/OrcaSlicer/blob/main/resources/images/param_cubic.svg?raw=true" height="45"> | [Cubic](#cubic) | X-Y: 🟣 High<br> Z: 🟣 High | ⚪️ Normal | 🔘 Normal-Low | 🔵 Unnoticeable |
|
||||
| <img alt="param_adaptivecubic" src="https://github.com/SoftFever/OrcaSlicer/blob/main/resources/images/param_adaptivecubic.svg?raw=true" height="45"> | [Adaptive Cubic](#adaptive-cubic) | X-Y: 🔘 Normal-High<br> Z: 🔘 Normal-High | 🟣 Low | 🟣 Low | 🔵 Unnoticeable |
|
||||
| <img alt="param_quartercubic" src="https://github.com/SoftFever/OrcaSlicer/blob/main/resources/images/param_quartercubic.svg?raw=true" height="45"> | [Quarter Cubic](#quarter-cubic) | X-Y: 🟣 High<br> Z: 🟣 High | ⚪️ Normal | 🔘 Normal-Low | 🔵 Unnoticeable |
|
||||
| <img alt="param_supportcubic" src="https://github.com/SoftFever/OrcaSlicer/blob/main/resources/images/param_supportcubic.svg?raw=true" height="45"> | [Support Cubic](#support-cubic) | X-Y: 🟡 Low<br> Z: 🟡 Low | 🔵 Extra-Low | 🔵 Extra-Low | 🔴 Likely Noticeable |
|
||||
| <img alt="param_lightning" src="https://github.com/SoftFever/OrcaSlicer/blob/main/resources/images/param_lightning.svg?raw=true" height="45"> | [Lightning](#lightning) | X-Y: 🟡 Low<br> Z: 🟡 Low | 🟢 Ultra-Low | 🟢 Ultra-Low | 🔴 Likely Noticeable |
|
||||
| <img alt="param_honeycomb" src="https://github.com/SoftFever/OrcaSlicer/blob/main/resources/images/param_honeycomb.svg?raw=true" height="45"> | [Honeycomb](#honeycomb) | X-Y: 🟣 High<br> Z: 🟣 High | 🟡 High | 🔴 Ultra-High | 🟢 None |
|
||||
| <img alt="param_3dhoneycomb" src="https://github.com/SoftFever/OrcaSlicer/blob/main/resources/images/param_3dhoneycomb.svg?raw=true" height="45"> | [3D Honeycomb](#3d-honeycomb) | X-Y: 🔘 Normal-High<br> Z: 🔘 Normal-High | 🔘 Normal-Low | 🟠 Extra-High | 🟡 Possibly Noticeable |
|
||||
| <img alt="param_lateral-honeycomb" src="https://github.com/SoftFever/OrcaSlicer/blob/main/resources/images/param_lateral-honeycomb.svg?raw=true" height="45"> | [Lateral Honeycomb](#lateral-honeycomb) | X-Y: ⚪️ Normal-Low<br> Z: ⚪️ Normal-Low | ⚪️ Normal | 🔘 Normal-Low | 🟡 Possibly Noticeable |
|
||||
| <img alt="param_lateral-lattice" src="https://github.com/SoftFever/OrcaSlicer/blob/main/resources/images/param_lateral-lattice.svg?raw=true" height="45"> | [Lateral Lattice](#lateral-lattice) | X-Y: ⚪️ Normal-Low<br> Z: 🟡 Low | ⚪️ Normal | 🔘 Normal-Low | 🔵 Unnoticeable |
|
||||
| <img alt="param_crosshatch" src="https://github.com/SoftFever/OrcaSlicer/blob/main/resources/images/param_crosshatch.svg?raw=true" height="45"> | [Cross Hatch](#cross-hatch) | X-Y: 🔘 Normal-High<br> Z: 🔘 Normal-High | ⚪️ Normal | 🟡 High | 🔴 Likely Noticeable |
|
||||
| <img alt="param_tpmsd" src="https://github.com/SoftFever/OrcaSlicer/blob/main/resources/images/param_tpmsd.svg?raw=true" height="45"> | [TPMS-D](#tpms-d) | X-Y: 🟣 High<br> Z: 🟣 High | ⚪️ Normal | 🟡 High | 🟡 Possibly Noticeable |
|
||||
| <img alt="param_tpmsfk" src="https://github.com/SoftFever/OrcaSlicer/blob/main/resources/images/param_tpmsfk.svg?raw=true" height="45"> | [TPMS-FK](#tpms-fk) | X-Y: 🔘 Normal-High<br> Z: 🔘 Normal-High | ⚪️ Normal | 🔴 Ultra-High | 🟡 Possibly Noticeable |
|
||||
| <img alt="param_gyroid" src="https://github.com/SoftFever/OrcaSlicer/blob/main/resources/images/param_gyroid.svg?raw=true" height="45"> | [Gyroid](#gyroid) | X-Y: 🟣 High<br> Z: 🟣 High | ⚪️ Normal | 🔴 Ultra-High | 🔵 Unnoticeable |
|
||||
| <img alt="param_concentric" src="https://github.com/SoftFever/OrcaSlicer/blob/main/resources/images/param_concentric.svg?raw=true" height="45"> | [Concentric](#concentric) | X-Y: 🟡 Low<br> Z: ⚪️ Normal | ⚪️ Normal | 🔘 Normal-Low | 🟢 None |
|
||||
| <img alt="param_hilbertcurve" src="https://github.com/SoftFever/OrcaSlicer/blob/main/resources/images/param_hilbertcurve.svg?raw=true" height="45"> | [Hilbert Curve](#hilbert-curve) | X-Y: 🟡 Low<br> Z: ⚪️ Normal | ⚪️ Normal | 🟠 Extra-High | 🟢 None |
|
||||
| <img alt="param_archimedeanchords" src="https://github.com/SoftFever/OrcaSlicer/blob/main/resources/images/param_archimedeanchords.svg?raw=true" height="45"> | [Archimedean Chords](#archimedean-chords) | X-Y: 🟡 Low<br> Z: ⚪️ Normal | ⚪️ Normal | 🔘 Normal-Low | 🟢 None |
|
||||
| <img alt="param_octagramspiral" src="https://github.com/SoftFever/OrcaSlicer/blob/main/resources/images/param_octagramspiral.svg?raw=true" height="45"> | [Octagram Spiral](#octagram-spiral) | X-Y: 🟡 Low<br> Z: ⚪️ Normal | ⚪️ Normal | ⚪️ Normal | 🟢 None |
|
||||
|
||||
> [!NOTE]
|
||||
> This estimations are based in a Cube model to maintain consistency.
|
||||
> This **WILL NOT** be the same for all models and only serves as a standard guideline.
|
||||
|
||||
> [!TIP]
|
||||
> You can see how this analysis was made in [infill-analysis](https://github.com/SoftFever/OrcaSlicer/tree/main/doc/print_settings/strength/infill-analysis) folder:
|
||||
> - [Infill calculator Project](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/print_settings/strength/infill-analysis/infill_calculator.3mf?raw=true) to generate the gcode files and images.
|
||||
> - [infill_desc_calculator.xlsx](https://github.com/SoftFever/OrcaSlicer/blob/main/doc/print_settings/strength/infill-analysis/infill_desc_calculator.xlsx?raw=true) used to calculate the values above.
|
||||
> - Time, and material usage where simulated with the same [Klipper Estimator](https://github.com/Annex-Engineering/klipper_estimator) values to maintain consistency.
|
||||
|
||||
## Monotonic
|
||||
|
||||
[Rectilinear](#rectilinear) in a uniform direction for a smoother visual surface.
|
||||
|
||||
- **Horizontal Strength (X-Y):** Normal
|
||||
- **Vertical Strength (Z):** Normal
|
||||
- **Strength**
|
||||
- **Horizontal (X-Y):** ⚪️ Normal
|
||||
- **Vertical (Z):** ⚪️ Normal
|
||||
- **Density Calculation:** % of total infill volume
|
||||
- **Material Usage:** Normal
|
||||
- **Print Time:** Normal-Low
|
||||
- **Material/Time (Higher better):** Normal-High
|
||||
- **Material Usage:** ⚪️ Normal
|
||||
- **Print Time:** 🔘 Normal-Low
|
||||
- **Material/Time (Higher better):** 🔘 Normal-High
|
||||
- **Layer time Variability:** 🟢 None
|
||||
- **Applies to:**
|
||||
- **[Solid Infill](strength_settings_infill#internal-solid-infill)**
|
||||
- **[Surface](strength_settings_top_bottom_shells)**
|
||||
|
|
@ -63,12 +100,14 @@ As most settings in 3D printing, experience is the best way to determine which p
|
|||
|
||||
[Monotonic](#monotonic) but avoids overlapping with the perimeter, reducing excess material at joints. May introduce visible seams and increase print time.
|
||||
|
||||
- **Horizontal Strength (X-Y):** Normal
|
||||
- **Vertical Strength (Z):** Normal
|
||||
- **Strength**
|
||||
- **Horizontal (X-Y):** ⚪️ Normal
|
||||
- **Vertical (Z):** ⚪️ Normal
|
||||
- **Density Calculation:** % of total infill volume
|
||||
- **Material Usage:** Normal
|
||||
- **Print Time:** Normal
|
||||
- **Material/Time (Higher better):** Normal
|
||||
- **Material Usage:** ⚪️ Normal
|
||||
- **Print Time:** 🔘 Normal-Low
|
||||
- **Material/Time (Higher better):** 🔘 Normal-High
|
||||
- **Layer time Variability:** 🟢 None
|
||||
- **Applies to:**
|
||||
- **[Solid Infill](strength_settings_infill#internal-solid-infill)**
|
||||
- **[Surface](strength_settings_top_bottom_shells)**
|
||||
|
|
@ -79,14 +118,17 @@ As most settings in 3D printing, experience is the best way to determine which p
|
|||
|
||||
Parallel lines spaced according to infill density. Each layer is printed perpendicular to the previous, resulting in low vertical bonding. Consider using new [Zig Zag](#zig-zag) infill instead.
|
||||
|
||||
- **Horizontal Strength (X-Y):** Normal-Low
|
||||
- **Vertical Strength (Z):** Low
|
||||
- **Strength**
|
||||
- **Horizontal (X-Y):** ⚪️ Normal-Low
|
||||
- **Vertical (Z):** 🟡 Low
|
||||
- **Density Calculation:** % of total infill volume
|
||||
- **Material Usage:** Normal
|
||||
- **Print Time:** Normal-Low
|
||||
- **Material/Time (Higher better):** Normal
|
||||
- **Material Usage:** ⚪️ Normal
|
||||
- **Print Time:** 🔘 Normal-Low
|
||||
- **Material/Time (Higher better):** 🔘 Normal-High
|
||||
- **Layer time Variability:** 🔵 Unnoticeable
|
||||
- **Applies to:**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)** - **[Solid Infill](strength_settings_infill#internal-solid-infill)**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)**
|
||||
- **[Solid Infill](strength_settings_infill#internal-solid-infill)**
|
||||
- **[Surface](strength_settings_top_bottom_shells)**
|
||||
- **[Ironing](quality_settings_ironing)**
|
||||
|
||||
|
|
@ -97,14 +139,17 @@ Parallel lines spaced according to infill density. Each layer is printed perpend
|
|||
Parallel lines spaced by the infill spacing, each layer printed in the same direction as the previous layer. Good horizontal strength perpendicular to the lines, but terrible in parallel direction.
|
||||
Recommended with layer anchoring to improve not perpendicular strength.
|
||||
|
||||
- **Horizontal Strength (X-Y):** Normal-Low
|
||||
- **Vertical Strength (Z):** Normal
|
||||
- **Strength**
|
||||
- **Horizontal (X-Y):** ⚪️ Normal-Low
|
||||
- **Vertical (Z):** ⚪️ Normal
|
||||
- **Density Calculation:** % of total infill volume
|
||||
- **Material Usage:** Normal
|
||||
- **Print Time:** Normal-Low
|
||||
- **Material/Time (Higher better):** Normal
|
||||
- **Material Usage:** ⚪️ Normal
|
||||
- **Print Time:** 🔘 Normal-Low
|
||||
- **Material/Time (Higher better):** 🔘 Normal-High
|
||||
- **Layer time Variability:** 🔵 Unnoticeable
|
||||
- **Applies to:**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)** - **[Solid Infill](strength_settings_infill#internal-solid-infill)**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)**
|
||||
- **[Solid Infill](strength_settings_infill#internal-solid-infill)**
|
||||
- **[Surface](strength_settings_top_bottom_shells)**
|
||||
|
||||

|
||||
|
|
@ -113,12 +158,14 @@ Recommended with layer anchoring to improve not perpendicular strength.
|
|||
|
||||
Similar to [rectilinear](#rectilinear) with consistent pattern between layers. Allows you to add a Symmetric infill Y axis for models with two symmetric parts.
|
||||
|
||||
- **Horizontal Strength (X-Y):** Normal-Low
|
||||
- **Vertical Strength (Z):** Low
|
||||
- **Strength**
|
||||
- **Horizontal (X-Y):** ⚪️ Normal-Low
|
||||
- **Vertical (Z):** 🟡 Low
|
||||
- **Density Calculation:** % of total infill volume
|
||||
- **Material Usage:** Normal
|
||||
- **Print Time:** Normal-Low
|
||||
- **Material/Time (Higher better):** Normal
|
||||
- **Material Usage:** ⚪️ Normal
|
||||
- **Print Time:** 🔘 Normal-Low
|
||||
- **Material/Time (Higher better):** 🔘 Normal-High
|
||||
- **Layer time Variability:** 🔵 Unnoticeable
|
||||
- **Applies to:**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)**
|
||||
|
||||
|
|
@ -128,12 +175,14 @@ Similar to [rectilinear](#rectilinear) with consistent pattern between layers. A
|
|||
|
||||
Similar to [Zig Zag](#zig-zag) but displacing each layer with Infill shift step parameter.
|
||||
|
||||
- **Horizontal Strength (X-Y):** Normal
|
||||
- **Vertical Strength (Z):** Low
|
||||
- **Strength**
|
||||
- **Horizontal (X-Y):** ⚪️ Normal
|
||||
- **Vertical (Z):** 🟡 Low
|
||||
- **Density Calculation:** % of total infill volume
|
||||
- **Material Usage:** Normal
|
||||
- **Print Time:** Normal-Low
|
||||
- **Material/Time (Higher better):** Normal
|
||||
- **Material Usage:** ⚪️ Normal
|
||||
- **Print Time:** 🔘 Normal-Low
|
||||
- **Material/Time (Higher better):** 🔘 Normal-High
|
||||
- **Layer time Variability:** 🔵 Unnoticeable
|
||||
- **Applies to:**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)**
|
||||
|
||||
|
|
@ -141,14 +190,18 @@ Similar to [Zig Zag](#zig-zag) but displacing each layer with Infill shift step
|
|||
|
||||
## Locked Zag
|
||||
|
||||
Adaptive version of [Zig Zag](#zig-zag) adding an external skin texture to interlock layers and a low material skeleton.
|
||||
Version of [Zig Zag](#zig-zag) that adds extra skin.
|
||||
When using this fill, you can individually modify the density of the skeleton and skin, as well as the size of the skin and how much interconnection there is between the skin and the skeleton (a lock depth of 50% of the skin depth is recommended).
|
||||
|
||||
- **Horizontal Strength (X-Y):** Normal-Low
|
||||
- **Vertical Strength (Z):** Normal-Low
|
||||
- **Density Calculation:** Same as [Zig Zag](#zig-zag) but increasing near walls
|
||||
- **Material Usage:** Normal-High
|
||||
- **Print Time:** Extra-High
|
||||
- **Material/Time (Higher better):** Low
|
||||
- **Strength**
|
||||
- **Horizontal (X-Y):** ⚪️ Normal-Low
|
||||
- **Vertical (Z):** ⚪️ Normal-Low
|
||||
- **Density Calculation:** Similar to [Zig Zag](#zig-zag).
|
||||
Skin density * ( Infill Area - Skin Area + lock depth area) + ( Skin density * Skin area).
|
||||
- **Material Usage:** ⚪️ Normal-High
|
||||
- **Print Time:** ⚪️ Normal-High
|
||||
- **Material/Time (Higher better):** ⚪️ Normal
|
||||
- **Layer time Variability:** 🟢 None
|
||||
- **Applies to:**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)**
|
||||
|
||||
|
|
@ -158,12 +211,14 @@ Adaptive version of [Zig Zag](#zig-zag) adding an external skin texture to inter
|
|||
|
||||
Similar to [rectilinear](#rectilinear), but each line is slightly rotated to improve print speed.
|
||||
|
||||
- **Horizontal Strength (X-Y):** Low
|
||||
- **Vertical Strength (Z):** Low
|
||||
- **Strength**
|
||||
- **Horizontal (X-Y):** 🟡 Low
|
||||
- **Vertical (Z):** 🟡 Low
|
||||
- **Density Calculation:** % of total infill volume
|
||||
- **Material Usage:** Normal
|
||||
- **Print Time:** Normal-Low
|
||||
- **Material/Time (Higher better):** Normal-High
|
||||
- **Material Usage:** ⚪️ Normal
|
||||
- **Print Time:** 🔘 Normal-Low
|
||||
- **Material/Time (Higher better):** 🔘 Normal-High
|
||||
- **Layer time Variability:** 🟢 None
|
||||
- **Applies to:**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)**
|
||||
|
||||
|
|
@ -173,12 +228,14 @@ Similar to [rectilinear](#rectilinear), but each line is slightly rotated to imp
|
|||
|
||||
Two-layer pattern of perpendicular lines, forming a grid. Overlapping points may cause noise or artifacts.
|
||||
|
||||
- **Horizontal Strength (X-Y):** High
|
||||
- **Vertical Strength (Z):** High
|
||||
- **Strength**
|
||||
- **Horizontal (X-Y):** 🟣 High
|
||||
- **Vertical (Z):** 🟣 High
|
||||
- **Density Calculation:** % of total infill volume
|
||||
- **Material Usage:** Normal
|
||||
- **Print Time:** Normal-Low
|
||||
- **Material/Time (Higher better):** Normal-High
|
||||
- **Material Usage:** ⚪️ Normal
|
||||
- **Print Time:** 🟣 Low
|
||||
- **Material/Time (Higher better):** 🔘 Normal-High
|
||||
- **Layer time Variability:** 🟢 None
|
||||
- **Applies to:**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)**
|
||||
|
||||
|
|
@ -188,12 +245,14 @@ Two-layer pattern of perpendicular lines, forming a grid. Overlapping points may
|
|||
|
||||
Triangle-based grid, offering strong X-Y strength but with triple overlaps at intersections.
|
||||
|
||||
- **Horizontal Strength (X-Y):** High
|
||||
- **Vertical Strength (Z):** Normal
|
||||
- **Strength**
|
||||
- **Horizontal (X-Y):** 🟣 High
|
||||
- **Vertical (Z):** ⚪️ Normal
|
||||
- **Density Calculation:** % of total infill volume
|
||||
- **Material Usage:** Normal
|
||||
- **Print Time:** Normal-Low
|
||||
- **Material/Time (Higher better):** Normal-High
|
||||
- **Material Usage:** ⚪️ Normal
|
||||
- **Print Time:** 🔘 Normal-Low
|
||||
- **Material/Time (Higher better):** 🔘 Normal-High
|
||||
- **Layer time Variability:** 🟢 None
|
||||
- **Applies to:**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)**
|
||||
|
||||
|
|
@ -203,12 +262,14 @@ Triangle-based grid, offering strong X-Y strength but with triple overlaps at in
|
|||
|
||||
Similar to the [triangles](#triangles) pattern but offset to prevent triple overlaps at intersections. This design combines triangles and hexagons, providing excellent X-Y strength.
|
||||
|
||||
- **Horizontal Strength (X-Y):** High
|
||||
- **Vertical Strength (Z):** Normal-High
|
||||
- **Strength**
|
||||
- **Horizontal (X-Y):** 🟣 High
|
||||
- **Vertical (Z):** 🔘 Normal-High
|
||||
- **Density Calculation:** % of total infill volume
|
||||
- **Material Usage:** Normal
|
||||
- **Print Time:** Normal-Low
|
||||
- **Material/Time (Higher better):** Normal-High
|
||||
- **Material Usage:** ⚪️ Normal
|
||||
- **Print Time:** 🔘 Normal-Low
|
||||
- **Material/Time (Higher better):** 🔘 Normal-High
|
||||
- **Layer time Variability:** 🟢 None
|
||||
- **Applies to:**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)**
|
||||
|
||||
|
|
@ -218,12 +279,14 @@ Similar to the [triangles](#triangles) pattern but offset to prevent triple over
|
|||
|
||||
3D cube pattern with corners facing down, distributing force in all directions. Triangles in the horizontal plane provide good X-Y strength.
|
||||
|
||||
- **Horizontal Strength (X-Y):** High
|
||||
- **Vertical Strength (Z):** High
|
||||
- **Strength**
|
||||
- **Horizontal (X-Y):** 🟣 High
|
||||
- **Vertical (Z):** 🟣 High
|
||||
- **Density Calculation:** % of total infill volume
|
||||
- **Material Usage:** Normal
|
||||
- **Print Time:** Normal-Low
|
||||
- **Material/Time (Higher better):** Normal-High
|
||||
- **Material Usage:** ⚪️ Normal
|
||||
- **Print Time:** 🔘 Normal-Low
|
||||
- **Material/Time (Higher better):** 🔘 Normal-High
|
||||
- **Layer time Variability:** 🔵 Unnoticeable
|
||||
- **Applies to:**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)**
|
||||
|
||||
|
|
@ -233,12 +296,14 @@ Similar to the [triangles](#triangles) pattern but offset to prevent triple over
|
|||
|
||||
[Cubic](#cubic) pattern with adaptive density: denser near walls, sparser in the center. Saves material and time while maintaining strength, ideal for large prints.
|
||||
|
||||
- **Horizontal Strength (X-Y):** Normal-High
|
||||
- **Vertical Strength (Z):** Normal-High
|
||||
- **Strength**
|
||||
- **Horizontal (X-Y):** 🔘 Normal-High
|
||||
- **Vertical (Z):** 🔘 Normal-High
|
||||
- **Density Calculation:** Same as [Cubic](#cubic) but reduced in the center
|
||||
- **Material Usage:** Low
|
||||
- **Print Time:** Low
|
||||
- **Material/Time (Higher better):** Normal
|
||||
- **Material Usage:** 🟣 Low
|
||||
- **Print Time:** 🟣 Low
|
||||
- **Material/Time (Higher better):** ⚪️ Normal
|
||||
- **Layer time Variability:** 🔵 Unnoticeable
|
||||
- **Applies to:**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)**
|
||||
|
||||
|
|
@ -248,12 +313,14 @@ Similar to the [triangles](#triangles) pattern but offset to prevent triple over
|
|||
|
||||
[Cubic](#cubic) pattern with extra internal divisions, improving X-Y strength.
|
||||
|
||||
- **Horizontal Strength (X-Y):** High
|
||||
- **Vertical Strength (Z):** High
|
||||
- **Strength**
|
||||
- **Horizontal (X-Y):** 🟣 High
|
||||
- **Vertical (Z):** 🟣 High
|
||||
- **Density Calculation:** % of total infill volume
|
||||
- **Material Usage:** Normal
|
||||
- **Print Time:** Normal-Low
|
||||
- **Material/Time (Higher better):** Normal-High
|
||||
- **Material Usage:** ⚪️ Normal
|
||||
- **Print Time:** 🔘 Normal-Low
|
||||
- **Material/Time (Higher better):** 🔘 Normal-High
|
||||
- **Layer time Variability:** 🔵 Unnoticeable
|
||||
- **Applies to:**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)**
|
||||
|
||||
|
|
@ -263,12 +330,14 @@ Similar to the [triangles](#triangles) pattern but offset to prevent triple over
|
|||
|
||||
Support |Cubic is a variation of the [Cubic](#cubic) infill pattern that is specifically designed for support top layers. Will use more material than Lightning infill but will provide better strength. Nevertheless, it is still a low-density infill pattern.
|
||||
|
||||
- **Horizontal Strength (X-Y):** Low
|
||||
- **Vertical Strength (Z):** Low
|
||||
- **Strength**
|
||||
- **Horizontal (X-Y):** 🟡 Low
|
||||
- **Vertical (Z):** 🟡 Low
|
||||
- **Density Calculation:** % of layer before top shell layers
|
||||
- **Material Usage:** Extra-Low
|
||||
- **Print Time:** Extra-Low
|
||||
- **Material/Time (Higher better):** Normal
|
||||
- **Material Usage:** 🔵 Extra-Low
|
||||
- **Print Time:** 🔵 Extra-Low
|
||||
- **Material/Time (Higher better):** 🟡 Low
|
||||
- **Layer time Variability:** 🔴 Likely Noticeable
|
||||
- **Applies to:**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)**
|
||||
|
||||
|
|
@ -278,12 +347,14 @@ Support |Cubic is a variation of the [Cubic](#cubic) infill pattern that is spec
|
|||
|
||||
Ultra-fast, ultra-low material infill. Designed for speed and efficiency, ideal for quick prints or non-structural prototypes.
|
||||
|
||||
- **Horizontal Strength (X-Y):** Low
|
||||
- **Vertical Strength (Z):** Low
|
||||
- **Strength**
|
||||
- **Horizontal (X-Y):** 🟡 Low
|
||||
- **Vertical (Z):** 🟡 Low
|
||||
- **Density Calculation:** % of layer before top shell layers
|
||||
- **Material Usage:** Ultra-Low
|
||||
- **Print Time:** Ultra-Low
|
||||
- **Material/Time (Higher better):** Low
|
||||
- **Material Usage:** 🟢 Ultra-Low
|
||||
- **Print Time:** 🟢 Ultra-Low
|
||||
- **Material/Time (Higher better):** ⚪️ Normal-Low
|
||||
- **Layer time Variability:** 🔴 Likely Noticeable
|
||||
- **Applies to:**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)**
|
||||
|
||||
|
|
@ -293,12 +364,14 @@ Ultra-fast, ultra-low material infill. Designed for speed and efficiency, ideal
|
|||
|
||||
Hexagonal pattern balancing strength and material use. Double walls in each hexagon increase material consumption.
|
||||
|
||||
- **Horizontal Strength (X-Y):** High
|
||||
- **Vertical Strength (Z):** High
|
||||
- **Strength**
|
||||
- **Horizontal (X-Y):** 🟣 High
|
||||
- **Vertical (Z):** 🟣 High
|
||||
- **Density Calculation:** % of total infill volume
|
||||
- **Material Usage:** High
|
||||
- **Print Time:** Ultra-High
|
||||
- **Material/Time (Higher better):** Low
|
||||
- **Material Usage:** 🟡 High
|
||||
- **Print Time:** 🔴 Ultra-High
|
||||
- **Material/Time (Higher better):** 🟡 Low
|
||||
- **Layer time Variability:** 🟢 None
|
||||
- **Applies to:**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)**
|
||||
|
||||
|
|
@ -308,12 +381,14 @@ Hexagonal pattern balancing strength and material use. Double walls in each hexa
|
|||
|
||||
This infill tries to generate a printable honeycomb structure by printing squares and octagons maintaining a vertical angle high enough to maintain contact with the previous layer.
|
||||
|
||||
- **Horizontal Strength (X-Y):** Normal-High
|
||||
- **Vertical Strength (Z):** Normal-High
|
||||
- **Strength**
|
||||
- **Horizontal (X-Y):** 🔘 Normal-High
|
||||
- **Vertical (Z):** 🔘 Normal-High
|
||||
- **Density Calculation:** Unknown
|
||||
- **Material Usage:** Normal-Low
|
||||
- **Print Time:** High
|
||||
- **Material/Time (Higher better):** Low
|
||||
- **Material Usage:** 🔘 Normal-Low
|
||||
- **Print Time:** 🟠 Extra-High
|
||||
- **Material/Time (Higher better):** 🟡 Low
|
||||
- **Layer time Variability:** 🟡 Possibly Noticeable
|
||||
- **Applies to:**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)**
|
||||
|
||||
|
|
@ -323,12 +398,14 @@ This infill tries to generate a printable honeycomb structure by printing square
|
|||
|
||||
Vertical Honeycomb pattern. Acceptable torsional stiffness. Developed for low densities structures like wings. Improve over [Lateral Lattice](#lateral-lattice) offers same performance with lower densities.This infill includes a Overhang angle parameter to improve the point of contact between layers and reduce the risk of delamination.
|
||||
|
||||
- **Horizontal Strength (X-Y):** Normal-Low
|
||||
- **Vertical Strength (Z):** Normal-Low
|
||||
- **Strength**
|
||||
- **Horizontal (X-Y):** ⚪️ Normal-Low
|
||||
- **Vertical (Z):** ⚪️ Normal-Low
|
||||
- **Density Calculation:** % of total infill volume
|
||||
- **Material Usage:** Normal
|
||||
- **Print Time:** Normal-Low
|
||||
- **Material/Time (Higher better):** Normal-High
|
||||
- **Material Usage:** ⚪️ Normal
|
||||
- **Print Time:** 🔘 Normal-Low
|
||||
- **Material/Time (Higher better):** 🔘 Normal-High
|
||||
- **Layer time Variability:** 🟡 Possibly Noticeable
|
||||
- **Applies to:**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)**
|
||||
|
||||
|
|
@ -338,12 +415,14 @@ Vertical Honeycomb pattern. Acceptable torsional stiffness. Developed for low de
|
|||
|
||||
Low-strength pattern with good flexibility. You can adjust **Angle 1** and **Angle 2** to optimize the infill for your specific model. Each angle adjusts the plane of each layer generated by the pattern. 0° is vertical.
|
||||
|
||||
- **Horizontal Strength (X-Y):** Normal-Low
|
||||
- **Vertical Strength (Z):** Low
|
||||
- **Strength**
|
||||
- **Horizontal (X-Y):** ⚪️ Normal-Low
|
||||
- **Vertical (Z):** 🟡 Low
|
||||
- **Density Calculation:** % of total infill volume
|
||||
- **Material Usage:** Normal
|
||||
- **Print Time:** Normal-Low
|
||||
- **Material/Time (Higher better):** Normal-High
|
||||
- **Material Usage:** ⚪️ Normal
|
||||
- **Print Time:** 🔘 Normal-Low
|
||||
- **Material/Time (Higher better):** 🔘 Normal-High
|
||||
- **Layer time Variability:** 🔵 Unnoticeable
|
||||
- **Applies to:**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)**
|
||||
|
||||
|
|
@ -354,12 +433,14 @@ Low-strength pattern with good flexibility. You can adjust **Angle 1** and **Ang
|
|||
Similar to [Gyroid](#gyroid) but with linear patterns, creating weak points at internal corners.
|
||||
Easier to slice but consider using [TPMS-D](#tpms-d) or [Gyroid](#gyroid) for better strength and flexibility.
|
||||
|
||||
- **Horizontal Strength (X-Y):** Normal-High
|
||||
- **Vertical Strength (Z):** Normal-High
|
||||
- **Strength**
|
||||
- **Horizontal (X-Y):** 🔘 Normal-High
|
||||
- **Vertical (Z):** 🔘 Normal-High
|
||||
- **Density Calculation:** % of total infill volume
|
||||
- **Material Usage:** Normal
|
||||
- **Print Time:** Normal-High
|
||||
- **Material/Time (Higher better):** Normal-Low
|
||||
- **Material Usage:** ⚪️ Normal
|
||||
- **Print Time:** 🟡 High
|
||||
- **Material/Time (Higher better):** 🟡 Low
|
||||
- **Layer time Variability:** 🔴 Likely Noticeable
|
||||
- **Applies to:**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)**
|
||||
|
||||
|
|
@ -369,12 +450,14 @@ Easier to slice but consider using [TPMS-D](#tpms-d) or [Gyroid](#gyroid) for be
|
|||
|
||||
Triply Periodic Minimal Surface (Schwarz Diamond). Hybrid between [Cross Hatch](#cross-hatch) and [Gyroid](#gyroid), combining rigidity and smooth transitions. Isotropic and strong in all directions. This geometry is faster to slice than Gyroid, but slower than Cross Hatch.
|
||||
|
||||
- **Horizontal Strength (X-Y):** High
|
||||
- **Vertical Strength (Z):** High
|
||||
- **Strength**
|
||||
- **Horizontal (X-Y):** 🟣 High
|
||||
- **Vertical (Z):** 🟣 High
|
||||
- **Density Calculation:** % of total infill volume
|
||||
- **Material Usage:** Normal
|
||||
- **Print Time:** High
|
||||
- **Material/Time (Higher better):** Normal-Low
|
||||
- **Material Usage:** ⚪️ Normal
|
||||
- **Print Time:** 🟡 High
|
||||
- **Material/Time (Higher better):** 🟡 Low
|
||||
- **Layer time Variability:** 🟡 Possibly Noticeable
|
||||
- **Applies to:**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)**
|
||||
|
||||
|
|
@ -384,12 +467,14 @@ Triply Periodic Minimal Surface (Schwarz Diamond). Hybrid between [Cross Hatch](
|
|||
|
||||
Triply Periodic Minimal Surface (Fischer–Koch S) pattern. Its smooth, continuous geometry resembles trabecular bone microstructure, offering a balance between rigidity and energy absorption. Compared to [TPMS-D](#tpms-d), it has more complex curvature, which can improve load distribution and shock absorption in functional parts.
|
||||
|
||||
- **Horizontal Strength (X-Y):** Normal-High
|
||||
- **Vertical Strength (Z):** Normal-High
|
||||
- **Strength**
|
||||
- **Horizontal (X-Y):** 🔘 Normal-High
|
||||
- **Vertical (Z):** 🔘 Normal-High
|
||||
- **Density Calculation:** % of total infill volume
|
||||
- **Material Usage:** Normal
|
||||
- **Print Time:** High
|
||||
- **Material/Time (Higher better):** Low
|
||||
- **Material Usage:** ⚪️ Normal
|
||||
- **Print Time:** 🔴 Ultra-High
|
||||
- **Material/Time (Higher better):** 🟡 Low
|
||||
- **Layer time Variability:** 🟡 Possibly Noticeable
|
||||
- **Applies to:**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)**
|
||||
|
||||
|
|
@ -399,12 +484,14 @@ Triply Periodic Minimal Surface (Fischer–Koch S) pattern. Its smooth, continuo
|
|||
|
||||
Mathematical, isotropic surface providing equal strength in all directions. Excellent for strong, flexible prints and resin filling due to its interconnected structure. This pattern may require more time to slice because of all the points needed to generate each curve. If your model has complex geometry, consider using a simpler infill pattern like [TPMS-D](#tpms-d) or [Cross Hatch](#cross-hatch).
|
||||
|
||||
- **Horizontal Strength (X-Y):** High
|
||||
- **Vertical Strength (Z):** High
|
||||
- **Strength**
|
||||
- **Horizontal (X-Y):** 🟣 High
|
||||
- **Vertical (Z):** 🟣 High
|
||||
- **Density Calculation:** % of total infill volume
|
||||
- **Material Usage:** Normal
|
||||
- **Print Time:** Normal-High
|
||||
- **Material/Time (Higher better):** Normal-Low
|
||||
- **Material Usage:** ⚪️ Normal
|
||||
- **Print Time:** 🔴 Ultra-High
|
||||
- **Material/Time (Higher better):** 🟡 Low
|
||||
- **Layer time Variability:** 🔵 Unnoticeable
|
||||
- **Applies to:**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)**
|
||||
|
||||
|
|
@ -414,14 +501,17 @@ Mathematical, isotropic surface providing equal strength in all directions. Exce
|
|||
|
||||
Fills the area with progressively smaller versions of the outer contour, creating a concentric pattern. Ideal for 100% infill or flexible prints.
|
||||
|
||||
- **Horizontal Strength (X-Y):** Low
|
||||
- **Vertical Strength (Z):** Normal
|
||||
- **Strength**
|
||||
- **Horizontal (X-Y):** 🟡 Low
|
||||
- **Vertical (Z):** ⚪️ Normal
|
||||
- **Density Calculation:** % of total infill volume
|
||||
- **Material Usage:** Normal
|
||||
- **Print Time:** Normal-Low
|
||||
- **Material/Time (Higher better):** Normal-High
|
||||
- **Material Usage:** ⚪️ Normal
|
||||
- **Print Time:** 🔘 Normal-Low
|
||||
- **Material/Time (Higher better):** 🔘 Normal-High
|
||||
- **Layer time Variability:** 🟢 None
|
||||
- **Applies to:**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)** - **[Solid Infill](strength_settings_infill#internal-solid-infill)**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)**
|
||||
- **[Solid Infill](strength_settings_infill#internal-solid-infill)**
|
||||
- **[Surface](strength_settings_top_bottom_shells)**
|
||||
- **[Ironing](quality_settings_ironing)**
|
||||
|
||||
|
|
@ -429,17 +519,20 @@ Fills the area with progressively smaller versions of the outer contour, creatin
|
|||
|
||||
## Hilbert Curve
|
||||
|
||||
Hilbert Curve is a space-filling curve that can be used to create a continuous infill pattern. It is known for its Aesthetic appeal and ability to fill space efficiently.
|
||||
Print speed is very low due to the complexity of the path, which can lead to longer print times. It is not recommended for structural parts but can be used for Aesthetic purposes.
|
||||
Hilbert Curve is a space-filling curve that can be used to create a continuous infill pattern. It is known for its aesthetic appeal and ability to fill space efficiently.
|
||||
Print speed is very low due to the complexity of the path, which can lead to longer print times. It is not recommended for structural parts but can be used for aesthetic purposes.
|
||||
|
||||
- **Horizontal Strength (X-Y):** Low
|
||||
- **Vertical Strength (Z):** Normal
|
||||
- **Strength**
|
||||
- **Horizontal (X-Y):** 🟡 Low
|
||||
- **Vertical (Z):** ⚪️ Normal
|
||||
- **Density Calculation:** % of total infill volume
|
||||
- **Material Usage:** Normal
|
||||
- **Print Time:** High
|
||||
- **Material/Time (Higher better):** Low
|
||||
- **Material Usage:** ⚪️ Normal
|
||||
- **Print Time:** 🟠 Extra-High
|
||||
- **Material/Time (Higher better):** 🟡 Low
|
||||
- **Layer time Variability:** 🟢 None
|
||||
- **Applies to:**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)** - **[Solid Infill](strength_settings_infill#internal-solid-infill)**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)**
|
||||
- **[Solid Infill](strength_settings_infill#internal-solid-infill)**
|
||||
- **[Surface](strength_settings_top_bottom_shells)**
|
||||
|
||||

|
||||
|
|
@ -448,14 +541,17 @@ Print speed is very low due to the complexity of the path, which can lead to lon
|
|||
|
||||
Spiral pattern that fills the area with concentric arcs, creating a smooth and continuous infill. Can be filled with resin thanks to its interconnected hollow structure, which allows the resin to flow through it and cure properly.
|
||||
|
||||
- **Horizontal Strength (X-Y):** Low
|
||||
- **Vertical Strength (Z):** Normal
|
||||
- **Strength**
|
||||
- **Horizontal (X-Y):** 🟡 Low
|
||||
- **Vertical (Z):** ⚪️ Normal
|
||||
- **Density Calculation:** % of total infill volume
|
||||
- **Material Usage:** Normal
|
||||
- **Print Time:** Normal-Low
|
||||
- **Material/Time (Higher better):** Normal-High
|
||||
- **Material Usage:** ⚪️ Normal
|
||||
- **Print Time:** 🔘 Normal-Low
|
||||
- **Material/Time (Higher better):** 🔘 Normal-High
|
||||
- **Layer time Variability:** 🟢 None
|
||||
- **Applies to:**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)** - **[Solid Infill](strength_settings_infill#internal-solid-infill)**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)**
|
||||
- **[Solid Infill](strength_settings_infill#internal-solid-infill)**
|
||||
- **[Surface](strength_settings_top_bottom_shells)**
|
||||
|
||||

|
||||
|
|
@ -464,14 +560,17 @@ Spiral pattern that fills the area with concentric arcs, creating a smooth and c
|
|||
|
||||
Aesthetic pattern with low strength and high print time.
|
||||
|
||||
- **Horizontal Strength (X-Y):** Low
|
||||
- **Vertical Strength (Z):** Normal
|
||||
- **Strength**
|
||||
- **Horizontal (X-Y):** 🟡 Low
|
||||
- **Vertical (Z):** ⚪️ Normal
|
||||
- **Density Calculation:** % of total infill volume
|
||||
- **Material Usage:** Normal
|
||||
- **Print Time:** Normal
|
||||
- **Material/Time (Higher better):** Normal-Low
|
||||
- **Material Usage:** ⚪️ Normal
|
||||
- **Print Time:** ⚪️ Normal
|
||||
- **Material/Time (Higher better):** ⚪️ Normal
|
||||
- **Layer time Variability:** 🟢 None
|
||||
- **Applies to:**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)** - **[Solid Infill](strength_settings_infill#internal-solid-infill)**
|
||||
- **[Sparse Infill](strength_settings_infill#sparse-infill-density)**
|
||||
- **[Solid Infill](strength_settings_infill#internal-solid-infill)**
|
||||
- **[Surface](strength_settings_top_bottom_shells)**
|
||||
|
||||

|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ Support structures are used in 3D printing to provide stability to overhangs and
|
|||
- [Initial layer density](#initial-layer-density)
|
||||
- [Initial layer expansion](#initial-layer-expansion)
|
||||
- [On build plate only](#on-build-plate-only)
|
||||
- [Remove small overhangs](#remove-small-overhangs)
|
||||
- [Ignore small overhangs](#ignore-small-overhangs)
|
||||
|
||||
## Type
|
||||
|
||||
|
|
@ -95,6 +95,6 @@ Expand the first raft or support layer to improve bed plate adhesion.
|
|||
|
||||
Don't create support on model surface, only on build plate.
|
||||
|
||||
## Remove small overhangs
|
||||
## Ignore small overhangs
|
||||
|
||||
Remove small overhangs that possibly need no supports.
|
||||
With this setting small overhangs that possibly need no supports will be ignored from support generation.
|
||||
|
|
|
|||
|
|
@ -1,3 +1,47 @@
|
|||
src/libslic3r/PresetBundle.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevBed.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevBed.h
|
||||
src/slic3r/GUI/DeviceCore/DevConfig.h
|
||||
src/slic3r/GUI/DeviceCore/DevConfig.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevConfigUtil.h
|
||||
src/slic3r/GUI/DeviceCore/DevConfigUtil.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevCtrl.h
|
||||
src/slic3r/GUI/DeviceCore/DevCtrl.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevDefs.h
|
||||
src/slic3r/GUI/DeviceCore/DevExtruderSystem.h
|
||||
src/slic3r/GUI/DeviceCore/DevExtruderSystem.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevExtruderSystemCtrl.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevFan.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevFan.h
|
||||
src/slic3r/GUI/DeviceCore/DevFilaAmsSetting.h
|
||||
src/slic3r/GUI/DeviceCore/DevFilaAmsSetting.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevFilaBlackList.h
|
||||
src/slic3r/GUI/DeviceCore/DevFilaBlackList.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevFilaSystem.h
|
||||
src/slic3r/GUI/DeviceCore/DevFilaSystem.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevFirmware.h
|
||||
src/slic3r/GUI/DeviceCore/DevFirmware.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevPrintOptions.h
|
||||
src/slic3r/GUI/DeviceCore/DevPrintOptions.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevPrintTaskInfo.h
|
||||
src/slic3r/GUI/DeviceCore/DevPrintTaskInfo.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevHMS.h
|
||||
src/slic3r/GUI/DeviceCore/DevHMS.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevStorage.h
|
||||
src/slic3r/GUI/DeviceCore/DevStorage.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevInfo.h
|
||||
src/slic3r/GUI/DeviceCore/DevInfo.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevLamp.h
|
||||
src/slic3r/GUI/DeviceCore/DevLamp.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevLampCtrl.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevManager.h
|
||||
src/slic3r/GUI/DeviceCore/DevManager.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevMapping.h
|
||||
src/slic3r/GUI/DeviceCore/DevMapping.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevNozzleSystem.h
|
||||
src/slic3r/GUI/DeviceCore/DevNozzleSystem.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevUtil.h
|
||||
src/slic3r/GUI/DeviceCore/DevUtil.cpp
|
||||
src/slic3r/GUI/DeviceTab/uiAmsHumidityPopup.h
|
||||
src/slic3r/GUI/DeviceTab/uiAmsHumidityPopup.cpp
|
||||
src/slic3r/GUI/DeviceTab/uiDeviceUpdateVersion.h
|
||||
|
|
@ -5,6 +49,7 @@ src/slic3r/GUI/DeviceTab/uiDeviceUpdateVersion.cpp
|
|||
src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp
|
||||
src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp
|
||||
src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp
|
||||
src/slic3r/GUI/Gizmos/GLGizmoFuzzySkin.cpp
|
||||
src/slic3r/GUI/Gizmos/GLGizmoMove.cpp
|
||||
src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp
|
||||
src/slic3r/GUI/Gizmos/GLGizmoScale.cpp
|
||||
|
|
@ -38,6 +83,9 @@ src/slic3r/GUI/HintNotification.cpp
|
|||
src/slic3r/GUI/IMSlider.cpp
|
||||
src/slic3r/GUI/Widgets/SideTools.cpp
|
||||
src/slic3r/GUI/Widgets/AMSControl.cpp
|
||||
src/slic3r/GUI/Widgets/FanControl.cpp
|
||||
src/slic3r/GUI/Widgets/FilamentLoad.cpp
|
||||
src/slic3r/GUI/Widgets/TempInput.cpp
|
||||
src/slic3r/GUI/ImGuiWrapper.cpp
|
||||
src/slic3r/GUI/Jobs/ArrangeJob.cpp
|
||||
src/slic3r/GUI/Jobs/OrientJob.cpp
|
||||
|
|
@ -57,15 +105,11 @@ src/slic3r/GUI/BBLTopbar.cpp
|
|||
src/slic3r/GUI/DownloadProgressDialog.cpp
|
||||
src/slic3r/GUI/RecenterDialog.cpp
|
||||
src/slic3r/GUI/BackgroundSlicingProcess.cpp
|
||||
src/slic3r/GUI/MultiMachinePage.cpp
|
||||
src/slic3r/GUI/MultiMachineManagerPage.cpp
|
||||
src/slic3r/GUI/MultiMachine.cpp
|
||||
src/slic3r/GUI/MultiTaskManagerPage.cpp
|
||||
src/slic3r/GUI/SendMultiMachinePage.cpp
|
||||
src/slic3r/GUI/BedShapeDialog.cpp
|
||||
src/slic3r/GUI/BedShapeDialog.hpp
|
||||
src/slic3r/GUI/ConfigManipulation.cpp
|
||||
src/slic3r/GUI/DeviceManager.cpp
|
||||
src/slic3r/GUI/DeviceErrorDialog.cpp
|
||||
src/slic3r/GUI/ExtraRenderers.cpp
|
||||
src/slic3r/GUI/EditGCodeDialog.cpp
|
||||
src/slic3r/GUI/Field.cpp
|
||||
|
|
@ -79,8 +123,10 @@ src/slic3r/GUI/MainFrame.cpp
|
|||
src/slic3r/GUI/MediaPlayCtrl.cpp
|
||||
src/slic3r/GUI/MediaFilePanel.cpp
|
||||
src/slic3r/GUI/ImageGrid.cpp
|
||||
src/slic3r/GUI/Widgets/ImageSwitchButton.cpp
|
||||
src/slic3r/GUI/Printer/PrinterFileSystem.cpp
|
||||
src/slic3r/GUI/Mouse3DController.cpp
|
||||
src/slic3r/GUI/SelectMachinePop.cpp
|
||||
src/slic3r/GUI/StatusPanel.cpp
|
||||
src/slic3r/GUI/Monitor.cpp
|
||||
src/slic3r/GUI/MsgDialog.cpp
|
||||
|
|
@ -104,6 +150,7 @@ src/slic3r/GUI/SavePresetDialog.cpp
|
|||
src/slic3r/GUI/Search.cpp
|
||||
src/slic3r/GUI/Selection.cpp
|
||||
src/slic3r/GUI/SelectMachine.cpp
|
||||
src/slic3r/GUI/PrePrintChecker.cpp
|
||||
src/slic3r/GUI/SendSystemInfoDialog.cpp
|
||||
src/slic3r/GUI/SendToPrinter.cpp
|
||||
src/slic3r/GUI/SlicingProgressNotification.cpp
|
||||
|
|
@ -115,6 +162,7 @@ src/slic3r/GUI/Auxiliary.cpp
|
|||
src/slic3r/GUI/UpdateDialogs.cpp
|
||||
src/slic3r/GUI/UnsavedChangesDialog.cpp
|
||||
src/slic3r/GUI/ObjColorDialog.cpp
|
||||
src/slic3r/GUI/SyncAmsInfoDialog.cpp
|
||||
src/slic3r/GUI/WipeTowerDialog.cpp
|
||||
src/slic3r/GUI/wxExtensions.cpp
|
||||
src/slic3r/GUI/wxMediaCtrl2.cpp
|
||||
|
|
@ -132,6 +180,7 @@ src/slic3r/Utils/Http.cpp
|
|||
src/slic3r/Utils/Process.cpp
|
||||
src/slic3r/GUI/Jobs/PrintJob.cpp
|
||||
src/libslic3r/GCode.cpp
|
||||
src/libslic3r/GCode/ToolOrdering.cpp
|
||||
src/libslic3r/ExtrusionEntity.cpp
|
||||
src/libslic3r/Flow.cpp
|
||||
src/libslic3r/Format/AMF.cpp
|
||||
|
|
@ -171,9 +220,25 @@ src/slic3r/Utils/MKS.cpp
|
|||
src/slic3r/Utils/OctoPrint.cpp
|
||||
src/slic3r/Utils/Repetier.cpp
|
||||
src/slic3r/Utils/ProfileDescription.hpp
|
||||
src/slic3r/GUI/SendMultiMachinePage.cpp
|
||||
src/slic3r/GUI/MultiMachinePage.cpp
|
||||
src/slic3r/GUI/MultiMachineManagerPage.cpp
|
||||
src/slic3r/GUI/MultiTaskManagerPage.cpp
|
||||
src/slic3r/GUI/MultiMachine.cpp
|
||||
src/slic3r/GUI/FilamentMapDialog.cpp
|
||||
src/slic3r/GUI/FilamentGroupPopup.cpp
|
||||
src/slic3r/GUI/FilamentMapPanel.cpp
|
||||
src/slic3r/Utils/Obico.cpp
|
||||
src/slic3r/Utils/SimplyPrint.cpp
|
||||
src/slic3r/Utils/Flashforge.cpp
|
||||
src/slic3r/GUI/Jobs/OAuthJob.cpp
|
||||
src/slic3r/GUI/BackgroundSlicingProcess.cpp
|
||||
src/slic3r/GUI/Gizmos/GLGizmoBrimEars.cpp
|
||||
src/slic3r/GUI/PartSkipDialog.cpp
|
||||
src/slic3r/GUI/PartSkipDialog.hpp
|
||||
src/slic3r/GUI/SkipPartCanvas.cpp
|
||||
src/slic3r/GUI/SkipPartCanvas.hpp
|
||||
src/slic3r/GUI/FilamentBitmapUtils.cpp
|
||||
src/slic3r/GUI/FilamentBitmapUtils.hpp
|
||||
src/slic3r/GUI/FilamentPickerDialog.cpp
|
||||
src/slic3r/GUI/FilamentPickerDialog.hpp
|
||||
|
|
|
|||
21287
localization/i18n/vi/OrcaSlicer_vi.po
Normal file
BIN
resources/calib/cornering/SCV-V2.stl
Normal file
BIN
resources/calib/pressure_advance/auto_pa_line_dual.3mf
Normal file
BIN
resources/calib/pressure_advance/auto_pa_line_single.3mf
Normal file
|
|
@ -1,4 +1,92 @@
|
|||
-----BEGIN CERTIFICATE-----
|
||||
MIIFfzCCA2egAwIBAgIUXtzR6tRiL/RHBRXOoyFU0+XrliowDQYJKoZIhvcNAQEL
|
||||
BQAwRjELMAkGA1UEBhMCQ04xITAfBgNVBAoMGEJCTCBUZWNobm9sb2dpZXMgQ28u
|
||||
IEx0ZDEUMBIGA1UEAwwLQkJMIENBMiBSU0EwIBcNMjUwNjE3MDEzODA4WhgPMjA1
|
||||
MDA2MTcwMTM4MDhaMEYxCzAJBgNVBAYTAkNOMSEwHwYDVQQKDBhCQkwgVGVjaG5v
|
||||
bG9naWVzIENvLiBMdGQxFDASBgNVBAMMC0JCTCBDQTIgUlNBMIICIjANBgkqhkiG
|
||||
9w0BAQEFAAOCAg8AMIICCgKCAgEAo4550G4c42gTKzQqixwKT089RizIdZpyOcGA
|
||||
679rPaOdWsMqVwnYPP2FpMqXKkjFbedE+SpGloi2NKCuiPNVRbq9PHOOZwTs7YLo
|
||||
bOwf53FJuO6vRFpzFfX1tlc9zlFqJvZnYO9NgHpMysidocWcgrDN/SIDywgPB5CV
|
||||
bYg3Vvzua9fwZx9e5KT9xd5IpTqdTrWS47jQOVKLhdQCbJFIlMrblOwLBAx+fHok
|
||||
wqh6tkI6Ktuyyjw8Dysebi1ndWjKtZ2mW47r8xZ/J+z3EZqcyJMY6MRtx/zb1jBF
|
||||
uHtkjrb5Kv1DMzSKlkaNJIbvC+Mk+hI97W+SjLSRuIdC7+oJUzWaSzgu9cjXCVfm
|
||||
q8t4IL/35hP69PK95LgLectIrP96CYAT/aVMG19FrFW0QWEyfT+kzG4jkumfPbHq
|
||||
Y2nNkEN0+tjj3h4WdzrWgQEojK/lhfcRFVkts74+aZoMpQP+vmL17CKmSzXk5o/e
|
||||
K21xgxJdzMbdztfTpibiXk0abfOpN+1VR+3NYa+bROAKNyGaReEGsyW2bjcjNx51
|
||||
5Vqzj3SVxhMSp5vfF9E4A1jE99M/l9jQDM6RzkT0lMccGAd5tUSdNvDlrqtQaQiK
|
||||
v/ZsXPgXLTWfOpvaLNEgwdMgZMuhjpkwvAZyoYfeF9kyydjDh7bvrX//cz/VopAU
|
||||
lxUtQtMCAwEAAaNjMGEwHQYDVR0OBBYEFNVJgQad1sNTN0jxVkwbJ/XM1an1MB8G
|
||||
A1UdIwQYMBaAFNVJgQad1sNTN0jxVkwbJ/XM1an1MA8GA1UdEwEB/wQFMAMBAf8w
|
||||
DgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQBFZDKMJfp/N4gBeFHh
|
||||
MiFehaUyMS6e9mzrTfMLJLJoj6Jopa9V9jIfcCEBGZuRThqFcATV+UdFHSINpUcH
|
||||
upcCYnazTRC4dn1hnxnQ1ojQcHxdGp9xGw/YclAKD97d8bPShfBMT1to9zbMK7T5
|
||||
L8zgqg01YIOKjQk0Hcd0+0iUr6m8zQ5P8Rl3QXqAyeWgqmYQrrjTWwPsgdfHNXKX
|
||||
vDrx7/cqry5lKU802hUplKMBxelv4W8407Ytj1lfJOwvxqxxsFU5jSwcUG3zo2vk
|
||||
QtjRs8m5BKup5K1OPYkkPu7Ld89X0XpU073/dNDG11uxb1eDKrtNP6vZuZjNE2Pq
|
||||
8HCoI1EtP+ItyqtUMvHi6Z2zsmlA25broVioeUKxjlIecpQ9JR/FhDu9CWNF/nDW
|
||||
LSORNaMMzgsMSzI+HCiUhqN+qMIvVP6rzGTJzwqz/lc5Lf+ZPCnGA9WJTT4uPIhf
|
||||
ufbZmnUJ35WuWKHxovDsqBh88zQ9sZ+ei4Hi4vVzOhUgfG3aLoSQEYqRoqaboANh
|
||||
wCwzyuW2Rv54u5QSBbd6Gx1OpvsWmLPWd2/iL2kISl5wfmLGVydvSJa+rbOfuAy7
|
||||
ycVQacVDQCAnbhoVrQy7+454QsKSW3ZV6BcyRrorewCyCYgd7nyxflxHZTBEykXX
|
||||
haGNe/KFNvJBMOIuIUzknRRmiQ==
|
||||
-----END CERTIFICATE-----
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIB8zCCAZmgAwIBAgIUe61jGQ4RzIC8k+sNuqbI/CaNqPIwCgYIKoZIzj0EAwIw
|
||||
RjELMAkGA1UEBhMCQ04xITAfBgNVBAoMGEJCTCBUZWNobm9sb2dpZXMgQ28uIEx0
|
||||
ZDEUMBIGA1UEAwwLQkJMIENBMiBFQ0MwIBcNMjUwNjE3MDEzODM1WhgPMjA1MDA2
|
||||
MTcwMTM4MzVaMEYxCzAJBgNVBAYTAkNOMSEwHwYDVQQKDBhCQkwgVGVjaG5vbG9n
|
||||
aWVzIENvLiBMdGQxFDASBgNVBAMMC0JCTCBDQTIgRUNDMFkwEwYHKoZIzj0CAQYI
|
||||
KoZIzj0DAQcDQgAEpKTF7wRSty4DXpGJzgCPwRh8ghLlxUC3qJbyEgLqTvJgbiwY
|
||||
APPHK7kVbVmerkqhHOT4QeWRlTG3dOQGLA2VpaNjMGEwHQYDVR0OBBYEFKuRpsjY
|
||||
REOyIKH7HwOE6jhGBd6NMB8GA1UdIwQYMBaAFKuRpsjYREOyIKH7HwOE6jhGBd6N
|
||||
MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMCA0gA
|
||||
MEUCIErBiUm3VdtP3rz4kb8aLpI5p+BzL7M9vElBGWWJxpHMAiEA3r5tJWVGwuxi
|
||||
YCrB1c40KYFRFyahGrhOJZAj/YhRdnU=
|
||||
-----END CERTIFICATE-----
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIEeTCCA2GgAwIBAgIUOq+lNIaC2xsswkFqj5JPyVBl45cwDQYJKoZIhvcNAQEL
|
||||
BQAwQjELMAkGA1UEBhMCQ04xIjAgBgNVBAoMGUJCTCBUZWNobm9sb2dpZXMgQ28u
|
||||
LCBMdGQxDzANBgNVBAMMBkJCTCBDQTAeFw0yNTA2MTcwMjAxMjdaFw0zNTA2MTUw
|
||||
MjAxMjdaMEYxCzAJBgNVBAYTAkNOMSEwHwYDVQQKDBhCQkwgVGVjaG5vbG9naWVz
|
||||
IENvLiBMdGQxFDASBgNVBAMMC0JCTCBDQTIgUlNBMIICIjANBgkqhkiG9w0BAQEF
|
||||
AAOCAg8AMIICCgKCAgEAo4550G4c42gTKzQqixwKT089RizIdZpyOcGA679rPaOd
|
||||
WsMqVwnYPP2FpMqXKkjFbedE+SpGloi2NKCuiPNVRbq9PHOOZwTs7YLobOwf53FJ
|
||||
uO6vRFpzFfX1tlc9zlFqJvZnYO9NgHpMysidocWcgrDN/SIDywgPB5CVbYg3Vvzu
|
||||
a9fwZx9e5KT9xd5IpTqdTrWS47jQOVKLhdQCbJFIlMrblOwLBAx+fHokwqh6tkI6
|
||||
Ktuyyjw8Dysebi1ndWjKtZ2mW47r8xZ/J+z3EZqcyJMY6MRtx/zb1jBFuHtkjrb5
|
||||
Kv1DMzSKlkaNJIbvC+Mk+hI97W+SjLSRuIdC7+oJUzWaSzgu9cjXCVfmq8t4IL/3
|
||||
5hP69PK95LgLectIrP96CYAT/aVMG19FrFW0QWEyfT+kzG4jkumfPbHqY2nNkEN0
|
||||
+tjj3h4WdzrWgQEojK/lhfcRFVkts74+aZoMpQP+vmL17CKmSzXk5o/eK21xgxJd
|
||||
zMbdztfTpibiXk0abfOpN+1VR+3NYa+bROAKNyGaReEGsyW2bjcjNx515Vqzj3SV
|
||||
xhMSp5vfF9E4A1jE99M/l9jQDM6RzkT0lMccGAd5tUSdNvDlrqtQaQiKv/ZsXPgX
|
||||
LTWfOpvaLNEgwdMgZMuhjpkwvAZyoYfeF9kyydjDh7bvrX//cz/VopAUlxUtQtMC
|
||||
AwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
|
||||
BBYEFNVJgQad1sNTN0jxVkwbJ/XM1an1MB8GA1UdIwQYMBaAFI80QmjcZ06PxCKe
|
||||
xXxJ5avdRL4eMA0GCSqGSIb3DQEBCwUAA4IBAQAvS8tyfagaGsFf9YncA2ko/Na5
|
||||
9BVF+8TlUo+32oznwIVpS1AhSgLP6rNVekXNFKbuP5htudLQ17ZRBJI/UMVyYEDq
|
||||
IN7xv7Zj+zJwF6W6haYrjb2Vk8igw1XvNULZfvVNNKIkvJUiVqEslWrC+k74crk/
|
||||
Wv8ChVf+zqvfIN6LV3esaGRL02J3AprQGb7DDhR1EefQMScDkNpGJMUmvCmfknrl
|
||||
iK8qgvQN1SWO7JRf6fNKHsN1ZQvyP0pgLWxpT3V0/0/WttqX3cMGuJF+jVUzm/Nh
|
||||
xYhFewG8vc3KzTjnwQApMA6CW554FOJWFyOD2jn5yJLT3Vue+aYDQRp4bKMx
|
||||
-----END CERTIFICATE-----
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIICrjCCAZagAwIBAgIUOq+lNIaC2xsswkFqj5JPyVBl45gwDQYJKoZIhvcNAQEL
|
||||
BQAwQjELMAkGA1UEBhMCQ04xIjAgBgNVBAoMGUJCTCBUZWNobm9sb2dpZXMgQ28u
|
||||
LCBMdGQxDzANBgNVBAMMBkJCTCBDQTAeFw0yNTA2MTcwMjAxNDdaFw0zNTA2MTUw
|
||||
MjAxNDdaMEYxCzAJBgNVBAYTAkNOMSEwHwYDVQQKDBhCQkwgVGVjaG5vbG9naWVz
|
||||
IENvLiBMdGQxFDASBgNVBAMMC0JCTCBDQTIgRUNDMFkwEwYHKoZIzj0CAQYIKoZI
|
||||
zj0DAQcDQgAEpKTF7wRSty4DXpGJzgCPwRh8ghLlxUC3qJbyEgLqTvJgbiwYAPPH
|
||||
K7kVbVmerkqhHOT4QeWRlTG3dOQGLA2VpaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAO
|
||||
BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFKuRpsjYREOyIKH7HwOE6jhGBd6NMB8G
|
||||
A1UdIwQYMBaAFI80QmjcZ06PxCKexXxJ5avdRL4eMA0GCSqGSIb3DQEBCwUAA4IB
|
||||
AQCg6PjUSSZV+4bvejcVMvgXmKzfD95osWn0ctnoMBxPDa+m+Gg+BcLT2IlFAe3E
|
||||
KYMvu4T295WQc92rjKYqW6cirFppng9uEFW2mZLimxaSmutsTftE3sbMVMJ/SLYN
|
||||
PV7TFv6mcBSIFWXwmBOIpbh4BUcVfONTvdSfIqfyAVxsq4xzc2nc6hPBpAm21Ayj
|
||||
ToC1ev/TbDJ8VllFZiEVmWWlIP3aNzAm8S2mOpxPB2WnanaZHSrvXLFhstyzwrjD
|
||||
yO1/isOZ7wtr7rcuTJdEvvvCimOZlkfRhaDoTew9tQ0E2FVpzzSinw02qmQ1xIE9
|
||||
5/H5ZzJSPkpeAHWEPnKkxg0v
|
||||
-----END CERTIFICATE-----
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDZTCCAk2gAwIBAgIUV1FckwXElyek1onFnQ9kL7Bk4N8wDQYJKoZIhvcNAQEL
|
||||
BQAwQjELMAkGA1UEBhMCQ04xIjAgBgNVBAoMGUJCTCBUZWNobm9sb2dpZXMgQ28u
|
||||
LCBMdGQxDzANBgNVBAMMBkJCTCBDQTAeFw0yMjA0MDQwMzQyMTFaFw0zMjA0MDEw
|
||||
|
|
@ -18,4 +106,4 @@ BdOoo96iX89rRPoxeed1cpq5hZwbeka3+CJGV76itWp35Up5rmmUqrlyQOr/Wax6
|
|||
itosIzG0MfhgUzU51A2P/hSnD3NDMXv+wUY/AvqgIL7u7fbDKnku1GzEKIkfH8hm
|
||||
Rs6d8SCU89xyrwzQ0PR853irHas3WrHVqab3P+qNwR0YirL0Qk7Xt/q3O1griNg2
|
||||
Blbjg3obpHo9
|
||||
-----END CERTIFICATE-----
|
||||
-----END CERTIFICATE-----
|
||||
329
resources/flush/flush_data_dual_highflow.txt
Normal file
|
|
@ -0,0 +1,329 @@
|
|||
colors
|
||||
#000000 #FFFFFF #545454 #8E9089 #C12E1F #F4EE2A #0086D6 #F7E6DE #00AE42 #5E43B7 #482960 #0056B8 #FEC600 #EC008C #F5547C #6F5034 #FF9016 #00B1B7 #BECF00
|
||||
src dst flush
|
||||
#000000 #FFFFFF 900
|
||||
#000000 #545454 270
|
||||
#000000 #C12E1F 900
|
||||
#000000 #F4EE2A 900
|
||||
#000000 #0086D6 900
|
||||
#000000 #F7E6DE 900
|
||||
#000000 #00AE42 900
|
||||
#000000 #5E43B7 900
|
||||
#000000 #482960 360
|
||||
#000000 #0056B8 660
|
||||
#000000 #FEC600 900
|
||||
#000000 #EC008C 900
|
||||
#000000 #F5547C 900
|
||||
#000000 #6F5034 510
|
||||
#000000 #FF9016 900
|
||||
#000000 #BECF00 900
|
||||
#FFFFFF #000000 120
|
||||
#FFFFFF #545454 150
|
||||
#FFFFFF #8E9089 120
|
||||
#FFFFFF #C12E1F 120
|
||||
#FFFFFF #F4EE2A 150
|
||||
#FFFFFF #0086D6 90
|
||||
#FFFFFF #F7E6DE 120
|
||||
#FFFFFF #00AE42 120
|
||||
#FFFFFF #5E43B7 150
|
||||
#FFFFFF #482960 120
|
||||
#FFFFFF #0056B8 150
|
||||
#FFFFFF #FEC600 120
|
||||
#FFFFFF #EC008C 150
|
||||
#FFFFFF #F5547C 120
|
||||
#FFFFFF #6F5034 150
|
||||
#FFFFFF #FF9016 120
|
||||
#FFFFFF #00B1B7 90
|
||||
#FFFFFF #BECF00 120
|
||||
#545454 #000000 150
|
||||
#545454 #FFFFFF 480
|
||||
#545454 #8E9089 210
|
||||
#545454 #C12E1F 270
|
||||
#545454 #F4EE2A 390
|
||||
#545454 #0086D6 240
|
||||
#545454 #F7E6DE 360
|
||||
#545454 #00AE42 330
|
||||
#545454 #5E43B7 180
|
||||
#545454 #482960 150
|
||||
#545454 #0056B8 180
|
||||
#545454 #FEC600 300
|
||||
#545454 #EC008C 240
|
||||
#545454 #F5547C 330
|
||||
#545454 #6F5034 120
|
||||
#545454 #FF9016 330
|
||||
#545454 #00B1B7 270
|
||||
#545454 #BECF00 330
|
||||
#8E9089 #000000 180
|
||||
#8E9089 #FFFFFF 330
|
||||
#8E9089 #545454 180
|
||||
#8E9089 #C12E1F 180
|
||||
#8E9089 #F4EE2A 360
|
||||
#8E9089 #0086D6 180
|
||||
#8E9089 #F7E6DE 360
|
||||
#8E9089 #00AE42 120
|
||||
#8E9089 #5E43B7 240
|
||||
#8E9089 #482960 240
|
||||
#8E9089 #0056B8 150
|
||||
#8E9089 #FEC600 330
|
||||
#8E9089 #EC008C 270
|
||||
#8E9089 #F5547C 240
|
||||
#8E9089 #6F5034 300
|
||||
#8E9089 #FF9016 300
|
||||
#8E9089 #00B1B7 180
|
||||
#8E9089 #BECF00 300
|
||||
#C12E1F #000000 150
|
||||
#C12E1F #FFFFFF 600
|
||||
#C12E1F #545454 570
|
||||
#C12E1F #8E9089 390
|
||||
#C12E1F #F4EE2A 900
|
||||
#C12E1F #0086D6 900
|
||||
#C12E1F #F7E6DE 900
|
||||
#C12E1F #00AE42 540
|
||||
#C12E1F #5E43B7 570
|
||||
#C12E1F #482960 210
|
||||
#C12E1F #0056B8 630
|
||||
#C12E1F #FEC600 420
|
||||
#C12E1F #EC008C 270
|
||||
#C12E1F #F5547C 300
|
||||
#C12E1F #6F5034 300
|
||||
#C12E1F #FF9016 390
|
||||
#C12E1F #00B1B7 600
|
||||
#C12E1F #BECF00 660
|
||||
#F4EE2A #000000 150
|
||||
#F4EE2A #FFFFFF 660
|
||||
#F4EE2A #545454 420
|
||||
#F4EE2A #8E9089 300
|
||||
#F4EE2A #C12E1F 180
|
||||
#F4EE2A #0086D6 900
|
||||
#F4EE2A #F7E6DE 900
|
||||
#F4EE2A #00AE42 180
|
||||
#F4EE2A #5E43B7 690
|
||||
#F4EE2A #0056B8 360
|
||||
#F4EE2A #FEC600 120
|
||||
#F4EE2A #EC008C 600
|
||||
#F4EE2A #F5547C 240
|
||||
#F4EE2A #6F5034 270
|
||||
#F4EE2A #FF9016 120
|
||||
#F4EE2A #00B1B7 630
|
||||
#F4EE2A #BECF00 120
|
||||
#0086D6 #000000 120
|
||||
#0086D6 #FFFFFF 510
|
||||
#0086D6 #545454 150
|
||||
#0086D6 #8E9089 180
|
||||
#0086D6 #C12E1F 300
|
||||
#0086D6 #F4EE2A 360
|
||||
#0086D6 #F7E6DE 480
|
||||
#0086D6 #00AE42 120
|
||||
#0086D6 #5E43B7 210
|
||||
#0086D6 #482960 120
|
||||
#0086D6 #0056B8 150
|
||||
#0086D6 #FEC600 330
|
||||
#0086D6 #EC008C 330
|
||||
#0086D6 #F5547C 330
|
||||
#0086D6 #6F5034 150
|
||||
#0086D6 #FF9016 300
|
||||
#0086D6 #00B1B7 120
|
||||
#0086D6 #BECF00 360
|
||||
#F7E6DE #000000 150
|
||||
#F7E6DE #FFFFFF 150
|
||||
#F7E6DE #545454 120
|
||||
#F7E6DE #8E9089 150
|
||||
#F7E6DE #C12E1F 150
|
||||
#F7E6DE #F4EE2A 120
|
||||
#F7E6DE #0086D6 180
|
||||
#F7E6DE #00AE42 150
|
||||
#F7E6DE #5E43B7 210
|
||||
#F7E6DE #482960 150
|
||||
#F7E6DE #0056B8 150
|
||||
#F7E6DE #FEC600 120
|
||||
#F7E6DE #EC008C 150
|
||||
#F7E6DE #F5547C 150
|
||||
#F7E6DE #6F5034 150
|
||||
#F7E6DE #FF9016 120
|
||||
#F7E6DE #00B1B7 120
|
||||
#F7E6DE #BECF00 120
|
||||
#00AE42 #000000 120
|
||||
#00AE42 #FFFFFF 690
|
||||
#00AE42 #545454 330
|
||||
#00AE42 #8E9089 330
|
||||
#00AE42 #C12E1F 270
|
||||
#00AE42 #F4EE2A 480
|
||||
#00AE42 #0086D6 750
|
||||
#00AE42 #F7E6DE 900
|
||||
#00AE42 #5E43B7 450
|
||||
#00AE42 #482960 210
|
||||
#00AE42 #0056B8 240
|
||||
#00AE42 #FEC600 420
|
||||
#00AE42 #F5547C 390
|
||||
#00AE42 #6F5034 210
|
||||
#00AE42 #FF9016 420
|
||||
#00AE42 #00B1B7 390
|
||||
#00AE42 #BECF00 300
|
||||
#5E43B7 #000000 150
|
||||
#5E43B7 #FFFFFF 360
|
||||
#5E43B7 #545454 150
|
||||
#5E43B7 #8E9089 180
|
||||
#5E43B7 #C12E1F 270
|
||||
#5E43B7 #F4EE2A 570
|
||||
#5E43B7 #0086D6 240
|
||||
#5E43B7 #F7E6DE 660
|
||||
#5E43B7 #00AE42 240
|
||||
#5E43B7 #482960 240
|
||||
#5E43B7 #0056B8 150
|
||||
#5E43B7 #FEC600 390
|
||||
#5E43B7 #EC008C 330
|
||||
#5E43B7 #F5547C 270
|
||||
#5E43B7 #6F5034 150
|
||||
#5E43B7 #FF9016 300
|
||||
#5E43B7 #00B1B7 270
|
||||
#5E43B7 #BECF00 390
|
||||
#482960 #000000 120
|
||||
#482960 #FFFFFF 570
|
||||
#482960 #545454 240
|
||||
#482960 #8E9089 330
|
||||
#482960 #C12E1F 480
|
||||
#482960 #F4EE2A 780
|
||||
#482960 #0086D6 420
|
||||
#482960 #F7E6DE 900
|
||||
#482960 #00AE42 510
|
||||
#482960 #5E43B7 270
|
||||
#482960 #0056B8 420
|
||||
#482960 #FEC600 540
|
||||
#482960 #EC008C 480
|
||||
#482960 #F5547C 390
|
||||
#482960 #6F5034 270
|
||||
#482960 #FF9016 510
|
||||
#482960 #00B1B7 480
|
||||
#482960 #BECF00 540
|
||||
#0056B8 #000000 120
|
||||
#0056B8 #FFFFFF 900
|
||||
#0056B8 #545454 240
|
||||
#0056B8 #8E9089 330
|
||||
#0056B8 #C12E1F 570
|
||||
#0056B8 #F4EE2A 900
|
||||
#0056B8 #0086D6 210
|
||||
#0056B8 #F7E6DE 780
|
||||
#0056B8 #00AE42 300
|
||||
#0056B8 #5E43B7 210
|
||||
#0056B8 #482960 270
|
||||
#0056B8 #FEC600 630
|
||||
#0056B8 #EC008C 540
|
||||
#0056B8 #F5547C 660
|
||||
#0056B8 #6F5034 300
|
||||
#0056B8 #FF9016 690
|
||||
#0056B8 #00B1B7 240
|
||||
#0056B8 #BECF00 540
|
||||
#FEC600 #000000 120
|
||||
#FEC600 #FFFFFF 630
|
||||
#FEC600 #545454 540
|
||||
#FEC600 #8E9089 480
|
||||
#FEC600 #C12E1F 180
|
||||
#FEC600 #F4EE2A 180
|
||||
#FEC600 #0086D6 900
|
||||
#FEC600 #F7E6DE 720
|
||||
#FEC600 #00AE42 210
|
||||
#FEC600 #5E43B7 900
|
||||
#FEC600 #482960 330
|
||||
#FEC600 #0056B8 900
|
||||
#FEC600 #EC008C 660
|
||||
#FEC600 #F5547C 390
|
||||
#FEC600 #6F5034 330
|
||||
#FEC600 #FF9016 270
|
||||
#FEC600 #00B1B7 630
|
||||
#FEC600 #BECF00 210
|
||||
#EC008C #000000 120
|
||||
#EC008C #FFFFFF 540
|
||||
#EC008C #545454 270
|
||||
#EC008C #8E9089 330
|
||||
#EC008C #C12E1F 120
|
||||
#EC008C #F4EE2A 900
|
||||
#EC008C #0086D6 330
|
||||
#EC008C #00AE42 450
|
||||
#EC008C #5E43B7 210
|
||||
#EC008C #482960 180
|
||||
#EC008C #0056B8 300
|
||||
#EC008C #FEC600 360
|
||||
#EC008C #F5547C 210
|
||||
#EC008C #6F5034 240
|
||||
#EC008C #FF9016 240
|
||||
#EC008C #00B1B7 450
|
||||
#EC008C #BECF00 510
|
||||
#F5547C #000000 120
|
||||
#F5547C #FFFFFF 570
|
||||
#F5547C #545454 210
|
||||
#F5547C #8E9089 240
|
||||
#F5547C #C12E1F 150
|
||||
#F5547C #F4EE2A 750
|
||||
#F5547C #0086D6 270
|
||||
#F5547C #F7E6DE 900
|
||||
#F5547C #00AE42 540
|
||||
#F5547C #5E43B7 150
|
||||
#F5547C #482960 180
|
||||
#F5547C #0056B8 150
|
||||
#F5547C #FEC600 330
|
||||
#F5547C #EC008C 150
|
||||
#F5547C #6F5034 180
|
||||
#F5547C #FF9016 270
|
||||
#F5547C #00B1B7 390
|
||||
#F5547C #BECF00 360
|
||||
#6F5034 #000000 150
|
||||
#6F5034 #FFFFFF 600
|
||||
#6F5034 #545454 150
|
||||
#6F5034 #8E9089 270
|
||||
#6F5034 #C12E1F 180
|
||||
#6F5034 #F4EE2A 360
|
||||
#6F5034 #0086D6 360
|
||||
#6F5034 #F7E6DE 390
|
||||
#6F5034 #00AE42 330
|
||||
#6F5034 #5E43B7 240
|
||||
#6F5034 #482960 180
|
||||
#6F5034 #0056B8 300
|
||||
#6F5034 #FEC600 300
|
||||
#6F5034 #EC008C 270
|
||||
#6F5034 #F5547C 240
|
||||
#6F5034 #FF9016 270
|
||||
#6F5034 #00B1B7 270
|
||||
#6F5034 #BECF00 390
|
||||
#FF9016 #000000 120
|
||||
#FF9016 #FFFFFF 450
|
||||
#FF9016 #545454 240
|
||||
#FF9016 #8E9089 300
|
||||
#FF9016 #C12E1F 150
|
||||
#FF9016 #F4EE2A 480
|
||||
#FF9016 #0086D6 660
|
||||
#FF9016 #F7E6DE 690
|
||||
#FF9016 #00AE42 360
|
||||
#FF9016 #5E43B7 360
|
||||
#FF9016 #482960 210
|
||||
#FF9016 #0056B8 330
|
||||
#FF9016 #FEC600 210
|
||||
#FF9016 #EC008C 240
|
||||
#FF9016 #F5547C 210
|
||||
#FF9016 #6F5034 270
|
||||
#FF9016 #00B1B7 390
|
||||
#FF9016 #BECF00 330
|
||||
#00B1B7 #FFFFFF 630
|
||||
#00B1B7 #8E9089 240
|
||||
#00B1B7 #F4EE2A 390
|
||||
#00B1B7 #EC008C 240
|
||||
#00B1B7 #6F5034 360
|
||||
#00B1B7 #FF9016 300
|
||||
#00B1B7 #00B1B7 390
|
||||
#00B1B7 #BECF00 300
|
||||
#BECF00 #000000 150
|
||||
#BECF00 #FFFFFF 630
|
||||
#BECF00 #8E9089 300
|
||||
#BECF00 #C12E1F 150
|
||||
#BECF00 #F4EE2A 150
|
||||
#BECF00 #0086D6 270
|
||||
#BECF00 #F7E6DE 540
|
||||
#BECF00 #00AE42 150
|
||||
#BECF00 #5E43B7 270
|
||||
#BECF00 #482960 210
|
||||
#BECF00 #0056B8 240
|
||||
#BECF00 #FEC600 120
|
||||
#BECF00 #EC008C 270
|
||||
#BECF00 #F5547C 270
|
||||
#BECF00 #6F5034 150
|
||||
#BECF00 #FF9016 120
|
||||
#BECF00 #00B1B7 330
|
||||
338
resources/flush/flush_data_dual_standard.txt
Normal file
|
|
@ -0,0 +1,338 @@
|
|||
colors
|
||||
#000000 #FFFFFF #545454 #8E9089 #C12E1F #F4EE2A #0086D6 #F7E6DE #00AE42 #5E43B7 #482960 #0056B8 #FEC600 #EC008C #F5547C #6F5034 #FF9016 #00B1B7 #BECF00
|
||||
src dst flush
|
||||
#000000 #FFFFFF 900
|
||||
#000000 #545454 450
|
||||
#000000 #8E9089 540
|
||||
#000000 #C12E1F 600
|
||||
#000000 #F4EE2A 900
|
||||
#000000 #0086D6 570
|
||||
#000000 #F7E6DE 900
|
||||
#000000 #00AE42 810
|
||||
#000000 #5E43B7 480
|
||||
#000000 #482960 270
|
||||
#000000 #0056B8 540
|
||||
#000000 #FEC600 900
|
||||
#000000 #EC008C 900
|
||||
#000000 #F5547C 900
|
||||
#000000 #FF9016 900
|
||||
#000000 #00B1B7 630
|
||||
#000000 #BECF00 900
|
||||
#FFFFFF #000000 90
|
||||
#FFFFFF #545454 240
|
||||
#FFFFFF #8E9089 120
|
||||
#FFFFFF #C12E1F 90
|
||||
#FFFFFF #F4EE2A 90
|
||||
#FFFFFF #0086D6 90
|
||||
#FFFFFF #F7E6DE 90
|
||||
#FFFFFF #00AE42 120
|
||||
#FFFFFF #5E43B7 90
|
||||
#FFFFFF #0056B8 90
|
||||
#FFFFFF #FEC600 150
|
||||
#FFFFFF #EC008C 150
|
||||
#FFFFFF #F5547C 120
|
||||
#FFFFFF #6F5034 120
|
||||
#FFFFFF #FF9016 120
|
||||
#FFFFFF #00B1B7 120
|
||||
#FFFFFF #BECF00 90
|
||||
#545454 #000000 90
|
||||
#545454 #FFFFFF 360
|
||||
#545454 #8E9089 120
|
||||
#545454 #C12E1F 270
|
||||
#545454 #F4EE2A 330
|
||||
#545454 #0086D6 270
|
||||
#545454 #F7E6DE 390
|
||||
#545454 #00AE42 270
|
||||
#545454 #5E43B7 120
|
||||
#545454 #482960 150
|
||||
#545454 #0056B8 180
|
||||
#545454 #FEC600 300
|
||||
#545454 #EC008C 240
|
||||
#545454 #F5547C 300
|
||||
#545454 #6F5034 120
|
||||
#545454 #FF9016 240
|
||||
#545454 #00B1B7 270
|
||||
#545454 #BECF00 300
|
||||
#8E9089 #000000 270
|
||||
#8E9089 #FFFFFF 330
|
||||
#8E9089 #545454 300
|
||||
#8E9089 #C12E1F 240
|
||||
#8E9089 #F4EE2A 240
|
||||
#8E9089 #0086D6 240
|
||||
#8E9089 #F7E6DE 390
|
||||
#8E9089 #00AE42 210
|
||||
#8E9089 #5E43B7 270
|
||||
#8E9089 #482960 300
|
||||
#8E9089 #0056B8 180
|
||||
#8E9089 #FEC600 240
|
||||
#8E9089 #EC008C 240
|
||||
#8E9089 #F5547C 240
|
||||
#8E9089 #6F5034 210
|
||||
#8E9089 #FF9016 240
|
||||
#8E9089 #00B1B7 210
|
||||
#8E9089 #BECF00 270
|
||||
#C12E1F #000000 150
|
||||
#C12E1F #FFFFFF 900
|
||||
#C12E1F #545454 300
|
||||
#C12E1F #8E9089 570
|
||||
#C12E1F #F4EE2A 450
|
||||
#C12E1F #0086D6 390
|
||||
#C12E1F #F7E6DE 630
|
||||
#C12E1F #00AE42 420
|
||||
#C12E1F #5E43B7 330
|
||||
#C12E1F #482960 210
|
||||
#C12E1F #0056B8 300
|
||||
#C12E1F #FEC600 660
|
||||
#C12E1F #EC008C 240
|
||||
#C12E1F #F5547C 180
|
||||
#C12E1F #6F5034 210
|
||||
#C12E1F #FF9016 270
|
||||
#C12E1F #00B1B7 540
|
||||
#C12E1F #BECF00 360
|
||||
#F4EE2A #000000 150
|
||||
#F4EE2A #FFFFFF 900
|
||||
#F4EE2A #545454 390
|
||||
#F4EE2A #8E9089 450
|
||||
#F4EE2A #C12E1F 180
|
||||
#F4EE2A #0086D6 270
|
||||
#F4EE2A #F7E6DE 570
|
||||
#F4EE2A #00AE42 120
|
||||
#F4EE2A #5E43B7 330
|
||||
#F4EE2A #482960 330
|
||||
#F4EE2A #0056B8 240
|
||||
#F4EE2A #FEC600 90
|
||||
#F4EE2A #EC008C 330
|
||||
#F4EE2A #F5547C 420
|
||||
#F4EE2A #6F5034 240
|
||||
#F4EE2A #FF9016 150
|
||||
#F4EE2A #00B1B7 360
|
||||
#F4EE2A #BECF00 240
|
||||
#0086D6 #000000 150
|
||||
#0086D6 #FFFFFF 420
|
||||
#0086D6 #545454 120
|
||||
#0086D6 #8E9089 480
|
||||
#0086D6 #C12E1F 240
|
||||
#0086D6 #F4EE2A 360
|
||||
#0086D6 #F7E6DE 390
|
||||
#0086D6 #00AE42 120
|
||||
#0086D6 #5E43B7 150
|
||||
#0086D6 #482960 150
|
||||
#0086D6 #0056B8 120
|
||||
#0086D6 #EC008C 330
|
||||
#0086D6 #F5547C 330
|
||||
#0086D6 #6F5034 150
|
||||
#0086D6 #FF9016 300
|
||||
#0086D6 #00B1B7 150
|
||||
#0086D6 #BECF00 270
|
||||
#F7E6DE #000000 90
|
||||
#F7E6DE #FFFFFF 90
|
||||
#F7E6DE #545454 120
|
||||
#F7E6DE #8E9089 120
|
||||
#F7E6DE #C12E1F 90
|
||||
#F7E6DE #F4EE2A 60
|
||||
#F7E6DE #0086D6 90
|
||||
#F7E6DE #00AE42 90
|
||||
#F7E6DE #5E43B7 90
|
||||
#F7E6DE #482960 120
|
||||
#F7E6DE #0056B8 120
|
||||
#F7E6DE #FEC600 120
|
||||
#F7E6DE #EC008C 150
|
||||
#F7E6DE #F5547C 120
|
||||
#F7E6DE #6F5034 150
|
||||
#F7E6DE #FF9016 120
|
||||
#F7E6DE #00B1B7 90
|
||||
#F7E6DE #BECF00 120
|
||||
#00AE42 #000000 150
|
||||
#00AE42 #FFFFFF 900
|
||||
#00AE42 #545454 240
|
||||
#00AE42 #8E9089 330
|
||||
#00AE42 #C12E1F 210
|
||||
#00AE42 #F4EE2A 270
|
||||
#00AE42 #F7E6DE 360
|
||||
#00AE42 #5E43B7 180
|
||||
#00AE42 #482960 180
|
||||
#00AE42 #0056B8 240
|
||||
#00AE42 #FEC600 300
|
||||
#00AE42 #EC008C 300
|
||||
#00AE42 #F5547C 390
|
||||
#00AE42 #6F5034 180
|
||||
#00AE42 #FF9016 300
|
||||
#00AE42 #00B1B7 360
|
||||
#00AE42 #BECF00 270
|
||||
#5E43B7 #000000 90
|
||||
#5E43B7 #FFFFFF 630
|
||||
#5E43B7 #545454 150
|
||||
#5E43B7 #8E9089 210
|
||||
#5E43B7 #C12E1F 210
|
||||
#5E43B7 #F4EE2A 330
|
||||
#5E43B7 #0086D6 180
|
||||
#5E43B7 #F7E6DE 510
|
||||
#5E43B7 #00AE42 240
|
||||
#5E43B7 #482960 150
|
||||
#5E43B7 #0056B8 120
|
||||
#5E43B7 #FEC600 540
|
||||
#5E43B7 #EC008C 270
|
||||
#5E43B7 #F5547C 420
|
||||
#5E43B7 #6F5034 150
|
||||
#5E43B7 #FF9016 330
|
||||
#5E43B7 #00B1B7 270
|
||||
#5E43B7 #BECF00 330
|
||||
#482960 #000000 90
|
||||
#482960 #FFFFFF 900
|
||||
#482960 #545454 240
|
||||
#482960 #8E9089 510
|
||||
#482960 #C12E1F 360
|
||||
#482960 #F4EE2A 420
|
||||
#482960 #0086D6 330
|
||||
#482960 #F7E6DE 510
|
||||
#482960 #00AE42 390
|
||||
#482960 #5E43B7 270
|
||||
#482960 #0056B8 300
|
||||
#482960 #FEC600 660
|
||||
#482960 #EC008C 360
|
||||
#482960 #F5547C 510
|
||||
#482960 #6F5034 180
|
||||
#482960 #FF9016 540
|
||||
#482960 #00B1B7 450
|
||||
#482960 #BECF00 600
|
||||
#0056B8 #000000 90
|
||||
#0056B8 #FFFFFF 780
|
||||
#0056B8 #545454 270
|
||||
#0056B8 #8E9089 270
|
||||
#0056B8 #C12E1F 330
|
||||
#0056B8 #F4EE2A 630
|
||||
#0056B8 #0086D6 180
|
||||
#0056B8 #F7E6DE 840
|
||||
#0056B8 #00AE42 270
|
||||
#0056B8 #5E43B7 270
|
||||
#0056B8 #482960 150
|
||||
#0056B8 #FEC600 630
|
||||
#0056B8 #EC008C 450
|
||||
#0056B8 #6F5034 240
|
||||
#0056B8 #FF9016 510
|
||||
#0056B8 #00B1B7 240
|
||||
#0056B8 #BECF00 510
|
||||
#FEC600 #000000 90
|
||||
#FEC600 #FFFFFF 900
|
||||
#FEC600 #545454 390
|
||||
#FEC600 #8E9089 600
|
||||
#FEC600 #C12E1F 180
|
||||
#FEC600 #F4EE2A 150
|
||||
#FEC600 #0086D6 330
|
||||
#FEC600 #F7E6DE 600
|
||||
#FEC600 #00AE42 180
|
||||
#FEC600 #5E43B7 270
|
||||
#FEC600 #482960 330
|
||||
#FEC600 #0056B8 300
|
||||
#FEC600 #EC008C 390
|
||||
#FEC600 #F5547C 570
|
||||
#FEC600 #6F5034 240
|
||||
#FEC600 #FF9016 150
|
||||
#FEC600 #00B1B7 510
|
||||
#FEC600 #BECF00 300
|
||||
#EC008C #000000 90
|
||||
#EC008C #FFFFFF 900
|
||||
#EC008C #545454 240
|
||||
#EC008C #8E9089 270
|
||||
#EC008C #C12E1F 120
|
||||
#EC008C #F4EE2A 360
|
||||
#EC008C #0086D6 270
|
||||
#EC008C #F7E6DE 660
|
||||
#EC008C #00AE42 330
|
||||
#EC008C #5E43B7 270
|
||||
#EC008C #482960 270
|
||||
#EC008C #0056B8 210
|
||||
#EC008C #FEC600 510
|
||||
#EC008C #F5547C 120
|
||||
#EC008C #6F5034 180
|
||||
#EC008C #00B1B7 360
|
||||
#EC008C #BECF00 570
|
||||
#F5547C #000000 90
|
||||
#F5547C #FFFFFF 900
|
||||
#F5547C #545454 180
|
||||
#F5547C #8E9089 180
|
||||
#F5547C #C12E1F 150
|
||||
#F5547C #F4EE2A 270
|
||||
#F5547C #0086D6 270
|
||||
#F5547C #F7E6DE 540
|
||||
#F5547C #00AE42 300
|
||||
#F5547C #5E43B7 210
|
||||
#F5547C #482960 240
|
||||
#F5547C #0056B8 210
|
||||
#F5547C #FEC600 330
|
||||
#F5547C #EC008C 120
|
||||
#F5547C #6F5034 180
|
||||
#F5547C #FF9016 150
|
||||
#F5547C #00B1B7 300
|
||||
#F5547C #BECF00 330
|
||||
#6F5034 #000000 180
|
||||
#6F5034 #FFFFFF 660
|
||||
#6F5034 #545454 180
|
||||
#6F5034 #8E9089 240
|
||||
#6F5034 #C12E1F 240
|
||||
#6F5034 #F4EE2A 390
|
||||
#6F5034 #0086D6 330
|
||||
#6F5034 #F7E6DE 420
|
||||
#6F5034 #00AE42 300
|
||||
#6F5034 #5E43B7 300
|
||||
#6F5034 #482960 180
|
||||
#6F5034 #0056B8 300
|
||||
#6F5034 #FEC600 270
|
||||
#6F5034 #EC008C 210
|
||||
#6F5034 #F5547C 240
|
||||
#6F5034 #FF9016 240
|
||||
#6F5034 #00B1B7 270
|
||||
#6F5034 #BECF00 360
|
||||
#FF9016 #FFFFFF 900
|
||||
#FF9016 #545454 240
|
||||
#FF9016 #8E9089 270
|
||||
#FF9016 #C12E1F 150
|
||||
#FF9016 #F4EE2A 330
|
||||
#FF9016 #0086D6 240
|
||||
#FF9016 #F7E6DE 390
|
||||
#FF9016 #00AE42 240
|
||||
#FF9016 #5E43B7 270
|
||||
#FF9016 #482960 180
|
||||
#FF9016 #0056B8 240
|
||||
#FF9016 #FEC600 210
|
||||
#FF9016 #EC008C 210
|
||||
#FF9016 #F5547C 210
|
||||
#FF9016 #6F5034 180
|
||||
#FF9016 #00B1B7 300
|
||||
#FF9016 #BECF00 270
|
||||
#00B1B7 #000000 210
|
||||
#00B1B7 #FFFFFF 480
|
||||
#00B1B7 #545454 300
|
||||
#00B1B7 #8E9089 180
|
||||
#00B1B7 #C12E1F 300
|
||||
#00B1B7 #F4EE2A 300
|
||||
#00B1B7 #0086D6 150
|
||||
#00B1B7 #F7E6DE 390
|
||||
#00B1B7 #00AE42 120
|
||||
#00B1B7 #5E43B7 270
|
||||
#00B1B7 #482960 270
|
||||
#00B1B7 #0056B8 150
|
||||
#00B1B7 #FEC600 330
|
||||
#00B1B7 #EC008C 270
|
||||
#00B1B7 #F5547C 270
|
||||
#00B1B7 #6F5034 210
|
||||
#00B1B7 #FF9016 270
|
||||
#00B1B7 #BECF00 240
|
||||
#BECF00 #000000 270
|
||||
#BECF00 #FFFFFF 450
|
||||
#BECF00 #545454 270
|
||||
#BECF00 #8E9089 270
|
||||
#BECF00 #C12E1F 150
|
||||
#BECF00 #F4EE2A 90
|
||||
#BECF00 #0086D6 300
|
||||
#BECF00 #F7E6DE 300
|
||||
#BECF00 #00AE42 180
|
||||
#BECF00 #5E43B7 270
|
||||
#BECF00 #482960 210
|
||||
#BECF00 #0056B8 240
|
||||
#BECF00 #FEC600 210
|
||||
#BECF00 #EC008C 240
|
||||
#BECF00 #F5547C 150
|
||||
#BECF00 #6F5034 150
|
||||
#BECF00 #FF9016 150
|
||||
#BECF00 #00B1B7 270
|
||||
98
resources/flush/flush_data_standard.txt
Normal file
|
|
@ -0,0 +1,98 @@
|
|||
colors
|
||||
#000000 #C12E1F #00AE42 #545454 #D1D3D5 #5B6579 #F4EE2A #9D432C #5E43B7 #0A2989 #FF6A13 #8E9089
|
||||
src dst flush
|
||||
#000000 #545454 236
|
||||
#000000 #F4EE2A 386
|
||||
#000000 #5E43B7 266
|
||||
#000000 #0A2989 236
|
||||
#C12E1F #000000 26
|
||||
#C12E1F #00AE42 326
|
||||
#C12E1F #F4EE2A 356
|
||||
#C12E1F #FF6A13 146
|
||||
#00AE42 #000000 26
|
||||
#00AE42 #C12E1F 146
|
||||
#00AE42 #545454 56
|
||||
#00AE42 #D1D3D5 266
|
||||
#00AE42 #F4EE2A 176
|
||||
#00AE42 #9D432C 86
|
||||
#00AE42 #FF6A13 206
|
||||
#00AE42 #8E9089 206
|
||||
#545454 #C12E1F 146
|
||||
#545454 #00AE42 116
|
||||
#545454 #D1D3D5 176
|
||||
#545454 #5B6579 86
|
||||
#545454 #F4EE2A 206
|
||||
#545454 #9D432C 86
|
||||
#545454 #5E43B7 56
|
||||
#545454 #FF6A13 236
|
||||
#545454 #8E9089 56
|
||||
#D1D3D5 #C12E1F 116
|
||||
#D1D3D5 #00AE42 116
|
||||
#D1D3D5 #F4EE2A 56
|
||||
#D1D3D5 #9D432C 86
|
||||
#D1D3D5 #5E43B7 86
|
||||
#D1D3D5 #FF6A13 86
|
||||
#5B6579 #000000 26
|
||||
#5B6579 #C12E1F 56
|
||||
#5B6579 #00AE42 26
|
||||
#5B6579 #545454 26
|
||||
#5B6579 #D1D3D5 56
|
||||
#5B6579 #F4EE2A 116
|
||||
#5B6579 #9D432C 56
|
||||
#5B6579 #5E43B7 26
|
||||
#5B6579 #0A2989 26
|
||||
#5B6579 #FF6A13 116
|
||||
#5B6579 #8E9089 26
|
||||
#F4EE2A #000000 56
|
||||
#F4EE2A #C12E1F 26
|
||||
#F4EE2A #00AE42 86
|
||||
#F4EE2A #545454 146
|
||||
#F4EE2A #9D432C 86
|
||||
#F4EE2A #5E43B7 146
|
||||
#F4EE2A #FF6A13 26
|
||||
#9D432C #000000 56
|
||||
#9D432C #C12E1F 56
|
||||
#9D432C #00AE42 176
|
||||
#9D432C #545454 86
|
||||
#9D432C #D1D3D5 236
|
||||
#9D432C #F4EE2A 206
|
||||
#9D432C #5E43B7 116
|
||||
#9D432C #0A2989 86
|
||||
#9D432C #FF6A13 116
|
||||
#9D432C #8E9089 146
|
||||
#5E43B7 #C12E1F 176
|
||||
#5E43B7 #00AE42 116
|
||||
#5E43B7 #545454 56
|
||||
#5E43B7 #D1D3D5 206
|
||||
#5E43B7 #5B6579 116
|
||||
#5E43B7 #F4EE2A 206
|
||||
#5E43B7 #9D432C 86
|
||||
#5E43B7 #0A2989 56
|
||||
#5E43B7 #FF6A13 206
|
||||
#5E43B7 #8E9089 146
|
||||
#0A2989 #000000 26
|
||||
#0A2989 #C12E1F 266
|
||||
#0A2989 #00AE42 146
|
||||
#0A2989 #545454 86
|
||||
#0A2989 #D1D3D5 386
|
||||
#0A2989 #5B6579 176
|
||||
#0A2989 #F4EE2A 566
|
||||
#0A2989 #9D432C 206
|
||||
#0A2989 #5E43B7 116
|
||||
#0A2989 #FF6A13 326
|
||||
#0A2989 #8E9089 206
|
||||
#FF6A13 #000000 56
|
||||
#FF6A13 #C12E1F 26
|
||||
#FF6A13 #545454 86
|
||||
#FF6A13 #D1D3D5 146
|
||||
#FF6A13 #F4EE2A 146
|
||||
#FF6A13 #9D432C 56
|
||||
#FF6A13 #5E43B7 146
|
||||
#FF6A13 #0A2989 146
|
||||
#FF6A13 #8E9089 116
|
||||
#8E9089 #C12E1F 86
|
||||
#8E9089 #00AE42 56
|
||||
#8E9089 #D1D3D5 86
|
||||
#8E9089 #F4EE2A 206
|
||||
#8E9089 #9D432C 86
|
||||
#8E9089 #FF6A13 86
|
||||