Compare commits

..
Author SHA1 Message Date
Hanif Koh b5023acce1 Validate Zip Entry Sizes Before Parsing 3MF XML
The 3MF importers read XML entries into a single expat buffer whose size is
an int, while the archive extraction used the entry's 64-bit declared size.
The two could disagree for entries declaring more than INT_MAX bytes.

Reject such entries before allocating, and use one size for the buffer, the
extraction and the parse. This applies to the BBS importer, the PrusaSlicer
importer and the PrusaSlicer fingerprint probe. The load now fails with an
error instead.
2026-09-28 05:58:03 +08:00
113 changed files with 730 additions and 1778 deletions
+45 -105
View File
@@ -1,7 +1,5 @@
name: Daily OFL OTA Update name: Daily OFL OTA Update
run-name: Daily OFL OTA Update [OFL barrier]
# This workflow is intended for creating and publishing the OrcaFilamentLibrary (OFL) OPC package to # This workflow is intended for creating and publishing the OrcaFilamentLibrary (OFL) OPC package to
# https://github.com/OrcaSlicer/orcaslicer-profiles, which generates an OTA update. # https://github.com/OrcaSlicer/orcaslicer-profiles, which generates an OTA update.
# This cronjob runs daily at 00:00 UTC every day and scans main plus every release/vX.Y.Z branch for # This cronjob runs daily at 00:00 UTC every day and scans main plus every release/vX.Y.Z branch for
@@ -14,9 +12,9 @@ run-name: Daily OFL OTA Update [OFL barrier]
# vendor-dispatch path is also what makes post_merge_profiles.yml call the OTA auto-publish API after # vendor-dispatch path is also what makes post_merge_profiles.yml call the OTA auto-publish API after
# uploading - see post_merge_profiles.yml for both sides of that contract. # uploading - see post_merge_profiles.yml for both sides of that contract.
# #
# Each run captures a timestamp, dispatches the needed OFL publishers, waits for # At the start of each run, the pending-publish table is cleared up to a captured
# all of them to finish, then clears the pending-publish table once. Changes merged # timestamp (POST /api/v1/ota/ofl/pending/clear?timestamp=...). Changes merged after
# after that timestamp remain pending for the next run. # that timestamp remain pending for the next run.
on: on:
schedule: schedule:
@@ -36,14 +34,32 @@ jobs:
if: ${{ github.repository == 'OrcaSlicer/OrcaSlicer' }} if: ${{ github.repository == 'OrcaSlicer/OrcaSlicer' }}
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
steps: steps:
- name: Capture start timestamp - name: Capture start timestamp and clear OFL pending queue
id: start id: start
shell: bash shell: bash
env:
OTA_API_BASE_URL: ${{ vars.OTA_API_BASE_URL }}
OTA_API_KEY: ${{ secrets.OFL_OTA_PUBLISH_KEY }}
run: | run: |
set -euo pipefail set -euo pipefail
[ -n "$OTA_API_BASE_URL" ] || { echo "::error::vars.OTA_API_BASE_URL is not set"; exit 1; }
[ -n "$OTA_API_KEY" ] || { echo "::error::secrets.OFL_OTA_PUBLISH_KEY is not set"; exit 1; }
timestamp="$(date -u +%s)" timestamp="$(date -u +%s)"
echo "timestamp=$timestamp" >> "$GITHUB_OUTPUT" echo "timestamp=$timestamp" >> "$GITHUB_OUTPUT"
resp_file="$RUNNER_TEMP/ota-pending-clear-response.json"
status="$(curl -sS -o "$resp_file" -w '%{http_code}' -X POST \
"${OTA_API_BASE_URL%/}/api/v1/ota/ofl/pending/clear?timestamp=$timestamp" \
-H "Authorization: Bearer $OTA_API_KEY")"
body="$(cat "$resp_file")"
echo "$body"
if [ "$status" != "200" ]; then
echo "::error::OTA pending-clear call failed with HTTP $status"
exit 1
fi
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v7 uses: actions/checkout@v7
with: with:
@@ -68,21 +84,27 @@ jobs:
| grep -E '^(main|release/v[0-9]+\.[0-9]+\.[0-9]+)$' | sort -u | grep -E '^(main|release/v[0-9]+\.[0-9]+\.[0-9]+)$' | sort -u
) )
# The cron run is the checkpoint: a successful run means every
# dispatched branch publisher completed and the pending queue was
# cleared. Manual or push-triggered post_merge_profiles runs are not
# checkpoints for this scan.
successful_cron_runs="$(gh api --method GET \
"repos/${{ github.repository }}/actions/workflows/ofl-ota-cronjob.yml/runs" \
-f status=success -f branch=main -f per_page=100 --paginate \
--jq '.workflow_runs[] | select((.display_title // "") | contains("[OFL barrier]"))')"
since="$(jq -rs 'sort_by(.run_started_at) | last.run_started_at // empty' <<< "$successful_cron_runs")"
for branch in "${branches[@]}"; do for branch in "${branches[@]}"; do
echo "::group::$branch" echo "::group::$branch"
# post_merge_profiles.yml's own run history, not this workflow's: this
# workflow only ever runs against main (schedule, or workflow_dispatch
# --ref main), so its head branch never varies - filtering ITS history
# by $branch would never match anything except main. post_merge_profiles.yml
# genuinely runs per-branch (this dispatch below sets --ref "$branch"),
# so its history is the real per-branch checkpoint. It also means a
# failed publish naturally gets retried tomorrow: the checkpoint only
# advances on a run that actually succeeded.
# --method GET is required, not cosmetic: gh api defaults to POST
# whenever -f fields are present unless a method is given
# explicitly, and POST on this list-runs endpoint 404s - confirmed
# on real Actions infrastructure, not just reasoned about.
since="$(gh api --method GET "repos/${{ github.repository }}/actions/workflows/post_merge_profiles.yml/runs" \
-f status=success -f branch="$branch" -f per_page=1 \
--jq '.workflow_runs[0].run_started_at // empty')"
if [ -z "$since" ]; then if [ -z "$since" ]; then
echo "No prior successful OFL cron run; checking $branch through $SCAN_UNTIL." echo "No prior successful run for $branch; checking OFL changes up to $SCAN_UNTIL."
changed_files="$(git log --until="$SCAN_UNTIL" --name-only --pretty=format: "origin/$branch" -- \ changed_files="$(git log --until="$SCAN_UNTIL" --name-only --pretty=format: "origin/$branch" -- \
resources/profiles/OrcaFilamentLibrary resources/profiles/OrcaFilamentLibrary.json \ resources/profiles/OrcaFilamentLibrary resources/profiles/OrcaFilamentLibrary.json \
| sed '/^$/d')" | sed '/^$/d')"
@@ -102,98 +124,16 @@ jobs:
fi fi
if [ "$changed" = true ]; then if [ "$changed" = true ]; then
dispatch_id="${GITHUB_RUN_ID}-${branch//\//-}" # Tolerate a per-branch failure (e.g. a pre-existing release branch
# Record successful dispatches for the barrier step below. # whose post_merge_profiles.yml predates the vendor/auto_publish
# Branches whose workflow predates workflow_dispatch are skipped # inputs) rather than aborting the whole scan under set -e.
# with a warning, as they were before the barrier was added. if ! gh workflow run post_merge_profiles.yml \
if gh workflow run post_merge_profiles.yml \
--repo "${{ github.repository }}" \ --repo "${{ github.repository }}" \
--ref "$branch" \ --ref "$branch" \
-f vendor="$VENDOR" -f auto_publish=true \ -f vendor="$VENDOR" -f auto_publish=true; then
-f ofl_cron_dispatch_id="$dispatch_id"; then echo "::warning::failed to dispatch post_merge_profiles.yml for $branch - its post_merge_profiles.yml at this ref may predate the vendor/auto_publish inputs"
printf '%s\t%s\n' "$branch" "$dispatch_id" >> "$RUNNER_TEMP/ofl-dispatches.tsv"
else
echo "::warning::skipping $branch because post_merge_profiles.yml could not be dispatched at that ref"
fi fi
fi fi
echo "::endgroup::" echo "::endgroup::"
done done
- name: Wait for OFL publishers
id: wait
shell: bash
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DISPATCHES_FILE: ${{ runner.temp }}/ofl-dispatches.tsv
run: |
set -euo pipefail
if [ ! -s "$DISPATCHES_FILE" ]; then
echo "No OFL publisher workflows were dispatched; pending queue will not be cleared."
echo "publishers_dispatched=false" >> "$GITHUB_OUTPUT"
exit 0
fi
: > "$RUNNER_TEMP/ofl-run-ids.tsv"
while IFS=$'\t' read -r branch dispatch_id; do
[ -n "$branch" ] || continue
echo "Waiting for OFL publisher on $branch ($dispatch_id)"
run_id=""
for _ in {1..120}; do
runs_json="$(gh api --method GET \
"repos/${{ github.repository }}/actions/workflows/post_merge_profiles.yml/runs" \
-f branch="$branch" -f event=workflow_dispatch -f per_page=100)"
run_id="$(jq -r --arg marker "[OFL cron $dispatch_id]" \
'[.workflow_runs[] | select((.display_title // "") | contains($marker))] \
| sort_by(.created_at) | last | .id // empty' <<< "$runs_json")"
[ -n "$run_id" ] && break
sleep 5
done
if [ -z "$run_id" ]; then
echo "::error::could not find dispatched post_merge_profiles run for $branch ($dispatch_id)"
exit 1
fi
printf '%s\t%s\n' "$branch" "$run_id" >> "$RUNNER_TEMP/ofl-run-ids.tsv"
done < "$DISPATCHES_FILE"
all_success=true
while IFS=$'\t' read -r branch run_id; do
[ -n "$run_id" ] || continue
echo "Watching OFL publisher run $run_id for $branch"
if ! gh run watch "$run_id" --repo "${{ github.repository }}" --exit-status; then
all_success=false
fi
done < "$RUNNER_TEMP/ofl-run-ids.tsv"
if [ "$all_success" != true ]; then
echo "::error::one or more OFL publisher workflows failed; pending queue will not be cleared"
exit 1
fi
echo "publishers_dispatched=true" >> "$GITHUB_OUTPUT"
- name: Clear OFL pending queue
if: steps.wait.outputs.publishers_dispatched == 'true'
shell: bash
env:
OTA_API_BASE_URL: ${{ vars.OTA_API_BASE_URL }}
OTA_API_KEY: ${{ secrets.OFL_OTA_PUBLISH_KEY }}
TIMESTAMP: ${{ steps.start.outputs.timestamp }}
run: |
set -euo pipefail
[ -n "$OTA_API_BASE_URL" ] || { echo "::error::vars.OTA_API_BASE_URL is not set"; exit 1; }
[ -n "$OTA_API_KEY" ] || { echo "::error::secrets.OFL_OTA_PUBLISH_KEY is not set"; exit 1; }
resp_file="$RUNNER_TEMP/ota-pending-clear-response.json"
status="$(curl -sS -o "$resp_file" -w '%{http_code}' -X POST \
"${OTA_API_BASE_URL%/}/api/v1/ota/ofl/pending/clear?timestamp=$TIMESTAMP" \
-H "Authorization: Bearer $OTA_API_KEY")"
body="$(cat "$resp_file")"
echo "$body"
if [ "$status" != "200" ]; then
echo "::error::OTA pending-clear call failed with HTTP $status"
exit 1
fi
-15
View File
@@ -1,14 +1,5 @@
name: Post-merge profiles name: Post-merge profiles
run-name: >-
Post-merge profiles${{
inputs.ofl_cron_dispatch_id != '' &&
inputs.vendor == 'OrcaFilamentLibrary' &&
(inputs.auto_publish == true || inputs.auto_publish == 'true') &&
format(' [OFL cron {0}]', inputs.ofl_cron_dispatch_id) ||
''
}}
# Push-triggered counterpart to check_profiles.yml (which only gates PRs). When a # Push-triggered counterpart to check_profiles.yml (which only gates PRs). When a
# profile change lands on main or a release branch, rebuild the affected vendors' # profile change lands on main or a release branch, rebuild the affected vendors'
# binary preset caches (<vendor>.opc) and publish each as a versioned ZIP asset on # binary preset caches (<vendor>.opc) and publish each as a versioned ZIP asset on
@@ -68,12 +59,6 @@ on:
required: false required: false
type: boolean type: boolean
default: false default: false
ofl_cron_dispatch_id:
description: >-
Unique marker supplied by the trusted OFL daily cron so it can find
and wait for this dispatched workflow run.
required: false
type: string
permissions: permissions:
contents: read contents: read
+55 -155
View File
@@ -1,6 +1,6 @@
{ {
"name": "Blocks", "name": "Blocks",
"version": "02.04.00.13", "version": "02.04.00.04",
"force_update": "0", "force_update": "0",
"description": "Blocks configurations", "description": "Blocks configurations",
"machine_model_list": [ "machine_model_list": [
@@ -43,8 +43,8 @@
"sub_path": "process/0.16mm Optimal 0.4 nozzle @Blocks_RF50.json" "sub_path": "process/0.16mm Optimal 0.4 nozzle @Blocks_RF50.json"
}, },
{ {
"name": "0.20mm Standard 0.4 nozzle @Blocks_Pro_S100", "name": "0.20mm Standard 0.4 nozzle @Blocks",
"sub_path": "process/0.20mm Standard 0.4 nozzle @Blocks_Pro_S100.json" "sub_path": "process/0.20mm Standard 0.4 nozzle @Blocks.json"
}, },
{ {
"name": "0.20mm Standard 0.4 nozzle @Blocks_RD50_V2", "name": "0.20mm Standard 0.4 nozzle @Blocks_RD50_V2",
@@ -55,8 +55,8 @@
"sub_path": "process/0.20mm Standard 0.4 nozzle @Blocks_RF50.json" "sub_path": "process/0.20mm Standard 0.4 nozzle @Blocks_RF50.json"
}, },
{ {
"name": "0.24mm Draft 0.4 nozzle @Blocks_Pro_S100", "name": "0.24mm Draft 0.4 nozzle @Blocks",
"sub_path": "process/0.24mm Draft 0.4 nozzle @Blocks_Pro_S100.json" "sub_path": "process/0.24mm Draft 0.4 nozzle @Blocks.json"
}, },
{ {
"name": "0.24mm Draft 0.4 nozzle @Blocks_RD50_V2", "name": "0.24mm Draft 0.4 nozzle @Blocks_RD50_V2",
@@ -75,8 +75,8 @@
"sub_path": "process/0.28mm Extra Draft 0.4 nozzle @Blocks_RF50.json" "sub_path": "process/0.28mm Extra Draft 0.4 nozzle @Blocks_RF50.json"
}, },
{ {
"name": "0.30mm Extra Draft 0.4 nozzle @Blocks_Pro_S100", "name": "0.30mm Extra Draft 0.4 nozzle @Blocks",
"sub_path": "process/0.30mm Extra Draft 0.4 nozzle @Blocks_Pro_S100.json" "sub_path": "process/0.30mm Extra Draft 0.4 nozzle @Blocks.json"
}, },
{ {
"name": "fdm_process_common 0.6 nozzle", "name": "fdm_process_common 0.6 nozzle",
@@ -111,8 +111,8 @@
"sub_path": "process/0.26mm Standard 0.6 nozzle @Blocks_RF50.json" "sub_path": "process/0.26mm Standard 0.6 nozzle @Blocks_RF50.json"
}, },
{ {
"name": "0.30mm Standard 0.6 nozzle @Blocks_Pro_S100", "name": "0.30mm Standard 0.6 nozzle @Blocks",
"sub_path": "process/0.30mm Standard 0.6 nozzle @Blocks_Pro_S100.json" "sub_path": "process/0.30mm Standard 0.6 nozzle @Blocks.json"
}, },
{ {
"name": "0.32mm Draft 0.6 nozzle @Blocks_RD50_V2", "name": "0.32mm Draft 0.6 nozzle @Blocks_RD50_V2",
@@ -131,12 +131,12 @@
"sub_path": "process/0.38mm Extra Draft 0.6 nozzle @Blocks_RF50.json" "sub_path": "process/0.38mm Extra Draft 0.6 nozzle @Blocks_RF50.json"
}, },
{ {
"name": "0.40mm Draft 0.6 nozzle @Blocks_Pro_S100", "name": "0.40mm Draft 0.6 nozzle @Blocks",
"sub_path": "process/0.40mm Draft 0.6 nozzle @Blocks_Pro_S100.json" "sub_path": "process/0.40mm Draft 0.6 nozzle @Blocks.json"
}, },
{ {
"name": "0.30mm Optimal 0.8 nozzle @Blocks_Pro_S100", "name": "0.30mm Optimal 0.8 nozzle @Blocks",
"sub_path": "process/0.30mm Optimal 0.8 nozzle @Blocks_Pro_S100.json" "sub_path": "process/0.30mm Optimal 0.8 nozzle @Blocks.json"
}, },
{ {
"name": "0.30mm Optimal 0.8 nozzle @Blocks_RD50_V2", "name": "0.30mm Optimal 0.8 nozzle @Blocks_RD50_V2",
@@ -155,8 +155,8 @@
"sub_path": "process/0.38mm Standard 0.8 nozzle @Blocks_RF50.json" "sub_path": "process/0.38mm Standard 0.8 nozzle @Blocks_RF50.json"
}, },
{ {
"name": "0.40mm Standard 0.8 nozzle @Blocks_Pro_S100", "name": "0.40mm Standard 0.8 nozzle @Blocks",
"sub_path": "process/0.40mm Standard 0.8 nozzle @Blocks_Pro_S100.json" "sub_path": "process/0.40mm Standard 0.8 nozzle @Blocks.json"
}, },
{ {
"name": "0.46mm Draft 0.8 nozzle @Blocks_RD50_V2", "name": "0.46mm Draft 0.8 nozzle @Blocks_RD50_V2",
@@ -167,8 +167,8 @@
"sub_path": "process/0.46mm Draft 0.8 nozzle @Blocks_RF50.json" "sub_path": "process/0.46mm Draft 0.8 nozzle @Blocks_RF50.json"
}, },
{ {
"name": "0.50mm Draft 0.8 nozzle @Blocks_Pro_S100", "name": "0.50mm Draft 0.8 nozzle @Blocks",
"sub_path": "process/0.50mm Draft 0.8 nozzle @Blocks_Pro_S100.json" "sub_path": "process/0.50mm Draft 0.8 nozzle @Blocks.json"
}, },
{ {
"name": "0.54mm Extra Draft 0.8 nozzle @Blocks_RD50_V2", "name": "0.54mm Extra Draft 0.8 nozzle @Blocks_RD50_V2",
@@ -179,36 +179,36 @@
"sub_path": "process/0.54mm Extra Draft 0.8 nozzle @Blocks_RF50.json" "sub_path": "process/0.54mm Extra Draft 0.8 nozzle @Blocks_RF50.json"
}, },
{ {
"name": "0.30mm Optimal 1.0 nozzle @Blocks_Pro_S100", "name": "0.30mm Optimal 1.0 nozzle @Blocks",
"sub_path": "process/0.30mm Optimal 1.0 nozzle @Blocks_Pro_S100.json" "sub_path": "process/0.30mm Optimal 1.0 nozzle @Blocks.json"
}, },
{ {
"name": "0.50mm Standard 1.0 nozzle @Blocks_Pro_S100", "name": "0.50mm Standard 1.0 nozzle @Blocks",
"sub_path": "process/0.50mm Standard 1.0 nozzle @Blocks_Pro_S100.json" "sub_path": "process/0.50mm Standard 1.0 nozzle @Blocks.json"
}, },
{ {
"name": "0.60mm Draft 1.0 nozzle @Blocks_Pro_S100", "name": "0.60mm Draft 1.0 nozzle @Blocks",
"sub_path": "process/0.60mm Draft 1.0 nozzle @Blocks_Pro_S100.json" "sub_path": "process/0.60mm Draft 1.0 nozzle @Blocks.json"
}, },
{ {
"name": "0.70mm Extra Draft 1.0 nozzle @Blocks_Pro_S100", "name": "0.70mm Extra Draft 1.0 nozzle @Blocks",
"sub_path": "process/0.70mm Extra Draft 1.0 nozzle @Blocks_Pro_S100.json" "sub_path": "process/0.70mm Extra Draft 1.0 nozzle @Blocks.json"
}, },
{ {
"name": "0.50mm Optimal 1.2 nozzle @Blocks_Pro_S100", "name": "0.50mm Optimal 1.2 nozzle @Blocks",
"sub_path": "process/0.50mm Optimal 1.2 nozzle @Blocks_Pro_S100.json" "sub_path": "process/0.50mm Optimal 1.2 nozzle @Blocks.json"
}, },
{ {
"name": "0.60mm Standard 1.2 nozzle @Blocks_Pro_S100", "name": "0.60mm Standard 1.2 nozzle @Blocks",
"sub_path": "process/0.60mm Standard 1.2 nozzle @Blocks_Pro_S100.json" "sub_path": "process/0.60mm Standard 1.2 nozzle @Blocks.json"
}, },
{ {
"name": "0.70mm Draft 1.2 nozzle @Blocks_Pro_S100", "name": "0.70mm Draft 1.2 nozzle @Blocks",
"sub_path": "process/0.70mm Draft 1.2 nozzle @Blocks_Pro_S100.json" "sub_path": "process/0.70mm Draft 1.2 nozzle @Blocks.json"
}, },
{ {
"name": "0.80mm Extra Draft 1.2 nozzle @Blocks_Pro_S100", "name": "0.80mm Extra Draft 1.2 nozzle @Blocks",
"sub_path": "process/0.80mm Extra Draft 1.2 nozzle @Blocks_Pro_S100.json" "sub_path": "process/0.80mm Extra Draft 1.2 nozzle @Blocks.json"
} }
], ],
"filament_list": [ "filament_list": [
@@ -249,148 +249,48 @@
"sub_path": "filament/fdm_filament_tpu.json" "sub_path": "filament/fdm_filament_tpu.json"
}, },
{ {
"name": "Blocks ABS @base", "name": "Generic ABS @Blocks",
"sub_path": "filament/Blocks ABS @base.json" "sub_path": "filament/Generic ABS @Blocks.json"
}, },
{ {
"name": "Blocks ASA @base", "name": "Generic ASA @Blocks",
"sub_path": "filament/Blocks ASA @base.json" "sub_path": "filament/Generic ASA @Blocks.json"
}, },
{ {
"name": "Blocks ASA-CF @base", "name": "Generic ASA-CF @Blocks",
"sub_path": "filament/Blocks ASA-CF @base.json" "sub_path": "filament/Generic ASA-CF @Blocks.json"
}, },
{ {
"name": "Blocks PA @base", "name": "Generic PA @Blocks",
"sub_path": "filament/Blocks PA @base.json" "sub_path": "filament/Generic PA @Blocks.json"
}, },
{ {
"name": "Blocks PA-CF @base", "name": "Generic PA-CF @Blocks",
"sub_path": "filament/Blocks PA-CF @base.json" "sub_path": "filament/Generic PA-CF @Blocks.json"
}, },
{ {
"name": "Blocks PC @base", "name": "Generic PC @Blocks",
"sub_path": "filament/Blocks PC @base.json" "sub_path": "filament/Generic PC @Blocks.json"
}, },
{ {
"name": "Blocks PETG @base", "name": "Generic PETG @Blocks",
"sub_path": "filament/Blocks PETG @base.json" "sub_path": "filament/Generic PETG @Blocks.json"
}, },
{ {
"name": "Blocks PLA @base", "name": "Generic PLA @Blocks",
"sub_path": "filament/Blocks PLA @base.json" "sub_path": "filament/Generic PLA @Blocks.json"
}, },
{ {
"name": "Blocks PLA-CF @base", "name": "Generic PLA-CF @Blocks",
"sub_path": "filament/Blocks PLA-CF @base.json" "sub_path": "filament/Generic PLA-CF @Blocks.json"
}, },
{ {
"name": "Blocks PVA @base", "name": "Generic PVA @Blocks",
"sub_path": "filament/Blocks PVA @base.json" "sub_path": "filament/Generic PVA @Blocks.json"
}, },
{ {
"name": "Blocks TPU @base", "name": "Generic TPU @Blocks",
"sub_path": "filament/Blocks TPU @base.json" "sub_path": "filament/Generic TPU @Blocks.json"
},
{
"name": "Blocks ABS @Blocks_RD50_V2",
"sub_path": "filament/Blocks ABS @Blocks_RD50_V2.json"
},
{
"name": "Blocks ABS @Blocks_RF50",
"sub_path": "filament/Blocks ABS @Blocks_RF50.json"
},
{
"name": "Blocks ASA @Blocks_RD50_V2",
"sub_path": "filament/Blocks ASA @Blocks_RD50_V2.json"
},
{
"name": "Blocks ASA @Blocks_RF50",
"sub_path": "filament/Blocks ASA @Blocks_RF50.json"
},
{
"name": "Blocks ASA-CF @Blocks_RD50_V2",
"sub_path": "filament/Blocks ASA-CF @Blocks_RD50_V2.json"
},
{
"name": "Blocks ASA-CF @Blocks_RF50",
"sub_path": "filament/Blocks ASA-CF @Blocks_RF50.json"
},
{
"name": "Blocks PA @Blocks_RD50_V2",
"sub_path": "filament/Blocks PA @Blocks_RD50_V2.json"
},
{
"name": "Blocks PA @Blocks_RF50",
"sub_path": "filament/Blocks PA @Blocks_RF50.json"
},
{
"name": "Blocks PA-CF @Blocks_RD50_V2",
"sub_path": "filament/Blocks PA-CF @Blocks_RD50_V2.json"
},
{
"name": "Blocks PA-CF @Blocks_RF50",
"sub_path": "filament/Blocks PA-CF @Blocks_RF50.json"
},
{
"name": "Blocks PC @Blocks_RD50_V2",
"sub_path": "filament/Blocks PC @Blocks_RD50_V2.json"
},
{
"name": "Blocks PC @Blocks_RF50",
"sub_path": "filament/Blocks PC @Blocks_RF50.json"
},
{
"name": "Blocks PETG @Blocks_Pro_S100",
"sub_path": "filament/Blocks PETG @Blocks_Pro_S100.json"
},
{
"name": "Blocks PETG @Blocks_RD50_V2",
"sub_path": "filament/Blocks PETG @Blocks_RD50_V2.json"
},
{
"name": "Blocks PETG @Blocks_RF50",
"sub_path": "filament/Blocks PETG @Blocks_RF50.json"
},
{
"name": "Blocks PLA @Blocks_Pro_S100",
"sub_path": "filament/Blocks PLA @Blocks_Pro_S100.json"
},
{
"name": "Blocks PLA @Blocks_RD50_V2",
"sub_path": "filament/Blocks PLA @Blocks_RD50_V2.json"
},
{
"name": "Blocks PLA @Blocks_RF50",
"sub_path": "filament/Blocks PLA @Blocks_RF50.json"
},
{
"name": "Blocks PLA-CF @Blocks_RD50_V2",
"sub_path": "filament/Blocks PLA-CF @Blocks_RD50_V2.json"
},
{
"name": "Blocks PLA-CF @Blocks_RF50",
"sub_path": "filament/Blocks PLA-CF @Blocks_RF50.json"
},
{
"name": "Blocks PVA @Blocks_RD50_V2",
"sub_path": "filament/Blocks PVA @Blocks_RD50_V2.json"
},
{
"name": "Blocks PVA @Blocks_RF50",
"sub_path": "filament/Blocks PVA @Blocks_RF50.json"
},
{
"name": "Blocks TPU @Blocks_Pro_S100",
"sub_path": "filament/Blocks TPU @Blocks_Pro_S100.json"
},
{
"name": "Blocks TPU @Blocks_RD50_V2",
"sub_path": "filament/Blocks TPU @Blocks_RD50_V2.json"
},
{
"name": "Blocks TPU @Blocks_RF50",
"sub_path": "filament/Blocks TPU @Blocks_RF50.json"
} }
], ],
"machine_list": [ "machine_list": [
@@ -1,14 +0,0 @@
{
"type": "filament",
"name": "Blocks ABS @Blocks_RD50_V2",
"inherits": "Blocks ABS @base",
"from": "system",
"setting_id": "qhQ0qQDGJgsueCAF",
"instantiation": "true",
"compatible_printers": [
"BLOCKS RD50 V2 0.4 nozzle",
"BLOCKS RD50 V2 0.6 nozzle",
"BLOCKS RD50 V2 0.8 nozzle"
],
"renamed_from": "Blocks Generic ABS;Generic ABS @Blocks"
}
@@ -1,13 +0,0 @@
{
"type": "filament",
"name": "Blocks ABS @Blocks_RF50",
"inherits": "Blocks ABS @base",
"from": "system",
"setting_id": "bGYMFFdKiROKuSiY",
"instantiation": "true",
"compatible_printers": [
"BLOCKS RF50 0.4 nozzle",
"BLOCKS RF50 0.6 nozzle",
"BLOCKS RF50 0.8 nozzle"
]
}
@@ -1,14 +0,0 @@
{
"type": "filament",
"name": "Blocks ASA @Blocks_RD50_V2",
"inherits": "Blocks ASA @base",
"from": "system",
"setting_id": "HW7xDXThvpVFbMq5",
"instantiation": "true",
"compatible_printers": [
"BLOCKS RD50 V2 0.4 nozzle",
"BLOCKS RD50 V2 0.6 nozzle",
"BLOCKS RD50 V2 0.8 nozzle"
],
"renamed_from": "Blocks Generic ASA;Generic ASA @Blocks"
}
@@ -1,13 +0,0 @@
{
"type": "filament",
"name": "Blocks ASA @Blocks_RF50",
"inherits": "Blocks ASA @base",
"from": "system",
"setting_id": "lBW7SCsvawi4icNU",
"instantiation": "true",
"compatible_printers": [
"BLOCKS RF50 0.4 nozzle",
"BLOCKS RF50 0.6 nozzle",
"BLOCKS RF50 0.8 nozzle"
]
}
@@ -1,14 +0,0 @@
{
"type": "filament",
"name": "Blocks ASA-CF @Blocks_RD50_V2",
"inherits": "Blocks ASA-CF @base",
"from": "system",
"setting_id": "x5ksnGLGGy1PgDns",
"instantiation": "true",
"compatible_printers": [
"BLOCKS RD50 V2 0.4 nozzle",
"BLOCKS RD50 V2 0.6 nozzle",
"BLOCKS RD50 V2 0.8 nozzle"
],
"renamed_from": "Blocks Generic ASA-CF;Generic ASA-CF @Blocks"
}
@@ -1,13 +0,0 @@
{
"type": "filament",
"name": "Blocks ASA-CF @Blocks_RF50",
"inherits": "Blocks ASA-CF @base",
"from": "system",
"setting_id": "pcbd5qFiMZAvDPg1",
"instantiation": "true",
"compatible_printers": [
"BLOCKS RF50 0.4 nozzle",
"BLOCKS RF50 0.6 nozzle",
"BLOCKS RF50 0.8 nozzle"
]
}
@@ -1,14 +0,0 @@
{
"type": "filament",
"name": "Blocks PA @Blocks_RD50_V2",
"inherits": "Blocks PA @base",
"from": "system",
"setting_id": "gxD81n2jjrReLD29",
"instantiation": "true",
"compatible_printers": [
"BLOCKS RD50 V2 0.4 nozzle",
"BLOCKS RD50 V2 0.6 nozzle",
"BLOCKS RD50 V2 0.8 nozzle"
],
"renamed_from": "Blocks Generic PA;Generic PA @Blocks"
}
@@ -1,13 +0,0 @@
{
"type": "filament",
"name": "Blocks PA @Blocks_RF50",
"inherits": "Blocks PA @base",
"from": "system",
"setting_id": "PzKxRMDnQUzVWRer",
"instantiation": "true",
"compatible_printers": [
"BLOCKS RF50 0.4 nozzle",
"BLOCKS RF50 0.6 nozzle",
"BLOCKS RF50 0.8 nozzle"
]
}
@@ -1,17 +0,0 @@
{
"type": "filament",
"name": "Blocks PA @base",
"inherits": "fdm_filament_pa",
"from": "system",
"filament_id": "OFidOgK4",
"instantiation": "false",
"filament_vendor": [
"Blocks"
],
"filament_flow_ratio": [
"0.98"
],
"filament_max_volumetric_speed": [
"10"
]
}
@@ -1,14 +0,0 @@
{
"type": "filament",
"name": "Blocks PA-CF @Blocks_RD50_V2",
"inherits": "Blocks PA-CF @base",
"from": "system",
"setting_id": "EtbeKx3rbhUo1TtM",
"instantiation": "true",
"compatible_printers": [
"BLOCKS RD50 V2 0.4 nozzle",
"BLOCKS RD50 V2 0.6 nozzle",
"BLOCKS RD50 V2 0.8 nozzle"
],
"renamed_from": "Blocks Generic PA-CF;Generic PA-CF @Blocks"
}
@@ -1,13 +0,0 @@
{
"type": "filament",
"name": "Blocks PA-CF @Blocks_RF50",
"inherits": "Blocks PA-CF @base",
"from": "system",
"setting_id": "udI8Q4X7HaPIaPt4",
"instantiation": "true",
"compatible_printers": [
"BLOCKS RF50 0.4 nozzle",
"BLOCKS RF50 0.6 nozzle",
"BLOCKS RF50 0.8 nozzle"
]
}
@@ -1,14 +0,0 @@
{
"type": "filament",
"name": "Blocks PC @Blocks_RD50_V2",
"inherits": "Blocks PC @base",
"from": "system",
"setting_id": "HLc0shWnKwJzSFyW",
"instantiation": "true",
"compatible_printers": [
"BLOCKS RD50 V2 0.4 nozzle",
"BLOCKS RD50 V2 0.6 nozzle",
"BLOCKS RD50 V2 0.8 nozzle"
],
"renamed_from": "Blocks Generic PC;Generic PC @Blocks"
}
@@ -1,13 +0,0 @@
{
"type": "filament",
"name": "Blocks PC @Blocks_RF50",
"inherits": "Blocks PC @base",
"from": "system",
"setting_id": "9a6bccZopMTeNHYu",
"instantiation": "true",
"compatible_printers": [
"BLOCKS RF50 0.4 nozzle",
"BLOCKS RF50 0.6 nozzle",
"BLOCKS RF50 0.8 nozzle"
]
}
@@ -1,17 +0,0 @@
{
"type": "filament",
"name": "Blocks PC @base",
"inherits": "fdm_filament_pc",
"from": "system",
"filament_id": "OFlGY0MN",
"instantiation": "false",
"filament_vendor": [
"Blocks"
],
"filament_flow_ratio": [
"0.94"
],
"filament_max_volumetric_speed": [
"10"
]
}
@@ -1,16 +0,0 @@
{
"type": "filament",
"name": "Blocks PETG @Blocks_Pro_S100",
"inherits": "Blocks PETG @base",
"from": "system",
"setting_id": "AhMR49fcFqtrQ6hI",
"instantiation": "true",
"compatible_printers": [
"BLOCKS Pro S100 0.4 nozzle",
"BLOCKS Pro S100 0.6 nozzle",
"BLOCKS Pro S100 0.8 nozzle",
"BLOCKS Pro S100 1.0 nozzle",
"BLOCKS Pro S100 1.2 nozzle"
],
"renamed_from": "Blocks Generic PETG;Generic PETG @Blocks"
}
@@ -1,13 +0,0 @@
{
"type": "filament",
"name": "Blocks PETG @Blocks_RD50_V2",
"inherits": "Blocks PETG @base",
"from": "system",
"setting_id": "3v7ah1zVG8MERPSJ",
"instantiation": "true",
"compatible_printers": [
"BLOCKS RD50 V2 0.4 nozzle",
"BLOCKS RD50 V2 0.6 nozzle",
"BLOCKS RD50 V2 0.8 nozzle"
]
}
@@ -1,13 +0,0 @@
{
"type": "filament",
"name": "Blocks PETG @Blocks_RF50",
"inherits": "Blocks PETG @base",
"from": "system",
"setting_id": "S7weR19wo9meJ6Yz",
"instantiation": "true",
"compatible_printers": [
"BLOCKS RF50 0.4 nozzle",
"BLOCKS RF50 0.6 nozzle",
"BLOCKS RF50 0.8 nozzle"
]
}
@@ -1,16 +0,0 @@
{
"type": "filament",
"name": "Blocks PLA @Blocks_Pro_S100",
"inherits": "Blocks PLA @base",
"from": "system",
"setting_id": "vWojuLYIfduLGFLL",
"instantiation": "true",
"compatible_printers": [
"BLOCKS Pro S100 0.4 nozzle",
"BLOCKS Pro S100 0.6 nozzle",
"BLOCKS Pro S100 0.8 nozzle",
"BLOCKS Pro S100 1.0 nozzle",
"BLOCKS Pro S100 1.2 nozzle"
],
"renamed_from": "Blocks Generic PLA;Generic PLA @Blocks"
}
@@ -1,13 +0,0 @@
{
"type": "filament",
"name": "Blocks PLA @Blocks_RD50_V2",
"inherits": "Blocks PLA @base",
"from": "system",
"setting_id": "y7y8NcXNdp17sJUs",
"instantiation": "true",
"compatible_printers": [
"BLOCKS RD50 V2 0.4 nozzle",
"BLOCKS RD50 V2 0.6 nozzle",
"BLOCKS RD50 V2 0.8 nozzle"
]
}
@@ -1,13 +0,0 @@
{
"type": "filament",
"name": "Blocks PLA @Blocks_RF50",
"inherits": "Blocks PLA @base",
"from": "system",
"setting_id": "jt1MJF4eZzkkscEJ",
"instantiation": "true",
"compatible_printers": [
"BLOCKS RF50 0.4 nozzle",
"BLOCKS RF50 0.6 nozzle",
"BLOCKS RF50 0.8 nozzle"
]
}
@@ -1,14 +0,0 @@
{
"type": "filament",
"name": "Blocks PLA-CF @Blocks_RD50_V2",
"inherits": "Blocks PLA-CF @base",
"from": "system",
"setting_id": "lhBtMKP1DmOB3HOI",
"instantiation": "true",
"compatible_printers": [
"BLOCKS RD50 V2 0.4 nozzle",
"BLOCKS RD50 V2 0.6 nozzle",
"BLOCKS RD50 V2 0.8 nozzle"
],
"renamed_from": "Blocks Generic PLA-CF;Generic PLA-CF @Blocks"
}
@@ -1,13 +0,0 @@
{
"type": "filament",
"name": "Blocks PLA-CF @Blocks_RF50",
"inherits": "Blocks PLA-CF @base",
"from": "system",
"setting_id": "6CU83mAyhcZ4FCPI",
"instantiation": "true",
"compatible_printers": [
"BLOCKS RF50 0.4 nozzle",
"BLOCKS RF50 0.6 nozzle",
"BLOCKS RF50 0.8 nozzle"
]
}
@@ -1,23 +0,0 @@
{
"type": "filament",
"name": "Blocks PLA-CF @base",
"inherits": "fdm_filament_pla",
"from": "system",
"filament_id": "OF6FfwOP",
"instantiation": "false",
"filament_vendor": [
"Blocks"
],
"filament_flow_ratio": [
"0.95"
],
"filament_max_volumetric_speed": [
"20"
],
"filament_type": [
"PLA-CF"
],
"slow_down_layer_time": [
"7"
]
}
@@ -1,14 +0,0 @@
{
"type": "filament",
"name": "Blocks PVA @Blocks_RD50_V2",
"inherits": "Blocks PVA @base",
"from": "system",
"setting_id": "hREDqwKF6qyKkakp",
"instantiation": "true",
"compatible_printers": [
"BLOCKS RD50 V2 0.4 nozzle",
"BLOCKS RD50 V2 0.6 nozzle",
"BLOCKS RD50 V2 0.8 nozzle"
],
"renamed_from": "Blocks Generic PVA;Generic PVA @Blocks"
}
@@ -1,13 +0,0 @@
{
"type": "filament",
"name": "Blocks PVA @Blocks_RF50",
"inherits": "Blocks PVA @base",
"from": "system",
"setting_id": "q6pKqHY7Iz4OZaAC",
"instantiation": "true",
"compatible_printers": [
"BLOCKS RF50 0.4 nozzle",
"BLOCKS RF50 0.6 nozzle",
"BLOCKS RF50 0.8 nozzle"
]
}
@@ -1,17 +0,0 @@
{
"type": "filament",
"name": "Blocks PVA @base",
"inherits": "fdm_filament_pva",
"from": "system",
"filament_id": "OFqcNuE1",
"instantiation": "false",
"filament_vendor": [
"Blocks"
],
"filament_flow_ratio": [
"0.98"
],
"filament_max_volumetric_speed": [
"20"
]
}
@@ -1,16 +0,0 @@
{
"type": "filament",
"name": "Blocks TPU @Blocks_Pro_S100",
"inherits": "Blocks TPU @base",
"from": "system",
"setting_id": "6Rkz2je91JRTRoTi",
"instantiation": "true",
"compatible_printers": [
"BLOCKS Pro S100 0.4 nozzle",
"BLOCKS Pro S100 0.6 nozzle",
"BLOCKS Pro S100 0.8 nozzle",
"BLOCKS Pro S100 1.0 nozzle",
"BLOCKS Pro S100 1.2 nozzle"
],
"renamed_from": "Blocks Generic TPU;Generic TPU @Blocks"
}
@@ -1,13 +0,0 @@
{
"type": "filament",
"name": "Blocks TPU @Blocks_RD50_V2",
"inherits": "Blocks TPU @base",
"from": "system",
"setting_id": "mkCqRQTtXldzoEUg",
"instantiation": "true",
"compatible_printers": [
"BLOCKS RD50 V2 0.4 nozzle",
"BLOCKS RD50 V2 0.6 nozzle",
"BLOCKS RD50 V2 0.8 nozzle"
]
}
@@ -1,13 +0,0 @@
{
"type": "filament",
"name": "Blocks TPU @Blocks_RF50",
"inherits": "Blocks TPU @base",
"from": "system",
"setting_id": "bCCvu5Ow1JkwIrRR",
"instantiation": "true",
"compatible_printers": [
"BLOCKS RF50 0.4 nozzle",
"BLOCKS RF50 0.6 nozzle",
"BLOCKS RF50 0.8 nozzle"
]
}
@@ -1,13 +1,12 @@
{ {
"type": "filament", "type": "filament",
"name": "Blocks ABS @base", "name": "Generic ABS @Blocks",
"inherits": "fdm_filament_abs", "inherits": "fdm_filament_abs",
"renamed_from": "Blocks Generic ABS",
"from": "system", "from": "system",
"filament_id": "OFBBhiX8", "setting_id": "TL1Q1kA4t36GGObG",
"instantiation": "false", "filament_id": "OFY9muEs",
"filament_vendor": [ "instantiation": "true",
"Blocks"
],
"filament_flow_ratio": [ "filament_flow_ratio": [
"0.95" "0.95"
], ],
@@ -82,5 +81,13 @@
], ],
"during_print_exhaust_fan_speed": [ "during_print_exhaust_fan_speed": [
"100" "100"
],
"compatible_printers": [
"BLOCKS RD50 V2 0.4 nozzle",
"BLOCKS RD50 V2 0.6 nozzle",
"BLOCKS RD50 V2 0.8 nozzle",
"BLOCKS RF50 0.4 nozzle",
"BLOCKS RF50 0.6 nozzle",
"BLOCKS RF50 0.8 nozzle"
] ]
} }
@@ -1,13 +1,12 @@
{ {
"type": "filament", "type": "filament",
"name": "Blocks ASA @base", "name": "Generic ASA @Blocks",
"inherits": "fdm_filament_asa", "inherits": "fdm_filament_asa",
"renamed_from": "Blocks Generic ASA",
"from": "system", "from": "system",
"filament_id": "OFTz2YXa", "setting_id": "xP7cB4RHgbm4cYDD",
"instantiation": "false", "filament_id": "OFLPAxz3",
"filament_vendor": [ "instantiation": "true",
"Blocks"
],
"filament_flow_ratio": [ "filament_flow_ratio": [
"0.95" "0.95"
], ],
@@ -82,5 +81,13 @@
], ],
"during_print_exhaust_fan_speed": [ "during_print_exhaust_fan_speed": [
"100" "100"
],
"compatible_printers": [
"BLOCKS RD50 V2 0.4 nozzle",
"BLOCKS RD50 V2 0.6 nozzle",
"BLOCKS RD50 V2 0.8 nozzle",
"BLOCKS RF50 0.4 nozzle",
"BLOCKS RF50 0.6 nozzle",
"BLOCKS RF50 0.8 nozzle"
] ]
} }
@@ -1,13 +1,12 @@
{ {
"type": "filament", "type": "filament",
"name": "Blocks ASA-CF @base", "name": "Generic ASA-CF @Blocks",
"inherits": "fdm_filament_asa", "inherits": "fdm_filament_asa",
"renamed_from": "Blocks Generic ASA-CF",
"from": "system", "from": "system",
"filament_id": "OF8b9I7o", "setting_id": "ju4ue7yJoz3ujny6",
"instantiation": "false", "filament_id": "OF53eLVD",
"filament_vendor": [ "instantiation": "true",
"Blocks"
],
"filament_type": [ "filament_type": [
"ASA-CF" "ASA-CF"
], ],
@@ -85,5 +84,13 @@
], ],
"during_print_exhaust_fan_speed": [ "during_print_exhaust_fan_speed": [
"100" "100"
],
"compatible_printers": [
"BLOCKS RD50 V2 0.4 nozzle",
"BLOCKS RD50 V2 0.6 nozzle",
"BLOCKS RD50 V2 0.8 nozzle",
"BLOCKS RF50 0.4 nozzle",
"BLOCKS RF50 0.6 nozzle",
"BLOCKS RF50 0.8 nozzle"
] ]
} }
@@ -0,0 +1,24 @@
{
"type": "filament",
"name": "Generic PA @Blocks",
"inherits": "fdm_filament_pa",
"renamed_from": "Blocks Generic PA",
"from": "system",
"setting_id": "hL3p8gAeciwDkjNK",
"filament_id": "OFg8ndtj",
"instantiation": "true",
"filament_flow_ratio": [
"0.98"
],
"filament_max_volumetric_speed": [
"10"
],
"compatible_printers": [
"BLOCKS RD50 V2 0.4 nozzle",
"BLOCKS RD50 V2 0.6 nozzle",
"BLOCKS RD50 V2 0.8 nozzle",
"BLOCKS RF50 0.4 nozzle",
"BLOCKS RF50 0.6 nozzle",
"BLOCKS RF50 0.8 nozzle"
]
}
@@ -1,13 +1,12 @@
{ {
"type": "filament", "type": "filament",
"name": "Blocks PA-CF @base", "name": "Generic PA-CF @Blocks",
"inherits": "fdm_filament_pa", "inherits": "fdm_filament_pa",
"renamed_from": "Blocks Generic PA-CF",
"from": "system", "from": "system",
"filament_id": "OFdWrXpL", "setting_id": "T6SO0WRdnG6wcyG8",
"instantiation": "false", "filament_id": "OFQLcbps",
"filament_vendor": [ "instantiation": "true",
"Blocks"
],
"filament_type": [ "filament_type": [
"PA-CF" "PA-CF"
], ],
@@ -88,5 +87,13 @@
], ],
"during_print_exhaust_fan_speed": [ "during_print_exhaust_fan_speed": [
"80" "80"
],
"compatible_printers": [
"BLOCKS RD50 V2 0.4 nozzle",
"BLOCKS RD50 V2 0.6 nozzle",
"BLOCKS RD50 V2 0.8 nozzle",
"BLOCKS RF50 0.4 nozzle",
"BLOCKS RF50 0.6 nozzle",
"BLOCKS RF50 0.8 nozzle"
] ]
} }
@@ -0,0 +1,24 @@
{
"type": "filament",
"name": "Generic PC @Blocks",
"inherits": "fdm_filament_pc",
"renamed_from": "Blocks Generic PC",
"from": "system",
"setting_id": "Xhs8PjtmwwVj0ksE",
"filament_id": "OFLakOUI",
"instantiation": "true",
"filament_flow_ratio": [
"0.94"
],
"filament_max_volumetric_speed": [
"10"
],
"compatible_printers": [
"BLOCKS RD50 V2 0.4 nozzle",
"BLOCKS RD50 V2 0.6 nozzle",
"BLOCKS RD50 V2 0.8 nozzle",
"BLOCKS RF50 0.4 nozzle",
"BLOCKS RF50 0.6 nozzle",
"BLOCKS RF50 0.8 nozzle"
]
}
@@ -1,13 +1,12 @@
{ {
"type": "filament", "type": "filament",
"name": "Blocks PETG @base", "name": "Generic PETG @Blocks",
"inherits": "fdm_filament_petg", "inherits": "fdm_filament_petg",
"renamed_from": "Blocks Generic PETG",
"from": "system", "from": "system",
"filament_id": "OF9t1Ga0", "setting_id": "NgzPlYItKHbmGgv3",
"instantiation": "false", "filament_id": "OFYPdQJh",
"filament_vendor": [ "instantiation": "true",
"Blocks"
],
"filament_flow_ratio": [ "filament_flow_ratio": [
"0.94" "0.94"
], ],
@@ -82,5 +81,18 @@
], ],
"slow_down_layer_time": [ "slow_down_layer_time": [
"5" "5"
],
"compatible_printers": [
"BLOCKS Pro S100 0.4 nozzle",
"BLOCKS Pro S100 0.6 nozzle",
"BLOCKS Pro S100 0.8 nozzle",
"BLOCKS Pro S100 1.0 nozzle",
"BLOCKS Pro S100 1.2 nozzle",
"BLOCKS RD50 V2 0.4 nozzle",
"BLOCKS RD50 V2 0.6 nozzle",
"BLOCKS RD50 V2 0.8 nozzle",
"BLOCKS RF50 0.4 nozzle",
"BLOCKS RF50 0.6 nozzle",
"BLOCKS RF50 0.8 nozzle"
] ]
} }
@@ -1,13 +1,12 @@
{ {
"type": "filament", "type": "filament",
"name": "Blocks PLA @base", "name": "Generic PLA @Blocks",
"inherits": "fdm_filament_pla", "inherits": "fdm_filament_pla",
"renamed_from": "Blocks Generic PLA",
"from": "system", "from": "system",
"filament_id": "OFVGAC8g", "setting_id": "kjhuttx4T8OtTNmV",
"instantiation": "false", "filament_id": "OFDSrzZ8",
"filament_vendor": [ "instantiation": "true",
"Blocks"
],
"filament_flow_ratio": [ "filament_flow_ratio": [
"0.95" "0.95"
], ],
@@ -40,5 +39,18 @@
], ],
"during_print_exhaust_fan_speed": [ "during_print_exhaust_fan_speed": [
"100" "100"
],
"compatible_printers": [
"BLOCKS Pro S100 0.4 nozzle",
"BLOCKS Pro S100 0.6 nozzle",
"BLOCKS Pro S100 0.8 nozzle",
"BLOCKS Pro S100 1.0 nozzle",
"BLOCKS Pro S100 1.2 nozzle",
"BLOCKS RD50 V2 0.4 nozzle",
"BLOCKS RD50 V2 0.6 nozzle",
"BLOCKS RD50 V2 0.8 nozzle",
"BLOCKS RF50 0.4 nozzle",
"BLOCKS RF50 0.6 nozzle",
"BLOCKS RF50 0.8 nozzle"
] ]
} }
@@ -0,0 +1,30 @@
{
"type": "filament",
"name": "Generic PLA-CF @Blocks",
"inherits": "fdm_filament_pla",
"renamed_from": "Blocks Generic PLA-CF",
"from": "system",
"setting_id": "oKUqzwAWMrpiyGLf",
"filament_id": "OFWbdGsC",
"instantiation": "true",
"filament_flow_ratio": [
"0.95"
],
"filament_max_volumetric_speed": [
"20"
],
"filament_type": [
"PLA-CF"
],
"slow_down_layer_time": [
"7"
],
"compatible_printers": [
"BLOCKS RD50 V2 0.4 nozzle",
"BLOCKS RD50 V2 0.6 nozzle",
"BLOCKS RD50 V2 0.8 nozzle",
"BLOCKS RF50 0.4 nozzle",
"BLOCKS RF50 0.6 nozzle",
"BLOCKS RF50 0.8 nozzle"
]
}
@@ -0,0 +1,24 @@
{
"type": "filament",
"name": "Generic PVA @Blocks",
"inherits": "fdm_filament_pva",
"renamed_from": "Blocks Generic PVA",
"from": "system",
"setting_id": "tNw3oe7VovLkgUbB",
"filament_id": "OFDvXujf",
"instantiation": "true",
"filament_flow_ratio": [
"0.98"
],
"filament_max_volumetric_speed": [
"20"
],
"compatible_printers": [
"BLOCKS RD50 V2 0.4 nozzle",
"BLOCKS RD50 V2 0.6 nozzle",
"BLOCKS RD50 V2 0.8 nozzle",
"BLOCKS RF50 0.4 nozzle",
"BLOCKS RF50 0.6 nozzle",
"BLOCKS RF50 0.8 nozzle"
]
}
@@ -1,13 +1,12 @@
{ {
"type": "filament", "type": "filament",
"name": "Blocks TPU @base", "name": "Generic TPU @Blocks",
"inherits": "fdm_filament_tpu", "inherits": "fdm_filament_tpu",
"renamed_from": "Blocks Generic TPU",
"from": "system", "from": "system",
"filament_id": "OFYnedOZ", "setting_id": "6iVYOCZo8ugs4JA0",
"instantiation": "false", "filament_id": "OFgbpcy9",
"filament_vendor": [ "instantiation": "true",
"Blocks"
],
"filament_max_volumetric_speed": [ "filament_max_volumetric_speed": [
"4" "4"
], ],
@@ -55,5 +54,18 @@
], ],
"during_print_exhaust_fan_speed": [ "during_print_exhaust_fan_speed": [
"80" "80"
],
"compatible_printers": [
"BLOCKS Pro S100 0.4 nozzle",
"BLOCKS Pro S100 0.6 nozzle",
"BLOCKS Pro S100 0.8 nozzle",
"BLOCKS Pro S100 1.0 nozzle",
"BLOCKS Pro S100 1.2 nozzle",
"BLOCKS RD50 V2 0.4 nozzle",
"BLOCKS RD50 V2 0.6 nozzle",
"BLOCKS RD50 V2 0.8 nozzle",
"BLOCKS RF50 0.4 nozzle",
"BLOCKS RF50 0.6 nozzle",
"BLOCKS RF50 0.8 nozzle"
] ]
} }
@@ -6,7 +6,7 @@
"setting_id": "G7HQgaspHXduDM8O", "setting_id": "G7HQgaspHXduDM8O",
"instantiation": "true", "instantiation": "true",
"printer_model": "BLOCKS Pro S100", "printer_model": "BLOCKS Pro S100",
"default_print_profile": "0.20mm Standard 0.4 nozzle @Blocks_Pro_S100", "default_print_profile": "0.20mm Standard 0.4 nozzle @Blocks",
"max_layer_height": [ "max_layer_height": [
"0.30" "0.30"
], ],
@@ -25,8 +25,5 @@
"printable_height": "900", "printable_height": "900",
"upward_compatible_machine": [ "upward_compatible_machine": [
"BLOCKS Pro S100" "BLOCKS Pro S100"
],
"default_filament_profile": [
"Blocks PLA @Blocks_Pro_S100"
] ]
} }
@@ -6,7 +6,7 @@
"setting_id": "XkWdS210oUMQN17N", "setting_id": "XkWdS210oUMQN17N",
"instantiation": "true", "instantiation": "true",
"printer_model": "BLOCKS Pro S100", "printer_model": "BLOCKS Pro S100",
"default_print_profile": "0.30mm Standard 0.6 nozzle @Blocks_Pro_S100", "default_print_profile": "0.30mm Standard 0.6 nozzle @Blocks",
"max_layer_height": [ "max_layer_height": [
"0.50" "0.50"
], ],
@@ -26,8 +26,5 @@
"upward_compatible_machine": [ "upward_compatible_machine": [
"BLOCKS Pro S100" "BLOCKS Pro S100"
], ],
"printer_variant": "0.6", "printer_variant": "0.6"
"default_filament_profile": [
"Blocks PLA @Blocks_Pro_S100"
]
} }
@@ -6,7 +6,7 @@
"setting_id": "I6PdeCS7SbvIlkZf", "setting_id": "I6PdeCS7SbvIlkZf",
"instantiation": "true", "instantiation": "true",
"printer_model": "BLOCKS Pro S100", "printer_model": "BLOCKS Pro S100",
"default_print_profile": "0.40mm Standard 0.8 nozzle @Blocks_Pro_S100", "default_print_profile": "0.40mm Standard 0.8 nozzle @Blocks",
"max_layer_height": [ "max_layer_height": [
"0.56" "0.56"
], ],
@@ -26,8 +26,5 @@
"upward_compatible_machine": [ "upward_compatible_machine": [
"BLOCKS Pro S100" "BLOCKS Pro S100"
], ],
"printer_variant": "0.8", "printer_variant": "0.8"
"default_filament_profile": [
"Blocks PLA @Blocks_Pro_S100"
]
} }
@@ -6,7 +6,7 @@
"setting_id": "elLdUyy9RhUoa37o", "setting_id": "elLdUyy9RhUoa37o",
"instantiation": "true", "instantiation": "true",
"printer_model": "BLOCKS Pro S100", "printer_model": "BLOCKS Pro S100",
"default_print_profile": "0.50mm Standard 1.0 nozzle @Blocks_Pro_S100", "default_print_profile": "0.50mm Standard 1.0 nozzle @Blocks",
"max_layer_height": [ "max_layer_height": [
"0.7" "0.7"
], ],
@@ -26,8 +26,5 @@
"upward_compatible_machine": [ "upward_compatible_machine": [
"BLOCKS Pro S100" "BLOCKS Pro S100"
], ],
"printer_variant": "1.0", "printer_variant": "1.0"
"default_filament_profile": [
"Blocks PLA @Blocks_Pro_S100"
]
} }
@@ -6,7 +6,7 @@
"setting_id": "xtsGSJ4JkbHTPi44", "setting_id": "xtsGSJ4JkbHTPi44",
"instantiation": "true", "instantiation": "true",
"printer_model": "BLOCKS Pro S100", "printer_model": "BLOCKS Pro S100",
"default_print_profile": "0.60mm Standard 1.2 nozzle @Blocks_Pro_S100", "default_print_profile": "0.60mm Standard 1.2 nozzle @Blocks",
"max_layer_height": [ "max_layer_height": [
"0.8" "0.8"
], ],
@@ -26,8 +26,5 @@
"upward_compatible_machine": [ "upward_compatible_machine": [
"BLOCKS Pro S100" "BLOCKS Pro S100"
], ],
"printer_variant": "1.2", "printer_variant": "1.2"
"default_filament_profile": [
"Blocks PLA @Blocks_Pro_S100"
]
} }
@@ -8,5 +8,5 @@
"bed_model": "PRO S100 HotBed model.stl", "bed_model": "PRO S100 HotBed model.stl",
"bed_texture": "PRO S100 HotBed texture.svg", "bed_texture": "PRO S100 HotBed texture.svg",
"hotend_model": "BLOCKS PrintCore.stl", "hotend_model": "BLOCKS PrintCore.stl",
"default_materials": "Blocks PLA @Blocks_Pro_S100;Blocks PETG @Blocks_Pro_S100;Blocks TPU @Blocks_Pro_S100" "default_materials": "Generic PLA @Blocks;Generic PETG @Blocks;Generic TPU @Blocks"
} }
@@ -34,9 +34,5 @@
"printable_height": "500", "printable_height": "500",
"upward_compatible_machine": [ "upward_compatible_machine": [
"BLOCKS RD50 V2" "BLOCKS RD50 V2"
],
"printer_variant": "0.4",
"default_filament_profile": [
"Blocks PLA @Blocks_RD50_V2"
] ]
} }
@@ -35,8 +35,5 @@
"deretraction_speed": [ "deretraction_speed": [
"80" "80"
], ],
"printer_variant": "0.6", "printer_variant": "0.6"
"default_filament_profile": [
"Blocks PLA @Blocks_RD50_V2"
]
} }
@@ -35,8 +35,5 @@
"deretraction_speed": [ "deretraction_speed": [
"80" "80"
], ],
"printer_variant": "0.8", "printer_variant": "0.8"
"default_filament_profile": [
"Blocks PLA @Blocks_RD50_V2"
]
} }
@@ -8,5 +8,5 @@
"bed_model": "RD50 V2 HotBed model.stl", "bed_model": "RD50 V2 HotBed model.stl",
"bed_texture": "RD50 V2 HotBed texture.svg", "bed_texture": "RD50 V2 HotBed texture.svg",
"hotend_model": "BLOCKS PrintCore.stl", "hotend_model": "BLOCKS PrintCore.stl",
"default_materials": "Blocks PLA @Blocks_RD50_V2;Blocks PETG @Blocks_RD50_V2;Blocks TPU @Blocks_RD50_V2" "default_materials": "Generic PLA @Blocks;Generic PETG @Blocks;Generic TPU @Blocks"
} }
@@ -51,7 +51,7 @@
"12" "12"
], ],
"retraction_length": [ "retraction_length": [
"1.2" "1"
], ],
"retraction_speed": [ "retraction_speed": [
"60" "60"
@@ -79,10 +79,5 @@
], ],
"retract_before_wipe": [ "retract_before_wipe": [
"0" "0"
], ]
"default_filament_profile": [
"Blocks PLA @Blocks_RF50"
],
"support_multi_bed_types": "1",
"default_bed_type": "Textured PEI Plate"
} }
@@ -51,7 +51,7 @@
"12" "12"
], ],
"retraction_length": [ "retraction_length": [
"1.2" "1"
], ],
"retraction_speed": [ "retraction_speed": [
"60" "60"
@@ -75,8 +75,8 @@
"BLOCKS RF50" "BLOCKS RF50"
], ],
"machine_start_gcode": [ "machine_start_gcode": [
"PRINT_START EXTRUDER=[nozzle_temperature_initial_layer] BED=[bed_temperature_initial_layer]\n", "PRINT_START EXTRUDER=[nozzle_temperature_initial_layer] BED=[bed_temperature_initial_layer]",
"SET_PRESSURE_ADVANCE ADVANCE=0.046\n" "SET_PRESSURE_ADVANCE ADVANCE=0.046"
], ],
"printer_variant": "0.6", "printer_variant": "0.6",
"wipe_distance": [ "wipe_distance": [
@@ -84,10 +84,5 @@
], ],
"retract_before_wipe": [ "retract_before_wipe": [
"0" "0"
], ]
"default_filament_profile": [
"Blocks PLA @Blocks_RF50"
],
"support_multi_bed_types": "1",
"default_bed_type": "Textured PEI Plate"
} }
@@ -51,7 +51,7 @@
"12" "12"
], ],
"retraction_length": [ "retraction_length": [
"1.2" "1"
], ],
"retraction_speed": [ "retraction_speed": [
"60" "60"
@@ -80,10 +80,5 @@
], ],
"retract_before_wipe": [ "retract_before_wipe": [
"0" "0"
], ]
"default_filament_profile": [
"Blocks PLA @Blocks_RF50"
],
"support_multi_bed_types": "1",
"default_bed_type": "Textured PEI Plate"
} }
@@ -8,6 +8,5 @@
"bed_model": "RF50 HotBed model.stl", "bed_model": "RF50 HotBed model.stl",
"bed_texture": "RF50 HotBed texture.svg", "bed_texture": "RF50 HotBed texture.svg",
"hotend_model": "BLOCKS PrintCore.stl", "hotend_model": "BLOCKS PrintCore.stl",
"default_materials": "Blocks PLA @Blocks_RF50;Blocks PETG @Blocks_RF50;Blocks TPU @Blocks_RF50", "default_materials": "Generic PLA @Blocks;Generic PETG @Blocks;Generic TPU @Blocks"
"not_support_bed_type": "Smooth Cool Plate;Engineering Plate;Textured Cool Plate;Cool Plate (SuperTack)"
} }
@@ -123,6 +123,9 @@
"wipe": [ "wipe": [
"1" "1"
], ],
"default_filament_profile": [
"Generic PLA @Blocks"
],
"bed_exclude_area": [ "bed_exclude_area": [
"0x0" "0x0"
], ],
@@ -21,7 +21,7 @@
"top_solid_infill_flow_ratio": "0.97", "top_solid_infill_flow_ratio": "0.97",
"bottom_solid_infill_flow_ratio": "1.08", "bottom_solid_infill_flow_ratio": "1.08",
"seam_position": "aligned", "seam_position": "aligned",
"sparse_infill_pattern": "grid", "sparse_infill_patter": "grid",
"initial_layer_speed": "60", "initial_layer_speed": "60",
"initial_layer_infill_speed": "80", "initial_layer_infill_speed": "80",
"initial_travel_speed": "100%", "initial_travel_speed": "100%",
@@ -57,7 +57,5 @@
"accel_to_decel_enable": "1", "accel_to_decel_enable": "1",
"accel_to_decel_factor": "50%", "accel_to_decel_factor": "50%",
"elefant_foot_compensation": "0.25", "elefant_foot_compensation": "0.25",
"elefant_foot_compensation_layers": "1", "elefant_foot_compensation_layers": "1"
"skirt_loops": "2",
"skirt_type": "perobject"
} }
@@ -21,7 +21,7 @@
"top_solid_infill_flow_ratio": "0.97", "top_solid_infill_flow_ratio": "0.97",
"bottom_solid_infill_flow_ratio": "1.08", "bottom_solid_infill_flow_ratio": "1.08",
"seam_position": "aligned", "seam_position": "aligned",
"sparse_infill_pattern": "grid", "sparse_infill_patter": "grid",
"initial_layer_speed": "60", "initial_layer_speed": "60",
"initial_layer_infill_speed": "80", "initial_layer_infill_speed": "80",
"initial_travel_speed": "100%", "initial_travel_speed": "100%",
@@ -57,7 +57,5 @@
"accel_to_decel_enable": "1", "accel_to_decel_enable": "1",
"accel_to_decel_factor": "50%", "accel_to_decel_factor": "50%",
"elefant_foot_compensation": "0.25", "elefant_foot_compensation": "0.25",
"elefant_foot_compensation_layers": "1", "elefant_foot_compensation_layers": "1"
"skirt_loops": "2",
"skirt_type": "perobject"
} }
@@ -21,7 +21,7 @@
"top_solid_infill_flow_ratio": "0.97", "top_solid_infill_flow_ratio": "0.97",
"bottom_solid_infill_flow_ratio": "1.08", "bottom_solid_infill_flow_ratio": "1.08",
"seam_position": "aligned", "seam_position": "aligned",
"sparse_infill_pattern": "grid", "sparse_infill_patter": "grid",
"initial_layer_speed": "60", "initial_layer_speed": "60",
"initial_layer_infill_speed": "80", "initial_layer_infill_speed": "80",
"initial_travel_speed": "100%", "initial_travel_speed": "100%",
@@ -57,7 +57,5 @@
"accel_to_decel_enable": "1", "accel_to_decel_enable": "1",
"accel_to_decel_factor": "50%", "accel_to_decel_factor": "50%",
"elefant_foot_compensation": "0.25", "elefant_foot_compensation": "0.25",
"elefant_foot_compensation_layers": "1", "elefant_foot_compensation_layers": "1"
"skirt_loops": "2",
"skirt_type": "perobject"
} }
@@ -1,15 +1,14 @@
{ {
"type": "process", "type": "process",
"name": "0.20mm Standard 0.4 nozzle @Blocks_Pro_S100", "name": "0.20mm Standard 0.4 nozzle @Blocks",
"inherits": "fdm_process_blocks_common", "inherits": "fdm_process_blocks_common",
"from": "system", "from": "system",
"setting_id": "QSEguMMChNFZsK5H", "setting_id": "47aDtVL6E5DVr7Mt",
"instantiation": "true", "instantiation": "true",
"layer_height": "0.2", "layer_height": "0.2",
"bottom_shell_layers": "4", "bottom_shell_layers": "4",
"top_shell_layers": "5", "top_shell_layers": "5",
"compatible_printers": [ "compatible_printers": [
"BLOCKS Pro S100 0.4 nozzle" "BLOCKS Pro S100 0.4 nozzle"
], ]
"renamed_from": "0.20mm Standard 0.4 nozzle @Blocks"
} }
@@ -25,7 +25,7 @@
"top_solid_infill_flow_ratio": "0.97", "top_solid_infill_flow_ratio": "0.97",
"bottom_solid_infill_flow_ratio": "1.08", "bottom_solid_infill_flow_ratio": "1.08",
"seam_position": "aligned", "seam_position": "aligned",
"sparse_infill_pattern": "grid", "sparse_infill_patter": "grid",
"initial_layer_speed": "60", "initial_layer_speed": "60",
"initial_layer_infill_speed": "80", "initial_layer_infill_speed": "80",
"initial_travel_speed": "100%", "initial_travel_speed": "100%",
@@ -61,7 +61,5 @@
"accel_to_decel_enable": "1", "accel_to_decel_enable": "1",
"accel_to_decel_factor": "50%", "accel_to_decel_factor": "50%",
"elefant_foot_compensation": "0.25", "elefant_foot_compensation": "0.25",
"elefant_foot_compensation_layers": "1", "elefant_foot_compensation_layers": "1"
"skirt_loops": "2",
"skirt_type": "perobject"
} }
@@ -1,15 +1,14 @@
{ {
"type": "process", "type": "process",
"name": "0.24mm Draft 0.4 nozzle @Blocks_Pro_S100", "name": "0.24mm Draft 0.4 nozzle @Blocks",
"inherits": "fdm_process_blocks_common", "inherits": "fdm_process_blocks_common",
"from": "system", "from": "system",
"setting_id": "uALfEFHGmup6vBYI", "setting_id": "ETADjxV6ViJQdnHA",
"instantiation": "true", "instantiation": "true",
"layer_height": "0.24", "layer_height": "0.24",
"bottom_shell_layers": "4", "bottom_shell_layers": "4",
"top_shell_layers": "5", "top_shell_layers": "5",
"compatible_printers": [ "compatible_printers": [
"BLOCKS Pro S100 0.4 nozzle" "BLOCKS Pro S100 0.4 nozzle"
], ]
"renamed_from": "0.24mm Draft 0.4 nozzle @Blocks"
} }
@@ -21,7 +21,7 @@
"top_solid_infill_flow_ratio": "0.97", "top_solid_infill_flow_ratio": "0.97",
"bottom_solid_infill_flow_ratio": "1.08", "bottom_solid_infill_flow_ratio": "1.08",
"seam_position": "aligned", "seam_position": "aligned",
"sparse_infill_pattern": "grid", "sparse_infill_patter": "grid",
"initial_layer_speed": "60", "initial_layer_speed": "60",
"initial_layer_infill_speed": "80", "initial_layer_infill_speed": "80",
"initial_travel_speed": "100%", "initial_travel_speed": "100%",
@@ -57,7 +57,5 @@
"accel_to_decel_enable": "1", "accel_to_decel_enable": "1",
"accel_to_decel_factor": "50%", "accel_to_decel_factor": "50%",
"elefant_foot_compensation": "0.25", "elefant_foot_compensation": "0.25",
"elefant_foot_compensation_layers": "1", "elefant_foot_compensation_layers": "1"
"skirt_loops": "2",
"skirt_type": "perobject"
} }
@@ -21,7 +21,7 @@
"top_solid_infill_flow_ratio": "0.97", "top_solid_infill_flow_ratio": "0.97",
"bottom_solid_infill_flow_ratio": "1.08", "bottom_solid_infill_flow_ratio": "1.08",
"seam_position": "aligned", "seam_position": "aligned",
"sparse_infill_pattern": "grid", "sparse_infill_patter": "grid",
"initial_layer_speed": "60", "initial_layer_speed": "60",
"initial_layer_infill_speed": "80", "initial_layer_infill_speed": "80",
"initial_travel_speed": "100%", "initial_travel_speed": "100%",
@@ -57,7 +57,5 @@
"accel_to_decel_enable": "1", "accel_to_decel_enable": "1",
"accel_to_decel_factor": "50%", "accel_to_decel_factor": "50%",
"elefant_foot_compensation": "0.25", "elefant_foot_compensation": "0.25",
"elefant_foot_compensation_layers": "1", "elefant_foot_compensation_layers": "1"
"skirt_loops": "2",
"skirt_type": "perobject"
} }
@@ -22,7 +22,7 @@
"top_solid_infill_flow_ratio": "0.97", "top_solid_infill_flow_ratio": "0.97",
"bottom_solid_infill_flow_ratio": "1.08", "bottom_solid_infill_flow_ratio": "1.08",
"seam_position": "aligned", "seam_position": "aligned",
"sparse_infill_pattern": "grid", "sparse_infill_patter": "grid",
"initial_layer_speed": "60", "initial_layer_speed": "60",
"initial_layer_infill_speed": "80", "initial_layer_infill_speed": "80",
"initial_travel_speed": "100%", "initial_travel_speed": "100%",
@@ -57,7 +57,5 @@
"accel_to_decel_enable": "1", "accel_to_decel_enable": "1",
"accel_to_decel_factor": "50%", "accel_to_decel_factor": "50%",
"elefant_foot_compensation": "0.25", "elefant_foot_compensation": "0.25",
"elefant_foot_compensation_layers": "1", "elefant_foot_compensation_layers": "1"
"skirt_loops": "2",
"skirt_type": "perobject"
} }
@@ -1,15 +1,14 @@
{ {
"type": "process", "type": "process",
"name": "0.30mm Extra Draft 0.4 nozzle @Blocks_Pro_S100", "name": "0.30mm Extra Draft 0.4 nozzle @Blocks",
"inherits": "fdm_process_blocks_common", "inherits": "fdm_process_blocks_common",
"from": "system", "from": "system",
"setting_id": "HYKF5l2OGvpugSQy", "setting_id": "UbuICsmppKDsaaZ4",
"instantiation": "true", "instantiation": "true",
"bottom_shell_layers": "3", "bottom_shell_layers": "3",
"top_shell_layers": "4", "top_shell_layers": "4",
"layer_height": "0.30", "layer_height": "0.30",
"compatible_printers": [ "compatible_printers": [
"BLOCKS Pro S100 0.4 nozzle" "BLOCKS Pro S100 0.4 nozzle"
], ]
"renamed_from": "0.30mm Extra Draft 0.4 nozzle @Blocks"
} }
@@ -1,15 +1,14 @@
{ {
"type": "process", "type": "process",
"name": "0.30mm Optimal 0.8 nozzle @Blocks_Pro_S100", "name": "0.30mm Optimal 0.8 nozzle @Blocks",
"inherits": "fdm_process_common 0.8 nozzle", "inherits": "fdm_process_common 0.8 nozzle",
"from": "system", "from": "system",
"setting_id": "OUfZvizM5MGnvHfp", "setting_id": "YqkYzp5zdH4R5upm",
"instantiation": "true", "instantiation": "true",
"bottom_shell_layers": "3", "bottom_shell_layers": "3",
"top_shell_layers": "3", "top_shell_layers": "3",
"layer_height": "0.3", "layer_height": "0.3",
"compatible_printers": [ "compatible_printers": [
"BLOCKS Pro S100 0.8 nozzle" "BLOCKS Pro S100 0.8 nozzle"
], ]
"renamed_from": "0.30mm Optimal 0.8 nozzle @Blocks"
} }
@@ -21,7 +21,7 @@
"top_solid_infill_flow_ratio": "0.97", "top_solid_infill_flow_ratio": "0.97",
"bottom_solid_infill_flow_ratio": "1.08", "bottom_solid_infill_flow_ratio": "1.08",
"seam_position": "aligned", "seam_position": "aligned",
"sparse_infill_pattern": "grid", "sparse_infill_patter": "grid",
"initial_layer_speed": "60", "initial_layer_speed": "60",
"initial_layer_infill_speed": "80", "initial_layer_infill_speed": "80",
"initial_travel_speed": "100%", "initial_travel_speed": "100%",
@@ -57,7 +57,5 @@
"accel_to_decel_enable": "1", "accel_to_decel_enable": "1",
"accel_to_decel_factor": "50%", "accel_to_decel_factor": "50%",
"elefant_foot_compensation": "0.25", "elefant_foot_compensation": "0.25",
"elefant_foot_compensation_layers": "1", "elefant_foot_compensation_layers": "1"
"skirt_loops": "2",
"skirt_type": "perobject"
} }
@@ -1,15 +1,14 @@
{ {
"type": "process", "type": "process",
"name": "0.30mm Optimal 1.0 nozzle @Blocks_Pro_S100", "name": "0.30mm Optimal 1.0 nozzle @Blocks",
"inherits": "fdm_process_common 1.0 nozzle", "inherits": "fdm_process_common 1.0 nozzle",
"from": "system", "from": "system",
"setting_id": "HGG9WxKVr89qNFDx", "setting_id": "8pBawPScHkyQu0SW",
"instantiation": "true", "instantiation": "true",
"bottom_shell_layers": "4", "bottom_shell_layers": "4",
"top_shell_layers": "4", "top_shell_layers": "4",
"layer_height": "0.30", "layer_height": "0.30",
"compatible_printers": [ "compatible_printers": [
"BLOCKS Pro S100 1.0 nozzle" "BLOCKS Pro S100 1.0 nozzle"
], ]
"renamed_from": "0.30mm Optimal 1.0 nozzle @Blocks"
} }
@@ -1,15 +1,14 @@
{ {
"type": "process", "type": "process",
"name": "0.30mm Standard 0.6 nozzle @Blocks_Pro_S100", "name": "0.30mm Standard 0.6 nozzle @Blocks",
"inherits": "fdm_process_common 0.6 nozzle", "inherits": "fdm_process_common 0.6 nozzle",
"from": "system", "from": "system",
"setting_id": "gO2I1YjBl4nf8yzr", "setting_id": "EPI3PAVK9LpJOZWO",
"instantiation": "true", "instantiation": "true",
"bottom_shell_layers": "3", "bottom_shell_layers": "3",
"top_shell_layers": "3", "top_shell_layers": "3",
"layer_height": "0.30", "layer_height": "0.30",
"compatible_printers": [ "compatible_printers": [
"BLOCKS Pro S100 0.6 nozzle" "BLOCKS Pro S100 0.6 nozzle"
], ]
"renamed_from": "0.30mm Standard 0.6 nozzle @Blocks"
} }
@@ -22,7 +22,7 @@
"top_solid_infill_flow_ratio": "0.97", "top_solid_infill_flow_ratio": "0.97",
"bottom_solid_infill_flow_ratio": "1.08", "bottom_solid_infill_flow_ratio": "1.08",
"seam_position": "aligned", "seam_position": "aligned",
"sparse_infill_pattern": "grid", "sparse_infill_patter": "grid",
"initial_layer_speed": "60", "initial_layer_speed": "60",
"initial_layer_infill_speed": "80", "initial_layer_infill_speed": "80",
"initial_travel_speed": "100%", "initial_travel_speed": "100%",
@@ -57,7 +57,5 @@
"accel_to_decel_enable": "1", "accel_to_decel_enable": "1",
"accel_to_decel_factor": "50%", "accel_to_decel_factor": "50%",
"elefant_foot_compensation": "0.25", "elefant_foot_compensation": "0.25",
"elefant_foot_compensation_layers": "1", "elefant_foot_compensation_layers": "1"
"skirt_loops": "2",
"skirt_type": "perobject"
} }
@@ -21,7 +21,7 @@
"top_solid_infill_flow_ratio": "0.97", "top_solid_infill_flow_ratio": "0.97",
"bottom_solid_infill_flow_ratio": "1.08", "bottom_solid_infill_flow_ratio": "1.08",
"seam_position": "aligned", "seam_position": "aligned",
"sparse_infill_pattern": "grid", "sparse_infill_patter": "grid",
"initial_layer_speed": "60", "initial_layer_speed": "60",
"initial_layer_infill_speed": "80", "initial_layer_infill_speed": "80",
"initial_travel_speed": "100%", "initial_travel_speed": "100%",
@@ -57,7 +57,5 @@
"accel_to_decel_enable": "1", "accel_to_decel_enable": "1",
"accel_to_decel_factor": "50%", "accel_to_decel_factor": "50%",
"elefant_foot_compensation": "0.25", "elefant_foot_compensation": "0.25",
"elefant_foot_compensation_layers": "1", "elefant_foot_compensation_layers": "1"
"skirt_loops": "2",
"skirt_type": "perobject"
} }
@@ -22,7 +22,7 @@
"top_solid_infill_flow_ratio": "0.97", "top_solid_infill_flow_ratio": "0.97",
"bottom_solid_infill_flow_ratio": "1.08", "bottom_solid_infill_flow_ratio": "1.08",
"seam_position": "aligned", "seam_position": "aligned",
"sparse_infill_pattern": "grid", "sparse_infill_patter": "grid",
"initial_layer_speed": "60", "initial_layer_speed": "60",
"initial_layer_infill_speed": "80", "initial_layer_infill_speed": "80",
"initial_travel_speed": "100%", "initial_travel_speed": "100%",
@@ -57,7 +57,5 @@
"accel_to_decel_enable": "1", "accel_to_decel_enable": "1",
"accel_to_decel_factor": "50%", "accel_to_decel_factor": "50%",
"elefant_foot_compensation": "0.25", "elefant_foot_compensation": "0.25",
"elefant_foot_compensation_layers": "1", "elefant_foot_compensation_layers": "1"
"skirt_loops": "2",
"skirt_type": "perobject"
} }
@@ -1,15 +1,14 @@
{ {
"type": "process", "type": "process",
"name": "0.40mm Draft 0.6 nozzle @Blocks_Pro_S100", "name": "0.40mm Draft 0.6 nozzle @Blocks",
"inherits": "fdm_process_common 0.6 nozzle", "inherits": "fdm_process_common 0.6 nozzle",
"from": "system", "from": "system",
"setting_id": "OjsLUl1heqv1cevs", "setting_id": "CShVKoGspbMJNPw8",
"instantiation": "true", "instantiation": "true",
"bottom_shell_layers": "2", "bottom_shell_layers": "2",
"top_shell_layers": "2", "top_shell_layers": "2",
"layer_height": "0.40", "layer_height": "0.40",
"compatible_printers": [ "compatible_printers": [
"BLOCKS Pro S100 0.6 nozzle" "BLOCKS Pro S100 0.6 nozzle"
], ]
"renamed_from": "0.40mm Draft 0.6 nozzle @Blocks"
} }
@@ -1,15 +1,14 @@
{ {
"type": "process", "type": "process",
"name": "0.40mm Standard 0.8 nozzle @Blocks_Pro_S100", "name": "0.40mm Standard 0.8 nozzle @Blocks",
"inherits": "fdm_process_common 0.8 nozzle", "inherits": "fdm_process_common 0.8 nozzle",
"from": "system", "from": "system",
"setting_id": "laOTioBGySeudJpl", "setting_id": "TSRjmfWaatY7oLJB",
"instantiation": "true", "instantiation": "true",
"bottom_shell_layers": "3", "bottom_shell_layers": "3",
"top_shell_layers": "4", "top_shell_layers": "4",
"layer_height": "0.40", "layer_height": "0.40",
"compatible_printers": [ "compatible_printers": [
"BLOCKS Pro S100 0.8 nozzle" "BLOCKS Pro S100 0.8 nozzle"
], ]
"renamed_from": "0.40mm Standard 0.8 nozzle @Blocks"
} }
@@ -22,7 +22,7 @@
"top_solid_infill_flow_ratio": "0.97", "top_solid_infill_flow_ratio": "0.97",
"bottom_solid_infill_flow_ratio": "1.08", "bottom_solid_infill_flow_ratio": "1.08",
"seam_position": "aligned", "seam_position": "aligned",
"sparse_infill_pattern": "grid", "sparse_infill_patter": "grid",
"initial_layer_speed": "60", "initial_layer_speed": "60",
"initial_layer_infill_speed": "80", "initial_layer_infill_speed": "80",
"initial_travel_speed": "100%", "initial_travel_speed": "100%",
@@ -57,7 +57,5 @@
"accel_to_decel_enable": "1", "accel_to_decel_enable": "1",
"accel_to_decel_factor": "50%", "accel_to_decel_factor": "50%",
"elefant_foot_compensation": "0.25", "elefant_foot_compensation": "0.25",
"elefant_foot_compensation_layers": "1", "elefant_foot_compensation_layers": "1"
"skirt_loops": "2",
"skirt_type": "perobject"
} }
@@ -1,15 +1,14 @@
{ {
"type": "process", "type": "process",
"name": "0.50mm Draft 0.8 nozzle @Blocks_Pro_S100", "name": "0.50mm Draft 0.8 nozzle @Blocks",
"inherits": "fdm_process_common 0.8 nozzle", "inherits": "fdm_process_common 0.8 nozzle",
"from": "system", "from": "system",
"setting_id": "oAhgUZdADR7kP87e", "setting_id": "vOtZHrDS88Shmf2m",
"instantiation": "true", "instantiation": "true",
"bottom_shell_layers": "3", "bottom_shell_layers": "3",
"top_shell_layers": "4", "top_shell_layers": "4",
"layer_height": "0.50", "layer_height": "0.50",
"compatible_printers": [ "compatible_printers": [
"BLOCKS Pro S100 0.8 nozzle" "BLOCKS Pro S100 0.8 nozzle"
], ]
"renamed_from": "0.50mm Draft 0.8 nozzle @Blocks"
} }
@@ -1,15 +1,14 @@
{ {
"type": "process", "type": "process",
"name": "0.50mm Optimal 1.2 nozzle @Blocks_Pro_S100", "name": "0.50mm Optimal 1.2 nozzle @Blocks",
"inherits": "fdm_process_common 1.2 nozzle", "inherits": "fdm_process_common 1.2 nozzle",
"from": "system", "from": "system",
"setting_id": "0eqNgX26jemsBfV5", "setting_id": "BKrEAKqDYzdH43wc",
"instantiation": "true", "instantiation": "true",
"bottom_shell_layers": "2", "bottom_shell_layers": "2",
"top_shell_layers": "3", "top_shell_layers": "3",
"layer_height": "0.50", "layer_height": "0.50",
"compatible_printers": [ "compatible_printers": [
"BLOCKS Pro S100 1.2 nozzle" "BLOCKS Pro S100 1.2 nozzle"
], ]
"renamed_from": "0.50mm Optimal 1.2 nozzle @Blocks"
} }
@@ -1,15 +1,14 @@
{ {
"type": "process", "type": "process",
"name": "0.50mm Standard 1.0 nozzle @Blocks_Pro_S100", "name": "0.50mm Standard 1.0 nozzle @Blocks",
"inherits": "fdm_process_common 1.0 nozzle", "inherits": "fdm_process_common 1.0 nozzle",
"from": "system", "from": "system",
"setting_id": "z1qCW1cEMc4QvBbV", "setting_id": "D40iksDm7mFjhSKn",
"instantiation": "true", "instantiation": "true",
"bottom_shell_layers": "3", "bottom_shell_layers": "3",
"top_shell_layers": "3", "top_shell_layers": "3",
"layer_height": "0.50", "layer_height": "0.50",
"compatible_printers": [ "compatible_printers": [
"BLOCKS Pro S100 1.0 nozzle" "BLOCKS Pro S100 1.0 nozzle"
], ]
"renamed_from": "0.50mm Standard 1.0 nozzle @Blocks"
} }
@@ -21,7 +21,7 @@
"top_solid_infill_flow_ratio": "0.97", "top_solid_infill_flow_ratio": "0.97",
"bottom_solid_infill_flow_ratio": "1.08", "bottom_solid_infill_flow_ratio": "1.08",
"seam_position": "aligned", "seam_position": "aligned",
"sparse_infill_pattern": "grid", "sparse_infill_patter": "grid",
"initial_layer_speed": "60", "initial_layer_speed": "60",
"initial_layer_infill_speed": "80", "initial_layer_infill_speed": "80",
"initial_travel_speed": "100%", "initial_travel_speed": "100%",
@@ -57,7 +57,5 @@
"accel_to_decel_enable": "1", "accel_to_decel_enable": "1",
"accel_to_decel_factor": "50%", "accel_to_decel_factor": "50%",
"elefant_foot_compensation": "0.25", "elefant_foot_compensation": "0.25",
"elefant_foot_compensation_layers": "1", "elefant_foot_compensation_layers": "1"
"skirt_loops": "2",
"skirt_type": "perobject"
} }
@@ -1,15 +1,14 @@
{ {
"type": "process", "type": "process",
"name": "0.60mm Draft 1.0 nozzle @Blocks_Pro_S100", "name": "0.60mm Draft 1.0 nozzle @Blocks",
"inherits": "fdm_process_common 1.0 nozzle", "inherits": "fdm_process_common 1.0 nozzle",
"from": "system", "from": "system",
"setting_id": "gTTgtfG8qb9My3hH", "setting_id": "UJUe8XCBzZf8NyCL",
"instantiation": "true", "instantiation": "true",
"bottom_shell_layers": "2", "bottom_shell_layers": "2",
"top_shell_layers": "3", "top_shell_layers": "3",
"layer_height": "0.60", "layer_height": "0.60",
"compatible_printers": [ "compatible_printers": [
"BLOCKS Pro S100 1.0 nozzle" "BLOCKS Pro S100 1.0 nozzle"
], ]
"renamed_from": "0.60mm Draft 1.0 nozzle @Blocks"
} }
@@ -1,15 +1,14 @@
{ {
"type": "process", "type": "process",
"name": "0.60mm Standard 1.2 nozzle @Blocks_Pro_S100", "name": "0.60mm Standard 1.2 nozzle @Blocks",
"inherits": "fdm_process_common 1.2 nozzle", "inherits": "fdm_process_common 1.2 nozzle",
"from": "system", "from": "system",
"setting_id": "ApcyToENCIANrI71", "setting_id": "PSBFrTykpkytPI2Q",
"instantiation": "true", "instantiation": "true",
"bottom_shell_layers": "2", "bottom_shell_layers": "2",
"top_shell_layers": "3", "top_shell_layers": "3",
"layer_height": "0.60", "layer_height": "0.60",
"compatible_printers": [ "compatible_printers": [
"BLOCKS Pro S100 1.2 nozzle" "BLOCKS Pro S100 1.2 nozzle"
], ]
"renamed_from": "0.60mm Standard 1.2 nozzle @Blocks"
} }
@@ -1,15 +1,14 @@
{ {
"type": "process", "type": "process",
"name": "0.70mm Draft 1.2 nozzle @Blocks_Pro_S100", "name": "0.70mm Draft 1.2 nozzle @Blocks",
"inherits": "fdm_process_common 1.2 nozzle", "inherits": "fdm_process_common 1.2 nozzle",
"from": "system", "from": "system",
"setting_id": "DEv7X7zaTfxRQmjo", "setting_id": "0ZQ0USGX9SwAKr29",
"instantiation": "true", "instantiation": "true",
"bottom_shell_layers": "2", "bottom_shell_layers": "2",
"top_shell_layers": "3", "top_shell_layers": "3",
"layer_height": "0.70", "layer_height": "0.70",
"compatible_printers": [ "compatible_printers": [
"BLOCKS Pro S100 1.2 nozzle" "BLOCKS Pro S100 1.2 nozzle"
], ]
"renamed_from": "0.70mm Draft 1.2 nozzle @Blocks"
} }
@@ -1,15 +1,14 @@
{ {
"type": "process", "type": "process",
"name": "0.70mm Extra Draft 1.0 nozzle @Blocks_Pro_S100", "name": "0.70mm Extra Draft 1.0 nozzle @Blocks",
"inherits": "fdm_process_common 1.0 nozzle", "inherits": "fdm_process_common 1.0 nozzle",
"from": "system", "from": "system",
"setting_id": "nUW7N9dJmTyQT4AG", "setting_id": "69PFmjOVFBOIp3Qg",
"instantiation": "true", "instantiation": "true",
"bottom_shell_layers": "2", "bottom_shell_layers": "2",
"top_shell_layers": "3", "top_shell_layers": "3",
"layer_height": "0.70", "layer_height": "0.70",
"compatible_printers": [ "compatible_printers": [
"BLOCKS Pro S100 1.0 nozzle" "BLOCKS Pro S100 1.0 nozzle"
], ]
"renamed_from": "0.70mm Extra Draft 1.0 nozzle @Blocks"
} }
@@ -1,15 +1,14 @@
{ {
"type": "process", "type": "process",
"name": "0.80mm Extra Draft 1.2 nozzle @Blocks_Pro_S100", "name": "0.80mm Extra Draft 1.2 nozzle @Blocks",
"inherits": "fdm_process_common 1.2 nozzle", "inherits": "fdm_process_common 1.2 nozzle",
"from": "system", "from": "system",
"setting_id": "JMy62SonRfK0cAdL", "setting_id": "iBwRI5JJewW5HJSv",
"instantiation": "true", "instantiation": "true",
"bottom_shell_layers": "2", "bottom_shell_layers": "2",
"top_shell_layers": "2", "top_shell_layers": "2",
"layer_height": "0.80", "layer_height": "0.80",
"compatible_printers": [ "compatible_printers": [
"BLOCKS Pro S100 1.2 nozzle" "BLOCKS Pro S100 1.2 nozzle"
], ]
"renamed_from": "0.80mm Extra Draft 1.2 nozzle @Blocks"
} }
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "OrcaFilamentLibrary", "name": "OrcaFilamentLibrary",
"version": "02.04.00.13", "version": "02.04.00.12",
"force_update": "0", "force_update": "0",
"description": "Orca Filament Library", "description": "Orca Filament Library",
"filament_list": [ "filament_list": [
@@ -6,7 +6,7 @@
"filament_id": "OFvgE0Zh", "filament_id": "OFvgE0Zh",
"instantiation": "false", "instantiation": "false",
"fan_cooling_layer_time": [ "fan_cooling_layer_time": [
"81" "80"
], ],
"fan_min_speed": [ "fan_min_speed": [
"50" "50"
+2 -2
View File
@@ -2673,10 +2673,10 @@ void CadDocument::apply_feature(TopoDS_Shape& result, bool& have_body,
ridge = pipe.Shape(); ridge = pipe.Shape();
have_ridge = !ridge.IsNull(); have_ridge = !ridge.IsNull();
} }
} catch (const Standard_Failure&) {
have_ridge = false; // OCCT failure — on OCCT >= 8 Standard_Failure derives from std::exception, so this handler must come first
} catch (const std::exception&) { } catch (const std::exception&) {
have_ridge = false; // fall back to the bare cylinder/bore below have_ridge = false; // fall back to the bare cylinder/bore below
} catch (const Standard_Failure&) {
have_ridge = false; // OCCT failure (not a std::exception) — must be caught here too
} }
if (f.thread_internal) { if (f.thread_internal) {
-2
View File
@@ -15,8 +15,6 @@
#include <TopExp.hxx> #include <TopExp.hxx>
#include <TopTools.hxx> #include <TopTools.hxx>
#include <TopTools_IndexedMapOfShape.hxx> #include <TopTools_IndexedMapOfShape.hxx>
#include <TopTools_ListOfShape.hxx>
#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
#include <Poly_Triangulation.hxx> #include <Poly_Triangulation.hxx>
#include <gp_Ax2.hxx> #include <gp_Ax2.hxx>
#include <gp_Dir.hxx> #include <gp_Dir.hxx>
+16 -6
View File
@@ -307,14 +307,17 @@ bool PrusaFileParser::check_3mf_from_prusa(const std::string filename)
mz_zip_archive_file_stat stat; mz_zip_archive_file_stat stat;
if (!mz_zip_reader_file_stat(&archive, model_file_index, &stat)) goto EXIT; if (!mz_zip_reader_file_stat(&archive, model_file_index, &stat)) goto EXIT;
// expat sizes its buffer with an int, so a larger entry cannot be parsed in one piece.
if (stat.m_uncomp_size > static_cast<mz_uint64>(std::numeric_limits<int>::max())) goto EXIT;
void *parser_buffer = XML_GetBuffer(m_parser, (int) stat.m_uncomp_size); const int xml_size = static_cast<int>(stat.m_uncomp_size);
void *parser_buffer = XML_GetBuffer(m_parser, xml_size);
if (parser_buffer == nullptr) goto EXIT; if (parser_buffer == nullptr) goto EXIT;
mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, parser_buffer, (size_t) stat.m_uncomp_size, 0); mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, parser_buffer, static_cast<size_t>(xml_size), 0);
if (res == 0) goto EXIT; if (res == 0) goto EXIT;
XML_ParseBuffer(m_parser, (int) stat.m_uncomp_size, 1); XML_ParseBuffer(m_parser, xml_size, 1);
} }
} }
@@ -1346,19 +1349,26 @@ ModelVolumeType type_from_string(const std::string &s)
XML_SetUserData(m_xml_parser, (void*)this); XML_SetUserData(m_xml_parser, (void*)this);
XML_SetElementHandler(m_xml_parser, _3MF_Importer::_handle_start_config_xml_element, _3MF_Importer::_handle_end_config_xml_element); XML_SetElementHandler(m_xml_parser, _3MF_Importer::_handle_start_config_xml_element, _3MF_Importer::_handle_end_config_xml_element);
void* parser_buffer = XML_GetBuffer(m_xml_parser, (int)stat.m_uncomp_size); // expat sizes its buffer with an int, so a larger entry cannot be parsed in one piece.
if (stat.m_uncomp_size > static_cast<mz_uint64>(std::numeric_limits<int>::max())) {
add_error("Found invalid size");
return false;
}
const int xml_size = static_cast<int>(stat.m_uncomp_size);
void* parser_buffer = XML_GetBuffer(m_xml_parser, xml_size);
if (parser_buffer == nullptr) { if (parser_buffer == nullptr) {
add_error("Unable to create buffer"); add_error("Unable to create buffer");
return false; return false;
} }
mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, parser_buffer, (size_t)stat.m_uncomp_size, 0); mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, parser_buffer, static_cast<size_t>(xml_size), 0);
if (res == 0) { if (res == 0) {
add_error("Error while reading config data to buffer"); add_error("Error while reading config data to buffer");
return false; return false;
} }
if (!XML_ParseBuffer(m_xml_parser, (int)stat.m_uncomp_size, 1)) { if (!XML_ParseBuffer(m_xml_parser, xml_size, 1)) {
char error_buf[1024]; char error_buf[1024];
::sprintf(error_buf, "Error (%s) while parsing xml file at line %d", XML_ErrorString(XML_GetErrorCode(m_xml_parser)), (int)XML_GetCurrentLineNumber(m_xml_parser)); ::sprintf(error_buf, "Error (%s) while parsing xml file at line %d", XML_ErrorString(XML_GetErrorCode(m_xml_parser)), (int)XML_GetCurrentLineNumber(m_xml_parser));
add_error(error_buf); add_error(error_buf);
-1
View File
@@ -25,7 +25,6 @@
#include "XCAFDoc_DocumentTool.hxx" #include "XCAFDoc_DocumentTool.hxx"
#include "XCAFDoc_ShapeTool.hxx" #include "XCAFDoc_ShapeTool.hxx"
#include "XCAFApp_Application.hxx" #include "XCAFApp_Application.hxx"
#include "TDF_LabelSequence.hxx"
#include "TopoDS_Solid.hxx" #include "TopoDS_Solid.hxx"
#include "TopoDS_Compound.hxx" #include "TopoDS_Compound.hxx"
#include "TopoDS_Builder.hxx" #include "TopoDS_Builder.hxx"
+10 -3
View File
@@ -2508,19 +2508,26 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result)
XML_SetEntityDeclHandler(m_xml_parser, nullptr); XML_SetEntityDeclHandler(m_xml_parser, nullptr);
XML_SetExternalEntityRefHandler(m_xml_parser, nullptr); XML_SetExternalEntityRefHandler(m_xml_parser, nullptr);
void* parser_buffer = XML_GetBuffer(m_xml_parser, (int)stat.m_uncomp_size); // expat sizes its buffer with an int, so a larger entry cannot be parsed in one piece.
if (stat.m_uncomp_size > static_cast<mz_uint64>(std::numeric_limits<int>::max())) {
add_error("Found invalid size");
return false;
}
const int xml_size = static_cast<int>(stat.m_uncomp_size);
void* parser_buffer = XML_GetBuffer(m_xml_parser, xml_size);
if (parser_buffer == nullptr) { if (parser_buffer == nullptr) {
add_error("Unable to create buffer"); add_error("Unable to create buffer");
return false; return false;
} }
mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, parser_buffer, (size_t)stat.m_uncomp_size, 0); mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, parser_buffer, static_cast<size_t>(xml_size), 0);
if (res == 0) { if (res == 0) {
add_error("Error while reading config data to buffer"); add_error("Error while reading config data to buffer");
return false; return false;
} }
if (!XML_ParseBuffer(m_xml_parser, (int)stat.m_uncomp_size, 1)) { if (!XML_ParseBuffer(m_xml_parser, xml_size, 1)) {
char error_buf[1024]; char error_buf[1024];
::snprintf(error_buf, 1024, "Error (%s) while parsing xml file at line %d", XML_ErrorString(XML_GetErrorCode(m_xml_parser)), (int)XML_GetCurrentLineNumber(m_xml_parser)); ::snprintf(error_buf, 1024, "Error (%s) while parsing xml file at line %d", XML_ErrorString(XML_GetErrorCode(m_xml_parser)), (int)XML_GetCurrentLineNumber(m_xml_parser));
add_error(error_buf); add_error(error_buf);
+28 -38
View File
@@ -2504,8 +2504,7 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu
{ {
LifecycleEventContext ctx; LifecycleEventContext ctx;
ctx.id = std::to_string(print->model().id().id); ctx.name = std::to_string(print->model().id().id);
ctx.name = print->get_model_name();
ctx.code = LifecycleEvtCode::Ok; ctx.code = LifecycleEvtCode::Ok;
ctx.msg = path; ctx.msg = path;
ctx.cancellation_check = [print]() { return print->canceled(); }; ctx.cancellation_check = [print]() { return print->canceled(); };
@@ -2557,8 +2556,7 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu
} }
{ {
LifecycleEventContext ctx; LifecycleEventContext ctx;
ctx.id = std::to_string(print->model().id().id); ctx.name = std::to_string(print->model().id().id);
ctx.name = print->get_model_name();
ctx.code = LifecycleEvtCode::Error; ctx.code = LifecycleEvtCode::Error;
ctx.msg = std::string(path) + "\n" + err_msg; ctx.msg = std::string(path) + "\n" + err_msg;
ctx.cancellation_check = [print]() { return print->canceled(); }; ctx.cancellation_check = [print]() { return print->canceled(); };
@@ -2582,8 +2580,7 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu
boost::nowide::remove(path_tmp.c_str()); boost::nowide::remove(path_tmp.c_str());
{ {
LifecycleEventContext ctx; LifecycleEventContext ctx;
ctx.id = std::to_string(print->model().id().id); ctx.name = std::to_string(print->model().id().id);
ctx.name = print->get_model_name();
ctx.code = LifecycleEvtCode::Error; ctx.code = LifecycleEvtCode::Error;
ctx.msg = std::string(path) + "\n" + ex.what(); ctx.msg = std::string(path) + "\n" + ex.what();
ctx.cancellation_check = [print]() { return print->canceled(); }; ctx.cancellation_check = [print]() { return print->canceled(); };
@@ -2696,8 +2693,7 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu
if (ret) { if (ret) {
{ {
LifecycleEventContext ctx; LifecycleEventContext ctx;
ctx.id = std::to_string(print->model().id().id); ctx.name = std::to_string(print->model().id().id);
ctx.name = print->get_model_name();
ctx.code = LifecycleEvtCode::Error; ctx.code = LifecycleEvtCode::Error;
ctx.msg = std::string(path) + "\nFailed to rename the output G-code file: " + ret.message(); ctx.msg = std::string(path) + "\nFailed to rename the output G-code file: " + ret.message();
ctx.cancellation_check = [print]() { return print->canceled(); }; ctx.cancellation_check = [print]() { return print->canceled(); };
@@ -2716,8 +2712,7 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu
{ {
LifecycleEventContext ctx; LifecycleEventContext ctx;
ctx.id = std::to_string(print->model().id().id); ctx.name = std::to_string(print->model().id().id);
ctx.name = print->get_model_name();
ctx.code = LifecycleEvtCode::Ok; ctx.code = LifecycleEvtCode::Ok;
ctx.msg = path; ctx.msg = path;
ctx.cancellation_check = [print]() { return print->canceled(); }; ctx.cancellation_check = [print]() { return print->canceled(); };
@@ -7969,20 +7964,6 @@ double GCode::calc_max_volumetric_speed(const double layer_height, const double
return res; return res;
} }
// ORCA: Overlap at or below which the overhang fan switches on; negative when it does not depend on overlap
// (Overhang_threshold_none cools every external perimeter).
static float overhang_fan_overlap_threshold(int overhang_fan_threshold)
{
switch (overhang_fan_threshold) {
case (int) Overhang_threshold_1_4: return 0.9f;
case (int) Overhang_threshold_2_4: return 0.75f;
case (int) Overhang_threshold_3_4: return 0.5f;
case (int) Overhang_threshold_4_4: return 0.25f;
case (int) Overhang_threshold_bridge: return 0.05f;
default: return -1.f;
}
}
std::string GCode::_extrude(const ExtrusionPath &path, std::string description, double speed) std::string GCode::_extrude(const ExtrusionPath &path, std::string description, double speed)
{ {
std::string gcode; std::string gcode;
@@ -8325,13 +8306,6 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description,
ConfigOptionPercents overhang_overlap_levels({90, 75, 50, 25, 13, 0}); ConfigOptionPercents overhang_overlap_levels({90, 75, 50, 25, 13, 0});
// ORCA: Lets the path be split where the overhang fan switches, not only where the speed changes.
// Bridges and overhang perimeters are cooled regardless of overlap.
float fan_overlap_threshold = -1.f;
if (FILAMENT_CONFIG(enable_overhang_bridge_fan) && m_enable_cooling_markers && path.role() != erBridgeInfill &&
path.role() != erOverhangPerimeter)
fan_overlap_threshold = overhang_fan_overlap_threshold(FILAMENT_CONFIG(overhang_fan_threshold));
if (NOZZLE_CONFIG(slowdown_for_curled_perimeters)){ if (NOZZLE_CONFIG(slowdown_for_curled_perimeters)){
ConfigOptionFloatsOrPercents dynamic_overhang_speeds( ConfigOptionFloatsOrPercents dynamic_overhang_speeds(
{FloatOrPercent{100, true}, {FloatOrPercent{100, true},
@@ -8352,8 +8326,7 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description,
FloatOrPercent{NOZZLE_CONFIG(overhang_4_4_speed).get_abs_value(ref_speed) * 100 / ref_speed, true}}); FloatOrPercent{NOZZLE_CONFIG(overhang_4_4_speed).get_abs_value(ref_speed) * 100 / ref_speed, true}});
new_points = m_extrusion_quality_estimator.estimate_extrusion_quality(path, overhang_overlap_levels, dynamic_overhang_speeds, new_points = m_extrusion_quality_estimator.estimate_extrusion_quality(path, overhang_overlap_levels, dynamic_overhang_speeds,
ref_speed, speed, NOZZLE_CONFIG(slowdown_for_curled_perimeters), ref_speed, speed, NOZZLE_CONFIG(slowdown_for_curled_perimeters));
fan_overlap_threshold);
}else{ }else{
ConfigOptionFloatsOrPercents dynamic_overhang_speeds( ConfigOptionFloatsOrPercents dynamic_overhang_speeds(
{FloatOrPercent{100, true}, {FloatOrPercent{100, true},
@@ -8372,8 +8345,7 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description,
FloatOrPercent{NOZZLE_CONFIG(bridge_speed) * 100 / ref_speed, true}}); FloatOrPercent{NOZZLE_CONFIG(bridge_speed) * 100 / ref_speed, true}});
new_points = m_extrusion_quality_estimator.estimate_extrusion_quality(path, overhang_overlap_levels, dynamic_overhang_speeds, new_points = m_extrusion_quality_estimator.estimate_extrusion_quality(path, overhang_overlap_levels, dynamic_overhang_speeds,
ref_speed, speed, NOZZLE_CONFIG(slowdown_for_curled_perimeters), ref_speed, speed, NOZZLE_CONFIG(slowdown_for_curled_perimeters));
fan_overlap_threshold);
} }
variable_speed = std::any_of(new_points.begin(), new_points.end(), variable_speed = std::any_of(new_points.begin(), new_points.end(),
[speed](const ProcessedPoint &p) { return fabs(double(p.speed) - speed) > 1; }); // Ignore small speed variations (under 1mm/sec) [speed](const ProcessedPoint &p) { return fabs(double(p.speed) - speed) > 1; }); // Ignore small speed variations (under 1mm/sec)
@@ -8525,10 +8497,28 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description,
if (role == erBridgeInfill || role == erOverhangPerimeter) { // ORCA: Split out bridge infill to internal and external to apply separate fan settings if (role == erBridgeInfill || role == erOverhangPerimeter) { // ORCA: Split out bridge infill to internal and external to apply separate fan settings
return true; return true;
} }
if (overhang_fan_threshold == Overhang_threshold_none) switch (overhang_fan_threshold) {
case (int)Overhang_threshold_1_4:
return overlap <= 0.9f;
break;
case (int)Overhang_threshold_2_4:
return overlap <= 0.75f;
break;
case (int)Overhang_threshold_3_4:
return overlap <= 0.5f;
break;
case (int)Overhang_threshold_4_4:
return overlap <= 0.25f;
break;
case (int)Overhang_threshold_bridge:
return overlap <= 0.05f;
break;
case (int)Overhang_threshold_none:
return is_external_perimeter(role); return is_external_perimeter(role);
const float overlap_threshold = overhang_fan_overlap_threshold(overhang_fan_threshold); break;
return overlap_threshold >= 0.f && overlap <= overlap_threshold; default:
return false;
}
}; };
std::string comment; std::string comment;
+74 -110
View File
@@ -41,12 +41,10 @@ std::vector<ExtendedPoint<L::Dim>> estimate_points_properties(const POINTS&
float flow_width, float flow_width,
float max_line_length = -1.0f, float max_line_length = -1.0f,
float min_distance = -1.0f, float min_distance = -1.0f,
// Speed an overhang distance prints at. Without it, interior sampling // Maps an overhang distance onto the speed it will be printed at. Interior sampling
// is skipped and every line over 4mm is split. // needs it to tell which of the points it could add would change the G-code, and is
const std::function<float(float)>& distance_to_speed = {}, // skipped without it.
// Overlap (1 - distance / flow_width) at or below which the overhang const std::function<float(float)>& distance_to_speed = {})
// fan switches on; negative when the fan does not depend on overlap.
float fan_overlap_threshold = -1.0f)
{ {
bool looped = input_points.front() == input_points.back(); bool looped = input_points.front() == input_points.back();
std::function<size_t(size_t,size_t)> get_prev_index = [](size_t idx, size_t count) { std::function<size_t(size_t,size_t)> get_prev_index = [](size_t idx, size_t count) {
@@ -127,43 +125,29 @@ std::vector<ExtendedPoint<L::Dim>> estimate_points_properties(const POINTS&
points.push_back(next_point); points.push_back(next_point);
} }
// ORCA: How an overhang distance prints, which is what the passes below compare. A segment is printed at the lower
// of the speeds at its two ends, and with the overhang fan on if the overlap at either end turns it on. A point
// added to a path can therefore only change the G-code where it prints at a different speed or fan state from the
// points either side of it, and the passes below add points there and nowhere else.
const float width_inv = 1.f / flow_width;
// Whether an overhang distance turns the overhang fan on. The overlap test check_overhang_fan applies in GCode.cpp.
auto fan_on = [fan_overlap_threshold, width_inv](float distance) {
return fan_overlap_threshold >= 0.f && 1.f - distance * width_inv <= fan_overlap_threshold;
};
// Whether two overhang distances are interchangeable ie have the same speed (beyond a 1mm/sec threshold that gcode.cpp filters out on)
// and the same fan state.
auto same_speed_and_fan = [&distance_to_speed, &fan_on](float a, float b) {
return std::abs(distance_to_speed(a) - distance_to_speed(b)) <= 1.f && fan_on(a) == fan_on(b);
};
// Whether the first overhang distance prints slower than the second, beyond the 1mm/sec gcode.cpp tolerance, or turns the overhang
// fan on where the second does not. Against a supported point (overhang distance 0) it tells whether an end is
// affected by the overhang.
auto slower_or_cooled = [&distance_to_speed, &fan_on](float a, float b) {
return distance_to_speed(a) < distance_to_speed(b) - 1.f || (fan_on(a) && !fan_on(b));
};
// ORCA: Interior sampling // ORCA: Interior sampling
// The passes below infer the support under a span from its endpoints alone, so a part that is supported // The passes below infer the support under a span from its endpoints alone, so an interior that is supported
// differently from both ends is invisible to them. The outer perimeter of an overhang whose ends are supported by // differently from both ends is invisible to them: the outer perimeter of an overhang whose ends are caged by
// reads as supported along its whole length. Probe the interior, keep the samples the endpoint interpolation fails to predict, // full height walls reads as supported along its whole length. Probe the interior, keep the samples the
// and bisect either side of each one, so a span that is only partly unsupported gets points where its support actually changes // endpoint interpolation fails to predict, and bisect either side of each one, so a span that is only partly
// instead of one reading being spread across all of it. // unsupported gets points where its support actually changes instead of one reading spread across all of it.
// Skipped where there is nothing to find: min_distance <= 0 when no overhang can slow this path down, and if (PREV_LAYER_BOUNDARY_OFFSET && ADD_INTERSECTIONS && min_distance > 0 && distance_to_speed) {
// fan_overlap_threshold < 0 when no overhang switches the fan on. It also needs distance_to_speed to tell which of
// the points it could add would change the G-code.
if (PREV_LAYER_BOUNDARY_OFFSET && ADD_INTERSECTIONS && distance_to_speed && (min_distance > 0 || fan_overlap_threshold >= 0.f)) {
// Probe at least this densely before treating matching samples as evidence that a span is uniform. The // Probe at least this densely before treating matching samples as evidence that a span is uniform. The
// segmentation pass below only splits lines of 2mm or more, and every pass here drops points closer // segmentation pass below only splits lines of 2mm or more, and every pass here drops points closer
// together than min_spacing, so finer discovery would not produce a more precise transition. // together than min_spacing, so finer discovery would not produce a more precise speed transition.
const double max_probe_spacing = std::max(2., 4. * min_spacing); const double max_probe_spacing = std::max(2., 4. * min_spacing);
// A backstop for that length test, which on a non-finite length would never be met. // A backstop for that length test, which on a non-finite length would never be met.
constexpr int max_bisection_depth = 10; constexpr int max_bisection_depth = 10;
// Whether two readings are interchangeable. A segment is printed at the lower of the speeds its ends
// read, so a sample that agrees on speed with what is already known cannot change the G-code, whatever
// its distance says. The distances themselves are far too coarse a stand-in for this: the speed sections
// interpolate, so readings a small fraction of min_distance apart can still be tens of mm/s apart.
// The tolerance matches the one GCode.cpp applies when it decides a path has a variable speed at all.
auto same_speed = [&distance_to_speed](float a, float b) {
return std::abs(distance_to_speed(a) - distance_to_speed(b)) <= 1.f;
};
// Whether the first reading is printed slower than the second, once they are known to differ.
auto prints_slower = [&distance_to_speed](float a, float b) { return distance_to_speed(a) < distance_to_speed(b); };
// Part of a segment still to bisect: its positions along the segment and bisections left. // Part of a segment still to bisect: its positions along the segment and bisections left.
struct Subspan { double t0, t1; int depth; }; struct Subspan { double t0, t1; int depth; };
@@ -201,8 +185,8 @@ std::vector<ExtendedPoint<L::Dim>> estimate_points_properties(const POINTS&
if (!interior.empty()) { if (!interior.empty()) {
std::sort(interior.begin(), interior.end(), std::sort(interior.begin(), interior.end(),
[](const std::pair<double, float>& l, const std::pair<double, float>& r) { return l.first < r.first; }); [](const std::pair<double, float>& l, const std::pair<double, float>& r) { return l.first < r.first; });
// Coarse probing keeps every sample it took until this pass can see which ones bracket a speed or // Coarse probing keeps every sample it took until this pass can see which ones bracket a speed
// fan transition. Matching samples cannot be discarded during discovery: one may be the last // transition. Matching samples cannot be discarded during discovery: one may be the last
// supported point before a narrow unsupported pocket found by a later probe. // supported point before a narrow unsupported pocket found by a later probe.
size_t kept = 0; size_t kept = 0;
for (size_t i = 0; i < interior.size(); ++i) { for (size_t i = 0; i < interior.size(); ++i) {
@@ -211,15 +195,15 @@ std::vector<ExtendedPoint<L::Dim>> estimate_points_properties(const POINTS&
const bool at_end = i + 1 == interior.size(); // And nothing follows the last sample but the segment's end const bool at_end = i + 1 == interior.size(); // And nothing follows the last sample but the segment's end
const float before = at_start ? curr.distance : interior[kept - 1].second; const float before = at_start ? curr.distance : interior[kept - 1].second;
const float after = at_end ? next.distance : interior[i + 1].second; const float after = at_end ? next.distance : interior[i + 1].second;
// A sample is worth a point in the path only where it prints differently, in speed or fan state, // A sample is worth a point in the path only where it prints at a different speed from the
// from the points either side of it. Differing from one of the segment's own ends is not enough on // readings either side of it. Differing from one of the segment's own ends is not enough on
// its own where the sample is not the slower or cooled of the two: the segmentation pass below // its own where the sample is the faster of the two: the segmentation pass below already
// already confines the slowdown and cooling at an end, at a distance taken from how far out that // ends the slowdown an end reads, at a distance taken from how far out that end is rather
// end is rather than from wherever bisection happened to stop, and a point here would leave the // than from wherever bisection happened to stop, and a point here would leave the span
// span beside the end too short for that pass to run at all. Support an end cannot account for, // beside the end too short for that pass to run at all. Support an end cannot account for,
// where the interior is the slower or cooled of the two, is exactly what this pass is here to find. // where the interior is the slower reading, is exactly what this pass is here to find.
const bool worth_before = !same_speed_and_fan(sample, before) && (!at_start || slower_or_cooled(sample, before)); const bool worth_before = !same_speed(sample, before) && (!at_start || prints_slower(sample, before));
const bool worth_after = !same_speed_and_fan(sample, after) && (!at_end || slower_or_cooled(sample, after)); const bool worth_after = !same_speed(sample, after) && (!at_end || prints_slower(sample, after));
if (worth_before || worth_after) if (worth_before || worth_after)
interior[kept++] = interior[i]; interior[kept++] = interior[i];
} }
@@ -254,60 +238,52 @@ std::vector<ExtendedPoint<L::Dim>> estimate_points_properties(const POINTS&
if ((curr.distance > -boundary_offset && curr.distance < boundary_offset + 2.0f) || if ((curr.distance > -boundary_offset && curr.distance < boundary_offset + 2.0f) ||
(next.distance > -boundary_offset && next.distance < boundary_offset + 2.0f)) { (next.distance > -boundary_offset && next.distance < boundary_offset + 2.0f)) {
double line_len = (next.position - curr.position).norm(); double line_len = (next.position - curr.position).norm();
// ORCA: A line prints as slow as its slower end and is cooled if either end is, so an overhang at one // ORCA: Segment path to smaller lines by adding additional points only if the path has an overhang that
// end would otherwise slow down or cool the whole line. Split the line so that only the part beside // will trigger a slowdown and the path is also reasonably large, i.e. 2mm in length or more
// that end prints that way, if the line is reasonably long (2mm or more) and at least one end prints // If there is no overhang in the start/end point, dont segment it.
// slower or cooled compared with a supported point (overhang distance 0). Deciding on how the end // Ignore this check if the control of segmentation for overhangs is disabled (min_distance=-1)
// prints, rather than on its overhang distance against min_distance, also catches an end whose overhang if ((min_distance > 0 && ((std::abs(curr.distance) > min_distance) || (std::abs(next.distance) > min_distance)) && line_len >= 2.f) ||
// distance is exactly where the slowdown begins, such as an outline crossing at half a line width. (min_distance <= 0 && line_len > 4.0f)) {
// Without distance_to_speed, split every line over 4mm.
const bool split_line = distance_to_speed ?
line_len >= 2.f && (slower_or_cooled(curr.distance, 0.f) || slower_or_cooled(next.distance, 0.f)) :
line_len > 4.0f;
if (split_line) {
// Each end's piece is that end's overhang distance plus 1.5 line widths (3 * boundary_offset) long:
// a0 ends the piece beside curr, a1 starts the piece beside next.
double a0 = std::clamp((curr.distance + 3 * boundary_offset) / line_len, 0.0, 1.0); double a0 = std::clamp((curr.distance + 3 * boundary_offset) / line_len, 0.0, 1.0);
double a1 = std::clamp(1.0f - (next.distance + 3 * boundary_offset) / line_len, 0.0, 1.0); double a1 = std::clamp(1.0f - (next.distance + 3 * boundary_offset) / line_len, 0.0, 1.0);
double t0 = std::min(a0, a1); double t0 = std::min(a0, a1);
double t1 = std::max(a0, a1); double t1 = std::max(a0, a1);
// Up to two cut points, in order along the line. Each takes its own overhang distance, so every if (t0 < 1.0) {
// piece prints by the overhang distances at its own two ends. t0 >= 1 or t1 <= 0 falls on the Vec p0 = curr.position + t0 * (next.position - curr.position);
// line's own end, so there is no cut. A cut closer than min_spacing to either end of the line is auto [p0_dist, p0_near_l, p0_x] = unscaled_prev_layer.template distance_from_lines_extra<SIGNED_DISTANCE>(
// not meaningful and is filtered out (#6714). p0.template cast<AABBScalar>());
ExtendedPoint<L::Dim> cut[2]{}; ExtendedPoint<L::Dim> new_p{};
bool keep[2] = {false, false}; new_p.position = p0;
for (int k = 0; k < 2; ++k) { new_p.distance = float(p0_dist + boundary_offset);
const double t = k == 0 ? t0 : t1; // ORCA: only create a new point in the path if the new point overhang distance will be used to generate a speed change
if (k == 0 ? t >= 1.0 : t <= 0.0) // or if this option is disabled (min_distance<=0)
continue; if( (std::abs(p0_dist) > min_distance) || (min_distance<=0)){
const Vec p = curr.position + t * (next.position - curr.position); // ORCA: also filter out points that are introduced to the start of the path when their distance from the start point is
auto [p_dist, p_near_l, p_x] = unscaled_prev_layer.template distance_from_lines_extra<SIGNED_DISTANCE>( // not meaningful
p.template cast<AABBScalar>()); if ((p0 - curr.position).norm() > min_spacing && (next.position - p0).norm() > min_spacing) {
cut[k].position = p; new_points.push_back(new_p);
cut[k].distance = float(p_dist + boundary_offset); }
keep[k] = (p - curr.position).norm() > min_spacing && (next.position - p).norm() > min_spacing; }
} }
if (distance_to_speed) { if (t1 > 0.0) {
// Only keep a cut that changes the G-code: one that prints differently from at least one of the Vec p1 = curr.position + t1 * (next.position - curr.position);
// points either side of it, which are the line's ends or the other cut where that is kept. A cut auto [p1_dist, p1_near_l, p1_x] = unscaled_prev_layer.template distance_from_lines_extra<SIGNED_DISTANCE>(
// that prints like both would only split a move into two identical ones. p1.template cast<AABBScalar>());
if (keep[0]) ExtendedPoint<L::Dim> new_p{};
keep[0] = !same_speed_and_fan(cut[0].distance, curr.distance) || new_p.position = p1;
!same_speed_and_fan(cut[0].distance, keep[1] ? cut[1].distance : next.distance); new_p.distance = float(p1_dist + boundary_offset);
if (keep[1]) // ORCA: only create a new point in the path if the new point overhang distance will be used to generate a speed change
keep[1] = !same_speed_and_fan(cut[1].distance, keep[0] ? cut[0].distance : curr.distance) || // or if this option is disabled (min_distance<=0)
!same_speed_and_fan(cut[1].distance, next.distance); if( (std::abs(p1_dist) > min_distance) || (min_distance<=0)){
// Two cuts closer together than min_spacing would leave a micro segment between them, so only the // ORCA: filter out points that are introduced to the end of the path when their distance from the end point is
// first is kept. // not meaningful
if (keep[0] && keep[1] && (cut[1].position - cut[0].position).norm() <= min_spacing) if ((p1 - curr.position).norm() > min_spacing && (next.position - p1).norm() > min_spacing) {
keep[1] = false; new_points.push_back(new_p);
}
}
} }
for (int k = 0; k < 2; ++k)
if (keep[k])
new_points.push_back(cut[k]);
} }
} }
new_points.push_back(next); new_points.push_back(next);
@@ -447,10 +423,7 @@ public:
const ConfigOptionFloatsOrPercents &speeds, const ConfigOptionFloatsOrPercents &speeds,
float ext_perimeter_speed, float ext_perimeter_speed,
float original_speed, float original_speed,
bool slowdown_for_curled_edges, bool slowdown_for_curled_edges)
// Overlap at or below which the overhang fan switches on; negative when the fan
// does not depend on overlap.
float fan_overlap_threshold = -1.0f)
{ {
size_t speed_sections_count = std::min(overlaps.values.size(), speeds.values.size()); size_t speed_sections_count = std::min(overlaps.values.size(), speeds.values.size());
std::vector<std::pair<float, float>> speed_sections; std::vector<std::pair<float, float>> speed_sections;
@@ -490,8 +463,7 @@ public:
} }
} }
// If no overhang distance slows this path down, -1 turns interior sampling off unless the overhang fan can switch. // If a meaningful (i.e. needing slowdown) overhang distance was not found, then we shouldn't split the lines
// Lines are only split where an end prints slower or cooled, so here only a fan switch splits them.
if (!found) if (!found)
smallest_distance_with_lower_speed=-1.f; smallest_distance_with_lower_speed=-1.f;
@@ -515,17 +487,9 @@ public:
return round(final_speed); return round(final_speed);
}; };
// ORCA: The speed sections are built from ext_perimeter_speed, which can be above the speed this path prints at
// (original_speed, e.g. held down by resonance avoidance). Every segment is capped at original_speed below, so
// overhang distances whose speeds differ only above it print the same and must not count as a speed change when
// the path is split.
auto effective_speed = [&calculate_speed, original_speed](float distance) {
return std::min(calculate_speed(distance), original_speed);
};
std::vector<ExtendedPoint<3>> extended_points = std::vector<ExtendedPoint<3>> extended_points =
estimate_points_properties<true, true, true, true>(path.polyline.points, prev_layer_boundaries[current_object], path.width, -1, estimate_points_properties<true, true, true, true>(path.polyline.points, prev_layer_boundaries[current_object], path.width, -1,
smallest_distance_with_lower_speed, effective_speed, fan_overlap_threshold); smallest_distance_with_lower_speed, calculate_speed);
const auto width_inv = 1.0f / path.width; const auto width_inv = 1.0f / path.width;
std::vector<ProcessedPoint> processed_points; std::vector<ProcessedPoint> processed_points;
processed_points.reserve(extended_points.size()); processed_points.reserve(extended_points.size());
+5 -10
View File
@@ -2717,8 +2717,7 @@ void Print::process(long long *time_cost_with_cache, bool use_cache)
{ {
LifecycleEventContext ctx; LifecycleEventContext ctx;
ctx.id = std::to_string(m_model.id().id); ctx.name = std::to_string(m_model.id().id);
ctx.name = get_model_name();
ctx.code = LifecycleEvtCode::Ok; ctx.code = LifecycleEvtCode::Ok;
ctx.cancellation_check = [this]() { return canceled(); }; ctx.cancellation_check = [this]() { return canceled(); };
fire_lifecycle_event(LifecycleEvent::SliceStarted, ctx); fire_lifecycle_event(LifecycleEvent::SliceStarted, ctx);
@@ -3345,8 +3344,7 @@ void Print::process(long long *time_cost_with_cache, bool use_cache)
{ {
LifecycleEventContext ctx; LifecycleEventContext ctx;
ctx.id = std::to_string(m_model.id().id); ctx.name = std::to_string(m_model.id().id);
ctx.name = get_model_name();
ctx.code = LifecycleEvtCode::Ok; ctx.code = LifecycleEvtCode::Ok;
ctx.cancellation_check = [this]() { return canceled(); }; ctx.cancellation_check = [this]() { return canceled(); };
fire_lifecycle_event(LifecycleEvent::SliceGeometryFinished, ctx); fire_lifecycle_event(LifecycleEvent::SliceGeometryFinished, ctx);
@@ -4952,8 +4950,7 @@ void Print::export_gcode_from_previous_file(const std::string& file, GCodeProces
{ {
{ {
LifecycleEventContext ctx; LifecycleEventContext ctx;
ctx.id = std::to_string(m_model.id().id); ctx.name = std::to_string(m_model.id().id);
ctx.name = get_model_name();
ctx.code = LifecycleEvtCode::Ok; ctx.code = LifecycleEvtCode::Ok;
ctx.msg = file; ctx.msg = file;
ctx.cancellation_check = [this]() { return canceled(); }; ctx.cancellation_check = [this]() { return canceled(); };
@@ -4983,8 +4980,7 @@ void Print::export_gcode_from_previous_file(const std::string& file, GCodeProces
BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << boost::format(": found errors when process gcode file %1%") %file.c_str(); BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << boost::format(": found errors when process gcode file %1%") %file.c_str();
{ {
LifecycleEventContext ctx; LifecycleEventContext ctx;
ctx.id = std::to_string(m_model.id().id); ctx.name = std::to_string(m_model.id().id);
ctx.name = get_model_name();
ctx.code = LifecycleEvtCode::Error; ctx.code = LifecycleEvtCode::Error;
ctx.msg = file + "\n" + ex.what(); ctx.msg = file + "\n" + ex.what();
ctx.cancellation_check = [this]() { return canceled(); }; ctx.cancellation_check = [this]() { return canceled(); };
@@ -4998,8 +4994,7 @@ void Print::export_gcode_from_previous_file(const std::string& file, GCodeProces
{ {
LifecycleEventContext ctx; LifecycleEventContext ctx;
ctx.id = std::to_string(m_model.id().id); ctx.name = std::to_string(m_model.id().id);
ctx.name = get_model_name();
ctx.code = LifecycleEvtCode::Ok; ctx.code = LifecycleEvtCode::Ok;
ctx.msg = file; ctx.msg = file;
ctx.cancellation_check = [this]() { return canceled(); }; ctx.cancellation_check = [this]() { return canceled(); };
+1 -6
View File
@@ -34,10 +34,6 @@ static const char* Segments_Vertex_Shader =
// ORCA: 0 during the shadow caster pass - the bias below shifts eye_position but not // ORCA: 0 during the shadow caster pass - the bias below shifts eye_position but not
// world_position, so the caster would write a depth the receiver never looks up. // world_position, so the caster would write a depth the receiver never looks up.
"uniform float bias_scale;\n" "uniform float bias_scale;\n"
// draw the instances last to first, top layers before the ones they hide, so that early depth
// rejection discards most of the hidden fragments; set when the camera looks down on the print
"uniform int reverse_order;\n"
"uniform int instance_count;\n"
"in int vertex_id;\n" "in int vertex_id;\n"
"out vec3 color;\n" "out vec3 color;\n"
"// ORCA: realistic view - the light the shadow map is able to block, kept apart from the\n" "// ORCA: realistic view - the light the shadow map is able to block, kept apart from the\n"
@@ -63,8 +59,7 @@ static const char* Segments_Vertex_Shader =
" return top_diffuse + front_diffuse + top_specular;\n" " return top_diffuse + front_diffuse + top_specular;\n"
"}\n" "}\n"
"void main() {\n" "void main() {\n"
" int instance = (reverse_order != 0) ? instance_count - 1 - gl_InstanceID : gl_InstanceID;\n" " int id_a = int(texelFetch(segment_index_tex, gl_InstanceID).r);\n"
" int id_a = int(texelFetch(segment_index_tex, instance).r);\n"
" int id_b = id_a + 1;\n" " int id_b = id_a + 1;\n"
" vec3 pos_a = texelFetch(position_tex, id_a).xyz;\n" " vec3 pos_a = texelFetch(position_tex, id_a).xyz;\n"
" vec3 pos_b = texelFetch(position_tex, id_b).xyz;\n" " vec3 pos_b = texelFetch(position_tex, id_b).xyz;\n"
-11
View File
@@ -763,8 +763,6 @@ void ViewerImpl::init(const std::string& opengl_context_version)
m_uni_segments_height_width_angle_tex_id = glGetUniformLocation(m_segments_shader_id, "height_width_angle_tex"); m_uni_segments_height_width_angle_tex_id = glGetUniformLocation(m_segments_shader_id, "height_width_angle_tex");
m_uni_segments_colors_tex_id = glGetUniformLocation(m_segments_shader_id, "color_tex"); m_uni_segments_colors_tex_id = glGetUniformLocation(m_segments_shader_id, "color_tex");
m_uni_segments_segment_index_tex_id = glGetUniformLocation(m_segments_shader_id, "segment_index_tex"); m_uni_segments_segment_index_tex_id = glGetUniformLocation(m_segments_shader_id, "segment_index_tex");
m_uni_segments_reverse_order_id = glGetUniformLocation(m_segments_shader_id, "reverse_order");
m_uni_segments_instance_count_id = glGetUniformLocation(m_segments_shader_id, "instance_count");
// ORCA: realistic view // ORCA: realistic view
m_uni_segments_shadow_map_id = glGetUniformLocation(m_segments_shader_id, "shadow_map"); m_uni_segments_shadow_map_id = glGetUniformLocation(m_segments_shader_id, "shadow_map");
m_uni_segments_shadow_light_vp_id = glGetUniformLocation(m_segments_shader_id, "shadow_light_vp"); m_uni_segments_shadow_light_vp_id = glGetUniformLocation(m_segments_shader_id, "shadow_light_vp");
@@ -2092,15 +2090,6 @@ void ViewerImpl::render_segments(const Mat4x4& view_matrix, const Mat4x4& projec
glsafe(glUniformMatrix4fv(m_uni_segments_view_matrix_id, 1, GL_FALSE, view_matrix.data())); glsafe(glUniformMatrix4fv(m_uni_segments_view_matrix_id, 1, GL_FALSE, view_matrix.data()));
glsafe(glUniformMatrix4fv(m_uni_segments_projection_matrix_id, 1, GL_FALSE, projection_matrix.data())); glsafe(glUniformMatrix4fv(m_uni_segments_projection_matrix_id, 1, GL_FALSE, projection_matrix.data()));
glsafe(glUniform3fv(m_uni_segments_camera_position_id, 1, camera_position.data())); glsafe(glUniform3fv(m_uni_segments_camera_position_id, 1, camera_position.data()));
// The segments come in print order, bottom layer first. Seen from above, that is back to front,
// and every hidden fragment is shaded before the one that covers it. Drawing them last to first
// lets the depth test reject the hidden ones instead. The camera looks down when the world's
// up axis points towards it, which is the view matrix's (2, 2) entry being positive.
const bool top_down = !m_rendering_shadow_casters && view_matrix[10] > 0.0f;
glsafe(glUniform1i(m_uni_segments_reverse_order_id, top_down ? 1 : 0));
#ifndef ENABLE_OPENGL_ES
glsafe(glUniform1i(m_uni_segments_instance_count_id, static_cast<int>(m_enabled_segments_count)));
#endif // ENABLE_OPENGL_ES
// ORCA: realistic view. The depth pass writes the map it would otherwise read, so it shades // ORCA: realistic view. The depth pass writes the map it would otherwise read, so it shades
// with the lookup off. // with the lookup off.
glsafe(glUniform1i(m_uni_segments_shadow_map_id, m_shadow_map_texture_unit)); glsafe(glUniform1i(m_uni_segments_shadow_map_id, m_shadow_map_texture_unit));
-2
View File
@@ -362,8 +362,6 @@ private:
int m_uni_segments_height_width_angle_tex_id{ -1 }; int m_uni_segments_height_width_angle_tex_id{ -1 };
int m_uni_segments_colors_tex_id{ -1 }; int m_uni_segments_colors_tex_id{ -1 };
int m_uni_segments_segment_index_tex_id{ -1 }; int m_uni_segments_segment_index_tex_id{ -1 };
int m_uni_segments_reverse_order_id{ -1 };
int m_uni_segments_instance_count_id{ -1 };
int m_uni_segments_shadow_map_id{ -1 }; int m_uni_segments_shadow_map_id{ -1 };
int m_uni_segments_shadow_light_vp_id{ -1 }; int m_uni_segments_shadow_light_vp_id{ -1 };
int m_uni_segments_shadow_intensity_id{ -1 }; int m_uni_segments_shadow_intensity_id{ -1 };

Some files were not shown because too many files have changed in this diff Show More