Merge branch 'OrcaSlicer:main' into main
19
.claude/commands/commit-push-pr.md
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
---
|
||||
allowed-tools: Bash(git checkout --branch:*), Bash(git add:*), Bash(git status:*), Bash(git push:*), Bash(git commit:*), Bash(gh pr create:*)
|
||||
description: Commit, push, and open a PR
|
||||
---
|
||||
|
||||
## Context
|
||||
|
||||
- Current git status: !`git status`
|
||||
- Current git diff (staged and unstaged changes): !`git diff HEAD`
|
||||
- Current branch: !`git branch --show-current`
|
||||
|
||||
## Your task
|
||||
|
||||
Based on the above changes:
|
||||
1. Create a new branch if on main
|
||||
2. Create a single commit with an appropriate message
|
||||
3. Push the branch to origin
|
||||
4. Create a pull request using `gh pr create`
|
||||
5. You have the capability to call multiple tools in a single response. You MUST do all of the above in a single message. Do not use any other tools or do anything else. Do not send any other text or messages besides these tool calls.
|
||||
38
.claude/commands/dedupe.md
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
---
|
||||
allowed-tools: Bash(gh issue view:*), Bash(gh search:*), Bash(gh issue list:*), Bash(gh api:*), Bash(gh issue comment:*)
|
||||
description: Find duplicate GitHub issues
|
||||
---
|
||||
|
||||
Find up to 3 likely duplicate issues for a given GitHub issue.
|
||||
|
||||
To do this, follow these steps precisely:
|
||||
|
||||
1. Use an agent to check if the Github issue (a) is closed, (b) does not need to be deduped (eg. because it is broad product feedback without a specific solution, or positive feedback), or (c) already has a duplicates comment that you made earlier. If so, do not proceed.
|
||||
2. Use an agent to view a Github issue, and ask the agent to return a summary of the issue
|
||||
3. Then, launch 5 parallel agents to search Github for duplicates of this issue, using diverse keywords and search approaches, using the summary from #1
|
||||
4. Next, feed the results from #1 and #2 into another agent, so that it can filter out false positives, that are likely not actually duplicates of the original issue. If there are no duplicates remaining, do not proceed.
|
||||
5. Finally, comment back on the issue with a list of up to three duplicate issues (or zero, if there are no likely duplicates)
|
||||
|
||||
Notes (be sure to tell this to your agents, too):
|
||||
|
||||
- Use `gh` to interact with Github, rather than web fetch
|
||||
- Do not use other tools, beyond `gh` (eg. don't use other MCP servers, file edit, etc.)
|
||||
- Make a todo list first
|
||||
- For your comment, follow the following format precisely (assuming for this example that you found 3 suspected duplicates):
|
||||
|
||||
---
|
||||
|
||||
Found 3 possible duplicate issues:
|
||||
|
||||
1. <link to issue>
|
||||
2. <link to issue>
|
||||
3. <link to issue>
|
||||
|
||||
This issue will be automatically closed as a duplicate in 3 days.
|
||||
|
||||
- If your issue is a duplicate, please close it and 👍 the existing issue instead
|
||||
- To prevent auto-closure, add a comment or 👎 this comment
|
||||
|
||||
🤖 OrcaSlicer bot
|
||||
|
||||
---
|
||||
40
.claude/commands/oncall-triage.md
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
---
|
||||
allowed-tools: Bash(gh issue list:*), Bash(gh issue view:*), Bash(gh issue edit:*), TodoWrite
|
||||
description: Triage GitHub issues and label critical ones for oncall
|
||||
---
|
||||
|
||||
You're an oncall triage assistant for GitHub issues. Your task is to identify critical issues that require immediate oncall attention and apply the "oncall" label.
|
||||
|
||||
Repository: OrcaSlicer/OrcaSlicer
|
||||
|
||||
Task overview:
|
||||
|
||||
1. First, get all open bugs updated in the last 3 days with at least 50 engagements:
|
||||
```bash
|
||||
gh issue list --repo OrcaSlicer/OrcaSlicer --state open --label bug --limit 1000 --json number,title,updatedAt,comments,reactions | jq -r '.[] | select((.updatedAt >= (now - 259200 | strftime("%Y-%m-%dT%H:%M:%SZ"))) and ((.comments | length) + ([.reactions[].content] | length) >= 50)) | "\(.number)"'
|
||||
```
|
||||
|
||||
2. Save the list of issue numbers and create a TODO list with ALL of them. This ensures you process every single one.
|
||||
|
||||
3. For each issue in your TODO list:
|
||||
- Use `gh issue view <number> --repo OrcaSlicer/OrcaSlicer --json title,body,labels,comments` to get full details
|
||||
- Read and understand the full issue content and comments to determine actual user impact
|
||||
- Evaluate: Is this truly blocking users from using Claude Code?
|
||||
- Consider: "crash", "stuck", "frozen", "hang", "unresponsive", "cannot use", "blocked", "broken"
|
||||
- Does it prevent core functionality? Can users work around it?
|
||||
- Be conservative - only flag issues that truly prevent users from getting work done
|
||||
|
||||
4. For issues that are truly blocking and don't already have the "oncall" label:
|
||||
- Use `gh issue edit <number> --repo OrcaSlicer/OrcaSlicer --add-label "oncall"`
|
||||
- Mark the issue as complete in your TODO list
|
||||
|
||||
5. After processing all issues, provide a summary:
|
||||
- List each issue number that received the "oncall" label
|
||||
- Include the issue title and brief reason why it qualified
|
||||
- If no issues qualified, state that clearly
|
||||
|
||||
Important:
|
||||
- Process ALL issues in your TODO list systematically
|
||||
- Don't post any comments to issues
|
||||
- Only add the "oncall" label, never remove it
|
||||
- Use individual `gh issue view` commands instead of bash for loops to avoid approval prompts
|
||||
2
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
|
|
@ -8,7 +8,7 @@ body:
|
|||
**Thank you for using Orca Slicer and wanting to report a bug.**
|
||||
|
||||
Please note that this is not the place to make feature requests or ask for help.
|
||||
For this, please use the [Feature request](https://github.com/SoftFever/OrcaSlicer/issues/new?assignees=&labels=&projects=&template=feature_request.yml) issue type or you can discuss your idea on our [Discord server](https://discord.gg/P4VE9UY9gJ) with others.
|
||||
For this, please use the [Feature request](https://github.com/OrcaSlicer/OrcaSlicer/issues/new?assignees=&labels=&projects=&template=feature_request.yml) issue type or you can discuss your idea on our [Discord server](https://discord.gg/P4VE9UY9gJ) with others.
|
||||
|
||||
Before filing, please check if the issue already exists (either open or closed) by using the search bar on the issues page. If it does, comment there. Even if it's closed, we can reopen it based on your comment.
|
||||
- type: checkboxes
|
||||
|
|
|
|||
2
.github/ISSUE_TEMPLATE/config.yml
vendored
|
|
@ -4,5 +4,5 @@ contact_links:
|
|||
url: https://discord.gg/P4VE9UY9gJ
|
||||
about: Please ask and answer support "how do I?"questions here.
|
||||
- name: Discussion Forum
|
||||
url: https://github.com/SoftFever/OrcaSlicer/discussions
|
||||
url: https://github.com/OrcaSlicer/OrcaSlicer/discussions
|
||||
about: Please raise ideas and feature suggestions here.
|
||||
|
|
|
|||
2
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
|
|
@ -8,7 +8,7 @@ body:
|
|||
Thanks for taking the time to fill out this feature request!
|
||||
|
||||
If your idea is still at the formulation stage, or you're not sure it would
|
||||
be useful to many users, you can raise it as a discussion topic under [Ideas](https://github.com/SoftFever/OrcaSlicer/discussions/categories/ideas)
|
||||
be useful to many users, you can raise it as a discussion topic under [Ideas](https://github.com/OrcaSlicer/OrcaSlicer/discussions/categories/ideas)
|
||||
or you can raise it on the [Discord server](https://discord.gg/P4VE9UY9gJ).
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
|
|
|
|||
31
.github/workflows/auto-close-duplicates.yml
vendored
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
name: Auto-close duplicate issues
|
||||
description: Auto-closes issues that are duplicates of existing issues
|
||||
on:
|
||||
schedule:
|
||||
- cron: "0 9 * * *"
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
auto-close-duplicates:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 10
|
||||
permissions:
|
||||
contents: read
|
||||
issues: write
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Setup Bun
|
||||
uses: oven-sh/setup-bun@v2
|
||||
with:
|
||||
bun-version: latest
|
||||
|
||||
- name: Auto-close duplicate issues
|
||||
run: bun run scripts/auto-close-duplicates.ts
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
GITHUB_REPOSITORY_OWNER: ${{ github.repository_owner }}
|
||||
GITHUB_REPOSITORY_NAME: ${{ github.event.repository.name }}
|
||||
STATSIG_API_KEY: ${{ secrets.STATSIG_API_KEY }}
|
||||
44
.github/workflows/backfill-duplicate-comments.yml
vendored
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
name: Backfill Duplicate Comments
|
||||
description: Triggers duplicate detection for old issues that don't have duplicate comments
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
days_back:
|
||||
description: 'How many days back to look for old issues'
|
||||
required: false
|
||||
default: '90'
|
||||
type: string
|
||||
dry_run:
|
||||
description: 'Dry run mode (true to only log what would be done)'
|
||||
required: false
|
||||
default: 'true'
|
||||
type: choice
|
||||
options:
|
||||
- 'true'
|
||||
- 'false'
|
||||
|
||||
jobs:
|
||||
backfill-duplicate-comments:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 30
|
||||
permissions:
|
||||
contents: read
|
||||
issues: read
|
||||
actions: write
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Setup Bun
|
||||
uses: oven-sh/setup-bun@v2
|
||||
with:
|
||||
bun-version: latest
|
||||
|
||||
- name: Backfill duplicate comments
|
||||
run: bun run scripts/backfill-duplicate-comments.ts
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
DAYS_BACK: ${{ inputs.days_back }}
|
||||
DRY_RUN: ${{ inputs.dry_run }}
|
||||
24
.github/workflows/build_all.yml
vendored
|
|
@ -21,6 +21,7 @@ on:
|
|||
- release/*
|
||||
paths:
|
||||
- 'deps/**'
|
||||
- 'deps_src/**'
|
||||
- 'src/**'
|
||||
- '**/CMakeLists.txt'
|
||||
- 'version.inc'
|
||||
|
|
@ -30,6 +31,7 @@ on:
|
|||
- 'build_release_macos.sh'
|
||||
- 'scripts/flatpak/**'
|
||||
|
||||
|
||||
schedule:
|
||||
- cron: '0 17 * * *' # run once a day at 1 AM Singapore time (UTC+8)
|
||||
|
||||
|
|
@ -51,7 +53,7 @@ jobs:
|
|||
strategy:
|
||||
fail-fast: false
|
||||
# Don't run scheduled builds on forks:
|
||||
if: ${{ !cancelled() && (github.event_name != 'schedule' || github.repository == 'SoftFever/OrcaSlicer') }}
|
||||
if: ${{ !cancelled() && (github.event_name != 'schedule' || github.repository == 'OrcaSlicer/OrcaSlicer') }}
|
||||
uses: ./.github/workflows/build_check_cache.yml
|
||||
with:
|
||||
os: ubuntu-24.04
|
||||
|
|
@ -67,7 +69,7 @@ jobs:
|
|||
- os: macos-14
|
||||
arch: arm64
|
||||
# Don't run scheduled builds on forks:
|
||||
if: ${{ !cancelled() && (github.event_name != 'schedule' || github.repository == 'SoftFever/OrcaSlicer') }}
|
||||
if: ${{ !cancelled() && (github.event_name != 'schedule' || github.repository == 'OrcaSlicer/OrcaSlicer') }}
|
||||
uses: ./.github/workflows/build_check_cache.yml
|
||||
with:
|
||||
os: ${{ matrix.os }}
|
||||
|
|
@ -82,11 +84,12 @@ jobs:
|
|||
if: ${{ !cancelled() && success() }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
sparse-checkout: |
|
||||
.github
|
||||
scripts
|
||||
tests
|
||||
- name: Apt-Install Dependencies
|
||||
uses: ./.github/actions/apt-install-deps
|
||||
- name: Restore Test Artifact
|
||||
|
|
@ -115,13 +118,14 @@ jobs:
|
|||
flatpak:
|
||||
name: "Flatpak"
|
||||
container:
|
||||
image: ghcr.io/flathub-infra/flatpak-github-actions:gnome-47
|
||||
image: ghcr.io/flathub-infra/flatpak-github-actions:gnome-48
|
||||
options: --privileged
|
||||
volumes:
|
||||
- /usr/local/lib/android:/usr/local/lib/android
|
||||
- /usr/share/dotnet:/usr/share/dotnet
|
||||
- /opt/ghc:/opt/ghc1
|
||||
- /usr/local/share/boost:/usr/local/share/boost1
|
||||
- /opt/hostedtoolcache:/opt/hostedtoolcache1
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
|
|
@ -131,7 +135,7 @@ jobs:
|
|||
- arch: aarch64
|
||||
runner: ubuntu-24.04-arm
|
||||
# Don't run scheduled builds on forks:
|
||||
if: ${{ !cancelled() && (github.event_name != 'schedule' || github.repository == 'SoftFever/OrcaSlicer') }}
|
||||
if: ${{ !cancelled() && (github.event_name != 'schedule' || github.repository == 'OrcaSlicer/OrcaSlicer') }}
|
||||
runs-on: ${{ matrix.variant.runner }}
|
||||
env:
|
||||
date:
|
||||
|
|
@ -140,8 +144,8 @@ jobs:
|
|||
steps:
|
||||
- name: "Remove unneeded stuff to free disk space"
|
||||
run:
|
||||
rm -rf /usr/local/lib/android/* /usr/share/dotnet/* /opt/ghc1/* "/usr/local/share/boost1/*"
|
||||
- uses: actions/checkout@v5
|
||||
rm -rf /usr/local/lib/android/* /usr/share/dotnet/* /opt/ghc1/* "/usr/local/share/boost1/*" /opt/hostedtoolcache1/*
|
||||
- uses: actions/checkout@v6
|
||||
- name: Get the version and date
|
||||
run: |
|
||||
ver_pure=$(grep 'set(SoftFever_VERSION' version.inc | cut -d '"' -f2)
|
||||
|
|
@ -157,7 +161,7 @@ jobs:
|
|||
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
|
||||
- uses: flatpak/flatpak-github-actions/flatpak-builder@master
|
||||
with:
|
||||
bundle: OrcaSlicer-Linux-flatpak_${{ env.ver }}_${{ matrix.variant.arch }}.flatpak
|
||||
manifest-path: scripts/flatpak/io.github.softfever.OrcaSlicer.yml
|
||||
|
|
@ -170,10 +174,10 @@ jobs:
|
|||
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.repository == 'SoftFever/OrcaSlicer' && github.ref == 'refs/heads/main'
|
||||
if: github.repository == 'OrcaSlicer/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}
|
||||
upload_url: https://uploads.github.com/repos/OrcaSlicer/OrcaSlicer/releases/137995723/assets{?name,label}
|
||||
release_id: 137995723
|
||||
asset_path: /__w/OrcaSlicer/OrcaSlicer/OrcaSlicer-Linux-flatpak_${{ env.ver }}_${{ matrix.variant.arch }}.flatpak
|
||||
asset_name: OrcaSlicer-Linux-flatpak_nightly_${{ matrix.variant.arch }}.flatpak
|
||||
|
|
|
|||
2
.github/workflows/build_check_cache.yml
vendored
|
|
@ -26,7 +26,7 @@ jobs:
|
|||
valid-cache: ${{ steps.cache_deps.outputs.cache-hit }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
lfs: 'true'
|
||||
|
||||
|
|
|
|||
2
.github/workflows/build_deps.yml
vendored
|
|
@ -34,7 +34,7 @@ jobs:
|
|||
|
||||
# Setup the environment
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
lfs: 'true'
|
||||
|
||||
|
|
|
|||
38
.github/workflows/build_orca.yml
vendored
|
|
@ -26,7 +26,7 @@ jobs:
|
|||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
lfs: 'true'
|
||||
|
||||
|
|
@ -108,7 +108,7 @@ jobs:
|
|||
|
||||
# Thanks to RaySajuuk, it's working now
|
||||
- name: Sign app and notary
|
||||
if: github.repository == 'SoftFever/OrcaSlicer' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release/')) && inputs.os == 'macos-14'
|
||||
if: github.repository == 'OrcaSlicer/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 }}
|
||||
|
|
@ -195,10 +195,10 @@ jobs:
|
|||
if-no-files-found: ignore
|
||||
|
||||
- name: Deploy Mac release
|
||||
if: github.repository == 'SoftFever/OrcaSlicer' && github.ref == 'refs/heads/main' && inputs.os == 'macos-14'
|
||||
if: github.repository == 'OrcaSlicer/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}
|
||||
upload_url: https://uploads.github.com/repos/OrcaSlicer/OrcaSlicer/releases/137995723/assets{?name,label}
|
||||
release_id: 137995723
|
||||
asset_path: ${{ github.workspace }}/OrcaSlicer_Mac_universal_${{ env.ver }}.dmg
|
||||
asset_name: OrcaSlicer_Mac_universal_nightly.dmg
|
||||
|
|
@ -206,10 +206,10 @@ 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.repository == 'SoftFever/OrcaSlicer' && github.ref == 'refs/heads/main' && inputs.os == 'macos-14'
|
||||
if: github.repository == 'OrcaSlicer/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}
|
||||
upload_url: https://uploads.github.com/repos/OrcaSlicer/OrcaSlicer/releases/137995723/assets{?name,label}
|
||||
release_id: 137995723
|
||||
asset_path: ${{ github.workspace }}/OrcaSlicer_profile_validator_Mac_universal_${{ env.ver }}.dmg
|
||||
asset_name: OrcaSlicer_profile_validator_Mac_universal_nightly.dmg
|
||||
|
|
@ -282,10 +282,10 @@ jobs:
|
|||
path: ${{ github.workspace }}/build/src/Release/OrcaSlicer_profile_validator.exe
|
||||
|
||||
- name: Deploy Windows release portable
|
||||
if: github.repository == 'SoftFever/OrcaSlicer' && github.ref == 'refs/heads/main' && inputs.os == 'windows-latest'
|
||||
if: github.repository == 'OrcaSlicer/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}
|
||||
upload_url: https://uploads.github.com/repos/OrcaSlicer/OrcaSlicer/releases/137995723/assets{?name,label}
|
||||
release_id: 137995723
|
||||
asset_path: ${{ github.workspace }}/build/OrcaSlicer_Windows_${{ env.ver }}_portable.zip
|
||||
asset_name: OrcaSlicer_Windows_nightly_portable.zip
|
||||
|
|
@ -293,10 +293,10 @@ jobs:
|
|||
max_releases: 1
|
||||
|
||||
- name: Deploy Windows release installer
|
||||
if: github.repository == 'SoftFever/OrcaSlicer' && github.ref == 'refs/heads/main' && inputs.os == 'windows-latest'
|
||||
if: github.repository == 'OrcaSlicer/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}
|
||||
upload_url: https://uploads.github.com/repos/OrcaSlicer/OrcaSlicer/releases/137995723/assets{?name,label}
|
||||
release_id: 137995723
|
||||
asset_path: ${{ github.workspace }}/build/OrcaSlicer_Windows_Installer_${{ env.ver }}.exe
|
||||
asset_name: OrcaSlicer_Windows_Installer_nightly.exe
|
||||
|
|
@ -304,10 +304,10 @@ jobs:
|
|||
max_releases: 1
|
||||
|
||||
- name: Deploy Windows OrcaSlicer_profile_validator release
|
||||
if: github.repository == 'SoftFever/OrcaSlicer' && github.ref == 'refs/heads/main' && inputs.os == 'windows-latest'
|
||||
if: github.repository == 'OrcaSlicer/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}
|
||||
upload_url: https://uploads.github.com/repos/OrcaSlicer/OrcaSlicer/releases/137995723/assets{?name,label}
|
||||
release_id: 137995723
|
||||
asset_path: ${{ github.workspace }}/build/src/Release/OrcaSlicer_profile_validator.exe
|
||||
asset_name: OrcaSlicer_profile_validator_Windows_nightly.exe
|
||||
|
|
@ -373,19 +373,19 @@ jobs:
|
|||
path: './build/src/Release/OrcaSlicer_profile_validator'
|
||||
|
||||
- name: Deploy Ubuntu release
|
||||
if: ${{ github.repository == 'SoftFever/OrcaSlicer' && ! env.ACT && github.ref == 'refs/heads/main' && (inputs.os == 'ubuntu-20.04' || inputs.os == 'ubuntu-24.04') }}
|
||||
if: ${{ github.repository == 'OrcaSlicer/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
|
||||
with:
|
||||
upload_url: https://uploads.github.com/repos/SoftFever/OrcaSlicer/releases/137995723/assets{?name,label}
|
||||
upload_url: https://uploads.github.com/repos/OrcaSlicer/OrcaSlicer/releases/137995723/assets{?name,label}
|
||||
release_id: 137995723
|
||||
asset_path: ./build/OrcaSlicer_Linux_AppImage${{ env.ubuntu-ver-str }}_${{ env.ver }}.AppImage
|
||||
asset_name: OrcaSlicer_Linux_AppImage${{ env.ubuntu-ver-str }}_nightly.AppImage
|
||||
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: ${{ github.repository == 'SoftFever/OrcaSlicer' && ! env.ACT && github.ref == 'refs/heads/main' && inputs.os == 'ubuntu-24.04' }}
|
||||
if: ${{ github.repository == 'OrcaSlicer/OrcaSlicer' && ! env.ACT && github.ref == 'refs/heads/main' && inputs.os == 'ubuntu-24.04' }}
|
||||
uses: rickstaa/action-create-tag@v1
|
||||
with:
|
||||
tag: "nightly-builds"
|
||||
|
|
@ -394,12 +394,12 @@ jobs:
|
|||
message: "nightly-builds"
|
||||
|
||||
- name: Deploy Ubuntu OrcaSlicer_profile_validator release
|
||||
if: ${{ github.repository == 'SoftFever/OrcaSlicer' && ! env.ACT && github.ref == 'refs/heads/main' && (inputs.os == 'ubuntu-20.04' || inputs.os == 'ubuntu-24.04') }}
|
||||
if: ${{ github.repository == 'OrcaSlicer/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
|
||||
with:
|
||||
upload_url: https://uploads.github.com/repos/SoftFever/OrcaSlicer/releases/137995723/assets{?name,label}
|
||||
upload_url: https://uploads.github.com/repos/OrcaSlicer/OrcaSlicer/releases/137995723/assets{?name,label}
|
||||
release_id: 137995723
|
||||
asset_path: ./build/src/Release/OrcaSlicer_profile_validator
|
||||
asset_name: OrcaSlicer_profile_validator_Linux${{ env.ubuntu-ver-str }}_nightly
|
||||
|
|
@ -407,10 +407,10 @@ jobs:
|
|||
max_releases: 1
|
||||
|
||||
- name: Deploy orca_custom_preset_tests
|
||||
if: ${{ github.repository == 'SoftFever/OrcaSlicer' && ! env.ACT && github.ref == 'refs/heads/main' && inputs.os == 'ubuntu-24.04' }}
|
||||
if: ${{ github.repository == 'OrcaSlicer/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}
|
||||
upload_url: https://uploads.github.com/repos/OrcaSlicer/OrcaSlicer/releases/137995723/assets{?name,label}
|
||||
release_id: 137995723
|
||||
asset_path: ${{ github.workspace }}/resources/profiles/orca_custom_preset_tests.zip
|
||||
asset_name: orca_custom_preset_tests.zip
|
||||
|
|
|
|||
2
.github/workflows/check_locale.yml
vendored
|
|
@ -14,7 +14,7 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Install gettext
|
||||
run: |
|
||||
|
|
|
|||
4
.github/workflows/check_profiles.yml
vendored
|
|
@ -21,7 +21,7 @@ jobs:
|
|||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Run extra JSON check
|
||||
run: |
|
||||
|
|
@ -42,7 +42,7 @@ jobs:
|
|||
- name: validate custom presets
|
||||
working-directory: ${{ github.workspace }}
|
||||
run: |
|
||||
curl -LJO https://github.com/SoftFever/OrcaSlicer/releases/download/nightly-builds/orca_custom_preset_tests.zip
|
||||
curl -LJO https://github.com/OrcaSlicer/OrcaSlicer/releases/download/nightly-builds/orca_custom_preset_tests.zip
|
||||
unzip ./orca_custom_preset_tests.zip -d ${{ github.workspace }}/resources/profiles
|
||||
./OrcaSlicer_profile_validator -p ${{ github.workspace }}/resources/profiles -l 2
|
||||
|
||||
|
|
|
|||
81
.github/workflows/dedupe-issues.yml
vendored
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
name: Orca Issue Dedupe
|
||||
description: Automatically dedupe GitHub issues using AI
|
||||
on:
|
||||
issues:
|
||||
types: [opened]
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
issue_number:
|
||||
description: 'Issue number to process for duplicate detection'
|
||||
required: true
|
||||
type: string
|
||||
|
||||
jobs:
|
||||
dedupe-issues:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 30
|
||||
permissions:
|
||||
contents: read
|
||||
issues: write
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Run Claude Code slash command
|
||||
uses: anthropics/claude-code-base-action@beta
|
||||
with:
|
||||
prompt: "/dedupe ${{ github.repository }}/issues/${{ github.event.issue.number || inputs.issue_number }}"
|
||||
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
||||
claude_args: "--model claude-sonnet-4-5-20250929"
|
||||
claude_env: |
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Log duplicate comment event to Statsig
|
||||
if: always()
|
||||
env:
|
||||
STATSIG_API_KEY: ${{ secrets.STATSIG_API_KEY }}
|
||||
run: |
|
||||
ISSUE_NUMBER=${{ github.event.issue.number || inputs.issue_number }}
|
||||
REPO=${{ github.repository }}
|
||||
|
||||
if [ -z "$STATSIG_API_KEY" ]; then
|
||||
echo "STATSIG_API_KEY not found, skipping Statsig logging"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Prepare the event payload
|
||||
EVENT_PAYLOAD=$(jq -n \
|
||||
--arg issue_number "$ISSUE_NUMBER" \
|
||||
--arg repo "$REPO" \
|
||||
--arg triggered_by "${{ github.event_name }}" \
|
||||
'{
|
||||
events: [{
|
||||
eventName: "github_duplicate_comment_added",
|
||||
value: 1,
|
||||
metadata: {
|
||||
repository: $repo,
|
||||
issue_number: ($issue_number | tonumber),
|
||||
triggered_by: $triggered_by,
|
||||
workflow_run_id: "${{ github.run_id }}"
|
||||
},
|
||||
time: (now | floor | tostring)
|
||||
}]
|
||||
}')
|
||||
|
||||
# Send to Statsig API
|
||||
echo "Logging duplicate comment event to Statsig for issue #${ISSUE_NUMBER}"
|
||||
|
||||
RESPONSE=$(curl -s -w "\n%{http_code}" -X POST https://events.statsigapi.net/v1/log_event \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "STATSIG-API-KEY: ${STATSIG_API_KEY}" \
|
||||
-d "$EVENT_PAYLOAD")
|
||||
|
||||
HTTP_CODE=$(echo "$RESPONSE" | tail -n1)
|
||||
BODY=$(echo "$RESPONSE" | head -n-1)
|
||||
|
||||
if [ "$HTTP_CODE" -eq 200 ] || [ "$HTTP_CODE" -eq 202 ]; then
|
||||
echo "Successfully logged duplicate comment event for issue #${ISSUE_NUMBER}"
|
||||
else
|
||||
echo "Failed to log duplicate comment event for issue #${ISSUE_NUMBER}. HTTP ${HTTP_CODE}: ${BODY}"
|
||||
fi
|
||||
73
.github/workflows/orca_bot.yml
vendored
|
|
@ -1,73 +0,0 @@
|
|||
name: Orca bot
|
||||
on:
|
||||
schedule:
|
||||
- cron: "0 0 * * *"
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
logLevel:
|
||||
description: 'Log level'
|
||||
required: true
|
||||
default: 'warning'
|
||||
|
||||
jobs:
|
||||
stale:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
contents: write # only for delete-branch option
|
||||
steps:
|
||||
- uses: actions/stale@v10
|
||||
with:
|
||||
# PAT for GitHub API authentication
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
# Max number of operations per run
|
||||
operations-per-run: 1000
|
||||
# Order to get issues/PRs
|
||||
ascending: true
|
||||
|
||||
# ISSUES
|
||||
# Do not auto-close an issue if it is assigned to a milestone
|
||||
exempt-all-issue-milestones: true
|
||||
# Exempt all issues with assignees from stale
|
||||
exempt-all-issue-assignees: true
|
||||
# Exempt feature requests
|
||||
exempt-issue-labels: "enhancement"
|
||||
# Idle number of days before marking issues stale
|
||||
days-before-issue-stale: 90
|
||||
# Idle number of days before marking issues close
|
||||
days-before-issue-close: 7
|
||||
# Label to apply on staled issues
|
||||
stale-issue-label: "stale"
|
||||
# Issue close reason
|
||||
close-issue-reason: not_planned
|
||||
# Remove stale label from issues on updates
|
||||
remove-issue-stale-when-updated: true
|
||||
# Issue stale message
|
||||
stale-issue-message: "Orca bot: this issue is stale because it has been open for 90 days with no activity."
|
||||
# Issue closure message
|
||||
close-issue-message: "Orca bot: This issue was closed because it has been inactive for 7 days since being marked as stale."
|
||||
|
||||
# PRs
|
||||
# Do not auto-close a PR if it is assigned to a milestone
|
||||
exempt-all-pr-milestones: true
|
||||
# Exempt all PRs with assignees from stale
|
||||
exempt-all-pr-assignees: true
|
||||
# Skip the stale action for draft PRs
|
||||
exempt-draft-pr: true
|
||||
# Idle number of days before marking PRs stale
|
||||
days-before-pr-stale: -1
|
||||
# Idle number of days before marking PRs close
|
||||
days-before-pr-close: -1
|
||||
# Label to apply on staled PRs
|
||||
stale-pr-label: "stale"
|
||||
# Label to apply on closed PRs
|
||||
close-pr-label: not_planned
|
||||
# Remove stale label from PRs on updates
|
||||
remove-pr-stale-when-updated: true
|
||||
# PR stale message
|
||||
stale-pr-message: "Orca bot: this PR is stale because it has been open for XX days with no activity."
|
||||
# PR closure message
|
||||
close-pr-message: "Orca bot: This PR was closed because it has been inactive for X days since being marked as stale."
|
||||
# Delete branch after closing a stale PR
|
||||
delete-branch: true
|
||||
46
.github/workflows/publish_docs_to_wiki.yml
vendored
|
|
@ -1,46 +0,0 @@
|
|||
name: Publish docs to Wiki
|
||||
|
||||
# Trigger this action only if there are changes pushed to the doc/** directory under the main branch
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- doc/** # This includes all sub folders
|
||||
branches:
|
||||
- main # This can be changed to any branch of your preference
|
||||
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
logLevel:
|
||||
description: 'Log level'
|
||||
required: true
|
||||
default: 'warning'
|
||||
|
||||
env:
|
||||
USER_TOKEN: ${{ secrets.GH_WIKI_PAT }} # This is the repository secret personal access token
|
||||
USER_NAME: ${{ vars.BOT_USER_NAME }} # Enter the username of your (bot) account
|
||||
OWNER: ${{ github.event.repository.owner.name }} # This is the repository owner
|
||||
REPOSITORY_NAME: ${{ github.event.repository.name }} # This is the repository name
|
||||
|
||||
jobs:
|
||||
publish_docs_to_wiki:
|
||||
name: Publish docs to Wiki
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5
|
||||
|
||||
# 1. Clone the current wiki master branch to a folder named `tmp_wiki`
|
||||
- name: Pull content from wiki
|
||||
run: |
|
||||
git config --global user.name "$USER_NAME"
|
||||
git config --global user.email "$USER_NAME"@users.noreply.github.com
|
||||
git clone https://"$USER_TOKEN"@github.com/SoftFever/"$REPOSITORY_NAME".wiki.git tmp_wiki
|
||||
# 4. Synchronize differences between `doc` & `tmp_wiki`
|
||||
# 5. Push new Wiki content
|
||||
- name: Push main repo content to wiki
|
||||
run: |
|
||||
rsync -av --delete doc/ tmp_wiki/ --exclude .git
|
||||
cd tmp_wiki
|
||||
git add .
|
||||
git commit -m "Updated Wiki content"
|
||||
git push origin master
|
||||
2
.github/workflows/shellcheck.yml
vendored
|
|
@ -36,7 +36,7 @@ jobs:
|
|||
tar -xvf ~/sc.tar.xz -C ~
|
||||
mv ~/shellcheck-"${INPUT_VERSION}"/shellcheck ~/shellcheck
|
||||
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 1
|
||||
|
||||
|
|
|
|||
2
.github/workflows/update-translation.yml
vendored
|
|
@ -10,7 +10,7 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v6
|
||||
|
|
|
|||
368
.github/workflows/validate-documentation.yml
vendored
|
|
@ -1,368 +0,0 @@
|
|||
name: Validate Documentation
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
paths:
|
||||
- 'src/slic3r/GUI/Tab.cpp'
|
||||
- 'doc/**/*.md'
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
issues: write
|
||||
|
||||
jobs:
|
||||
validate:
|
||||
runs-on: windows-latest
|
||||
name: Check Documentation
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Get changed files
|
||||
id: changed-files
|
||||
uses: tj-actions/changed-files@v47
|
||||
with:
|
||||
files: |
|
||||
src/slic3r/GUI/Tab.cpp
|
||||
doc/**/*.md
|
||||
|
||||
- name: Run validation
|
||||
if: steps.changed-files.outputs.any_changed == 'true'
|
||||
shell: pwsh
|
||||
run: |
|
||||
# Helper Functions
|
||||
function Normalize-Fragment($fragment) {
|
||||
return $fragment.ToLower().Trim() -replace '[^a-z0-9\s-]', '' -replace ' ', '-' -replace '^-+|-+$', ''
|
||||
}
|
||||
|
||||
function Add-BrokenReference($sourceFile, $line, $target, $issue, $type) {
|
||||
return @{
|
||||
SourceFile = $sourceFile
|
||||
Line = $line
|
||||
Target = $target
|
||||
Issue = $issue
|
||||
Type = $type
|
||||
}
|
||||
}
|
||||
|
||||
function Validate-Fragment($fragment, $availableAnchors, $sourceFile, $line, $target, $type) {
|
||||
$cleanFragment = $fragment.StartsWith('#') ? $fragment.Substring(1) : $fragment
|
||||
$normalizedFragment = Normalize-Fragment $cleanFragment
|
||||
|
||||
if ($availableAnchors -notcontains $normalizedFragment) {
|
||||
return Add-BrokenReference $sourceFile $line $target "Fragment does not exist" $type
|
||||
}
|
||||
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'
|
||||
$brokenReferences = @()
|
||||
$docIndex = @{}
|
||||
|
||||
Write-Host "Validating documentation..." -ForegroundColor Blue
|
||||
|
||||
# Validate paths
|
||||
$hasTabFile = Test-Path $tabFile
|
||||
if (-not $hasTabFile) { Write-Host "::warning::Tab.cpp file not found at: $tabFile" }
|
||||
if (-not (Test-Path $docDir)) { Write-Host "::error::doc folder does not exist"; exit 1 }
|
||||
|
||||
# Build documentation index
|
||||
$mdFiles = Get-ChildItem -Path $docDir -Filter *.md -Recurse -File -ErrorAction SilentlyContinue
|
||||
|
||||
foreach ($mdFile in $mdFiles) {
|
||||
$baseName = [System.IO.Path]::GetFileNameWithoutExtension($mdFile.Name)
|
||||
$relPath = (Resolve-Path $mdFile.FullName).Path.Substring($docDir.Length).TrimStart('\', '/')
|
||||
$content = Get-Content -Path $mdFile.FullName -Encoding UTF8 -Raw
|
||||
$lines = Get-Content -Path $mdFile.FullName -Encoding UTF8
|
||||
|
||||
# Extract anchors
|
||||
$anchors = @()
|
||||
$anchors += [regex]::Matches($content, '(?i)<a\s+[^>]*(?:name|id)\s*=\s*[`"'']([^`"'']+)[`"'']') |
|
||||
ForEach-Object { $_.Groups[1].Value.ToLower() }
|
||||
$anchors += [regex]::Matches($content, '(?m)^#+\s+(.+)$') |
|
||||
ForEach-Object { Normalize-Fragment $_.Groups[1].Value.Trim() }
|
||||
|
||||
# Parse links
|
||||
$links = @()
|
||||
$inCodeFence = $false
|
||||
for ($i = 0; $i -lt $lines.Count; $i++) {
|
||||
$line = $lines[$i]
|
||||
if ($line.TrimStart() -match '^(```|~~~)') {
|
||||
$inCodeFence = -not $inCodeFence
|
||||
continue
|
||||
}
|
||||
if ($inCodeFence) { continue }
|
||||
|
||||
$lineForParsing = [regex]::Replace($line, '`[^`]*`', '')
|
||||
|
||||
# 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('#')) {
|
||||
$fragment = $destRaw.Substring(1)
|
||||
if ($fragment.Contains('#')) {
|
||||
$brokenReferences += Add-BrokenReference $relPath ($i + 1) $destRaw "Internal link must use only one #." "Link"
|
||||
} else {
|
||||
$validationResult = Validate-Fragment $fragment $anchors $relPath ($i + 1) $destRaw "Link"
|
||||
if ($validationResult) { $brokenReferences += $validationResult }
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
# Skip external URLs
|
||||
if ($destRaw -match '^(?:https?:|mailto:|data:|#|\\)') { continue }
|
||||
|
||||
# Check for double ##
|
||||
if ($destRaw.Contains('##')) {
|
||||
$brokenReferences += Add-BrokenReference $relPath ($i + 1) $destRaw "Use single # for fragments." "Link"
|
||||
continue
|
||||
}
|
||||
|
||||
# Parse file and fragment
|
||||
$destParts = $destRaw -split '#', 2
|
||||
$destNoFragment = $destParts[0]
|
||||
$fragment = ($destParts.Length -gt 1) ? $destParts[1] : $null
|
||||
|
||||
if ($destNoFragment) {
|
||||
$leaf = ($destNoFragment -split '[\\/]')[-1]
|
||||
if ($leaf) {
|
||||
$targetBase = $leaf.ToLower().EndsWith('.md') ? $leaf.Substring(0, $leaf.Length - 3) : $leaf
|
||||
$targetBase = $targetBase.Trim()
|
||||
if ($targetBase) {
|
||||
$linkInfo = @{
|
||||
TargetBase = $targetBase
|
||||
Fragment = $fragment
|
||||
Line = $i + 1
|
||||
SourceFile = $relPath
|
||||
}
|
||||
$links += $linkInfo
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$docIndex[$baseName] = @{ Anchors = $anchors; Links = $links }
|
||||
}
|
||||
|
||||
# Parse Tab.cpp references
|
||||
if ($hasTabFile) {
|
||||
$regex = 'optgroup->append_single_option_line\s*\(\s*(?:"([^"]+)"|([^,]+?))\s*,\s*"([^"]+)"\s*\)'
|
||||
$lines = Get-Content -Path $tabFile -Encoding UTF8
|
||||
|
||||
for ($i = 0; $i -lt $lines.Count; $i++) {
|
||||
foreach ($match in [regex]::Matches($lines[$i], $regex)) {
|
||||
$arg2Full = $match.Groups[3].Value.Trim()
|
||||
|
||||
if ($arg2Full.Contains('##')) {
|
||||
$brokenReferences += Add-BrokenReference "Tab.cpp" ($i + 1) $arg2Full "Use single # for fragments." "Link"
|
||||
continue
|
||||
}
|
||||
|
||||
$arg2Parts = $arg2Full -split '#', 2
|
||||
$docBase = $arg2Parts[0].Trim()
|
||||
$fragment = ($arg2Parts.Length -gt 1) ? $arg2Parts[1].Trim() : $null
|
||||
|
||||
if (-not $docIndex.ContainsKey($docBase)) {
|
||||
$brokenReferences += Add-BrokenReference "Tab.cpp" ($i + 1) $docBase "File does not exist" "Link"
|
||||
} elseif ($fragment) {
|
||||
$validationResult = Validate-Fragment $fragment $docIndex[$docBase].Anchors "Tab.cpp" ($i + 1) "$docBase#$fragment" "Link"
|
||||
if ($validationResult) { $brokenReferences += $validationResult }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Validate markdown links
|
||||
foreach ($baseName in $docIndex.Keys) {
|
||||
foreach ($link in $docIndex[$baseName].Links) {
|
||||
if (-not $docIndex.ContainsKey($link.TargetBase)) {
|
||||
$brokenReferences += Add-BrokenReference $link.SourceFile $link.Line "$($link.TargetBase).md" "File does not exist" "Link"
|
||||
} elseif ($link.Fragment) {
|
||||
$validationResult = Validate-Fragment $link.Fragment $docIndex[$link.TargetBase].Anchors $link.SourceFile $link.Line "$($link.TargetBase)#$($link.Fragment)" "Link"
|
||||
if ($validationResult) { $brokenReferences += $validationResult }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Validate images
|
||||
Write-Host "Validating images..." -ForegroundColor Blue
|
||||
$expectedUrlPattern = '^https://github\.com/SoftFever/OrcaSlicer/blob/main/([^?]+)\?raw=true$'
|
||||
|
||||
foreach ($file in $mdFiles) {
|
||||
$lines = Get-Content $file.FullName -Encoding UTF8
|
||||
$relPath = (Resolve-Path $file.FullName).Path.Substring($docDir.Length).TrimStart('\', '/')
|
||||
|
||||
$inCodeFence = $false
|
||||
for ($lineNumber = 0; $lineNumber -lt $lines.Count; $lineNumber++) {
|
||||
$line = $lines[$lineNumber]
|
||||
if ($line.TrimStart() -match '^(```|~~~)') {
|
||||
$inCodeFence = -not $inCodeFence
|
||||
continue
|
||||
}
|
||||
if ($inCodeFence) { continue }
|
||||
|
||||
# Use the unified image detection function
|
||||
$imagesInLine = Get-ImagesFromLine $line
|
||||
|
||||
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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Report results
|
||||
$linkErrors = $brokenReferences | Where-Object { $_.Type -eq "Link" }
|
||||
$imageErrors = $brokenReferences | Where-Object { $_.Type -eq "Image" }
|
||||
|
||||
if ($brokenReferences.Count -gt 0) {
|
||||
Write-Host "::error::Documentation validation failed"
|
||||
|
||||
# Build error summary for PR comment
|
||||
$errorSummary = ""
|
||||
|
||||
# Report link errors
|
||||
if ($linkErrors) {
|
||||
Write-Host "::group::🔗 Link Validation Errors"
|
||||
$errorSummary += "## 🔗 Link Validation Errors`n`n"
|
||||
$linkErrors | Group-Object SourceFile | ForEach-Object {
|
||||
Write-Host "📄 $($_.Name):" -ForegroundColor Yellow
|
||||
$errorSummary += "**📄 doc/$($_.Name):**`n"
|
||||
$_.Group | Sort-Object Line | ForEach-Object {
|
||||
Write-Host " Line $($_.Line): $($_.Target) - $($_.Issue)" -ForegroundColor Red
|
||||
Write-Host "::error file=doc/$($_.SourceFile),line=$($_.Line)::$($_.Target) - $($_.Issue)"
|
||||
$errorSummary += "- Line $($_.Line): ``$($_.Target)`` - $($_.Issue)`n"
|
||||
}
|
||||
$errorSummary += "`n"
|
||||
}
|
||||
Write-Host "::endgroup::"
|
||||
}
|
||||
|
||||
# Report image errors
|
||||
if ($imageErrors) {
|
||||
Write-Host "::group::🖼️ Image Validation Errors"
|
||||
$errorSummary += "## 🖼️ Image Validation Errors`n`n"
|
||||
$imageErrors | Group-Object SourceFile | ForEach-Object {
|
||||
Write-Host "📄 $($_.Name):" -ForegroundColor Yellow
|
||||
$errorSummary += "**📄 doc/$($_.Name):**`n"
|
||||
$_.Group | Sort-Object Line | ForEach-Object {
|
||||
Write-Host " Line $($_.Line): $($_.Issue)" -ForegroundColor Red
|
||||
Write-Host "::error file=doc/$($_.SourceFile),line=$($_.Line)::$($_.Issue)"
|
||||
$errorSummary += "- Line $($_.Line): $($_.Issue)`n"
|
||||
}
|
||||
$errorSummary += "`n"
|
||||
}
|
||||
Write-Host "::endgroup::"
|
||||
}
|
||||
|
||||
# Export error summary for PR comment
|
||||
Add-Content -Path $env:GITHUB_ENV -Value "VALIDATION_ERRORS<<EOF"
|
||||
Add-Content -Path $env:GITHUB_ENV -Value $errorSummary
|
||||
Add-Content -Path $env:GITHUB_ENV -Value "EOF"
|
||||
|
||||
exit 1
|
||||
} else {
|
||||
Write-Host "::notice::All documentation is valid!"
|
||||
exit 0
|
||||
}
|
||||
|
|
@ -5,6 +5,12 @@ if ( (MSVC OR WIN32) AND (${CMAKE_VERSION} VERSION_LESS "3.5") )
|
|||
message(FATAL_ERROR "CMake current version ${CMAKE_VERSION} is too old. Minimum required is 3.5.")
|
||||
endif()
|
||||
|
||||
# The following line used to be in tests/CMakeLists.txt
|
||||
# Having it there causes rebuilds of all targets on any CMakeLists.txt change under tests/
|
||||
# It has no effect on how code is compiled or linked.
|
||||
# It just lets you later do `set_property(TARGET foo PROPERTY FOLDER "bar")`
|
||||
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||
|
||||
if (WIN32)
|
||||
# Detect known CI environments
|
||||
set(IS_CI FALSE)
|
||||
|
|
@ -340,7 +346,7 @@ if(WIN32)
|
|||
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")
|
||||
set(WIN10SDK_INCLUDE_PATH "C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.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")
|
||||
|
|
@ -930,7 +936,7 @@ set (CPACK_PACKAGE_VERSION_MINOR "${ORCA_VERSION_MINOR}")
|
|||
set (CPACK_PACKAGE_VERSION_PATCH "${ORCA_VERSION_PATCH}")
|
||||
set (CPACK_PACKAGE_FILE_NAME "OrcaSlicer_Windows_Installer_V${SoftFever_VERSION}")
|
||||
set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "Orca Slicer is an open source slicer for FDM printers")
|
||||
set (CPACK_PACKAGE_HOMEPAGE_URL "https://github.com/SoftFever/OrcaSlicer")
|
||||
set (CPACK_PACKAGE_HOMEPAGE_URL "https://github.com/OrcaSlicer/OrcaSlicer")
|
||||
set (CPACK_PACKAGE_INSTALL_DIRECTORY ${CPACK_PACKAGE_NAME})
|
||||
set (CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/resources/images\\\\OrcaSlicer.ico")
|
||||
set (CPACK_NSIS_MUI_ICON "${CPACK_PACKAGE_ICON}")
|
||||
|
|
|
|||
42
README.md
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
<a href="https://trendshift.io/repositories/952" target="_blank"><img src="https://trendshift.io/api/badge/repositories/952" alt="SoftFever%2FOrcaSlicer | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
|
||||
|
||||
[](https://github.com/SoftFever/OrcaSlicer/stargazers) [](https://github.com/SoftFever/OrcaSlicer/actions/workflows/build_all.yml)
|
||||
[](https://github.com/OrcaSlicer/OrcaSlicer/stargazers) [](https://github.com/OrcaSlicer/OrcaSlicer/actions/workflows/build_all.yml)
|
||||
|
||||
OrcaSlicer: an open source Next-Gen Slicing Software for Precision 3D Prints.
|
||||
Optimize your prints with ultra-fast slicing, intelligent support generation, and seamless printer compatibility—engineered for perfection.
|
||||
|
|
@ -18,7 +18,7 @@ Optimize your prints with ultra-fast slicing, intelligent support generation, an
|
|||
<a href="https://www.orcaslicer.com/" style="font-size:2em;">OrcaSlicer.com</a>
|
||||
|
||||
#### Github Repository:
|
||||
<a href="https://github.com/SoftFever/OrcaSlicer"><img src="https://img.shields.io/badge/OrcaSlicer-181717?style=flat&logo=github&logoColor=white" width="200" alt="GitHub Logo"/> </a>
|
||||
<a href="https://github.com/OrcaSlicer/OrcaSlicer"><img src="https://img.shields.io/badge/OrcaSlicer-181717?style=flat&logo=github&logoColor=white" width="200" alt="GitHub Logo"/> </a>
|
||||
|
||||
#### Follow us:
|
||||
<a href="https://twitter.com/real_OrcaSlicer"><img src="https://img.shields.io/badge/real__OrcaSlicer-000000?style=flat&logo=x&logoColor=white" width="200" alt="X Logo"/> </a>
|
||||
|
|
@ -44,64 +44,62 @@ If you come across any of these in search results, please <b>report them</b> as
|
|||
|
||||
# Main features
|
||||
|
||||
- **[Advanced Calibration Tools](https://github.com/SoftFever/OrcaSlicer/wiki/Calibration)**
|
||||
- **[Advanced Calibration Tools](https://github.com/OrcaSlicer/OrcaSlicer/wiki/Calibration)**
|
||||
Comprehensive suite: temperature towers, flow rate, retraction & more for optimal performance.
|
||||
- **[Precise Wall](https://github.com/SoftFever/OrcaSlicer/wiki/quality_settings_precision#precise-wall) and [Seam Control](https://github.com/SoftFever/OrcaSlicer/wiki/quality_settings_seam)**
|
||||
- **[Precise Wall](https://github.com/OrcaSlicer/OrcaSlicer/wiki/quality_settings_precision#precise-wall) and [Seam Control](https://github.com/OrcaSlicer/OrcaSlicer/wiki/quality_settings_seam)**
|
||||
Adjust outer wall spacing and apply scarf seams to enhance print accuracy.
|
||||
- **[Sandwich Mode](https://github.com/SoftFever/OrcaSlicer/wiki/quality_settings_wall_and_surfaces#innerouterinner) and [Polyholes](https://github.com/SoftFever/OrcaSlicer/wiki/quality_settings_precision#polyholes) Support**
|
||||
Use varied infill [patterns](https://github.com/SoftFever/OrcaSlicer/wiki/strength_settings_patterns) and accurate hole shapes for improved clarity.
|
||||
- **[Overhang](https://github.com/SoftFever/OrcaSlicer/wiki/quality_settings_overhangs) and [Support Optimization](https://github.com/SoftFever/OrcaSlicer/wiki#support-settings)**
|
||||
- **[Sandwich Mode](https://github.com/OrcaSlicer/OrcaSlicer/wiki/quality_settings_wall_and_surfaces#innerouterinner) and [Polyholes](https://github.com/OrcaSlicer/OrcaSlicer/wiki/quality_settings_precision#polyholes) Support**
|
||||
Use varied infill [patterns](https://github.com/OrcaSlicer/OrcaSlicer/wiki/strength_settings_patterns) and accurate hole shapes for improved clarity.
|
||||
- **[Overhang](https://github.com/OrcaSlicer/OrcaSlicer/wiki/quality_settings_overhangs) and [Support Optimization](https://github.com/OrcaSlicer/OrcaSlicer/wiki#support-settings)**
|
||||
Modify geometry for printable overhangs with precise support placement.
|
||||
- **[Granular Controls](https://github.com/SoftFever/OrcaSlicer/wiki#process-settings) and Customization**
|
||||
- **[Granular Controls and Customization](https://github.com/OrcaSlicer/OrcaSlicer/wiki#process-settings)**
|
||||
Fine-tune print speed, layer height, pressure, and temperature with precision.
|
||||
- **Network Printer Support**
|
||||
Seamless integration with Klipper, PrusaLink, and OctoPrint for remote control.
|
||||
- **[Mouse Ear Brims](https://github.com/SoftFever/OrcaSlicer/wiki/others_settings_brim) & Adaptive Bed Mesh**
|
||||
- **[Mouse Ear Brims](https://github.com/OrcaSlicer/OrcaSlicer/wiki/others_settings_brim) & [Adaptive Bed Mesh](https://github.com/OrcaSlicer/OrcaSlicer/wiki/printer_basic_information_adaptive_bed_mesh)**
|
||||
Automatic brims and adaptive mesh calibration ensure consistent adhesion.
|
||||
- **User-Friendly Interface**
|
||||
Intuitive drag-and-drop design with pre-made profiles for popular printers.
|
||||
- **[Open-Source](https://github.com/SoftFever/OrcaSlicer) & [Community Driven](https://discord.gg/P4VE9UY9gJ)**
|
||||
- **[Open-Source](https://github.com/OrcaSlicer/OrcaSlicer) & [Community Driven](https://discord.gg/P4VE9UY9gJ)**
|
||||
Regular updates fueled by continuous community contributions.
|
||||
- **Wide Printer Compatibility**
|
||||
Supports a broad range of printers: Bambu Lab, Prusa, Creality, Voron, and more.
|
||||
- Additional features can be found in the [change notes](https://github.com/SoftFever/OrcaSlicer/releases/).
|
||||
- Additional features can be found in the [change notes](https://github.com/OrcaSlicer/OrcaSlicer/releases/).
|
||||
|
||||
# Wiki
|
||||
|
||||
The wiki below aims to provide a detailed explanation of the slicer settings, including how to maximize their use and how to calibrate and set up your printer.
|
||||
The [wiki](https://github.com/OrcaSlicer/OrcaSlicer/wiki) aims to provide a detailed explanation of the slicer settings, including how to maximize their use and how to calibrate and set up your printer.
|
||||
|
||||
Please note that the wiki is a work in progress. We appreciate your patience as we continue to develop and improve it!
|
||||
|
||||
- **[Access the wiki here](https://github.com/SoftFever/OrcaSlicer/wiki)**
|
||||
- **[Contribute to the wiki](https://github.com/SoftFever/OrcaSlicer/wiki/How-to-wiki)**
|
||||
- **[Access the wiki here](https://github.com/OrcaSlicer/OrcaSlicer/wiki)**
|
||||
- **[Contribute to the wiki](https://github.com/OrcaSlicer/OrcaSlicer/wiki/How-to-wiki)**
|
||||
|
||||
# Download
|
||||
|
||||
## Stable Release
|
||||
|
||||
📥 **[Download the Latest Stable Release](https://github.com/SoftFever/OrcaSlicer/releases/latest)**
|
||||
📥 **[Download the Latest Stable Release](https://github.com/OrcaSlicer/OrcaSlicer/releases/latest)**
|
||||
Visit our GitHub Releases page for the latest stable version of OrcaSlicer, recommended for most users.
|
||||
|
||||
## Nightly Builds
|
||||
|
||||
🌙 **[Download the Latest Nightly Build](https://github.com/SoftFever/OrcaSlicer/releases/tag/nightly-builds)**
|
||||
🌙 **[Download the Latest Nightly Build](https://github.com/OrcaSlicer/OrcaSlicer/releases/tag/nightly-builds)**
|
||||
Explore the latest developments in OrcaSlicer with our nightly builds. Feedback on these versions is highly appreciated.
|
||||
|
||||
# How to install
|
||||
|
||||
## Windows
|
||||
|
||||
Download the **Windows Installer exe** for your preferred version from the [releases page](https://github.com/SoftFever/OrcaSlicer/releases).
|
||||
Download the **Windows Installer exe** for your preferred version from the [releases page](https://github.com/OrcaSlicer/OrcaSlicer/releases).
|
||||
|
||||
- *For convenience there is also a portable build available.*
|
||||
<details>
|
||||
<summary>Troubleshooting</summary>
|
||||
|
||||
- *If you have troubles to run the build, you might need to install following runtimes:*
|
||||
- [MicrosoftEdgeWebView2RuntimeInstallerX64](https://github.com/SoftFever/OrcaSlicer/releases/download/v1.0.10-sf2/MicrosoftEdgeWebView2RuntimeInstallerX64.exe)
|
||||
- [MicrosoftEdgeWebView2RuntimeInstallerX64](https://github.com/OrcaSlicer/OrcaSlicer/releases/download/v1.0.10-sf2/MicrosoftEdgeWebView2RuntimeInstallerX64.exe)
|
||||
- [Details of this runtime](https://aka.ms/webview2)
|
||||
- [Alternative Download Link Hosted by Microsoft](https://go.microsoft.com/fwlink/p/?LinkId=2124703)
|
||||
- [vcredist2019_x64](https://github.com/SoftFever/OrcaSlicer/releases/download/v1.0.10-sf2/vcredist2019_x64.exe)
|
||||
- [vcredist2019_x64](https://github.com/OrcaSlicer/OrcaSlicer/releases/download/v1.0.10-sf2/vcredist2019_x64.exe)
|
||||
- [Alternative Download Link Hosted by Microsoft](https://aka.ms/vs/17/release/vc_redist.x64.exe)
|
||||
- This file may already be available on your computer if you've installed visual studio. Check the following location: `%VCINSTALLDIR%Redist\MSVC\v142`
|
||||
</details>
|
||||
|
|
@ -146,7 +144,7 @@ winget install --id=SoftFever.OrcaSlicer -e
|
|||
|
||||
# How to Compile
|
||||
|
||||
All updated build instructions for Windows, macOS, and Linux are now available on the official [OrcaSlicer Wiki - How to build](https://github.com/SoftFever/OrcaSlicer/wiki/How-to-build) page.
|
||||
All updated build instructions for Windows, macOS, and Linux are now available on the official [OrcaSlicer Wiki - How to build](https://github.com/OrcaSlicer/OrcaSlicer/wiki/How-to-build) page.
|
||||
|
||||
Please refer to the wiki to ensure you're following the latest and most accurate steps for your platform.
|
||||
|
||||
|
|
|
|||
|
|
@ -186,22 +186,22 @@ echo -e "${GREEN}All required dependencies found${NC}"
|
|||
# Install runtime and SDK if requested
|
||||
if [[ "$INSTALL_RUNTIME" == true ]]; then
|
||||
echo -e "${YELLOW}Installing GNOME runtime and SDK...${NC}"
|
||||
flatpak install --user -y flathub org.gnome.Platform//47
|
||||
flatpak install --user -y flathub org.gnome.Sdk//47
|
||||
flatpak install --user -y flathub org.gnome.Platform//48
|
||||
flatpak install --user -y flathub org.gnome.Sdk//48
|
||||
fi
|
||||
|
||||
# Check if required runtime is available
|
||||
if ! flatpak info --user org.gnome.Platform//47 &> /dev/null; then
|
||||
echo -e "${RED}Error: GNOME Platform 47 runtime is not installed.${NC}"
|
||||
if ! flatpak info --user org.gnome.Platform//48 &> /dev/null; then
|
||||
echo -e "${RED}Error: GNOME Platform 48 runtime is not installed.${NC}"
|
||||
echo "Run with -i flag to install it automatically, or install manually:"
|
||||
echo "flatpak install --user flathub org.gnome.Platform//47"
|
||||
echo "flatpak install --user flathub org.gnome.Platform//48"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! flatpak info --user org.gnome.Sdk//47 &> /dev/null; then
|
||||
echo -e "${RED}Error: GNOME SDK 47 is not installed.${NC}"
|
||||
if ! flatpak info --user org.gnome.Sdk//48 &> /dev/null; then
|
||||
echo -e "${RED}Error: GNOME SDK 48 is not installed.${NC}"
|
||||
echo "Run with -i flag to install it automatically, or install manually:"
|
||||
echo "flatpak install --user flathub org.gnome.Sdk//47"
|
||||
echo "flatpak install --user flathub org.gnome.Sdk//48"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
|
|
|||
|
|
@ -27,7 +27,6 @@ function usage() {
|
|||
echo " -L: use ld.lld as linker (if available)"
|
||||
echo "For a first use, you want to './${SCRIPT_NAME} -u'"
|
||||
echo " and then './${SCRIPT_NAME} -dsi'"
|
||||
echo "To build with tests: './${SCRIPT_NAME} -st' or './${SCRIPT_NAME} -dst'"
|
||||
}
|
||||
|
||||
SLIC3R_PRECOMPILED_HEADERS="ON"
|
||||
|
|
@ -102,11 +101,6 @@ 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
|
||||
|
|
@ -221,7 +215,7 @@ if [[ -n "${BUILD_DEPS}" ]] ; then
|
|||
print_and_run cmake --build deps/$BUILD_DIR
|
||||
fi
|
||||
|
||||
if [[ -n "${BUILD_ORCA}" ]] ; then
|
||||
if [[ -n "${BUILD_ORCA}" ]] || [[ -n "${BUILD_TESTS}" ]] ; then
|
||||
echo "Configuring OrcaSlicer..."
|
||||
if [[ -n "${CLEAN_BUILD}" ]] ; then
|
||||
print_and_run rm -fr $BUILD_DIR
|
||||
|
|
@ -243,11 +237,13 @@ if [[ -n "${BUILD_ORCA}" ]] ; then
|
|||
"${COLORED_OUTPUT}" \
|
||||
"${BUILD_ARGS[@]}"
|
||||
echo "done"
|
||||
echo "Building OrcaSlicer ..."
|
||||
print_and_run cmake --build $BUILD_DIR --config "${BUILD_CONFIG}" --target OrcaSlicer
|
||||
echo "Building OrcaSlicer_profile_validator .."
|
||||
print_and_run cmake --build $BUILD_DIR --config "${BUILD_CONFIG}" --target OrcaSlicer_profile_validator
|
||||
./scripts/run_gettext.sh
|
||||
if [[ -n "${BUILD_ORCA}" ]]; then
|
||||
echo "Building OrcaSlicer ..."
|
||||
print_and_run cmake --build $BUILD_DIR --config "${BUILD_CONFIG}" --target OrcaSlicer
|
||||
echo "Building OrcaSlicer_profile_validator .."
|
||||
print_and_run cmake --build $BUILD_DIR --config "${BUILD_CONFIG}" --target OrcaSlicer_profile_validator
|
||||
./scripts/run_gettext.sh
|
||||
fi
|
||||
if [[ -n "${BUILD_TESTS}" ]] ; then
|
||||
echo "Building tests ..."
|
||||
print_and_run cmake --build ${BUILD_DIR} --config "${BUILD_CONFIG}" --target tests/all
|
||||
|
|
|
|||
|
|
@ -1,175 +0,0 @@
|
|||
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
||||
# file Copyright.txt or https://cmake.org/licensing for details.
|
||||
|
||||
#[=======================================================================[.rst:
|
||||
Catch
|
||||
-----
|
||||
|
||||
This module defines a function to help use the Catch test framework.
|
||||
|
||||
The :command:`catch_discover_tests` discovers tests by asking the compiled test
|
||||
executable to enumerate its tests. This does not require CMake to be re-run
|
||||
when tests change. However, it may not work in a cross-compiling environment,
|
||||
and setting test properties is less convenient.
|
||||
|
||||
This command is intended to replace use of :command:`add_test` to register
|
||||
tests, and will create a separate CTest test for each Catch test case. Note
|
||||
that this is in some cases less efficient, as common set-up and tear-down logic
|
||||
cannot be shared by multiple test cases executing in the same instance.
|
||||
However, it provides more fine-grained pass/fail information to CTest, which is
|
||||
usually considered as more beneficial. By default, the CTest test name is the
|
||||
same as the Catch name; see also ``TEST_PREFIX`` and ``TEST_SUFFIX``.
|
||||
|
||||
.. command:: catch_discover_tests
|
||||
|
||||
Automatically add tests with CTest by querying the compiled test executable
|
||||
for available tests::
|
||||
|
||||
catch_discover_tests(target
|
||||
[TEST_SPEC arg1...]
|
||||
[EXTRA_ARGS arg1...]
|
||||
[WORKING_DIRECTORY dir]
|
||||
[TEST_PREFIX prefix]
|
||||
[TEST_SUFFIX suffix]
|
||||
[PROPERTIES name1 value1...]
|
||||
[TEST_LIST var]
|
||||
)
|
||||
|
||||
``catch_discover_tests`` sets up a post-build command on the test executable
|
||||
that generates the list of tests by parsing the output from running the test
|
||||
with the ``--list-test-names-only`` argument. This ensures that the full
|
||||
list of tests is obtained. Since test discovery occurs at build time, it is
|
||||
not necessary to re-run CMake when the list of tests changes.
|
||||
However, it requires that :prop_tgt:`CROSSCOMPILING_EMULATOR` is properly set
|
||||
in order to function in a cross-compiling environment.
|
||||
|
||||
Additionally, setting properties on tests is somewhat less convenient, since
|
||||
the tests are not available at CMake time. Additional test properties may be
|
||||
assigned to the set of tests as a whole using the ``PROPERTIES`` option. If
|
||||
more fine-grained test control is needed, custom content may be provided
|
||||
through an external CTest script using the :prop_dir:`TEST_INCLUDE_FILES`
|
||||
directory property. The set of discovered tests is made accessible to such a
|
||||
script via the ``<target>_TESTS`` variable.
|
||||
|
||||
The options are:
|
||||
|
||||
``target``
|
||||
Specifies the Catch executable, which must be a known CMake executable
|
||||
target. CMake will substitute the location of the built executable when
|
||||
running the test.
|
||||
|
||||
``TEST_SPEC arg1...``
|
||||
Specifies test cases, wildcarded test cases, tags and tag expressions to
|
||||
pass to the Catch executable with the ``--list-test-names-only`` argument.
|
||||
|
||||
``EXTRA_ARGS arg1...``
|
||||
Any extra arguments to pass on the command line to each test case.
|
||||
|
||||
``WORKING_DIRECTORY dir``
|
||||
Specifies the directory in which to run the discovered test cases. If this
|
||||
option is not provided, the current binary directory is used.
|
||||
|
||||
``TEST_PREFIX prefix``
|
||||
Specifies a ``prefix`` to be prepended to the name of each discovered test
|
||||
case. This can be useful when the same test executable is being used in
|
||||
multiple calls to ``catch_discover_tests()`` but with different
|
||||
``TEST_SPEC`` or ``EXTRA_ARGS``.
|
||||
|
||||
``TEST_SUFFIX suffix``
|
||||
Similar to ``TEST_PREFIX`` except the ``suffix`` is appended to the name of
|
||||
every discovered test case. Both ``TEST_PREFIX`` and ``TEST_SUFFIX`` may
|
||||
be specified.
|
||||
|
||||
``PROPERTIES name1 value1...``
|
||||
Specifies additional properties to be set on all tests discovered by this
|
||||
invocation of ``catch_discover_tests``.
|
||||
|
||||
``TEST_LIST var``
|
||||
Make the list of tests available in the variable ``var``, rather than the
|
||||
default ``<target>_TESTS``. This can be useful when the same test
|
||||
executable is being used in multiple calls to ``catch_discover_tests()``.
|
||||
Note that this variable is only available in CTest.
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
function(catch_discover_tests TARGET)
|
||||
cmake_parse_arguments(
|
||||
""
|
||||
""
|
||||
"TEST_PREFIX;TEST_SUFFIX;WORKING_DIRECTORY;TEST_LIST"
|
||||
"TEST_SPEC;EXTRA_ARGS;PROPERTIES"
|
||||
${ARGN}
|
||||
)
|
||||
|
||||
if(NOT _WORKING_DIRECTORY)
|
||||
set(_WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
|
||||
endif()
|
||||
if(NOT _TEST_LIST)
|
||||
set(_TEST_LIST ${TARGET}_TESTS)
|
||||
endif()
|
||||
|
||||
## Generate a unique name based on the extra arguments
|
||||
string(SHA1 args_hash "${_TEST_SPEC} ${_EXTRA_ARGS}")
|
||||
string(SUBSTRING ${args_hash} 0 7 args_hash)
|
||||
|
||||
# Define rule to generate test list for aforementioned test executable
|
||||
set(ctest_include_file "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_include-${args_hash}.cmake")
|
||||
set(ctest_tests_file "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_tests-${args_hash}.cmake")
|
||||
get_property(crosscompiling_emulator
|
||||
TARGET ${TARGET}
|
||||
PROPERTY CROSSCOMPILING_EMULATOR
|
||||
)
|
||||
add_custom_command(
|
||||
TARGET ${TARGET} POST_BUILD
|
||||
BYPRODUCTS "${ctest_tests_file}"
|
||||
COMMAND "${CMAKE_COMMAND}"
|
||||
-D "TEST_TARGET=${TARGET}"
|
||||
-D "TEST_EXECUTABLE=$<TARGET_FILE:${TARGET}>"
|
||||
-D "TEST_EXECUTOR=${crosscompiling_emulator}"
|
||||
-D "TEST_WORKING_DIR=${_WORKING_DIRECTORY}"
|
||||
-D "TEST_SPEC=${_TEST_SPEC}"
|
||||
-D "TEST_EXTRA_ARGS=${_EXTRA_ARGS}"
|
||||
-D "TEST_PROPERTIES=${_PROPERTIES}"
|
||||
-D "TEST_PREFIX='${_TEST_PREFIX}'"
|
||||
-D "TEST_SUFFIX='${_TEST_SUFFIX}'"
|
||||
-D "TEST_LIST=${_TEST_LIST}"
|
||||
-D "CTEST_FILE=${ctest_tests_file}"
|
||||
-P "${_CATCH_DISCOVER_TESTS_SCRIPT}"
|
||||
VERBATIM
|
||||
)
|
||||
|
||||
file(WRITE "${ctest_include_file}"
|
||||
"if(EXISTS \"${ctest_tests_file}\")\n"
|
||||
" include(\"${ctest_tests_file}\")\n"
|
||||
"else()\n"
|
||||
" add_test(${TARGET}_NOT_BUILT-${args_hash} ${TARGET}_NOT_BUILT-${args_hash})\n"
|
||||
"endif()\n"
|
||||
)
|
||||
|
||||
if(NOT ${CMAKE_VERSION} VERSION_LESS "3.10.0")
|
||||
# Add discovered tests to directory TEST_INCLUDE_FILES
|
||||
set_property(DIRECTORY
|
||||
APPEND PROPERTY TEST_INCLUDE_FILES "${ctest_include_file}"
|
||||
)
|
||||
else()
|
||||
# Add discovered tests as directory TEST_INCLUDE_FILE if possible
|
||||
get_property(test_include_file_set DIRECTORY PROPERTY TEST_INCLUDE_FILE SET)
|
||||
if (NOT ${test_include_file_set})
|
||||
set_property(DIRECTORY
|
||||
PROPERTY TEST_INCLUDE_FILE "${ctest_include_file}"
|
||||
)
|
||||
else()
|
||||
message(FATAL_ERROR
|
||||
"Cannot set more than one TEST_INCLUDE_FILE"
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
endfunction()
|
||||
|
||||
###############################################################################
|
||||
|
||||
set(_CATCH_DISCOVER_TESTS_SCRIPT
|
||||
${CMAKE_CURRENT_LIST_DIR}/CatchAddTests.cmake
|
||||
)
|
||||
|
|
@ -1,106 +0,0 @@
|
|||
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
||||
# file Copyright.txt or https://cmake.org/licensing for details.
|
||||
|
||||
set(prefix "${TEST_PREFIX}")
|
||||
set(suffix "${TEST_SUFFIX}")
|
||||
set(spec ${TEST_SPEC})
|
||||
set(extra_args ${TEST_EXTRA_ARGS})
|
||||
set(properties ${TEST_PROPERTIES})
|
||||
set(script)
|
||||
set(suite)
|
||||
set(tests)
|
||||
|
||||
function(add_command NAME)
|
||||
set(_args "")
|
||||
foreach(_arg ${ARGN})
|
||||
if(_arg MATCHES "[^-./:a-zA-Z0-9_]")
|
||||
set(_args "${_args} [==[${_arg}]==]") # form a bracket_argument
|
||||
else()
|
||||
set(_args "${_args} ${_arg}")
|
||||
endif()
|
||||
endforeach()
|
||||
set(script "${script}${NAME}(${_args})\n" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
macro(_add_catch_test_labels LINE)
|
||||
# convert to list of tags
|
||||
string(REPLACE "][" "]\\;[" tags ${line})
|
||||
|
||||
add_command(
|
||||
set_tests_properties "${prefix}${test}${suffix}"
|
||||
PROPERTIES
|
||||
LABELS "${tags}"
|
||||
)
|
||||
endmacro()
|
||||
|
||||
macro(_add_catch_test LINE)
|
||||
set(test ${line})
|
||||
# use escape commas to handle properly test cases with commans inside the name
|
||||
string(REPLACE "," "\\," test_name ${test})
|
||||
# ...and add to script
|
||||
add_command(
|
||||
add_test "${prefix}${test}${suffix}"
|
||||
${TEST_EXECUTOR}
|
||||
"${TEST_EXECUTABLE}"
|
||||
"${test_name}"
|
||||
${extra_args}
|
||||
)
|
||||
|
||||
add_command(
|
||||
set_tests_properties "${prefix}${test}${suffix}"
|
||||
PROPERTIES
|
||||
WORKING_DIRECTORY "${TEST_WORKING_DIR}"
|
||||
${properties}
|
||||
)
|
||||
list(APPEND tests "${prefix}${test}${suffix}")
|
||||
endmacro()
|
||||
|
||||
# Run test executable to get list of available tests
|
||||
if(NOT EXISTS "${TEST_EXECUTABLE}")
|
||||
message(FATAL_ERROR
|
||||
"Specified test executable '${TEST_EXECUTABLE}' does not exist"
|
||||
)
|
||||
endif()
|
||||
execute_process(
|
||||
COMMAND ${TEST_EXECUTOR} "${TEST_EXECUTABLE}" ${spec} --list-tests
|
||||
OUTPUT_VARIABLE output
|
||||
RESULT_VARIABLE result
|
||||
)
|
||||
# Catch --list-test-names-only reports the number of tests, so 0 is... surprising
|
||||
if(${result} EQUAL 0)
|
||||
message(WARNING
|
||||
"Test executable '${TEST_EXECUTABLE}' contains no tests!\n"
|
||||
)
|
||||
elseif(${result} LESS 0)
|
||||
message(FATAL_ERROR
|
||||
"Error running test executable '${TEST_EXECUTABLE}':\n"
|
||||
" Result: ${result}\n"
|
||||
" Output: ${output}\n"
|
||||
)
|
||||
endif()
|
||||
|
||||
string(REPLACE "\n" ";" output "${output}")
|
||||
set(test)
|
||||
set(tags_regex "(\\[([^\\[]*)\\])+$")
|
||||
|
||||
# Parse output
|
||||
foreach(line ${output})
|
||||
# lines without leading whitespaces are catch output not tests
|
||||
if(${line} MATCHES "^[ \t]+")
|
||||
# strip leading spaces and tabs
|
||||
string(REGEX REPLACE "^[ \t]+" "" line ${line})
|
||||
|
||||
if(${line} MATCHES "${tags_regex}")
|
||||
_add_catch_test_labels(${line})
|
||||
else()
|
||||
_add_catch_test(${line})
|
||||
endif()
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
# Create a list of all discovered tests, which users may use to e.g. set
|
||||
# properties on the tests
|
||||
add_command(set ${TEST_LIST} ${tests})
|
||||
|
||||
# Write CTest script
|
||||
file(WRITE "${CTEST_FILE}" "${script}")
|
||||
|
|
@ -133,7 +133,7 @@
|
|||
<string>${MACOSX_BUNDLE_COPYRIGHT}</string>
|
||||
<key>NSAppTransportSecurity</key>
|
||||
<dict>
|
||||
<!-- Disable App Transport Security. Resolves https://github.com/SoftFever/OrcaSlicer/issues/791 -->
|
||||
<!-- Disable App Transport Security. Resolves https://github.com/OrcaSlicer/OrcaSlicer/issues/791 -->
|
||||
<key>NSAllowsArbitraryLoads</key>
|
||||
<true/>
|
||||
<key>NSAllowsArbitraryLoadsInWebContent</key>
|
||||
|
|
|
|||
3
deps/MPFR/MPFR.cmake
vendored
|
|
@ -25,7 +25,8 @@ else ()
|
|||
endif ()
|
||||
|
||||
ExternalProject_Add(dep_MPFR
|
||||
URL https://www.mpfr.org/mpfr-4.2.2/mpfr-4.2.2.tar.bz2
|
||||
URL https://ftp.gnu.org/gnu/mpfr/mpfr-4.2.2.tar.bz2
|
||||
https://www.mpfr.org/mpfr-4.2.2/mpfr-4.2.2.tar.bz2
|
||||
URL_HASH SHA256=9ad62c7dc910303cd384ff8f1f4767a655124980bb6d8650fe62c815a231bb7b
|
||||
DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/MPFR
|
||||
BUILD_IN_SOURCE ON
|
||||
|
|
|
|||
161
doc/Home.md
|
|
@ -1,161 +0,0 @@
|
|||
# Welcome to the OrcaSlicer WIKI!
|
||||
|
||||
OrcaSlicer is a powerful open source slicer for FFF (FDM) 3D Printers. This wiki page aims to provide an detailed explanation of the slicer settings, how to get the most out of them as well as how to calibrate and setup your printer.
|
||||
|
||||
- [Printer Settings](#printer-settings)
|
||||
- [Material Settings](#material-settings)
|
||||
- [Process Settings](#process-settings)
|
||||
- [Quality Settings](#quality-settings)
|
||||
- [Strength Settings](#strength-settings)
|
||||
- [Speed Settings](#speed-settings)
|
||||
- [Support Settings](#support-settings)
|
||||
- [Multimaterial Settings](#multimaterial-settings)
|
||||
- [Others Settings](#others-settings)
|
||||
- [Prepare](#prepare)
|
||||
- [Calibrations](#calibrations)
|
||||
- [Developer Section](#developer-section)
|
||||
|
||||
> [!WARNING]
|
||||
> This wiki is community-maintained.
|
||||
> Some pages may be **outdated** while others may be **newer** and present only in [nightly build](https://github.com/SoftFever/OrcaSlicer/releases/tag/nightly-builds) or [latest release](https://github.com/SoftFever/OrcaSlicer/releases).
|
||||
|
||||
> [!NOTE]
|
||||
> Please consider contributing to the wiki following the [How to contribute to the wiki](How-to-wiki) guide.
|
||||
|
||||
## Printer Settings
|
||||
|
||||

|
||||
|
||||
 Settings related to the 3D printer hardware and its configuration.
|
||||
|
||||
- [Air filtration/Exhaust fan handling](air-filtration)
|
||||
- [Auxiliary fan handling](Auxiliary-fan)
|
||||
- [Chamber temperature control](chamber-temperature)
|
||||
- [Adaptive Bed Mesh](adaptive-bed-mesh)
|
||||
- [Using different bed types in Orca](bed-types)
|
||||
|
||||
## Material Settings
|
||||
|
||||

|
||||
|
||||
 Settings related to the 3D printing material.
|
||||
|
||||
- [Single Extruder Multimaterial](semm)
|
||||
- [Pellet Printers (pellet flow coefficient)](pellet-flow-coefficient)
|
||||
|
||||
## Process Settings
|
||||
|
||||

|
||||
|
||||
 Settings related to the 3D printing process.
|
||||
|
||||
### Quality Settings
|
||||
|
||||
 Settings related to print quality and aesthetics.
|
||||

|
||||
|
||||
-  [Layer Height Settings](quality_settings_layer_height)
|
||||
-  [Line Width Settings](quality_settings_line_width)
|
||||
-  [Seam Settings](quality_settings_seam)
|
||||
-  [Precision](quality_settings_precision)
|
||||
-  [Ironing](quality_settings_ironing)
|
||||
-  [Wall generator](quality_settings_wall_generator)
|
||||
-  [Walls and surfaces](quality_settings_wall_and_surfaces)
|
||||
-  [Bridging](quality_settings_bridging)
|
||||
-  [Overhangs](quality_settings_overhangs)
|
||||
|
||||
### Strength Settings
|
||||
|
||||
 Settings related to print strength and durability.
|
||||

|
||||
|
||||
-  [Walls](strength_settings_walls)
|
||||
-  [Top and Bottom Shells](strength_settings_top_bottom_shells)
|
||||
-  [Infill](strength_settings_infill)
|
||||
-  [Fill Patterns](strength_settings_patterns)
|
||||
-  [Template Metalanguage for infill rotation](strength_settings_infill_rotation_template_metalanguage)
|
||||
-  [Advanced](strength_settings_advanced)
|
||||
|
||||
### Speed Settings
|
||||
|
||||
 Settings related to print speed and movement.
|
||||

|
||||
|
||||
-  [Initial Layer Speed](speed_settings_initial_layer_speed)
|
||||
-  [Other Layers Speed](speed_settings_other_layers_speed)
|
||||
-  [Overhang Speed](speed_settings_overhang_speed)
|
||||
-  [Travel Speed](speed_settings_travel)
|
||||
-  [Acceleration](speed_settings_acceleration)
|
||||
-  [Jerk (XY)](speed_settings_jerk_xy)
|
||||
-  [Advanced / Extrusion rate smoothing](speed_settings_advanced)
|
||||
|
||||
### Support Settings
|
||||
|
||||
 Settings related to support structures and their properties.
|
||||

|
||||
|
||||
-  [Support](support_settings_support)
|
||||
-  [Raft](support_settings_raft)
|
||||
-  [Support Filament](support_settings_filament)
|
||||
-  [Support Ironing](support_settings_ironing)
|
||||
-  [Advanced](support_settings_advanced)
|
||||
-  [Tree Supports](support_settings_tree)
|
||||
|
||||
### Multimaterial Settings
|
||||
|
||||
 Settings related to multimaterial printing.
|
||||

|
||||
|
||||
-  [Prime Tower](multimaterial_settings_prime_tower)
|
||||
-  [Filament for Features](multimaterial_settings_filament_for_features)
|
||||
-  [Ooze Prevention](multimaterial_settings_ooze_prevention)
|
||||
-  [Flush Options](multimaterial_settings_flush_options)
|
||||
-  [Advanced](multimaterial_settings_advanced)
|
||||
|
||||
### Others Settings
|
||||
|
||||
 Settings related to various other print settings.
|
||||

|
||||
|
||||
-  [Skirt](others_settings_skirt)
|
||||
-  [Brim](others_settings_brim)
|
||||
-  [Special Mode](others_settings_special_mode)
|
||||
-  [Fuzzy Skin](others_settings_fuzzy_skin)
|
||||
-  [G-Code Output](others_settings_g_code_output)
|
||||
-  [Post Processing Scripts](others_settings_post_processing_scripts)
|
||||
-  [Notes](others_settings_notes)
|
||||
|
||||
## Prepare
|
||||
|
||||
 First steps to prepare your model/s for printing.
|
||||
|
||||
- [STL Transformation](stl-transformation)
|
||||
|
||||
## Calibrations
|
||||
|
||||
 The [Calibration Guide](Calibration) outlines Orca’s key calibration tests and their suggested order of execution.
|
||||
|
||||
- [Temperature](temp-calib)
|
||||
- [Flow Rate](flow-rate-calib)
|
||||
- [Pressure Advance](pressure-advance-calib)
|
||||
- [Adaptive Pressure Advance Guide](adaptive-pressure-advance-calib)
|
||||
- [Retraction](retraction-calib)
|
||||
- [Tolerance](tolerance-calib)
|
||||
- Advanced:
|
||||
- [Volumetric Speed](volumetric-speed-calib)
|
||||
- [Cornering (Jerk & Junction Deviation)](cornering-calib)
|
||||
- [Input Shaping](input-shaping-calib)
|
||||
- [VFA](vfa-calib)
|
||||
|
||||
## Developer Section
|
||||
|
||||
 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)
|
||||
- [Preset, PresetBundle and PresetCollection](Preset-and-bundle)
|
||||
- [Plater, Sidebar, Tab, ComboBox](plater-sidebar-tab-combobox)
|
||||
- [Slicing Call Hierarchy](slicing-hierarchy)
|
||||
|
|
@ -1,65 +0,0 @@
|
|||
# Calibration Guide
|
||||
|
||||
This guide offers a structured and comprehensive overview of the calibration process for OrcaSlicer.
|
||||
|
||||
It covers key aspects such as flow rate, pressure advance, temperature towers, retraction tests, and advanced calibration techniques. Each section includes step-by-step instructions and visuals to help you better understand and carry out each calibration effectively.
|
||||
|
||||
To access the calibration features, you can find them in the **Calibration** section of the OrcaSlicer interface.
|
||||
|
||||

|
||||
|
||||
> [!IMPORTANT]
|
||||
> After completing the calibration process, remember to create a new project in order to exit the calibration mode.
|
||||
|
||||
The recommended order for calibration is as follows:
|
||||
|
||||
1. **[Temperature](temp-calib):** Start by calibrating the temperature of the nozzle and the bed. This is crucial as it affects the viscosity of the filament, which in turn influences how well it flows through the nozzle and adheres to the print bed.
|
||||
|
||||
<img alt="temp-tower" src="https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/Temp-calib/temp-tower.jpg?raw=true" height="200">
|
||||
|
||||
2. **[Flow](flow-rate-calib):** Calibrate the flow rate to ensure that the correct amount of filament is being extruded. This is important for achieving accurate dimensions and good layer adhesion.
|
||||
|
||||
<img alt="flowcalibration-example" src="https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/Flow-Rate/flowcalibration-example.png?raw=true" height="200">
|
||||
|
||||
3. **[Pressure Advance](pressure-advance-calib):** Calibrate the pressure advance settings to improve print quality and reduce artifacts caused by pressure fluctuations in the nozzle.
|
||||
|
||||
- **[Adaptive Pressure Advance](adaptive-pressure-advance-calib):** This is an advanced calibration technique that can be used to further optimize the pressure advance settings for different print speeds and geometries.
|
||||
|
||||
<img alt="pa-tower" src="https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/pa/pa-tower.jpg?raw=true" height="200">
|
||||
|
||||
4. **[Retraction](retraction-calib):** Calibrate the retraction settings to minimize stringing and improve print quality. Doing this after Flow and Pressure Advance calibration is recommended, as it ensures that the printer is already set up for optimal extrusion.
|
||||
|
||||
<img alt="retraction_test_print" src="https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/retraction/retraction_test_print.jpg?raw=true" height="200">
|
||||
|
||||
5. **[Max Volumetric Speed](volumetric-speed-calib):** Calibrate the maximum volumetric speed of the filament. This is important for ensuring that the printer can handle the flow rate of the filament without causing issues such as under-extrusion or over-extrusion.
|
||||
|
||||
<img alt="mvf_measurement_point" src="https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/MVF/mvf_measurement_point.jpg?raw=true" height="200">
|
||||
|
||||
6. **[Cornering](cornering-calib):** Calibrate the Jerk/Junction Deviation settings to improve print quality and reduce artifacts caused by sharp corners and changes in direction.
|
||||
|
||||
<img alt="jd_second_print_measure" src="https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/JunctionDeviation/jd_second_print_measure.jpg?raw=true" height="200">
|
||||
|
||||
7. **[Input Shaping](input-shaping-calib):** This is an advanced calibration technique that can be used to reduce ringing and improve print quality by compensating for mechanical vibrations in the printer.
|
||||
|
||||
<img alt="IS_damp_marlin_print_measure" src="https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/InputShaping/IS_damp_marlin_print_measure.jpg?raw=true" height="200">
|
||||
|
||||
8. **[VFA](vfa-calib):** A VFA speed test is available to find resonance speeds.
|
||||
|
||||
<img alt="vfa_test_print" src="https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/vfa/vfa_test_print.jpg?raw=true" height="200">
|
||||
|
||||
---
|
||||
|
||||
**[Tolerance](tolerance-calib):** Calibrate the tolerances of your printer to ensure that it can accurately reproduce the dimensions of the model being printed. This is important for achieving a good fit between parts and for ensuring that the final print meets the desired specifications.
|
||||
|
||||
<img alt="OrcaToleranceTes_m6" src="https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/Tolerance/OrcaToleranceTes_m6.jpg?raw=true" height="200">
|
||||
|
||||
---
|
||||
|
||||
_Credits:_
|
||||
|
||||
- _The Flow test and retraction test is inspired by [SuperSlicer](https://github.com/supermerill/SuperSlicer)._
|
||||
- _The PA Line method is inspired by [K-factor Calibration Pattern](https://marlinfw.org/tools/lin_advance/k-factor.html)._
|
||||
- _The PA Tower method is inspired by [Klipper](https://www.klipper3d.org/Pressure_Advance.html)._
|
||||
- _The temp tower model is remixed from [Smart compact temperature calibration tower](https://www.thingiverse.com/thing:2729076)._
|
||||
- _The max flowrate test was inspired by Stefan (CNC Kitchen), and the model used in the test is a remix of his [Extrusion Test Structure](https://www.printables.com/model/342075-extrusion-test-structure)._
|
||||
- _ZV Input Shaping is inspired by [Marlin Input Shaping](https://marlinfw.org/docs/features/input_shaping.html) and [Ringing Tower 3D STL](https://marlinfw.org/assets/stl/ringing_tower.stl)._
|
||||
|
|
@ -1,221 +0,0 @@
|
|||
# Adaptive Pressure Advance
|
||||
|
||||
This feature aims to dynamically adjust the printer’s pressure advance to better match the conditions the toolhead is facing during a print. Specifically, to more closely align to the ideal values as flow rate, acceleration, and bridges are encountered.
|
||||
This wiki page aims to explain how this feature works, the prerequisites required to get the most out of it as well as how to calibrate it and set it up.
|
||||
|
||||
## Settings Overview
|
||||
|
||||
This feature introduces the below options under the filament settings:
|
||||
|
||||
1. **Enable adaptive pressure advance:** This is the on/off setting switch for adaptive pressure advance.
|
||||
2. **Enable adaptive pressure advance for overhangs:** Enable adaptive PA for overhangs as well as when flow changes within the same feature. This is an experimental option because if the PA profile is not set accurately, it will cause uniformity issues on the external surfaces before and after overhangs. It is recommended to start with this option switched off and enable it after the core adaptive pressure advance feature is calibrated correctly.
|
||||
3. **Pressure advance for bridges:** Sets the desired pressure advance value for bridges. Set it to 0 to disable this feature. Experiments have shown that a lower PA value when printing bridges helps reduce the appearance of slight under extrusion immediately after a bridge, which is caused by the pressure drop in the nozzle when printing in the air. Therefore, a lower pressure advance value helps counteract this. A good starting point is approximately half your usual PA value.
|
||||
4. **Adaptive pressure advance measurements:** This field contains the calibration values used to generate the pressure advance profile for the nozzle/printer. Input sets of pressure advance (PA) values and the corresponding volumetric flow speeds and accelerations they were measured at, separated by a comma. Add one set of values per line. More information on how to calibrate the model follows in the sections below.
|
||||
5. **Pressure advance:** The old field is still needed and is required to be populated with a PA value. A “good enough” median PA value should be entered here, as this will act as a fallback value when performing tool changes, printing a purge/wipe tower for multi-color prints as well as a fallback in case the model fails to identify an appropriate value (unlikely but it’s the ultimate backstop).
|
||||

|
||||
|
||||
## Pre-Requisites
|
||||
|
||||
This feature has been tested with Klipper-based printers. While it may work with Marlin or Bambu lab printers, it is currently untested with them. It shouldn't adversely affect the machine; however, the quality results from enabling it are not validated.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Versions of Klipper older than July 11th, 2024 might in some cases produce artifacts when dynamic PA is used.
|
||||
> This has been fixed in Klipper stable version 0.13.0 (20250411), or in developer versions starting [from July 11th, 2024](https://github.com/Klipper3d/klipper/commit/c84d78f3f169bc5163d11b74837f9880b0b7dba4).
|
||||
> If you experience issues or print quality lower than expected you might want to ensure you have a Klipper firmware which contains the fix.
|
||||
|
||||
> [!TIP]
|
||||
> **Advanced users**: the fix to ensure optimal quality when dynamic PA is used does not require flashing the toolhead MCU or the printer MCU, but only an update of the host Python code. If you are using a commercial printer which does not offer straightforward MCU flashing (for example, Qidi printers), you might be able to manually patch the host code yourself.
|
||||
|
||||
## Use case (what to expect)
|
||||
|
||||
Following experimentation, it has been noticed that the optimal pressure advance value is less:
|
||||
|
||||
1. The faster you print (hence the higher the volumetric flow rate requested from the toolhead).
|
||||
2. The larger the layer height (hence the higher the volumetric flow rate requested from the toolhead).
|
||||
3. The higher the print acceleration is.
|
||||
|
||||
What this means is that we never get ideal PA values for each print feature, especially when they vary drastically in speed and acceleration. We can tune PA for a faster print speed (flow) but compromise on corner sharpness for slower speeds or tune PA for corner sharpness and deal with slight corner-perimeter separation in faster speeds. The same goes for accelerations as well as different layer heights.
|
||||
|
||||
This compromise usually means that we settle for tuning an "in-between" PA value between slower external features and faster internal features so we don't get gaps, but also not get too much bulging in external perimeters.
|
||||
|
||||
**However, what this also means is that if you are printing with a single layer height, single speed, and acceleration, there is no need to enable this feature.**
|
||||
|
||||
Adaptive pressure advance aims to address this limitation by implementing a completely different method of setting pressure advance. **Following a set of PA calibration tests done at different flow rates (speeds and layer heights) and accelerations, a pressure advance model is calculated by the slicer.** Then that model is used to emit the best fit PA for any arbitrary feature flow rate (speed) and acceleration used in the print process.
|
||||
|
||||
In addition, it means that you only need to tune this feature once and print across different layer heights with good PA performance.
|
||||
|
||||
Finally, if during calibration you notice that there is little to no variance between the PA tests, this feature is redundant for you. **From experiments, high flow nozzles fitted on high-speed core XY printers appear to benefit the most from this feature as they print with a larger range of flow rates and at a larger range of accelerations.**
|
||||
|
||||
### Expected results
|
||||
|
||||
With this feature enabled there should be absolutely no bulge in the corners, just the smooth rounding caused by the square corner velocity of your printer.
|
||||

|
||||
|
||||
In addition, seams should appear smooth with no bulging or under extrusion.
|
||||

|
||||
|
||||
Solid infill should have no gaps, pinholes, or separation from the perimeters.
|
||||

|
||||
|
||||
Compared to with this feature disabled, where the internal solid infill and external-internal perimeters show signs of separation and under extrusion, when PA is tuned for optimal external perimeter performance as shown below.
|
||||

|
||||
|
||||
## How to calibrate the adaptive pressure advance model
|
||||
|
||||
### Defining the calibration sets
|
||||
|
||||
Firstly, it is important to understand your printer speed and acceleration limits in order to set meaningful boundaries for the calibrations:
|
||||
|
||||
1. **Upper acceleration range:** Do not attempt to calibrate adaptive PA for an acceleration that is larger than what the Klipper input shaper calibration tool recommends for your selected shaper. For example, if Klipper recommends an EI shaper with 4k maximum acceleration for your slowest axis (usually the Y axis), don’t calibrate adaptive PA beyond that value. This is because after 4k the input shaper smoothing is magnified and the perimeter separations that appear like PA issues are caused by the input shaper smoothing the shape of the corner. Basically, you’d be attempting to compensate for an input shaper artefact with PA.
|
||||
2. **Upper print speed range:** The Ellis PA pattern test has been proven to be the most efficient and effective test to run to calibrate adaptive PA. It is fast and allows for a reasonably accurate and easy-to-read PA value. However, the size of the line segments is quite small, which means that for the faster print speeds and slower accelerations, the toolhead will not be able to reach the full flow rate that we are calibrating against. It is therefore generally not recommended to attempt calibration with a print speed of higher than ~200-250mm/sec and accelerations slower than 1k in the PA pattern test. If your lowest acceleration is higher than 1k, then proportionally higher maximum print speeds can be used.
|
||||
|
||||
**Remember:** With the calibration process, we aim to create a PA – Flow Rate – Acceleration profile for the toolhead. As we cannot directly control flow rate, we use print speed as a proxy (higher speed -> higher flow).
|
||||
|
||||
With the above in mind, let’s create a worked example to identify the optimal number of PA tests to calibrate the adaptive PA model.
|
||||
|
||||
**The below starting points are recommended for the majority of Core XY printers:**
|
||||
|
||||
1. **Accelerations:** 1k, 2k, 4k
|
||||
2. **Print speeds:** 50mm/sec, 100mm/sec, 150mm/sec, 200mm/sec.
|
||||
|
||||
**That means we need to run 3x4 = 12 PA tests and identify the optimal PA for them.**
|
||||
|
||||
Finally, if the maximum acceleration given by input shaper is materially higher than 4k, run a set of tests with the higher accelerations. For example, if input shaper allows a 6k value, run PA tests as below:
|
||||
|
||||
1. **Accelerations:** 1k, 2k, 4k, 6k
|
||||
2. **Print speeds:** 50mm/sec, 100mm/sec, 150mm/sec, 200mm/sec.
|
||||
|
||||
Similarly, if the maximum value recommended is 12k, run PA tests as below:
|
||||
|
||||
1. **Accelerations:** 1k, 2k, 4k, 8k, 12k
|
||||
2. **Print speeds:** 50mm/sec, 100mm/sec, 150mm/sec, 200mm/sec.
|
||||
|
||||
So, at worst case you will need to run 5x4 = 20 PA tests if your printer acceleration is on the upper end! In essence, you want enough granularity of data points to create a meaningful model while also not overdoing it with the number of tests. So, doubling the speed and acceleration is a good compromise to arrive at the optimal number of tests.
|
||||
For this example, let’s assume that the baseline number of tests is adequate for your printer:
|
||||
|
||||
1. **Accelerations:** 1k, 2k, 4k
|
||||
2. **Print speeds:** 50mm/sec, 100mm/sec, 150mm/sec, 200mm/sec.
|
||||
|
||||
We, therefore, need to run 12 PA tests as below:
|
||||
|
||||
| Speed | Acceleration |
|
||||
|-------|--------------|
|
||||
| 50 | 1k |
|
||||
| 100 | 1k |
|
||||
| 150 | 1k |
|
||||
| 200 | 1k |
|
||||
| 50 | 2k |
|
||||
| 100 | 2k |
|
||||
| 150 | 2k |
|
||||
| 200 | 2k |
|
||||
| 50 | 4k |
|
||||
| 100 | 4k |
|
||||
| 150 | 4k |
|
||||
| 200 | 4k |
|
||||
|
||||
### Identifying the flow rates from the print speed
|
||||
|
||||
#### OrcaSlicer 2.2.0 and later
|
||||
|
||||
Test parameters needed to build adaptive PA table are printed on the test sample:
|
||||
|
||||

|
||||
|
||||
Test sample above was done with acceleration 12000 mm/s² and flow rate 27.13 mm³/s
|
||||
|
||||
#### OrcaSlicer 2.1.0 and older
|
||||
|
||||
As mentioned earlier, **the print speed is used as a proxy to vary the extrusion flow rate**. Once your PA test is set up, change the gcode preview to “flow” and move the horizontal slider over one of the herringbone patterns and take note of the flow rate for different speeds.
|
||||
|
||||

|
||||
|
||||
### Running the tests
|
||||
|
||||
#### General tips
|
||||
|
||||
It is recommended that the PA step is set to a small value, to allow you to make meaningful distinctions between the different tests – **therefore a PA step value of 0.001 is recommended**.
|
||||
|
||||
**Set the end PA to a value high enough to start showing perimeter separation for the lowest flow (print speed) and acceleration test.** For example, for a Voron 350 using Revo HF, the maximum value was set to 0.05 as that was sufficient to show perimeter separation even at the slowest flow rates and accelerations.
|
||||
|
||||
**If the test is too big to fit on the build plate, increase your starting PA value or the PA step value accordingly until the test can fit.** If the lowest value becomes too high and there is no ideal PA present in the test, focus on increasing the PA step value to reduce the number of herringbones printed (hence the size of the print).
|
||||
|
||||

|
||||
|
||||
#### OrcaSlicer 2.3.0 and newer
|
||||
|
||||
PA pattern calibration configuration window have been changed to simplify test setup. Now all is needed is to fill list of accelerations and speeds into relevant fields of the calibration window:
|
||||
|
||||

|
||||
|
||||
Test patterns generated for each acceleration-speed pair and all parameters are set accordingly. No additional actions needed from user side. Just slice and print all plates generated.
|
||||
|
||||
Refer to [Calibration Guide](Calibration) for more details on batch mode calibration.
|
||||
|
||||
#### OrcaSlicer 2.2.0 and older
|
||||
|
||||
Setup your PA test as usual from the calibration menu in OrcaSlicer. Once setup, your PA test should look like the below:
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
Now input your identified print speeds and accelerations in the fields above and run the PA tests.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Make sure your acceleration values are all the same in all text boxes. Same for the print speed values and Jerk (XY) values. Make sure your Jerk value is set to the external perimeter jerk used in your print profiles.
|
||||
|
||||
#### Test results processing
|
||||
|
||||
Now run the tests and note the optimal PA value, the flow, and the acceleration. You should produce a table like this:
|
||||
|
||||
| Speed | Flow | Acceleration | PA | Model values |
|
||||
|-------|-------|--------------|-------|----------------------|
|
||||
| 50 | 3.84 | 1000 | 0.036 | 0.036 , 3.84 , 1000 |
|
||||
| 100 | 7.68 | 1000 | 0.036 | 0.036 , 7.68 , 1000 |
|
||||
| 150 | 11.51 | 1000 | 0.036 | 0.036 , 11.51 , 1000 |
|
||||
| 200 | 15.35 | 1000 | 0.036 | 0.036 , 15.35 , 1000 |
|
||||
| | | | | |
|
||||
| 50 | 3.84 | 2000 | 0.036 | 0.036 , 3.84 , 2000 |
|
||||
| 100 | 7.68 | 2000 | 0.03 | 0.03 , 7.68 , 2000 |
|
||||
| 150 | 11.51 | 2000 | 0.029 | 0.029 , 11.51 , 2000 |
|
||||
| 200 | 15.35 | 2000 | 0.028 | 0.028 , 15.35 , 2000 |
|
||||
| | | | | |
|
||||
| 50 | 3.84 | 4000 | 0.032 | 0.032 , 3.84 , 4000 |
|
||||
| 100 | 7.68 | 4000 | 0.028 | 0.028 , 7.68 , 4000 |
|
||||
| 150 | 11.51 | 4000 | 0.026 | 0.026 , 11.51 , 4000 |
|
||||
| 200 | 15.35 | 4000 | 0.024 | 0.024 , 15.35 , 4000 |
|
||||
|
||||
Concatenate the PA value, the flow value, and the acceleration value into the final comma-separated sets to create the values entered in the model as shown above.
|
||||
|
||||
**You’re now done! The PA profile is created and calibrated!**
|
||||
|
||||
Remember to paste the values in the adaptive pressure advance measurements text box as shown below, and save your filament profile.
|
||||
|
||||

|
||||
|
||||
### Tips
|
||||
|
||||
#### Model input
|
||||
|
||||
The adaptive PA model built into the slicer is flexible enough to allow for as many or as few increments of flow and acceleration as you want. Ideally, you want at a minimum 3x data points for acceleration and flow in order to create a meaningful model.
|
||||
|
||||
However, if you don’t want to calibrate for flow, just run the acceleration tests and leave flow the same for each test (in which case you’ll input only 3 rows in the model text box). In this case, flow will be ignored when the model is used.
|
||||
|
||||
Similarly for acceleration – in the above example you’ll input only 4 rows in the model text box, in which case acceleration will be ignored when the model is used.
|
||||
|
||||
**However, make sure a triplet of values is always provided – PA value, Flow, Acceleration.**
|
||||
|
||||
#### Identifying the right PA
|
||||
|
||||
Higher acceleration and higher flow rate PA tests are easier to identify the optimal PA as the range of “good” values is much narrower. It’s evident where the PA is too large, as gaps start to appear in the corner and where PA is too low, as the corner starts bulging.
|
||||
|
||||
However, the lower the flow rate and accelerations are, the range of good values is much wider. Having examined the PA tests even under a microscope, what is evident, is that if you can’t distinguish a value as being evidently better than another (i.e. sharper corner with no gaps) with the naked eye, then both values are correct. In which case, if you can’t find any meaningful difference, simply use the optimal values from the higher flow rates.
|
||||
|
||||
- **Too high PA**
|
||||

|
||||
|
||||
- **Too low PA**
|
||||

|
||||
|
||||
- **Optimal PA**
|
||||

|
||||
|
|
@ -1,133 +0,0 @@
|
|||
# Cornering
|
||||
|
||||
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.
|
||||
|
||||
## Types of Cornering Settings
|
||||
|
||||
> [!TIP]
|
||||
> Read more in [Jerk XY](speed_settings_jerk_xy) and check [Cornering Control Types](speed_settings_jerk_xy#cornering-control-types)
|
||||
|
||||
## Calibration
|
||||
|
||||
This test will be set detect automatically your printer firmware type and will adapt to the specific calibration process.
|
||||
|
||||
- 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. 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 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. Open the Cornering test.
|
||||

|
||||
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. 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 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
|
||||
- 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.
|
||||
|
||||
- Klipper:
|
||||
- Skeleton
|
||||
|
||||
```gcode
|
||||
SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY=#SquareCornerVelocity
|
||||
```
|
||||
|
||||
Example:
|
||||
|
||||
```gcode
|
||||
SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY=5.0
|
||||
```
|
||||
|
||||
Note: You can also set `square_corner_velocity` persistently in your `printer.cfg` (restart required).
|
||||
|
||||
- Marlin 2 (Junction Deviation enabled):
|
||||
- Skeleton
|
||||
|
||||
```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)
|
||||
- **Cornering Calibration** [@IanAlexis](https://github.com/IanAlexis)
|
||||
- **Fast tower model** [@RF47](https://github.com/RF47)
|
||||
- **SCV-V2 model** [@chrisheib](https://www.thingiverse.com/chrisheib)
|
||||
|
|
@ -1,80 +0,0 @@
|
|||
|
||||
# Flow Rate Calibration
|
||||
|
||||
Flow ratio determines how much filament is extruded and is crucial for high-quality prints.
|
||||
A properly calibrated flow ratio ensures consistent layer adhesion and accurate dimensions.
|
||||
|
||||
- Too **low** flow ratio causes under-extrusion, which leads to gaps, weak layers, and poor structural integrity.
|
||||
- Too **high** flow ratio causes over-extrusion, resulting in excess material, rough surfaces, and dimensional inaccuracies.
|
||||
|
||||
- [Calibration Types](#calibration-types)
|
||||
- [OrcaSlicer \> 2.3.0 Archimedean chords + YOLO (Recommended)](#orcaslicer--230-archimedean-chords--yolo-recommended)
|
||||
- [OrcaSlicer \<= 2.3.0 Monotonic Line + 2-Pass Calibration](#orcaslicer--230-monotonic-line--2-pass-calibration)
|
||||
- [Credits](#credits)
|
||||
|
||||
> [!WARNING]
|
||||
> **BambuLab Printers:** Make sure you do **not** select the 'Flow calibration' option.
|
||||
> 
|
||||
|
||||
> [!NOTE]
|
||||
> After v2.3.0, the [Top Pattern](strength_settings_top_bottom_shells#surface-pattern) changed to [Archimedean chords](strength_settings_patterns#archimedean-chords) from [Monotonic Line](strength_settings_patterns#monotonic-line).
|
||||
|
||||
## Calibration Types
|
||||
|
||||
- **YOLO:** A simplified method that adjusts the flow rate in a single pass using the formula `OldFlowRatio ± modifier`.
|
||||
- **Recommended:** calibration range `[-0.05, +0.05]`, flow rate step `0.01`.
|
||||
- **Perfectionist:** calibration range `[-0.04, +0.035]`, flow rate step `0.005`.
|
||||
- **2-Pass Calibration:** the legacy method, using two passes to determine the optimal flow rate with the formula `OldFlowRatio * (100 + modifier) / 100`.
|
||||
|
||||
### OrcaSlicer > 2.3.0 Archimedean chords + YOLO (Recommended)
|
||||
|
||||
This method uses the [Archimedean Chords](strength_settings_patterns#archimedean-chords) pattern for flow rate calibration with the YOLO (Recommended) approach.
|
||||
|
||||
1. Select the printer and the filament you want to calibrate.
|
||||
This method is based on the filament's current flow ratio, so make sure you select the correct filament before proceeding.
|
||||
2. In the `Calibration` menu, under the `Flow Rate` section, select `YOLO (Recommended)`.
|
||||
3. A new project with eleven blocks will be created, each with a different flow rate modifier. Slice and print the project.
|
||||

|
||||
4. Examine the printed blocks and identify the one with the best surface quality. Look for:
|
||||
1. The smoothest top surface.
|
||||
2. No visible gaps between the pattern arcs.
|
||||
3. Minimal or no visible line between the Inner Spiral and the Outer Arcs.
|
||||

|
||||
In this example, the block with a flow modifier of `+0.01` produced the best results, despite a visible line between the Inner Spiral and the Outer Arcs; reducing the flow further begins to show gaps between the lines.
|
||||

|
||||
5. Update the flow ratio in the filament settings using the equation: `OldFlowRatio ± modifier`.
|
||||
If your previous flow ratio was `0.98` and you selected the block with a flow rate modifier of `+0.01`, the new value would be: `0.98 + 0.01 = 0.99`.
|
||||
**Remember** to save the filament profile.
|
||||

|
||||
|
||||
> [!NOTE]
|
||||
> The new Archimedean chords pattern uses a specific print order that prints the inner spiral last so you can check for material accumulation on the contact line at the end.
|
||||
|
||||
### OrcaSlicer <= 2.3.0 Monotonic Line + 2-Pass Calibration
|
||||
|
||||
This example uses the Monotonic Line pattern with the 2-Pass Calibration approach.
|
||||
|
||||

|
||||
|
||||
1. Select the printer, filament, and process you want to use for the test.
|
||||
2. In the `Calibration` menu, under the `Flow Rate` section, select `Pass 1`.
|
||||
3. A new project with nine blocks will be created, each with a different flow rate modifier. Slice and print the project.
|
||||
4. Examine the blocks and determine which one has the smoothest top surface.
|
||||

|
||||

|
||||
5. Update the flow ratio in the filament settings using the equation: `OldFlowRatio * (100 + modifier) / 100`.
|
||||
For example, if your previous flow ratio was `0.98` and you selected the block with a flow rate modifier of `+5`, the new value would be: `0.98 × (100 + 5) / 100 = 1.029`.
|
||||
**Remember** to save the filament profile.
|
||||
6. Perform the `Pass 2` calibration. This process is similar to `Pass 1`, but a new project with ten blocks will be generated. The flow rate modifiers for this project will range from `-9` to `0`.
|
||||
7. Repeat steps 4 and 5. For example, if your previous flow ratio was `1.029` and you selected the block with a flow rate modifier of `-6`, the new value would be: `1.029 × (100 - 6) / 100 = 0.96726`.
|
||||
**Remember** to save the filament profile.
|
||||

|
||||

|
||||

|
||||
|
||||
> [!TIP]
|
||||
> @ItsDeidara has created an HTML tool to help with these calculations. Check it out if you find the equations confusing: [Orca-Slicer-Assistant](https://github.com/ItsDeidara/Orca-Slicer-Assistant).
|
||||
|
||||
## Credits
|
||||
|
||||
- **[Archimedean Chords Idea](https://makerworld.com/es/models/189543-improved-flow-ratio-calibration-v3#profileId-209504)**: [Jimcorner](https://makerworld.com/es/@jimcorner)
|
||||
|
|
@ -1,131 +0,0 @@
|
|||
# Input Shaping
|
||||
|
||||
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.
|
||||
|
||||
> [!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)
|
||||
|
||||
## Types
|
||||
|
||||
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.
|
||||
|
||||
### Default
|
||||
|
||||
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:
|
||||
|
||||
- Klipper: MZV
|
||||
- Marlin: ZV
|
||||
- RepRap:
|
||||
- Version >= 3.4: MZV
|
||||
- Version < 3.4: DAA
|
||||
- Version < 3.2: DAA (without damping option)
|
||||
|
||||
### 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 | - | - |
|
||||
|
||||
## Calibration Steps
|
||||
|
||||
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]
|
||||
> 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.
|
||||

|
||||
- 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.
|
||||
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:
|
||||

|
||||
|
||||
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
|
||||
|
||||
TODO: This calibration test is currently under development. See the [Marlin documentation](https://marlinfw.org/docs/gcode/M493.html) for more information.
|
||||
|
||||
## Credits
|
||||
|
||||
- **Input Shaping Calibration:** [@IanAlexis](https://github.com/IanAlexis) and [@RF47](https://github.com/RF47)
|
||||
- **Klipper testing:** [@ShaneDelmore](https://github.com/ShaneDelmore)
|
||||
|
|
@ -1,89 +0,0 @@
|
|||
# Pressure Advance
|
||||
|
||||
Pressure Advance is a feature that compensates for the lag in filament pressure within the nozzle during acceleration and deceleration. It helps improve print quality by reducing issues like blobs, oozing, and inconsistent extrusion, especially at corners or during fast movements.
|
||||
|
||||
OrcaSlicer includes three approaches for calibrating the Pressure Advance value. Each method has its own advantages and disadvantages. It is important to note that each method has two versions: one for a direct-drive extruder and one for a Bowden extruder. Make sure to select the appropriate version for your test.
|
||||
|
||||
> [!WARNING]
|
||||
> **Marlin Printers:** Linear Advance must be enabled in firmware (M900).
|
||||
> **Not all printers have it enabled by default.**
|
||||
|
||||
> [!WARNING]
|
||||
> **Bambulab Printers:** make sure you do not select the 'Flow calibration' option.
|
||||
> 
|
||||
|
||||
- [Calibration](#calibration)
|
||||
- [Tower method](#tower-method)
|
||||
- [Pattern method](#pattern-method)
|
||||
- [Line method](#line-method)
|
||||
|
||||
## Calibration
|
||||
|
||||
You can use different methods to calibrate the Pressure Advance value, each with its own advantages and disadvantages.
|
||||
|
||||
The results from these methods should be saved to the material profile.
|
||||

|
||||
|
||||
> [!TIP]
|
||||
> Consider using the [Adaptive Pressure Advance](adaptive-pressure-advance-calib) method for more accurate results.
|
||||
> Especially for high-speed printers.
|
||||
|
||||
### Tower method
|
||||
|
||||
The tower method may take a bit more time to complete, but it does not rely on the quality of the first layer.
|
||||
|
||||
1. Select the printer, filament, and process you would like to use for the test.
|
||||
2. Examine each corner of the print and mark the height that yields the best overall result.
|
||||
3. In this example a height of 8 mm was selected, so the Pressure Advance value should be calculated as `PressureAdvanceStart + (PressureAdvanceStep x measured)`; example: `0 + (0.002 x 8) = 0.016`.
|
||||

|
||||

|
||||
|
||||
> [!TIP]
|
||||
> @ItsDeidara has made an HTML tool to help with the calculation. Check it out if those equations give you a headache [here](https://github.com/ItsDeidara/Orca-Slicer-Assistant).
|
||||
|
||||
### Pattern method
|
||||
|
||||
The pattern method is adapted from [Andrew Ellis' pattern method generator](https://ellis3dp.com/Pressure_Linear_Advance_Tool/), which was itself derived from the [Marlin pattern method](https://marlinfw.org/tools/lin_advance/k-factor.html) developed by [Sineos](https://github.com/Sineos/k-factorjs).
|
||||
|
||||
[Instructions for using and reading the pattern method](https://ellis3dp.com/Print-Tuning-Guide/articles/pressure_linear_advance/pattern_method.html) are provided in [Ellis' Print Tuning Guide](https://ellis3dp.com/Print-Tuning-Guide/), with only a few OrcaSlicer differences to note.
|
||||
|
||||
The test configuration window allows the user to generate one or more tests in a single project. Multiple tests will be placed on the plate with extra plates added if needed.
|
||||
|
||||
1. Single test \
|
||||

|
||||
2. Batch mode testing (multiple tests on a single plate) \
|
||||

|
||||
|
||||
Once a test is generated, one or more small rectangular prisms will be placed on the plate, one for each test case. The prism object serves a few purposes:
|
||||
|
||||
1. The test pattern itself is added in as custom G-Code at each layer, same as you could do by hand. The rectangular prism provides the layers in which to insert that G-Code. This also means that **you'll see the full test pattern when you move to the Preview pane:**
|
||||
|
||||

|
||||
|
||||
2. The prism acts as a handle, enabling you to move the test pattern wherever you'd like on the plate by moving the prism.
|
||||
3. Each test object is pre-configured with target parameters which are reflected in the object's name. Test parameters may be adjusted for each prism individually via the object list pane:
|
||||
|
||||

|
||||
|
||||
Next, Ellis' generator provided the ability to adjust specific printer, filament, and print profile settings. You can make these same changes in OrcaSlicer by adjusting the settings in the Prepare pane as you would with any other print. When you initiate the calibration test, Ellis' default settings are applied. A few things to note about these settings:
|
||||
|
||||
1. Ellis specified line widths as a percent of filament diameter. The Orca pattern method does the same to provide its suggested defaults, making use of Ellis' percentages in combination with your specified nozzle diameter.
|
||||
2. In terms of line width, the pattern only makes use of the `Default` and `First layer` widths.
|
||||
3. In terms of speed, the pattern only uses the `First layer speed -> First layer` and `Other layers speed -> Outer wall` speeds.
|
||||
4. The infill pattern beneath the numbers cannot be changed because it's not actually an infill pattern pulled from the settings. All of the pattern G-Code is custom written, so that "infill" is, effectively, hand-drawn and not processed through the usual channels that would enable Orca to recognize it as infill.
|
||||
|
||||
### Line method
|
||||
|
||||
The line method is quick and straightforward to test. However, its accuracy depends heavily on the quality of your first layer. It is suggested to turn on bed mesh leveling for this test.
|
||||
|
||||
Steps:
|
||||
|
||||
1. Select the printer, filament, and process you would like to use for the test.
|
||||
2. Print the project and check the result. Choose the value corresponding to the most even line and update your Pressure Advance value in the filament settings.
|
||||
3. In this test, a Pressure Advance value of `0.016` appears to be optimal.
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
|
@ -1,20 +0,0 @@
|
|||
# Retraction test
|
||||
|
||||
Retraction is the process of pulling the filament back into the nozzle to prevent oozing and stringing during non-print moves. If the retraction length is too short, it may not effectively prevent oozing, while if it's too long, it can lead to clogs or under-extrusion. Filaments like PETG and TPU are more prone to stringing, so they may require longer retraction lengths compared to PLA or ABS.
|
||||
|
||||
This test generates a retraction tower automatically. The retraction tower is a vertical structure with multiple notches, each printed at a different retraction length. After the print is complete, we can examine each section of the tower to determine the optimal retraction length for the filament. The optimal retraction length is the shortest one that produces the cleanest tower.
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
In the dialog, you can select the start and end retraction length, as well as the retraction length increment step. The default values are 0mm for the start retraction length, 2mm for the end retraction length, and 0.1mm for the step. These values are suitable for most direct drive extruders. However, for Bowden extruders, you may want to increase the start and end retraction lengths to 1mm and 6mm, respectively, and set the step to 0.2mm.
|
||||
|
||||

|
||||
|
||||
> [!NOTE]
|
||||
> When testing filaments such as PLA or ABS that have minimal oozing, the retraction settings can be highly effective. You may find that the retraction tower appears clean right from the start. In such situations, setting the retraction length to 0.2mm - 0.4mm using OrcaSlicer should suffice.
|
||||
> On the other hand, if there is still a lot of stringing at the top of the tower, it is recommended to dry your filament and ensure that your nozzle is properly installed without any leaks.
|
||||
|
||||
> [!TIP]
|
||||
> @ItsDeidara has made a html to help with the calculation. Check it out if those equations give you a headache [here](https://github.com/ItsDeidara/Orca-Slicer-Assistant).
|
||||
|
|
@ -1,69 +0,0 @@
|
|||
# Temp Calibration
|
||||
|
||||
In FDM 3D printing, the temperature is a critical factor that affects the quality of the print.
|
||||
There is no other calibration that can have such a big impact on the print quality as temperature calibration.
|
||||
|
||||
- [Standard Temperature Ranges](#standard-temperature-ranges)
|
||||
- [Nozzle Temp tower](#nozzle-temp-tower)
|
||||
- [Bed Temperature](#bed-temperature)
|
||||
- [Chamber Temperature](#chamber-temperature)
|
||||
|
||||
## Standard Temperature Ranges
|
||||
|
||||
| Material | [Nozzle Temp (°C)](#nozzle-temp-tower) | [Bed Temp (°C)](#bed-temperature) | [Chamber Temp (°C)](#chamber-temperature) |
|
||||
|:------------:|:--------------------------------------:|:---------------------------------:|:-----------------------------------------:|
|
||||
| PLA | 180-220 | 50-60 | Ambient |
|
||||
| ABS | 230-250 | 90-100 | 50-70 |
|
||||
| ASA | 240-260 | 90-100 | 50-70 |
|
||||
| Nylon 6 | 230-260 | 90-110 | 70-100 |
|
||||
| Nylon 12 | 225-260 | 90-110 | 70-100 |
|
||||
| TPU | 220-245 | 40-60 | Ambient |
|
||||
| PC | 270-310 | 100-120 | 80-100 |
|
||||
| PC-ABS | 260-280 | 95-110 | 60-80 |
|
||||
| HIPS | 220-250 | 90-110 | 50-70 |
|
||||
| PP | 220-270 | 80-105 | 40-70 |
|
||||
| Acetal (POM) | 210-240 | 100-130 | 70-100 |
|
||||
|
||||
## Nozzle Temp tower
|
||||
|
||||
Nozzle temperature is one of the most important settings to calibrate for a successful print. The temperature of the nozzle affects the viscosity of the filament, which in turn affects how well it flows through the nozzle and adheres to the print bed. If the temperature is too low, the filament may not flow properly, leading to under-extrusion, poor layer adhesion and stringing. If the temperature is too high, the filament may degrade, over-extrude and produce stringing.
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
Temp tower is a straightforward test. The temp tower is a vertical tower with multiple blocks, each printed at a different temperature.
|
||||
Once the print is complete, we can examine each block of the tower and determine the optimal temperature for the filament. The optimal temperature is the one that produces the highest quality print with the least amount of issues, such as stringing, layer adhesion, warping (overhang), and bridging.
|
||||
|
||||

|
||||
|
||||
> [!NOTE]
|
||||
> If a range of temperatures looks good, you may want to use the middle of that range as the optimal temperature.
|
||||
> But if you are planning to print at higher [speeds](speed_settings_other_layers_speed)/[flow rates](volumetric-speed-calib), you may want to use the higher end of that range as the optimal temperature.
|
||||
|
||||
## Bed Temperature
|
||||
|
||||
Bed temperature plays a crucial role in ensuring proper filament adhesion to the build surface, which directly impacts both print success and quality.
|
||||
Most materials have a relatively broad optimal range for bed temperature (typically +/-5°C).
|
||||
In general, following the manufacturer’s recommendations, maintaining a clean bed (free from oils or fingerprints), ensuring a stable [chamber temperature](#chamber-temperature), and having a properly leveled bed will produce reliable results.
|
||||
|
||||
- If the bed temperature is too low, the filament may fail to adhere properly, leading to warping, weak layer bonding, or complete detachment. In severe cases, the printed part may dislodge entirely and stick to the nozzle or other printer components, potentially causing mechanical damage.
|
||||
- If the bed temperature is too high, the lower layers can overheat and soften excessively, resulting in deformation such as [elephant foot](quality_settings_precision#elephant-foot-compensation).
|
||||
|
||||
> [!TIP]
|
||||
> As a general guideline, you can use the [glass transition temperature](https://en.wikipedia.org/wiki/Glass_transition) (Tg) of the material and subtract 5–10 °C to estimate a safe upper limit for bed temperature.
|
||||
> See [this article](https://magigoo.com/blog/prevent-warping-temperature-and-first-layer-adhesion-magigoo/) for a detailed explanation.
|
||||
|
||||
> [!NOTE]
|
||||
> For challenging prints involving materials with **high shrinkage** (e.g., nylons or polycarbonate) or geometries prone to warping, dialed-in settings are critical.
|
||||
> In these cases, [chamber temperature](#chamber-temperature) becomes a **major factor** in preventing detachment and ensuring print success.
|
||||
|
||||
## Chamber Temperature
|
||||
|
||||
Chamber temperature can affect the print quality, especially for high-temperature filaments.
|
||||
A heated chamber can help to maintain a consistent temperature throughout the print, reducing the risk of warping and improving layer adhesion. However, it is important to monitor the chamber temperature to ensure that it does not exceed the filament's deformation temperature.
|
||||
|
||||
See: [Chamber temperature printer settings](Chamber-temperature)
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Low temperature Filaments like PLA can clog the nozzle if the chamber temperature is too high.
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
# Filament Tolerance Calibration
|
||||
|
||||
Each filament and printer combination can result in different tolerances. This means that even using the same filament and print profile, tolerances may vary from one printer to another.
|
||||
To correct for these variations, OrcaSlicer provides:
|
||||
|
||||
- Filament Compensation:
|
||||
|
||||
- Shrinkage (XY)
|
||||
|
||||

|
||||
|
||||
- Process Compensation:
|
||||
|
||||
- X-Y hole compensation
|
||||
- X-Y contour compensation
|
||||
- Precise wall
|
||||
- Precise Z height
|
||||
|
||||

|
||||
|
||||
## Handy Models
|
||||
|
||||
OrcaSlicer includes several handy models to help you test and calibrate your printer.
|
||||
Right-click on your plate in Prepare mode and select "Add Handy Model" to access these models.
|
||||

|
||||
|
||||
### Orca Tolerance Test
|
||||
|
||||
This calibration test is designed to evaluate the dimensional accuracy of your printer and filament. The model consists of a base with six hexagonal holes, each with a different tolerance: 0.0 mm, 0.05 mm, 0.1 mm, 0.2 mm, 0.3 mm, and 0.4 mm, as well as a hexagon-shaped tester.
|
||||
|
||||

|
||||
|
||||
You can check the tolerance using either an M6 Allen key or the included printed hexagon tester.
|
||||
Use calipers to measure both the holes and the inner tester. Based on your results, you can fine-tune the X-Y hole compensation and X-Y contour compensation settings. Repeat the process until you achieve the desired precision.
|
||||
|
||||

|
||||

|
||||
|
|
@ -1,22 +0,0 @@
|
|||
# VFA
|
||||
|
||||
Vertical Fine Artifacts (VFA) are small surface imperfections that appear on vertical walls, especially near sharp corners or sudden directional changes. These artifacts are typically caused by mechanical vibrations, motor resonance, or rapid directional shifts that impact print quality.
|
||||
|
||||
- **Mechanical adjustments**, such as tuning or replacing motors, belts, or pulleys.
|
||||
- **MMR (Motor Resonance Rippling)** is a common subtype of VFA caused by stepper motors vibrating at resonant frequencies, leading to periodic ripples on the surface.
|
||||
- **[Jerk/Junction Deviation](cornering-calib)** settings can also contribute to VFA, as they control how the printer handles rapid changes in direction.
|
||||
- **[Input Shaping](input-shaping-calib)** can help mitigate VFA by reducing vibrations during printing.
|
||||
|
||||
## VFA Test
|
||||
|
||||
The VFA Speed Test in OrcaSlicer helps identify which print speeds trigger MRR artifacts. It prints a vertical tower with walls at various angles while progressively increasing the print speed.
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
After printing, inspect the tower for MRR artifacts. Look for speeds where the surface becomes visibly smoother or rougher. This allows you to pinpoint problematic speed ranges.
|
||||
|
||||
You can then configure the **Resonance Avoidance Speed Range** in the printer profile to skip speeds that cause visible artifacts.
|
||||
|
||||

|
||||
|
|
@ -1,49 +0,0 @@
|
|||
# Max Volumetric Speed (FlowRate) Calibration
|
||||
|
||||
Each material profile includes a **maximum volumetric speed** setting, which limits your [print speed](speed_settings_other_layers_speed) to prevent issues like nozzle clogs, under-extrusion, or poor layer adhesion.
|
||||
|
||||
This value varies depending on your **material**, **machine**, **nozzle diameter**, and even your **extruder setup**, so it’s important to calibrate it for your specific printer and each filament you use.
|
||||
|
||||
> [!NOTE]
|
||||
> Even for the same material type (e.g., PLA), the **brand** and **color** can significantly affect the maximum flow rate.
|
||||
|
||||
> [!TIP]
|
||||
> If you're planning to increase speed or flow, it’s a good idea to **increase your nozzle temperature**, preferably toward the higher end of the recommended range for your filament. Use a [temperature tower calibration](temp-calib#nozzle-temp-tower) to find that range.
|
||||
|
||||
## Calibration Overview
|
||||
|
||||
You will be prompted to enter the settings for the test: start volumetric speed, end volumetric speed, and step. It is recommended to use the default values (5mm³/s start, 20mm³/s end, with a step of 0.5), unless you already have an idea of the lower or upper limit for your filament. Select "OK", slice the plate, and send it to the printer.
|
||||
|
||||
Once printed, take note of where the layers begin to fail and where the quality begins to suffer.
|
||||
|
||||
> [!TIP]
|
||||
> A **change in surface sheen** (glossy vs. matte) is often a visual cue of material degradation or poor layer adhesion.
|
||||
|
||||

|
||||
|
||||
Use calipers or a ruler to measure the **height** of the model just before the defects begin.
|
||||

|
||||
|
||||
Then you can:
|
||||
|
||||
- Use the following formula
|
||||
|
||||
```math
|
||||
Filament Max Volumetric Speed = start + (HeightMeasured * step)
|
||||
```
|
||||
|
||||
In this case (19mm), so the calculation would be: `5 + (19 * 0.5) = 14.5mm³/s`
|
||||
|
||||
- Use OrcaSlicer in the "Preview" tab, make sure the color scheme "flow" is selected. Scroll down to the layer height that you measured, and click on the toolhead slider. This will indicate the max flow level for your filament.
|
||||

|
||||
|
||||
After you have determined the maximum volumetric speed, you can set it in the filament settings. This will ensure that the printer does not exceed the maximum flow rate for the filament.
|
||||

|
||||
|
||||
> [!NOTE]
|
||||
> This test is a best case scenario and doesn't take into account Retraction or other settings that can increase clogs or under-extrusion.
|
||||
> You may want to reduce the flow by 10%-20% (or even further) to ensure print quality/strength.
|
||||
> **Printing at high volumetric speed can lead to poor layer adhesion or even clogs in the nozzle.**
|
||||
|
||||
> [!TIP]
|
||||
> @ItsDeidara has made a html to help with the calculation. Check it out if those equations give you a headache [here](https://github.com/ItsDeidara/Orca-Slicer-Assistant).
|
||||
|
|
@ -1,96 +0,0 @@
|
|||
# Placeholders Variables
|
||||
|
||||
This section describes the general built-in placeholders variables available for use in G-code scripts and configurations.
|
||||
|
||||
- [Global Slicing State](#global-slicing-state)
|
||||
- [Read Only](#read-only)
|
||||
- [Read Write](#read-write)
|
||||
- [Slicing State](#slicing-state)
|
||||
- [Print Statistics](#print-statistics)
|
||||
- [Objects Info](#objects-info)
|
||||
- [Dimensions](#dimensions)
|
||||
- [Temperatures](#temperatures)
|
||||
- [Timestamps](#timestamps)
|
||||
- [Presets](#presets)
|
||||
|
||||
## Global Slicing State
|
||||
|
||||
### Read Only
|
||||
|
||||
- **zhop**: Contains Z-hop present at the beginning of the custom G-code block.
|
||||
|
||||
### Read Write
|
||||
|
||||
- **e_position[]**: Current position of the extruder axis. Only used with absolute extruder addressing.
|
||||
- **e_restart_extra[]**: Currently planned extra extruder priming after de-retraction.
|
||||
- **e_retracted[]**: Retraction state at the beginning of the custom G-code block. If the custom G-code moves the extruder axis, it should write to this variable so OrcaSlicer knows where it travels from when it gets control back.
|
||||
- **position[]**: Current position of the extruder axis. Only used with absolute extruder addressing.
|
||||
|
||||
## Slicing State
|
||||
|
||||
- **current_extruder**: Zero-based index of currently used extruder.
|
||||
- **current_object_idx**: Zero-based index of currently printed object.
|
||||
- **has_wipe_tower**: Whether or not wipe tower is being generated in the print.
|
||||
- **initial_extruder**: Zero-based index of the first extruder used in the print. Same as initial_tool.
|
||||
- **initial_tool**: Zero-based index of the first extruder used in the print. Same as initial_extruder.
|
||||
- **is_extruder_used**: Vector of booleans stating whether a given extruder is used in the print.
|
||||
- **has_single_extruder_multi_material_priming**: Whether or not single extruder multi-material priming is used in the print.
|
||||
- **initial_no_support_extruder**: Zero-based index of the first extruder used for printing without support. Same as initial_no_support_tool.
|
||||
- **in_head_wrap_detect_zone**: Indicates if the first layer overlaps with the head wrap zone.
|
||||
|
||||
## Print Statistics
|
||||
|
||||
- **extruded_volume**: Total filament volume extruded per extruder during the entire print.
|
||||
- **extruded_volume_total**: Total volume of filament used during the entire print.
|
||||
- **extruded_weight**: Total filament weight extruded per extruder during the entire print.
|
||||
- **extruded_weight_total**: Total weight of filament used during the entire print.
|
||||
- **total_print_time**: Total time taken for the print.
|
||||
- **total_layer_count**: Total number of layers in the print.
|
||||
|
||||
## Objects Info
|
||||
|
||||
- **num_objects**: Total number of objects in the print.
|
||||
- **num_instances**: Total number of object instances in the print, summed over all objects.
|
||||
- **scale[]**: Contains a string with the information about what scaling was applied to the individual objects. Indexing of the objects is zero-based (first object has index 0).
|
||||
- **input_filename_base**: Source filename of the first object, without extension.
|
||||
- **input_filename**: Full input filename of the first object.
|
||||
- **plate_name**: Name of the plate sliced.
|
||||
|
||||
## Dimensions
|
||||
|
||||
- **first_layer_print_convex_hull**: Vector of points of the first layer convex hull. Each element has the following format: '[x, y]' (x and y are floating-point numbers in mm).
|
||||
- **first_layer_print_min**: Bottom-left corner of first layer bounding box.
|
||||
- **first_layer_print_max**: Top-right corner of first layer bounding box.
|
||||
- **first_layer_print_size**: Size of the first layer bounding box.
|
||||
- **print_bed_min**: Bottom-left corner of print bed bounding box.
|
||||
- **print_bed_max**: Top-right corner of print bed bounding box.
|
||||
- **print_bed_size**: Size of the print bed bounding box.
|
||||
- **first_layer_center_no_wipe_tower**: First layer center without wipe tower.
|
||||
- **first_layer_height**: Height of the first layer.
|
||||
|
||||
## Temperatures
|
||||
|
||||
- **bed_temperature**: Vector of bed temperatures for each extruder/filament.
|
||||
- **bed_temperature_initial_layer**: Vector of initial layer bed temperatures for each extruder/filament. Provides the same value as first_layer_bed_temperature.
|
||||
- **bed_temperature_initial_layer_single**: Initial layer bed temperature for the initial extruder. Same as bed_temperature_initial_layer[initial_extruder].
|
||||
- **chamber_temperature**: Vector of chamber temperatures for each extruder/filament.
|
||||
- **overall_chamber_temperature**: Overall chamber temperature. This value is the maximum chamber temperature of any extruder/filament used.
|
||||
- **first_layer_bed_temperature**: Vector of first layer bed temperatures for each extruder/filament. Provides the same value as bed_temperature_initial_layer.
|
||||
- **first_layer_temperature**: Vector of first layer temperatures for each extruder/filament.
|
||||
|
||||
## Timestamps
|
||||
|
||||
- **timestamp**: String containing current time in yyyyMMdd-hhmmss format.
|
||||
- **year**: Current year.
|
||||
- **month**: Current month.
|
||||
- **day**: Current day.
|
||||
- **hour**: Current hour.
|
||||
- **minute**: Current minute.
|
||||
- **second**: Current second.
|
||||
|
||||
## Presets
|
||||
|
||||
Each preset's ([Print process settings](home#process-settings), [Filament/Material settings](home#material-settings), [Printer settings](home#printer-settings)) variables can be used in your G-code scripts and configurations.
|
||||
|
||||
> [!TIP]
|
||||
> To know the variable name you can hover your mouse over the variable in the UI.
|
||||
|
|
@ -1,361 +0,0 @@
|
|||
# How to Build
|
||||
|
||||
This wiki page provides detailed instructions for building OrcaSlicer from source on different operating systems, including Windows, macOS, and Linux.
|
||||
It includes tool requirements, setup commands, and build steps for each platform.
|
||||
|
||||
Whether you're a contributor or just want a custom build, this guide will help you compile OrcaSlicer successfully.
|
||||
|
||||
- [Windows 64-bit](#windows-64-bit)
|
||||
- [Windows Tools Required](#windows-tools-required)
|
||||
- [Windows Instructions](#windows-instructions)
|
||||
- [MacOS 64-bit](#macos-64-bit)
|
||||
- [MacOS Tools Required](#macos-tools-required)
|
||||
- [MacOS Instructions](#macos-instructions)
|
||||
- [Debugging in Xcode](#debugging-in-xcode)
|
||||
- [Linux](#linux)
|
||||
- [Using Docker](#using-docker)
|
||||
- [Docker Dependencies](#docker-dependencies)
|
||||
- [Docker Instructions](#docker-instructions)
|
||||
- [Troubleshooting](#troubleshooting)
|
||||
- [Linux Build](#linux-build)
|
||||
- [Dependencies](#dependencies)
|
||||
- [Common dependencies across distributions](#common-dependencies-across-distributions)
|
||||
- [Additional dependencies for specific distributions](#additional-dependencies-for-specific-distributions)
|
||||
- [Linux Instructions](#linux-instructions)
|
||||
- [Unit Testing](#unit-testing)
|
||||
- [Portable User Configuration](#portable-user-configuration)
|
||||
- [Example folder structure](#example-folder-structure)
|
||||
|
||||
## Windows 64-bit
|
||||
|
||||
How to building with Visual Studio on Windows 64-bit.
|
||||
|
||||
### Windows Tools Required
|
||||
|
||||
- [Visual Studio 2022](https://visualstudio.microsoft.com/vs/) or Visual Studio 2019
|
||||
```shell
|
||||
winget install --id=Microsoft.VisualStudio.2022.Professional -e
|
||||
```
|
||||
- [CMake](https://cmake.org/)
|
||||
```shell
|
||||
winget install --id=Kitware.CMake -e
|
||||
```
|
||||
- [Strawberry Perl](https://strawberryperl.com/)
|
||||
```shell
|
||||
winget install --id=StrawberryPerl.StrawberryPerl -e
|
||||
```
|
||||
- [Git](https://git-scm.com/)
|
||||
```shell
|
||||
winget install --id=Git.Git -e
|
||||
```
|
||||
- [git-lfs](https://git-lfs.com/)
|
||||
```shell
|
||||
winget install --id=GitHub.GitLFS -e
|
||||
```
|
||||
|
||||
> [!TIP]
|
||||
> GitHub Desktop (optional): A GUI for Git and Git LFS, which already includes both tools.
|
||||
> ```shell
|
||||
> winget install --id=GitHub.GitHubDesktop -e
|
||||
> ```
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Check your CMake version. Run `cmake --version` in your terminal and verify it returns a **4.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.
|
||||
|
||||

|
||||

|
||||
|
||||
### Windows Instructions
|
||||
|
||||
1. Clone the repository:
|
||||
- If using GitHub Desktop clone the repository from the GUI.
|
||||
- If using the command line:
|
||||
1. Clone the repository:
|
||||
```shell
|
||||
git clone https://github.com/SoftFever/OrcaSlicer
|
||||
```
|
||||
2. Run lfs to download tools on Windows:
|
||||
```shell
|
||||
git lfs pull
|
||||
```
|
||||
2. Open the appropriate command prompt:
|
||||
- Visual Studio 2022:
|
||||
```MD
|
||||
x64 Native Tools Command Prompt for VS 2022
|
||||
```
|
||||
- Visual Studio 2019:
|
||||
```MD
|
||||
x64 Native Tools Command Prompt for VS 2019
|
||||
```
|
||||
1. Navigate to correct drive (if needed), e.g.:
|
||||
```shell
|
||||
N:
|
||||
```
|
||||
2. Change directory to the cloned repository, e.g.:
|
||||
```shell
|
||||
cd N:\Repos\OrcaSlicer
|
||||
```
|
||||
3. Run the build script:
|
||||
- Visual Studio 2022:
|
||||
```shell
|
||||
build_release_vs2022.bat
|
||||
```
|
||||
- Visual Studio 2019:
|
||||
```shell
|
||||
build_release.bat
|
||||
```
|
||||
|
||||

|
||||
|
||||
> [!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 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.
|
||||
|
||||
> [!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
|
||||
|
||||
How to building with Xcode on MacOS 64-bit.
|
||||
|
||||
### MacOS Tools Required
|
||||
|
||||
- Xcode
|
||||
- CMake (version 3.31.x is mandatory)
|
||||
- Git
|
||||
- gettext
|
||||
- libtool
|
||||
- automake
|
||||
- autoconf
|
||||
- texinfo
|
||||
|
||||
> [!TIP]
|
||||
> You can install most of them by running:
|
||||
> ```shell
|
||||
> brew install gettext libtool automake autoconf texinfo
|
||||
> ```
|
||||
|
||||
Homebrew currently only offers the latest version of CMake (e.g. **4.X**), which is not compatible. To install the required version **3.31.X**, follow these steps:
|
||||
|
||||
1. Download CMake **3.31.7** from: [https://cmake.org/download/](https://cmake.org/download/)
|
||||
2. Install the application (drag it to `/Applications`).
|
||||
3. Add the following line to your shell configuration file (`~/.zshrc` or `~/.bash_profile`):
|
||||
|
||||
```sh
|
||||
export PATH="/Applications/CMake.app/Contents/bin:$PATH"
|
||||
```
|
||||
|
||||
4. Restart the terminal and check the version:
|
||||
|
||||
```sh
|
||||
cmake --version
|
||||
```
|
||||
|
||||
5. Make sure it reports a **3.31.x** version.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> If you've recently upgraded Xcode, be sure to open Xcode at least once and install the required macOS build support.
|
||||
|
||||
### MacOS Instructions
|
||||
|
||||
1. Clone the repository:
|
||||
```shell
|
||||
git clone https://github.com/SoftFever/OrcaSlicer
|
||||
cd OrcaSlicer
|
||||
```
|
||||
2. Build the application:
|
||||
```shell
|
||||
./build_release_macos.sh
|
||||
```
|
||||
3. Open the application:
|
||||
```shell
|
||||
open build/arm64/OrcaSlicer/OrcaSlicer.app
|
||||
```
|
||||
|
||||
### Debugging in Xcode
|
||||
|
||||
To build and debug directly in Xcode:
|
||||
|
||||
1. Open the Xcode project:
|
||||
```shell
|
||||
open build/arm64/OrcaSlicer.xcodeproj
|
||||
```
|
||||
2. In the menu bar:
|
||||
- **Product > Scheme > OrcaSlicer**
|
||||
- **Product > Scheme > Edit Scheme...**
|
||||
- Under **Run > Info**, set **Build Configuration** to `RelWithDebInfo`
|
||||
- Under **Run > Options**, uncheck **Allow debugging when browsing versions**
|
||||
- **Product > Run**
|
||||
|
||||
## Linux
|
||||
|
||||
Linux distributions are available in two formats: [using Docker](#using-docker) (recommended) or [building directly](#linux-build) on your system.
|
||||
|
||||
### Using Docker
|
||||
|
||||
How to build and run OrcaSlicer using Docker.
|
||||
|
||||
#### Docker Dependencies
|
||||
|
||||
- Docker
|
||||
- Git
|
||||
|
||||
#### Docker Instructions
|
||||
|
||||
```shell
|
||||
git clone https://github.com/SoftFever/OrcaSlicer && cd OrcaSlicer && ./scripts/DockerBuild.sh && ./scripts/DockerRun.sh
|
||||
```
|
||||
|
||||
### Troubleshooting
|
||||
|
||||
The `scripts/DockerRun.sh` script includes several commented-out options that can help resolve common issues. Here's a breakdown of what they do:
|
||||
|
||||
- `xhost +local:docker`: If you encounter an "Authorization required, but no authorization protocol specified" error, run this command in your terminal before executing `scripts/DockerRun.sh`. This grants Docker containers permission to interact with your X display server.
|
||||
- `-h $HOSTNAME`: Forces the container's hostname to match your workstation's hostname. This can be useful in certain network configurations.
|
||||
- `-v /tmp/.X11-unix:/tmp/.X11-unix`: Helps resolve problems with the X display by mounting the X11 Unix socket into the container.
|
||||
- `--net=host`: Uses the host's network stack, which is beneficial for printer Wi-Fi connectivity and D-Bus communication.
|
||||
- `--ipc host`: Addresses potential permission issues with X installations that prevent communication with shared memory sockets.
|
||||
- `-u $USER`: Runs the container as your workstation's username, helping to maintain consistent file permissions.
|
||||
- `-v $HOME:/home/$USER`: Mounts your home directory into the container, allowing you to easily load and save files.
|
||||
- `-e DISPLAY=$DISPLAY`: Passes your X display number to the container, enabling the graphical interface.
|
||||
- `--privileged=true`: Grants the container elevated privileges, which may be necessary for libGL and D-Bus functionalities.
|
||||
- `-ti`: Attaches a TTY to the container, enabling command-line interaction with OrcaSlicer.
|
||||
- `--rm`: Automatically removes the container once it exits, keeping your system clean.
|
||||
- `orcaslicer $*`: Passes any additional parameters from the `scripts/DockerRun.sh` script directly to the OrcaSlicer executable within the container.
|
||||
|
||||
By uncommenting and using these options as needed, you can often resolve issues related to display authorization, networking, and file permissions.
|
||||
|
||||
### Linux Build
|
||||
|
||||
How to build OrcaSlicer on Linux.
|
||||
|
||||
#### Dependencies
|
||||
|
||||
The build system supports multiple Linux distributions including Ubuntu/Debian and Arch Linux. All required dependencies will be installed automatically by the provided shell script where possible, however you may need to manually install some dependencies.
|
||||
|
||||
> [!NOTE]
|
||||
> Fedora and other distributions are not currently supported, but you can try building manually by installing the required dependencies listed below.
|
||||
|
||||
##### Common dependencies across distributions
|
||||
|
||||
- autoconf / automake
|
||||
- cmake
|
||||
- curl / libcurl4-openssl-dev
|
||||
- dbus-devel / libdbus-1-dev
|
||||
- eglexternalplatform-dev / eglexternalplatform-devel
|
||||
- extra-cmake-modules
|
||||
- file
|
||||
- gettext
|
||||
- git
|
||||
- glew-devel / libglew-dev
|
||||
- gstreamer-devel / libgstreamerd-3-dev
|
||||
- gtk3-devel / libgtk-3-dev
|
||||
- libmspack-dev / libmspack-devel
|
||||
- libsecret-devel / libsecret-1-dev
|
||||
- libspnav-dev / libspnav-devel
|
||||
- libssl-dev / openssl-devel
|
||||
- libtool
|
||||
- libudev-dev
|
||||
- mesa-libGLU-devel
|
||||
- ninja-build
|
||||
- texinfo
|
||||
- webkit2gtk-devel / libwebkit2gtk-4.0-dev or libwebkit2gtk-4.1-dev
|
||||
- wget
|
||||
|
||||
##### Additional dependencies for specific distributions
|
||||
|
||||
- **Ubuntu 22.x/23.x**: libfuse-dev, m4
|
||||
- **Arch Linux**: mesa, wayland-protocols
|
||||
|
||||
#### Linux Instructions
|
||||
|
||||
1. **Install system dependencies:**
|
||||
```shell
|
||||
./build_linux.sh -u
|
||||
```
|
||||
|
||||
2. **Build dependencies:**
|
||||
```shell
|
||||
./build_linux.sh -d
|
||||
```
|
||||
|
||||
3. **Build OrcaSlicer with tests:**
|
||||
```shell
|
||||
./build_linux.sh -st
|
||||
```
|
||||
|
||||
4. **Build AppImage (optional):**
|
||||
```shell
|
||||
./build_linux.sh -i
|
||||
```
|
||||
|
||||
5. **All-in-one build (recommended):**
|
||||
```shell
|
||||
./build_linux.sh -dsti
|
||||
```
|
||||
|
||||
**Additional build options:**
|
||||
|
||||
- `-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
|
||||
- `-p`: Disable precompiled headers (boost ccache hit rate)
|
||||
- `-r`: Skip RAM and disk checks (for low-memory systems)
|
||||
|
||||
> [!NOTE]
|
||||
> 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 -dsti` to build everything.
|
||||
|
||||
> [!WARNING]
|
||||
> 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.
|
||||
|
||||
---
|
||||
|
||||
## Portable User Configuration
|
||||
|
||||
If you want OrcaSlicer to use a custom user configuration folder (e.g., for a portable installation), you can simply place a folder named `data_dir` next to the OrcaSlicer executable. OrcaSlicer will automatically use this folder as its configuration directory.
|
||||
|
||||
This allows for multiple self-contained installations with separate user data.
|
||||
|
||||
> [!TIP]
|
||||
> This feature is especially useful if you want to run OrcaSlicer from a USB stick or keep different profiles isolated.
|
||||
|
||||
### Example folder structure
|
||||
|
||||
```shell
|
||||
OrcaSlicer.exe
|
||||
data_dir/
|
||||
```
|
||||
|
||||
You don’t need to recompile or modify any settings — this works out of the box as long as `data_dir` exists in the same folder as the executable.
|
||||
|
|
@ -1,434 +0,0 @@
|
|||
# Guide: Develop Profiles for OrcaSlicer
|
||||
|
||||
## Introduction
|
||||
|
||||
This guide will help you develop profiles for OrcaSlicer.
|
||||
|
||||
## High-level Overview
|
||||
|
||||
OrcaSlicer uses JSON files to store profiles. There are four types of profiles:
|
||||
|
||||
1. Printer model (type `machine_model`). Example: `Orca 3D Fuse1.json`
|
||||
2. Printer variant (type `machine`). Example: `Orca 3D Fuse1 0.2 nozzle.json`
|
||||
3. Filament (type `filament`). Example: `Generic PLA @Orca 3D Fuse1@.json`
|
||||
4. Process (type `process`). Example: `0.10mm Standard @Orca 3D Fuse1 0.2.json`
|
||||
|
||||
Additionally, there is an overall meta file for each vendor (`Orca 3D.json`).
|
||||
|
||||
For easier understanding, let's consider a scenario with a printer manufacturer called `Orca 3D`. The manufacturer offers one printer model called `Fuse 1`, which supports 0.2/0.4/0.6/0.8mm nozzles and common market filaments.
|
||||
|
||||
In this case:
|
||||
|
||||
- Vendor profile: `Orca 3D`
|
||||
- Printer profile: `Orca 3D Fuse1`
|
||||
- Printer variant profile: `Orca 3D Fuse1 0.4 nozzle`
|
||||
- Filament profile: `Generic PLA @Orca 3D Fuse1@`
|
||||
- Process profile: `0.20mm Standard @Orca 3D Fuse1 0.4`
|
||||
|
||||
The profile name should be same as the filename without the `.json` extension in principal.
|
||||
Naming conventions:
|
||||
|
||||
1. Vendor profile: `vendor_name.json`
|
||||
2. Printer profile: `vendor_name` + `printer_name` + `.json`
|
||||
3. Printer variant profile: `vendor_name` + `printer_variant_name` + `.json` (where `printer_variant_name` typically includes `printer_name` + `nozzle_diameter`)
|
||||
4. Filament profile: `filament_vendor_name` + `filament_name` + " @" + `vendor_name` + `printer_name`/`printer_variant_name` + `.json`
|
||||
5. Process profile: `layer_height` + `preset_name` + " @" + `vendor_name` + `printer_name`/`printer_variant_name` + `.json` (`preset_name` typically includes "standard," "fine," "fast," "draft," etc.)
|
||||
|
||||
## File Structure and Templates
|
||||
|
||||
Profiles should be structured in the following way under the OrcaSlicer installation directory:
|
||||
|
||||
```plaintext
|
||||
resources\profiles\
|
||||
├── Orca 3D.json
|
||||
└── Orca 3D\
|
||||
├── machine\
|
||||
│ ├── Orca 3D Fuse1.json
|
||||
│ ├── Orca 3D Fuse1 0.2 nozzle.json
|
||||
│ └── Orca 3D Fuse1 0.4 nozzle.json
|
||||
├── process\
|
||||
│ ├── 0.10mm Standard @Orca 3D Fuse1 0.2.json
|
||||
│ └── 0.20mm Standard @Orca 3D Fuse1 0.4.json
|
||||
└── filament\
|
||||
└── Generic PLA @Orca 3D Fuse1@.json
|
||||
```
|
||||
|
||||
> [!TIP]
|
||||
> Use short vendor names in filenames to avoid excessive length.
|
||||
|
||||
> [!NOTE]
|
||||
> Filament profiles are **optional**. Create them only if the vendor has specifically tuned profiles for the given printer. See [Filament profiles](#filament-profiles) for details.
|
||||
|
||||
Template files for profiles are available in:
|
||||
|
||||
```shell
|
||||
OrcaSlicer\resources\profiles_template\Template
|
||||
```
|
||||
|
||||
These templates can be used as a starting point for new printer, filament, and process profiles.
|
||||
|
||||
## Filament Profiles
|
||||
|
||||
OrcaSlicer features a global filament library called `OrcaFilamentLibrary`, which is automatically available for all printers. It includes generic filaments like `Generic PLA @System` and `Generic ABS @System` etc.
|
||||
|
||||
Printer vendors can override specific filaments in the global library for certain printer models by creating new filament profiles.
|
||||
|
||||
Relationship diagram:
|
||||
|
||||
```mermaid
|
||||
graph TD;
|
||||
OrcaFilamentLibrary-->Orca_3D_filament;
|
||||
OrcaFilamentLibrary-->Vendor_A_filament;
|
||||
OrcaFilamentLibrary-->Vendor_B_filament;
|
||||
```
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Create new filament profiles only if you have truly specifically tuned the filament for the given printer. Otherwise, use the global library. The global library has a better chance to receive optimizations and updates from OrcaSlicer contributors, which will benefit users of all printers.
|
||||
|
||||
### Adding Filament Profiles to the Global Library
|
||||
|
||||
In this section, we will discuss how to add a new filament profile into the global library.
|
||||
If you want to add a new generic profile into the global library, you need to create a new file in the `resources\profiles\OrcaFilamentLibrary\filament` folder. If a base type already exists in the global library, you can use this file as a base profile by inheriting it.
|
||||
The following sample JSON file shows how to create a new generic filament profile `Generic PLA-GF @System` in the global library.
|
||||
|
||||
1. The first step is to create a new file in the `resources\profiles\OrcaFilamentLibrary\filament` folder. The file name should be `Generic PLA-GF @System.json`. Please note that we leave the `compatible_printers` field empty so that it is available for all printers.
|
||||
|
||||
```json
|
||||
{
|
||||
"type": "filament",
|
||||
"filament_id": "GFL99",
|
||||
"setting_id": "GFSA05",
|
||||
"name": "Generic PLA-GF @System",
|
||||
"from": "system",
|
||||
"instantiation": "true",
|
||||
"inherits": "fdm_filament_pla",
|
||||
"filament_type": ["PLA-GF"],
|
||||
"filament_flow_ratio": [
|
||||
"0.96"
|
||||
],
|
||||
"compatible_printers": []
|
||||
}
|
||||
```
|
||||
|
||||
2. Register the profile in `resources\profiles\OrcaFilamentLibrary.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "OrcaFilamentLibrary",
|
||||
"version": "02.02.00.04",
|
||||
"force_update": "0",
|
||||
"description": "Orca Filament Library",
|
||||
"filament_list": [
|
||||
// ...
|
||||
{
|
||||
"name": "Generic PLA-GF @System",
|
||||
"sub_path": "filament/Generic PLA-GF @System.json"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
3. The last step is to validate the newly added filament profiles see [Validate Profiles](#validate-profiles).
|
||||
|
||||
> [!NOTE]
|
||||
> If the filament is compatible with AMS, ensure that the `filament_id` value **does not exceed 8 characters** to maintain AMS compatibility.
|
||||
|
||||
> [!TIP]
|
||||
> **Testing Profile Changes**
|
||||
>
|
||||
> 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.
|
||||
|
||||
### Adding Filament Profiles to Printer Vendor Library
|
||||
|
||||
In this section, we will discuss how to add a new filament profile for a certain vendor.
|
||||
If you want to add a new filament profile, whether it's a brand new profile or a specialized version of a global filament profile for a given printer, you need to create a new file in the `resources\profiles\vendor_name\filament` folder. If a base type already exists in the global library, you can use this file as a base profile by inheriting it.
|
||||
Below is a sample JSON file showing how to create a specialized `Generic ABS` filament profile for the ToolChanger printer.
|
||||
Please note that here we must leave the compatible_printers field non-empty, unlike in the global library.
|
||||
|
||||
```json
|
||||
{
|
||||
"type": "filament",
|
||||
"setting_id": "GFB99_MTC_0",
|
||||
"name": "Generic ABS @MyToolChanger",
|
||||
"from": "system",
|
||||
"instantiation": "true",
|
||||
"inherits": "Generic ABS @System",
|
||||
"filament_cooling_final_speed": [
|
||||
"3.5"
|
||||
],
|
||||
"filament_cooling_initial_speed": [
|
||||
"10"
|
||||
],
|
||||
"filament_cooling_moves": [
|
||||
"2"
|
||||
],
|
||||
"filament_load_time": [
|
||||
"10.5"
|
||||
],
|
||||
"filament_loading_speed": [
|
||||
"10"
|
||||
],
|
||||
"filament_loading_speed_start": [
|
||||
"50"
|
||||
],
|
||||
"filament_multitool_ramming": [
|
||||
"1"
|
||||
],
|
||||
"filament_multitool_ramming_flow": [
|
||||
"40"
|
||||
],
|
||||
"filament_stamping_distance": [
|
||||
"45"
|
||||
],
|
||||
"filament_stamping_loading_speed": [
|
||||
"29"
|
||||
],
|
||||
"filament_unload_time": [
|
||||
"8.5"
|
||||
],
|
||||
"filament_unloading_speed": [
|
||||
"100"
|
||||
],
|
||||
"compatible_printers": [
|
||||
"MyToolChanger 0.4 nozzle",
|
||||
"MyToolChanger 0.2 nozzle",
|
||||
"MyToolChanger 0.6 nozzle",
|
||||
"MyToolChanger 0.8 nozzle"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> If the filament is compatible with AMS, ensure that the `filament_id` value **does not exceed 8 characters** to maintain AMS compatibility.
|
||||
|
||||
## Process Profiles
|
||||
|
||||
Process profiles define print quality and behavior. They follow a structure similar to filament profiles:
|
||||
|
||||
- A common base file, e.g., `fdm_process_common.json`, acts as the parent.
|
||||
- Vendor-specific process profiles should inherit from the base using the `inherits` field.
|
||||
- Profiles are stored under:
|
||||
|
||||
```shell
|
||||
resources\profiles\vendor_name\process\
|
||||
```
|
||||
|
||||
- **There are no global process profiles**.
|
||||
- Each process profile includes a `"compatible_printers"` field with an array of compatible printer variant names.
|
||||
|
||||
Example:
|
||||
|
||||
```json
|
||||
{
|
||||
"type": "process",
|
||||
"name": "0.10mm Standard @ExampleVendor Printer 0.2",
|
||||
"inherits": "fdm_process_common",
|
||||
"from": "system",
|
||||
"instantiation": "true",
|
||||
"compatible_printers": [
|
||||
"ExampleVendor Printer 0.2 nozzle"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## Printer Model Profiles
|
||||
|
||||
- Printer model profiles (type `machine_model`) describe the general printer information.
|
||||
- Example fields: `nozzle_diameter`, `bed_model`, `bed_texture`, `model_id`, etc.
|
||||
- Stored in:
|
||||
|
||||
```shell
|
||||
resources\profiles\vendor_name\machine\
|
||||
```
|
||||
|
||||
- Each vendor's folder may contain an image named:
|
||||
|
||||
```shell
|
||||
[machine_model_list.name]_cover.png
|
||||
```
|
||||
|
||||
This image will be used in the UI.
|
||||
|
||||
Example model profile:
|
||||
|
||||
```json
|
||||
{
|
||||
"type": "machine_model",
|
||||
"name": "Example M5",
|
||||
"nozzle_diameter": "0.2;0.25;0.4;0.6",
|
||||
"bed_model": "M5-Example-bed.stl",
|
||||
"bed_texture": "M5-Example-texture.svg",
|
||||
"model_id": "V1234",
|
||||
"family": "Example",
|
||||
"machine_tech": "FFF",
|
||||
"default_materials": "Example Generic PLA;Example Generic PETG"
|
||||
}
|
||||
```
|
||||
|
||||
## Printer Variant Profiles
|
||||
|
||||
- Printer variants (type `machine`) define specific nozzle configurations and mechanical details.
|
||||
- Each variant must inherit from a common base like `fdm_machine_common.json`.
|
||||
- Must list the compatible nozzle diameter in the `nozzle_diameter` array.
|
||||
- Example fields include `printer_model`, `printer_variant`, `default_print_profile`, `printable_area`, etc.
|
||||
|
||||
Example variant profile:
|
||||
|
||||
```json
|
||||
{
|
||||
"type": "machine",
|
||||
"name": "Example M5 0.2 nozzle",
|
||||
"inherits": "fdm_machine_common",
|
||||
"from": "system",
|
||||
"setting_id": "GM001",
|
||||
"instantiation": "true",
|
||||
"nozzle_diameter": ["0.2"],
|
||||
"printer_model": "Example M5",
|
||||
"printer_variant": "0.2",
|
||||
"default_filament_profile": ["Example Generic PLA"],
|
||||
"default_print_profile": "0.10mm Standard 0.2mm nozzle @Example",
|
||||
"printable_area": ["0x0", "235x0", "235x235", "0x235"],
|
||||
"nozzle_type": "brass"
|
||||
}
|
||||
```
|
||||
|
||||
## Models
|
||||
|
||||
- The `model` directory under the vendor folder is intended to behave similarly to `machine` profiles.
|
||||
- Used for additional printer-related 3D models or definitions, stored at:
|
||||
|
||||
```shell
|
||||
resources\profiles\vendor_name\model\
|
||||
```
|
||||
|
||||
## Vendor Meta File
|
||||
|
||||
```shell
|
||||
resources\profiles\vendor_name.json
|
||||
```
|
||||
|
||||
Each vendor must include a JSON file in the `resources\profiles` directory, named `vendor_name.json`. This file lists all available models, variants, processes, and filaments:
|
||||
|
||||
Example:
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "ExampleVendor",
|
||||
"version": "01.00.00.00",
|
||||
"force_update": "1",
|
||||
"description": "Example configuration",
|
||||
"machine_model_list": [
|
||||
{
|
||||
"name": "Example M5",
|
||||
"sub_path": "machine/Example M5.json"
|
||||
}
|
||||
],
|
||||
"machine_list": [
|
||||
{
|
||||
"name": "fdm_machine_common",
|
||||
"sub_path": "machine/fdm_machine_common.json"
|
||||
}
|
||||
],
|
||||
"process_list": [
|
||||
{
|
||||
"name": "fdm_process_common",
|
||||
"sub_path": "process/fdm_process_common.json"
|
||||
}
|
||||
],
|
||||
"filament_list": [
|
||||
{
|
||||
"name": "fdm_filament_common",
|
||||
"sub_path": "filament/fdm_filament_common.json"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## Validate Profiles
|
||||
|
||||
You can validate your profiles using both the **OrcaSlicer profile validator** and the **Python validation script**. These tools are designed to check different aspects of the profiles, so both should be executed and pass without errors to ensure full compatibility.
|
||||
|
||||
> [!NOTE]
|
||||
> **✅ Recommendation:** Always run **both** the OrcaSlicer validator and the Python script to ensure all aspects of the profiles are valid.
|
||||
|
||||
### 1. OrcaSlicer Profile Validator
|
||||
|
||||
You can run OrcaSlicer to verify if the filament you just added is available and usable. You can also use the [Orca profile validator](https://github.com/SoftFever/Orca_tools/releases/tag/1) tool to help debug any errors.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> You need to delete the `%appdata%/OrcaSlicer/system` folder to force OrcaSlicer to reload your lastest changes.
|
||||
|
||||
The process is the same if you want to add a new brand filament profile into the global library. You need to create a new file in the `resources\profiles\OrcaFilamentLibrary\filament\brand_name` folder. The only difference is that you should put the file into the brand's own subfolder.
|
||||
|
||||
#### Usage
|
||||
|
||||
```shell
|
||||
-h [ --help ] help
|
||||
-p [ --path ] arg profile folder
|
||||
-v [ --vendor ] arg Vendor name. Optional, all profiles present in the folder will be validated if not specified
|
||||
-l [ --log_level ] arg (=2) Log level. Optional, default is 2 (warning). Higher values produce more detailed logs.
|
||||
```
|
||||
|
||||
#### Example
|
||||
|
||||
```shell
|
||||
./OrcaSlicer_profile_validator -p ~/codes/OrcaSlicer/resources/profiles -l 2 -v Custom
|
||||
```
|
||||
|
||||
#### Sample result with errors
|
||||
|
||||
```shell
|
||||
PS D:\codes\OrcaSlicer> ."D:/codes/OrcaSlicer/build/src/Release/OrcaSlicer_profile_validator.exe" --path d:\codes\OrcaSlicer\resources\profiles -l 2 -v Custom
|
||||
[2024-02-28 21:23:06.102138] [0x0000a4e8] [error] Slic3r::ConfigBase::load_from_json: parse d:\codes\OrcaSlicer\resources\profiles/Custom/machine/fdm_klipper_common.json got a nlohmann::detail::parse_error, reason = [json.exception.parse_error.101] parse error at line 9, column 38: syntax error while parsing object - unexpected string literal; expected '}'
|
||||
...
|
||||
Validation failed
|
||||
```
|
||||
|
||||
#### Sample result with success
|
||||
|
||||
```shell
|
||||
PS D:\codes\OrcaSlicer\build\src\RelWithDebInfo> ."D:/codes/OrcaSlicer/build/src/Release/OrcaSlicer_profile_validator.exe" --path d:\codes\OrcaSlicer\resources\profiles -l 2 -v Custom
|
||||
Validation completed successfully
|
||||
```
|
||||
|
||||
> [!WARNING]
|
||||
> Use `OrcaSlicer_profile_validator` on Ubuntu and `OrcaSlicer_profile_validator.exe` on Windows.
|
||||
|
||||
---
|
||||
|
||||
### 2. Python Profile Validation Script
|
||||
|
||||
In addition to the Orca validator, you should run the `orca_extra_profile_check.py` script. This script performs additional checks like:
|
||||
|
||||
- Validation of `compatible_printers` in filament profiles
|
||||
- Consistency of filament names
|
||||
- Validation of default materials in machine profiles (optional)
|
||||
|
||||
#### Example command
|
||||
|
||||
```shell
|
||||
python ./orca_extra_profile_check.py
|
||||
```
|
||||
|
||||
You can also enable or disable specific checks:
|
||||
|
||||
- `--help`: displays help information
|
||||
- `--vendor` (optional): checks only the specified vendor. If omitted, all vendors are checked.
|
||||
- `--check-filaments` (enabled by default): checks `compatible_printers` fields in filament profiles
|
||||
- `--check-materials`: checks default material names in machine profiles
|
||||
- `--check-obsolete-keys`: checks for obsolete keys in profiles
|
||||
|
||||
#### Sample usage with all checks enabled
|
||||
|
||||
```shell
|
||||
python ./orca_extra_profile_check.py --vendor="vendor_name" --check-filaments --check-materials
|
||||
```
|
||||
|
||||
The script will output the number of errors found and exit with a non-zero status code if any issues are detected.
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
# 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
|
||||
```
|
||||
|
|
@ -1,266 +0,0 @@
|
|||
# How to Contribute to the Wiki
|
||||
|
||||
This guide explains how to contribute to the OrcaSlicer wiki.
|
||||
|
||||
OrcaSlicer uses GitHub's wiki feature, which lets users and developers create and edit documentation collaboratively.
|
||||
|
||||
We encourage developers and users to contribute by updating existing pages and adding new content. This helps keep the documentation accurate and useful.
|
||||
|
||||
When adding new features, consider updating the wiki so users can access the latest guidance.
|
||||
|
||||
- [Wiki Structure](#wiki-structure)
|
||||
- [Home](#home)
|
||||
- [Index and Navigation](#index-and-navigation)
|
||||
- [File Naming and Organization](#file-naming-and-organization)
|
||||
- [Orca to Wiki Redirection](#orca-to-wiki-redirection)
|
||||
- [Formatting and Style](#formatting-and-style)
|
||||
- [Markdown Formatting](#markdown-formatting)
|
||||
- [Alerts and Callouts](#alerts-and-callouts)
|
||||
- [Images](#images)
|
||||
- [Image Naming](#image-naming)
|
||||
- [Image Placement](#image-placement)
|
||||
- [Linking Images](#linking-images)
|
||||
- [Examples](#examples)
|
||||
- [Avoid the Following](#avoid-the-following)
|
||||
- [Resize Images](#resize-images)
|
||||
- [Image Cropping and Highlighting](#image-cropping-and-highlighting)
|
||||
- [Recommended Formats](#recommended-formats)
|
||||
- [Structuring Content](#structuring-content)
|
||||
- [Commands and Code Blocks](#commands-and-code-blocks)
|
||||
- [External Links](#external-links)
|
||||
|
||||
## Wiki Structure
|
||||
|
||||
Each wiki page is a Markdown file located in the `doc` directory of the repository. The wiki is organized into sections that cover different areas of the project.
|
||||
|
||||
### Home
|
||||
|
||||
The Home page is the starting point for the OrcaSlicer wiki. From there you can navigate to sections and topics related to the project.
|
||||
|
||||
When you create a new page or section, link it from the Home page under the appropriate category.
|
||||
The Home page currently organizes content in these top-level entries:
|
||||
|
||||
-  [Printer Settings](home#printer-settings)
|
||||
-  [Material Settings](home#material-settings)
|
||||
-  [Process Settings](home#process-settings)
|
||||
-  [Prepare](home#prepare)
|
||||
-  [Calibrations](home#calibrations)
|
||||
-  [Developer Section](home#developer-section)
|
||||
|
||||
Each section can have multiple pages covering specific topics. For example, the [Process Settings](home#process-settings) section includes pages on [quality](home#quality-settings), [support](home#support-settings), and [others](home#others-settings).
|
||||
|
||||
#### Index and Navigation
|
||||
|
||||
GitHub Wiki uses file names as page identifiers. To link to a page, use the file name without the `.md` extension. If a file lives in a subdirectory, **do not include the subdirectory** in the link; link directly to the file name from the Home page.
|
||||
|
||||
For example, if you add `doc/calibration/flow-rate-calib.md`, link it like this:
|
||||
|
||||
```markdown
|
||||
[Flow Rate Calibration](flow-rate-calib)
|
||||
```
|
||||
|
||||
For long pages, include a table of contents at the top to help readers find sections quickly.
|
||||
|
||||
```markdown
|
||||
- [Wiki Structure](#wiki-structure)
|
||||
- [Home](#home)
|
||||
- [Index and Navigation](#index-and-navigation)
|
||||
- [File Naming and Organization](#file-naming-and-organization)
|
||||
- [Formatting and Style](#formatting-and-style)
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> If you're adding a new section, follow the existing structure and make sure it doesn't already fit an existing category. Link it from the Home page accordingly.
|
||||
|
||||
### File Naming and Organization
|
||||
|
||||
When creating new pages, follow these file-naming conventions:
|
||||
|
||||
- Use unique file names to avoid conflicts.
|
||||
- Use descriptive names that reflect the page's content.
|
||||
- Use kebab-case for filenames (e.g.: `How-to-wiki.md`).
|
||||
- If a page belongs to a section, include a suffix that clarifies it (for example, calibration pages should end with `-calib.md`, e.g. `flow-rate-calib.md`).
|
||||
- Place files in the appropriate subdirectory when applicable (e.g.: `doc/calibration/` for calibration-related content).
|
||||
|
||||
## Orca to Wiki Redirection
|
||||
|
||||
OrcaSlicer can redirect users from the GUI to the appropriate wiki pages, making it easier to find relevant documentation.
|
||||
|
||||
The option-to-wiki mapping is defined in [src/slic3r/GUI/Tab.cpp](https://github.com/SoftFever/OrcaSlicer/blob/main/src/slic3r/GUI/Tab.cpp). Any option added with `append_single_option_line` can be mapped to a wiki page using a second string argument.
|
||||
|
||||
```cpp
|
||||
optgroup->append_single_option_line("OPTION_NAME"); // Option without wiki page/redirection
|
||||
optgroup->append_single_option_line("OPTION_NAME", "WIKI_PAGE"); // Option with wiki page and redirection
|
||||
```
|
||||
|
||||
You can also point to a specific section within a wiki page by appending a fragment identifier (for example `#section-name`).
|
||||
|
||||
Example:
|
||||
|
||||
```cpp
|
||||
optgroup->append_single_option_line("seam_gap","quality_settings_seam"); // Wiki page and redirection
|
||||
optgroup->append_single_option_line("seam_slope_type", "quality_settings_seam#scarf-joint-seam"); // Wiki page and redirection to `Scarf Joint Seam` section
|
||||
```
|
||||
|
||||
## Formatting and Style
|
||||
|
||||
Follow these style and formatting conventions when contributing to the wiki.
|
||||
|
||||
### Markdown Formatting
|
||||
|
||||
The wiki uses standard Markdown syntax for formatting and aims to maintain a consistent style across all pages. Avoid using raw HTML tags and prefer Markdown formatting instead.
|
||||
|
||||
Ensure your indentation is consistent, especially for code blocks and lists.
|
||||
|
||||
Refer to the [GitHub Markdown Guide](https://guides.github.com/features/mastering-markdown/) for more information on Markdown syntax.
|
||||
|
||||
### Alerts and Callouts
|
||||
|
||||
Use GitHub's alert syntax to add inline notes and warnings:
|
||||
|
||||
```markdown
|
||||
> [!NOTE]
|
||||
> Useful information that readers should know.
|
||||
|
||||
> [!TIP]
|
||||
> Helpful advice for doing things more easily.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Key information required to achieve a goal.
|
||||
|
||||
> [!WARNING]
|
||||
> Urgent information to avoid problems.
|
||||
|
||||
> [!CAUTION]
|
||||
> Warnings about risks or negative outcomes.
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> Refer to the [GitHub Alerts documentation](https://docs.github.com/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#alerts) for more details.
|
||||
|
||||
## Images
|
||||
|
||||
Images are encouraged to enhance the clarity and quality of the wiki content. They help illustrate concepts, provide examples, and improve readability.
|
||||
|
||||
> [!CAUTION]
|
||||
> Do not use images from third-party sources unless you have the proper permissions.
|
||||
|
||||
### Image Naming
|
||||
|
||||
- Use clear, descriptive filenames that reflect the image content.
|
||||
- For section-specific images, include the section name or initials (for example `pa-[description].png` for Pressure Advance images).
|
||||
|
||||
### Image Placement
|
||||
|
||||
- General images should be placed in the `doc/images/` directory.
|
||||
- Section-specific images should be stored in their corresponding subdirectories (e.g., `doc/images/calibration/` for calibration content).
|
||||
|
||||
> [!TIP]
|
||||
> You can use `\resources\images` images used in the GUI.
|
||||
|
||||
### Linking Images
|
||||
|
||||
Always use raw GitHub URLs for image links to ensure correct display:
|
||||
|
||||
Format = ``
|
||||
|
||||
- Base URL:
|
||||
|
||||
```markdown
|
||||
https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/
|
||||
```
|
||||
|
||||
- Raw tag:
|
||||
|
||||
```markdown
|
||||
?raw=true
|
||||
```
|
||||
|
||||
#### Examples
|
||||
|
||||
- For an image in `doc/images/` named `calibration.png`:
|
||||
|
||||
```markdown
|
||||

|
||||
```
|
||||
|
||||
- For an image in a subdirectory like `doc/images/GUI/combobox.png`:
|
||||
|
||||
```markdown
|
||||

|
||||
```
|
||||
|
||||
> [!IMPORTANT]
|
||||
> New or moved images may not appear in previews until the pull request is merged. Double-check paths and update links if you move files.
|
||||
|
||||
#### Avoid the Following
|
||||
|
||||
- Relative paths
|
||||
- GitHub Assets/user-content/user-images URLs
|
||||
- External image links from temporary or unreliable hosts
|
||||
- Images containing personal or sensitive information
|
||||
- Using images for content that can be expressed in text, such as equations or code—use Markdown syntax or Mermaid/Math formatting instead.
|
||||
|
||||
> [!NOTE]
|
||||
> When contributing section-specific images, follow the naming conventions and directory structure.
|
||||
|
||||
#### Resize Images
|
||||
|
||||
Avoid the resize of images and let the Wiki handle it automatically.
|
||||
|
||||
If resizing is necessary (e.g., for thumbnails), use the following syntax:
|
||||
|
||||
HTML Format = `<img alt="` + filename + `"` + `src="` + Base URL + filename.extension + Raw tag + size limit.
|
||||
Example:
|
||||
|
||||
```html
|
||||
<img alt="IS_damp_marlin_print_measure" src="https://github.com/SoftFever/OrcaSlicer/blob/main/doc/images/InputShaping/IS_damp_marlin_print_measure.jpg?raw=true" height="200">
|
||||
```
|
||||
|
||||
### Image Cropping and Highlighting
|
||||
|
||||
To ensure clarity:
|
||||
|
||||
- Crop images to focus on relevant areas.
|
||||
- Use simple annotations (arrows, circles, rectangles) to highlight important parts without overloading the image.
|
||||
|
||||
### Recommended Formats
|
||||
|
||||
- **JPG:** Suitable for photographs. Avoid for images with text or fine detail due to compression artifacts.
|
||||
- **PNG:** Ideal for screenshots or images with transparency. Ensure sufficient contrast for light and dark modes.
|
||||
- **SVG:** Preferred when possible. SVGs support theme adaptation (light/dark mode), making them ideal for icons and diagrams.
|
||||
|
||||
## Structuring Content
|
||||
|
||||
Each page should have a clear objective. After a short introduction, choose a structure that fits the content:
|
||||
|
||||
- **Step-by-step guides:** Use for sequential procedures (for example calibration).
|
||||
- **GUI-based reference:** Describe settings following OrcaSlicer's UI when sequence isn't required.
|
||||
|
||||
Example: explain **Layer Height** before **Initial Layer Height**, since the former is global and the latter only applies to the first layer.
|
||||
|
||||
## Commands and Code Blocks
|
||||
|
||||
When adding commands or code blocks please use the [Code Block with Syntax Highlighting feature of Markdown](https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/creating-and-highlighting-code-blocks#syntax-highlighting).
|
||||
|
||||
- Use triple backticks (```) to enclose code blocks.
|
||||
- Specify the language for proper highlighting and readability.
|
||||
|
||||
````markdown
|
||||
```json
|
||||
{
|
||||
"key": "value"
|
||||
}
|
||||
```
|
||||
````
|
||||
|
||||
```json
|
||||
{
|
||||
"key": "value"
|
||||
}
|
||||
```
|
||||
|
||||
## External Links
|
||||
|
||||
Be careful when linking to external resources.
|
||||
Ensure links are relevant and reliable and cite papers or articles when appropriate.
|
||||
|
|
@ -1,111 +0,0 @@
|
|||
# Localization and translation guide
|
||||
|
||||
The purpose of this guide is to describe how to contribute to the OrcaSlicer translations. We use GNUgettext for extracting string resources from the project and PoEdit for editing translations.
|
||||
|
||||
Those can be downloaded here:
|
||||
|
||||
- [GNUgettext](https://www.gnu.org/software/gettext/) package contains a set of tools to extract strings from the source code and to create the translation Catalog.
|
||||
- [PoEdit](https://poedit.net) provides good interface for the translators.
|
||||
|
||||
After GNUgettext is installed, it is recommended to add the path to gettext/bin to PATH variable.
|
||||
|
||||
Full manual for GNUgettext can be seen here: [http://www.gnu.org/software/gettext/manual/gettext.html](http://www.gnu.org/software/gettext/manual/gettext.html)
|
||||
|
||||
### Scenario 1. How do I add a translation or fix an existing translation
|
||||
|
||||
1. Get PO-file 'OrcaSlicer_xx.pot' from corresponding sub-folder here:
|
||||
[https://github.com/softfever/OrcaSlicer/tree/master/localization/i18n](https://github.com/softfever/OrcaSlicer/tree/master/localization/i18n)
|
||||
2. Open this file in PoEdit as "Edit a translation"
|
||||
3. Apply your corrections to the translation
|
||||
4. Push changed OrcaSlicer_xx.po into the original folder
|
||||
5. copy OrcaSlicer_xx.mo into resources/i18n/xx and rename it to OrcaSlicer.mo, then push the changed file.
|
||||
|
||||
### Scenario 2. How do I add a new language support
|
||||
|
||||
1. Get file OrcaSlicer.pot here :
|
||||
[https://github.com/softfever/OrcaSlicer/tree/master/localization/i18n](https://github.com/softfever/OrcaSlicer/tree/master/localization/i18n)
|
||||
2. Open it in PoEdit for "Create new translation"
|
||||
3. Select Translation Language (for example French).
|
||||
4. As a result you will have fr.po - the file containing translation to French.
|
||||
Notice. When the translation is complete you need to:
|
||||
- Rename the file to OrcaSlicer_fr.po
|
||||
- Click "Save file" button. OrcaSlicer_fr.mo will be created immediately
|
||||
- Bambu_Studio_fr.po needs to be copied into the sub-folder fr of [https://github.com/softfever/OrcaSlicer/tree/master/localization/i18n](https://github.com/softfever/OrcaSlicer/tree/master/localization/i18n), and be pushed
|
||||
- copy OrcaSlicer_xx.mo into resources/i18n/xx and rename it to OrcaSlicer.mo, then push the changed file.
|
||||
( name of folder "fr" means "French" - the translation language).
|
||||
|
||||
### Scenario 3. How do I add a new text resource when implementing a feature to OrcaSlicer
|
||||
|
||||
Each string resource in OrcaSlicer available for translation needs to be explicitly marked using L() macro like this:
|
||||
|
||||
```C++
|
||||
auto msg = L("This message to be localized")
|
||||
```
|
||||
|
||||
To get translated text use one of needed macro/function (`_(s)` or `_CHB(s)` ).
|
||||
If you add new file resource, add it to the list of files containing macro `L()`
|
||||
|
||||
### Scenario 4. How do I use GNUgettext to localize my own application taking OrcaSlicer as an example
|
||||
|
||||
1. For convenience create a list of files with this macro `L(s)`. We have
|
||||
https://github.com/softfever/OrcaSlicer/blob/master/localization/i18n/list.txt.
|
||||
|
||||
2. Create template file(*.POT) with GNUgettext command:
|
||||
|
||||
```shell
|
||||
xgettext --keyword=L --add-comments=TRN --from-code=UTF-8 --debug -o OrcaSlicer.pot -f list.txt
|
||||
```
|
||||
|
||||
Use flag `--from-code=UTF-8` to specify that the source strings are in UTF-8 encoding
|
||||
Use flag `--debug` to correctly extract formatted strings(used %d, %s etc.)
|
||||
|
||||
3. Create PO- and MO-files for your project as described above.
|
||||
|
||||
4. To merge old PO-file with strings from created new POT-file use command:
|
||||
|
||||
```shell
|
||||
msgmerge -N -o new.po old.po new.pot
|
||||
```
|
||||
|
||||
Use option `-N` to not using fuzzy matching when an exact match is not found.
|
||||
|
||||
5. To concatenate old PO-file with strings from new PO-file use command:
|
||||
|
||||
```shell
|
||||
msgcat -o new.po old.po
|
||||
```
|
||||
|
||||
6. Create an English translation catalog with command:
|
||||
|
||||
```shell
|
||||
msgen -o new.po old.po
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> In this Catalog it will be totally same strings for initial text and translated.
|
||||
|
||||
When you have Catalog to translation open POT or PO file in PoEdit and start translating.
|
||||
|
||||
## General guidelines for OrcaSlicer translators
|
||||
|
||||
- We recommend using _PoEdit_ application for translation (as described above). It will help you eliminate most punctuation errors and will show you strings with "random" translations (if the fuzzy parameter was used).
|
||||
|
||||
- To check how the translated text looks on the UI elements, test it :) If you use _PoEdit_, all you need to do is save the file. At this point, a MO file will be created. Rename it OrcaSlicer.mo, and you can run OrcaSlicer (see above).
|
||||
|
||||
- If you see an encoding error (garbage characters instead of Unicode) somewhere in OrcaSlicer, report it. It is likely not a problem of your translation, but a bug in the software.
|
||||
|
||||
- See on which UI elements the translated phrase will be used. Especially if it's a button, it is very important to decide on the translation and not write alternative translations in parentheses, as this will significantly increase the width of the button, which is sometimes highly undesirable:
|
||||
|
||||
- If you decide to use autocorrect or any batch processing tool, the output requires very careful proofreading. It is very easy to make it do changes that break things big time.
|
||||
|
||||
- **Any formatting parts of the phrases must remain unchanged.** For example, you should not change `%1%` to `%1 %`, you should not change `%%` to `%` (for percent sign) and similar. This will lead to application crashes.
|
||||
|
||||
- Please pay attention to spaces, line breaks (\n) and punctuation marks. **Don't add extra line breaks.** This is especially important for parameter names.
|
||||
|
||||
- Description of the parameters should not contain units of measurement. For example, "Enable fan if layer print time is less than ~~n seconds~~"
|
||||
|
||||
- For units of measurement, use the international system of units. Use "s" instead of "sec".
|
||||
|
||||
- If the phrase doesn't have a dot at the end, don't add it. And if it does, then don't forget to :)
|
||||
|
||||
- It is useful to stick to the same terminology in the application (especially with basic terms such as "filament" and similar). Stay consistent. Otherwise it will confuse users.
|
||||
|
|
@ -1,47 +0,0 @@
|
|||
# Preset and Bundle
|
||||
|
||||
This page deals with the explanation for 3 classes in the code.
|
||||
|
||||
## [`Preset`](https://github.com/SoftFever/OrcaSlicer/blob/main/src/libslic3r/Preset.hpp)
|
||||
|
||||
As the name might suggest this class deals with presets for various things. It defines an enum `Type` which basically tells you what kind of data the present contains. Below are a few explained and there corresponding UI elements
|
||||
|
||||
> [!WARNING]
|
||||
> There is a lot of outdated and legacy code in the code base.
|
||||
|
||||
- `TYPE_PRINT`: Refers to a process preset. It's called 'Print' probably due to some legacy code.
|
||||
|
||||

|
||||
|
||||
- `TYPE_FILAMENT`: As the name suggests this preset is for filaments
|
||||
|
||||

|
||||
|
||||
- `TYPE_PRINTER`: Preset for printers.
|
||||
|
||||

|
||||
|
||||
There are other preset types but some of them are for SLA. Which is legacy code, since SLA printers are no longer supported. Above 3 are the important types.
|
||||
|
||||
## [`PresetBundle`](https://github.com/SoftFever/OrcaSlicer/blob/main/src/libslic3r/PresetBundle.hpp)
|
||||
|
||||
This is a bundle containing a few types of `PresetCollection`. One bundle has presets for some printers, filaments and some processes (TYPE_PRINT).
|
||||
|
||||
`PresetCollection prints`\
|
||||
`PresetCollection filaments`\
|
||||
`PrinterPresetCollection printers`
|
||||
|
||||
each one of these contains a collection of processes, filaments and printers respectively.\
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Printers, filaments and processes in the bundle don't all have to be compatible with each other. In fact all the saved presets are stored in one `PresetBundle`. The `PresetBundle` is loaded on start up. The list of filaments and processes shown for a particular printer is a subset of `filaments` and `prints` `PresetCollection`s.
|
||||
|
||||
## [`PresetCollection`](https://github.com/SoftFever/OrcaSlicer/blob/main/src/libslic3r/Preset.hpp)
|
||||
|
||||
`PrinterPresetCollection` is a class derived from `PresetCollection`.
|
||||
|
||||
These contain a collection of presets. The presets could be of any type.\
|
||||
functions of note here are:
|
||||
|
||||
`get_edited_preset()`: returns the current selected preset along with any modifications the user has made.\
|
||||
`get_selected_preset()`: returns the current selected preset without the modifications the user has made.
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
# Application Structure Overview
|
||||
|
||||
WIP...
|
||||
|
||||
> [!WARNING]
|
||||
> !! incomplete, possibly inaccurate, being updated with new info !!
|
||||
|
||||
## [`Plater`](https://github.com/SoftFever/OrcaSlicer/blob/main/src/slic3r/GUI/Plater.hpp)
|
||||
|
||||
Refers to the entire application. The whole view, file loading, project saving and loading is all managed by this class. This class contains members for the model viewer, the sidebar, gcode viewer and everything else.
|
||||
|
||||
## [`Sidebar`](https://github.com/SoftFever/OrcaSlicer/blob/main/src/slic3r/GUI/Plater.hpp)
|
||||
|
||||
This is relating the the sidebar in the application window
|
||||
|
||||

|
||||
|
||||
## [`ComboBox`](https://github.com/SoftFever/OrcaSlicer/blob/main/src/slic3r/GUI/Widgets/ComboBox.hpp)
|
||||
|
||||
The drop down menus where you can see and select presets
|
||||
|
||||

|
||||
|
||||
## [`Tab`](https://github.com/SoftFever/OrcaSlicer/blob/main/src/slic3r/GUI/Tab.hpp)
|
||||
|
||||
Refers to the various windows with settings. e.g. the Popup to edit printer or filament preset. Also the section to edit process preset and the object list. These 4 are managed by `TabPrinter`, `TabFilament`, `TabPrint` and `TabPrintModel` respectively.
|
||||
|
||||

|
||||
|
|
@ -1,44 +0,0 @@
|
|||
## Slicing Call Hierarchy
|
||||
|
||||
The Slicing logic is not the easiest to locate in the code base. Below is a flow diagram of function calls that are made after clicking the `Slice Plate` button in the UI. Most of the processing happens in different threads. Note the calls after `BackgroundSlicingProcess::start()`, but this is how you can find the slicing logic.
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["Slice plate"] --> B["void Plater::priv::on_action_slice_plate(SimpleEvent&)"]
|
||||
B --> C["void Plater::reslice()"]
|
||||
C --> D["bool Plater::priv::restart_background_process(unsigned int state)"]
|
||||
D --> E["bool BackgroundSlicingProcess::start()"]
|
||||
E --> F["void BackgroundSlicingProcess::thread_proc_safe_seh_throw()"]
|
||||
F --> G["unsigned long BackgroundSlicingProcess::thread_proc_safe_seh()"]
|
||||
G --> H["void BackgroundSlicingProcess::thread_proc_safe()"]
|
||||
H --> I["void BackgroundSlicingProcess::thread_proc()"]
|
||||
I --> J["void BackgroundSlicingProcess::call_process_seh_throw(std::exception_ptr &ex)"]
|
||||
J --> K["unsigned long BackgroundSlicingProcess::call_process_seh(std::exception_ptr &ex)"]
|
||||
K --> L["void BackgroundSlicingProcess::call_process(std::exception_ptr &ex)"]
|
||||
L --> M["void BackgroundSlicingProcess::process_fff()"]
|
||||
M --> N["void Print::process(long long *time_cost_with_cache, bool use_cache)"]
|
||||
N --> O["void PrintObject::make_perimeters()"]
|
||||
O --> P["void PrintObject::slice()"]
|
||||
|
||||
%% Labels for libraries
|
||||
subgraph G1 [libSlic3r_gui]
|
||||
B
|
||||
C
|
||||
D
|
||||
E
|
||||
F
|
||||
G
|
||||
H
|
||||
I
|
||||
J
|
||||
K
|
||||
L
|
||||
M
|
||||
end
|
||||
|
||||
subgraph G2 [libSlic3r]
|
||||
N
|
||||
O
|
||||
P
|
||||
end
|
||||
```
|
||||
|
Before Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 97 KiB |
|
Before Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 139 KiB |
|
Before Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 173 KiB |
|
Before Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 4.4 MiB |
|
Before Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 117 KiB |
|
Before Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 216 KiB |
|
Before Width: | Height: | Size: 125 KiB |
|
Before Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 93 KiB |
|
Before Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 141 KiB |
|
Before Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 6.5 KiB |
|
Before Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 17 KiB |