mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-09-28 11:21:30 +00:00
Compare commits
12
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d4a18c633e | ||
|
|
7707487252 | ||
|
|
3df9c215f8 | ||
|
|
cda1588578 | ||
|
|
ec0d8c225f | ||
|
|
3040ebaac1 | ||
|
|
d347a80ef8 | ||
|
|
e340a13c18 | ||
|
|
9e16cdb23b | ||
|
|
58842bab05 | ||
|
|
04204ec0d3 | ||
|
|
9ed459e132 |
@@ -44,14 +44,6 @@ jobs:
|
|||||||
uses: actions/download-artifact@v8
|
uses: actions/download-artifact@v8
|
||||||
with:
|
with:
|
||||||
name: ${{ inputs.artifact }}
|
name: ${{ inputs.artifact }}
|
||||||
# run_unit_tests.sh installs the plugin tests' numpy with the uv the build stages
|
|
||||||
# beside them; the Windows arm64 build bundles none, so put one on PATH there.
|
|
||||||
- name: Install uv
|
|
||||||
if: runner.os == 'Windows' && runner.arch == 'ARM64'
|
|
||||||
uses: astral-sh/setup-uv@v10.2.0
|
|
||||||
with:
|
|
||||||
version: "0.11.21" # ORCA_UV_VERSION in CMakeLists.txt
|
|
||||||
enable-cache: false
|
|
||||||
- uses: lukka/get-cmake@latest
|
- uses: lukka/get-cmake@latest
|
||||||
with:
|
with:
|
||||||
cmakeVersion: "~4.3.0" # use most recent 4.3.x version
|
cmakeVersion: "~4.3.0" # use most recent 4.3.x version
|
||||||
|
|||||||
@@ -52,6 +52,4 @@ internal_docs/
|
|||||||
__pycache__/
|
__pycache__/
|
||||||
*.pyc
|
*.pyc
|
||||||
*.opc
|
*.opc
|
||||||
/.test/
|
|
||||||
docs/superpowers/
|
docs/superpowers/
|
||||||
ctest_results.xml
|
|
||||||
|
|||||||
+155
-55
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "Blocks",
|
"name": "Blocks",
|
||||||
"version": "02.04.00.04",
|
"version": "02.04.00.13",
|
||||||
"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",
|
"name": "0.20mm Standard 0.4 nozzle @Blocks_Pro_S100",
|
||||||
"sub_path": "process/0.20mm Standard 0.4 nozzle @Blocks.json"
|
"sub_path": "process/0.20mm Standard 0.4 nozzle @Blocks_Pro_S100.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",
|
"name": "0.24mm Draft 0.4 nozzle @Blocks_Pro_S100",
|
||||||
"sub_path": "process/0.24mm Draft 0.4 nozzle @Blocks.json"
|
"sub_path": "process/0.24mm Draft 0.4 nozzle @Blocks_Pro_S100.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",
|
"name": "0.30mm Extra Draft 0.4 nozzle @Blocks_Pro_S100",
|
||||||
"sub_path": "process/0.30mm Extra Draft 0.4 nozzle @Blocks.json"
|
"sub_path": "process/0.30mm Extra Draft 0.4 nozzle @Blocks_Pro_S100.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",
|
"name": "0.30mm Standard 0.6 nozzle @Blocks_Pro_S100",
|
||||||
"sub_path": "process/0.30mm Standard 0.6 nozzle @Blocks.json"
|
"sub_path": "process/0.30mm Standard 0.6 nozzle @Blocks_Pro_S100.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",
|
"name": "0.40mm Draft 0.6 nozzle @Blocks_Pro_S100",
|
||||||
"sub_path": "process/0.40mm Draft 0.6 nozzle @Blocks.json"
|
"sub_path": "process/0.40mm Draft 0.6 nozzle @Blocks_Pro_S100.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "0.30mm Optimal 0.8 nozzle @Blocks",
|
"name": "0.30mm Optimal 0.8 nozzle @Blocks_Pro_S100",
|
||||||
"sub_path": "process/0.30mm Optimal 0.8 nozzle @Blocks.json"
|
"sub_path": "process/0.30mm Optimal 0.8 nozzle @Blocks_Pro_S100.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",
|
"name": "0.40mm Standard 0.8 nozzle @Blocks_Pro_S100",
|
||||||
"sub_path": "process/0.40mm Standard 0.8 nozzle @Blocks.json"
|
"sub_path": "process/0.40mm Standard 0.8 nozzle @Blocks_Pro_S100.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",
|
"name": "0.50mm Draft 0.8 nozzle @Blocks_Pro_S100",
|
||||||
"sub_path": "process/0.50mm Draft 0.8 nozzle @Blocks.json"
|
"sub_path": "process/0.50mm Draft 0.8 nozzle @Blocks_Pro_S100.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",
|
"name": "0.30mm Optimal 1.0 nozzle @Blocks_Pro_S100",
|
||||||
"sub_path": "process/0.30mm Optimal 1.0 nozzle @Blocks.json"
|
"sub_path": "process/0.30mm Optimal 1.0 nozzle @Blocks_Pro_S100.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "0.50mm Standard 1.0 nozzle @Blocks",
|
"name": "0.50mm Standard 1.0 nozzle @Blocks_Pro_S100",
|
||||||
"sub_path": "process/0.50mm Standard 1.0 nozzle @Blocks.json"
|
"sub_path": "process/0.50mm Standard 1.0 nozzle @Blocks_Pro_S100.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "0.60mm Draft 1.0 nozzle @Blocks",
|
"name": "0.60mm Draft 1.0 nozzle @Blocks_Pro_S100",
|
||||||
"sub_path": "process/0.60mm Draft 1.0 nozzle @Blocks.json"
|
"sub_path": "process/0.60mm Draft 1.0 nozzle @Blocks_Pro_S100.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "0.70mm Extra Draft 1.0 nozzle @Blocks",
|
"name": "0.70mm Extra Draft 1.0 nozzle @Blocks_Pro_S100",
|
||||||
"sub_path": "process/0.70mm Extra Draft 1.0 nozzle @Blocks.json"
|
"sub_path": "process/0.70mm Extra Draft 1.0 nozzle @Blocks_Pro_S100.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "0.50mm Optimal 1.2 nozzle @Blocks",
|
"name": "0.50mm Optimal 1.2 nozzle @Blocks_Pro_S100",
|
||||||
"sub_path": "process/0.50mm Optimal 1.2 nozzle @Blocks.json"
|
"sub_path": "process/0.50mm Optimal 1.2 nozzle @Blocks_Pro_S100.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "0.60mm Standard 1.2 nozzle @Blocks",
|
"name": "0.60mm Standard 1.2 nozzle @Blocks_Pro_S100",
|
||||||
"sub_path": "process/0.60mm Standard 1.2 nozzle @Blocks.json"
|
"sub_path": "process/0.60mm Standard 1.2 nozzle @Blocks_Pro_S100.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "0.70mm Draft 1.2 nozzle @Blocks",
|
"name": "0.70mm Draft 1.2 nozzle @Blocks_Pro_S100",
|
||||||
"sub_path": "process/0.70mm Draft 1.2 nozzle @Blocks.json"
|
"sub_path": "process/0.70mm Draft 1.2 nozzle @Blocks_Pro_S100.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "0.80mm Extra Draft 1.2 nozzle @Blocks",
|
"name": "0.80mm Extra Draft 1.2 nozzle @Blocks_Pro_S100",
|
||||||
"sub_path": "process/0.80mm Extra Draft 1.2 nozzle @Blocks.json"
|
"sub_path": "process/0.80mm Extra Draft 1.2 nozzle @Blocks_Pro_S100.json"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"filament_list": [
|
"filament_list": [
|
||||||
@@ -249,48 +249,148 @@
|
|||||||
"sub_path": "filament/fdm_filament_tpu.json"
|
"sub_path": "filament/fdm_filament_tpu.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Generic ABS @Blocks",
|
"name": "Blocks ABS @base",
|
||||||
"sub_path": "filament/Generic ABS @Blocks.json"
|
"sub_path": "filament/Blocks ABS @base.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Generic ASA @Blocks",
|
"name": "Blocks ASA @base",
|
||||||
"sub_path": "filament/Generic ASA @Blocks.json"
|
"sub_path": "filament/Blocks ASA @base.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Generic ASA-CF @Blocks",
|
"name": "Blocks ASA-CF @base",
|
||||||
"sub_path": "filament/Generic ASA-CF @Blocks.json"
|
"sub_path": "filament/Blocks ASA-CF @base.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Generic PA @Blocks",
|
"name": "Blocks PA @base",
|
||||||
"sub_path": "filament/Generic PA @Blocks.json"
|
"sub_path": "filament/Blocks PA @base.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Generic PA-CF @Blocks",
|
"name": "Blocks PA-CF @base",
|
||||||
"sub_path": "filament/Generic PA-CF @Blocks.json"
|
"sub_path": "filament/Blocks PA-CF @base.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Generic PC @Blocks",
|
"name": "Blocks PC @base",
|
||||||
"sub_path": "filament/Generic PC @Blocks.json"
|
"sub_path": "filament/Blocks PC @base.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Generic PETG @Blocks",
|
"name": "Blocks PETG @base",
|
||||||
"sub_path": "filament/Generic PETG @Blocks.json"
|
"sub_path": "filament/Blocks PETG @base.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Generic PLA @Blocks",
|
"name": "Blocks PLA @base",
|
||||||
"sub_path": "filament/Generic PLA @Blocks.json"
|
"sub_path": "filament/Blocks PLA @base.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Generic PLA-CF @Blocks",
|
"name": "Blocks PLA-CF @base",
|
||||||
"sub_path": "filament/Generic PLA-CF @Blocks.json"
|
"sub_path": "filament/Blocks PLA-CF @base.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Generic PVA @Blocks",
|
"name": "Blocks PVA @base",
|
||||||
"sub_path": "filament/Generic PVA @Blocks.json"
|
"sub_path": "filament/Blocks PVA @base.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Generic TPU @Blocks",
|
"name": "Blocks TPU @base",
|
||||||
"sub_path": "filament/Generic TPU @Blocks.json"
|
"sub_path": "filament/Blocks TPU @base.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": [
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
]
|
||||||
|
}
|
||||||
+6
-13
@@ -1,12 +1,13 @@
|
|||||||
{
|
{
|
||||||
"type": "filament",
|
"type": "filament",
|
||||||
"name": "Generic ABS @Blocks",
|
"name": "Blocks ABS @base",
|
||||||
"inherits": "fdm_filament_abs",
|
"inherits": "fdm_filament_abs",
|
||||||
"renamed_from": "Blocks Generic ABS",
|
|
||||||
"from": "system",
|
"from": "system",
|
||||||
"setting_id": "TL1Q1kA4t36GGObG",
|
"filament_id": "OFBBhiX8",
|
||||||
"filament_id": "OFY9muEs",
|
"instantiation": "false",
|
||||||
"instantiation": "true",
|
"filament_vendor": [
|
||||||
|
"Blocks"
|
||||||
|
],
|
||||||
"filament_flow_ratio": [
|
"filament_flow_ratio": [
|
||||||
"0.95"
|
"0.95"
|
||||||
],
|
],
|
||||||
@@ -81,13 +82,5 @@
|
|||||||
],
|
],
|
||||||
"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,14 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
]
|
||||||
|
}
|
||||||
+6
-13
@@ -1,12 +1,13 @@
|
|||||||
{
|
{
|
||||||
"type": "filament",
|
"type": "filament",
|
||||||
"name": "Generic ASA @Blocks",
|
"name": "Blocks ASA @base",
|
||||||
"inherits": "fdm_filament_asa",
|
"inherits": "fdm_filament_asa",
|
||||||
"renamed_from": "Blocks Generic ASA",
|
|
||||||
"from": "system",
|
"from": "system",
|
||||||
"setting_id": "xP7cB4RHgbm4cYDD",
|
"filament_id": "OFTz2YXa",
|
||||||
"filament_id": "OFLPAxz3",
|
"instantiation": "false",
|
||||||
"instantiation": "true",
|
"filament_vendor": [
|
||||||
|
"Blocks"
|
||||||
|
],
|
||||||
"filament_flow_ratio": [
|
"filament_flow_ratio": [
|
||||||
"0.95"
|
"0.95"
|
||||||
],
|
],
|
||||||
@@ -81,13 +82,5 @@
|
|||||||
],
|
],
|
||||||
"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,14 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
]
|
||||||
|
}
|
||||||
+6
-13
@@ -1,12 +1,13 @@
|
|||||||
{
|
{
|
||||||
"type": "filament",
|
"type": "filament",
|
||||||
"name": "Generic ASA-CF @Blocks",
|
"name": "Blocks ASA-CF @base",
|
||||||
"inherits": "fdm_filament_asa",
|
"inherits": "fdm_filament_asa",
|
||||||
"renamed_from": "Blocks Generic ASA-CF",
|
|
||||||
"from": "system",
|
"from": "system",
|
||||||
"setting_id": "ju4ue7yJoz3ujny6",
|
"filament_id": "OF8b9I7o",
|
||||||
"filament_id": "OF53eLVD",
|
"instantiation": "false",
|
||||||
"instantiation": "true",
|
"filament_vendor": [
|
||||||
|
"Blocks"
|
||||||
|
],
|
||||||
"filament_type": [
|
"filament_type": [
|
||||||
"ASA-CF"
|
"ASA-CF"
|
||||||
],
|
],
|
||||||
@@ -84,13 +85,5 @@
|
|||||||
],
|
],
|
||||||
"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,14 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
]
|
||||||
|
}
|
||||||
+6
-13
@@ -1,12 +1,13 @@
|
|||||||
{
|
{
|
||||||
"type": "filament",
|
"type": "filament",
|
||||||
"name": "Generic PA-CF @Blocks",
|
"name": "Blocks PA-CF @base",
|
||||||
"inherits": "fdm_filament_pa",
|
"inherits": "fdm_filament_pa",
|
||||||
"renamed_from": "Blocks Generic PA-CF",
|
|
||||||
"from": "system",
|
"from": "system",
|
||||||
"setting_id": "T6SO0WRdnG6wcyG8",
|
"filament_id": "OFdWrXpL",
|
||||||
"filament_id": "OFQLcbps",
|
"instantiation": "false",
|
||||||
"instantiation": "true",
|
"filament_vendor": [
|
||||||
|
"Blocks"
|
||||||
|
],
|
||||||
"filament_type": [
|
"filament_type": [
|
||||||
"PA-CF"
|
"PA-CF"
|
||||||
],
|
],
|
||||||
@@ -87,13 +88,5 @@
|
|||||||
],
|
],
|
||||||
"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,14 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
]
|
||||||
|
}
|
||||||
+6
-18
@@ -1,12 +1,13 @@
|
|||||||
{
|
{
|
||||||
"type": "filament",
|
"type": "filament",
|
||||||
"name": "Generic PETG @Blocks",
|
"name": "Blocks PETG @base",
|
||||||
"inherits": "fdm_filament_petg",
|
"inherits": "fdm_filament_petg",
|
||||||
"renamed_from": "Blocks Generic PETG",
|
|
||||||
"from": "system",
|
"from": "system",
|
||||||
"setting_id": "NgzPlYItKHbmGgv3",
|
"filament_id": "OF9t1Ga0",
|
||||||
"filament_id": "OFYPdQJh",
|
"instantiation": "false",
|
||||||
"instantiation": "true",
|
"filament_vendor": [
|
||||||
|
"Blocks"
|
||||||
|
],
|
||||||
"filament_flow_ratio": [
|
"filament_flow_ratio": [
|
||||||
"0.94"
|
"0.94"
|
||||||
],
|
],
|
||||||
@@ -81,18 +82,5 @@
|
|||||||
],
|
],
|
||||||
"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"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
]
|
||||||
|
}
|
||||||
+6
-18
@@ -1,12 +1,13 @@
|
|||||||
{
|
{
|
||||||
"type": "filament",
|
"type": "filament",
|
||||||
"name": "Generic PLA @Blocks",
|
"name": "Blocks PLA @base",
|
||||||
"inherits": "fdm_filament_pla",
|
"inherits": "fdm_filament_pla",
|
||||||
"renamed_from": "Blocks Generic PLA",
|
|
||||||
"from": "system",
|
"from": "system",
|
||||||
"setting_id": "kjhuttx4T8OtTNmV",
|
"filament_id": "OFVGAC8g",
|
||||||
"filament_id": "OFDSrzZ8",
|
"instantiation": "false",
|
||||||
"instantiation": "true",
|
"filament_vendor": [
|
||||||
|
"Blocks"
|
||||||
|
],
|
||||||
"filament_flow_ratio": [
|
"filament_flow_ratio": [
|
||||||
"0.95"
|
"0.95"
|
||||||
],
|
],
|
||||||
@@ -39,18 +40,5 @@
|
|||||||
],
|
],
|
||||||
"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,14 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
]
|
||||||
|
}
|
||||||
+6
-18
@@ -1,12 +1,13 @@
|
|||||||
{
|
{
|
||||||
"type": "filament",
|
"type": "filament",
|
||||||
"name": "Generic TPU @Blocks",
|
"name": "Blocks TPU @base",
|
||||||
"inherits": "fdm_filament_tpu",
|
"inherits": "fdm_filament_tpu",
|
||||||
"renamed_from": "Blocks Generic TPU",
|
|
||||||
"from": "system",
|
"from": "system",
|
||||||
"setting_id": "6iVYOCZo8ugs4JA0",
|
"filament_id": "OFYnedOZ",
|
||||||
"filament_id": "OFgbpcy9",
|
"instantiation": "false",
|
||||||
"instantiation": "true",
|
"filament_vendor": [
|
||||||
|
"Blocks"
|
||||||
|
],
|
||||||
"filament_max_volumetric_speed": [
|
"filament_max_volumetric_speed": [
|
||||||
"4"
|
"4"
|
||||||
],
|
],
|
||||||
@@ -54,18 +55,5 @@
|
|||||||
],
|
],
|
||||||
"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"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
{
|
|
||||||
"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,24 +0,0 @@
|
|||||||
{
|
|
||||||
"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,30 +0,0 @@
|
|||||||
{
|
|
||||||
"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"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
{
|
|
||||||
"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"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -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",
|
"default_print_profile": "0.20mm Standard 0.4 nozzle @Blocks_Pro_S100",
|
||||||
"max_layer_height": [
|
"max_layer_height": [
|
||||||
"0.30"
|
"0.30"
|
||||||
],
|
],
|
||||||
@@ -25,5 +25,8 @@
|
|||||||
"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",
|
"default_print_profile": "0.30mm Standard 0.6 nozzle @Blocks_Pro_S100",
|
||||||
"max_layer_height": [
|
"max_layer_height": [
|
||||||
"0.50"
|
"0.50"
|
||||||
],
|
],
|
||||||
@@ -26,5 +26,8 @@
|
|||||||
"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",
|
"default_print_profile": "0.40mm Standard 0.8 nozzle @Blocks_Pro_S100",
|
||||||
"max_layer_height": [
|
"max_layer_height": [
|
||||||
"0.56"
|
"0.56"
|
||||||
],
|
],
|
||||||
@@ -26,5 +26,8 @@
|
|||||||
"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",
|
"default_print_profile": "0.50mm Standard 1.0 nozzle @Blocks_Pro_S100",
|
||||||
"max_layer_height": [
|
"max_layer_height": [
|
||||||
"0.7"
|
"0.7"
|
||||||
],
|
],
|
||||||
@@ -26,5 +26,8 @@
|
|||||||
"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",
|
"default_print_profile": "0.60mm Standard 1.2 nozzle @Blocks_Pro_S100",
|
||||||
"max_layer_height": [
|
"max_layer_height": [
|
||||||
"0.8"
|
"0.8"
|
||||||
],
|
],
|
||||||
@@ -26,5 +26,8 @@
|
|||||||
"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": "Generic PLA @Blocks;Generic PETG @Blocks;Generic TPU @Blocks"
|
"default_materials": "Blocks PLA @Blocks_Pro_S100;Blocks PETG @Blocks_Pro_S100;Blocks TPU @Blocks_Pro_S100"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,5 +34,9 @@
|
|||||||
"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,5 +35,8 @@
|
|||||||
"deretraction_speed": [
|
"deretraction_speed": [
|
||||||
"80"
|
"80"
|
||||||
],
|
],
|
||||||
"printer_variant": "0.6"
|
"printer_variant": "0.6",
|
||||||
|
"default_filament_profile": [
|
||||||
|
"Blocks PLA @Blocks_RD50_V2"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,5 +35,8 @@
|
|||||||
"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": "Generic PLA @Blocks;Generic PETG @Blocks;Generic TPU @Blocks"
|
"default_materials": "Blocks PLA @Blocks_RD50_V2;Blocks PETG @Blocks_RD50_V2;Blocks TPU @Blocks_RD50_V2"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,7 +51,7 @@
|
|||||||
"12"
|
"12"
|
||||||
],
|
],
|
||||||
"retraction_length": [
|
"retraction_length": [
|
||||||
"1"
|
"1.2"
|
||||||
],
|
],
|
||||||
"retraction_speed": [
|
"retraction_speed": [
|
||||||
"60"
|
"60"
|
||||||
@@ -79,5 +79,10 @@
|
|||||||
],
|
],
|
||||||
"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"
|
"1.2"
|
||||||
],
|
],
|
||||||
"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]",
|
"PRINT_START EXTRUDER=[nozzle_temperature_initial_layer] BED=[bed_temperature_initial_layer]\n",
|
||||||
"SET_PRESSURE_ADVANCE ADVANCE=0.046"
|
"SET_PRESSURE_ADVANCE ADVANCE=0.046\n"
|
||||||
],
|
],
|
||||||
"printer_variant": "0.6",
|
"printer_variant": "0.6",
|
||||||
"wipe_distance": [
|
"wipe_distance": [
|
||||||
@@ -84,5 +84,10 @@
|
|||||||
],
|
],
|
||||||
"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"
|
"1.2"
|
||||||
],
|
],
|
||||||
"retraction_speed": [
|
"retraction_speed": [
|
||||||
"60"
|
"60"
|
||||||
@@ -80,5 +80,10 @@
|
|||||||
],
|
],
|
||||||
"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,5 +8,6 @@
|
|||||||
"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": "Generic PLA @Blocks;Generic PETG @Blocks;Generic TPU @Blocks"
|
"default_materials": "Blocks PLA @Blocks_RF50;Blocks PETG @Blocks_RF50;Blocks TPU @Blocks_RF50",
|
||||||
|
"not_support_bed_type": "Smooth Cool Plate;Engineering Plate;Textured Cool Plate;Cool Plate (SuperTack)"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -123,9 +123,6 @@
|
|||||||
"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_patter": "grid",
|
"sparse_infill_pattern": "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,5 +57,7 @@
|
|||||||
"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_patter": "grid",
|
"sparse_infill_pattern": "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,5 +57,7 @@
|
|||||||
"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_patter": "grid",
|
"sparse_infill_pattern": "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,5 +57,7 @@
|
|||||||
"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"
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-3
@@ -1,14 +1,15 @@
|
|||||||
{
|
{
|
||||||
"type": "process",
|
"type": "process",
|
||||||
"name": "0.20mm Standard 0.4 nozzle @Blocks",
|
"name": "0.20mm Standard 0.4 nozzle @Blocks_Pro_S100",
|
||||||
"inherits": "fdm_process_blocks_common",
|
"inherits": "fdm_process_blocks_common",
|
||||||
"from": "system",
|
"from": "system",
|
||||||
"setting_id": "47aDtVL6E5DVr7Mt",
|
"setting_id": "QSEguMMChNFZsK5H",
|
||||||
"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_patter": "grid",
|
"sparse_infill_pattern": "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,5 +61,7 @@
|
|||||||
"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"
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-3
@@ -1,14 +1,15 @@
|
|||||||
{
|
{
|
||||||
"type": "process",
|
"type": "process",
|
||||||
"name": "0.24mm Draft 0.4 nozzle @Blocks",
|
"name": "0.24mm Draft 0.4 nozzle @Blocks_Pro_S100",
|
||||||
"inherits": "fdm_process_blocks_common",
|
"inherits": "fdm_process_blocks_common",
|
||||||
"from": "system",
|
"from": "system",
|
||||||
"setting_id": "ETADjxV6ViJQdnHA",
|
"setting_id": "uALfEFHGmup6vBYI",
|
||||||
"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_patter": "grid",
|
"sparse_infill_pattern": "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,5 +57,7 @@
|
|||||||
"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_patter": "grid",
|
"sparse_infill_pattern": "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,5 +57,7 @@
|
|||||||
"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_patter": "grid",
|
"sparse_infill_pattern": "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,5 +57,7 @@
|
|||||||
"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"
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-3
@@ -1,14 +1,15 @@
|
|||||||
{
|
{
|
||||||
"type": "process",
|
"type": "process",
|
||||||
"name": "0.30mm Extra Draft 0.4 nozzle @Blocks",
|
"name": "0.30mm Extra Draft 0.4 nozzle @Blocks_Pro_S100",
|
||||||
"inherits": "fdm_process_blocks_common",
|
"inherits": "fdm_process_blocks_common",
|
||||||
"from": "system",
|
"from": "system",
|
||||||
"setting_id": "UbuICsmppKDsaaZ4",
|
"setting_id": "HYKF5l2OGvpugSQy",
|
||||||
"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"
|
||||||
}
|
}
|
||||||
+4
-3
@@ -1,14 +1,15 @@
|
|||||||
{
|
{
|
||||||
"type": "process",
|
"type": "process",
|
||||||
"name": "0.30mm Optimal 0.8 nozzle @Blocks",
|
"name": "0.30mm Optimal 0.8 nozzle @Blocks_Pro_S100",
|
||||||
"inherits": "fdm_process_common 0.8 nozzle",
|
"inherits": "fdm_process_common 0.8 nozzle",
|
||||||
"from": "system",
|
"from": "system",
|
||||||
"setting_id": "YqkYzp5zdH4R5upm",
|
"setting_id": "OUfZvizM5MGnvHfp",
|
||||||
"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_patter": "grid",
|
"sparse_infill_pattern": "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,5 +57,7 @@
|
|||||||
"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"
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-3
@@ -1,14 +1,15 @@
|
|||||||
{
|
{
|
||||||
"type": "process",
|
"type": "process",
|
||||||
"name": "0.30mm Optimal 1.0 nozzle @Blocks",
|
"name": "0.30mm Optimal 1.0 nozzle @Blocks_Pro_S100",
|
||||||
"inherits": "fdm_process_common 1.0 nozzle",
|
"inherits": "fdm_process_common 1.0 nozzle",
|
||||||
"from": "system",
|
"from": "system",
|
||||||
"setting_id": "8pBawPScHkyQu0SW",
|
"setting_id": "HGG9WxKVr89qNFDx",
|
||||||
"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"
|
||||||
}
|
}
|
||||||
+4
-3
@@ -1,14 +1,15 @@
|
|||||||
{
|
{
|
||||||
"type": "process",
|
"type": "process",
|
||||||
"name": "0.30mm Standard 0.6 nozzle @Blocks",
|
"name": "0.30mm Standard 0.6 nozzle @Blocks_Pro_S100",
|
||||||
"inherits": "fdm_process_common 0.6 nozzle",
|
"inherits": "fdm_process_common 0.6 nozzle",
|
||||||
"from": "system",
|
"from": "system",
|
||||||
"setting_id": "EPI3PAVK9LpJOZWO",
|
"setting_id": "gO2I1YjBl4nf8yzr",
|
||||||
"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_patter": "grid",
|
"sparse_infill_pattern": "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,5 +57,7 @@
|
|||||||
"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_patter": "grid",
|
"sparse_infill_pattern": "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,5 +57,7 @@
|
|||||||
"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_patter": "grid",
|
"sparse_infill_pattern": "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,5 +57,7 @@
|
|||||||
"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"
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-3
@@ -1,14 +1,15 @@
|
|||||||
{
|
{
|
||||||
"type": "process",
|
"type": "process",
|
||||||
"name": "0.40mm Draft 0.6 nozzle @Blocks",
|
"name": "0.40mm Draft 0.6 nozzle @Blocks_Pro_S100",
|
||||||
"inherits": "fdm_process_common 0.6 nozzle",
|
"inherits": "fdm_process_common 0.6 nozzle",
|
||||||
"from": "system",
|
"from": "system",
|
||||||
"setting_id": "CShVKoGspbMJNPw8",
|
"setting_id": "OjsLUl1heqv1cevs",
|
||||||
"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"
|
||||||
}
|
}
|
||||||
+4
-3
@@ -1,14 +1,15 @@
|
|||||||
{
|
{
|
||||||
"type": "process",
|
"type": "process",
|
||||||
"name": "0.40mm Standard 0.8 nozzle @Blocks",
|
"name": "0.40mm Standard 0.8 nozzle @Blocks_Pro_S100",
|
||||||
"inherits": "fdm_process_common 0.8 nozzle",
|
"inherits": "fdm_process_common 0.8 nozzle",
|
||||||
"from": "system",
|
"from": "system",
|
||||||
"setting_id": "TSRjmfWaatY7oLJB",
|
"setting_id": "laOTioBGySeudJpl",
|
||||||
"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_patter": "grid",
|
"sparse_infill_pattern": "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,5 +57,7 @@
|
|||||||
"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"
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-3
@@ -1,14 +1,15 @@
|
|||||||
{
|
{
|
||||||
"type": "process",
|
"type": "process",
|
||||||
"name": "0.50mm Draft 0.8 nozzle @Blocks",
|
"name": "0.50mm Draft 0.8 nozzle @Blocks_Pro_S100",
|
||||||
"inherits": "fdm_process_common 0.8 nozzle",
|
"inherits": "fdm_process_common 0.8 nozzle",
|
||||||
"from": "system",
|
"from": "system",
|
||||||
"setting_id": "vOtZHrDS88Shmf2m",
|
"setting_id": "oAhgUZdADR7kP87e",
|
||||||
"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"
|
||||||
}
|
}
|
||||||
+4
-3
@@ -1,14 +1,15 @@
|
|||||||
{
|
{
|
||||||
"type": "process",
|
"type": "process",
|
||||||
"name": "0.50mm Optimal 1.2 nozzle @Blocks",
|
"name": "0.50mm Optimal 1.2 nozzle @Blocks_Pro_S100",
|
||||||
"inherits": "fdm_process_common 1.2 nozzle",
|
"inherits": "fdm_process_common 1.2 nozzle",
|
||||||
"from": "system",
|
"from": "system",
|
||||||
"setting_id": "BKrEAKqDYzdH43wc",
|
"setting_id": "0eqNgX26jemsBfV5",
|
||||||
"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"
|
||||||
}
|
}
|
||||||
+4
-3
@@ -1,14 +1,15 @@
|
|||||||
{
|
{
|
||||||
"type": "process",
|
"type": "process",
|
||||||
"name": "0.50mm Standard 1.0 nozzle @Blocks",
|
"name": "0.50mm Standard 1.0 nozzle @Blocks_Pro_S100",
|
||||||
"inherits": "fdm_process_common 1.0 nozzle",
|
"inherits": "fdm_process_common 1.0 nozzle",
|
||||||
"from": "system",
|
"from": "system",
|
||||||
"setting_id": "D40iksDm7mFjhSKn",
|
"setting_id": "z1qCW1cEMc4QvBbV",
|
||||||
"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_patter": "grid",
|
"sparse_infill_pattern": "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,5 +57,7 @@
|
|||||||
"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"
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-3
@@ -1,14 +1,15 @@
|
|||||||
{
|
{
|
||||||
"type": "process",
|
"type": "process",
|
||||||
"name": "0.60mm Draft 1.0 nozzle @Blocks",
|
"name": "0.60mm Draft 1.0 nozzle @Blocks_Pro_S100",
|
||||||
"inherits": "fdm_process_common 1.0 nozzle",
|
"inherits": "fdm_process_common 1.0 nozzle",
|
||||||
"from": "system",
|
"from": "system",
|
||||||
"setting_id": "UJUe8XCBzZf8NyCL",
|
"setting_id": "gTTgtfG8qb9My3hH",
|
||||||
"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"
|
||||||
}
|
}
|
||||||
+4
-3
@@ -1,14 +1,15 @@
|
|||||||
{
|
{
|
||||||
"type": "process",
|
"type": "process",
|
||||||
"name": "0.60mm Standard 1.2 nozzle @Blocks",
|
"name": "0.60mm Standard 1.2 nozzle @Blocks_Pro_S100",
|
||||||
"inherits": "fdm_process_common 1.2 nozzle",
|
"inherits": "fdm_process_common 1.2 nozzle",
|
||||||
"from": "system",
|
"from": "system",
|
||||||
"setting_id": "PSBFrTykpkytPI2Q",
|
"setting_id": "ApcyToENCIANrI71",
|
||||||
"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"
|
||||||
}
|
}
|
||||||
+4
-3
@@ -1,14 +1,15 @@
|
|||||||
{
|
{
|
||||||
"type": "process",
|
"type": "process",
|
||||||
"name": "0.70mm Draft 1.2 nozzle @Blocks",
|
"name": "0.70mm Draft 1.2 nozzle @Blocks_Pro_S100",
|
||||||
"inherits": "fdm_process_common 1.2 nozzle",
|
"inherits": "fdm_process_common 1.2 nozzle",
|
||||||
"from": "system",
|
"from": "system",
|
||||||
"setting_id": "0ZQ0USGX9SwAKr29",
|
"setting_id": "DEv7X7zaTfxRQmjo",
|
||||||
"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"
|
||||||
}
|
}
|
||||||
+4
-3
@@ -1,14 +1,15 @@
|
|||||||
{
|
{
|
||||||
"type": "process",
|
"type": "process",
|
||||||
"name": "0.70mm Extra Draft 1.0 nozzle @Blocks",
|
"name": "0.70mm Extra Draft 1.0 nozzle @Blocks_Pro_S100",
|
||||||
"inherits": "fdm_process_common 1.0 nozzle",
|
"inherits": "fdm_process_common 1.0 nozzle",
|
||||||
"from": "system",
|
"from": "system",
|
||||||
"setting_id": "69PFmjOVFBOIp3Qg",
|
"setting_id": "nUW7N9dJmTyQT4AG",
|
||||||
"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"
|
||||||
}
|
}
|
||||||
+4
-3
@@ -1,14 +1,15 @@
|
|||||||
{
|
{
|
||||||
"type": "process",
|
"type": "process",
|
||||||
"name": "0.80mm Extra Draft 1.2 nozzle @Blocks",
|
"name": "0.80mm Extra Draft 1.2 nozzle @Blocks_Pro_S100",
|
||||||
"inherits": "fdm_process_common 1.2 nozzle",
|
"inherits": "fdm_process_common 1.2 nozzle",
|
||||||
"from": "system",
|
"from": "system",
|
||||||
"setting_id": "iBwRI5JJewW5HJSv",
|
"setting_id": "JMy62SonRfK0cAdL",
|
||||||
"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,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "OrcaFilamentLibrary",
|
"name": "OrcaFilamentLibrary",
|
||||||
"version": "02.04.00.12",
|
"version": "02.04.00.13",
|
||||||
"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": [
|
||||||
"80"
|
"81"
|
||||||
],
|
],
|
||||||
"fan_min_speed": [
|
"fan_min_speed": [
|
||||||
"50"
|
"50"
|
||||||
|
|||||||
@@ -2,8 +2,7 @@
|
|||||||
|
|
||||||
# This file is made to support the unit tests workflow.
|
# This file is made to support the unit tests workflow.
|
||||||
# It should only require the directories build/tests, scripts/, and tests/ to function,
|
# It should only require the directories build/tests, scripts/, and tests/ to function,
|
||||||
# and cmake (with ctest) installed -- plus network access to PyPI whenever numpy has to
|
# and cmake (with ctest) installed.
|
||||||
# be installed into a freshly built test tree (see below).
|
|
||||||
# (otherwise, update the workflow too, but try to avoid to keep things self-contained)
|
# (otherwise, update the workflow too, but try to avoid to keep things self-contained)
|
||||||
#
|
#
|
||||||
# Usage: run_unit_tests.sh [TEST_DIR] [BUILD_CONFIG]
|
# Usage: run_unit_tests.sh [TEST_DIR] [BUILD_CONFIG]
|
||||||
@@ -19,52 +18,6 @@ cd "${ROOT_DIR}" || exit 1
|
|||||||
TEST_DIR="${1:-build/tests}"
|
TEST_DIR="${1:-build/tests}"
|
||||||
BUILD_CONFIG="${2:-}"
|
BUILD_CONFIG="${2:-}"
|
||||||
|
|
||||||
# The slic3rutils plugin-host tests build numpy arrays through the CPython copied next
|
|
||||||
# to the test binary (see tests/slic3rutils/CMakeLists.txt), which ships no numpy.
|
|
||||||
# Install it with the uv staged beside that runtime -- the tool the app installs plugin
|
|
||||||
# dependencies with -- straight into the interpreter's own site-packages: no pip needed
|
|
||||||
# in the runtime, no PYTHONPATH. Re-checked every run because a rebuild of the test
|
|
||||||
# target re-copies the runtime; needs network whenever it installs. Pinned so a numpy
|
|
||||||
# release cannot change results on its own.
|
|
||||||
NUMPY_VERSION="2.5.3"
|
|
||||||
|
|
||||||
# Without numpy those tests assert the numpy-absent error path instead, so a local run
|
|
||||||
# only warns. Under CI it fails the run, which would otherwise stay green while silently
|
|
||||||
# dropping the array coverage. (The Flatpak leg runs this inside `flatpak build`, whose
|
|
||||||
# minimal environment has no CI, and its offline build stages no uv, so numpy stays
|
|
||||||
# best-effort there.)
|
|
||||||
numpy_unavailable() {
|
|
||||||
if [ -n "${CI:-}" ]; then
|
|
||||||
echo "error: $1" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo "warning: $1; the numpy-backed binding tests will cover only the numpy-absent path."
|
|
||||||
}
|
|
||||||
|
|
||||||
has_pinned_numpy() {
|
|
||||||
"${python_exe}" -c "import sys, numpy; sys.exit(numpy.__version__ != '${NUMPY_VERSION}')" >/dev/null 2>&1
|
|
||||||
}
|
|
||||||
|
|
||||||
find_args=("${TEST_DIR}" \( -path '*/python/bin/python3' -o -path '*/python/python.exe' \))
|
|
||||||
# Multi-config trees hold one copy per configuration; only bootstrap the one being run.
|
|
||||||
[ -n "${BUILD_CONFIG}" ] && find_args+=(-path "*/${BUILD_CONFIG}/*")
|
|
||||||
python_exe="$(find "${find_args[@]}" -print -quit 2>/dev/null)"
|
|
||||||
|
|
||||||
if [ -z "${python_exe}" ]; then
|
|
||||||
numpy_unavailable "no bundled Python under ${TEST_DIR}"
|
|
||||||
elif ! has_pinned_numpy; then
|
|
||||||
uv_exe="${python_exe%/python/*}/tools/uv/uv"
|
|
||||||
# Builds that bundle no uv (Windows arm64) fall back to one on PATH.
|
|
||||||
[ -x "${uv_exe}" ] || uv_exe="$(command -v uv)"
|
|
||||||
echo "Installing numpy ${NUMPY_VERSION} into the embedded test interpreter (${python_exe})..."
|
|
||||||
if [ -z "${uv_exe}" ]; then
|
|
||||||
numpy_unavailable "no uv staged beside the tests or on PATH"
|
|
||||||
elif ! "${uv_exe}" pip install --python "${python_exe}" --only-binary :all: "numpy==${NUMPY_VERSION}" \
|
|
||||||
|| ! has_pinned_numpy; then
|
|
||||||
numpy_unavailable "could not install numpy ${NUMPY_VERSION} into ${python_exe}"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Run the whole suite, excluding tests tagged [NotWorking] and tests labelled RequiresApp,
|
# Run the whole suite, excluding tests tagged [NotWorking] and tests labelled RequiresApp,
|
||||||
# which run the built orca-slicer binary that this directory does not contain.
|
# which run the built orca-slicer binary that this directory does not contain.
|
||||||
# --no-tests=error fails the job if the filter matches nothing (instead of passing green).
|
# --no-tests=error fails the job if the filter matches nothing (instead of passing green).
|
||||||
|
|||||||
+38
-28
@@ -2504,7 +2504,8 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu
|
|||||||
|
|
||||||
{
|
{
|
||||||
LifecycleEventContext ctx;
|
LifecycleEventContext ctx;
|
||||||
ctx.name = std::to_string(print->model().id().id);
|
ctx.id = 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(); };
|
||||||
@@ -2556,7 +2557,8 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu
|
|||||||
}
|
}
|
||||||
{
|
{
|
||||||
LifecycleEventContext ctx;
|
LifecycleEventContext ctx;
|
||||||
ctx.name = std::to_string(print->model().id().id);
|
ctx.id = 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(); };
|
||||||
@@ -2580,7 +2582,8 @@ 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.name = std::to_string(print->model().id().id);
|
ctx.id = 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(); };
|
||||||
@@ -2693,7 +2696,8 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu
|
|||||||
if (ret) {
|
if (ret) {
|
||||||
{
|
{
|
||||||
LifecycleEventContext ctx;
|
LifecycleEventContext ctx;
|
||||||
ctx.name = std::to_string(print->model().id().id);
|
ctx.id = 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(); };
|
||||||
@@ -2712,7 +2716,8 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu
|
|||||||
|
|
||||||
{
|
{
|
||||||
LifecycleEventContext ctx;
|
LifecycleEventContext ctx;
|
||||||
ctx.name = std::to_string(print->model().id().id);
|
ctx.id = 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(); };
|
||||||
@@ -7964,6 +7969,20 @@ 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;
|
||||||
@@ -8306,6 +8325,13 @@ 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},
|
||||||
@@ -8326,7 +8352,8 @@ 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},
|
||||||
@@ -8345,7 +8372,8 @@ 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)
|
||||||
@@ -8497,28 +8525,10 @@ 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;
|
||||||
}
|
}
|
||||||
switch (overhang_fan_threshold) {
|
if (overhang_fan_threshold == Overhang_threshold_none)
|
||||||
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);
|
||||||
break;
|
const float overlap_threshold = overhang_fan_overlap_threshold(overhang_fan_threshold);
|
||||||
default:
|
return overlap_threshold >= 0.f && overlap <= overlap_threshold;
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
std::string comment;
|
std::string comment;
|
||||||
|
|||||||
@@ -41,10 +41,12 @@ 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,
|
||||||
// Maps an overhang distance onto the speed it will be printed at. Interior sampling
|
// Speed an overhang distance prints at. Without it, interior sampling
|
||||||
// needs it to tell which of the points it could add would change the G-code, and is
|
// is skipped and every line over 4mm is split.
|
||||||
// skipped without it.
|
const std::function<float(float)>& distance_to_speed = {},
|
||||||
const std::function<float(float)>& distance_to_speed = {})
|
// Overlap (1 - distance / flow_width) at or below which the overhang
|
||||||
|
// 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) {
|
||||||
@@ -125,29 +127,43 @@ 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 an interior that is supported
|
// The passes below infer the support under a span from its endpoints alone, so a part that is supported
|
||||||
// differently from both ends is invisible to them: the outer perimeter of an overhang whose ends are caged by
|
// differently from both ends is invisible to them. The outer perimeter of an overhang whose ends are supported by
|
||||||
// full height walls reads as supported along its whole length. Probe the interior, keep the samples the
|
// reads as supported along its whole length. Probe the interior, keep the samples the endpoint interpolation fails to predict,
|
||||||
// endpoint interpolation fails to predict, and bisect either side of each one, so a span that is only partly
|
// and bisect either side of each one, so a span that is only partly unsupported gets points where its support actually changes
|
||||||
// unsupported gets points where its support actually changes instead of one reading spread across all of it.
|
// instead of one reading being spread across all of it.
|
||||||
if (PREV_LAYER_BOUNDARY_OFFSET && ADD_INTERSECTIONS && min_distance > 0 && distance_to_speed) {
|
// Skipped where there is nothing to find: min_distance <= 0 when no overhang can slow this path down, and
|
||||||
|
// 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 speed transition.
|
// together than min_spacing, so finer discovery would not produce a more precise 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; };
|
||||||
@@ -185,8 +201,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
|
// Coarse probing keeps every sample it took until this pass can see which ones bracket a speed or
|
||||||
// transition. Matching samples cannot be discarded during discovery: one may be the last
|
// fan 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) {
|
||||||
@@ -195,15 +211,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 at a different speed from the
|
// A sample is worth a point in the path only where it prints differently, in speed or fan state,
|
||||||
// readings either side of it. Differing from one of the segment's own ends is not enough on
|
// from the points either side of it. Differing from one of the segment's own ends is not enough on
|
||||||
// its own where the sample is the faster of the two: the segmentation pass below already
|
// its own where the sample is not the slower or cooled of the two: the segmentation pass below
|
||||||
// ends the slowdown an end reads, at a distance taken from how far out that end is rather
|
// already confines the slowdown and cooling at an end, at a distance taken from how far out that
|
||||||
// than from wherever bisection happened to stop, and a point here would leave the span
|
// end is rather than from wherever bisection happened to stop, and a point here would leave the
|
||||||
// beside the end too short for that pass to run at all. Support an end cannot account for,
|
// span beside the end too short for that pass to run at all. Support an end cannot account for,
|
||||||
// where the interior is the slower reading, is exactly what this pass is here to find.
|
// where the interior is the slower or cooled of the two, is exactly what this pass is here to find.
|
||||||
const bool worth_before = !same_speed(sample, before) && (!at_start || prints_slower(sample, before));
|
const bool worth_before = !same_speed_and_fan(sample, before) && (!at_start || slower_or_cooled(sample, before));
|
||||||
const bool worth_after = !same_speed(sample, after) && (!at_end || prints_slower(sample, after));
|
const bool worth_after = !same_speed_and_fan(sample, after) && (!at_end || slower_or_cooled(sample, after));
|
||||||
if (worth_before || worth_after)
|
if (worth_before || worth_after)
|
||||||
interior[kept++] = interior[i];
|
interior[kept++] = interior[i];
|
||||||
}
|
}
|
||||||
@@ -239,51 +255,59 @@ std::vector<ExtendedPoint<L::Dim>> estimate_points_properties(const POINTS&
|
|||||||
(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: Segment path to smaller lines by adding additional points only if the path has an overhang that
|
// ORCA: A line prints as slow as its slower end and is cooled if either end is, so an overhang at one
|
||||||
// will trigger a slowdown and the path is also reasonably large, i.e. 2mm in length or more
|
// end would otherwise slow down or cool the whole line. Split the line so that only the part beside
|
||||||
// If there is no overhang in the start/end point, dont segment it.
|
// that end prints that way, if the line is reasonably long (2mm or more) and at least one end prints
|
||||||
// Ignore this check if the control of segmentation for overhangs is disabled (min_distance=-1)
|
// slower or cooled compared with a supported point (overhang distance 0). Deciding on how the end
|
||||||
if ((min_distance > 0 && ((std::abs(curr.distance) > min_distance) || (std::abs(next.distance) > min_distance)) && line_len >= 2.f) ||
|
// prints, rather than on its overhang distance against min_distance, also catches an end whose overhang
|
||||||
(min_distance <= 0 && line_len > 4.0f)) {
|
// distance is exactly where the slowdown begins, such as an outline crossing at half a line width.
|
||||||
|
// 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);
|
||||||
|
|
||||||
if (t0 < 1.0) {
|
// Up to two cut points, in order along the line. Each takes its own overhang distance, so every
|
||||||
Vec p0 = curr.position + t0 * (next.position - curr.position);
|
// piece prints by the overhang distances at its own two ends. t0 >= 1 or t1 <= 0 falls on the
|
||||||
auto [p0_dist, p0_near_l, p0_x] = unscaled_prev_layer.template distance_from_lines_extra<SIGNED_DISTANCE>(
|
// line's own end, so there is no cut. A cut closer than min_spacing to either end of the line is
|
||||||
p0.template cast<AABBScalar>());
|
// not meaningful and is filtered out (#6714).
|
||||||
ExtendedPoint<L::Dim> new_p{};
|
ExtendedPoint<L::Dim> cut[2]{};
|
||||||
new_p.position = p0;
|
bool keep[2] = {false, false};
|
||||||
new_p.distance = float(p0_dist + boundary_offset);
|
for (int k = 0; k < 2; ++k) {
|
||||||
// ORCA: only create a new point in the path if the new point overhang distance will be used to generate a speed change
|
const double t = k == 0 ? t0 : t1;
|
||||||
// or if this option is disabled (min_distance<=0)
|
if (k == 0 ? t >= 1.0 : t <= 0.0)
|
||||||
if( (std::abs(p0_dist) > min_distance) || (min_distance<=0)){
|
continue;
|
||||||
// ORCA: also filter out points that are introduced to the start of the path when their distance from the start point is
|
const Vec p = curr.position + t * (next.position - curr.position);
|
||||||
// not meaningful
|
auto [p_dist, p_near_l, p_x] = unscaled_prev_layer.template distance_from_lines_extra<SIGNED_DISTANCE>(
|
||||||
if ((p0 - curr.position).norm() > min_spacing && (next.position - p0).norm() > min_spacing) {
|
p.template cast<AABBScalar>());
|
||||||
new_points.push_back(new_p);
|
cut[k].position = p;
|
||||||
}
|
cut[k].distance = float(p_dist + boundary_offset);
|
||||||
}
|
keep[k] = (p - curr.position).norm() > min_spacing && (next.position - p).norm() > min_spacing;
|
||||||
}
|
|
||||||
if (t1 > 0.0) {
|
|
||||||
Vec p1 = curr.position + t1 * (next.position - curr.position);
|
|
||||||
auto [p1_dist, p1_near_l, p1_x] = unscaled_prev_layer.template distance_from_lines_extra<SIGNED_DISTANCE>(
|
|
||||||
p1.template cast<AABBScalar>());
|
|
||||||
ExtendedPoint<L::Dim> new_p{};
|
|
||||||
new_p.position = p1;
|
|
||||||
new_p.distance = float(p1_dist + boundary_offset);
|
|
||||||
// ORCA: only create a new point in the path if the new point overhang distance will be used to generate a speed change
|
|
||||||
// or if this option is disabled (min_distance<=0)
|
|
||||||
if( (std::abs(p1_dist) > min_distance) || (min_distance<=0)){
|
|
||||||
// ORCA: filter out points that are introduced to the end of the path when their distance from the end point is
|
|
||||||
// not meaningful
|
|
||||||
if ((p1 - curr.position).norm() > min_spacing && (next.position - p1).norm() > min_spacing) {
|
|
||||||
new_points.push_back(new_p);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if (distance_to_speed) {
|
||||||
|
// Only keep a cut that changes the G-code: one that prints differently from at least one of the
|
||||||
|
// points either side of it, which are the line's ends or the other cut where that is kept. A cut
|
||||||
|
// that prints like both would only split a move into two identical ones.
|
||||||
|
if (keep[0])
|
||||||
|
keep[0] = !same_speed_and_fan(cut[0].distance, curr.distance) ||
|
||||||
|
!same_speed_and_fan(cut[0].distance, keep[1] ? cut[1].distance : next.distance);
|
||||||
|
if (keep[1])
|
||||||
|
keep[1] = !same_speed_and_fan(cut[1].distance, keep[0] ? cut[0].distance : curr.distance) ||
|
||||||
|
!same_speed_and_fan(cut[1].distance, next.distance);
|
||||||
|
// Two cuts closer together than min_spacing would leave a micro segment between them, so only the
|
||||||
|
// first is kept.
|
||||||
|
if (keep[0] && keep[1] && (cut[1].position - cut[0].position).norm() <= min_spacing)
|
||||||
|
keep[1] = false;
|
||||||
}
|
}
|
||||||
|
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);
|
||||||
@@ -423,7 +447,10 @@ 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;
|
||||||
@@ -463,7 +490,8 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If a meaningful (i.e. needing slowdown) overhang distance was not found, then we shouldn't split the lines
|
// If no overhang distance slows this path down, -1 turns interior sampling off unless the overhang fan can switch.
|
||||||
|
// 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;
|
||||||
|
|
||||||
@@ -487,9 +515,17 @@ 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, calculate_speed);
|
smallest_distance_with_lower_speed, effective_speed, fan_overlap_threshold);
|
||||||
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());
|
||||||
|
|||||||
+10
-5
@@ -2717,7 +2717,8 @@ void Print::process(long long *time_cost_with_cache, bool use_cache)
|
|||||||
|
|
||||||
{
|
{
|
||||||
LifecycleEventContext ctx;
|
LifecycleEventContext ctx;
|
||||||
ctx.name = std::to_string(m_model.id().id);
|
ctx.id = 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);
|
||||||
@@ -3344,7 +3345,8 @@ void Print::process(long long *time_cost_with_cache, bool use_cache)
|
|||||||
|
|
||||||
{
|
{
|
||||||
LifecycleEventContext ctx;
|
LifecycleEventContext ctx;
|
||||||
ctx.name = std::to_string(m_model.id().id);
|
ctx.id = 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);
|
||||||
@@ -4950,7 +4952,8 @@ void Print::export_gcode_from_previous_file(const std::string& file, GCodeProces
|
|||||||
{
|
{
|
||||||
{
|
{
|
||||||
LifecycleEventContext ctx;
|
LifecycleEventContext ctx;
|
||||||
ctx.name = std::to_string(m_model.id().id);
|
ctx.id = 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(); };
|
||||||
@@ -4980,7 +4983,8 @@ 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.name = std::to_string(m_model.id().id);
|
ctx.id = 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(); };
|
||||||
@@ -4994,7 +4998,8 @@ void Print::export_gcode_from_previous_file(const std::string& file, GCodeProces
|
|||||||
|
|
||||||
{
|
{
|
||||||
LifecycleEventContext ctx;
|
LifecycleEventContext ctx;
|
||||||
ctx.name = std::to_string(m_model.id().id);
|
ctx.id = 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(); };
|
||||||
|
|||||||
@@ -34,6 +34,10 @@ 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"
|
||||||
@@ -59,7 +63,8 @@ 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 id_a = int(texelFetch(segment_index_tex, gl_InstanceID).r);\n"
|
" int instance = (reverse_order != 0) ? instance_count - 1 - gl_InstanceID : gl_InstanceID;\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"
|
||||||
|
|||||||
@@ -763,6 +763,8 @@ 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");
|
||||||
@@ -2090,6 +2092,15 @@ 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));
|
||||||
|
|||||||
@@ -362,6 +362,8 @@ 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 };
|
||||||
|
|||||||
@@ -12800,8 +12800,6 @@ void Plater::priv::on_process_completed(SlicingProcessCompletedEvent &evt)
|
|||||||
notification_manager->set_slicing_progress_export_possible();
|
notification_manager->set_slicing_progress_export_possible();
|
||||||
|
|
||||||
// Reset the "export G-code path" name, so that the automatic background processing will be enabled again.
|
// Reset the "export G-code path" name, so that the automatic background processing will be enabled again.
|
||||||
const std::string lifecycle_job_name = this->background_process.fff_print() ?
|
|
||||||
this->background_process.fff_print()->output_filename() : std::string();
|
|
||||||
this->background_process.reset_export();
|
this->background_process.reset_export();
|
||||||
// This bool stops showing export finished notification even when process_completed_with_error is false
|
// This bool stops showing export finished notification even when process_completed_with_error is false
|
||||||
bool has_error = false;
|
bool has_error = false;
|
||||||
@@ -12848,8 +12846,18 @@ void Plater::priv::on_process_completed(SlicingProcessCompletedEvent &evt)
|
|||||||
|
|
||||||
{
|
{
|
||||||
Slic3r::LifecycleEventContext ctx;
|
Slic3r::LifecycleEventContext ctx;
|
||||||
ctx.name = lifecycle_job_name;
|
if (const PrintBase* print = this->background_process.current_print()) {
|
||||||
ctx.code = evt.cancelled() ? Slic3r::LifecycleEvtCode::Warn : (has_error ? Slic3r::LifecycleEvtCode::Error : Slic3r::LifecycleEvtCode::Ok);
|
const Model& model = print->model();
|
||||||
|
ctx.id = std::to_string(model.id().id);
|
||||||
|
if (model.model_info)
|
||||||
|
ctx.name = model.model_info->model_name;
|
||||||
|
} else {
|
||||||
|
// Realistically Printbase* print will never be null because select_technology already asserts an active print
|
||||||
|
// and the worker thread asserts it before processing.
|
||||||
|
BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << ": slicing completed without an active print; lifecycle event has no model ID";
|
||||||
|
}
|
||||||
|
ctx.code = evt.cancelled() ? Slic3r::LifecycleEvtCode::Warn :
|
||||||
|
(has_error ? Slic3r::LifecycleEvtCode::Error : Slic3r::LifecycleEvtCode::Ok);
|
||||||
ctx.msg = evt.cancelled() ? "cancelled" : (has_error ? lifecycle_error_msg : std::string());
|
ctx.msg = evt.cancelled() ? "cancelled" : (has_error ? lifecycle_error_msg : std::string());
|
||||||
Slic3r::fire_lifecycle_event(Slic3r::LifecycleEvent::SlicingJobComplete, ctx);
|
Slic3r::fire_lifecycle_event(Slic3r::LifecycleEvent::SlicingJobComplete, ctx);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -345,21 +345,16 @@ boost::filesystem::path find_bundled_python_home()
|
|||||||
fs::path bundle_python = fs::path(resources_dir()).parent_path() / "MacOS" / "python";
|
fs::path bundle_python = fs::path(resources_dir()).parent_path() / "MacOS" / "python";
|
||||||
if (valid_python_home(bundle_python))
|
if (valid_python_home(bundle_python))
|
||||||
return bundle_python;
|
return bundle_python;
|
||||||
#elif !defined(_WIN32)
|
#elif defined(_WIN32)
|
||||||
|
fs::path exe_python = boost::dll::program_location().parent_path() / "python";
|
||||||
|
if (valid_python_home(exe_python))
|
||||||
|
return exe_python;
|
||||||
|
#else
|
||||||
fs::path linux_python = fs::path(resources_dir()).parent_path() / "lib" / "python";
|
fs::path linux_python = fs::path(resources_dir()).parent_path() / "lib" / "python";
|
||||||
if (valid_python_home(linux_python))
|
if (valid_python_home(linux_python))
|
||||||
return linux_python;
|
return linux_python;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Next to the executable: the Windows install layout, and the runtime copied
|
|
||||||
// beside every platform's unit-test binary (tests/slic3rutils/CMakeLists.txt).
|
|
||||||
// The CI test runner only receives the build/tests tree, so the candidates
|
|
||||||
// below -- all of which point into the deps or install trees -- never resolve
|
|
||||||
// there.
|
|
||||||
fs::path exe_python = boost::dll::program_location().parent_path() / "python";
|
|
||||||
if (valid_python_home(exe_python))
|
|
||||||
return exe_python;
|
|
||||||
|
|
||||||
fs::path configured_python = ORCA_BUNDLED_PYTHON_ROOT;
|
fs::path configured_python = ORCA_BUNDLED_PYTHON_ROOT;
|
||||||
if (!configured_python.empty() && valid_python_home(configured_python))
|
if (!configured_python.empty() && valid_python_home(configured_python))
|
||||||
return configured_python;
|
return configured_python;
|
||||||
|
|||||||
@@ -244,6 +244,44 @@ float furthest_reading(const std::vector<ExtendedPoint<2>>& points)
|
|||||||
})->distance;
|
})->distance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// A wall along a supported edge of the previous layer, ending past or just short of the edge's end. Crossing the edge's
|
||||||
|
// end reads half a line width out.
|
||||||
|
constexpr double edge_run_length = 64.; // mm, wall start, measured from the end of the previous layer's edge
|
||||||
|
constexpr double edge_step = 0.384; // mm, how far this layer's contour extends past the previous layer's end
|
||||||
|
// The centreline is inset half a line width from the contour.
|
||||||
|
constexpr double edge_wall_end_past = edge_step - 0.5 * caged_wall_width;
|
||||||
|
constexpr double edge_wall_end_short = 0.05; // mm short of the edge, reading 0.21 - 0.05 = 0.16mm out
|
||||||
|
// Segmentation splits 1.5 line widths plus the end's reading from an end, so an end's slowdown and cooling stay within this.
|
||||||
|
constexpr double edge_affected_length = 3. * caged_wall_width;
|
||||||
|
|
||||||
|
std::vector<ExtendedPoint<2>> sampled_wall_along_edge(double wall_end_x,
|
||||||
|
const std::function<float(float)>& distance_to_speed,
|
||||||
|
float min_distance,
|
||||||
|
float fan_overlap_threshold)
|
||||||
|
{
|
||||||
|
const AABBTreeLines::LinesDistancer<Linef> prev_layer(std::vector<Linef>{
|
||||||
|
{{0., 0.}, {edge_run_length + 10., 0.}},
|
||||||
|
{{edge_run_length + 10., 0.}, {edge_run_length + 10., -10.}},
|
||||||
|
{{edge_run_length + 10., -10.}, {0., -10.}},
|
||||||
|
{{0., -10.}, {0., 0.}},
|
||||||
|
});
|
||||||
|
const double wall_y = -0.5 * caged_wall_width;
|
||||||
|
const Points wall{Point::new_scale(edge_run_length, wall_y), Point::new_scale(wall_end_x, wall_y)};
|
||||||
|
|
||||||
|
return estimate_points_properties<true, true, true, true>(wall, prev_layer, caged_wall_width, -1.f, min_distance,
|
||||||
|
distance_to_speed, fan_overlap_threshold);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Length printed with the overhang fan on: segments with either end's overlap at or below the threshold.
|
||||||
|
double cooled_length(const std::vector<ExtendedPoint<2>>& points, float fan_overlap_threshold)
|
||||||
|
{
|
||||||
|
double length = 0.;
|
||||||
|
for (size_t i = 0; i + 1 < points.size(); ++i)
|
||||||
|
if (1.f - std::max(points[i].distance, points[i + 1].distance) / float(caged_wall_width) <= fan_overlap_threshold)
|
||||||
|
length += (points[i + 1].position - points[i].position).norm();
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
|
||||||
DynamicPrintConfig caged_overhang_config(const char* wall_generator){
|
DynamicPrintConfig caged_overhang_config(const char* wall_generator){
|
||||||
DynamicPrintConfig config = DynamicPrintConfig::full_print_config();
|
DynamicPrintConfig config = DynamicPrintConfig::full_print_config();
|
||||||
config.set_deserialize_strict({
|
config.set_deserialize_strict({
|
||||||
@@ -431,6 +469,61 @@ TEST_CASE("A supported wall between overhanging corners is slowed no further tha
|
|||||||
REQUIRE(sampled <= unsampled);
|
REQUIRE(sampled <= unsampled);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Regression: the line up to a step past the previous layer was not split, so the step's slowdown and cooling covered the
|
||||||
|
// whole wall. The split required an end reading beyond where the slowdown begins, and an edge crossing reads exactly
|
||||||
|
// there when the wall speed is held below the reference speed (e.g. resonance avoidance).
|
||||||
|
TEST_CASE("A wall stepping past the previous layer is slowed and cooled only beside the step", "[ExtrusionProcessor][Regression]")
|
||||||
|
{
|
||||||
|
const float crossing_reading = 0.5f * float(caged_wall_width);
|
||||||
|
const std::function<float(float)> distance_to_speed = [crossing_reading](float distance) {
|
||||||
|
return distance < crossing_reading ? 70.f : 15.f;
|
||||||
|
};
|
||||||
|
const float fan_overlap_threshold = 0.75f; // The fan switches on at a 25% overhang
|
||||||
|
|
||||||
|
const std::vector<ExtendedPoint<2>> points = sampled_wall_along_edge(-edge_wall_end_past, distance_to_speed, crossing_reading,
|
||||||
|
fan_overlap_threshold);
|
||||||
|
const double slowed = slowed_length(points, distance_to_speed);
|
||||||
|
const double cooled = cooled_length(points, fan_overlap_threshold);
|
||||||
|
|
||||||
|
REQUIRE(slowed > 0.);
|
||||||
|
REQUIRE(cooled > 0.);
|
||||||
|
REQUIRE(slowed < edge_affected_length);
|
||||||
|
REQUIRE(cooled < edge_affected_length);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Regression: the fan can switch on at a smaller overhang than the first slowdown. Splitting only on speed changes left
|
||||||
|
// the whole wall cooled when its end read between the two.
|
||||||
|
TEST_CASE("A wall is split where only the overhang fan changes", "[ExtrusionProcessor][Regression]")
|
||||||
|
{
|
||||||
|
const float crossing_reading = 0.5f * float(caged_wall_width);
|
||||||
|
const std::function<float(float)> distance_to_speed = [crossing_reading](float distance) {
|
||||||
|
return distance < crossing_reading ? 70.f : 15.f;
|
||||||
|
};
|
||||||
|
// The end reads 0.16mm out (overlap 0.62): cooled at a 25% threshold, but not slowed.
|
||||||
|
const float fan_overlap_threshold = 0.75f;
|
||||||
|
|
||||||
|
const std::vector<ExtendedPoint<2>> points = sampled_wall_along_edge(edge_wall_end_short, distance_to_speed, crossing_reading,
|
||||||
|
fan_overlap_threshold);
|
||||||
|
const double cooled = cooled_length(points, fan_overlap_threshold);
|
||||||
|
|
||||||
|
REQUIRE_THAT(slowed_length(points, distance_to_speed), Catch::Matchers::WithinAbs(0., 1e-9));
|
||||||
|
REQUIRE(cooled > 0.);
|
||||||
|
REQUIRE(cooled < edge_affected_length);
|
||||||
|
}
|
||||||
|
|
||||||
|
// With one speed and a fan threshold no reading reaches, only the wall's ends and the edge crossing remain.
|
||||||
|
TEST_CASE("A wall is left whole where neither its speed nor its cooling changes", "[ExtrusionProcessor]")
|
||||||
|
{
|
||||||
|
const std::function<float(float)> distance_to_speed = [](float) { return 70.f; };
|
||||||
|
// 95% overhang; the step reads 0.384mm out (overlap 0.09).
|
||||||
|
const float fan_overlap_threshold = 0.05f;
|
||||||
|
|
||||||
|
const std::vector<ExtendedPoint<2>> points = sampled_wall_along_edge(-edge_wall_end_past, distance_to_speed, -1.f,
|
||||||
|
fan_overlap_threshold);
|
||||||
|
|
||||||
|
REQUIRE(points.size() == 3);
|
||||||
|
}
|
||||||
|
|
||||||
TEST_CASE("Benchmark caged overhang interior sampling", "[ExtrusionProcessor][!benchmark]"){
|
TEST_CASE("Benchmark caged overhang interior sampling", "[ExtrusionProcessor][!benchmark]"){
|
||||||
const char* wall_generator = GENERATE("classic", "arachne");
|
const char* wall_generator = GENERATE("classic", "arachne");
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,9 @@
|
|||||||
#include "libslic3r/Layer.hpp"
|
#include "libslic3r/Layer.hpp"
|
||||||
#include "libslic3r/Model.hpp"
|
#include "libslic3r/Model.hpp"
|
||||||
#include "libslic3r/GCodeReader.hpp"
|
#include "libslic3r/GCodeReader.hpp"
|
||||||
|
#include "libslic3r/GCode/GCodeProcessor.hpp"
|
||||||
|
#include "libslic3r/Exception.hpp"
|
||||||
|
#include "libslic3r/LifecycleEvents.hpp"
|
||||||
|
|
||||||
#include "test_helpers.hpp"
|
#include "test_helpers.hpp"
|
||||||
#include "test_utils.hpp"
|
#include "test_utils.hpp"
|
||||||
@@ -22,7 +25,10 @@
|
|||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
|
#include <memory>
|
||||||
#include <string_view>
|
#include <string_view>
|
||||||
|
#include <utility>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
using namespace Slic3r;
|
using namespace Slic3r;
|
||||||
using namespace Slic3r::Test;
|
using namespace Slic3r::Test;
|
||||||
@@ -224,8 +230,88 @@ std::string resolved_output_name(Model& model, const std::string& format, const
|
|||||||
return print.output_filename(filename_base);
|
return print.output_filename(filename_base);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct ScopedLifecycleHook
|
||||||
|
{
|
||||||
|
explicit ScopedLifecycleHook(LifecycleHookFn hook) { set_lifecycle_hook_fn(std::move(hook)); }
|
||||||
|
~ScopedLifecycleHook() { set_lifecycle_hook_fn(nullptr); }
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
TEST_CASE("Slicing lifecycle events identify the model", "[Print][LifecycleEvents]")
|
||||||
|
{
|
||||||
|
struct ObservedEvent {
|
||||||
|
LifecycleEvent event;
|
||||||
|
std::string id;
|
||||||
|
std::string name;
|
||||||
|
};
|
||||||
|
std::vector<ObservedEvent> events;
|
||||||
|
ScopedLifecycleHook hook([&](LifecycleEvent event, const LifecycleEventContext& ctx) {
|
||||||
|
events.push_back({ event, ctx.id, ctx.name });
|
||||||
|
});
|
||||||
|
|
||||||
|
Print print;
|
||||||
|
Model model;
|
||||||
|
ModelInfo info;
|
||||||
|
info.model_name = "Lifecycle test model";
|
||||||
|
model.model_info = std::make_shared<ModelInfo>(std::move(info));
|
||||||
|
init_print({cube(20)}, print, model);
|
||||||
|
|
||||||
|
print.process();
|
||||||
|
ScopedTemporaryFile temp(".gcode");
|
||||||
|
print.export_gcode(temp.string(), nullptr, nullptr);
|
||||||
|
GCodeProcessorResult result;
|
||||||
|
print.export_gcode_from_previous_file(temp.string(), &result);
|
||||||
|
|
||||||
|
const std::string expected_id = std::to_string(print.model().id().id);
|
||||||
|
const std::vector<LifecycleEvent> expected_events = {
|
||||||
|
LifecycleEvent::SliceStarted,
|
||||||
|
LifecycleEvent::SliceGeometryFinished,
|
||||||
|
LifecycleEvent::GCodeExportStarted,
|
||||||
|
LifecycleEvent::GCodeExportFinished,
|
||||||
|
LifecycleEvent::GCodeExportStarted,
|
||||||
|
LifecycleEvent::GCodeExportFinished,
|
||||||
|
};
|
||||||
|
REQUIRE(events.size() == expected_events.size());
|
||||||
|
for (size_t i = 0; i < expected_events.size(); ++i) {
|
||||||
|
CHECK(events[i].event == expected_events[i]);
|
||||||
|
CHECK(events[i].id == expected_id);
|
||||||
|
CHECK(events[i].name == "Lifecycle test model");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("Slicing lifecycle event name is empty without model metadata", "[Print][LifecycleEvents]")
|
||||||
|
{
|
||||||
|
std::string event_id;
|
||||||
|
std::string event_name = "unset";
|
||||||
|
ScopedLifecycleHook hook([&](LifecycleEvent event, const LifecycleEventContext& ctx) {
|
||||||
|
if (event == LifecycleEvent::SliceStarted) {
|
||||||
|
event_id = ctx.id;
|
||||||
|
event_name = ctx.name;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Print print;
|
||||||
|
Model model;
|
||||||
|
init_print({cube(20)}, print, model);
|
||||||
|
print.process();
|
||||||
|
|
||||||
|
CHECK(event_id == std::to_string(print.model().id().id));
|
||||||
|
CHECK(event_name.empty());
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("Output filenames with numeric statistics fail before slicing finishes", "[Print][Regression]")
|
||||||
|
{
|
||||||
|
DynamicPrintConfig config = DynamicPrintConfig::full_print_config();
|
||||||
|
config.set_key_value("filename_format", new ConfigOptionString("{int(total_weight*10) / 10.0}"));
|
||||||
|
|
||||||
|
Print print;
|
||||||
|
Model model;
|
||||||
|
init_print({cube(20)}, print, model, config);
|
||||||
|
|
||||||
|
CHECK_THROWS_AS(print.output_filename(), PlaceholderParserError);
|
||||||
|
}
|
||||||
|
|
||||||
TEST_CASE("Print: {first_object_name} names the first printable object on the plate", "[Print]")
|
TEST_CASE("Print: {first_object_name} names the first printable object on the plate", "[Print]")
|
||||||
{
|
{
|
||||||
Model model;
|
Model model;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user