Compare commits

..
Author SHA1 Message Date
Ian Chua 576cce2f72 test: bump elegoo profile to test OFL OTA E2E [TO BE REVERTED] (#15954)
Merged by /bot merge on behalf of @peachismomo (id 52488812).
Grants: resources/profiles/OrcaFilamentLibrary/filament/Elegoo, resources/profiles/OrcaFilamentLibrary.json, resources/profiles/Elegoo, resources/profiles/Elegoo.json
Head: d4a18c633e
2026-09-28 10:47:41 +00:00
Kenneth Rapleeandyw4z f3a8f711fd Catch Standard_Failure before std::exception (OCCT >= 8) (#15826)
Co-authored-by: yw4z <ywsyildiz@gmail.com>
2026-09-28 13:44:32 +03:00
Kenneth Rapleeandyw4z 00bde9265b Add missing OCCT (8.x) header includes (#15825)
* Add missing TopTools includes to GeometryEngine.cpp

* Add missing TDF_LabelSequence include in STEP.cpp

---------

Co-authored-by: yw4z <ywsyildiz@gmail.com>
2026-09-28 13:42:25 +03:00
Ioannis Giannakas 7707487252 Fix overhang slowdown and fan applied to whole walls ahead of an overhang (#15945) 2026-09-28 10:59:39 +01:00
Hugo Costa 3df9c215f8 Blocks: branded filaments, naming/loading fixes, RF50 bed type and other fixes. (#15804)
# Description

<!--
> Please provide a summary of the changes made in this PR. Include
details such as:
  > * What issue does this PR address or fix?
  > * What new features or enhancements does this PR introduce?
> * Are there any breaking changes or dependencies that need to be
considered?
-->

This PR fixes some problems with the current profiles for Blocks
printers

- **Fix**: start gcode for the Blocks 0.6mm RF50 printer where the start
gcode command had no newline separation on two commands so they were
concatenated and would make printing fail.
- **Added**: multi material plates selection for the RF50 printers,
right now only textured PEI and smooth high temp plates are available,
but in the future more to come.
- **Naming consistancy** for Blocks Pro S100 processes and filaments,
target labels used bare `@Blocks` while RD50 and RF50 used
`@Blocks_RD50` and `@Blocks_RF50`. Renamed Pro S100 to
`@Blocks_Pro_S100` to match the structure.
- **Filament restructure**: replaced Blocks tuned-generic filaments
(e.g. `Generic PLA @Blocks`) with real Blocks-branded filaments. One for
each printer model. Every material keeps the same coverage we already
had.
- **Fix**: `sparse_infill_pattern` was misspelled `sparse_infill_patter`
on 13 `@Blocks_RF50` process presets. Harmless due to inheritances but
fixed non the less.
- **Fix**: `Blocks RD50 V2 0.4 nozzle.json` was missing
`printer_variant`.
- **Normalize** all Blocks profiles to standard formatting (tab
indentation, key order) and bumped `Blocks.json` version.
- **RF50 retraction length** increased on all RF50 machines.


## Tests

- [x] `orca_profile_tool.py check --vendor Blocks` - clean
- [x] `orca_profile_tool.py check` - clean
- [x] `normalize` / `generate-id` / `update-index --dry-run` — fully
settled, no pending changes
- [x] `check_profile.sh --vendor Blocks` → `profile_tool` check — passes
- [ ] `validate_system` / `validate_slice` /
`validate_filament_subtypes` / `validate_custom` —
could not run locally (dev host's glibc 2.36 is older than the nightly
validator binary's
      required 2.38); needs CI or a compatible host
- [x] In-app confirmation that the Blocks bundle loads
 
<!--
> A guide for users on how to download the artifacts from this PR.
-->

[How to Download Pull Requests Artifacts for
Testing](https://www.orcaslicer.com/wiki/how_to_download_pr_artifacts)
2026-09-28 17:16:55 +08:00
110 changed files with 1052 additions and 1051 deletions
-80
View File
@@ -1,80 +0,0 @@
# G-code preview while dragging
The sliced preview draws every toolpath segment of the plate as an instanced box. On a large
plate that is tens of millions of segments, and the frame is GPU-bound: the cost is the number of
instances drawn, not anything the CPU does per frame. Dragging the camera over such a plate cannot
keep up. The `preview_reduced_detail_mode` preference (*Graphics > G-code Preview*, off by
default) lets the preview draw less while the user drags and put the full toolpaths back when they
let go.
| Preference | Values | Effect |
|---|---|---|
| `preview_reduced_detail_mode` | `off`, `solid`, `shell` | what is drawn while dragging |
libvgcode (`src/libvgcode`) builds and binds the reduced toolpath set, `GCodeViewer` maps the
preferences onto it and draws the solid model, and `GLCanvas3D` decides when the user is dragging.
The OpenGL ES path keeps a single set and ignores the preference.
## Two sets, one walk
`ViewerImpl::update_enabled_entities()` walks the visible vertex range once and fills two segment
index buffers side by side: the **full** set and the **reduced** set (segments and options).
Building them together is what makes switching free: starting or ending a drag is a buffer
binding, never a rebuild. A change of mode does rebuild. Nothing is built while the mode
is off, and the reduced buffers are then uploaded empty so that the last set does not stay
allocated.
Whatever the mode leaves out, the bottom and top layers of the visible range are kept whole: they
are the faces the range cuts open, and the top is what the user is looking at.
### Modes
- `EndLayersOnly` (`solid` in the preference) keeps only the two end layers. `GCodeViewer` then
draws the sliced objects and the prime tower as opaque solids, see below.
- `ShellOnly` (`shell`) keeps every role but the sparse infill, internal solid infill, internal
bridge infill and gap fill, which lie under the skins or between the walls. Walls, top and
bottom surfaces, bridges, supports and the prime tower are drawn whole, so from outside the
print looks as it does at rest. The roles come from
the slicer, so the classification is exact wherever the slicer's is; what it cannot express is
the inside of the prime tower and of a support, which share one role with their outside and are
kept whole. A profile with no top or bottom shell layers, or no walls, leaves the infill on the
surface, so `GCodeViewer` turns the hiding off for such a print when it loads it, from the
print's default region settings; per-object overrides are not consulted.
## The solid model
The preview already loads the sliced objects as shells for its translucent ghost.
`GCodeViewer::render_solid_model()` draws those shells opaque, in their filament colors, with the
`gouraud` shader, whose z range cuts them to the visible layer range. The two toolpath layers of
the reduced set are drawn afterwards and cap the cut with what was really printed there. The
shells hold only the objects, so while this mode is on the prime tower is added from its sliced
mesh, positioned as the print placed it. It is added or removed on its own when the mode changes,
without reloading the objects, keeps its opaque color so that it never appears among the
translucent shells, and stays out of their bounding box. Supports have no mesh and are not shown,
and `load_shells()` drops every non-model-part volume, so a negative volume is not cut out.
A plate whose shells are not loaded keeps drawing toolpaths, since the solid model would leave
only the end layers.
## Deciding that the user is dragging
`GLCanvas3D::_update_preview_interaction()` runs at the top of every preview frame, before the
canvas decides whether to reuse its cached scene, so that the switch lands in that frame. Dragging
is `GLCanvas3D::is_user_interacting()`, the same answer the scene cache reads: the camera, the
navigator, a gizmo, the rectangle selection or either slider being held. A slider reports this from
ImGui's active id rather than its dirty flag, which is raised and consumed inside one frame. A
wheel step has no duration, so it holds the reduced set for a 150 ms settle time instead, and the
frame that restores the toolpaths is scheduled for when that time runs out, since the render timer
only wakes the idle loop. A drag cut short by focus or capture loss is ended explicitly, and a
button release wakes the idle loop, because on some platforms nothing else would until the next
input.
## Reused scene frames
`GLCanvas3D` keeps its last scene pass for frames that only rebuild the overlay (`SceneCache`). Its
key covers the canvas size, the camera and hover state, not what the toolpath sets draw, so a frame
that reuses the scene must never be one on which the set is switched.
`_update_preview_interaction()` therefore reports whether the bound set changed, and a frame on
which it did redraws the scene. The canvas neither captures nor reuses the scene while the user
drags, so no reduced frame outlives a drag, and the frame that ends a wheel's settle time is
requested as a full frame.
+155 -55
View File
@@ -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"
]
}
@@ -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"
]
}
@@ -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"
]
}
@@ -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"
]
}
@@ -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"
]
}
@@ -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"
]
}
@@ -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"
]
}
@@ -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"
} }
@@ -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"
} }
@@ -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"
} }
@@ -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"
} }
@@ -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"
} }
@@ -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"
} }
@@ -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"
} }
@@ -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"
} }
@@ -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"
} }
@@ -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"
} }
@@ -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"
} }
@@ -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"
} }
@@ -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"
} }
@@ -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"
} }
@@ -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"
} }
@@ -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"
} }
@@ -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 -1
View File
@@ -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"
-7
View File
@@ -205,13 +205,6 @@ void AppConfig::set_defaults()
if (get("seq_top_layer_only").empty()) if (get("seq_top_layer_only").empty())
set("seq_top_layer_only", "1"); set("seq_top_layer_only", "1");
// what the preview draws while the user drags it
{
const std::string mode = get("preview_reduced_detail_mode");
if (mode != "off" && mode != "solid" && mode != "shell")
set("preview_reduced_detail_mode", "off");
}
// ORCA: darken the layers the preview layer slider is not scrubbed to // ORCA: darken the layers the preview layer slider is not scrubbed to
if (get("preview_dim_previous_layers").empty()) if (get("preview_dim_previous_layers").empty())
set_bool("preview_dim_previous_layers", false); set_bool("preview_dim_previous_layers", false);
+2 -2
View File
@@ -2673,10 +2673,10 @@ void CadDocument::apply_feature(TopoDS_Shape& result, bool& have_body,
ridge = pipe.Shape(); ridge = pipe.Shape();
have_ridge = !ridge.IsNull(); have_ridge = !ridge.IsNull();
} }
} catch (const Standard_Failure&) {
have_ridge = false; // OCCT failure — on OCCT >= 8 Standard_Failure derives from std::exception, so this handler must come first
} catch (const std::exception&) { } catch (const std::exception&) {
have_ridge = false; // fall back to the bare cylinder/bore below have_ridge = false; // fall back to the bare cylinder/bore below
} catch (const Standard_Failure&) {
have_ridge = false; // OCCT failure (not a std::exception) — must be caught here too
} }
if (f.thread_internal) { if (f.thread_internal) {
+2
View File
@@ -15,6 +15,8 @@
#include <TopExp.hxx> #include <TopExp.hxx>
#include <TopTools.hxx> #include <TopTools.hxx>
#include <TopTools_IndexedMapOfShape.hxx> #include <TopTools_IndexedMapOfShape.hxx>
#include <TopTools_ListOfShape.hxx>
#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
#include <Poly_Triangulation.hxx> #include <Poly_Triangulation.hxx>
#include <gp_Ax2.hxx> #include <gp_Ax2.hxx>
#include <gp_Dir.hxx> #include <gp_Dir.hxx>
+1
View File
@@ -25,6 +25,7 @@
#include "XCAFDoc_DocumentTool.hxx" #include "XCAFDoc_DocumentTool.hxx"
#include "XCAFDoc_ShapeTool.hxx" #include "XCAFDoc_ShapeTool.hxx"
#include "XCAFApp_Application.hxx" #include "XCAFApp_Application.hxx"
#include "TDF_LabelSequence.hxx"
#include "TopoDS_Solid.hxx" #include "TopoDS_Solid.hxx"
#include "TopoDS_Compound.hxx" #include "TopoDS_Compound.hxx"
#include "TopoDS_Builder.hxx" #include "TopoDS_Builder.hxx"
+28 -23
View File
@@ -7969,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;
@@ -8311,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},
@@ -8331,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},
@@ -8350,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)
@@ -8502,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;
+109 -73
View File
@@ -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());
-15
View File
@@ -158,21 +158,6 @@ enum class EGCodeExtrusionRole : uint8_t
static constexpr std::size_t GCODE_EXTRUSION_ROLES_COUNT = static_cast<std::size_t>(EGCodeExtrusionRole::COUNT); static constexpr std::size_t GCODE_EXTRUSION_ROLES_COUNT = static_cast<std::size_t>(EGCodeExtrusionRole::COUNT);
//
// What the reduced set, drawn while the user is dragging, holds in place of the full toolpaths
//
enum class EReducedDetailMode : uint8_t
{
// nothing: no reduced set is built
Off,
// only the bottom and top layers of the visible range, for a caller that draws the print
// itself some other way
EndLayersOnly,
// every role but the infill under the skins and the gap fill: what can be seen from outside
ShellOnly,
COUNT
};
// //
// Option types // Option types
// //
-13
View File
@@ -114,19 +114,6 @@ public:
// //
bool is_dim_previous_layers() const; bool is_dim_previous_layers() const;
void set_dim_previous_layers(bool value); void set_dim_previous_layers(bool value);
//
// The reduced set drawn while the user drags: what the mode keeps, and always the bottom and
// top layers of the visible range. While a mode is set it is built alongside the full set, so
// set_reduced_detail() rebuilds nothing. Ignored on the OpenGL ES path.
//
EReducedDetailMode get_reduced_detail_mode() const;
void set_reduced_detail_mode(EReducedDetailMode mode);
// Whether the shell mode hides the infill roles; off for a profile that leaves them on the
// surface, with no top or bottom shell or no walls.
bool get_reduced_detail_hide_infill() const;
void set_reduced_detail_hide_infill(bool value);
void set_reduced_detail(bool value);
bool is_reduced_detail() const;
float get_dim_previous_layers_brightness() const; float get_dim_previous_layers_brightness() const;
void set_dim_previous_layers_brightness(float value); void set_dim_previous_layers_brightness(float value);
// //
-5
View File
@@ -25,11 +25,6 @@ struct Settings
// ORCA: how bright those darkened layers are rendered, 1.0 = unchanged, 0.0 = black // ORCA: how bright those darkened layers are rendered, 1.0 = unchanged, 0.0 = black
float dim_previous_layers_brightness{ 0.4f }; float dim_previous_layers_brightness{ 0.4f };
bool spiral_vase_mode{ false }; bool spiral_vase_mode{ false };
// what the reduced set holds and whether it is drawn. Ignored on the OpenGL ES path.
EReducedDetailMode reduced_detail_mode{ EReducedDetailMode::Off };
// whether the shell mode may hide the infill roles: false when the profile leaves them on the surface
bool reduced_detail_hide_infill{ true };
bool reduced_detail{ false };
// //
// Required update flags // Required update flags
// //
-30
View File
@@ -92,36 +92,6 @@ bool Viewer::is_dim_previous_layers() const
return m_impl->is_dim_previous_layers(); return m_impl->is_dim_previous_layers();
} }
void Viewer::set_reduced_detail(bool value)
{
m_impl->set_reduced_detail(value);
}
bool Viewer::is_reduced_detail() const
{
return m_impl->is_reduced_detail();
}
EReducedDetailMode Viewer::get_reduced_detail_mode() const
{
return m_impl->get_reduced_detail_mode();
}
void Viewer::set_reduced_detail_mode(EReducedDetailMode mode)
{
m_impl->set_reduced_detail_mode(mode);
}
bool Viewer::get_reduced_detail_hide_infill() const
{
return m_impl->get_reduced_detail_hide_infill();
}
void Viewer::set_reduced_detail_hide_infill(bool value)
{
m_impl->set_reduced_detail_hide_infill(value);
}
void Viewer::set_dim_previous_layers(bool value) void Viewer::set_dim_previous_layers(bool value)
{ {
m_impl->set_dim_previous_layers(value); m_impl->set_dim_previous_layers(value);
+9 -104
View File
@@ -17,7 +17,6 @@
#include <algorithm> #include <algorithm>
#include <cmath> #include <cmath>
#include <numeric> #include <numeric>
#include <cfloat>
namespace libvgcode { namespace libvgcode {
@@ -902,17 +901,9 @@ void ViewerImpl::reset()
#else #else
m_enabled_segments_count = 0; m_enabled_segments_count = 0;
m_enabled_options_count = 0; m_enabled_options_count = 0;
m_enabled_segments_reduced_count = 0;
m_enabled_options_reduced_count = 0;
m_enabled_segments_reduced_tex_size = 0;
m_enabled_options_reduced_tex_size = 0;
m_settings_used_for_ranges = std::nullopt; m_settings_used_for_ranges = std::nullopt;
delete_textures(m_enabled_options_reduced_tex_id);
delete_buffers(m_enabled_options_reduced_buf_id);
delete_textures(m_enabled_segments_reduced_tex_id);
delete_buffers(m_enabled_segments_reduced_buf_id);
delete_textures(m_enabled_options_tex_id); delete_textures(m_enabled_options_tex_id);
delete_buffers(m_enabled_options_buf_id); delete_buffers(m_enabled_options_buf_id);
delete_textures(m_enabled_segments_tex_id); delete_textures(m_enabled_segments_tex_id);
@@ -1172,17 +1163,6 @@ void ViewerImpl::load(GCodeInputData&& gcode_data)
glsafe(glGenTextures(1, &m_enabled_options_tex_id)); glsafe(glGenTextures(1, &m_enabled_options_tex_id));
glsafe(glBindTexture(GL_TEXTURE_BUFFER, m_enabled_options_tex_id)); glsafe(glBindTexture(GL_TEXTURE_BUFFER, m_enabled_options_tex_id));
// create (but do not fill) the reduced counterparts of the two buffers above
glsafe(glGenBuffers(1, &m_enabled_segments_reduced_buf_id));
glsafe(glBindBuffer(GL_TEXTURE_BUFFER, m_enabled_segments_reduced_buf_id));
glsafe(glGenTextures(1, &m_enabled_segments_reduced_tex_id));
glsafe(glBindTexture(GL_TEXTURE_BUFFER, m_enabled_segments_reduced_tex_id));
glsafe(glGenBuffers(1, &m_enabled_options_reduced_buf_id));
glsafe(glBindBuffer(GL_TEXTURE_BUFFER, m_enabled_options_reduced_buf_id));
glsafe(glGenTextures(1, &m_enabled_options_reduced_tex_id));
glsafe(glBindTexture(GL_TEXTURE_BUFFER, m_enabled_options_reduced_tex_id));
glsafe(glBindBuffer(GL_TEXTURE_BUFFER, 0)); glsafe(glBindBuffer(GL_TEXTURE_BUFFER, 0));
glsafe(glBindTexture(GL_TEXTURE_BUFFER, old_bound_texture)); glsafe(glBindTexture(GL_TEXTURE_BUFFER, old_bound_texture));
#endif // ENABLE_OPENGL_ES #endif // ENABLE_OPENGL_ES
@@ -1194,18 +1174,6 @@ void ViewerImpl::load(GCodeInputData&& gcode_data)
update_colors(); update_colors();
} }
#ifndef ENABLE_OPENGL_ES
// the roles that lie under a skin or between walls, never seen from outside the print
static bool is_hidden_in_shell(EGCodeExtrusionRole role)
{
return role == EGCodeExtrusionRole::InternalInfill ||
role == EGCodeExtrusionRole::SolidInfill ||
role == EGCodeExtrusionRole::InternalBridgeInfill ||
role == EGCodeExtrusionRole::GapFill;
}
#endif // ENABLE_OPENGL_ES
void ViewerImpl::update_enabled_entities() void ViewerImpl::update_enabled_entities()
{ {
if (m_vertices.empty()) if (m_vertices.empty())
@@ -1213,17 +1181,6 @@ void ViewerImpl::update_enabled_entities()
std::vector<uint32_t> enabled_segments; std::vector<uint32_t> enabled_segments;
std::vector<uint32_t> enabled_options; std::vector<uint32_t> enabled_options;
#ifndef ENABLE_OPENGL_ES
// the reduced set is filled by the same walk, so switching to it costs no rebuild. Whatever the
// mode leaves out, the bottom and top layers of the visible range are kept whole: they are the
// surfaces the range cuts open
const EReducedDetailMode reduced_mode = m_settings.reduced_detail_mode;
const bool build_reduced = reduced_mode != EReducedDetailMode::Off;
const bool hide_infill = m_settings.reduced_detail_hide_infill;
std::vector<uint32_t> enabled_segments_reduced;
std::vector<uint32_t> enabled_options_reduced;
const Interval& layers_range = m_layers.get_view_range();
#endif // ENABLE_OPENGL_ES
Interval range = m_view_range.get_visible(); Interval range = m_view_range.get_visible();
// when top layer only visualization is enabled, we need to render // when top layer only visualization is enabled, we need to render
@@ -1271,20 +1228,6 @@ void ViewerImpl::update_enabled_entities()
enabled_options.push_back(static_cast<uint32_t>(i)); enabled_options.push_back(static_cast<uint32_t>(i));
else else
enabled_segments.push_back(static_cast<uint32_t>(i)); enabled_segments.push_back(static_cast<uint32_t>(i));
#ifndef ENABLE_OPENGL_ES
if (build_reduced) {
const bool end_layer = v.layer_id == layers_range[0] || v.layer_id == layers_range[1];
if (end_layer)
(v.is_option() ? enabled_options_reduced : enabled_segments_reduced).push_back(static_cast<uint32_t>(i));
else if (reduced_mode == EReducedDetailMode::ShellOnly) {
if (v.is_option())
enabled_options_reduced.push_back(static_cast<uint32_t>(i));
else if (!v.is_extrusion() || !hide_infill || !is_hidden_in_shell(v.role))
enabled_segments_reduced.push_back(static_cast<uint32_t>(i));
}
}
#endif // ENABLE_OPENGL_ES
} }
#ifdef ENABLE_OPENGL_ES #ifdef ENABLE_OPENGL_ES
@@ -1313,23 +1256,6 @@ void ViewerImpl::update_enabled_entities()
else else
glsafe(glBufferData(GL_TEXTURE_BUFFER, 0, nullptr, GL_STATIC_DRAW)); glsafe(glBufferData(GL_TEXTURE_BUFFER, 0, nullptr, GL_STATIC_DRAW));
m_enabled_segments_reduced_count = enabled_segments_reduced.size();
m_enabled_options_reduced_count = enabled_options_reduced.size();
m_enabled_segments_reduced_tex_size = enabled_segments_reduced.size() * sizeof(uint32_t);
m_enabled_options_reduced_tex_size = enabled_options_reduced.size() * sizeof(uint32_t);
// uploaded even when nothing was built, so that the last reduced set is released as soon as
// the preference is switched off
assert(m_enabled_segments_reduced_buf_id > 0);
glsafe(glBindBuffer(GL_TEXTURE_BUFFER, m_enabled_segments_reduced_buf_id));
glsafe(glBufferData(GL_TEXTURE_BUFFER, m_enabled_segments_reduced_tex_size,
enabled_segments_reduced.empty() ? nullptr : enabled_segments_reduced.data(), GL_STATIC_DRAW));
assert(m_enabled_options_reduced_buf_id > 0);
glsafe(glBindBuffer(GL_TEXTURE_BUFFER, m_enabled_options_reduced_buf_id));
glsafe(glBufferData(GL_TEXTURE_BUFFER, m_enabled_options_reduced_tex_size,
enabled_options_reduced.empty() ? nullptr : enabled_options_reduced.data(), GL_STATIC_DRAW));
glsafe(glBindBuffer(GL_TEXTURE_BUFFER, 0)); glsafe(glBindBuffer(GL_TEXTURE_BUFFER, 0));
#endif // ENABLE_OPENGL_ES #endif // ENABLE_OPENGL_ES
@@ -1537,23 +1463,6 @@ void ViewerImpl::toggle_top_layer_only_view_range()
update_colors_texture(); update_colors_texture();
} }
// Both decide which vertices land in the reduced set, so the sets are rebuilt.
void ViewerImpl::set_reduced_detail_mode(EReducedDetailMode mode)
{
if (m_settings.reduced_detail_mode == mode)
return;
m_settings.reduced_detail_mode = mode;
m_settings.update_enabled_entities = true;
}
void ViewerImpl::set_reduced_detail_hide_infill(bool value)
{
if (m_settings.reduced_detail_hide_infill == value)
return;
m_settings.reduced_detail_hide_infill = value;
m_settings.update_enabled_entities = true;
}
// ORCA: enable/disable darkening of the layers the layer slider is not scrubbed to // ORCA: enable/disable darkening of the layers the layer slider is not scrubbed to
void ViewerImpl::set_dim_previous_layers(bool value) void ViewerImpl::set_dim_previous_layers(bool value)
{ {
@@ -1947,8 +1856,6 @@ size_t ViewerImpl::get_used_gpu_memory() const
ret += m_colors_tex_size; ret += m_colors_tex_size;
ret += m_enabled_segments_tex_size; ret += m_enabled_segments_tex_size;
ret += m_enabled_options_tex_size; ret += m_enabled_options_tex_size;
ret += m_enabled_segments_reduced_tex_size;
ret += m_enabled_options_reduced_tex_size;
#endif // ENABLE_OPENGL_ES #endif // ENABLE_OPENGL_ES
return ret; return ret;
} }
@@ -2165,8 +2072,7 @@ void ViewerImpl::render_segments(const Mat4x4& view_matrix, const Mat4x4& projec
#ifdef ENABLE_OPENGL_ES #ifdef ENABLE_OPENGL_ES
if (m_texture_data.get_enabled_segments_count() == 0) if (m_texture_data.get_enabled_segments_count() == 0)
#else #else
const ActiveSet segments = active_segments(); if (m_enabled_segments_count == 0)
if (segments.count == 0)
#endif // ENABLE_OPENGL_ES #endif // ENABLE_OPENGL_ES
return; return;
@@ -2193,7 +2099,7 @@ void ViewerImpl::render_segments(const Mat4x4& view_matrix, const Mat4x4& projec
const bool top_down = !m_rendering_shadow_casters && view_matrix[10] > 0.0f; 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)); glsafe(glUniform1i(m_uni_segments_reverse_order_id, top_down ? 1 : 0));
#ifndef ENABLE_OPENGL_ES #ifndef ENABLE_OPENGL_ES
glsafe(glUniform1i(m_uni_segments_instance_count_id, static_cast<int>(segments.count))); glsafe(glUniform1i(m_uni_segments_instance_count_id, static_cast<int>(m_enabled_segments_count)));
#endif // ENABLE_OPENGL_ES #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.
@@ -2243,10 +2149,10 @@ void ViewerImpl::render_segments(const Mat4x4& view_matrix, const Mat4x4& projec
glsafe(glBindTexture(GL_TEXTURE_BUFFER, m_colors_tex_id)); glsafe(glBindTexture(GL_TEXTURE_BUFFER, m_colors_tex_id));
glsafe(glTexBuffer(GL_TEXTURE_BUFFER, GL_R32F, m_colors_buf_id)); glsafe(glTexBuffer(GL_TEXTURE_BUFFER, GL_R32F, m_colors_buf_id));
glsafe(glActiveTexture(GL_TEXTURE3)); glsafe(glActiveTexture(GL_TEXTURE3));
glsafe(glBindTexture(GL_TEXTURE_BUFFER, segments.tex_id)); glsafe(glBindTexture(GL_TEXTURE_BUFFER, m_enabled_segments_tex_id));
glsafe(glTexBuffer(GL_TEXTURE_BUFFER, GL_R32UI, segments.buf_id)); glsafe(glTexBuffer(GL_TEXTURE_BUFFER, GL_R32UI, m_enabled_segments_buf_id));
m_segment_template.render(segments.count); m_segment_template.render(m_enabled_segments_count);
#endif // ENABLE_OPENGL_ES #endif // ENABLE_OPENGL_ES
if (curr_cull_face) if (curr_cull_face)
@@ -2272,8 +2178,7 @@ void ViewerImpl::render_options(const Mat4x4& view_matrix, const Mat4x4& project
#ifdef ENABLE_OPENGL_ES #ifdef ENABLE_OPENGL_ES
if (m_texture_data.get_enabled_options_count() == 0) if (m_texture_data.get_enabled_options_count() == 0)
#else #else
const ActiveSet options = active_options(); if (m_enabled_options_count == 0)
if (options.count == 0)
#endif // ENABLE_OPENGL_ES #endif // ENABLE_OPENGL_ES
return; return;
@@ -2331,10 +2236,10 @@ void ViewerImpl::render_options(const Mat4x4& view_matrix, const Mat4x4& project
glsafe(glBindTexture(GL_TEXTURE_BUFFER, m_colors_tex_id)); glsafe(glBindTexture(GL_TEXTURE_BUFFER, m_colors_tex_id));
glsafe(glTexBuffer(GL_TEXTURE_BUFFER, GL_R32F, m_colors_buf_id)); glsafe(glTexBuffer(GL_TEXTURE_BUFFER, GL_R32F, m_colors_buf_id));
glsafe(glActiveTexture(GL_TEXTURE3)); glsafe(glActiveTexture(GL_TEXTURE3));
glsafe(glBindTexture(GL_TEXTURE_BUFFER, options.tex_id)); glsafe(glBindTexture(GL_TEXTURE_BUFFER, m_enabled_options_tex_id));
glsafe(glTexBuffer(GL_TEXTURE_BUFFER, GL_R32UI, options.buf_id)); glsafe(glTexBuffer(GL_TEXTURE_BUFFER, GL_R32UI, m_enabled_options_buf_id));
m_option_template.render(options.count); m_option_template.render(m_enabled_options_count);
#endif // ENABLE_OPENGL_ES #endif // ENABLE_OPENGL_ES
if (!curr_cull_face) if (!curr_cull_face)
-45
View File
@@ -109,21 +109,6 @@ public:
// 0.0 = black // 0.0 = black
bool is_dim_previous_layers() const { return m_settings.dim_previous_layers; } bool is_dim_previous_layers() const { return m_settings.dim_previous_layers; }
void set_dim_previous_layers(bool value); void set_dim_previous_layers(bool value);
//
// Draw from the reduced set; it is already built, so this is just a buffer binding.
//
void set_reduced_detail(bool value) {
#ifdef ENABLE_OPENGL_ES
// no reduced set is built on OpenGL ES
value = false;
#endif // ENABLE_OPENGL_ES
m_settings.reduced_detail = value;
}
bool is_reduced_detail() const { return m_settings.reduced_detail; }
EReducedDetailMode get_reduced_detail_mode() const { return m_settings.reduced_detail_mode; }
void set_reduced_detail_mode(EReducedDetailMode mode);
bool get_reduced_detail_hide_infill() const { return m_settings.reduced_detail_hide_infill; }
void set_reduced_detail_hide_infill(bool value);
float get_dim_previous_layers_brightness() const { return m_settings.dim_previous_layers_brightness; } float get_dim_previous_layers_brightness() const { return m_settings.dim_previous_layers_brightness; }
void set_dim_previous_layers_brightness(float value); void set_dim_previous_layers_brightness(float value);
@@ -516,15 +501,6 @@ private:
unsigned int m_enabled_options_tex_id{ 0 }; unsigned int m_enabled_options_tex_id{ 0 };
size_t m_enabled_options_count{ 0 }; size_t m_enabled_options_count{ 0 };
// //
// OpenGL buffers to store the reduced set drawn while Settings::reduced_detail is set
//
unsigned int m_enabled_segments_reduced_buf_id{ 0 };
unsigned int m_enabled_segments_reduced_tex_id{ 0 };
size_t m_enabled_segments_reduced_count{ 0 };
unsigned int m_enabled_options_reduced_buf_id{ 0 };
unsigned int m_enabled_options_reduced_tex_id{ 0 };
size_t m_enabled_options_reduced_count{ 0 };
//
// Caches for size of data sent to gpu, in bytes // Caches for size of data sent to gpu, in bytes
// //
size_t m_positions_tex_size{ 0 }; size_t m_positions_tex_size{ 0 };
@@ -532,27 +508,6 @@ private:
size_t m_colors_tex_size{ 0 }; size_t m_colors_tex_size{ 0 };
size_t m_enabled_segments_tex_size{ 0 }; size_t m_enabled_segments_tex_size{ 0 };
size_t m_enabled_options_tex_size{ 0 }; size_t m_enabled_options_tex_size{ 0 };
size_t m_enabled_segments_reduced_tex_size{ 0 };
size_t m_enabled_options_reduced_tex_size{ 0 };
// The set the next draw reads from: the reduced one while dragging, if one is built.
bool use_reduced_set() const { return m_settings.reduced_detail && m_settings.reduced_detail_mode != EReducedDetailMode::Off; }
struct ActiveSet
{
size_t count{ 0 };
unsigned int buf_id{ 0 };
unsigned int tex_id{ 0 };
};
ActiveSet active_segments() const {
if (use_reduced_set())
return { m_enabled_segments_reduced_count, m_enabled_segments_reduced_buf_id, m_enabled_segments_reduced_tex_id };
return { m_enabled_segments_count, m_enabled_segments_buf_id, m_enabled_segments_tex_id };
}
ActiveSet active_options() const {
if (use_reduced_set())
return { m_enabled_options_reduced_count, m_enabled_options_reduced_buf_id, m_enabled_options_reduced_tex_id };
return { m_enabled_options_count, m_enabled_options_buf_id, m_enabled_options_tex_id };
}
#endif // ENABLE_OPENGL_ES #endif // ENABLE_OPENGL_ES
// //

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