diff --git a/.claude/skills/orca-profiles/SKILL.md b/.claude/skills/orca-profiles/SKILL.md index 18d9fc0adc..692e529074 100644 --- a/.claude/skills/orca-profiles/SKILL.md +++ b/.claude/skills/orca-profiles/SKILL.md @@ -1,6 +1,6 @@ --- name: orca-profiles -description: Use when creating, modifying, reviewing or debugging OrcaSlicer FFF system profiles under resources/profiles, including printer/vendor/nozzle/material additions, bundle indexes and versions, preset renames, setting_id, filament_id and filament_id_snapshot.json. Also use for missing presets or vendors, ignored profile settings, ambiguous AMS filament matches, and failures from orca_profile_tool.py, check_profile.sh/.bat, OrcaSlicer_profile_validator or the Check profiles CI job. +description: Use when creating, modifying, reviewing or debugging OrcaSlicer FFF system profiles under resources/profiles, including printer/vendor/nozzle/material additions, bundle indexes and versions, preset renames, setting_id and filament_id. Also use for missing presets or vendors, ignored profile settings, ambiguous AMS filament matches, and failures from orca_profile_tool.py, check_profile.sh/.bat, OrcaSlicer_profile_validator or the Check profiles CI job. --- # OrcaSlicer system profiles @@ -21,7 +21,7 @@ Paths below are relative to this skill. Commands run from the repository root. | Add a printer or nozzle; change models, variants, assets or extruder vectors | [machine-profiles.md](references/machine-profiles.md) | | Add a quality tier or tune a process | [process-profiles.md](references/process-profiles.md) | | Create a vendor bundle; diagnose loading or inheritance; migrate preset names | [vendor-bundle.md](references/vendor-bundle.md) | -| Change ids or snapshot claims; diagnose AMS identity | [ids.md](references/ids.md), then `docs/HLSD/filament_id.md` for identity changes | +| Change ids; diagnose AMS identity | [ids.md](references/ids.md), then `docs/HLSD/filament_id.md` for identity changes | | Review a profile diff | [review-checklist.md](references/review-checklist.md) | | Run checks, interpret failures, test another tree or verify in the app | [validation.md](references/validation.md) | @@ -71,14 +71,11 @@ Paths below are relative to this skill. Commands run from the repository root. python3 scripts/orca_profile_tool.py normalize --vendor "" python3 scripts/orca_profile_tool.py update-index --vendor "" python3 scripts/orca_profile_tool.py generate-id --vendor "" - python3 scripts/orca_profile_tool.py update-snapshot python3 scripts/orca_profile_tool.py check ``` Writing commands support `--dry-run`. Inspect their diffs: `normalize` changes content and can - reformat entire files. `update-snapshot` is tree-wide; include its diff whenever a filament id - **or claim** changes, even if no new id was minted. Skip it when filament identity and claims - are unchanged. Stop and resolve command errors before proceeding. + reformat entire files. Stop and resolve command errors before proceeding. **Do not use `trim` in this workflow:** it can delete newly authored, unindexed profiles. Do not use `normalize --force` for routine edits. diff --git a/.claude/skills/orca-profiles/references/ids.md b/.claude/skills/orca-profiles/references/ids.md index 59560160f8..b6a09e9a2f 100644 --- a/.claude/skills/orca-profiles/references/ids.md +++ b/.claude/skills/orca-profiles/references/ids.md @@ -6,7 +6,7 @@ Orca-generated ids are deterministic hashes of identity. **Never invent an id or [BBL's authoritative setting ids](#bbls-exception-precisely). `docs/HLSD/filament_id.md` is the authoritative design document for `filament_id` — the id landscape, the -snapshot as the maintainer gate, and the Bambu catalog map. This page is the tooling half. +checks CI runs, and the Bambu catalog map. This page is the tooling half. | | `setting_id` | `filament_id` | | --- | --- | --- | @@ -32,12 +32,10 @@ Use `scripts/orca_profile_tool.py` with a subcommand: | `normalize` | rewrites profile files into their canonical shape | | `trim` | deletes profile files no `.json` list references | | `update-index` | rebuilds the `*_list` sections from the files on disk | -| `update-snapshot` | re-records `scripts/filament_id_snapshot.json` | The order after adding, renaming or deleting files — each step feeds the next, so it is not -interchangeable — is `normalize` → `update-index` → `generate-id` → `update-snapshot` → `check`. -The [authoring workflow](../SKILL.md#creating-or-modifying-a-profile) has the commands; -`update-snapshot` is needed when filament ids or claims change. +interchangeable — is `normalize` → `update-index` → `generate-id` → `check`. +The [authoring workflow](../SKILL.md#creating-or-modifying-a-profile) has the commands. > **`trim` deletes.** It removes every profile file the index does not list — including the one you just > added and have not registered yet. Register first, or skip `trim` entirely; it is a cleanup sweep, not @@ -48,15 +46,15 @@ filesystem (the `setting_id` pass walks the filesystem, so a bundle whose index still assignable). A new filament file is therefore invisible to `generate-id`'s filament_id pass until it is registered — its `setting_id` is written regardless. -- `--dry-run` works on every writing command (`generate-id`, `normalize`, `trim`, `update-index`, - `update-snapshot`) and writes nothing. +- `--dry-run` works on every writing command (`generate-id`, `normalize`, `trim`, `update-index`) + and writes nothing. - `--filament-id` / `--setting-id` narrow `generate-id`; they exclude each other, and passing neither writes both. - `--vendor` is repeatable and narrows **only what is written** — the id is a function of the triple alone, so a narrowed run writes exactly what a full run would. An unknown vendor exits 1 before any write. `--vendor` on `check` narrows the per-vendor checks only; the `setting_id` and `filament_id` - passes stay tree-wide. `update-snapshot` takes no `--vendor` at all. -- `--profiles DIR` points any command at another tree — with the `--snapshot` companion rule, see + passes stay tree-wide. +- `--profiles DIR` points any command at another tree — see [Checking a copy of the tree](validation.md#checking-a-copy-of-the-tree). - `--profile-type` narrows `normalize`, `trim` and `update-index` to `machine_model`, `process`, `filament` or `machine`. @@ -71,8 +69,8 @@ whole files into canonical shape — which is why `check` demands it already be CRLF committed (OrcaFilamentLibrary, Anycubic and RH3D among them), so a `normalize` pass there rewrites every line — read the diff before committing it. -On a clean tree `check`, `generate-id --dry-run` and `update-snapshot --dry-run` all exit 0 with zero -findings. That is the baseline to restore before opening a PR. +On a clean tree `check` and `generate-id --dry-run` both exit 0 with zero findings. That is the +baseline to restore before opening a PR. ## What `generate-id` does and does not fix @@ -88,7 +86,7 @@ Refuses to write (reports only): a base62 collision between two products, an emp `filament_type`, a broken `inherits` chain, roots of one filament resolving divergent `(vendor, type)` pairs. -**Does not fix: a preset that *inherits* a wrong `filament_id`.** This is check 3b, and it is the trap +**Does not fix: a preset that *inherits* a wrong `filament_id`.** This is check 2b, and it is the trap most likely to bite. It happens when a branded filament inherits a generic for its settings: ```jsonc @@ -107,8 +105,8 @@ Two fixes, in order of preference: 2. **Declare the tool-computed key on the preset itself.** Use the expected value reported by `check` or compute it with the function below; this is not a manually chosen id. Make sure the preset resolves the right `filament_vendor` and `filament_type` first — with - neither set, the triple resolves through the generic parent and the branded product is minted, and - then sanctioned in the snapshot, under vendor `Generic`. If you need the id before the file exists: + neither set, the triple resolves through the generic parent and the branded product is minted + under vendor `Generic`. If you need the id before the file exists: ```bash python3 -c "import sys; sys.path.insert(0,'scripts'); from orca_profile_tool import generate_filament_id as g; print(g('Polymaker','PLA','PolyLite PLA'))" @@ -119,38 +117,6 @@ Two fixes, in order of preference: The `setting_id` equivalent is `generate_preset_setting_id('', '', '')`. -## The snapshot - -`scripts/filament_id_snapshot.json` is the sanctioned state: the id landscape derived from the tree must -equal it exactly, in both directions. **Any change to a filament id or its claims must be committed with -the profiles.** - -To trace an id from an error, search for it in the snapshot. Each entry records its identity triple -and `/` claims, one per bundle/product pair rather than per preset. - -```bash -python3 scripts/orca_profile_tool.py update-snapshot -``` - -Never hand-edit it. It is regenerated deterministically (1-space indent, LF, id-sorted) and -refuses to write two states it could not record truthfully: a tree it could not read whole, and an id -declared under more than one triple. It does **not** judge the ids themselves — it records state, `check` -judges it, so a bad id lands in the diff and fails there instead. `generate-id` never touches the -snapshot, and reminds you with a warning **only when it actually wrote a `filament_id`** — not on a -`--dry-run`, and not when only `setting_id`s changed. - -Reviewing a snapshot diff: - -| Diff | Means | -| --- | --- | -| new id + new claim | a genuinely new product — confirm it is not a rename in disguise | -| id removed | a product left the tree, or its identity changed — the old id is not forwarded anywhere | -| triple changed under an existing id | `filament_vendor`/`filament_type`/name was edited; deliberate? | -| claim added/removed only | a bundle started or stopped shipping that product | - -An entry with an empty `filaments` list is legitimate — declared, but not yet claimed by an instantiated -preset. - ## BBL's exception, precisely `RESERVED_VENDORS = {"BBL"}` covers **`setting_id` assignment only**, keyed on the *folder* name: @@ -159,8 +125,8 @@ preset. `setting_id` therefore **cannot be fixed by the tool**, yet the presence rule still applies to it — carry over Bambu's authoritative id by hand. - BBL is not exempt from anything else: bases still get their `setting_id` stripped, ids must still be - globally unique, and BBL `filament_id`s are minted like everyone else's — every id the snapshot records - as claimed by BBL is an `OF*`. + globally unique, and BBL `filament_id`s are minted like everyone else's — every one of them is an + `OF*`. ## Ids other systems compose diff --git a/.claude/skills/orca-profiles/references/review-checklist.md b/.claude/skills/orca-profiles/references/review-checklist.md index 26f2f7656f..0c4fa7e95a 100644 --- a/.claude/skills/orca-profiles/references/review-checklist.md +++ b/.claude/skills/orca-profiles/references/review-checklist.md @@ -51,11 +51,11 @@ and take the whole vendor bundle down; an unindexed file gets reviewed, merged a ## 3. Are ids generated, not written? No hand-typed or copied `setting_id` / `filament_id`. Instantiated presets have a `setting_id`; bases do -not. A filament id change comes with a `scripts/filament_id_snapshot.json` diff in the same commit. -`check` enforces all of that; what it cannot tell you is whether the identity *should* have moved. +not. `check` enforces all of that; what it cannot tell you is whether the identity *should* have moved. -Read the snapshot diff as the identity gate: a removed id or a changed triple means a product's identity -moved, and the old id is not forwarded anywhere. Confirm that was intended. +A rewritten or removed `filament_id` means a product's identity moved — a rename, or an edited +`filament_vendor` / `filament_type` — and the old id is not forwarded anywhere. Confirm that was +intended, and that a new id is not a rename in disguise. *Why:* a duplicate `filament_id` on one printer makes AMS spool matching a coin toss; a copied `setting_id` breaks preset identity. See [ids.md](ids.md). diff --git a/.claude/skills/orca-profiles/references/validation.md b/.claude/skills/orca-profiles/references/validation.md index a0537c09ef..497e1d4e18 100644 --- a/.claude/skills/orca-profiles/references/validation.md +++ b/.claude/skills/orca-profiles/references/validation.md @@ -62,8 +62,7 @@ as SKIP for a vendor with no `machine/` folder. ## `orca_profile_tool.py check` `check` is one subcommand of the tool that also owns -`generate-id`, `normalize`, `trim`, `update-index` and `update-snapshot`; see [ids.md](ids.md) for the -writing half. +`generate-id`, `normalize`, `trim` and `update-index`; see [ids.md](ids.md) for the writing half. | Per vendor | Catches | | --- | --- | @@ -177,21 +176,14 @@ pre-existing user files may be present. ## Checking a copy of the tree -Use `--profiles DIR` on the Python tool and `-p DIR` on the validator. -`check` and `update-snapshot` describe a tree's sanctioned id state, so pointing them elsewhere also -needs `--snapshot PATH` for that tree — passing `--profiles` without it exits 2 rather than silently -judging the copy against `resources/profiles`'s snapshot. - -**The wrappers' `--profiles` / `-ProfilesDir` redirects only their validator checks.** Their -`profile_tool` check still reads this checkout's `resources/profiles`. To validate a copy fully, -run the Python check separately with that tree's snapshot, then name only validator checks: +Use `--profiles DIR` on the Python tool and `-p DIR` on the validator. The wrappers' `--profiles` / +`-ProfilesDir` passes the tree to both, so one run validates a copy fully: ```bash -python3 scripts/orca_profile_tool.py check --profiles "" --snapshot "" -./scripts/check_profile.sh --profiles "" validate_system validate_slice validate_filament_subtypes validate_custom +./scripts/check_profile.sh --profiles "" ``` -On Windows use `py -3` and `scripts\check_profile.bat -ProfilesDir ""` with the same check names. +On Windows use `scripts\check_profile.bat -ProfilesDir ""`. ## Testing in the app @@ -238,7 +230,6 @@ Keep stems tidy too, but a space immediately before `.json` is not a trailing pa | `[ERROR] … normalize would ` / `.json: update-index would rebuild ` | run that command and commit the result | | `[ERROR] has N profiles named ""` | identify the intended preset and remove or rename the duplicate; use `trim --dry-run` only for deliberate unindexed-file cleanup | | `[ERROR] … must not have a setting_id` / `is missing a setting_id` | `generate-id --setting-id` | -| `[ERROR] filament_id "" is not sanctioned by …snapshot.json` | `update-snapshot`, commit the diff | | `inherits filament_id "X" but its own triple … mints "Y"` | `generate-id` will **not** fix this — see [ids.md](ids.md) | | `vendor 's config version: invalid` | the `version` string is not Semver-parseable | | `[json.exception.type_error.302] type must be string` | locate the non-string value in the index or model; see [failure scopes](vendor-bundle.md#failure-modes-ranked-by-blast-radius) | @@ -260,5 +251,5 @@ once the run is green. The job name is also the required check for the delegated-merge bot, which lets a vendor maintainer self-merge a `resources/profiles//` PR with no human review — so whatever CI does not check -is what ships unreviewed. Its denied patterns refuse `^scripts/` and any `.py`, so a PR that must update -`scripts/filament_id_snapshot.json` always needs a maintainer. +is what ships unreviewed. Its denied patterns refuse `^scripts/` and any `.py`, so a PR that touches the +tooling always needs a maintainer. diff --git a/.claude/skills/orca-profiles/references/vendor-bundle.md b/.claude/skills/orca-profiles/references/vendor-bundle.md index 53b345b623..29aac13331 100644 --- a/.claude/skills/orca-profiles/references/vendor-bundle.md +++ b/.claude/skills/orca-profiles/references/vendor-bundle.md @@ -171,5 +171,5 @@ A separate tree (`Template.json` + `Template/`) holding filament and process tem scaffold for shipped profiles — `CreatePresetsDialog.cpp` reads it for the in-app "create a custom printer/filament" wizard, so editing it changes what users get when they create a custom preset. `check_profile.sh`'s validator checks default to `resources/profiles` (redirectable with `-p`), and so -does `orca_profile_tool.py` (redirectable with `--profiles`, plus `--snapshot` for the id checks); +does `orca_profile_tool.py` (redirectable with `--profiles`); neither covers this tree. diff --git a/.github/workflows/check_profiles.yml b/.github/workflows/check_profiles.yml index 7e714e2def..e668482bfd 100644 --- a/.github/workflows/check_profiles.yml +++ b/.github/workflows/check_profiles.yml @@ -80,8 +80,8 @@ jobs: set +e ./OrcaSlicer_profile_validator -p ${{ github.workspace }}/resources/profiles -s -l 2 2>&1 | tee ${{ runner.temp }}/validate_slice.log exit ${PIPESTATUS[0]} - # All vendors' filament_id collisions were fixed (see scripts/filament_id_snapshot.json), - # so the duplicate-filament-subtype check runs tree-wide. + # All vendors' filament_id collisions were fixed, so the duplicate-filament-subtype + # check runs tree-wide. - name: validate filament subtype check id: validate_filament_subtypes continue-on-error: true diff --git a/docs/HLSD/filament_id.md b/docs/HLSD/filament_id.md index 3f8827f720..122dfb6fdb 100644 --- a/docs/HLSD/filament_id.md +++ b/docs/HLSD/filament_id.md @@ -36,21 +36,17 @@ This page is the rule for authoring `filament_id` in system profiles > **Never write a `filament_id` value by hand.** A new filament gets its id from > `python scripts/orca_profile_tool.py generate-id`; one already in the tree has one — inherit it. -## The design, in two pieces +## The design Because several consumers match **globally by id alone, first hit wins** (see the next section), any two materials sharing one id feed wrong data somewhere — a wrong tray name, a wrong support-material flag, a wrong nozzle grouping — and inside one printer a duplicated id makes AMS spool matching a coin toss. Hand-written ids produce such collisions constantly, so -the system is built to make them impossible: - -1. **Deterministic minting.** An id is a pure hash of the product's identity — no registry to - maintain, no next-free-number ceremony, no way for two concurrent PRs to race for the same - number, and no way to get it wrong by hand, because you never write it by hand. -2. **A sanctioned snapshot.** The complete id landscape derived from the tree must equal - `scripts/filament_id_snapshot.json` exactly, so every change to ids, claims (which bundles - ship which id, and for which filament), or product identity surfaces as a reviewable diff to - one file — the maintainer gate. +the system is built to make them impossible: an id is a pure hash of the product's identity — +no registry to maintain, no next-free-number ceremony, no way for two concurrent PRs to race +for the same number, and no way to get it wrong by hand, because you never write it by hand. +CI holds every id in the tree to that rule, so the profiles themselves are the whole record of +which products exist and which bundles ship them. ## Who consumes the id @@ -160,8 +156,8 @@ key needed). Tuning a generic material → **join the OrcaFilamentLibrary filame different product by rule 5, so it then needs its own id. 5. **Ids follow the product identity.** The id is a pure function of the product triple `(filament_vendor, filament_type, filament name)`, so correcting any of them re-mints the id - **by design**, applied by `generate-id` (preview with `--dry-run`, confine with `--vendor`) - and gated by the `update-snapshot` diff; the exact sequence is in the FAQ. Nothing forwards + **by design**, applied by `generate-id` (preview with `--dry-run`, confine with `--vendor`); + the exact sequence is in the FAQ. Nothing forwards the old value, so anything outside the tree that stored it — a device tray, a calibration record, a saved project — falls back to matching by filament type until the user re-selects the filament. Re-mint deliberately, and only to fix a genuinely wrong identity. @@ -196,8 +192,8 @@ Snapmaker bundles alike; the OFL generic `Generic/PLA/Generic PLA` mints `OFDSrz by 35 bundles — most by independent declarations converging on the same mint, the rest purely through inheritance from the OFL preset. -Nothing but the triple feeds the mint — not the rest of the tree, not the snapshot, not what -another preset of the product happens to carry. Determined triple, determined id: one product +Nothing but the triple feeds the mint — not the rest of the tree, not what another preset of +the product happens to carry. Determined triple, determined id: one product carries one id and there is no second acceptable value for it, so any other value on a preset is a mismatch `check` reports and `generate-id` pulls back. Two *different* products whose triples mint the same base62 value would be a collision (a roughly 36-bit id space against a @@ -214,17 +210,15 @@ Workflow for a new filament: # 1. Author the filament with NO filament_id key anywhere. python scripts/orca_profile_tool.py generate-id --dry-run # 2. preview the ids — writes nothing python scripts/orca_profile_tool.py generate-id # 3. apply them to the profile file(s) -python scripts/orca_profile_tool.py update-snapshot # 4. record the new claims in the snapshot -python scripts/orca_profile_tool.py check # 5. validate — everything CI checks -# 6. Commit the profile edits together with scripts/filament_id_snapshot.json, for review. +python scripts/orca_profile_tool.py check # 4. validate — everything CI checks ``` `generate-id` makes every filament's id equal the mint of its own `(filament_vendor, filament_type, filament name)` triple: it inserts one where an instantiated filament resolves none, and re-derives one that does not match. A preset that *inherits* a -mismatching id is the one case left to the author — check 3b names it, and the fix is to inherit +mismatching id is the one case left to the author — check 2b names it, and the fix is to inherit a preset of the same filament or to give the preset its own key. A declaration is left alone -exactly when it already equals the one id its triple mints, and a collision (check 3d) is +exactly when it already equals the one id its triple mints, and a collision (check 2d) is reported and left unwritten. The same run assigns `generate_preset_setting_id(vendor, type, name)` to every instantiated filament, process and machine preset of every vendor except BBL, which keeps its authoritative `G*` ids, strips @@ -242,9 +236,7 @@ loudly), and a no-op on a tree that already passes `check`. - `--dry-run` reports what the run would do and writes nothing, so `generate-id --dry-run --vendor ` previews just that bundle. - `--profiles DIR` points the tooling at a different profile tree (default - `resources/profiles`). `check` and `update-snapshot` read and write the sanctioned state of - the tree they are given, so pointing them elsewhere needs `--snapshot PATH` for that tree too — - `scripts/filament_id_snapshot.json` describes `resources/profiles` and no other tree. + `resources/profiles`). The tool's other commands maintain the tree around the ids: `fix` normalises profile files, `trim` drops files no `.json` list references, and `update-index` rebuilds those lists. @@ -252,13 +244,11 @@ They do not touch ids; `--help` documents them. **Identity fixes need no separate command.** `generate-id` re-derives an id that no longer matches its triple exactly the way it fills in a missing one, so a rename or a `filament_vendor` / -`filament_type` correction is just: fix the config, run `generate-id` (confine it with -`--vendor`, preview it with `--dry-run`), then `update-snapshot` and review the diff. +`filament_type` correction is just: fix the config and run `generate-id` (confine it with +`--vendor`, preview it with `--dry-run`). If you skip the tooling, CI fails and prints the remedy: the expected id for your filament and -the instruction to run `python scripts/orca_profile_tool.py generate-id`; once the id is minted, -the snapshot checks likewise point at `update-snapshot` and tell you to commit the resulting -diff. +the instruction to run `python scripts/orca_profile_tool.py generate-id`. ## Ids other systems compose @@ -339,7 +329,7 @@ OrcaFilamentLibrary. **135 is the number to expect at every regeneration** — 1 one-off size of the transition and stopped being computable from the tree once the BBL bundle was re-minted, so do not "fix" the report to print it. -**Check 5** lives in `check_filament_ids`, so profile CI runs it alongside the other four. It +**Check 4** lives in `check_filament_ids`, so profile CI runs it alongside the other three. It holds the file to its contract: it parses, carries `source` / `bambustudio_commit` / `generated`, keys only `OF`-format ids, maps each Bambu id at most once, and — for every row whose key the tree actually claims — agrees with the tree on that id's `(vendor, type, name)` @@ -428,23 +418,14 @@ map would silently reproduce the bug. ## How CI enforces this Profile CI (`check_profiles.yml`) runs `check_filament_ids()` tree-wide via -`scripts/orca_profile_tool.py check`. Its ground truth is -**`scripts/filament_id_snapshot.json` — the sanctioned state**: the id state derived from the -tree must equal the snapshot exactly, in both directions. Any change to the id landscape -therefore surfaces as a diff to that file, and **that snapshot diff is what maintainers review -and gate in a PR**. Never edit the snapshot by hand — `update-snapshot` regenerates it -deterministically (running it twice changes nothing). The snapshot holds one map, `ids`: each -entry is the product the id is minted from (`filament_vendor`, `filament_type`, `name`) and the -`filaments` claiming it (`Vendor/Filament`), and it sanctions *state*, never exceptions: no check -consults it to excuse a preset from a rule, and there is no grandfather list of any kind. +`scripts/orca_profile_tool.py check`. Every check judges the tree against the rules on this +page and nothing else — there is no recorded id state to match and no grandfather list of any +kind. The checks, in brief: -- **Format** — every id occurring in the tree is `OF` + 6 base62 chars. No exceptions: not a - snapshot entry, not BBL. -- **Snapshot equality** — tree claims == snapshot claims **and** each id's declared triple == - its snapshot entry, both directions: any `filament_vendor`/`filament_type`/name change - surfaces as a snapshot diff. +- **Format** — every id occurring in the tree is `OF` + 6 base62 chars. No exceptions, not + even BBL. - **Identity** — the id is a function of the triple alone. A declared `OF*` id must equal the one id its declarer's own triple mints, with no second acceptable value; the id an instantiated preset *inherits* must equal the mint of *its* own triple, however it inherits @@ -463,9 +444,8 @@ The checks, in brief: A profile that declares an id no triple mints — a Bambu catalog id, a composed Qidi one, a hand-typed value, whatever its vendor — fails the format check. For a Bambu-cataloged product -the catalog map is where the correspondence belongs. New sharing via a *declared* id is caught -by the identity check; sharing through inheritance carries no declaration to check and surfaces -only as a new claim in the snapshot diff — which is exactly why that diff is the gate. +the catalog map is where the correspondence belongs. Two products sharing one id are caught by +the identity check whether the id is declared or inherited. The same `check` run holds every declared id to the AMS 8-character limit, tree-wide and for every vendor alike, scoped to the presets a vendor's index actually references (a file the index @@ -489,19 +469,19 @@ ambiguity check behind structure rule 3. (or any real filament) for the settings and declare the id of your own filament; run `python scripts/orca_profile_tool.py generate-id` to mint it. Inheritance never changes the id. - **I need to fix a filament's `filament_vendor` or `filament_type`.** Fix the config, run - `generate-id --vendor ` (preview with `--dry-run`), then `update-snapshot`, and commit - the profile and snapshot diffs together. The id re-derives from the corrected identity, and + `generate-id --vendor ` (preview with `--dry-run`), and commit the result. The id + re-derives from the corrected identity, and nothing forwards the old value, so a tray or record still holding it falls back to matching by filament type. - **I need to rename a filament.** Rename the presets (adding `renamed_from`, which keeps the - preset *name* resolving), then `generate-id --vendor ` (preview with `--dry-run`), then - `update-snapshot`. The id follows the new filament name; as with any identity fix, the old id + preset *name* resolving), then `generate-id --vendor ` (preview with `--dry-run`). The + id follows the new filament name; as with any identity fix, the old id is not forwarded. - **Can I reuse a `QD_*` id for a Qidi profile?** No — it is not a mint, so it is not a `filament_id`. Those values are composed by the box at runtime, and no preset carries one. Author Qidi filaments like any other vendor's. -- **CI says my filament needs an id.** Run `python scripts/orca_profile_tool.py generate-id`, then - `update-snapshot`, and commit both diffs. Do not type an id by hand. +- **CI says my filament needs an id.** Run `python scripts/orca_profile_tool.py generate-id` and + commit the result. Do not type an id by hand. For general profile authoring, see the profile development guide on the [OrcaSlicer wiki](https://www.orcaslicer.com/wiki). diff --git a/scripts/check_profile.ps1 b/scripts/check_profile.ps1 index b5d3345e33..1aa5a11bd7 100644 --- a/scripts/check_profile.ps1 +++ b/scripts/check_profile.ps1 @@ -38,8 +38,7 @@ under emulation on ARM64. .PARAMETER ProfilesDir - Profile tree to validate (default: resources\profiles). profile_tool always looks at the - tree next to the script, so this only redirects the validator checks. + Profile tree to validate (default: resources\profiles). .PARAMETER Vendor Check only this vendor, named after its .json (e.g. "Co Print"). validate_custom is @@ -440,7 +439,7 @@ function Expand-VendorPresets([string] $Zip, [string] $Tree, [string] $Prefix) { $CheckBodies = @{ profile_tool = { - Invoke-Tool -Exe (Resolve-Python) -Arguments (@((Join-Path $RepoRoot 'scripts\orca_profile_tool.py'), 'check') + $VendorPyArgs) + Invoke-Tool -Exe (Resolve-Python) -Arguments (@((Join-Path $RepoRoot 'scripts\orca_profile_tool.py'), 'check', '--profiles', $ProfilesDir) + $VendorPyArgs) } validate_system = { diff --git a/scripts/check_profile.sh b/scripts/check_profile.sh index 9076c957ab..42e72b93f7 100755 --- a/scripts/check_profile.sh +++ b/scripts/check_profile.sh @@ -82,9 +82,7 @@ Options: Note: profile_tool is the only check that is not the validator binary; it makes the static checks the validator cannot, because the validator loads the tree the way the slicer does and so never sees a profile no .json indexes, a preset name two files claim, or a -file normalize and update-index would still rewrite. It always looks at the tree next to -the script (/resources/profiles); --profiles only redirects the validator checks, -because validating another tree's ids needs that tree's own filament_id snapshot too. +file normalize and update-index would still rewrite. Note: --vendor narrows validate_custom too, by keeping only that vendor's presets in each fixture tree. The one check it cannot narrow is validate_slice for a vendor that ships no @@ -366,7 +364,7 @@ resolve_validator() { # ---------------------------------------------------------------------------- checks check_profile_tool() { - python3 "${REPO_ROOT}/scripts/orca_profile_tool.py" check --vendor "${VENDOR}" + python3 "${REPO_ROOT}/scripts/orca_profile_tool.py" check --profiles "${PROFILES_DIR}" --vendor "${VENDOR}" } check_validate_system() { diff --git a/scripts/filament_id_snapshot.json b/scripts/filament_id_snapshot.json deleted file mode 100644 index 5b45e5ca7e..0000000000 --- a/scripts/filament_id_snapshot.json +++ /dev/null @@ -1,7783 +0,0 @@ -{ - "ids": { - "OF02UAVh": { - "filaments": [ - "Creality/Soleyin Ultra PLA" - ], - "name": "Soleyin Ultra PLA", - "filament_type": "PLA", - "filament_vendor": "Creality" - }, - "OF03RK6r": { - "filaments": [ - "BBL/BETA PLA Metal" - ], - "name": "BETA PLA Metal", - "filament_type": "PLA", - "filament_vendor": "BETA" - }, - "OF0AquDh": { - "filaments": [ - "Flashforge/FusRock S-Multi" - ], - "name": "FusRock S-Multi", - "filament_type": "PA", - "filament_vendor": "FusRock" - }, - "OF0EYBWQ": { - "filaments": [ - "BBL/addnorth PETG Flame v0" - ], - "name": "addnorth PETG Flame v0", - "filament_type": "PETG", - "filament_vendor": "addnorth" - }, - "OF0FfcAG": { - "filaments": [ - "Anycubic/Anycubic TPU for ACE" - ], - "name": "Anycubic TPU for ACE", - "filament_type": "TPU", - "filament_vendor": "Anycubic" - }, - "OF0NgY1y": { - "filaments": [ - "BBL/COEX NYLEX PA6-CF", - "OrcaFilamentLibrary/COEX NYLEX PA6-CF" - ], - "name": "COEX NYLEX PA6-CF", - "filament_type": "PA-CF", - "filament_vendor": "COEX 3D" - }, - "OF0R5Wc7": { - "filaments": [ - "Artillery/Artillery PLA Tough" - ], - "name": "Artillery PLA Tough", - "filament_type": "PLA Tough", - "filament_vendor": "Artillery" - }, - "OF0UJcb6": { - "filaments": [ - "BBL/PolyLite PETG", - "OrcaFilamentLibrary/PolyLite PETG", - "Snapmaker/PolyLite PETG" - ], - "name": "PolyLite PETG", - "filament_type": "PETG", - "filament_vendor": "Polymaker" - }, - "OF0VpkBM": { - "filaments": [ - "Snapmaker/PolyLite PETG Translucent" - ], - "name": "PolyLite PETG Translucent", - "filament_type": "PETG", - "filament_vendor": "Polymaker" - }, - "OF0Vtzaw": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PETG Amarillo Radiante" - ], - "name": "FilAr PETG Amarillo Radiante", - "filament_type": "PETG", - "filament_vendor": "FilAr" - }, - "OF0b7M1z": { - "filaments": [ - "SeeMeCNC/SeeMeCNC PA-CF" - ], - "name": "SeeMeCNC PA-CF", - "filament_type": "PA-CF", - "filament_vendor": "SeeMeCNC" - }, - "OF0c7mnL": { - "filaments": [ - "InfiMech/InfiMech ABS" - ], - "name": "InfiMech ABS", - "filament_type": "ABS", - "filament_vendor": "InfiMech" - }, - "OF0gGRWk": { - "filaments": [ - "BBL/Panchroma PLA Glow", - "OrcaFilamentLibrary/Panchroma PLA Glow", - "Snapmaker/Panchroma PLA Glow" - ], - "name": "Panchroma PLA Glow", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OF0kCNDK": { - "filaments": [ - "BBL/Panchroma PLA Luminous", - "OrcaFilamentLibrary/Panchroma PLA Luminous", - "Snapmaker/Panchroma PLA Luminous" - ], - "name": "Panchroma PLA Luminous", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OF0omtEb": { - "filaments": [ - "Snapmaker/Fiberon ASA-CF08" - ], - "name": "Fiberon ASA-CF08", - "filament_type": "ASA", - "filament_vendor": "Polymaker" - }, - "OF0pzFLc": { - "filaments": [ - "BBL/COEX PLA+Silk", - "OrcaFilamentLibrary/COEX PLA+Silk" - ], - "name": "COEX PLA+Silk", - "filament_type": "PLA", - "filament_vendor": "COEX 3D" - }, - "OF0w7OpJ": { - "filaments": [ - "Qidi/QIDI ABS Rapido 0.8 nozzle" - ], - "name": "QIDI ABS Rapido 0.8 nozzle", - "filament_type": "ABS", - "filament_vendor": "QIDI" - }, - "OF0wBGNx": { - "filaments": [ - "BBL/Bambu ASA-CF", - "OrcaFilamentLibrary/Bambu ASA-CF" - ], - "name": "Bambu ASA-CF", - "filament_type": "ASA-CF", - "filament_vendor": "Bambu Lab" - }, - "OF0wz84w": { - "filaments": [ - "Qidi/QIDI ABS Rapido 0.6 nozzle" - ], - "name": "QIDI ABS Rapido 0.6 nozzle", - "filament_type": "ABS", - "filament_vendor": "QIDI" - }, - "OF0yFLkY": { - "filaments": [ - "Anycubic/Anycubic ASA" - ], - "name": "Anycubic ASA", - "filament_type": "ASA", - "filament_vendor": "Anycubic" - }, - "OF112FvY": { - "filaments": [ - "Anycubic/Generic PETG Basic" - ], - "name": "Generic PETG Basic", - "filament_type": "PETG", - "filament_vendor": "Generic" - }, - "OF1ID4N1": { - "filaments": [ - "BBL/addnorth PA6 Addlantis" - ], - "name": "addnorth PA6 Addlantis", - "filament_type": "PA6", - "filament_vendor": "addnorth" - }, - "OF1N1qMK": { - "filaments": [ - "BBL/Panchroma PLA UV Shift", - "OrcaFilamentLibrary/Panchroma PLA UV Shift", - "Snapmaker/Panchroma PLA UV Shift" - ], - "name": "Panchroma PLA UV Shift", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OF1Pke8t": { - "filaments": [ - "BBL/Overture Easy PLA", - "OrcaFilamentLibrary/Overture Easy PLA" - ], - "name": "Overture Easy PLA", - "filament_type": "PLA", - "filament_vendor": "Overture" - }, - "OF1UNk9P": { - "filaments": [ - "BBL/Generic PP", - "Creality/Generic PP", - "OrcaFilamentLibrary/Generic PP", - "Tiertime/Generic PP" - ], - "name": "Generic PP", - "filament_type": "PP", - "filament_vendor": "Generic" - }, - "OF1W7c76": { - "filaments": [ - "Qidi/QIDI ASA-CF" - ], - "name": "QIDI ASA-CF", - "filament_type": "ASA-CF", - "filament_vendor": "QIDI" - }, - "OF1d7c3A": { - "filaments": [ - "Snapmaker/Snapmaker ASA" - ], - "name": "Snapmaker ASA", - "filament_type": "ASA", - "filament_vendor": "Snapmaker" - }, - "OF1dpPrW": { - "filaments": [ - "Qidi/Bambu PLA" - ], - "name": "Bambu PLA", - "filament_type": "PLA", - "filament_vendor": "Bambu Lab" - }, - "OF1hznGB": { - "filaments": [ - "Elegoo/Elegoo PLA PRO", - "OrcaFilamentLibrary/Elegoo PLA PRO" - ], - "name": "Elegoo PLA PRO", - "filament_type": "PLA", - "filament_vendor": "Elegoo" - }, - "OF20kXr5": { - "filaments": [ - "Elegoo/Elegoo PAHT-CF", - "OrcaFilamentLibrary/Elegoo PAHT-CF" - ], - "name": "Elegoo PAHT-CF", - "filament_type": "PA", - "filament_vendor": "Elegoo" - }, - "OF223rZv": { - "filaments": [ - "Anycubic/Anycubic ABS" - ], - "name": "Anycubic ABS", - "filament_type": "ABS", - "filament_vendor": "Anycubic" - }, - "OF2EB9Iz": { - "filaments": [ - "Volumic/Volumic ASA Ultra" - ], - "name": "Volumic ASA Ultra", - "filament_type": "ASA", - "filament_vendor": "Volumic" - }, - "OF2EK9F1": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA-mate Violeta" - ], - "name": "FilAr PLA-mate Violeta", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OF2GCW1l": { - "filaments": [ - "BBL/SUNLU PETG", - "Flashforge/SUNLU PETG", - "OrcaFilamentLibrary/SUNLU PETG", - "Sovol/SUNLU PETG" - ], - "name": "SUNLU PETG", - "filament_type": "PETG", - "filament_vendor": "SUNLU" - }, - "OF2TQpOO": { - "filaments": [ - "Qidi/QIDI PLA Silk" - ], - "name": "QIDI PLA Silk", - "filament_type": "PLA", - "filament_vendor": "QIDI" - }, - "OF2VFe4J": { - "filaments": [ - "BBL/Bambu PAHT-CF", - "OrcaFilamentLibrary/Bambu PAHT-CF" - ], - "name": "Bambu PAHT-CF", - "filament_type": "PA-CF", - "filament_vendor": "Bambu Lab" - }, - "OF2Z1nT5": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PETG Azul Imperial" - ], - "name": "FilAr PETG Azul Imperial", - "filament_type": "PETG", - "filament_vendor": "FilAr" - }, - "OF2hfMcG": { - "filaments": [ - "OrcaArena/Arena PLA-CF" - ], - "name": "Arena PLA-CF", - "filament_type": "PLA-CF", - "filament_vendor": "Orca Arena" - }, - "OF2pj5l5": { - "filaments": [ - "BBL/Overture Super PLA+", - "OrcaFilamentLibrary/Overture Super PLA+" - ], - "name": "Overture Super PLA+", - "filament_type": "PLA", - "filament_vendor": "Overture" - }, - "OF2xccEe": { - "filaments": [], - "name": "DREMC ASA GF", - "filament_type": "ASA", - "filament_vendor": "DREMC" - }, - "OF30Ftju": { - "filaments": [ - "Elegoo/Elegoo Rapid TPU 95A", - "OrcaFilamentLibrary/Elegoo Rapid TPU 95A" - ], - "name": "Elegoo Rapid TPU 95A", - "filament_type": "TPU", - "filament_vendor": "Elegoo" - }, - "OF342jVN": { - "filaments": [ - "BBL/Bambu PLA Tough+" - ], - "name": "Bambu PLA Tough+", - "filament_type": "PLA", - "filament_vendor": "Bambu Lab" - }, - "OF3F63OE": { - "filaments": [ - "re3D/re3D PETG" - ], - "name": "re3D PETG", - "filament_type": "PETG", - "filament_vendor": "re3D" - }, - "OF3IKafc": { - "filaments": [ - "Qidi/QIDI PLA Rapido Matte" - ], - "name": "QIDI PLA Rapido Matte", - "filament_type": "PLA", - "filament_vendor": "QIDI" - }, - "OF3OMgrI": { - "filaments": [ - "Creality/CR-Silk" - ], - "name": "CR-Silk", - "filament_type": "PLA", - "filament_vendor": "Creality" - }, - "OF3PDEw3": { - "filaments": [ - "BBL/BETA PLA High Speed" - ], - "name": "BETA PLA High Speed", - "filament_type": "PLA", - "filament_vendor": "BETA" - }, - "OF3WQaKK": { - "filaments": [ - "Creality/CR-PETG" - ], - "name": "CR-PETG", - "filament_type": "PETG", - "filament_vendor": "Creality" - }, - "OF3dJf4E": { - "filaments": [ - "Volumic/Volumic PLA Ultra (Performance)" - ], - "name": "Volumic PLA Ultra (Performance)", - "filament_type": "PLA", - "filament_vendor": "Volumic" - }, - "OF3fwO8b": { - "filaments": [ - "FlyingBear/FlyingBear PLA Basic" - ], - "name": "FlyingBear PLA Basic", - "filament_type": "PLA", - "filament_vendor": "FlyingBear" - }, - "OF3kBrdA": { - "filaments": [ - "Creality/eSUN PETG", - "OrcaFilamentLibrary/eSUN PETG" - ], - "name": "eSUN PETG", - "filament_type": "PETG", - "filament_vendor": "eSUN" - }, - "OF3msXEa": { - "filaments": [ - "Snapmaker/Snapmaker Dual PETG-CF" - ], - "name": "Snapmaker Dual PETG-CF", - "filament_type": "PETG-CF", - "filament_vendor": "Snapmaker" - }, - "OF3ydJTT": { - "filaments": [ - "InfiMech/InfiMech PLA Hyper" - ], - "name": "InfiMech PLA Hyper", - "filament_type": "PLA", - "filament_vendor": "InfiMech" - }, - "OF43Raws": { - "filaments": [ - "Snapmaker/PolyTerra J1 PLA" - ], - "name": "PolyTerra J1 PLA", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OF44ERDr": { - "filaments": [ - "Snapmaker/Polymaker General PLA Family" - ], - "name": "Polymaker General PLA Family", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OF44VYzK": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PETG Azul Francia" - ], - "name": "FilAr PETG Azul Francia", - "filament_type": "PETG", - "filament_vendor": "FilAr" - }, - "OF4APyxe": { - "filaments": [ - "Creality/Hyper PAHT-CF" - ], - "name": "Hyper PAHT-CF", - "filament_type": "PA-CF", - "filament_vendor": "Creality" - }, - "OF4GM5qX": { - "filaments": [ - "Ratrig/Generic ASA BigNozzle" - ], - "name": "Generic ASA BigNozzle", - "filament_type": "ASA", - "filament_vendor": "Generic" - }, - "OF4KsW72": { - "filaments": [], - "name": "FilAr PLA", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OF4Nhggz": { - "filaments": [ - "Artillery/Artillery PLA Basic+" - ], - "name": "Artillery PLA Basic+", - "filament_type": "PLA Basic+", - "filament_vendor": "Artillery" - }, - "OF4PKvem": { - "filaments": [ - "BBL/BETA PLA Fluorescence" - ], - "name": "BETA PLA Fluorescence", - "filament_type": "PLA", - "filament_vendor": "BETA" - }, - "OF4QZANi": { - "filaments": [ - "BBL/BETA TPU Matte" - ], - "name": "BETA TPU Matte", - "filament_type": "TPU", - "filament_vendor": "BETA" - }, - "OF4RvVuU": { - "filaments": [ - "BBL/Bambu PPS-CF" - ], - "name": "Bambu PPS-CF", - "filament_type": "PPS-CF", - "filament_vendor": "Bambu Lab" - }, - "OF4S3To3": { - "filaments": [ - "Qidi/QIDI PETG Rapido" - ], - "name": "QIDI PETG Rapido", - "filament_type": "PETG", - "filament_vendor": "QIDI" - }, - "OF4WB37S": { - "filaments": [ - "Snapmaker/Snapmaker PETG" - ], - "name": "Snapmaker PETG", - "filament_type": "PETG", - "filament_vendor": "Snapmaker" - }, - "OF4XTfoI": { - "filaments": [ - "BBL/BETA PETG Marble" - ], - "name": "BETA PETG Marble", - "filament_type": "PETG", - "filament_vendor": "BETA" - }, - "OF4f8vVp": { - "filaments": [ - "WonderMaker/WonderMaker PET-CF" - ], - "name": "WonderMaker PET-CF", - "filament_type": "PET-CF", - "filament_vendor": "WonderMaker" - }, - "OF4iWKrE": { - "filaments": [ - "Qidi/QIDI PETG-CF" - ], - "name": "QIDI PETG-CF", - "filament_type": "PETG-CF", - "filament_vendor": "QIDI" - }, - "OF4nQ62r": { - "filaments": [ - "Qidi/QIDI PLA Basic" - ], - "name": "QIDI PLA Basic", - "filament_type": "PLA", - "filament_vendor": "QIDI" - }, - "OF4ulo9Y": { - "filaments": [ - "WonderMaker/WonderMaker PVA" - ], - "name": "WonderMaker PVA", - "filament_type": "PVA", - "filament_vendor": "WonderMaker" - }, - "OF53eLVD": { - "filaments": [ - "Blocks/Generic ASA-CF", - "Creality/Generic ASA-CF", - "Elegoo/Generic ASA-CF" - ], - "name": "Generic ASA-CF", - "filament_type": "ASA-CF", - "filament_vendor": "Generic" - }, - "OF54B0S0": { - "filaments": [ - "BBL/Bambu PPA-CF", - "OrcaFilamentLibrary/Bambu PPA-CF" - ], - "name": "Bambu PPA-CF", - "filament_type": "PPA-CF", - "filament_vendor": "Bambu Lab" - }, - "OF54SvEe": { - "filaments": [ - "Prusa/Prusament PA-CF" - ], - "name": "Prusament PA-CF", - "filament_type": "PA11-CF", - "filament_vendor": "Prusa Polymers" - }, - "OF55jHAJ": { - "filaments": [ - "Prusa/Generic ABS HF" - ], - "name": "Generic ABS HF", - "filament_type": "ABS", - "filament_vendor": "Generic" - }, - "OF5B9sUc": { - "filaments": [ - "BBL/Fiberon PA6-GF25" - ], - "name": "Fiberon PA6-GF25", - "filament_type": "PA-GF", - "filament_vendor": "Polymaker" - }, - "OF5BN24W": { - "filaments": [ - "Flashforge/Flashforge PPA-GF" - ], - "name": "Flashforge PPA-GF", - "filament_type": "PPA-GF", - "filament_vendor": "Flashforge" - }, - "OF5BXhHF": { - "filaments": [ - "BBL/BETA PLA High Temp" - ], - "name": "BETA PLA High Temp", - "filament_type": "PLA", - "filament_vendor": "BETA" - }, - "OF5CgdDq": { - "filaments": [ - "BBL/PolyLite PLA", - "OrcaArena/PolyLite PLA", - "OrcaFilamentLibrary/PolyLite PLA", - "Qidi/PolyLite PLA", - "Snapmaker/PolyLite PLA" - ], - "name": "PolyLite PLA", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OF5LAnla": { - "filaments": [ - "BBL/BETA PLA Gradient" - ], - "name": "BETA PLA Gradient", - "filament_type": "PLA", - "filament_vendor": "BETA" - }, - "OF5NqBfC": { - "filaments": [ - "Wanhao France/YUMI PETG" - ], - "name": "YUMI PETG", - "filament_type": "PETG", - "filament_vendor": "Yumi" - }, - "OF5P4jgA": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA Dorado" - ], - "name": "FilAr PLA Dorado", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OF5PtjTp": { - "filaments": [ - "Anycubic/Anycubic PLA Glow" - ], - "name": "Anycubic PLA Glow", - "filament_type": "PLA", - "filament_vendor": "Anycubic" - }, - "OF5SJ3jz": { - "filaments": [ - "Flashforge/Flashforge ABS" - ], - "name": "Flashforge ABS", - "filament_type": "ABS", - "filament_vendor": "Flashforge" - }, - "OF5YVJXH": { - "filaments": [ - "Artillery/Artillery ASA" - ], - "name": "Artillery ASA", - "filament_type": "ASA", - "filament_vendor": "Artillery" - }, - "OF5c6nq3": { - "filaments": [ - "Flashforge/Generic TPU-64D" - ], - "name": "Generic TPU-64D", - "filament_type": "TPU-64D", - "filament_vendor": "Generic" - }, - "OF5lGPup": { - "filaments": [ - "WonderMaker/WonderMaker PETG Basic" - ], - "name": "WonderMaker PETG Basic", - "filament_type": "PETG", - "filament_vendor": "WonderMaker" - }, - "OF5nlfKY": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA Oro" - ], - "name": "FilAr PLA Oro", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OF5oNRED": { - "filaments": [ - "Eryone/Eryone PP" - ], - "name": "Eryone PP", - "filament_type": "PP", - "filament_vendor": "Eryone" - }, - "OF5oXk4M": { - "filaments": [ - "Anycubic/Polymaker PLA Pro", - "Snapmaker/Polymaker PLA Pro" - ], - "name": "Polymaker PLA Pro", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OF5rnhjh": { - "filaments": [], - "name": "FilAr PETG", - "filament_type": "PETG", - "filament_vendor": "FilAr" - }, - "OF5tX6va": { - "filaments": [ - "Ratrig/Generic TPU BigNozzle" - ], - "name": "Generic TPU BigNozzle", - "filament_type": "TPU", - "filament_vendor": "Generic" - }, - "OF5umxxT": { - "filaments": [ - "BBL/PolyLite PLA Glow", - "Snapmaker/PolyLite PLA Glow" - ], - "name": "PolyLite PLA Glow", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OF5vgi2G": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA-mate Azul" - ], - "name": "FilAr PLA-mate Azul", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OF65InrS": { - "filaments": [ - "Snapmaker/Snapmaker TPU" - ], - "name": "Snapmaker TPU", - "filament_type": "TPU", - "filament_vendor": "Snapmaker" - }, - "OF66KUAN": { - "filaments": [ - "Creality/PolySonic PLA" - ], - "name": "PolySonic PLA", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OF6ATsCF": { - "filaments": [ - "Snapmaker/Snapmaker Dual PLA-CF" - ], - "name": "Snapmaker Dual PLA-CF", - "filament_type": "PLA-CF", - "filament_vendor": "Snapmaker" - }, - "OF6H51Xx": { - "filaments": [ - "Snapmaker/Polymaker PETG", - "Sovol/Polymaker PETG" - ], - "name": "Polymaker PETG", - "filament_type": "PETG", - "filament_vendor": "Polymaker" - }, - "OF6Ll8lK": { - "filaments": [ - "Elegoo/Elegoo PETG Translucent", - "OrcaFilamentLibrary/Elegoo PETG Translucent" - ], - "name": "Elegoo PETG Translucent", - "filament_type": "PETG", - "filament_vendor": "Elegoo" - }, - "OF6MOPWx": { - "filaments": [ - "Creality/Generic PET", - "Elegoo/Generic PET", - "Flashforge/Generic PET" - ], - "name": "Generic PET", - "filament_type": "PET", - "filament_vendor": "Generic" - }, - "OF6TuVAg": { - "filaments": [ - "Snapmaker/Snapmaker J1 PVA" - ], - "name": "Snapmaker J1 PVA", - "filament_type": "PVA", - "filament_vendor": "Snapmaker" - }, - "OF6Yn69v": { - "filaments": [ - "BBL/BETA TPU 90A" - ], - "name": "BETA TPU 90A", - "filament_type": "TPU", - "filament_vendor": "BETA" - }, - "OF6kj4jI": { - "filaments": [ - "iQ/Fiberthree PACF Pro P2" - ], - "name": "Fiberthree PACF Pro P2", - "filament_type": "PACF Pro", - "filament_vendor": "iQ Materials" - }, - "OF6qAuyi": { - "filaments": [ - "Flashforge/Flashforge PLA Matte" - ], - "name": "Flashforge PLA Matte", - "filament_type": "PLA", - "filament_vendor": "Flashforge" - }, - "OF6qw3Wb": { - "filaments": [ - "BBL/BETA PAHT-CF" - ], - "name": "BETA PAHT-CF", - "filament_type": "PA-CF", - "filament_vendor": "BETA" - }, - "OF6rdQ6M": { - "filaments": [ - "BBL/Generic PPS-CF", - "Creality/Generic PPS-CF", - "Tiertime/Generic PPS-CF" - ], - "name": "Generic PPS-CF", - "filament_type": "PPS-CF", - "filament_vendor": "Generic" - }, - "OF70zbGS": { - "filaments": [ - "Creality/Hyper L-W PLA" - ], - "name": "Hyper L-W PLA", - "filament_type": "PLA", - "filament_vendor": "Creality" - }, - "OF71b7qO": { - "filaments": [ - "BBL/addnorth PLA E-PLA" - ], - "name": "addnorth PLA E-PLA", - "filament_type": "PLA", - "filament_vendor": "addnorth" - }, - "OF72YYTd": { - "filaments": [ - "Snapmaker/Snapmaker ABS" - ], - "name": "Snapmaker ABS", - "filament_type": "ABS", - "filament_vendor": "Snapmaker" - }, - "OF74KeQR": { - "filaments": [ - "BBL/Generic PHA", - "OrcaFilamentLibrary/Generic PHA", - "Tiertime/Generic PHA" - ], - "name": "Generic PHA", - "filament_type": "PHA", - "filament_vendor": "Generic" - }, - "OF7H3VJM": { - "filaments": [ - "OrcaFilamentLibrary/eSUN PLA-Marble" - ], - "name": "eSUN PLA-Marble", - "filament_type": "PLA", - "filament_vendor": "eSUN" - }, - "OF7OqDp3": { - "filaments": [ - "Tiertime/Tiertime PLA-CF" - ], - "name": "Tiertime PLA-CF", - "filament_type": "PLA-CF", - "filament_vendor": "Tiertime" - }, - "OF7SliVn": { - "filaments": [ - "Snapmaker/PolyLite J1 PLA" - ], - "name": "PolyLite J1 PLA", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OF7c9fln": { - "filaments": [ - "Anycubic/Anycubic PLA Translucent" - ], - "name": "Anycubic PLA Translucent", - "filament_type": "PLA", - "filament_vendor": "Anycubic" - }, - "OF7lOgYF": { - "filaments": [ - "BBL/Generic PETG HF", - "OrcaFilamentLibrary/Generic PETG HF", - "Prusa/Generic PETG HF" - ], - "name": "Generic PETG HF", - "filament_type": "PETG", - "filament_vendor": "Generic" - }, - "OF7lwj52": { - "filaments": [ - "CoLiDo/CoLiDo PETG" - ], - "name": "CoLiDo PETG", - "filament_type": "PETG", - "filament_vendor": "CoLiDo" - }, - "OF7nBAd3": { - "filaments": [ - "Eryone/Eryone Silk PLA" - ], - "name": "Eryone Silk PLA", - "filament_type": "PLA Silk", - "filament_vendor": "Eryone" - }, - "OF7pjCsO": { - "filaments": [ - "Flashforge/FusRock PAHT" - ], - "name": "FusRock PAHT", - "filament_type": "PAHT", - "filament_vendor": "FusRock" - }, - "OF7tt7DO": { - "filaments": [ - "Cubicon/Cubicon PLA+" - ], - "name": "Cubicon PLA+", - "filament_type": "PLA", - "filament_vendor": "Cubicon" - }, - "OF8GnyFU": { - "filaments": [ - "Creality/Hyper ABS" - ], - "name": "Hyper ABS", - "filament_type": "ABS", - "filament_vendor": "Creality" - }, - "OF8GtyKJ": { - "filaments": [ - "Flashforge/Flashforge TPU-64D" - ], - "name": "Flashforge TPU-64D", - "filament_type": "TPU-64D", - "filament_vendor": "Flashforge" - }, - "OF8Jl6NT": { - "filaments": [ - "Snapmaker/Snapmaker J1 PET" - ], - "name": "Snapmaker J1 PET", - "filament_type": "PET", - "filament_vendor": "Snapmaker" - }, - "OF8O09RG": { - "filaments": [ - "Flashforge/Flashforge HS PLA Burnt Ti" - ], - "name": "Flashforge HS PLA Burnt Ti", - "filament_type": "PLA", - "filament_vendor": "Flashforge" - }, - "OF8QdQwS": { - "filaments": [ - "BBL/BETA PLA Silk+" - ], - "name": "BETA PLA Silk+", - "filament_type": "PLA", - "filament_vendor": "BETA" - }, - "OF8Tlg47": { - "filaments": [ - "BBL/Generic PPA-GF", - "OrcaFilamentLibrary/Generic PPA-GF", - "Tiertime/Generic PPA-GF" - ], - "name": "Generic PPA-GF", - "filament_type": "PPA-GF", - "filament_vendor": "Generic" - }, - "OF8aFWfQ": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA Amarillo Lirio" - ], - "name": "FilAr PLA Amarillo Lirio", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OF8dCquh": { - "filaments": [ - "Snapmaker/Snapmaker J1 ABS Benchy" - ], - "name": "Snapmaker J1 ABS Benchy", - "filament_type": "ABS", - "filament_vendor": "Snapmaker" - }, - "OF8eaY7j": { - "filaments": [ - "Creality/Generic PA612-CF" - ], - "name": "Generic PA612-CF", - "filament_type": "PA-CF", - "filament_vendor": "Generic" - }, - "OF8jh0Lk": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA-mate Marron" - ], - "name": "FilAr PLA-mate Marron", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OF8kJys9": { - "filaments": [ - "Eryone/Eryone PETG" - ], - "name": "Eryone PETG", - "filament_type": "PETG", - "filament_vendor": "Eryone" - }, - "OF8tPByX": { - "filaments": [ - "BBL/Generic PPA-CF", - "OrcaFilamentLibrary/Generic PPA-CF", - "Tiertime/Generic PPA-CF" - ], - "name": "Generic PPA-CF", - "filament_type": "PPA-CF", - "filament_vendor": "Generic" - }, - "OF8wE5l7": { - "filaments": [ - "Artillery/Artillery PETG Basic" - ], - "name": "Artillery PETG Basic", - "filament_type": "PETG Basic", - "filament_vendor": "Artillery" - }, - "OF99UMPq": { - "filaments": [ - "BBL/COEX ABS", - "OrcaFilamentLibrary/COEX ABS" - ], - "name": "COEX ABS", - "filament_type": "ABS", - "filament_vendor": "COEX 3D" - }, - "OF99vXPs": { - "filaments": [], - "name": "DREMC ABS+", - "filament_type": "ABS", - "filament_vendor": "DREMC" - }, - "OF9EHUKK": { - "filaments": [ - "Qidi/QIDI TPU-GF" - ], - "name": "QIDI TPU-GF", - "filament_type": "TPU-GF", - "filament_vendor": "QIDI" - }, - "OF9HCdyQ": { - "filaments": [ - "Afinia/Afinia PLA" - ], - "name": "Afinia PLA", - "filament_type": "PLA", - "filament_vendor": "Afinia" - }, - "OF9OlTWH": { - "filaments": [ - "BBL/Bambu PLA Marble", - "OrcaFilamentLibrary/Bambu PLA Marble" - ], - "name": "Bambu PLA Marble", - "filament_type": "PLA", - "filament_vendor": "Bambu Lab" - }, - "OF9PELEb": { - "filaments": [ - "Qidi/QIDI UltraPA-CF25" - ], - "name": "QIDI UltraPA-CF25", - "filament_type": "UltraPA-CF25", - "filament_vendor": "QIDI" - }, - "OF9UJOGF": { - "filaments": [ - "Anycubic/Anycubic PETG-CF" - ], - "name": "Anycubic PETG-CF", - "filament_type": "PETG-CF", - "filament_vendor": "Anycubic" - }, - "OF9cAwMK": { - "filaments": [ - "Flashforge/Flashforge PLA-CF" - ], - "name": "Flashforge PLA-CF", - "filament_type": "PLA-CF", - "filament_vendor": "Flashforge" - }, - "OF9emAI9": { - "filaments": [ - "Ratrig/RatRig PunkFil PETG" - ], - "name": "RatRig PunkFil PETG", - "filament_type": "PETG", - "filament_vendor": "RatRig" - }, - "OFA026vt": { - "filaments": [ - "OrcaArena/Arena PA-CF" - ], - "name": "Arena PA-CF", - "filament_type": "PA-CF", - "filament_vendor": "Orca Arena" - }, - "OFAC7Wyu": { - "filaments": [ - "Artillery/Artillery PLA Matte" - ], - "name": "Artillery PLA Matte", - "filament_type": "PLA Matte", - "filament_vendor": "Artillery" - }, - "OFAIBCLJ": { - "filaments": [ - "Elegoo/Generic ABS-CF" - ], - "name": "Generic ABS-CF", - "filament_type": "ABS-CF", - "filament_vendor": "Generic" - }, - "OFAIrQXu": { - "filaments": [ - "Creality/Creality Hyper PLA" - ], - "name": "Creality Hyper PLA", - "filament_type": "PLA", - "filament_vendor": "Creality" - }, - "OFANFm4x": { - "filaments": [ - "Qidi/QIDI PLA Rapido Metal" - ], - "name": "QIDI PLA Rapido Metal", - "filament_type": "PLA", - "filament_vendor": "QIDI" - }, - "OFAO9A7J": { - "filaments": [ - "Sovol/Sovol Zero PLA Silk HS Nozzle" - ], - "name": "Sovol Zero PLA Silk HS Nozzle", - "filament_type": "PLA", - "filament_vendor": "Generic" - }, - "OFAZllAN": { - "filaments": [ - "Artillery/Artillery PLA-CF" - ], - "name": "Artillery PLA-CF", - "filament_type": "PLA-CF", - "filament_vendor": "Artillery" - }, - "OFAc0Pr3": { - "filaments": [ - "BBL/Fiberon PET-CF17" - ], - "name": "Fiberon PET-CF17", - "filament_type": "PET-CF", - "filament_vendor": "Polymaker" - }, - "OFAcJkl1": { - "filaments": [ - "BBL/addnorth PETG-CF Rigid X" - ], - "name": "addnorth PETG-CF Rigid X", - "filament_type": "PETG-CF", - "filament_vendor": "addnorth" - }, - "OFAebKg8": { - "filaments": [ - "Flashforge/Flashforge PLA Metal" - ], - "name": "Flashforge PLA Metal", - "filament_type": "PLA", - "filament_vendor": "Flashforge" - }, - "OFAnyRUI": { - "filaments": [ - "BBL/Bambu Support For PLA", - "OrcaFilamentLibrary/Bambu Support For PLA" - ], - "name": "Bambu Support For PLA", - "filament_type": "PLA", - "filament_vendor": "Bambu Lab" - }, - "OFAt6ec0": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA Marron Oxido" - ], - "name": "FilAr PLA Marron Oxido", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFB5SmWk": { - "filaments": [ - "OrcaFilamentLibrary/Valment PLA Galaxy" - ], - "name": "Valment PLA Galaxy", - "filament_type": "PLA", - "filament_vendor": "Valment" - }, - "OFBBgw7B": { - "filaments": [ - "WonderMaker/WonderMaker PLA Wood" - ], - "name": "WonderMaker PLA Wood", - "filament_type": "PLA", - "filament_vendor": "WonderMaker" - }, - "OFBJAdLw": { - "filaments": [ - "LH/LHS PCTG" - ], - "name": "LHS PCTG", - "filament_type": "PCTG", - "filament_vendor": "LH Stinger" - }, - "OFBLktDy": { - "filaments": [ - "Creality/Soleyin Basic PETG" - ], - "name": "Soleyin Basic PETG", - "filament_type": "PETG", - "filament_vendor": "Creality" - }, - "OFBSW57R": { - "filaments": [ - "BBL/Bambu PLA Aero", - "OrcaFilamentLibrary/Bambu PLA Aero" - ], - "name": "Bambu PLA Aero", - "filament_type": "PLA-AERO", - "filament_vendor": "Bambu Lab" - }, - "OFBUIlZ7": { - "filaments": [ - "Elegoo/Elegoo PLA+", - "OrcaFilamentLibrary/Elegoo PLA+" - ], - "name": "Elegoo PLA+", - "filament_type": "PLA", - "filament_vendor": "Elegoo" - }, - "OFBlFMVp": { - "filaments": [ - "Snapmaker/Snapmaker Dual PETG" - ], - "name": "Snapmaker Dual PETG", - "filament_type": "PETG", - "filament_vendor": "Snapmaker" - }, - "OFBoSWxb": { - "filaments": [ - "BBL/PolyLite PLA Luminous", - "Snapmaker/PolyLite PLA Luminous" - ], - "name": "PolyLite PLA Luminous", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFBsbMMF": { - "filaments": [ - "BBL/addnorth PA-CF Adura X" - ], - "name": "addnorth PA-CF Adura X", - "filament_type": "PA-CF", - "filament_vendor": "addnorth" - }, - "OFBw6eEG": { - "filaments": [ - "BBL/Overture Matte PLA", - "OrcaFilamentLibrary/Overture Matte PLA" - ], - "name": "Overture Matte PLA", - "filament_type": "PLA", - "filament_vendor": "Overture" - }, - "OFC1PzXz": { - "filaments": [ - "Creality/Hyper Luminous" - ], - "name": "Hyper Luminous", - "filament_type": "PLA", - "filament_vendor": "Creality" - }, - "OFC5f4Ay": { - "filaments": [ - "RH3D/Generic PCCF" - ], - "name": "Generic PCCF", - "filament_type": "PC-CF", - "filament_vendor": "Generic" - }, - "OFC78WGQ": { - "filaments": [ - "BBL/Panchroma PLA Starlight", - "OrcaFilamentLibrary/Panchroma PLA Starlight", - "Snapmaker/Panchroma PLA Starlight" - ], - "name": "Panchroma PLA Starlight", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFCD8qiU": { - "filaments": [ - "BBL/Generic EVA", - "OrcaFilamentLibrary/Generic EVA", - "Tiertime/Generic EVA" - ], - "name": "Generic EVA", - "filament_type": "EVA", - "filament_vendor": "Generic" - }, - "OFCIUsWh": { - "filaments": [ - "BBL/Panchroma PLA Translucent", - "OrcaFilamentLibrary/Panchroma PLA Translucent", - "Snapmaker/Panchroma PLA Translucent" - ], - "name": "Panchroma PLA Translucent", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFCJpR7a": { - "filaments": [ - "Creality/HP Ultra PLA" - ], - "name": "HP Ultra PLA", - "filament_type": "PLA", - "filament_vendor": "Creality" - }, - "OFCZsqXg": { - "filaments": [ - "Creality/Hyper PLA" - ], - "name": "Hyper PLA", - "filament_type": "PLA", - "filament_vendor": "Creality" - }, - "OFCccVrQ": { - "filaments": [ - "OrcaFilamentLibrary/PolyTerra Dual PLA", - "Snapmaker/PolyTerra Dual PLA" - ], - "name": "PolyTerra Dual PLA", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFCidU7j": { - "filaments": [ - "OrcaFilamentLibrary/DREMC ABS-GF" - ], - "name": "DREMC ABS-GF", - "filament_type": "ABS-GF", - "filament_vendor": "DREMC" - }, - "OFCjG251": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA-mate Verde" - ], - "name": "FilAr PLA-mate Verde", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFCn83wF": { - "filaments": [ - "Flashforge/FusRock S-PAHT" - ], - "name": "FusRock S-PAHT", - "filament_type": "PAHT", - "filament_vendor": "FusRock" - }, - "OFCnywiC": { - "filaments": [ - "Tiertime/Tiertime PET-CF" - ], - "name": "Tiertime PET-CF", - "filament_type": "PET-CF", - "filament_vendor": "Tiertime" - }, - "OFCoRobU": { - "filaments": [ - "OrcaFilamentLibrary/Elas ASA" - ], - "name": "Elas ASA", - "filament_type": "ASA", - "filament_vendor": "Elas" - }, - "OFCp3Bgo": { - "filaments": [ - "Anycubic/Anycubic PLA SE" - ], - "name": "Anycubic PLA SE", - "filament_type": "PLA", - "filament_vendor": "Anycubic" - }, - "OFCuaCer": { - "filaments": [ - "Volumic/Désactivé" - ], - "name": "Désactivé", - "filament_type": "PLA", - "filament_vendor": "Volumic" - }, - "OFD9taow": { - "filaments": [ - "FlyingBear/FlyingBear PLA Hyper" - ], - "name": "FlyingBear PLA Hyper", - "filament_type": "PLA", - "filament_vendor": "FlyingBear" - }, - "OFDETOM6": { - "filaments": [ - "Creality/eSUN PLA-Matte", - "OrcaFilamentLibrary/eSUN PLA-Matte" - ], - "name": "eSUN PLA-Matte", - "filament_type": "PLA", - "filament_vendor": "eSUN" - }, - "OFDGigEI": { - "filaments": [ - "BBL/Bambu PLA Dynamic", - "OrcaFilamentLibrary/Bambu PLA Dynamic" - ], - "name": "Bambu PLA Dynamic", - "filament_type": "PLA", - "filament_vendor": "Bambu Lab" - }, - "OFDIrhbu": { - "filaments": [ - "Qidi/QIDI PC/ABS-FR" - ], - "name": "QIDI PC/ABS-FR", - "filament_type": "PC-ABS-FR", - "filament_vendor": "QIDI" - }, - "OFDJU6R3": { - "filaments": [ - "Afinia/Afinia TPU" - ], - "name": "Afinia TPU", - "filament_type": "TPU", - "filament_vendor": "Afinia" - }, - "OFDKIKyw": { - "filaments": [ - "Snapmaker/Snapmaker Dual PVA" - ], - "name": "Snapmaker Dual PVA", - "filament_type": "PVA", - "filament_vendor": "Snapmaker" - }, - "OFDKgoqx": { - "filaments": [ - "Flashforge/Flashforge PLA" - ], - "name": "Flashforge PLA", - "filament_type": "PLA", - "filament_vendor": "Flashforge" - }, - "OFDRpXLZ": { - "filaments": [ - "FlyingBear/Other PETG", - "InfiMech/Other PETG" - ], - "name": "Other PETG", - "filament_type": "PETG", - "filament_vendor": "Other" - }, - "OFDSrzZ8": { - "filaments": [ - "Anker/Generic PLA", - "Anycubic/Generic PLA", - "Artillery/Generic PLA", - "BBL/Generic PLA", - "Blocks/Generic PLA", - "CONSTRUCT3D/Generic PLA", - "Chuanying/Generic PLA", - "Co Print/Generic PLA", - "CoLiDo/Generic PLA", - "Comgrow/Generic PLA", - "Creality/Generic PLA", - "Custom/Generic PLA", - "DeltaMaker/Generic PLA", - "Dremel/Generic PLA", - "Elegoo/Generic PLA", - "FLSun/Generic PLA", - "Flashforge/Generic PLA", - "FlyingBear/Generic PLA", - "Ginger Additive/Generic PLA", - "InfiMech/Generic PLA", - "LONGER/Generic PLA", - "Lulzbot/Generic PLA", - "OrcaArena/Generic PLA", - "OrcaFilamentLibrary/Generic PLA", - "Peopoly/Generic PLA", - "Phrozen/Generic PLA", - "Prusa/Generic PLA", - "Qidi/Generic PLA", - "RH3D/Generic PLA", - "Ratrig/Generic PLA", - "SecKit/Generic PLA", - "Sovol/Generic PLA", - "Tiertime/Generic PLA", - "Vzbot/Generic PLA", - "Z-Bolt/Generic PLA" - ], - "name": "Generic PLA", - "filament_type": "PLA", - "filament_vendor": "Generic" - }, - "OFDe8uyM": { - "filaments": [ - "OrcaFilamentLibrary/Valment PLA" - ], - "name": "Valment PLA", - "filament_type": "PLA", - "filament_vendor": "Valment" - }, - "OFDgQaca": { - "filaments": [ - "FlyingBear/FlyingBear PETG" - ], - "name": "FlyingBear PETG", - "filament_type": "PETG", - "filament_vendor": "FlyingBear" - }, - "OFDpW3J8": { - "filaments": [ - "OrcaFilamentLibrary/FILL3D PLA Basic" - ], - "name": "FILL3D PLA Basic", - "filament_type": "PLA", - "filament_vendor": "FILL3D" - }, - "OFDtop41": { - "filaments": [ - "Creality/Generic Support for PA" - ], - "name": "Generic Support for PA", - "filament_type": "PA", - "filament_vendor": "Generic" - }, - "OFDu1qE7": { - "filaments": [ - "Flashforge/FusRock PET-CF" - ], - "name": "FusRock PET-CF", - "filament_type": "PET-CF", - "filament_vendor": "FusRock" - }, - "OFDvXujf": { - "filaments": [ - "Anker/Generic PVA", - "Anycubic/Generic PVA", - "BBL/Generic PVA", - "Blocks/Generic PVA", - "Chuanying/Generic PVA", - "Creality/Generic PVA", - "Custom/Generic PVA", - "FLSun/Generic PVA", - "Flashforge/Generic PVA", - "OrcaArena/Generic PVA", - "OrcaFilamentLibrary/Generic PVA", - "Prusa/Generic PVA", - "Qidi/Generic PVA", - "Ratrig/Generic PVA", - "SecKit/Generic PVA", - "Tiertime/Generic PVA", - "Vzbot/Generic PVA" - ], - "name": "Generic PVA", - "filament_type": "PVA", - "filament_vendor": "Generic" - }, - "OFDvqJ6n": { - "filaments": [ - "OrcaFilamentLibrary/Overture ABS Basic" - ], - "name": "Overture ABS Basic", - "filament_type": "ABS", - "filament_vendor": "Overture" - }, - "OFDwBwO5": { - "filaments": [ - "Prusa/Generic PVA HF" - ], - "name": "Generic PVA HF", - "filament_type": "PVA", - "filament_vendor": "Generic" - }, - "OFDxfPgH": { - "filaments": [ - "BBL/Bambu PLA Sparkle", - "OrcaFilamentLibrary/Bambu PLA Sparkle" - ], - "name": "Bambu PLA Sparkle", - "filament_type": "PLA", - "filament_vendor": "Bambu Lab" - }, - "OFDxxTpW": { - "filaments": [ - "Flashforge/Flashforge HS PETG" - ], - "name": "Flashforge HS PETG", - "filament_type": "PETG", - "filament_vendor": "Flashforge" - }, - "OFE0NFRh": { - "filaments": [ - "BBL/COEX TPU 60A", - "OrcaFilamentLibrary/COEX TPU 60A" - ], - "name": "COEX TPU 60A", - "filament_type": "TPU", - "filament_vendor": "COEX 3D" - }, - "OFEGNJD4": { - "filaments": [ - "BBL/Bambu PLA Silk", - "OrcaFilamentLibrary/Bambu PLA Silk" - ], - "name": "Bambu PLA Silk", - "filament_type": "PLA", - "filament_vendor": "Bambu Lab" - }, - "OFEOnBj6": { - "filaments": [ - "Snapmaker/Snapmaker PLA Lite" - ], - "name": "Snapmaker PLA Lite", - "filament_type": "PLA", - "filament_vendor": "Snapmaker" - }, - "OFEWYR89": { - "filaments": [ - "Anker/Generic PLA+", - "Qidi/Generic PLA+" - ], - "name": "Generic PLA+", - "filament_type": "PLA", - "filament_vendor": "Generic" - }, - "OFEZ449N": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA-mate Uva" - ], - "name": "FilAr PLA-mate Uva", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFEZpel7": { - "filaments": [ - "Volumic/PPS Carbone (Performance)" - ], - "name": "PPS Carbone (Performance)", - "filament_type": "PPS-CF", - "filament_vendor": "Volumic" - }, - "OFEabreg": { - "filaments": [ - "Anycubic/Fiberon PA6-CF20", - "BBL/Fiberon PA6-CF20", - "Snapmaker/Fiberon PA6-CF20" - ], - "name": "Fiberon PA6-CF20", - "filament_type": "PA6-CF", - "filament_vendor": "Polymaker" - }, - "OFEbIx49": { - "filaments": [ - "WonderMaker/WonderMaker PLA Marble" - ], - "name": "WonderMaker PLA Marble", - "filament_type": "PLA", - "filament_vendor": "WonderMaker" - }, - "OFEhuUNq": { - "filaments": [], - "name": "DREMC PA12-CF", - "filament_type": "PA-CF", - "filament_vendor": "DREMC" - }, - "OFEj7sca": { - "filaments": [ - "Cubicon/Cubicon PC" - ], - "name": "Cubicon PC", - "filament_type": "PC", - "filament_vendor": "Cubicon" - }, - "OFEjbwqG": { - "filaments": [ - "BBL/PolyTerra PLA+", - "Snapmaker/PolyTerra PLA+" - ], - "name": "PolyTerra PLA+", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFEkPBwx": { - "filaments": [ - "BBL/Bambu PLA Glow", - "OrcaFilamentLibrary/Bambu PLA Glow" - ], - "name": "Bambu PLA Glow", - "filament_type": "PLA", - "filament_vendor": "Bambu Lab" - }, - "OFEmsric": { - "filaments": [ - "Snapmaker/Snapmaker PA-CF" - ], - "name": "Snapmaker PA-CF", - "filament_type": "PA-CF", - "filament_vendor": "Snapmaker" - }, - "OFEnbt6D": { - "filaments": [ - "Peopoly/Peopoly Lancer PLA-C" - ], - "name": "Peopoly Lancer PLA-C", - "filament_type": "PLA", - "filament_vendor": "Peopoly" - }, - "OFEswT5W": { - "filaments": [ - "BBL/Bambu PLA-CF", - "OrcaFilamentLibrary/Bambu PLA-CF" - ], - "name": "Bambu PLA-CF", - "filament_type": "PLA-CF", - "filament_vendor": "Bambu Lab" - }, - "OFEvEfw5": { - "filaments": [ - "Flashforge/Flashforge PA" - ], - "name": "Flashforge PA", - "filament_type": "PA", - "filament_vendor": "Flashforge" - }, - "OFEwRwmL": { - "filaments": [ - "Cubicon/Cubicon PLA" - ], - "name": "Cubicon PLA", - "filament_type": "PLA", - "filament_vendor": "Cubicon" - }, - "OFF3cuzT": { - "filaments": [ - "Creality/Generic TPU 64D" - ], - "name": "Generic TPU 64D", - "filament_type": "TPU", - "filament_vendor": "Generic" - }, - "OFF5o7b2": { - "filaments": [ - "BBL/BETA PLA Youth" - ], - "name": "BETA PLA Youth", - "filament_type": "PLA", - "filament_vendor": "BETA" - }, - "OFF9OKoY": { - "filaments": [ - "BBL/PolyLite PLA Pro", - "OrcaFilamentLibrary/PolyLite PLA Pro", - "Snapmaker/PolyLite PLA Pro" - ], - "name": "PolyLite PLA Pro", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFF9cgY5": { - "filaments": [ - "Snapmaker/Snapmaker PLA Matte" - ], - "name": "Snapmaker PLA Matte", - "filament_type": "PLA", - "filament_vendor": "Snapmaker" - }, - "OFFAWVf0": { - "filaments": [ - "Qidi/QIDI PC-ABS-FR" - ], - "name": "QIDI PC-ABS-FR", - "filament_type": "PC-ABS-FR", - "filament_vendor": "QIDI" - }, - "OFFFg2Pf": { - "filaments": [ - "Flashforge/Flashforge ASA Basic" - ], - "name": "Flashforge ASA Basic", - "filament_type": "ASA", - "filament_vendor": "Flashforge" - }, - "OFFNYwWR": { - "filaments": [ - "BBL/Bambu PA-CF", - "OrcaFilamentLibrary/Bambu PA-CF" - ], - "name": "Bambu PA-CF", - "filament_type": "PA-CF", - "filament_vendor": "Bambu Lab" - }, - "OFFP4ORR": { - "filaments": [ - "Creality/Creality Hyper ABS" - ], - "name": "Creality Hyper ABS", - "filament_type": "ABS", - "filament_vendor": "Creality" - }, - "OFFX1DRD": { - "filaments": [ - "FlyingBear/FlyingBear PC" - ], - "name": "FlyingBear PC", - "filament_type": "PC", - "filament_vendor": "FlyingBear" - }, - "OFFZ458u": { - "filaments": [ - "Snapmaker/Fiberon PA612-ESD" - ], - "name": "Fiberon PA612-ESD", - "filament_type": "PA-CF", - "filament_vendor": "Polymaker" - }, - "OFFbQscs": { - "filaments": [ - "Creality/eSUN PETG-Basic" - ], - "name": "eSUN PETG-Basic", - "filament_type": "PETG", - "filament_vendor": "eSUN" - }, - "OFFbSnCD": { - "filaments": [ - "BBL/Bambu PLA Translucent" - ], - "name": "Bambu PLA Translucent", - "filament_type": "PLA", - "filament_vendor": "Bambu Lab" - }, - "OFFfJ09N": { - "filaments": [ - "BBL/BETA PETG Glow" - ], - "name": "BETA PETG Glow", - "filament_type": "PETG", - "filament_vendor": "BETA" - }, - "OFFkCLBl": { - "filaments": [ - "BBL/Panchroma PLA Galaxy", - "OrcaFilamentLibrary/Panchroma PLA Galaxy", - "Snapmaker/Panchroma PLA Galaxy" - ], - "name": "Panchroma PLA Galaxy", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFFvzqcd": { - "filaments": [ - "BBL/Bambu PETG Basic", - "OrcaFilamentLibrary/Bambu PETG Basic" - ], - "name": "Bambu PETG Basic", - "filament_type": "PETG", - "filament_vendor": "Bambu Lab" - }, - "OFFwJWea": { - "filaments": [ - "Anycubic/Anycubic PLA Silk" - ], - "name": "Anycubic PLA Silk", - "filament_type": "PLA", - "filament_vendor": "Anycubic" - }, - "OFG0kOKX": { - "filaments": [ - "Volumic/Volumic PETG Ultra" - ], - "name": "Volumic PETG Ultra", - "filament_type": "PETG", - "filament_vendor": "Volumic" - }, - "OFG2RkhN": { - "filaments": [ - "Creality/CR-TPU" - ], - "name": "CR-TPU", - "filament_type": "TPU", - "filament_vendor": "Creality" - }, - "OFG4do34": { - "filaments": [ - "Qidi/Qidi ASA-Aero" - ], - "name": "Qidi ASA-Aero", - "filament_type": "ASA-AERO", - "filament_vendor": "QIDI" - }, - "OFGJ1nxs": { - "filaments": [ - "FlyingBear/Other PLA", - "InfiMech/Other PLA" - ], - "name": "Other PLA", - "filament_type": "PLA", - "filament_vendor": "Other" - }, - "OFGVwfK0": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA-mate Gris" - ], - "name": "FilAr PLA-mate Gris", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFGVxj2A": { - "filaments": [ - "BBL/BETA PLA Wood" - ], - "name": "BETA PLA Wood", - "filament_type": "PLA", - "filament_vendor": "BETA" - }, - "OFGc9l16": { - "filaments": [ - "BBL/BETA PLA Glow" - ], - "name": "BETA PLA Glow", - "filament_type": "PLA", - "filament_vendor": "BETA" - }, - "OFGcLA5R": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA-mate Beige" - ], - "name": "FilAr PLA-mate Beige", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFGcMkEB": { - "filaments": [ - "Creality/HP-TPU" - ], - "name": "HP-TPU", - "filament_type": "TPU", - "filament_vendor": "Creality" - }, - "OFGdP6Na": { - "filaments": [ - "Volumic/Volumic PVA" - ], - "name": "Volumic PVA", - "filament_type": "PVA", - "filament_vendor": "Volumic" - }, - "OFGkyftV": { - "filaments": [ - "BBL/Overture Silk PLA", - "OrcaFilamentLibrary/Overture Silk PLA" - ], - "name": "Overture Silk PLA", - "filament_type": "PLA", - "filament_vendor": "Overture" - }, - "OFGwT5Av": { - "filaments": [ - "Creality/Creality Hyper PLA-CF" - ], - "name": "Creality Hyper PLA-CF", - "filament_type": "PLA-CF", - "filament_vendor": "Creality" - }, - "OFGwZmgS": { - "filaments": [ - "Creality/CR-ABS" - ], - "name": "CR-ABS", - "filament_type": "ABS", - "filament_vendor": "Creality" - }, - "OFGxC8gB": { - "filaments": [ - "Creality/CR-Wood" - ], - "name": "CR-Wood", - "filament_type": "PLA", - "filament_vendor": "Creality" - }, - "OFGxuI0n": { - "filaments": [ - "Flashforge/Flashforge PA-CF" - ], - "name": "Flashforge PA-CF", - "filament_type": "PA-CF", - "filament_vendor": "Flashforge" - }, - "OFH2nN08": { - "filaments": [ - "OrcaFilamentLibrary/Eolas Prints PLA INGEO 850" - ], - "name": "Eolas Prints PLA INGEO 850", - "filament_type": "PLA", - "filament_vendor": "Eolas Prints" - }, - "OFH57ibH": { - "filaments": [ - "Snapmaker/Polymaker Silk PLA Family" - ], - "name": "Polymaker Silk PLA Family", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFH7b12v": { - "filaments": [ - "Creality/Generic PAHT-CF" - ], - "name": "Generic PAHT-CF", - "filament_type": "PA-CF", - "filament_vendor": "Generic" - }, - "OFHAccHz": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA Blanco Antartida" - ], - "name": "FilAr PLA Blanco Antartida", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFHHwrd1": { - "filaments": [ - "BBL/addnorth PETG Base" - ], - "name": "addnorth PETG Base", - "filament_type": "PETG", - "filament_vendor": "addnorth" - }, - "OFHWSM21": { - "filaments": [ - "BBL/Fiberon PET-CF", - "OrcaFilamentLibrary/Fiberon PET-CF" - ], - "name": "Fiberon PET-CF", - "filament_type": "PET-CF", - "filament_vendor": "Polymaker" - }, - "OFHa48An": { - "filaments": [ - "BBL/Bambu PET-CF", - "OrcaFilamentLibrary/Bambu PET-CF" - ], - "name": "Bambu PET-CF", - "filament_type": "PET-CF", - "filament_vendor": "Bambu Lab" - }, - "OFHaYaB1": { - "filaments": [ - "Creality/eSUN PET-Basic" - ], - "name": "eSUN PET-Basic", - "filament_type": "PET", - "filament_vendor": "eSUN" - }, - "OFHf2lKK": { - "filaments": [ - "FlyingBear/FlyingBear TPU Basic" - ], - "name": "FlyingBear TPU Basic", - "filament_type": "TPU", - "filament_vendor": "FlyingBear" - }, - "OFHfzQXo": { - "filaments": [ - "OrcaFilamentLibrary/Eolas Prints PLA Transition" - ], - "name": "Eolas Prints PLA Transition", - "filament_type": "PLA", - "filament_vendor": "Eolas Prints" - }, - "OFHknN4v": { - "filaments": [ - "Anycubic/Polymaker PLA Pro Metallic", - "Snapmaker/Polymaker PLA Pro Metallic" - ], - "name": "Polymaker PLA Pro Metallic", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFHmPYRy": { - "filaments": [ - "BBL/SUNLU PLA+ 2.0", - "Flashforge/SUNLU PLA+ 2.0", - "OrcaFilamentLibrary/SUNLU PLA+ 2.0" - ], - "name": "SUNLU PLA+ 2.0", - "filament_type": "PLA", - "filament_vendor": "SUNLU" - }, - "OFI2MKy7": { - "filaments": [ - "BBL/BETA PEBA 90A" - ], - "name": "BETA PEBA 90A", - "filament_type": "TPU", - "filament_vendor": "BETA" - }, - "OFI6WZpn": { - "filaments": [ - "OrcaArena/Arena Support W" - ], - "name": "Arena Support W", - "filament_type": "PLA", - "filament_vendor": "Orca Arena" - }, - "OFIBXa0k": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA-mate Rojo" - ], - "name": "FilAr PLA-mate Rojo", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFIBbYO5": { - "filaments": [ - "BBL/Bambu TPU for AMS" - ], - "name": "Bambu TPU for AMS", - "filament_type": "TPU-AMS", - "filament_vendor": "Bambu Lab" - }, - "OFIE3vOf": { - "filaments": [ - "Anycubic/Anycubic PLA Matte" - ], - "name": "Anycubic PLA Matte", - "filament_type": "PLA", - "filament_vendor": "Anycubic" - }, - "OFIK2H3G": { - "filaments": [ - "Flashforge/Flashforge HS PLA" - ], - "name": "Flashforge HS PLA", - "filament_type": "PLA", - "filament_vendor": "Flashforge" - }, - "OFIKZxPF": { - "filaments": [ - "Creality/Generic PLA Wood" - ], - "name": "Generic PLA Wood", - "filament_type": "PLA", - "filament_vendor": "Generic" - }, - "OFIPjqHt": { - "filaments": [ - "OrcaArena/Arena Support G" - ], - "name": "Arena Support G", - "filament_type": "PA", - "filament_vendor": "Orca Arena" - }, - "OFIRUqWi": { - "filaments": [ - "Creality/eSUN PLA-Silk" - ], - "name": "eSUN PLA-Silk", - "filament_type": "PLA", - "filament_vendor": "eSUN" - }, - "OFIVWJPm": { - "filaments": [ - "InfiMech/InfiMech TPU" - ], - "name": "InfiMech TPU", - "filament_type": "TPU", - "filament_vendor": "InfiMech" - }, - "OFIWMSGX": { - "filaments": [ - "Qidi/HATCHBOX PETG" - ], - "name": "HATCHBOX PETG", - "filament_type": "PETG", - "filament_vendor": "HATCHBOX" - }, - "OFIZMQwM": { - "filaments": [ - "LH/LHS TPU" - ], - "name": "LHS TPU", - "filament_type": "TPU", - "filament_vendor": "LH Stinger" - }, - "OFIamQnD": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA Gris Ceniza" - ], - "name": "FilAr PLA Gris Ceniza", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFIegjmD": { - "filaments": [ - "OrcaFilamentLibrary/Eolas Prints TPU Flex D53" - ], - "name": "Eolas Prints TPU Flex D53", - "filament_type": "TPU", - "filament_vendor": "Eolas Prints" - }, - "OFIfnzxC": { - "filaments": [ - "BBL/Bambu Support For PLA/PETG", - "OrcaFilamentLibrary/Bambu Support For PLA/PETG" - ], - "name": "Bambu Support For PLA/PETG", - "filament_type": "PLA", - "filament_vendor": "Bambu Lab" - }, - "OFIgbDHq": { - "filaments": [ - "Anycubic/Anycubic PLA Luminous" - ], - "name": "Anycubic PLA Luminous", - "filament_type": "PLA", - "filament_vendor": "Anycubic" - }, - "OFIxOuOu": { - "filaments": [ - "BBL/PolyLite PLA Starlight", - "Snapmaker/PolyLite PLA Starlight" - ], - "name": "PolyLite PLA Starlight", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFJ3F2jm": { - "filaments": [ - "Flashforge/Flashforge PLA Basic" - ], - "name": "Flashforge PLA Basic", - "filament_type": "PLA", - "filament_vendor": "Flashforge" - }, - "OFJ3HRsR": { - "filaments": [ - "OrcaArena/Arena ABS" - ], - "name": "Arena ABS", - "filament_type": "ABS", - "filament_vendor": "Orca Arena" - }, - "OFJHBEGD": { - "filaments": [], - "name": "DREMC PLA+ HS", - "filament_type": "PLA", - "filament_vendor": "DREMC" - }, - "OFJJ0Ar3": { - "filaments": [ - "Flashforge/Flashforge PLA Galaxy" - ], - "name": "Flashforge PLA Galaxy", - "filament_type": "PLA", - "filament_vendor": "Flashforge" - }, - "OFJNeELv": { - "filaments": [ - "OrcaFilamentLibrary/FILL3D PA" - ], - "name": "FILL3D PA", - "filament_type": "PA", - "filament_vendor": "FILL3D" - }, - "OFJOFnOZ": { - "filaments": [ - "BBL/AliZ PETG-CF", - "OrcaFilamentLibrary/AliZ PETG-CF" - ], - "name": "AliZ PETG-CF", - "filament_type": "PETG-CF", - "filament_vendor": "Aliz" - }, - "OFJQDUk3": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PETG Cristal" - ], - "name": "FilAr PETG Cristal", - "filament_type": "PETG", - "filament_vendor": "FilAr" - }, - "OFJS560n": { - "filaments": [], - "name": "Flashforge ASA", - "filament_type": "ASA", - "filament_vendor": "Flashforge" - }, - "OFJWKoYG": { - "filaments": [ - "iQ/Material4Print ABS Natur P1" - ], - "name": "Material4Print ABS Natur P1", - "filament_type": "ABS Material4Print Natur", - "filament_vendor": "iQ Materials" - }, - "OFJYpVAQ": { - "filaments": [ - "Flashforge/Generic TPU-90A" - ], - "name": "Generic TPU-90A", - "filament_type": "TPU-90A", - "filament_vendor": "Generic" - }, - "OFJgijky": { - "filaments": [ - "BBL/PolyLite CosPLA", - "Snapmaker/PolyLite CosPLA" - ], - "name": "PolyLite CosPLA", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFJhT2fd": { - "filaments": [ - "Snapmaker/Snapmaker Dual ABS" - ], - "name": "Snapmaker Dual ABS", - "filament_type": "ABS", - "filament_vendor": "Snapmaker" - }, - "OFJnEaCp": { - "filaments": [ - "BBL/BETA PLA Transparent" - ], - "name": "BETA PLA Transparent", - "filament_type": "PLA", - "filament_vendor": "BETA" - }, - "OFJrvXth": { - "filaments": [ - "Snapmaker/Snapmaker ABS Benchy" - ], - "name": "Snapmaker ABS Benchy", - "filament_type": "ABS", - "filament_vendor": "Snapmaker" - }, - "OFJs1ToM": { - "filaments": [ - "BBL/COEX NYLEX UNFILLED" - ], - "name": "COEX NYLEX UNFILLED", - "filament_type": "PA", - "filament_vendor": "COEX 3D" - }, - "OFJu1XwK": { - "filaments": [ - "OrcaFilamentLibrary/NIT PETG" - ], - "name": "NIT PETG", - "filament_type": "PETG", - "filament_vendor": "NIT" - }, - "OFJxSqO4": { - "filaments": [ - "Wanhao France/YUMI PLA Direct Drive" - ], - "name": "YUMI PLA Direct Drive", - "filament_type": "PLA", - "filament_vendor": "Yumi" - }, - "OFK7830e": { - "filaments": [ - "BBL/BETA TPU 95A" - ], - "name": "BETA TPU 95A", - "filament_type": "TPU", - "filament_vendor": "BETA" - }, - "OFK8XHPn": { - "filaments": [ - "Qidi/Overture ABS" - ], - "name": "Overture ABS", - "filament_type": "ABS", - "filament_vendor": "Overture" - }, - "OFKIQO2W": { - "filaments": [ - "Qidi/QIDI PLA Rapido" - ], - "name": "QIDI PLA Rapido", - "filament_type": "PLA", - "filament_vendor": "QIDI" - }, - "OFKKajh6": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA Gris Plata" - ], - "name": "FilAr PLA Gris Plata", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFKTGKJU": { - "filaments": [ - "Flashforge/FusRock PET" - ], - "name": "FusRock PET", - "filament_type": "PET", - "filament_vendor": "FusRock" - }, - "OFKTSiYF": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA Blanco Calido" - ], - "name": "FilAr PLA Blanco Calido", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFKUEXPA": { - "filaments": [ - "Snapmaker/Snapmaker Dual ASA" - ], - "name": "Snapmaker Dual ASA", - "filament_type": "ASA", - "filament_vendor": "Snapmaker" - }, - "OFKW5hEW": { - "filaments": [ - "Flashforge/FusRock PAHT-CF" - ], - "name": "FusRock PAHT-CF", - "filament_type": "PAHT-CF", - "filament_vendor": "FusRock" - }, - "OFKWWgyp": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA Carpincho" - ], - "name": "FilAr PLA Carpincho", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFKYBAWe": { - "filaments": [ - "BBL/BETA PLA Marble" - ], - "name": "BETA PLA Marble", - "filament_type": "PLA", - "filament_vendor": "BETA" - }, - "OFKZ9skj": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA Naranja Tigre" - ], - "name": "FilAr PLA Naranja Tigre", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFKbdiiJ": { - "filaments": [ - "Creality/PolySonic PLA Pro" - ], - "name": "PolySonic PLA Pro", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFKfJTwL": { - "filaments": [ - "Qidi/QIDI PET-CF" - ], - "name": "QIDI PET-CF", - "filament_type": "PET-CF", - "filament_vendor": "QIDI" - }, - "OFKgmsqE": { - "filaments": [ - "Qidi/QIDI PAHT-CF" - ], - "name": "QIDI PAHT-CF", - "filament_type": "PAHT-CF", - "filament_vendor": "QIDI" - }, - "OFKhMPeX": { - "filaments": [ - "BBL/Bambu PC", - "OrcaFilamentLibrary/Bambu PC" - ], - "name": "Bambu PC", - "filament_type": "PC", - "filament_vendor": "Bambu Lab" - }, - "OFKiSMWR": { - "filaments": [ - "BBL/Panchroma PLA Marble", - "OrcaFilamentLibrary/Panchroma PLA Marble", - "Snapmaker/Panchroma PLA Marble" - ], - "name": "Panchroma PLA Marble", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFKyNkQz": { - "filaments": [ - "BBL/BETA PETG UV Color Change" - ], - "name": "BETA PETG UV Color Change", - "filament_type": "PETG", - "filament_vendor": "BETA" - }, - "OFL9aRjN": { - "filaments": [ - "Snapmaker/Snapmaker PETG HF" - ], - "name": "Snapmaker PETG HF", - "filament_type": "PETG", - "filament_vendor": "Snapmaker" - }, - "OFLAXKqP": { - "filaments": [ - "WonderMaker/WonderMaker TPU 95A" - ], - "name": "WonderMaker TPU 95A", - "filament_type": "TPU", - "filament_vendor": "WonderMaker" - }, - "OFLC1oRH": { - "filaments": [ - "Flashforge/Flashforge PPA-CF" - ], - "name": "Flashforge PPA-CF", - "filament_type": "PPA-CF", - "filament_vendor": "Flashforge" - }, - "OFLJ8S6I": { - "filaments": [ - "BBL/SUNLU Wood PLA", - "Flashforge/SUNLU Wood PLA", - "OrcaFilamentLibrary/SUNLU Wood PLA" - ], - "name": "SUNLU Wood PLA", - "filament_type": "PLA", - "filament_vendor": "SUNLU" - }, - "OFLNgV3C": { - "filaments": [], - "name": "DREMC ASA", - "filament_type": "ASA", - "filament_vendor": "DREMC" - }, - "OFLOf6Sc": { - "filaments": [ - "Tiertime/Tiertime TPU 95A" - ], - "name": "Tiertime TPU 95A", - "filament_type": "TPU", - "filament_vendor": "Tiertime" - }, - "OFLPAxz3": { - "filaments": [ - "Anker/Generic ASA", - "Anycubic/Generic ASA", - "Artillery/Generic ASA", - "BBL/Generic ASA", - "Blocks/Generic ASA", - "Chuanying/Generic ASA", - "Creality/Generic ASA", - "Custom/Generic ASA", - "Elegoo/Generic ASA", - "FLSun/Generic ASA", - "Flashforge/Generic ASA", - "OrcaArena/Generic ASA", - "OrcaFilamentLibrary/Generic ASA", - "Prusa/Generic ASA", - "Qidi/Generic ASA", - "RH3D/Generic ASA", - "Ratrig/Generic ASA", - "SecKit/Generic ASA", - "Tiertime/Generic ASA", - "Vzbot/Generic ASA" - ], - "name": "Generic ASA", - "filament_type": "ASA", - "filament_vendor": "Generic" - }, - "OFLTYJW0": { - "filaments": [ - "Snapmaker/Snapmaker PLA Translucent" - ], - "name": "Snapmaker PLA Translucent", - "filament_type": "PLA", - "filament_vendor": "Snapmaker" - }, - "OFLXvuMr": { - "filaments": [ - "Elegoo/Elegoo Rapid PETG", - "OrcaFilamentLibrary/Elegoo Rapid PETG" - ], - "name": "Elegoo Rapid PETG", - "filament_type": "PETG", - "filament_vendor": "Elegoo" - }, - "OFLYDngx": { - "filaments": [ - "Qidi/Bambu PETG" - ], - "name": "Bambu PETG", - "filament_type": "PETG", - "filament_vendor": "Bambu Lab" - }, - "OFLakOUI": { - "filaments": [ - "Anker/Generic PC", - "Anycubic/Generic PC", - "BBL/Generic PC", - "Blocks/Generic PC", - "Creality/Generic PC", - "Custom/Generic PC", - "Elegoo/Generic PC", - "FLSun/Generic PC", - "FlyingBear/Generic PC", - "InfiMech/Generic PC", - "OrcaArena/Generic PC", - "OrcaFilamentLibrary/Generic PC", - "Prusa/Generic PC", - "Qidi/Generic PC", - "Ratrig/Generic PC", - "SecKit/Generic PC", - "Sovol/Generic PC", - "Tiertime/Generic PC", - "Vzbot/Generic PC" - ], - "name": "Generic PC", - "filament_type": "PC", - "filament_vendor": "Generic" - }, - "OFLbXwoL": { - "filaments": [ - "Artillery/Artillery PLA Silk" - ], - "name": "Artillery PLA Silk", - "filament_type": "PLA Silk", - "filament_vendor": "Artillery" - }, - "OFLbdkrE": { - "filaments": [ - "Snapmaker/Snapmaker J1 PLA Eco" - ], - "name": "Snapmaker J1 PLA Eco", - "filament_type": "PLA", - "filament_vendor": "Snapmaker" - }, - "OFLcd093": { - "filaments": [ - "Elegoo/Elegoo PETG", - "OrcaFilamentLibrary/Elegoo PETG" - ], - "name": "Elegoo PETG", - "filament_type": "PETG", - "filament_vendor": "Elegoo" - }, - "OFLfywkp": { - "filaments": [ - "Afinia/Afinia ABS+" - ], - "name": "Afinia ABS+", - "filament_type": "ABS", - "filament_vendor": "Afinia" - }, - "OFLgwqp2": { - "filaments": [ - "Creality/Hyper PETG-GF" - ], - "name": "Hyper PETG-GF", - "filament_type": "PETG-GF", - "filament_vendor": "Creality" - }, - "OFLjDYxH": { - "filaments": [ - "BBL/addnorth PLA X-PLA High Speed" - ], - "name": "addnorth PLA X-PLA High Speed", - "filament_type": "PLA", - "filament_vendor": "addnorth" - }, - "OFLqgSuX": { - "filaments": [ - "BBL/BETA PLA-CF" - ], - "name": "BETA PLA-CF", - "filament_type": "PLA-CF", - "filament_vendor": "BETA" - }, - "OFLzx3J4": { - "filaments": [ - "Creality/Hyper Marble" - ], - "name": "Hyper Marble", - "filament_type": "PLA", - "filament_vendor": "Creality" - }, - "OFM0xjBG": { - "filaments": [ - "Creality/CR-PLA Matte" - ], - "name": "CR-PLA Matte", - "filament_type": "PLA", - "filament_vendor": "Creality" - }, - "OFM4iJlv": { - "filaments": [ - "Creality/Generic PA12-CF" - ], - "name": "Generic PA12-CF", - "filament_type": "PA-CF", - "filament_vendor": "Generic" - }, - "OFM91vZs": { - "filaments": [ - "BBL/Overture ASA", - "OrcaFilamentLibrary/Overture ASA" - ], - "name": "Overture ASA", - "filament_type": "ASA", - "filament_vendor": "Overture" - }, - "OFMDHOcT": { - "filaments": [ - "Qidi/QIDI TPU-Aero" - ], - "name": "QIDI TPU-Aero", - "filament_type": "TPU-AERO", - "filament_vendor": "QIDI" - }, - "OFMK5gVo": { - "filaments": [ - "WonderMaker/WonderMaker PLA Basic" - ], - "name": "WonderMaker PLA Basic", - "filament_type": "PLA", - "filament_vendor": "WonderMaker" - }, - "OFML2aVd": { - "filaments": [ - "Anycubic/Anycubic TPU 95A" - ], - "name": "Anycubic TPU 95A", - "filament_type": "TPU", - "filament_vendor": "Anycubic" - }, - "OFMSvS8z": { - "filaments": [ - "Artillery/Artillery PA" - ], - "name": "Artillery PA", - "filament_type": "PA", - "filament_vendor": "Artillery" - }, - "OFMTK0UC": { - "filaments": [ - "BBL/Bambu Support For PA/PET", - "OrcaFilamentLibrary/Bambu Support For PA/PET" - ], - "name": "Bambu Support For PA/PET", - "filament_type": "PA", - "filament_vendor": "Bambu Lab" - }, - "OFMUWNkp": { - "filaments": [ - "BBL/SUNLU PLA+", - "Flashforge/SUNLU PLA+", - "OrcaFilamentLibrary/SUNLU PLA+" - ], - "name": "SUNLU PLA+", - "filament_type": "PLA", - "filament_vendor": "SUNLU" - }, - "OFMZvH0z": { - "filaments": [ - "BBL/Overture Rock PLA", - "OrcaFilamentLibrary/Overture Rock PLA" - ], - "name": "Overture Rock PLA", - "filament_type": "PLA", - "filament_vendor": "Overture" - }, - "OFMjtqTC": { - "filaments": [ - "BBL/Bambu PLA Wood", - "OrcaFilamentLibrary/Bambu PLA Wood" - ], - "name": "Bambu PLA Wood", - "filament_type": "PLA", - "filament_vendor": "Bambu Lab" - }, - "OFMkAW6r": { - "filaments": [ - "Flashforge/Flashforge PLA Color Change" - ], - "name": "Flashforge PLA Color Change", - "filament_type": "PLA", - "filament_vendor": "Flashforge" - }, - "OFMpxamb": { - "filaments": [ - "Flashforge/Flashforge PETG" - ], - "name": "Flashforge PETG", - "filament_type": "PETG", - "filament_vendor": "Flashforge" - }, - "OFMsDGbs": { - "filaments": [ - "Anycubic/Anycubic TPU" - ], - "name": "Anycubic TPU", - "filament_type": "TPU", - "filament_vendor": "Anycubic" - }, - "OFMuXBmO": { - "filaments": [ - "OrcaFilamentLibrary/Elas PLA Basic" - ], - "name": "Elas PLA Basic", - "filament_type": "PLA", - "filament_vendor": "Elas" - }, - "OFMzRg65": { - "filaments": [ - "BBL/BETA PLA PRO" - ], - "name": "BETA PLA PRO", - "filament_type": "PLA", - "filament_vendor": "BETA" - }, - "OFN8QBhu": { - "filaments": [ - "BBL/addnorth PLA Wood" - ], - "name": "addnorth PLA Wood", - "filament_type": "PLA", - "filament_vendor": "addnorth" - }, - "OFNBlAPT": { - "filaments": [ - "OrcaArena/Arena PETG Basic" - ], - "name": "Arena PETG Basic", - "filament_type": "PETG", - "filament_vendor": "Orca Arena" - }, - "OFNGTH3w": { - "filaments": [ - "Tiertime/Tiertime PLA" - ], - "name": "Tiertime PLA", - "filament_type": "PLA", - "filament_vendor": "Tiertime" - }, - "OFNQKF0M": { - "filaments": [ - "Tiertime/Tiertime ABS" - ], - "name": "Tiertime ABS", - "filament_type": "ABS", - "filament_vendor": "Tiertime" - }, - "OFNSYu5h": { - "filaments": [ - "Volumic/Volumic PP Ultra (Performance)" - ], - "name": "Volumic PP Ultra (Performance)", - "filament_type": "PP", - "filament_vendor": "Volumic" - }, - "OFNU9YIW": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PETG Azul Boreal" - ], - "name": "FilAr PETG Azul Boreal", - "filament_type": "PETG", - "filament_vendor": "FilAr" - }, - "OFNemJM6": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA Cobre" - ], - "name": "FilAr PLA Cobre", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFNjku08": { - "filaments": [ - "CONSTRUCT3D/Generic High Flow PETG" - ], - "name": "Generic High Flow PETG", - "filament_type": "PETG", - "filament_vendor": "Generic" - }, - "OFNk8AvA": { - "filaments": [ - "BBL/BETA PETG Gradient" - ], - "name": "BETA PETG Gradient", - "filament_type": "PETG", - "filament_vendor": "BETA" - }, - "OFNk8bxk": { - "filaments": [ - "BBL/Bambu PA6-GF", - "OrcaFilamentLibrary/Bambu PA6-GF" - ], - "name": "Bambu PA6-GF", - "filament_type": "PA-GF", - "filament_vendor": "Bambu Lab" - }, - "OFNstOna": { - "filaments": [ - "Eryone/Eryone PETG-CF" - ], - "name": "Eryone PETG-CF", - "filament_type": "PETG-CF", - "filament_vendor": "Eryone" - }, - "OFNvBIL0": { - "filaments": [ - "Creality/Hyper PPA-CF" - ], - "name": "Hyper PPA-CF", - "filament_type": "PA-CF", - "filament_vendor": "Creality" - }, - "OFO1GEq6": { - "filaments": [ - "BBL/Panchroma PLA Neon", - "OrcaFilamentLibrary/Panchroma PLA Neon", - "Snapmaker/Panchroma PLA Neon" - ], - "name": "Panchroma PLA Neon", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFO5djrM": { - "filaments": [ - "Chuanying/Generic PETG-CF10", - "Flashforge/Generic PETG-CF10" - ], - "name": "Generic PETG-CF10", - "filament_type": "PETG-CF", - "filament_vendor": "Generic" - }, - "OFO6GMJ3": { - "filaments": [ - "BBL/addnorth TPU EasyFlex" - ], - "name": "addnorth TPU EasyFlex", - "filament_type": "TPU", - "filament_vendor": "addnorth" - }, - "OFOABq7t": { - "filaments": [ - "BBL/AliZ PETG-Metal", - "OrcaFilamentLibrary/AliZ PETG-Metal" - ], - "name": "AliZ PETG-Metal", - "filament_type": "PETG", - "filament_vendor": "Aliz" - }, - "OFOAdMCB": { - "filaments": [ - "OrcaArena/Arena PLA Metal" - ], - "name": "Arena PLA Metal", - "filament_type": "PLA", - "filament_vendor": "Orca Arena" - }, - "OFOHOf2F": { - "filaments": [ - "Creality/eSUN PLA-HS" - ], - "name": "eSUN PLA-HS", - "filament_type": "PLA", - "filament_vendor": "eSUN" - }, - "OFOJPAAS": { - "filaments": [ - "iQ/VXL90 TiQ2 P2" - ], - "name": "VXL90 TiQ2 P2", - "filament_type": "VXL90 Xioneer", - "filament_vendor": "iQ Materials" - }, - "OFOPU1xv": { - "filaments": [ - "Snapmaker/Snapmaker PLA Full Spectrum" - ], - "name": "Snapmaker PLA Full Spectrum", - "filament_type": "PLA", - "filament_vendor": "Snapmaker" - }, - "OFOQCfVa": { - "filaments": [ - "BBL/addnorth PLA Premium Silk" - ], - "name": "addnorth PLA Premium Silk", - "filament_type": "PLA", - "filament_vendor": "addnorth" - }, - "OFObG16Q": { - "filaments": [ - "InfiMech/InfiMech PLA Basic" - ], - "name": "InfiMech PLA Basic", - "filament_type": "PLA", - "filament_vendor": "InfiMech" - }, - "OFObyktP": { - "filaments": [ - "Tiertime/Tiertime PETG" - ], - "name": "Tiertime PETG", - "filament_type": "PETG", - "filament_vendor": "Tiertime" - }, - "OFOiJfLM": { - "filaments": [ - "OrcaFilamentLibrary/FILL3D PETG CF" - ], - "name": "FILL3D PETG CF", - "filament_type": "PETG-CF", - "filament_vendor": "FILL3D" - }, - "OFOnSNt3": { - "filaments": [ - "Artillery/Artillery PETG-CF" - ], - "name": "Artillery PETG-CF", - "filament_type": "PETG-CF", - "filament_vendor": "Artillery" - }, - "OFOsHDnB": { - "filaments": [ - "Elegoo/Elegoo PETG PRO", - "OrcaFilamentLibrary/Elegoo PETG PRO" - ], - "name": "Elegoo PETG PRO", - "filament_type": "PETG", - "filament_vendor": "Elegoo" - }, - "OFOuEEvv": { - "filaments": [ - "Qidi/QIDI ABS Rapido 0.2 nozzle" - ], - "name": "QIDI ABS Rapido 0.2 nozzle", - "filament_type": "ABS", - "filament_vendor": "QIDI" - }, - "OFOvv91M": { - "filaments": [ - "BBL/PolyLite ABS", - "OrcaFilamentLibrary/PolyLite ABS", - "Qidi/PolyLite ABS" - ], - "name": "PolyLite ABS", - "filament_type": "ABS", - "filament_vendor": "Polymaker" - }, - "OFOwQuZM": { - "filaments": [ - "Snapmaker/Snapmaker PETG-CF" - ], - "name": "Snapmaker PETG-CF", - "filament_type": "PETG-CF", - "filament_vendor": "Snapmaker" - }, - "OFOzwywz": { - "filaments": [ - "Eryone/Eryone ABS" - ], - "name": "Eryone ABS", - "filament_type": "ABS", - "filament_vendor": "Eryone" - }, - "OFP26zNb": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA Violeta Jacaranda" - ], - "name": "FilAr PLA Violeta Jacaranda", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFPHLnoe": { - "filaments": [ - "Creality/HP-ASA" - ], - "name": "HP-ASA", - "filament_type": "ASA", - "filament_vendor": "Creality" - }, - "OFPWPlSC": { - "filaments": [ - "OrcaFilamentLibrary/FILL3D PP" - ], - "name": "FILL3D PP", - "filament_type": "PP", - "filament_vendor": "FILL3D" - }, - "OFPYDWgC": { - "filaments": [ - "Peopoly/Peopoly Lancer PET-CF" - ], - "name": "Peopoly Lancer PET-CF", - "filament_type": "PET-CF", - "filament_vendor": "Peopoly" - }, - "OFPbyOSk": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PETG Rojo Carmesi" - ], - "name": "FilAr PETG Rojo Carmesi", - "filament_type": "PETG", - "filament_vendor": "FilAr" - }, - "OFPc4zVY": { - "filaments": [ - "OrcaFilamentLibrary/Eolas Prints PLA INGEO 870" - ], - "name": "Eolas Prints PLA INGEO 870", - "filament_type": "PLA", - "filament_vendor": "Eolas Prints" - }, - "OFPkCJKE": { - "filaments": [ - "BBL/Panchroma PLA Satin", - "Creality/Panchroma PLA Satin", - "OrcaFilamentLibrary/Panchroma PLA Satin", - "Snapmaker/Panchroma PLA Satin" - ], - "name": "Panchroma PLA Satin", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFPklMI1": { - "filaments": [ - "BBL/Generic PE", - "OrcaFilamentLibrary/Generic PE", - "Tiertime/Generic PE" - ], - "name": "Generic PE", - "filament_type": "PE", - "filament_vendor": "Generic" - }, - "OFPoyiFs": { - "filaments": [ - "BBL/Polymaker HT-PLA", - "OrcaFilamentLibrary/Polymaker HT-PLA", - "Snapmaker/Polymaker HT-PLA" - ], - "name": "Polymaker HT-PLA", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFPqX3x2": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA Rosa Amaranto" - ], - "name": "FilAr PLA Rosa Amaranto", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFQ1KzO8": { - "filaments": [ - "Snapmaker/Snapmaker J1 PLA Silk" - ], - "name": "Snapmaker J1 PLA Silk", - "filament_type": "PLA", - "filament_vendor": "Snapmaker" - }, - "OFQ1zgm3": { - "filaments": [ - "Eryone/Eryone ABS-CF" - ], - "name": "Eryone ABS-CF", - "filament_type": "ABS-CF", - "filament_vendor": "Eryone" - }, - "OFQ3e56w": { - "filaments": [ - "BBL/Bambu PLA Galaxy", - "OrcaFilamentLibrary/Bambu PLA Galaxy" - ], - "name": "Bambu PLA Galaxy", - "filament_type": "PLA", - "filament_vendor": "Bambu Lab" - }, - "OFQ40XeN": { - "filaments": [ - "Qidi/QIDI PETG Tough" - ], - "name": "QIDI PETG Tough", - "filament_type": "PETG", - "filament_vendor": "QIDI" - }, - "OFQ5TxZ2": { - "filaments": [ - "BBL/addnorth PVDF Adamant S1" - ], - "name": "addnorth PVDF Adamant S1", - "filament_type": "PA", - "filament_vendor": "addnorth" - }, - "OFQEGL7z": { - "filaments": [ - "FlyingBear/FlyingBear PA-CF" - ], - "name": "FlyingBear PA-CF", - "filament_type": "PA-CF", - "filament_vendor": "FlyingBear" - }, - "OFQGvU2G": { - "filaments": [ - "OrcaArena/Arena TPU 95A" - ], - "name": "Arena TPU 95A", - "filament_type": "TPU", - "filament_vendor": "Orca Arena" - }, - "OFQHiNJs": { - "filaments": [ - "BBL/Bambu Support G", - "OrcaFilamentLibrary/Bambu Support G" - ], - "name": "Bambu Support G", - "filament_type": "PA", - "filament_vendor": "Bambu Lab" - }, - "OFQLcbps": { - "filaments": [ - "Anker/Generic PA-CF", - "Anycubic/Generic PA-CF", - "BBL/Generic PA-CF", - "Blocks/Generic PA-CF", - "Creality/Generic PA-CF", - "Custom/Generic PA-CF", - "FLSun/Generic PA-CF", - "FlyingBear/Generic PA-CF", - "InfiMech/Generic PA-CF", - "OrcaArena/Generic PA-CF", - "OrcaFilamentLibrary/Generic PA-CF", - "Prusa/Generic PA-CF", - "Qidi/Generic PA-CF", - "Ratrig/Generic PA-CF", - "SecKit/Generic PA-CF", - "Tiertime/Generic PA-CF", - "Vzbot/Generic PA-CF" - ], - "name": "Generic PA-CF", - "filament_type": "PA-CF", - "filament_vendor": "Generic" - }, - "OFQMTRc8": { - "filaments": [ - "Snapmaker/Snapmaker J1 PETG" - ], - "name": "Snapmaker J1 PETG", - "filament_type": "PETG", - "filament_vendor": "Snapmaker" - }, - "OFQMsFfF": { - "filaments": [ - "Qidi/QIDI ABS-GF10" - ], - "name": "QIDI ABS-GF10", - "filament_type": "ABS-GF", - "filament_vendor": "QIDI" - }, - "OFQWIKbV": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA Titanio" - ], - "name": "FilAr PLA Titanio", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFQYaiGg": { - "filaments": [ - "Snapmaker/Snapmaker PET" - ], - "name": "Snapmaker PET", - "filament_type": "PET", - "filament_vendor": "Snapmaker" - }, - "OFQbjX3s": { - "filaments": [ - "OrcaFilamentLibrary/FILL3D PETG" - ], - "name": "FILL3D PETG", - "filament_type": "PETG", - "filament_vendor": "FILL3D" - }, - "OFQdaVZS": { - "filaments": [ - "Creality/Generic PET-CF", - "Elegoo/Generic PET-CF" - ], - "name": "Generic PET-CF", - "filament_type": "PET-CF", - "filament_vendor": "Generic" - }, - "OFQe7sAx": { - "filaments": [ - "Anycubic/Anycubic PA6-CF" - ], - "name": "Anycubic PA6-CF", - "filament_type": "PA6-CF", - "filament_vendor": "Anycubic" - }, - "OFQyyO0l": { - "filaments": [ - "Flashforge/Polymaker CoPA" - ], - "name": "Polymaker CoPA", - "filament_type": "PA", - "filament_vendor": "Polymaker" - }, - "OFR0gODA": { - "filaments": [ - "SeeMeCNC/SeeMeCNC ABS" - ], - "name": "SeeMeCNC ABS", - "filament_type": "ABS", - "filament_vendor": "SeeMeCNC" - }, - "OFR1XLMN": { - "filaments": [ - "Qidi/QIDI TPU 95A-HF" - ], - "name": "QIDI TPU 95A-HF", - "filament_type": "TPU", - "filament_vendor": "QIDI" - }, - "OFRFhdqy": { - "filaments": [ - "BBL/addnorth PLA Textura" - ], - "name": "addnorth PLA Textura", - "filament_type": "PLA", - "filament_vendor": "addnorth" - }, - "OFRJ325z": { - "filaments": [ - "LH/LHS PETG" - ], - "name": "LHS PETG", - "filament_type": "PETG", - "filament_vendor": "LH Stinger" - }, - "OFRhBryT": { - "filaments": [ - "Cubicon/Cubicon PLAi21" - ], - "name": "Cubicon PLAi21", - "filament_type": "PLA", - "filament_vendor": "Cubicon" - }, - "OFRhCTUg": { - "filaments": [ - "Anycubic/Anycubic PET-CF" - ], - "name": "Anycubic PET-CF", - "filament_type": "PET-CF", - "filament_vendor": "Anycubic" - }, - "OFRiFnfQ": { - "filaments": [ - "OrcaFilamentLibrary/Eolas Prints PETG Transition" - ], - "name": "Eolas Prints PETG Transition", - "filament_type": "PETG", - "filament_vendor": "Eolas Prints" - }, - "OFRiYgMK": { - "filaments": [ - "BBL/Panchroma PLA Celestial", - "OrcaFilamentLibrary/Panchroma PLA Celestial", - "Snapmaker/Panchroma PLA Celestial" - ], - "name": "Panchroma PLA Celestial", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFRkjhxK": { - "filaments": [ - "Volumic/Volumic PVA-BVOH (Performance)" - ], - "name": "Volumic PVA-BVOH (Performance)", - "filament_type": "PVA", - "filament_vendor": "Volumic" - }, - "OFRooa0F": { - "filaments": [ - "Snapmaker/Snapmaker Dual PA-CF" - ], - "name": "Snapmaker Dual PA-CF", - "filament_type": "PA-CF", - "filament_vendor": "Snapmaker" - }, - "OFRpAZ1P": { - "filaments": [ - "DeltaMaker/DeltaMaker Brand PLA" - ], - "name": "DeltaMaker Brand PLA", - "filament_type": "PLA", - "filament_vendor": "DeltaMaker" - }, - "OFRyOsZj": { - "filaments": [ - "re3D/re3D PLA" - ], - "name": "re3D PLA", - "filament_type": "PLA", - "filament_vendor": "re3D" - }, - "OFRzR5mi": { - "filaments": [ - "OrcaFilamentLibrary/eSUN ePLA-LW" - ], - "name": "eSUN ePLA-LW", - "filament_type": "PLA-AERO", - "filament_vendor": "eSUN" - }, - "OFS2tn6G": { - "filaments": [ - "BBL/Fiberon PA612-CF", - "OrcaFilamentLibrary/Fiberon PA612-CF" - ], - "name": "Fiberon PA612-CF", - "filament_type": "PA", - "filament_vendor": "Polymaker" - }, - "OFS4jbj3": { - "filaments": [ - "Eryone/Eryone PA" - ], - "name": "Eryone PA", - "filament_type": "PA", - "filament_vendor": "Eryone" - }, - "OFS8lTQt": { - "filaments": [ - "BBL/Panchroma PLA Silk", - "OrcaFilamentLibrary/Panchroma PLA Silk", - "Snapmaker/Panchroma PLA Silk" - ], - "name": "Panchroma PLA Silk", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFSDfduA": { - "filaments": [ - "Flashforge/Flashforge TPU 65D" - ], - "name": "Flashforge TPU 65D", - "filament_type": "TPU", - "filament_vendor": "Flashforge" - }, - "OFSa39yP": { - "filaments": [ - "Snapmaker/Snapmaker J1 PLA" - ], - "name": "Snapmaker J1 PLA", - "filament_type": "PLA", - "filament_vendor": "Snapmaker" - }, - "OFSbGfsz": { - "filaments": [ - "OrcaArena/Arena PLA Basic" - ], - "name": "Arena PLA Basic", - "filament_type": "PLA", - "filament_vendor": "Orca Arena" - }, - "OFSfm8iP": { - "filaments": [ - "BBL/BETA PLA Heat Color Change" - ], - "name": "BETA PLA Heat Color Change", - "filament_type": "PLA", - "filament_vendor": "BETA" - }, - "OFSiCZP3": { - "filaments": [ - "BBL/BETA PETG-GF" - ], - "name": "BETA PETG-GF", - "filament_type": "PETG-CF", - "filament_vendor": "BETA" - }, - "OFSqIcJC": { - "filaments": [ - "Flashforge/Flashforge TPU 95A" - ], - "name": "Flashforge TPU 95A", - "filament_type": "TPU", - "filament_vendor": "Flashforge" - }, - "OFSw6Mor": { - "filaments": [ - "BBL/addnorth PA Adura FDA" - ], - "name": "addnorth PA Adura FDA", - "filament_type": "PA", - "filament_vendor": "addnorth" - }, - "OFSwbBWS": { - "filaments": [], - "name": "DREMC PLA+", - "filament_type": "PLA", - "filament_vendor": "DREMC" - }, - "OFT2jon4": { - "filaments": [ - "Qidi/QIDI ABS Rapido" - ], - "name": "QIDI ABS Rapido", - "filament_type": "ABS", - "filament_vendor": "QIDI" - }, - "OFTGHyNC": { - "filaments": [ - "OrcaFilamentLibrary/Bambu PLA Impact" - ], - "name": "Bambu PLA Impact", - "filament_type": "PLA", - "filament_vendor": "Bambu Lab" - }, - "OFTHDCqA": { - "filaments": [ - "BBL/Bambu PLA Pure" - ], - "name": "Bambu PLA Pure", - "filament_type": "PLA", - "filament_vendor": "Bambu Lab" - }, - "OFTOPcx0": { - "filaments": [ - "OrcaFilamentLibrary/Eolas Prints TPU Transition" - ], - "name": "Eolas Prints TPU Transition", - "filament_type": "TPU", - "filament_vendor": "Eolas Prints" - }, - "OFTRZ8Y4": { - "filaments": [ - "BBL/Bambu PETG-CF", - "OrcaFilamentLibrary/Bambu PETG-CF" - ], - "name": "Bambu PETG-CF", - "filament_type": "PETG-CF", - "filament_vendor": "Bambu Lab" - }, - "OFTSXxzE": { - "filaments": [ - "Flashforge/Flashforge PPS-CF" - ], - "name": "Flashforge PPS-CF", - "filament_type": "PPS-CF", - "filament_vendor": "Flashforge" - }, - "OFTXduCM": { - "filaments": [ - "Creality/eSUN ABS+" - ], - "name": "eSUN ABS+", - "filament_type": "ABS", - "filament_vendor": "eSUN" - }, - "OFTcE0nA": { - "filaments": [ - "OrcaFilamentLibrary/eSUN PLA-Basic" - ], - "name": "eSUN PLA-Basic", - "filament_type": "PLA", - "filament_vendor": "eSUN" - }, - "OFTdauIq": { - "filaments": [ - "Volumic/Volumic PCTG Ultra (Performance)" - ], - "name": "Volumic PCTG Ultra (Performance)", - "filament_type": "PETG", - "filament_vendor": "Volumic" - }, - "OFTkj6DR": { - "filaments": [ - "Anycubic/Anycubic PVA" - ], - "name": "Anycubic PVA", - "filament_type": "PVA", - "filament_vendor": "Anycubic" - }, - "OFTlRzpe": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA Gris Pizarra" - ], - "name": "FilAr PLA Gris Pizarra", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFTnWzBs": { - "filaments": [ - "Creality/Hyper PLA-CF" - ], - "name": "Hyper PLA-CF", - "filament_type": "PLA-CF", - "filament_vendor": "Creality" - }, - "OFTs8peJ": { - "filaments": [ - "Snapmaker/Snapmaker Dual TPE" - ], - "name": "Snapmaker Dual TPE", - "filament_type": "TPU", - "filament_vendor": "Snapmaker" - }, - "OFTsHNQi": { - "filaments": [ - "Qidi/QIDI ASA" - ], - "name": "QIDI ASA", - "filament_type": "ASA", - "filament_vendor": "QIDI" - }, - "OFU1zPxE": { - "filaments": [ - "Elegoo/Elegoo PLA Galaxy", - "OrcaFilamentLibrary/Elegoo PLA Galaxy" - ], - "name": "Elegoo PLA Galaxy", - "filament_type": "PLA", - "filament_vendor": "Elegoo" - }, - "OFU3QXL7": { - "filaments": [ - "re3D/re3D PC" - ], - "name": "re3D PC", - "filament_type": "PC", - "filament_vendor": "re3D" - }, - "OFU5JPDy": { - "filaments": [ - "BBL/addnorth PETG PRO Matte" - ], - "name": "addnorth PETG PRO Matte", - "filament_type": "PETG", - "filament_vendor": "addnorth" - }, - "OFU7CKZt": { - "filaments": [ - "Volumic/Volumic ASA Ultra (Performance)" - ], - "name": "Volumic ASA Ultra (Performance)", - "filament_type": "ASA", - "filament_vendor": "Volumic" - }, - "OFUF7oA4": { - "filaments": [ - "Creality/Hyper PC" - ], - "name": "Hyper PC", - "filament_type": "PC", - "filament_vendor": "Creality" - }, - "OFUH1aee": { - "filaments": [ - "Volumic/Volumic FLEX93 Ultra (Performance)" - ], - "name": "Volumic FLEX93 Ultra (Performance)", - "filament_type": "TPU", - "filament_vendor": "Volumic" - }, - "OFUIfGoh": { - "filaments": [ - "Snapmaker/Snapmaker Dual PET" - ], - "name": "Snapmaker Dual PET", - "filament_type": "PET", - "filament_vendor": "Snapmaker" - }, - "OFUYCqtB": { - "filaments": [ - "InfiMech/InfiMech PLA" - ], - "name": "InfiMech PLA", - "filament_type": "PLA", - "filament_vendor": "InfiMech" - }, - "OFUaHEO9": { - "filaments": [ - "Anycubic/Anycubic PEBA 95A" - ], - "name": "Anycubic PEBA 95A", - "filament_type": "PEBA", - "filament_vendor": "Anycubic" - }, - "OFUanySo": { - "filaments": [ - "BBL/Bambu PLA Silk+", - "OrcaFilamentLibrary/Bambu PLA Silk+" - ], - "name": "Bambu PLA Silk+", - "filament_type": "PLA", - "filament_vendor": "Bambu Lab" - }, - "OFUmS5z5": { - "filaments": [ - "Creality/eSUN ASA+" - ], - "name": "eSUN ASA+", - "filament_type": "ASA", - "filament_vendor": "eSUN" - }, - "OFUtiVRn": { - "filaments": [ - "BBL/addnorth PETG ESD" - ], - "name": "addnorth PETG ESD", - "filament_type": "PETG", - "filament_vendor": "addnorth" - }, - "OFUyDDNv": { - "filaments": [ - "Elegoo/Elegoo PC", - "OrcaFilamentLibrary/Elegoo PC" - ], - "name": "Elegoo PC", - "filament_type": "PC", - "filament_vendor": "Elegoo" - }, - "OFV5Q7j2": { - "filaments": [ - "Snapmaker/Snapmaker J1 TPE" - ], - "name": "Snapmaker J1 TPE", - "filament_type": "TPU", - "filament_vendor": "Snapmaker" - }, - "OFV5c8hG": { - "filaments": [ - "Flashforge/Flashforge PLA Sparkle" - ], - "name": "Flashforge PLA Sparkle", - "filament_type": "PLA", - "filament_vendor": "Flashforge" - }, - "OFV5wEMe": { - "filaments": [ - "Afinia/Afinia ABS" - ], - "name": "Afinia ABS", - "filament_type": "ABS", - "filament_vendor": "Afinia" - }, - "OFV8Mxqx": { - "filaments": [], - "name": "Flashforge PLA-SILK", - "filament_type": "PLA", - "filament_vendor": "Flashforge" - }, - "OFVBlUFH": { - "filaments": [], - "name": "DREMC PETG", - "filament_type": "PETG", - "filament_vendor": "DREMC" - }, - "OFVCkX5w": { - "filaments": [ - "BBL/Bambu TPU 95A", - "OrcaFilamentLibrary/Bambu TPU 95A" - ], - "name": "Bambu TPU 95A", - "filament_type": "TPU", - "filament_vendor": "Bambu Lab" - }, - "OFVDWuxl": { - "filaments": [ - "BBL/addnorth PLA HT-PLA PRO Matte" - ], - "name": "addnorth PLA HT-PLA PRO Matte", - "filament_type": "PLA", - "filament_vendor": "addnorth" - }, - "OFVHMFJX": { - "filaments": [ - "Qidi/QIDI PETG Tough 0.2 nozzle" - ], - "name": "QIDI PETG Tough 0.2 nozzle", - "filament_type": "PETG", - "filament_vendor": "QIDI" - }, - "OFVptRxp": { - "filaments": [ - "BBL/COEX TPE 30D", - "OrcaFilamentLibrary/COEX TPE 30D" - ], - "name": "COEX TPE 30D", - "filament_type": "TPU", - "filament_vendor": "COEX 3D" - }, - "OFVtIasg": { - "filaments": [ - "Eryone/Eryone ASA" - ], - "name": "Eryone ASA", - "filament_type": "ASA", - "filament_vendor": "Eryone" - }, - "OFW29a9R": { - "filaments": [ - "BBL/PolyTerra PLA", - "OrcaArena/PolyTerra PLA", - "OrcaFilamentLibrary/PolyTerra PLA", - "Snapmaker/PolyTerra PLA" - ], - "name": "PolyTerra PLA", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFW5FqkL": { - "filaments": [ - "Qidi/QIDI PLA Rapido Silk" - ], - "name": "QIDI PLA Rapido Silk", - "filament_type": "PLA", - "filament_vendor": "QIDI" - }, - "OFW8M3CY": { - "filaments": [ - "BBL/BETA PLA Chameleon" - ], - "name": "BETA PLA Chameleon", - "filament_type": "PLA", - "filament_vendor": "BETA" - }, - "OFW8lqnb": { - "filaments": [ - "Snapmaker/Snapmaker PETG Translucent" - ], - "name": "Snapmaker PETG Translucent", - "filament_type": "PETG", - "filament_vendor": "Snapmaker" - }, - "OFWDe7YH": { - "filaments": [ - "Qidi/QIDI UltraPA" - ], - "name": "QIDI UltraPA", - "filament_type": "UltraPA", - "filament_vendor": "QIDI" - }, - "OFWK0Y9A": { - "filaments": [ - "BBL/addnorth PA Adura" - ], - "name": "addnorth PA Adura", - "filament_type": "PA", - "filament_vendor": "addnorth" - }, - "OFWRITFw": { - "filaments": [ - "Prusa/Prusament rPLA" - ], - "name": "Prusament rPLA", - "filament_type": "PLA", - "filament_vendor": "Prusa Polymers" - }, - "OFWTAEjH": { - "filaments": [ - "Snapmaker/Snapmaker TPE" - ], - "name": "Snapmaker TPE", - "filament_type": "TPU", - "filament_vendor": "Snapmaker" - }, - "OFWTRJ1K": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA Bronce" - ], - "name": "FilAr PLA Bronce", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFWXCbVF": { - "filaments": [ - "Flashforge/Flashforge PC" - ], - "name": "Flashforge PC", - "filament_type": "PC", - "filament_vendor": "Flashforge" - }, - "OFWYtgCa": { - "filaments": [ - "Elegoo/Elegoo PLA Wood", - "OrcaFilamentLibrary/Elegoo PLA Wood" - ], - "name": "Elegoo PLA Wood", - "filament_type": "PLA", - "filament_vendor": "Elegoo" - }, - "OFWa0NiB": { - "filaments": [ - "Volumic/Volumic NYLON Ultra" - ], - "name": "Volumic NYLON Ultra", - "filament_type": "PA", - "filament_vendor": "Volumic" - }, - "OFWao3Ic": { - "filaments": [ - "Creality/Ender-PLA" - ], - "name": "Ender-PLA", - "filament_type": "PLA", - "filament_vendor": "Creality" - }, - "OFWbdGsC": { - "filaments": [ - "Anker/Generic PLA-CF", - "Anycubic/Generic PLA-CF", - "Artillery/Generic PLA-CF", - "BBL/Generic PLA-CF", - "Blocks/Generic PLA-CF", - "Creality/Generic PLA-CF", - "Custom/Generic PLA-CF", - "FLSun/Generic PLA-CF", - "Flashforge/Generic PLA-CF", - "OrcaArena/Generic PLA-CF", - "OrcaFilamentLibrary/Generic PLA-CF", - "Prusa/Generic PLA-CF", - "Qidi/Generic PLA-CF", - "Ratrig/Generic PLA-CF", - "SecKit/Generic PLA-CF", - "Tiertime/Generic PLA-CF", - "Vzbot/Generic PLA-CF" - ], - "name": "Generic PLA-CF", - "filament_type": "PLA-CF", - "filament_vendor": "Generic" - }, - "OFWgFOjn": { - "filaments": [ - "Snapmaker/Snapmaker PLA Silk" - ], - "name": "Snapmaker PLA Silk", - "filament_type": "PLA", - "filament_vendor": "Snapmaker" - }, - "OFWwF7K7": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA Cafe con Leche" - ], - "name": "FilAr PLA Cafe con Leche", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFX0ycRQ": { - "filaments": [ - "BBL/Fiberon PA12-CF", - "OrcaFilamentLibrary/Fiberon PA12-CF" - ], - "name": "Fiberon PA12-CF", - "filament_type": "PA-CF", - "filament_vendor": "Polymaker" - }, - "OFX2zcrM": { - "filaments": [ - "Chuanying/Generic PLA-CF10", - "Flashforge/Generic PLA-CF10" - ], - "name": "Generic PLA-CF10", - "filament_type": "PLA-CF", - "filament_vendor": "Generic" - }, - "OFXCBZTA": { - "filaments": [ - "OrcaFilamentLibrary/Eolas Prints ABS" - ], - "name": "Eolas Prints ABS", - "filament_type": "ABS", - "filament_vendor": "Eolas Prints" - }, - "OFXIbw5D": { - "filaments": [ - "BBL/Bambu PLA Matte", - "OrcaFilamentLibrary/Bambu PLA Matte" - ], - "name": "Bambu PLA Matte", - "filament_type": "PLA", - "filament_vendor": "Bambu Lab" - }, - "OFXJ9iom": { - "filaments": [ - "iQ/Grauts HPP4GF25 P1" - ], - "name": "Grauts HPP4GF25 P1", - "filament_type": "HPP4GF25", - "filament_vendor": "iQ Materials" - }, - "OFXSvqOX": { - "filaments": [ - "Snapmaker/Snapmaker TPU 95A HF" - ], - "name": "Snapmaker TPU 95A HF", - "filament_type": "TPU", - "filament_vendor": "Snapmaker" - }, - "OFXTPuqV": { - "filaments": [ - "OrcaFilamentLibrary/Elas PETG Basic" - ], - "name": "Elas PETG Basic", - "filament_type": "PETG", - "filament_vendor": "Elas" - }, - "OFXW4CDh": { - "filaments": [ - "Ratrig/Generic PCTG BigNozzle" - ], - "name": "Generic PCTG BigNozzle", - "filament_type": "PCTG", - "filament_vendor": "Generic" - }, - "OFXi59OX": { - "filaments": [ - "Afinia/Afinia Value ABS" - ], - "name": "Afinia Value ABS", - "filament_type": "ABS", - "filament_vendor": "Afinia" - }, - "OFXiArjA": { - "filaments": [ - "Flashforge/Flashforge PETG Pro" - ], - "name": "Flashforge PETG Pro", - "filament_type": "PETG", - "filament_vendor": "Flashforge" - }, - "OFXk1emJ": { - "filaments": [ - "Artillery/Artillery PLA Basic" - ], - "name": "Artillery PLA Basic", - "filament_type": "PLA Basic", - "filament_vendor": "Artillery" - }, - "OFXkm8q1": { - "filaments": [ - "BBL/Generic PP-CF", - "Creality/Generic PP-CF", - "OrcaFilamentLibrary/Generic PP-CF", - "Tiertime/Generic PP-CF" - ], - "name": "Generic PP-CF", - "filament_type": "PP-CF", - "filament_vendor": "Generic" - }, - "OFXmv5p0": { - "filaments": [ - "Creality/Generic Speed PLA" - ], - "name": "Generic Speed PLA", - "filament_type": "PLA", - "filament_vendor": "Generic" - }, - "OFXn3Vd9": { - "filaments": [ - "Qidi/QIDI Support For PAHT" - ], - "name": "QIDI Support For PAHT", - "filament_type": "PAHT-S", - "filament_vendor": "QIDI" - }, - "OFXnToSX": { - "filaments": [ - "Creality/Hyper Stardust" - ], - "name": "Hyper Stardust", - "filament_type": "PLA", - "filament_vendor": "Creality" - }, - "OFXuGxvQ": { - "filaments": [ - "Volumic/Volumic PLA Ultra" - ], - "name": "Volumic PLA Ultra", - "filament_type": "PLA", - "filament_vendor": "Volumic" - }, - "OFXz7Mwx": { - "filaments": [ - "Elegoo/Elegoo PLA Silk", - "OrcaFilamentLibrary/Elegoo PLA Silk" - ], - "name": "Elegoo PLA Silk", - "filament_type": "PLA", - "filament_vendor": "Elegoo" - }, - "OFXzQ4yL": { - "filaments": [ - "BBL/Bambu ASA-Aero", - "OrcaFilamentLibrary/Bambu ASA-Aero" - ], - "name": "Bambu ASA-Aero", - "filament_type": "ASA-AERO", - "filament_vendor": "Bambu Lab" - }, - "OFY0F5qA": { - "filaments": [ - "Volumic/Volumic PETG Ultra carbone (Performance)" - ], - "name": "Volumic PETG Ultra carbone (Performance)", - "filament_type": "PETG", - "filament_vendor": "Volumic" - }, - "OFY3AB7j": { - "filaments": [ - "Snapmaker/Snapmaker J1 PLA Matte" - ], - "name": "Snapmaker J1 PLA Matte", - "filament_type": "PLA", - "filament_vendor": "Snapmaker" - }, - "OFY7jxcS": { - "filaments": [ - "Snapmaker/Snapmaker TPU 90A" - ], - "name": "Snapmaker TPU 90A", - "filament_type": "TPU", - "filament_vendor": "Snapmaker" - }, - "OFY9muEs": { - "filaments": [ - "Anker/Generic ABS", - "Anycubic/Generic ABS", - "Artillery/Generic ABS", - "BBL/Generic ABS", - "Blocks/Generic ABS", - "Chuanying/Generic ABS", - "Co Print/Generic ABS", - "CoLiDo/Generic ABS", - "Comgrow/Generic ABS", - "Creality/Generic ABS", - "Custom/Generic ABS", - "Elegoo/Generic ABS", - "FLSun/Generic ABS", - "Flashforge/Generic ABS", - "FlyingBear/Generic ABS", - "InfiMech/Generic ABS", - "Lulzbot/Generic ABS", - "OrcaArena/Generic ABS", - "OrcaFilamentLibrary/Generic ABS", - "Peopoly/Generic ABS", - "Prusa/Generic ABS", - "Qidi/Generic ABS", - "RH3D/Generic ABS", - "Ratrig/Generic ABS", - "SecKit/Generic ABS", - "Sovol/Generic ABS", - "Tiertime/Generic ABS", - "Vzbot/Generic ABS", - "Z-Bolt/Generic ABS" - ], - "name": "Generic ABS", - "filament_type": "ABS", - "filament_vendor": "Generic" - }, - "OFYE7YZw": { - "filaments": [ - "Qidi/Tinmorry PETG-ECO" - ], - "name": "Tinmorry PETG-ECO", - "filament_type": "PETG", - "filament_vendor": "Tinmorry" - }, - "OFYEtXuk": { - "filaments": [ - "Snapmaker/Snapmaker J1 PA-CF" - ], - "name": "Snapmaker J1 PA-CF", - "filament_type": "PA-CF", - "filament_vendor": "Snapmaker" - }, - "OFYGbPHX": { - "filaments": [ - "OrcaFilamentLibrary/PolyLite Dual PLA", - "Snapmaker/PolyLite Dual PLA" - ], - "name": "PolyLite Dual PLA", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFYGrfHY": { - "filaments": [ - "BBL/BETA PETG Fluorescence" - ], - "name": "BETA PETG Fluorescence", - "filament_type": "PETG", - "filament_vendor": "BETA" - }, - "OFYPdQJh": { - "filaments": [ - "Anker/Generic PETG", - "Anycubic/Generic PETG", - "Artillery/Generic PETG", - "BBL/Generic PETG", - "Blocks/Generic PETG", - "CONSTRUCT3D/Generic PETG", - "Chuanying/Generic PETG", - "Co Print/Generic PETG", - "CoLiDo/Generic PETG", - "Comgrow/Generic PETG", - "Creality/Generic PETG", - "Custom/Generic PETG", - "DeltaMaker/Generic PETG", - "Elegoo/Generic PETG", - "FLSun/Generic PETG", - "Flashforge/Generic PETG", - "FlyingBear/Generic PETG", - "Ginger Additive/Generic PETG", - "InfiMech/Generic PETG", - "LONGER/Generic PETG", - "Lulzbot/Generic PETG", - "OrcaArena/Generic PETG", - "OrcaFilamentLibrary/Generic PETG", - "Peopoly/Generic PETG", - "Prusa/Generic PETG", - "Qidi/Generic PETG", - "RH3D/Generic PETG", - "Ratrig/Generic PETG", - "SecKit/Generic PETG", - "Sovol/Generic PETG", - "Tiertime/Generic PETG", - "Vzbot/Generic PETG", - "Z-Bolt/Generic PETG" - ], - "name": "Generic PETG", - "filament_type": "PETG", - "filament_vendor": "Generic" - }, - "OFYTIMbj": { - "filaments": [ - "Flashforge/Flashforge ABS-CF" - ], - "name": "Flashforge ABS-CF", - "filament_type": "ABS-CF", - "filament_vendor": "Flashforge" - }, - "OFYYeMyQ": { - "filaments": [ - "Flashforge/Flashforge PETG Basic" - ], - "name": "Flashforge PETG Basic", - "filament_type": "PETG", - "filament_vendor": "Flashforge" - }, - "OFYd5uS3": { - "filaments": [], - "name": "DREMC TPU 95A", - "filament_type": "TPU", - "filament_vendor": "DREMC" - }, - "OFYezc6s": { - "filaments": [ - "FlyingBear/FlyingBear TPU" - ], - "name": "FlyingBear TPU", - "filament_type": "TPU", - "filament_vendor": "FlyingBear" - }, - "OFYuowge": { - "filaments": [ - "FlyingBear/Other ABS", - "InfiMech/Other ABS" - ], - "name": "Other ABS", - "filament_type": "ABS", - "filament_vendor": "Other" - }, - "OFZ0mR5b": { - "filaments": [ - "Anycubic/Anycubic PLA-CF" - ], - "name": "Anycubic PLA-CF", - "filament_type": "PLA-CF", - "filament_vendor": "Anycubic" - }, - "OFZ2LuAi": { - "filaments": [ - "Wanhao France/YUMI PLA Bowden" - ], - "name": "YUMI PLA Bowden", - "filament_type": "PLA", - "filament_vendor": "Yumi" - }, - "OFZ3K2cL": { - "filaments": [ - "Qidi/QIDI PA6-CF" - ], - "name": "QIDI PA6-CF", - "filament_type": "PA6-CF", - "filament_vendor": "QIDI" - }, - "OFZ4QbfK": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA Rosa Flamenco" - ], - "name": "FilAr PLA Rosa Flamenco", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFZGrQTU": { - "filaments": [ - "BBL/addnorth PETG Economy" - ], - "name": "addnorth PETG Economy", - "filament_type": "PETG", - "filament_vendor": "addnorth" - }, - "OFZJft47": { - "filaments": [ - "BBL/addnorth PLA Economy" - ], - "name": "addnorth PLA Economy", - "filament_type": "PLA", - "filament_vendor": "addnorth" - }, - "OFZLtWYs": { - "filaments": [ - "Qidi/QIDI ABS-GF25" - ], - "name": "QIDI ABS-GF25", - "filament_type": "ABS-GF", - "filament_vendor": "QIDI" - }, - "OFZOuWrO": { - "filaments": [ - "Qidi/QIDI PPS-CF" - ], - "name": "QIDI PPS-CF", - "filament_type": "PPS-CF", - "filament_vendor": "QIDI" - }, - "OFZivHGL": { - "filaments": [ - "Snapmaker/Snapmaker Dual PLA" - ], - "name": "Snapmaker Dual PLA", - "filament_type": "PLA", - "filament_vendor": "Snapmaker" - }, - "OFZqZMuv": { - "filaments": [ - "BBL/BETA ASA" - ], - "name": "BETA ASA", - "filament_type": "ASA", - "filament_vendor": "BETA" - }, - "OFZr862X": { - "filaments": [ - "Creality/Generic PLA HF", - "Prusa/Generic PLA HF" - ], - "name": "Generic PLA HF", - "filament_type": "PLA", - "filament_vendor": "Generic" - }, - "OFZtOQtl": { - "filaments": [ - "Flashforge/Flashforge PA6-CF" - ], - "name": "Flashforge PA6-CF", - "filament_type": "PA6-CF", - "filament_vendor": "Flashforge" - }, - "OFZtkHRq": { - "filaments": [ - "Anycubic/Anycubic PC" - ], - "name": "Anycubic PC", - "filament_type": "PC", - "filament_vendor": "Anycubic" - }, - "OFaDOaNt": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA Celeste Cielo" - ], - "name": "FilAr PLA Celeste Cielo", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFaDsTE0": { - "filaments": [ - "Flashforge/Polymaker S1" - ], - "name": "Polymaker S1", - "filament_type": "PA", - "filament_vendor": "Polymaker" - }, - "OFaEesXQ": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA Rojo de Carreras" - ], - "name": "FilAr PLA Rojo de Carreras", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFaEuvNF": { - "filaments": [ - "Anycubic/Anycubic PAHT-CF" - ], - "name": "Anycubic PAHT-CF", - "filament_type": "PAHT-CF", - "filament_vendor": "Anycubic" - }, - "OFaHjk1V": { - "filaments": [ - "Volumic/Volumic PC" - ], - "name": "Volumic PC", - "filament_type": "PC", - "filament_vendor": "Volumic" - }, - "OFaP2SsH": { - "filaments": [ - "LH/LHS ASA" - ], - "name": "LHS ASA", - "filament_type": "ASA", - "filament_vendor": "LH Stinger" - }, - "OFaQMgRH": { - "filaments": [ - "BBL/Bambu PLA Tough", - "OrcaFilamentLibrary/Bambu PLA Tough" - ], - "name": "Bambu PLA Tough", - "filament_type": "PLA", - "filament_vendor": "Bambu Lab" - }, - "OFaRjiIm": { - "filaments": [ - "SeeMeCNC/SeeMeCNC PETG-CF" - ], - "name": "SeeMeCNC PETG-CF", - "filament_type": "PETG-CF", - "filament_vendor": "SeeMeCNC" - }, - "OFaYz8iE": { - "filaments": [ - "OrcaFilamentLibrary/Elas PLA Pro" - ], - "name": "Elas PLA Pro", - "filament_type": "PLA", - "filament_vendor": "Elas" - }, - "OFaaddbQ": { - "filaments": [ - "Flashforge/Flashforge PVA" - ], - "name": "Flashforge PVA", - "filament_type": "PVA", - "filament_vendor": "Flashforge" - }, - "OFaeIx7W": { - "filaments": [ - "iQ/Polymaker PETG Polymax black P1" - ], - "name": "Polymaker PETG Polymax black P1", - "filament_type": "PETG Polymax", - "filament_vendor": "iQ Materials" - }, - "OFafO6VM": { - "filaments": [ - "Elegoo/Generic PC-CF" - ], - "name": "Generic PC-CF", - "filament_type": "PC-CF", - "filament_vendor": "Generic" - }, - "OFausr3F": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA-mate Rosa" - ], - "name": "FilAr PLA-mate Rosa", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFb5EEM3": { - "filaments": [ - "Artillery/Artillery PET" - ], - "name": "Artillery PET", - "filament_type": "PET", - "filament_vendor": "Artillery" - }, - "OFbP8zEO": { - "filaments": [ - "OrcaFilamentLibrary/Eolas Prints PLA Silk" - ], - "name": "Eolas Prints PLA Silk", - "filament_type": "PLA", - "filament_vendor": "Eolas Prints" - }, - "OFbPuPKY": { - "filaments": [ - "Prusa/Generic FLEX" - ], - "name": "Generic FLEX", - "filament_type": "FLEX", - "filament_vendor": "Generic" - }, - "OFbSChKb": { - "filaments": [ - "SeeMeCNC/SeeMeCNC PLA" - ], - "name": "SeeMeCNC PLA", - "filament_type": "PLA", - "filament_vendor": "SeeMeCNC" - }, - "OFbSZBOi": { - "filaments": [ - "InfiMech/InfiMech TPU Basic" - ], - "name": "InfiMech TPU Basic", - "filament_type": "TPU", - "filament_vendor": "InfiMech" - }, - "OFbh7HcA": { - "filaments": [ - "Eryone/Eryone PP-CF" - ], - "name": "Eryone PP-CF", - "filament_type": "PP-CF", - "filament_vendor": "Eryone" - }, - "OFc3xdm9": { - "filaments": [ - "BBL/Overture PLA", - "OrcaFilamentLibrary/Overture PLA", - "Qidi/Overture PLA" - ], - "name": "Overture PLA", - "filament_type": "PLA", - "filament_vendor": "Overture" - }, - "OFc87pL3": { - "filaments": [ - "OrcaArena/Arena PET-CF" - ], - "name": "Arena PET-CF", - "filament_type": "PET-CF", - "filament_vendor": "Orca Arena" - }, - "OFcBJQcC": { - "filaments": [ - "Snapmaker/Snapmaker Dual TPU High-Flow" - ], - "name": "Snapmaker Dual TPU High-Flow", - "filament_type": "TPU", - "filament_vendor": "Snapmaker" - }, - "OFcBl0nJ": { - "filaments": [ - "BBL/Fiberon PA612-CF15" - ], - "name": "Fiberon PA612-CF15", - "filament_type": "PA-CF", - "filament_vendor": "Polymaker" - }, - "OFcJDtTx": { - "filaments": [ - "Artillery/Artillery TPU" - ], - "name": "Artillery TPU", - "filament_type": "TPU", - "filament_vendor": "Artillery" - }, - "OFcKtw8W": { - "filaments": [ - "Volumic/PA6 CF20 (Performance)" - ], - "name": "PA6 CF20 (Performance)", - "filament_type": "PA6-CF", - "filament_vendor": "Volumic" - }, - "OFcVLpNA": { - "filaments": [ - "Flashforge/FusRock PAHT-GF" - ], - "name": "FusRock PAHT-GF", - "filament_type": "PAHT-GF", - "filament_vendor": "FusRock" - }, - "OFcfQk4h": { - "filaments": [ - "BBL/Overture Air PLA", - "OrcaFilamentLibrary/Overture Air PLA" - ], - "name": "Overture Air PLA", - "filament_type": "PLA", - "filament_vendor": "Overture" - }, - "OFcnWTJB": { - "filaments": [ - "BBL/BETA PLA Glitter" - ], - "name": "BETA PLA Glitter", - "filament_type": "PLA", - "filament_vendor": "BETA" - }, - "OFcogyWl": { - "filaments": [ - "WonderMaker/WonderMaker PLA Metal" - ], - "name": "WonderMaker PLA Metal", - "filament_type": "PLA", - "filament_vendor": "WonderMaker" - }, - "OFcpa50Z": { - "filaments": [ - "BBL/addnorth PLA-CF Carbon Fiber" - ], - "name": "addnorth PLA-CF Carbon Fiber", - "filament_type": "PLA-CF", - "filament_vendor": "addnorth" - }, - "OFctg8r1": { - "filaments": [ - "CoLiDo/CoLiDo PLA+" - ], - "name": "CoLiDo PLA+", - "filament_type": "PLA", - "filament_vendor": "CoLiDo" - }, - "OFcvKkrs": { - "filaments": [ - "BBL/Overture TPU", - "OrcaFilamentLibrary/Overture TPU" - ], - "name": "Overture TPU", - "filament_type": "TPU", - "filament_vendor": "Overture" - }, - "OFcytyoA": { - "filaments": [ - "BBL/Fiberon PETG-ESD", - "OrcaFilamentLibrary/Fiberon PETG-ESD", - "Snapmaker/Fiberon PETG-ESD" - ], - "name": "Fiberon PETG-ESD", - "filament_type": "PETG", - "filament_vendor": "Polymaker" - }, - "OFd0Fv0k": { - "filaments": [ - "BBL/Generic PE-CF", - "OrcaFilamentLibrary/Generic PE-CF", - "Tiertime/Generic PE-CF" - ], - "name": "Generic PE-CF", - "filament_type": "PE-CF", - "filament_vendor": "Generic" - }, - "OFd2vX0G": { - "filaments": [ - "BBL/COEX PLA PRIME", - "OrcaFilamentLibrary/COEX PLA PRIME" - ], - "name": "COEX PLA PRIME", - "filament_type": "PLA", - "filament_vendor": "COEX 3D" - }, - "OFd4zw5l": { - "filaments": [ - "BBL/AliZ PA-CF", - "OrcaFilamentLibrary/AliZ PA-CF" - ], - "name": "AliZ PA-CF", - "filament_type": "PA-CF", - "filament_vendor": "Aliz" - }, - "OFdD5Wbu": { - "filaments": [ - "Snapmaker/Snapmaker J1 PLA-CF" - ], - "name": "Snapmaker J1 PLA-CF", - "filament_type": "PLA-CF", - "filament_vendor": "Snapmaker" - }, - "OFdI4zMo": { - "filaments": [], - "name": "DREMC ASA CF", - "filament_type": "ASA", - "filament_vendor": "DREMC" - }, - "OFdXVjGZ": { - "filaments": [ - "Tiertime/Tiertime PC" - ], - "name": "Tiertime PC", - "filament_type": "PC", - "filament_vendor": "Tiertime" - }, - "OFdb8YNz": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA Verde Manzana" - ], - "name": "FilAr PLA Verde Manzana", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFdd8ZqJ": { - "filaments": [ - "Snapmaker/Snapmaker PLA Wood" - ], - "name": "Snapmaker PLA Wood", - "filament_type": "PLA", - "filament_vendor": "Snapmaker" - }, - "OFdqkWtz": { - "filaments": [ - "Flashforge/Flashforge PLA Luminous" - ], - "name": "Flashforge PLA Luminous", - "filament_type": "PLA", - "filament_vendor": "Flashforge" - }, - "OFdrYBmI": { - "filaments": [ - "Tiertime/Tiertime ASA" - ], - "name": "Tiertime ASA", - "filament_type": "ASA", - "filament_vendor": "Tiertime" - }, - "OFdtPd9h": { - "filaments": [ - "Qidi/QIDI PETG-GF" - ], - "name": "QIDI PETG-GF", - "filament_type": "PETG-GF", - "filament_vendor": "QIDI" - }, - "OFdzlrhi": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA-mate Chocolate" - ], - "name": "FilAr PLA-mate Chocolate", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFe61n6v": { - "filaments": [ - "Ratrig/RatRig PunkFil PETG CF" - ], - "name": "RatRig PunkFil PETG CF", - "filament_type": "PETG-CF10", - "filament_vendor": "RatRig" - }, - "OFe8tuNb": { - "filaments": [ - "Tiertime/Tiertime PA6-CF" - ], - "name": "Tiertime PA6-CF", - "filament_type": "PA6-CF", - "filament_vendor": "Tiertime" - }, - "OFe8yBMG": { - "filaments": [ - "Qidi/QIDI PETG Tough 0.6 nozzle" - ], - "name": "QIDI PETG Tough 0.6 nozzle", - "filament_type": "PETG", - "filament_vendor": "QIDI" - }, - "OFe98A1y": { - "filaments": [ - "Elegoo/Elegoo PET-CF", - "OrcaFilamentLibrary/Elegoo PET-CF" - ], - "name": "Elegoo PET-CF", - "filament_type": "PET-CF", - "filament_vendor": "Elegoo" - }, - "OFeAxvEt": { - "filaments": [ - "Snapmaker/Snapmaker Dual ABS Benchy" - ], - "name": "Snapmaker Dual ABS Benchy", - "filament_type": "ABS", - "filament_vendor": "Snapmaker" - }, - "OFeCJqxx": { - "filaments": [ - "Qidi/QIDI ABS Rapido Metal" - ], - "name": "QIDI ABS Rapido Metal", - "filament_type": "ABS", - "filament_vendor": "QIDI" - }, - "OFeF4UNh": { - "filaments": [ - "BBL/BETA PLA Silk" - ], - "name": "BETA PLA Silk", - "filament_type": "PLA", - "filament_vendor": "BETA" - }, - "OFeIyhUx": { - "filaments": [ - "Anycubic/Anycubic PC-CF" - ], - "name": "Anycubic PC-CF", - "filament_type": "PC-CF", - "filament_vendor": "Anycubic" - }, - "OFeTATC7": { - "filaments": [ - "Snapmaker/Snapmaker J1 Breakaway" - ], - "name": "Snapmaker J1 Breakaway", - "filament_type": "Breakaway Support", - "filament_vendor": "Snapmaker" - }, - "OFeVzkSU": { - "filaments": [ - "Snapmaker/Fiberon PPS-GF20" - ], - "name": "Fiberon PPS-GF20", - "filament_type": "ABS", - "filament_vendor": "Polymaker" - }, - "OFeelsSM": { - "filaments": [ - "Qidi/HATCHBOX PLA" - ], - "name": "HATCHBOX PLA", - "filament_type": "PLA", - "filament_vendor": "HATCHBOX" - }, - "OFelDBgv": { - "filaments": [ - "Snapmaker/Polymaker PLA" - ], - "name": "Polymaker PLA", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFepU7Tl": { - "filaments": [ - "WonderMaker/WonderMaker PLA Matte" - ], - "name": "WonderMaker PLA Matte", - "filament_type": "PLA", - "filament_vendor": "WonderMaker" - }, - "OFesA6rF": { - "filaments": [ - "Anker/Generic PLA Silk", - "BBL/Generic PLA Silk", - "Creality/Generic PLA Silk", - "FLSun/Generic PLA Silk", - "Flashforge/Generic PLA Silk", - "OrcaArena/Generic PLA Silk", - "OrcaFilamentLibrary/Generic PLA Silk", - "Prusa/Generic PLA Silk", - "Qidi/Generic PLA Silk", - "Sovol/Generic PLA Silk", - "Tiertime/Generic PLA Silk" - ], - "name": "Generic PLA Silk", - "filament_type": "PLA", - "filament_vendor": "Generic" - }, - "OFexaZU2": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA Manteca" - ], - "name": "FilAr PLA Manteca", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFf0MkD5": { - "filaments": [ - "Qidi/QIDI PETG Translucent" - ], - "name": "QIDI PETG Translucent", - "filament_type": "PETG", - "filament_vendor": "QIDI" - }, - "OFf5awy4": { - "filaments": [ - "OrcaFilamentLibrary/Eolas Prints PLA Matte" - ], - "name": "Eolas Prints PLA Matte", - "filament_type": "PLA", - "filament_vendor": "Eolas Prints" - }, - "OFf6ZEvu": { - "filaments": [ - "InfiMech/InfiMech PC" - ], - "name": "InfiMech PC", - "filament_type": "PC", - "filament_vendor": "InfiMech" - }, - "OFf6mfQO": { - "filaments": [ - "BBL/Bambu Support for ABS", - "OrcaFilamentLibrary/Bambu Support for ABS" - ], - "name": "Bambu Support for ABS", - "filament_type": "ABS", - "filament_vendor": "Bambu Lab" - }, - "OFf6ynfH": { - "filaments": [ - "FlyingBear/FlyingBear PETG Basic" - ], - "name": "FlyingBear PETG Basic", - "filament_type": "PETG Basic", - "filament_vendor": "FlyingBear" - }, - "OFfBpSRI": { - "filaments": [ - "BBL/Bambu ASA", - "OrcaFilamentLibrary/Bambu ASA" - ], - "name": "Bambu ASA", - "filament_type": "ASA", - "filament_vendor": "Bambu Lab" - }, - "OFfD87Gy": { - "filaments": [ - "Snapmaker/Snapmaker PLA Glow" - ], - "name": "Snapmaker PLA Glow", - "filament_type": "PLA", - "filament_vendor": "Snapmaker" - }, - "OFfHGM1D": { - "filaments": [ - "re3D/re3D rPP" - ], - "name": "re3D rPP", - "filament_type": "PP", - "filament_vendor": "re3D" - }, - "OFfJSCzm": { - "filaments": [ - "OrcaFilamentLibrary/FDplast PETG" - ], - "name": "FDplast PETG", - "filament_type": "PETG", - "filament_vendor": "FDplast" - }, - "OFfSqS4R": { - "filaments": [ - "Creality/ENDER FAST PLA" - ], - "name": "ENDER FAST PLA", - "filament_type": "PLA", - "filament_vendor": "Creality" - }, - "OFfYHK5z": { - "filaments": [ - "Qidi/Polymaker PLA-HT" - ], - "name": "Polymaker PLA-HT", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFfZcoKr": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA-mate Piel" - ], - "name": "FilAr PLA-mate Piel", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFfb10SK": { - "filaments": [ - "Artillery/Artillery PC" - ], - "name": "Artillery PC", - "filament_type": "PC", - "filament_vendor": "Artillery" - }, - "OFfmHUkQ": { - "filaments": [ - "Snapmaker/Snapmaker Dual Breakaway" - ], - "name": "Snapmaker Dual Breakaway", - "filament_type": "Breakaway Support", - "filament_vendor": "Snapmaker" - }, - "OFfmZrI3": { - "filaments": [ - "OrcaFilamentLibrary/FDplast TPU" - ], - "name": "FDplast TPU", - "filament_type": "TPU", - "filament_vendor": "FDplast" - }, - "OFfnXFie": { - "filaments": [ - "BBL/COEX TPE 40D", - "OrcaFilamentLibrary/COEX TPE 40D" - ], - "name": "COEX TPE 40D", - "filament_type": "TPU", - "filament_vendor": "COEX 3D" - }, - "OFfq5YXA": { - "filaments": [ - "OrcaFilamentLibrary/Valment PLA-CF" - ], - "name": "Valment PLA-CF", - "filament_type": "PLA-CF", - "filament_vendor": "Valment" - }, - "OFfr4XNO": { - "filaments": [ - "BBL/COEX TPE 60D", - "OrcaFilamentLibrary/COEX TPE 60D" - ], - "name": "COEX TPE 60D", - "filament_type": "TPU", - "filament_vendor": "COEX 3D" - }, - "OFfr6JDF": { - "filaments": [ - "Qidi/QIDI PETG Tough 0.8 nozzle" - ], - "name": "QIDI PETG Tough 0.8 nozzle", - "filament_type": "PETG", - "filament_vendor": "QIDI" - }, - "OFfuhviw": { - "filaments": [ - "Elegoo/Elegoo PLA Marble", - "OrcaFilamentLibrary/Elegoo PLA Marble" - ], - "name": "Elegoo PLA Marble", - "filament_type": "PLA", - "filament_vendor": "Elegoo" - }, - "OFfuih8e": { - "filaments": [ - "Creality/Creality Silk PLA" - ], - "name": "Creality Silk PLA", - "filament_type": "PLA", - "filament_vendor": "Creality" - }, - "OFg3cWVt": { - "filaments": [ - "Snapmaker/Snapmaker Dual PLA Metal" - ], - "name": "Snapmaker Dual PLA Metal", - "filament_type": "PLA", - "filament_vendor": "Snapmaker" - }, - "OFg57Nmc": { - "filaments": [ - "BBL/Bambu PC FR", - "OrcaFilamentLibrary/Bambu PC FR" - ], - "name": "Bambu PC FR", - "filament_type": "PC", - "filament_vendor": "Bambu Lab" - }, - "OFg8hMzT": { - "filaments": [ - "OrcaFilamentLibrary/FILL3D PPCF" - ], - "name": "FILL3D PPCF", - "filament_type": "PP", - "filament_vendor": "FILL3D" - }, - "OFg8ndtj": { - "filaments": [ - "Anker/Generic PA", - "Anycubic/Generic PA", - "BBL/Generic PA", - "Blocks/Generic PA", - "Creality/Generic PA", - "Custom/Generic PA", - "Elegoo/Generic PA", - "FLSun/Generic PA", - "OrcaArena/Generic PA", - "OrcaFilamentLibrary/Generic PA", - "Prusa/Generic PA", - "Qidi/Generic PA", - "Ratrig/Generic PA", - "SecKit/Generic PA", - "Tiertime/Generic PA", - "Vzbot/Generic PA", - "Z-Bolt/Generic PA" - ], - "name": "Generic PA", - "filament_type": "PA", - "filament_vendor": "Generic" - }, - "OFgHh8ly": { - "filaments": [ - "Afinia/Afinia Value PLA" - ], - "name": "Afinia Value PLA", - "filament_type": "PLA", - "filament_vendor": "Afinia" - }, - "OFgMWJ8T": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA Negro Azabache" - ], - "name": "FilAr PLA Negro Azabache", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFgSbX7E": { - "filaments": [ - "Volumic/Volumic PC (Performance)" - ], - "name": "Volumic PC (Performance)", - "filament_type": "PC", - "filament_vendor": "Volumic" - }, - "OFgXgt98": { - "filaments": [ - "Artillery/Artillery ABS" - ], - "name": "Artillery ABS", - "filament_type": "ABS", - "filament_vendor": "Artillery" - }, - "OFgbpcy9": { - "filaments": [ - "Anker/Generic TPU", - "Anycubic/Generic TPU", - "Artillery/Generic TPU", - "BBL/Generic TPU", - "Blocks/Generic TPU", - "Chuanying/Generic TPU", - "Co Print/Generic TPU", - "CoLiDo/Generic TPU", - "Creality/Generic TPU", - "Custom/Generic TPU", - "DeltaMaker/Generic TPU", - "FLSun/Generic TPU", - "Flashforge/Generic TPU", - "FlyingBear/Generic TPU", - "InfiMech/Generic TPU", - "OrcaArena/Generic TPU", - "OrcaFilamentLibrary/Generic TPU", - "Prusa/Generic TPU", - "Qidi/Generic TPU", - "RH3D/Generic TPU", - "Ratrig/Generic TPU", - "SecKit/Generic TPU", - "Sovol/Generic TPU", - "Tiertime/Generic TPU", - "Vzbot/Generic TPU" - ], - "name": "Generic TPU", - "filament_type": "TPU", - "filament_vendor": "Generic" - }, - "OFgdaBOt": { - "filaments": [ - "Snapmaker/Polymaker Tough PLA Family" - ], - "name": "Polymaker Tough PLA Family", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFgeM7nD": { - "filaments": [ - "Flashforge/Flashforge PA12-CF" - ], - "name": "Flashforge PA12-CF", - "filament_type": "PA-CF", - "filament_vendor": "Flashforge" - }, - "OFgjgN35": { - "filaments": [ - "Flashforge/Flashforge PLA Silk" - ], - "name": "Flashforge PLA Silk", - "filament_type": "PLA", - "filament_vendor": "Flashforge" - }, - "OFglhKLM": { - "filaments": [ - "Qidi/QIDI PLA Rapido 0.8 nozzle" - ], - "name": "QIDI PLA Rapido 0.8 nozzle", - "filament_type": "PLA", - "filament_vendor": "QIDI" - }, - "OFgpLTMR": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PETG Gris Plata" - ], - "name": "FilAr PETG Gris Plata", - "filament_type": "PETG", - "filament_vendor": "FilAr" - }, - "OFgpQwkk": { - "filaments": [ - "Creality/CR-PLA Fluo" - ], - "name": "CR-PLA Fluo", - "filament_type": "PLA", - "filament_vendor": "Creality" - }, - "OFgptDSf": { - "filaments": [ - "OrcaArena/Arena PLA Matte" - ], - "name": "Arena PLA Matte", - "filament_type": "PLA", - "filament_vendor": "Orca Arena" - }, - "OFgyPlwU": { - "filaments": [ - "Snapmaker/Snapmaker TPU High-Flow" - ], - "name": "Snapmaker TPU High-Flow", - "filament_type": "TPU", - "filament_vendor": "Snapmaker" - }, - "OFh7mvPO": { - "filaments": [ - "Prusa/Prusament PVB" - ], - "name": "Prusament PVB", - "filament_type": "PVB", - "filament_vendor": "Prusa Polymers" - }, - "OFh9u9c0": { - "filaments": [ - "Creality/Generic PA6-GF" - ], - "name": "Generic PA6-GF", - "filament_type": "PA-GF", - "filament_vendor": "Generic" - }, - "OFhASRWj": { - "filaments": [ - "BBL/Panchroma PLA Temp Shift", - "OrcaFilamentLibrary/Panchroma PLA Temp Shift", - "Snapmaker/Panchroma PLA Temp Shift" - ], - "name": "Panchroma PLA Temp Shift", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFhMO9Kh": { - "filaments": [ - "OrcaFilamentLibrary/GreenGate3D PETG" - ], - "name": "GreenGate3D PETG", - "filament_type": "PETG", - "filament_vendor": "GreenGate3D" - }, - "OFhN09f0": { - "filaments": [ - "BBL/addnorth PC BLend HT LCF" - ], - "name": "addnorth PC BLend HT LCF", - "filament_type": "PC", - "filament_vendor": "addnorth" - }, - "OFhO5aEJ": { - "filaments": [ - "Ratrig/RatRig PunkFil ABS" - ], - "name": "RatRig PunkFil ABS", - "filament_type": "ABS", - "filament_vendor": "RatRig" - }, - "OFhQf8ou": { - "filaments": [ - "Snapmaker/Snapmaker PLA-CF" - ], - "name": "Snapmaker PLA-CF", - "filament_type": "PLA-CF", - "filament_vendor": "Snapmaker" - }, - "OFhQfUQY": { - "filaments": [ - "BBL/Generic SBS", - "OrcaFilamentLibrary/Generic SBS", - "Tiertime/Generic SBS" - ], - "name": "Generic SBS", - "filament_type": "SBS", - "filament_vendor": "Generic" - }, - "OFhTPf6L": { - "filaments": [ - "Creality/Generic PA6-CF", - "Elegoo/Generic PA6-CF" - ], - "name": "Generic PA6-CF", - "filament_type": "PA6-CF", - "filament_vendor": "Generic" - }, - "OFhUjPA5": { - "filaments": [ - "Eryone/Eryone TPU" - ], - "name": "Eryone TPU", - "filament_type": "TPU", - "filament_vendor": "Eryone" - }, - "OFhWc5Bv": { - "filaments": [ - "OrcaFilamentLibrary/NIT ABS" - ], - "name": "NIT ABS", - "filament_type": "ABS", - "filament_vendor": "NIT" - }, - "OFhWhL1i": { - "filaments": [ - "OrcaFilamentLibrary/Eolas Prints PETG" - ], - "name": "Eolas Prints PETG", - "filament_type": "PETG", - "filament_vendor": "Eolas Prints" - }, - "OFhWrAuP": { - "filaments": [ - "Qidi/QIDI PLA-CF" - ], - "name": "QIDI PLA-CF", - "filament_type": "PLA-CF", - "filament_vendor": "QIDI" - }, - "OFhbolij": { - "filaments": [ - "Creality/eSUN PLA-Lite" - ], - "name": "eSUN PLA-Lite", - "filament_type": "PLA", - "filament_vendor": "eSUN" - }, - "OFhcYzR8": { - "filaments": [ - "Elegoo/Elegoo PLA Sparkle", - "OrcaFilamentLibrary/Elegoo PLA Sparkle" - ], - "name": "Elegoo PLA Sparkle", - "filament_type": "PLA", - "filament_vendor": "Elegoo" - }, - "OFhfd722": { - "filaments": [ - "OrcaFilamentLibrary/Eolas Prints TPU Flex 93A" - ], - "name": "Eolas Prints TPU Flex 93A", - "filament_type": "TPU", - "filament_vendor": "Eolas Prints" - }, - "OFhiJE7Y": { - "filaments": [ - "Qidi/QIDI PEBA 95A" - ], - "name": "QIDI PEBA 95A", - "filament_type": "PEBA", - "filament_vendor": "QIDI" - }, - "OFhkN0a7": { - "filaments": [ - "Creality/Hyper PA612-CF" - ], - "name": "Hyper PA612-CF", - "filament_type": "PA-CF", - "filament_vendor": "Creality" - }, - "OFhlCNqq": { - "filaments": [ - "BBL/COEX PLA", - "OrcaFilamentLibrary/COEX PLA" - ], - "name": "COEX PLA", - "filament_type": "PLA", - "filament_vendor": "COEX 3D" - }, - "OFhmxnYw": { - "filaments": [ - "Snapmaker/Snapmaker PLA Basic" - ], - "name": "Snapmaker PLA Basic", - "filament_type": "PLA", - "filament_vendor": "Snapmaker" - }, - "OFhuaUQB": { - "filaments": [ - "BBL/Bambu ABS", - "OrcaFilamentLibrary/Bambu ABS", - "Qidi/Bambu ABS" - ], - "name": "Bambu ABS", - "filament_type": "ABS", - "filament_vendor": "Bambu Lab" - }, - "OFhwiZ50": { - "filaments": [ - "Qidi/QIDI PLA Rapido 0.2 nozzle" - ], - "name": "QIDI PLA Rapido 0.2 nozzle", - "filament_type": "PLA", - "filament_vendor": "QIDI" - }, - "OFhx4uOG": { - "filaments": [ - "Qidi/QIDI PET-GF" - ], - "name": "QIDI PET-GF", - "filament_type": "PET-GF", - "filament_vendor": "QIDI" - }, - "OFi5RSve": { - "filaments": [ - "Creality/eSUN PLA-LW" - ], - "name": "eSUN PLA-LW", - "filament_type": "PLA", - "filament_vendor": "eSUN" - }, - "OFi6PfUM": { - "filaments": [ - "Chuanying/Generic PLA-Silk", - "Creality/Generic PLA-Silk", - "Flashforge/Generic PLA-Silk" - ], - "name": "Generic PLA-Silk", - "filament_type": "PLA", - "filament_vendor": "Generic" - }, - "OFi90KlM": { - "filaments": [ - "Volumic/Volumic NYLON Ultra (Performance)" - ], - "name": "Volumic NYLON Ultra (Performance)", - "filament_type": "PA", - "filament_vendor": "Volumic" - }, - "OFiDpM1B": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA-mate Bordo" - ], - "name": "FilAr PLA-mate Bordo", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFiEz2XI": { - "filaments": [ - "Cubicon/Cubicon PA-CF" - ], - "name": "Cubicon PA-CF", - "filament_type": "PA", - "filament_vendor": "Cubicon" - }, - "OFiWaoqD": { - "filaments": [ - "OrcaFilamentLibrary/DREMC PPA-CF" - ], - "name": "DREMC PPA-CF", - "filament_type": "PPA-CF", - "filament_vendor": "DREMC" - }, - "OFibWuBd": { - "filaments": [ - "Flashforge/Flashforge ABS Basic" - ], - "name": "Flashforge ABS Basic", - "filament_type": "ABS", - "filament_vendor": "Flashforge" - }, - "OFilAA3b": { - "filaments": [ - "Eryone/Eryone PLA-CF" - ], - "name": "Eryone PLA-CF", - "filament_type": "PLA-CF", - "filament_vendor": "Eryone" - }, - "OFilD4bP": { - "filaments": [ - "FlyingBear/FlyingBear PLA" - ], - "name": "FlyingBear PLA", - "filament_type": "PLA", - "filament_vendor": "FlyingBear" - }, - "OFilnglt": { - "filaments": [ - "Artillery/Artillery PETG" - ], - "name": "Artillery PETG", - "filament_type": "PETG", - "filament_vendor": "Artillery" - }, - "OFin64Qg": { - "filaments": [ - "Creality/Generic Support for PLA" - ], - "name": "Generic Support for PLA", - "filament_type": "PLA", - "filament_vendor": "Generic" - }, - "OFitS8al": { - "filaments": [ - "BBL/PolyLite PLA Neon", - "Snapmaker/PolyLite PLA Neon" - ], - "name": "PolyLite PLA Neon", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFiwEbze": { - "filaments": [ - "Volumic/PETG ESD (Performance)" - ], - "name": "PETG ESD (Performance)", - "filament_type": "PETG-ESD", - "filament_vendor": "Volumic" - }, - "OFj3bTjw": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA-mate Amarillo" - ], - "name": "FilAr PLA-mate Amarillo", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFj64R5U": { - "filaments": [ - "Peopoly/Peopoly Lancer ABS-GF" - ], - "name": "Peopoly Lancer ABS-GF", - "filament_type": "ABS", - "filament_vendor": "Peopoly" - }, - "OFjD3YTW": { - "filaments": [ - "Qidi/Qidi PC-ABS-FR" - ], - "name": "Qidi PC-ABS-FR", - "filament_type": "PC-ABS-FR", - "filament_vendor": "QIDI" - }, - "OFjHrAX0": { - "filaments": [ - "WonderMaker/WonderMaker ABS" - ], - "name": "WonderMaker ABS", - "filament_type": "ABS", - "filament_vendor": "WonderMaker" - }, - "OFjLAYgO": { - "filaments": [ - "Anycubic/Anycubic PEBA" - ], - "name": "Anycubic PEBA", - "filament_type": "PEBA", - "filament_vendor": "Anycubic" - }, - "OFjPXrXO": { - "filaments": [ - "Elegoo/Elegoo PLA Glow", - "OrcaFilamentLibrary/Elegoo PLA Glow" - ], - "name": "Elegoo PLA Glow", - "filament_type": "PLA", - "filament_vendor": "Elegoo" - }, - "OFjT9PkZ": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA Tabaco" - ], - "name": "FilAr PLA Tabaco", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFjUGUIK": { - "filaments": [ - "iQ/Fiberthree PACF Pro P1" - ], - "name": "Fiberthree PACF Pro P1", - "filament_type": "PACF Pro", - "filament_vendor": "iQ Materials" - }, - "OFjUXn67": { - "filaments": [ - "BBL/BETA ABS" - ], - "name": "BETA ABS", - "filament_type": "ABS", - "filament_vendor": "BETA" - }, - "OFjVOWfJ": { - "filaments": [ - "Anycubic/Anycubic PLA High Speed" - ], - "name": "Anycubic PLA High Speed", - "filament_type": "PLA", - "filament_vendor": "Anycubic" - }, - "OFjXrKFO": { - "filaments": [ - "OrcaArena/Arena PLA Impact" - ], - "name": "Arena PLA Impact", - "filament_type": "PLA", - "filament_vendor": "Orca Arena" - }, - "OFjb0wos": { - "filaments": [ - "BBL/Panchroma PLA Metallic", - "OrcaFilamentLibrary/Panchroma PLA Metallic", - "Snapmaker/Panchroma PLA Metallic" - ], - "name": "Panchroma PLA Metallic", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFjiXpyf": { - "filaments": [ - "Qidi/Generic TPU 95A", - "TwoTrees/Generic TPU 95A" - ], - "name": "Generic TPU 95A", - "filament_type": "TPU", - "filament_vendor": "Generic" - }, - "OFjkdnyN": { - "filaments": [ - "Snapmaker/Snapmaker Dual TPU" - ], - "name": "Snapmaker Dual TPU", - "filament_type": "TPU", - "filament_vendor": "Snapmaker" - }, - "OFjoAe0R": { - "filaments": [ - "Qidi/Qidi PLA-CF" - ], - "name": "Qidi PLA-CF", - "filament_type": "PLA-CF", - "filament_vendor": "QIDI" - }, - "OFjogeYN": { - "filaments": [ - "BBL/BETA PETG Glitter" - ], - "name": "BETA PETG Glitter", - "filament_type": "PETG", - "filament_vendor": "BETA" - }, - "OFjorDcx": { - "filaments": [ - "OrcaFilamentLibrary/FDplast ABS" - ], - "name": "FDplast ABS", - "filament_type": "ABS", - "filament_vendor": "FDplast" - }, - "OFjt8dDO": { - "filaments": [ - "Flashforge/FusRock NexPA-CF25" - ], - "name": "FusRock NexPA-CF25", - "filament_type": "PA-CF", - "filament_vendor": "FusRock" - }, - "OFjt9en1": { - "filaments": [ - "OrcaFilamentLibrary/Generic CoPE" - ], - "name": "Generic CoPE", - "filament_type": "CoPE", - "filament_vendor": "Generic" - }, - "OFjz0a3m": { - "filaments": [ - "Prusa/Prusament PC-CF" - ], - "name": "Prusament PC-CF", - "filament_type": "PC-CF", - "filament_vendor": "Prusa Polymers" - }, - "OFk8t9mz": { - "filaments": [ - "BBL/Fiberon PETG-rCF", - "OrcaFilamentLibrary/Fiberon PETG-rCF" - ], - "name": "Fiberon PETG-rCF", - "filament_type": "PETG-CF", - "filament_vendor": "Polymaker" - }, - "OFkAltI8": { - "filaments": [ - "FlyingBear/Other PA-CF", - "InfiMech/Other PA-CF" - ], - "name": "Other PA-CF", - "filament_type": "PA-CF", - "filament_vendor": "Other" - }, - "OFkGp50Y": { - "filaments": [ - "Volumic/Volumic UNIVERSAL Ultra (Performance)" - ], - "name": "Volumic UNIVERSAL Ultra (Performance)", - "filament_type": "UNIV", - "filament_vendor": "Volumic" - }, - "OFkGvN4d": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA Verde Pixel" - ], - "name": "FilAr PLA Verde Pixel", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFkHbjUv": { - "filaments": [ - "BBL/BETA PLA Metallic" - ], - "name": "BETA PLA Metallic", - "filament_type": "PLA", - "filament_vendor": "BETA" - }, - "OFkOviHk": { - "filaments": [ - "BBL/Fiberon PA6-CF", - "OrcaFilamentLibrary/Fiberon PA6-CF" - ], - "name": "Fiberon PA6-CF", - "filament_type": "PA6-CF", - "filament_vendor": "Polymaker" - }, - "OFkR8E2c": { - "filaments": [ - "Prusa/Prusament PETG" - ], - "name": "Prusament PETG", - "filament_type": "PETG", - "filament_vendor": "Prusa Polymers" - }, - "OFkf1HHw": { - "filaments": [ - "Flashforge/Generic PLA-SILK" - ], - "name": "Generic PLA-SILK", - "filament_type": "PLA", - "filament_vendor": "Generic" - }, - "OFkhhUS0": { - "filaments": [ - "Elegoo/Elegoo Rapid PLA+", - "OrcaFilamentLibrary/Elegoo Rapid PLA+" - ], - "name": "Elegoo Rapid PLA+", - "filament_type": "PLA", - "filament_vendor": "Elegoo" - }, - "OFklJcWK": { - "filaments": [ - "FlyingBear/Other PLA Hyper", - "InfiMech/Other PLA Hyper" - ], - "name": "Other PLA Hyper", - "filament_type": "PLA", - "filament_vendor": "Other" - }, - "OFknl9Iz": { - "filaments": [ - "BBL/Bambu ABS-GF", - "OrcaFilamentLibrary/Bambu ABS-GF" - ], - "name": "Bambu ABS-GF", - "filament_type": "ABS-GF", - "filament_vendor": "Bambu Lab" - }, - "OFkoLUtR": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA Verde Oliva" - ], - "name": "FilAr PLA Verde Oliva", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFkq7rPy": { - "filaments": [ - "Eryone/Eryone PA-GF" - ], - "name": "Eryone PA-GF", - "filament_type": "PA-GF", - "filament_vendor": "Eryone" - }, - "OFks6esg": { - "filaments": [ - "Creality/EN-PLA+" - ], - "name": "EN-PLA+", - "filament_type": "PLA", - "filament_vendor": "Creality" - }, - "OFkx5MEe": { - "filaments": [ - "Artillery/Artillery PVA" - ], - "name": "Artillery PVA", - "filament_type": "PVA", - "filament_vendor": "Artillery" - }, - "OFkzr35f": { - "filaments": [ - "OrcaFilamentLibrary/Eolas Prints PLA Antibacterial" - ], - "name": "Eolas Prints PLA Antibacterial", - "filament_type": "PLA", - "filament_vendor": "Eolas Prints" - }, - "OFlBoEfL": { - "filaments": [ - "Snapmaker/Snapmaker J1 TPU High-Flow" - ], - "name": "Snapmaker J1 TPU High-Flow", - "filament_type": "TPU", - "filament_vendor": "Snapmaker" - }, - "OFlIsW6f": { - "filaments": [ - "Snapmaker/Snapmaker Dual PLA Matte" - ], - "name": "Snapmaker Dual PLA Matte", - "filament_type": "PLA", - "filament_vendor": "Snapmaker" - }, - "OFlN6DL1": { - "filaments": [ - "Qidi/QIDI PA-Ultra" - ], - "name": "QIDI PA-Ultra", - "filament_type": "UltraPA", - "filament_vendor": "QIDI" - }, - "OFlP3KWq": { - "filaments": [ - "Elegoo/Elegoo PETG HF", - "OrcaFilamentLibrary/Elegoo PETG HF" - ], - "name": "Elegoo PETG HF", - "filament_type": "PETG", - "filament_vendor": "Elegoo" - }, - "OFlSNkhc": { - "filaments": [ - "OrcaFilamentLibrary/Eolas Prints ASA" - ], - "name": "Eolas Prints ASA", - "filament_type": "ASA", - "filament_vendor": "Eolas Prints" - }, - "OFlfuj2k": { - "filaments": [ - "BBL/Bambu TPU 85A" - ], - "name": "Bambu TPU 85A", - "filament_type": "TPU", - "filament_vendor": "Bambu Lab" - }, - "OFlgMgNM": { - "filaments": [ - "Flashforge/Flashforge PPS" - ], - "name": "Flashforge PPS", - "filament_type": "PPS", - "filament_vendor": "Flashforge" - }, - "OFllmFhT": { - "filaments": [ - "Elegoo/Generic PETG PRO" - ], - "name": "Generic PETG PRO", - "filament_type": "PETG", - "filament_vendor": "Generic" - }, - "OFlmxlDG": { - "filaments": [ - "BBL/BETA HIPS" - ], - "name": "BETA HIPS", - "filament_type": "HIPS", - "filament_vendor": "BETA" - }, - "OFln72PT": { - "filaments": [ - "Elegoo/Elegoo PLA-CF", - "OrcaFilamentLibrary/Elegoo PLA-CF" - ], - "name": "Elegoo PLA-CF", - "filament_type": "PLA", - "filament_vendor": "Elegoo" - }, - "OFlsTpJG": { - "filaments": [ - "Elegoo/Elegoo PC-FR", - "OrcaFilamentLibrary/Elegoo PC-FR" - ], - "name": "Elegoo PC-FR", - "filament_type": "PC", - "filament_vendor": "Elegoo" - }, - "OFlufQpZ": { - "filaments": [ - "Snapmaker/Snapmaker PLA" - ], - "name": "Snapmaker PLA", - "filament_type": "PLA", - "filament_vendor": "Snapmaker" - }, - "OFlwmqrC": { - "filaments": [ - "BBL/Polymaker HT-PLA-GF", - "OrcaFilamentLibrary/Polymaker HT-PLA-GF", - "Snapmaker/Polymaker HT-PLA-GF" - ], - "name": "Polymaker HT-PLA-GF", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFm06H6V": { - "filaments": [ - "Elegoo/Elegoo PLA Basic", - "OrcaFilamentLibrary/Elegoo PLA Basic" - ], - "name": "Elegoo PLA Basic", - "filament_type": "PLA", - "filament_vendor": "Elegoo" - }, - "OFm4SivL": { - "filaments": [ - "Flashforge/Flashforge PLA Pro" - ], - "name": "Flashforge PLA Pro", - "filament_type": "PLA", - "filament_vendor": "Flashforge" - }, - "OFm4ysMO": { - "filaments": [ - "FlyingBear/FlyingBear ABS" - ], - "name": "FlyingBear ABS", - "filament_type": "ABS", - "filament_vendor": "FlyingBear" - }, - "OFm70lLt": { - "filaments": [ - "CoLiDo/CoLiDo PLA" - ], - "name": "CoLiDo PLA", - "filament_type": "PLA", - "filament_vendor": "CoLiDo" - }, - "OFmCOW2Y": { - "filaments": [ - "re3D/re3D rPETG" - ], - "name": "re3D rPETG", - "filament_type": "PETG", - "filament_vendor": "re3D" - }, - "OFmFwUWM": { - "filaments": [ - "Prusa/Prusament ASA" - ], - "name": "Prusament ASA", - "filament_type": "ASA", - "filament_vendor": "Prusa Polymers" - }, - "OFmJAd3A": { - "filaments": [ - "OrcaFilamentLibrary/FDplast HIPS" - ], - "name": "FDplast HIPS", - "filament_type": "HIPS", - "filament_vendor": "FDplast" - }, - "OFmKU2Ha": { - "filaments": [ - "Eryone/Eryone PLA" - ], - "name": "Eryone PLA", - "filament_type": "PLA", - "filament_vendor": "Eryone" - }, - "OFmN2lvw": { - "filaments": [ - "BBL/Generic TPU for AMS" - ], - "name": "Generic TPU for AMS", - "filament_type": "TPU-AMS", - "filament_vendor": "Generic" - }, - "OFmY0l6t": { - "filaments": [ - "Creality/Generic PLA Matte", - "Elegoo/Generic PLA Matte", - "OrcaFilamentLibrary/Generic PLA Matte" - ], - "name": "Generic PLA Matte", - "filament_type": "PLA", - "filament_vendor": "Generic" - }, - "OFma5TXH": { - "filaments": [ - "Qidi/QIDI ABS Odorless" - ], - "name": "QIDI ABS Odorless", - "filament_type": "ABS", - "filament_vendor": "QIDI" - }, - "OFmaeU4a": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA-mate Naranja" - ], - "name": "FilAr PLA-mate Naranja", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFmfizbq": { - "filaments": [ - "OrcaArena/Arena PLA Silk" - ], - "name": "Arena PLA Silk", - "filament_type": "PLA", - "filament_vendor": "Orca Arena" - }, - "OFmjN2bc": { - "filaments": [ - "Anycubic/Anycubic PLA" - ], - "name": "Anycubic PLA", - "filament_type": "PLA", - "filament_vendor": "Anycubic" - }, - "OFmn9NZL": { - "filaments": [ - "BBL/FusRock ABS-GF", - "OrcaFilamentLibrary/FusRock ABS-GF" - ], - "name": "FusRock ABS-GF", - "filament_type": "ABS-GF", - "filament_vendor": "FusRock" - }, - "OFmpMwxS": { - "filaments": [ - "BBL/Generic PLA High Speed", - "Creality/Generic PLA High Speed", - "FLSun/Generic PLA High Speed", - "Flashforge/Generic PLA High Speed", - "OrcaFilamentLibrary/Generic PLA High Speed", - "Qidi/Generic PLA High Speed", - "Tiertime/Generic PLA High Speed" - ], - "name": "Generic PLA High Speed", - "filament_type": "PLA", - "filament_vendor": "Generic" - }, - "OFmt513L": { - "filaments": [ - "BBL/BETA PETG Transparent" - ], - "name": "BETA PETG Transparent", - "filament_type": "PETG", - "filament_vendor": "BETA" - }, - "OFmveLWz": { - "filaments": [ - "Elegoo/Elegoo PETG-GF", - "OrcaFilamentLibrary/Elegoo PETG-GF" - ], - "name": "Elegoo PETG-GF", - "filament_type": "PETG", - "filament_vendor": "Elegoo" - }, - "OFn1QaY3": { - "filaments": [ - "Elegoo/Elegoo PLA Translucent2", - "OrcaFilamentLibrary/Elegoo PLA Translucent2" - ], - "name": "Elegoo PLA Translucent2", - "filament_type": "PLA", - "filament_vendor": "Elegoo" - }, - "OFn2GlhY": { - "filaments": [ - "Creality/Hyper PA6-CF" - ], - "name": "Hyper PA6-CF", - "filament_type": "PA-CF", - "filament_vendor": "Creality" - }, - "OFn6WpN7": { - "filaments": [ - "Qidi/QIDI PA12-CF" - ], - "name": "QIDI PA12-CF", - "filament_type": "PA12-CF", - "filament_vendor": "QIDI" - }, - "OFnBvPhb": { - "filaments": [ - "BBL/addnorth PLA rPLA RE-ADD" - ], - "name": "addnorth PLA rPLA RE-ADD", - "filament_type": "PLA", - "filament_vendor": "addnorth" - }, - "OFnHc3D6": { - "filaments": [ - "Creality/eSUN PLA-CF" - ], - "name": "eSUN PLA-CF", - "filament_type": "PLA-CF", - "filament_vendor": "eSUN" - }, - "OFnO4wnf": { - "filaments": [ - "Prusa/Prusament PLA" - ], - "name": "Prusament PLA", - "filament_type": "PLA", - "filament_vendor": "Prusa Polymers" - }, - "OFnSeLHk": { - "filaments": [ - "CoLiDo/CoLiDo PLA Silk" - ], - "name": "CoLiDo PLA Silk", - "filament_type": "PLA", - "filament_vendor": "CoLiDo" - }, - "OFnT7Qpb": { - "filaments": [ - "Prusa/Generic TPU HF" - ], - "name": "Generic TPU HF", - "filament_type": "TPU", - "filament_vendor": "Generic" - }, - "OFnXrkhA": { - "filaments": [ - "InfiMech/InfiMech PA-CF" - ], - "name": "InfiMech PA-CF", - "filament_type": "PA-CF", - "filament_vendor": "InfiMech" - }, - "OFnXwW8l": { - "filaments": [ - "Snapmaker/PolyLite PLA Pro Metallic" - ], - "name": "PolyLite PLA Pro Metallic", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFnYVFk2": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA Azul Francia" - ], - "name": "FilAr PLA Azul Francia", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFncpm7O": { - "filaments": [ - "WonderMaker/WonderMaker PLA Silk" - ], - "name": "WonderMaker PLA Silk", - "filament_type": "PLA", - "filament_vendor": "WonderMaker" - }, - "OFneOFWe": { - "filaments": [ - "CoLiDo/CoLiDo ABS" - ], - "name": "CoLiDo ABS", - "filament_type": "ABS", - "filament_vendor": "CoLiDo" - }, - "OFnejEt4": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PETG Cian" - ], - "name": "FilAr PETG Cian", - "filament_type": "PETG", - "filament_vendor": "FilAr" - }, - "OFnfxTvi": { - "filaments": [ - "BBL/Bambu PLA Lite" - ], - "name": "Bambu PLA Lite", - "filament_type": "PLA", - "filament_vendor": "Bambu Lab" - }, - "OFngcE81": { - "filaments": [ - "LH/LHS TPU Foamy 78A" - ], - "name": "LHS TPU Foamy 78A", - "filament_type": "TPU", - "filament_vendor": "LH Stinger" - }, - "OFniMuTN": { - "filaments": [ - "BBL/Bambu PA6-CF", - "OrcaFilamentLibrary/Bambu PA6-CF" - ], - "name": "Bambu PA6-CF", - "filament_type": "PA6-CF", - "filament_vendor": "Bambu Lab" - }, - "OFnmp2pO": { - "filaments": [ - "Snapmaker/Snapmaker Breakaway Support For PLA" - ], - "name": "Snapmaker Breakaway Support For PLA", - "filament_type": "PLA", - "filament_vendor": "Snapmaker" - }, - "OFnmp6rt": { - "filaments": [ - "Anycubic/Anycubic PLA+" - ], - "name": "Anycubic PLA+", - "filament_type": "PLA", - "filament_vendor": "Anycubic" - }, - "OFnpX8uh": { - "filaments": [ - "BBL/BETA PETG Matte" - ], - "name": "BETA PETG Matte", - "filament_type": "PETG", - "filament_vendor": "BETA" - }, - "OFnyHfcv": { - "filaments": [ - "Ratrig/Generic ABS BigNozzle" - ], - "name": "Generic ABS BigNozzle", - "filament_type": "ABS", - "filament_vendor": "Generic" - }, - "OFo15hcT": { - "filaments": [ - "Qidi/QIDI PAHT-GF" - ], - "name": "QIDI PAHT-GF", - "filament_type": "PAHT-GF", - "filament_vendor": "QIDI" - }, - "OFo2UF2C": { - "filaments": [ - "BBL/Generic BVOH", - "Creality/Generic BVOH", - "Flashforge/Generic BVOH", - "OrcaFilamentLibrary/Generic BVOH", - "Tiertime/Generic BVOH" - ], - "name": "Generic BVOH", - "filament_type": "BVOH", - "filament_vendor": "Generic" - }, - "OFo6n2pB": { - "filaments": [ - "Anycubic/Anycubic PETG" - ], - "name": "Anycubic PETG", - "filament_type": "PETG", - "filament_vendor": "Anycubic" - }, - "OFoBTKmn": { - "filaments": [ - "Cubicon/Cubicon PETG" - ], - "name": "Cubicon PETG", - "filament_type": "PETG", - "filament_vendor": "Cubicon" - }, - "OFoSknDB": { - "filaments": [ - "OrcaFilamentLibrary/FILL3D PLA Turbo" - ], - "name": "FILL3D PLA Turbo", - "filament_type": "PLA", - "filament_vendor": "FILL3D" - }, - "OFoYSJKi": { - "filaments": [ - "Anker/Generic PETG-CF", - "BBL/Generic PETG-CF", - "Creality/Generic PETG-CF", - "Elegoo/Generic PETG-CF", - "Flashforge/Generic PETG-CF", - "OrcaArena/Generic PETG-CF", - "OrcaFilamentLibrary/Generic PETG-CF", - "Qidi/Generic PETG-CF", - "Tiertime/Generic PETG-CF" - ], - "name": "Generic PETG-CF", - "filament_type": "PETG-CF", - "filament_vendor": "Generic" - }, - "OFobDOW5": { - "filaments": [ - "Elegoo/Elegoo ASA", - "OrcaFilamentLibrary/Elegoo ASA" - ], - "name": "Elegoo ASA", - "filament_type": "ASA", - "filament_vendor": "Elegoo" - }, - "OFocyw69": { - "filaments": [ - "BBL/AliZ PETG", - "OrcaFilamentLibrary/AliZ PETG" - ], - "name": "AliZ PETG", - "filament_type": "PETG", - "filament_vendor": "Aliz" - }, - "OFoiVqVM": { - "filaments": [ - "BBL/Bambu PLA Basic", - "OrcaFilamentLibrary/Bambu PLA Basic" - ], - "name": "Bambu PLA Basic", - "filament_type": "PLA", - "filament_vendor": "Bambu Lab" - }, - "OFojbdhR": { - "filaments": [ - "Flashforge/Flashforge ABS-GF" - ], - "name": "Flashforge ABS-GF", - "filament_type": "ABS-GF", - "filament_vendor": "Flashforge" - }, - "OForhBi4": { - "filaments": [ - "Cubicon/Cubicon ABSk" - ], - "name": "Cubicon ABSk", - "filament_type": "ABS", - "filament_vendor": "Cubicon" - }, - "OFovEIbw": { - "filaments": [ - "BBL/Bambu PETG HF", - "OrcaFilamentLibrary/Bambu PETG HF" - ], - "name": "Bambu PETG HF", - "filament_type": "PETG", - "filament_vendor": "Bambu Lab" - }, - "OFp4ETDP": { - "filaments": [ - "Creality/CR-PLA" - ], - "name": "CR-PLA", - "filament_type": "PLA", - "filament_vendor": "Creality" - }, - "OFp57RRC": { - "filaments": [ - "Qidi/QIDI PPS-GF" - ], - "name": "QIDI PPS-GF", - "filament_type": "PPS-GF", - "filament_vendor": "QIDI" - }, - "OFp9wdmf": { - "filaments": [ - "Eryone/Eryone PA-CF" - ], - "name": "Eryone PA-CF", - "filament_type": "PA-CF", - "filament_vendor": "Eryone" - }, - "OFpBlrvY": { - "filaments": [ - "OrcaFilamentLibrary/Valment PLA Silk" - ], - "name": "Valment PLA Silk", - "filament_type": "PLA", - "filament_vendor": "Valment" - }, - "OFpDo5Ix": { - "filaments": [ - "Cubicon/Cubicon ABS" - ], - "name": "Cubicon ABS", - "filament_type": "ABS", - "filament_vendor": "Cubicon" - }, - "OFpPGSKG": { - "filaments": [ - "BBL/SUNLU Silk PLA+", - "Flashforge/SUNLU Silk PLA+", - "OrcaFilamentLibrary/SUNLU Silk PLA+" - ], - "name": "SUNLU Silk PLA+", - "filament_type": "PLA", - "filament_vendor": "SUNLU" - }, - "OFpPJSHE": { - "filaments": [ - "Peopoly/Peopoly Lancer PETG-C" - ], - "name": "Peopoly Lancer PETG-C", - "filament_type": "PETG", - "filament_vendor": "Peopoly" - }, - "OFpW4gdi": { - "filaments": [ - "BBL/SUNLU PLA Matte", - "Flashforge/SUNLU PLA Matte", - "OrcaFilamentLibrary/SUNLU PLA Matte" - ], - "name": "SUNLU PLA Matte", - "filament_type": "PLA", - "filament_vendor": "SUNLU" - }, - "OFpdjFI3": { - "filaments": [ - "BBL/BETA PLA UV Color Change" - ], - "name": "BETA PLA UV Color Change", - "filament_type": "PLA", - "filament_vendor": "BETA" - }, - "OFpu74Qe": { - "filaments": [ - "Snapmaker/Snapmaker PLA Eco" - ], - "name": "Snapmaker PLA Eco", - "filament_type": "PLA", - "filament_vendor": "Snapmaker" - }, - "OFpumhCM": { - "filaments": [ - "Volumic/Volumic UNIVERSAL Ultra" - ], - "name": "Volumic UNIVERSAL Ultra", - "filament_type": "UNIV", - "filament_vendor": "Volumic" - }, - "OFq0TY7C": { - "filaments": [ - "Flashforge/Flashforge ASA-CF" - ], - "name": "Flashforge ASA-CF", - "filament_type": "ASA-CF", - "filament_vendor": "Flashforge" - }, - "OFq8gfS4": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PETG Negro Azabache" - ], - "name": "FilAr PETG Negro Azabache", - "filament_type": "PETG", - "filament_vendor": "FilAr" - }, - "OFq9svOz": { - "filaments": [ - "BBL/Generic PPS", - "Creality/Generic PPS", - "Tiertime/Generic PPS" - ], - "name": "Generic PPS", - "filament_type": "PPS", - "filament_vendor": "Generic" - }, - "OFqFRiLb": { - "filaments": [ - "Ratrig/Generic PLA BigNozzle" - ], - "name": "Generic PLA BigNozzle", - "filament_type": "PLA", - "filament_vendor": "Generic" - }, - "OFqGRZyH": { - "filaments": [ - "BBL/Numakers PLA+", - "OrcaFilamentLibrary/Numakers PLA+" - ], - "name": "Numakers PLA+", - "filament_type": "PLA", - "filament_vendor": "Numakers" - }, - "OFqHQNoZ": { - "filaments": [ - "Elegoo/Elegoo TPU 95A", - "OrcaFilamentLibrary/Elegoo TPU 95A" - ], - "name": "Elegoo TPU 95A", - "filament_type": "TPU", - "filament_vendor": "Elegoo" - }, - "OFqINlYj": { - "filaments": [ - "BBL/eSUN PLA+", - "Creality/eSUN PLA+", - "OrcaFilamentLibrary/eSUN PLA+" - ], - "name": "eSUN PLA+", - "filament_type": "PLA", - "filament_vendor": "eSUN" - }, - "OFqTwtXM": { - "filaments": [ - "BBL/addnorth PETG rPETG Matte" - ], - "name": "addnorth PETG rPETG Matte", - "filament_type": "PETG", - "filament_vendor": "addnorth" - }, - "OFqcL5UF": { - "filaments": [ - "Qidi/QIDI Support For PET/PA" - ], - "name": "QIDI Support For PET/PA", - "filament_type": "PA-S", - "filament_vendor": "QIDI" - }, - "OFqtx549": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA-mate Celeste Cielo" - ], - "name": "FilAr PLA-mate Celeste Cielo", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFqw2PQA": { - "filaments": [ - "BBL/Panchroma CoPE", - "OrcaFilamentLibrary/Panchroma CoPE", - "Snapmaker/Panchroma CoPE" - ], - "name": "Panchroma CoPE", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFrFBEfd": { - "filaments": [ - "OrcaFilamentLibrary/Eolas Prints PLA Neon" - ], - "name": "Eolas Prints PLA Neon", - "filament_type": "PLA", - "filament_vendor": "Eolas Prints" - }, - "OFrGJ4tR": { - "filaments": [ - "Anycubic/Anycubic PLA Slik" - ], - "name": "Anycubic PLA Slik", - "filament_type": "PLA", - "filament_vendor": "Anycubic" - }, - "OFrKLeE3": { - "filaments": [ - "BBL/Bambu PLA Metal", - "OrcaFilamentLibrary/Bambu PLA Metal" - ], - "name": "Bambu PLA Metal", - "filament_type": "PLA", - "filament_vendor": "Bambu Lab" - }, - "OFrLiqiM": { - "filaments": [ - "InfiMech/InfiMech PETG" - ], - "name": "InfiMech PETG", - "filament_type": "PETG", - "filament_vendor": "InfiMech" - }, - "OFrM4hdm": { - "filaments": [ - "Creality/CR-PLA Carbon" - ], - "name": "CR-PLA Carbon", - "filament_type": "PLA-CF", - "filament_vendor": "Creality" - }, - "OFrOh600": { - "filaments": [ - "BBL/Panchroma PLA Matte", - "Creality/Panchroma PLA Matte", - "OrcaFilamentLibrary/Panchroma PLA Matte", - "Snapmaker/Panchroma PLA Matte" - ], - "name": "Panchroma PLA Matte", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFrZDhVt": { - "filaments": [ - "Flashforge/Flashforge ASA-GF" - ], - "name": "Flashforge ASA-GF", - "filament_type": "ASA-GF", - "filament_vendor": "Flashforge" - }, - "OFrdZ0cK": { - "filaments": [ - "Creality/eSUN PETG+HS" - ], - "name": "eSUN PETG+HS", - "filament_type": "PETG", - "filament_vendor": "eSUN" - }, - "OFrjacXf": { - "filaments": [ - "Flashforge/Flashforge PET-CF" - ], - "name": "Flashforge PET-CF", - "filament_type": "PET-CF", - "filament_vendor": "Flashforge" - }, - "OFrqMlGt": { - "filaments": [ - "BBL/BETA PETG" - ], - "name": "BETA PETG", - "filament_type": "PETG", - "filament_vendor": "BETA" - }, - "OFrr67nG": { - "filaments": [ - "OrcaArena/Arena PC" - ], - "name": "Arena PC", - "filament_type": "PC", - "filament_vendor": "Orca Arena" - }, - "OFryjl35": { - "filaments": [ - "Elegoo/Elegoo ASA-CF", - "OrcaFilamentLibrary/Elegoo ASA-CF" - ], - "name": "Elegoo ASA-CF", - "filament_type": "ASA", - "filament_vendor": "Elegoo" - }, - "OFsB2lxm": { - "filaments": [ - "Elegoo/Elegoo PLA Matte", - "OrcaFilamentLibrary/Elegoo PLA Matte" - ], - "name": "Elegoo PLA Matte", - "filament_type": "PLA", - "filament_vendor": "Elegoo" - }, - "OFsD974q": { - "filaments": [ - "Volumic/Volumic PETG Ultra (Performance)" - ], - "name": "Volumic PETG Ultra (Performance)", - "filament_type": "PETG", - "filament_vendor": "Volumic" - }, - "OFsDXRpS": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA Piel" - ], - "name": "FilAr PLA Piel", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFsFo7ms": { - "filaments": [ - "Volumic/Volumic PP Ultra" - ], - "name": "Volumic PP Ultra", - "filament_type": "PP", - "filament_vendor": "Volumic" - }, - "OFsFon5l": { - "filaments": [ - "BBL/Generic HIPS", - "Chuanying/Generic HIPS", - "Creality/Generic HIPS", - "Flashforge/Generic HIPS", - "OrcaFilamentLibrary/Generic HIPS", - "Tiertime/Generic HIPS" - ], - "name": "Generic HIPS", - "filament_type": "HIPS", - "filament_vendor": "Generic" - }, - "OFsHSVZc": { - "filaments": [ - "BBL/Bambu Support W", - "OrcaFilamentLibrary/Bambu Support W" - ], - "name": "Bambu Support W", - "filament_type": "PLA", - "filament_vendor": "Bambu Lab" - }, - "OFsP8PKH": { - "filaments": [ - "Z-Bolt/Generic ABS HT" - ], - "name": "Generic ABS HT", - "filament_type": "ABS", - "filament_vendor": "Generic" - }, - "OFsRDvTM": { - "filaments": [ - "Anycubic/Panchroma PLA", - "BBL/Panchroma PLA", - "OrcaFilamentLibrary/Panchroma PLA", - "Snapmaker/Panchroma PLA" - ], - "name": "Panchroma PLA", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFsXQXbs": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PETG Blanco Antartida" - ], - "name": "FilAr PETG Blanco Antartida", - "filament_type": "PETG", - "filament_vendor": "FilAr" - }, - "OFsijjtH": { - "filaments": [ - "BBL/Generic PP-GF", - "OrcaFilamentLibrary/Generic PP-GF", - "Tiertime/Generic PP-GF" - ], - "name": "Generic PP-GF", - "filament_type": "PP-GF", - "filament_vendor": "Generic" - }, - "OFsoykbm": { - "filaments": [ - "OrcaFilamentLibrary/DREMC PA6-CF" - ], - "name": "DREMC PA6-CF", - "filament_type": "PA6-CF", - "filament_vendor": "DREMC" - }, - "OFt0JbR7": { - "filaments": [ - "Snapmaker/Snapmaker J1 PLA Metal" - ], - "name": "Snapmaker J1 PLA Metal", - "filament_type": "PLA", - "filament_vendor": "Snapmaker" - }, - "OFt3HtlG": { - "filaments": [ - "Qidi/QIDI ABS-GF" - ], - "name": "QIDI ABS-GF", - "filament_type": "ABS-GF", - "filament_vendor": "QIDI" - }, - "OFt6e0US": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PETG Amarillo Lima" - ], - "name": "FilAr PETG Amarillo Lima", - "filament_type": "PETG", - "filament_vendor": "FilAr" - }, - "OFt7SngH": { - "filaments": [ - "Snapmaker/Snapmaker J1 ASA" - ], - "name": "Snapmaker J1 ASA", - "filament_type": "ASA", - "filament_vendor": "Snapmaker" - }, - "OFtFtiS0": { - "filaments": [ - "Snapmaker/Polymaker PETG Galaxy" - ], - "name": "Polymaker PETG Galaxy", - "filament_type": "PETG", - "filament_vendor": "Polymaker" - }, - "OFtGC1ye": { - "filaments": [ - "Artillery/Artillery PA-CF" - ], - "name": "Artillery PA-CF", - "filament_type": "PA-CF", - "filament_vendor": "Artillery" - }, - "OFtKeKa9": { - "filaments": [ - "OrcaArena/Arena PLA Tough" - ], - "name": "Arena PLA Tough", - "filament_type": "PLA", - "filament_vendor": "Orca Arena" - }, - "OFtOPlK6": { - "filaments": [ - "OrcaArena/Arena PAHT-CF" - ], - "name": "Arena PAHT-CF", - "filament_type": "PA-CF", - "filament_vendor": "Orca Arena" - }, - "OFtOoWIj": { - "filaments": [], - "name": "FilAr PLA-mate", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFtRn8X8": { - "filaments": [ - "OrcaFilamentLibrary/FDplast SBS" - ], - "name": "FDplast SBS", - "filament_type": "SBS", - "filament_vendor": "FDplast" - }, - "OFtdVZpV": { - "filaments": [ - "BBL/addnorth PLA X-PLA" - ], - "name": "addnorth PLA X-PLA", - "filament_type": "PLA", - "filament_vendor": "addnorth" - }, - "OFtefokm": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA-mate Blanco" - ], - "name": "FilAr PLA-mate Blanco", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFtkLO6q": { - "filaments": [ - "BBL/Bambu TPU 90A" - ], - "name": "Bambu TPU 90A", - "filament_type": "TPU", - "filament_vendor": "Bambu Lab" - }, - "OFtndTHe": { - "filaments": [ - "BBL/BETA PETG-CF" - ], - "name": "BETA PETG-CF", - "filament_type": "PETG-CF", - "filament_vendor": "BETA" - }, - "OFtpXCCv": { - "filaments": [ - "BBL/COEX ASA PRIME", - "OrcaFilamentLibrary/COEX ASA PRIME" - ], - "name": "COEX ASA PRIME", - "filament_type": "ASA", - "filament_vendor": "COEX 3D" - }, - "OFtr8eZw": { - "filaments": [ - "OrcaFilamentLibrary/FDplast PLA" - ], - "name": "FDplast PLA", - "filament_type": "PLA", - "filament_vendor": "FDplast" - }, - "OFtudokz": { - "filaments": [ - "OrcaFilamentLibrary/Eolas Prints PLA Premium" - ], - "name": "Eolas Prints PLA Premium", - "filament_type": "PLA", - "filament_vendor": "Eolas Prints" - }, - "OFtybfNX": { - "filaments": [ - "Snapmaker/Snapmaker PLA Metal" - ], - "name": "Snapmaker PLA Metal", - "filament_type": "PLA", - "filament_vendor": "Snapmaker" - }, - "OFu08yGN": { - "filaments": [ - "Volumic/Volumic PETG Ultra carbone" - ], - "name": "Volumic PETG Ultra carbone", - "filament_type": "PETG", - "filament_vendor": "Volumic" - }, - "OFu0fjPJ": { - "filaments": [ - "LH/LHS PC CF" - ], - "name": "LHS PC CF", - "filament_type": "PC", - "filament_vendor": "LH Stinger" - }, - "OFu1E4ur": { - "filaments": [ - "Qidi/QIDI ASA-Aero" - ], - "name": "QIDI ASA-Aero", - "filament_type": "ASA-AERO", - "filament_vendor": "QIDI" - }, - "OFu1evlr": { - "filaments": [ - "BBL/Generic PCTG", - "Creality/Generic PCTG", - "OrcaFilamentLibrary/Generic PCTG", - "Ratrig/Generic PCTG", - "Tiertime/Generic PCTG" - ], - "name": "Generic PCTG", - "filament_type": "PCTG", - "filament_vendor": "Generic" - }, - "OFuFEtKX": { - "filaments": [ - "Flashforge/Flashforge PETG-CF" - ], - "name": "Flashforge PETG-CF", - "filament_type": "PETG-CF", - "filament_vendor": "Flashforge" - }, - "OFuJ49uH": { - "filaments": [ - "Qidi/QIDI PETG Basic" - ], - "name": "QIDI PETG Basic", - "filament_type": "PETG", - "filament_vendor": "QIDI" - }, - "OFuO0cAP": { - "filaments": [ - "OrcaArena/Arena PETG-CF" - ], - "name": "Arena PETG-CF", - "filament_type": "PETG-CF", - "filament_vendor": "Orca Arena" - }, - "OFuUuIhR": { - "filaments": [ - "Elegoo/Elegoo PETG-CF", - "OrcaFilamentLibrary/Elegoo PETG-CF" - ], - "name": "Elegoo PETG-CF", - "filament_type": "PETG", - "filament_vendor": "Elegoo" - }, - "OFuV79ru": { - "filaments": [ - "Flashforge/Flashforge PA66-CF" - ], - "name": "Flashforge PA66-CF", - "filament_type": "PA-CF", - "filament_vendor": "Flashforge" - }, - "OFuWCQXN": { - "filaments": [ - "BBL/COEX ABS PRIME", - "OrcaFilamentLibrary/COEX ABS PRIME" - ], - "name": "COEX ABS PRIME", - "filament_type": "ABS", - "filament_vendor": "COEX 3D" - }, - "OFuehn62": { - "filaments": [ - "OrcaArena/Arena PLA Marble" - ], - "name": "Arena PLA Marble", - "filament_type": "PLA", - "filament_vendor": "Orca Arena" - }, - "OFufTAK9": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA-mate Negro" - ], - "name": "FilAr PLA-mate Negro", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFughwKn": { - "filaments": [ - "Qidi/QIDI PLA Matte Basic" - ], - "name": "QIDI PLA Matte Basic", - "filament_type": "PLA", - "filament_vendor": "QIDI" - }, - "OFujZSdh": { - "filaments": [ - "Creality/Hyper PETG" - ], - "name": "Hyper PETG", - "filament_type": "PETG", - "filament_vendor": "Creality" - }, - "OFulOdT2": { - "filaments": [ - "Flashforge/Generic TPU 85A" - ], - "name": "Generic TPU 85A", - "filament_type": "TPU", - "filament_vendor": "Generic" - }, - "OFurdQxc": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PETG Magenta" - ], - "name": "FilAr PETG Magenta", - "filament_type": "PETG", - "filament_vendor": "FilAr" - }, - "OFusbWjj": { - "filaments": [ - "Creality/Hyper PETG-CF" - ], - "name": "Hyper PETG-CF", - "filament_type": "PETG-CF", - "filament_vendor": "Creality" - }, - "OFuvOt0r": { - "filaments": [ - "BBL/BETA PLA Basic" - ], - "name": "BETA PLA Basic", - "filament_type": "PLA", - "filament_vendor": "BETA" - }, - "OFuxH0Uz": { - "filaments": [ - "Volumic/Volumic FLEX93 Ultra" - ], - "name": "Volumic FLEX93 Ultra", - "filament_type": "TPU", - "filament_vendor": "Volumic" - }, - "OFvD0Qqt": { - "filaments": [ - "Ratrig/Generic PETG BigNozzle" - ], - "name": "Generic PETG BigNozzle", - "filament_type": "PETG", - "filament_vendor": "Generic" - }, - "OFvDbkFq": { - "filaments": [ - "Prusa/Prusament PC Blend" - ], - "name": "Prusament PC Blend", - "filament_type": "PC", - "filament_vendor": "Prusa Polymers" - }, - "OFvKUnLh": { - "filaments": [ - "BBL/Bambu TPU 95A HF", - "OrcaFilamentLibrary/Bambu TPU 95A HF" - ], - "name": "Bambu TPU 95A HF", - "filament_type": "TPU", - "filament_vendor": "Bambu Lab" - }, - "OFvLppPU": { - "filaments": [ - "Creality/CR-Nylon" - ], - "name": "CR-Nylon", - "filament_type": "PA", - "filament_vendor": "Creality" - }, - "OFvPPMxL": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PLA Verde FilAr" - ], - "name": "FilAr PLA Verde FilAr", - "filament_type": "PLA", - "filament_vendor": "FilAr" - }, - "OFvTVZc3": { - "filaments": [ - "BBL/COEX PETG", - "OrcaFilamentLibrary/COEX PETG" - ], - "name": "COEX PETG", - "filament_type": "PETG", - "filament_vendor": "COEX 3D" - }, - "OFvVy7yo": { - "filaments": [ - "OrcaFilamentLibrary/Eolas Prints TPU D60 UV Resistant" - ], - "name": "Eolas Prints TPU D60 UV Resistant", - "filament_type": "TPU", - "filament_vendor": "Eolas Prints" - }, - "OFvaLVML": { - "filaments": [ - "Flashforge/Flashforge HIPS" - ], - "name": "Flashforge HIPS", - "filament_type": "HIPS", - "filament_vendor": "Flashforge" - }, - "OFvcIGee": { - "filaments": [ - "BBL/addnorth TPU Pro Matte 85A" - ], - "name": "addnorth TPU Pro Matte 85A", - "filament_type": "TPU", - "filament_vendor": "addnorth" - }, - "OFvdZ2bx": { - "filaments": [ - "Qidi/QIDI WOOD Rapido" - ], - "name": "QIDI WOOD Rapido", - "filament_type": "PLA", - "filament_vendor": "QIDI" - }, - "OFvgE0Zh": { - "filaments": [ - "Elegoo/Elegoo PLA", - "OrcaFilamentLibrary/Elegoo PLA" - ], - "name": "Elegoo PLA", - "filament_type": "PLA", - "filament_vendor": "Elegoo" - }, - "OFvmwTZE": { - "filaments": [ - "Snapmaker/Snapmaker TPU 95A" - ], - "name": "Snapmaker TPU 95A", - "filament_type": "TPU", - "filament_vendor": "Snapmaker" - }, - "OFvrXuV7": { - "filaments": [ - "BBL/PolyLite ASA", - "OrcaFilamentLibrary/PolyLite ASA" - ], - "name": "PolyLite ASA", - "filament_type": "ASA", - "filament_vendor": "Polymaker" - }, - "OFvxIS9g": { - "filaments": [ - "BBL/Fiberon PA12-CF10", - "Snapmaker/Fiberon PA12-CF10" - ], - "name": "Fiberon PA12-CF10", - "filament_type": "PA-CF", - "filament_vendor": "Polymaker" - }, - "OFvxghTE": { - "filaments": [ - "Chuanying/Generic HS PLA", - "Flashforge/Generic HS PLA", - "TwoTrees/Generic HS PLA" - ], - "name": "Generic HS PLA", - "filament_type": "PLA", - "filament_vendor": "Generic" - }, - "OFvyB0Bz": { - "filaments": [ - "BBL/PolyLite PLA Galaxy", - "Snapmaker/PolyLite PLA Galaxy" - ], - "name": "PolyLite PLA Galaxy", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFvzvwCu": { - "filaments": [ - "OrcaFilamentLibrary/Eolas Prints PLA High Speed" - ], - "name": "Eolas Prints PLA High Speed", - "filament_type": "PLA", - "filament_vendor": "Eolas Prints" - }, - "OFw4WD4T": { - "filaments": [ - "BBL/Fiberon PETG-rCF08" - ], - "name": "Fiberon PETG-rCF08", - "filament_type": "PETG-CF", - "filament_vendor": "Polymaker" - }, - "OFwJ0qu2": { - "filaments": [], - "name": "DREMC PET-CF", - "filament_type": "PET-CF", - "filament_vendor": "DREMC" - }, - "OFwLBAGf": { - "filaments": [ - "Qidi/HATCHBOX ABS" - ], - "name": "HATCHBOX ABS", - "filament_type": "ABS", - "filament_vendor": "HATCHBOX" - }, - "OFwPrlCM": { - "filaments": [ - "BBL/Bambu PETG Translucent", - "OrcaFilamentLibrary/Bambu PETG Translucent" - ], - "name": "Bambu PETG Translucent", - "filament_type": "PETG", - "filament_vendor": "Bambu Lab" - }, - "OFwRJ4g0": { - "filaments": [ - "OrcaFilamentLibrary/NIT PLA" - ], - "name": "NIT PLA", - "filament_type": "PLA", - "filament_vendor": "NIT" - }, - "OFwVVKEV": { - "filaments": [ - "FlyingBear/Other TPU", - "InfiMech/Other TPU" - ], - "name": "Other TPU", - "filament_type": "TPU", - "filament_vendor": "Other" - }, - "OFwaYjL6": { - "filaments": [ - "BBL/Fiberon PA6-GF", - "OrcaFilamentLibrary/Fiberon PA6-GF" - ], - "name": "Fiberon PA6-GF", - "filament_type": "PA-GF", - "filament_vendor": "Polymaker" - }, - "OFwc74ck": { - "filaments": [ - "BBL/BETA PLA Matte" - ], - "name": "BETA PLA Matte", - "filament_type": "PLA", - "filament_vendor": "BETA" - }, - "OFwhLMs4": { - "filaments": [ - "Snapmaker/Snapmaker PLA SnapSpeed" - ], - "name": "Snapmaker PLA SnapSpeed", - "filament_type": "PLA", - "filament_vendor": "Snapmaker" - }, - "OFwjMiKL": { - "filaments": [ - "Flashforge/Flashforge PETG Transparent" - ], - "name": "Flashforge PETG Transparent", - "filament_type": "PETG", - "filament_vendor": "Flashforge" - }, - "OFwlZ7gH": { - "filaments": [ - "Flashforge/Flashforge TPU-90A" - ], - "name": "Flashforge TPU-90A", - "filament_type": "TPU-90A", - "filament_vendor": "Flashforge" - }, - "OFwu7IAG": { - "filaments": [ - "BBL/COEX PCTG PRIME", - "OrcaFilamentLibrary/COEX PCTG PRIME" - ], - "name": "COEX PCTG PRIME", - "filament_type": "PCTG", - "filament_vendor": "COEX 3D" - }, - "OFwwAQnA": { - "filaments": [ - "Prusa/Generic PC HF" - ], - "name": "Generic PC HF", - "filament_type": "PC", - "filament_vendor": "Generic" - }, - "OFwyt1xt": { - "filaments": [ - "Eryone/Eryone ASA-CF" - ], - "name": "Eryone ASA-CF", - "filament_type": "ASA-CF", - "filament_vendor": "Eryone" - }, - "OFx0WlzS": { - "filaments": [ - "Flashforge/Flashforge TPU-95A" - ], - "name": "Flashforge TPU-95A", - "filament_type": "TPU-95A", - "filament_vendor": "Flashforge" - }, - "OFx8Lmsd": { - "filaments": [ - "OrcaFilamentLibrary/Eolas Prints PETG UV Resistant" - ], - "name": "Eolas Prints PETG UV Resistant", - "filament_type": "PETG", - "filament_vendor": "Eolas Prints" - }, - "OFxA1p01": { - "filaments": [ - "BBL/Overture PLA Pro", - "OrcaFilamentLibrary/Overture PLA Pro" - ], - "name": "Overture PLA Pro", - "filament_type": "PLA", - "filament_vendor": "Overture" - }, - "OFxDHUX8": { - "filaments": [ - "SeeMeCNC/SeeMeCNC PETG" - ], - "name": "SeeMeCNC PETG", - "filament_type": "PETG", - "filament_vendor": "SeeMeCNC" - }, - "OFxJRuVF": { - "filaments": [ - "Anycubic/Anycubic PC-GF" - ], - "name": "Anycubic PC-GF", - "filament_type": "PC-GF", - "filament_vendor": "Anycubic" - }, - "OFxOHhZw": { - "filaments": [ - "Elegoo/Elegoo ABS", - "OrcaFilamentLibrary/Elegoo ABS" - ], - "name": "Elegoo ABS", - "filament_type": "ABS", - "filament_vendor": "Elegoo" - }, - "OFxUwUeW": { - "filaments": [ - "BBL/SUNLU PLA Marble", - "Flashforge/SUNLU PLA Marble", - "OrcaFilamentLibrary/SUNLU PLA Marble" - ], - "name": "SUNLU PLA Marble", - "filament_type": "PLA", - "filament_vendor": "SUNLU" - }, - "OFxYB4Sw": { - "filaments": [ - "Snapmaker/Snapmaker J1 PETG-CF" - ], - "name": "Snapmaker J1 PETG-CF", - "filament_type": "PETG-CF", - "filament_vendor": "Snapmaker" - }, - "OFxe4rXr": { - "filaments": [ - "BBL/PolyTerra PLA Marble", - "Snapmaker/PolyTerra PLA Marble" - ], - "name": "PolyTerra PLA Marble", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFxqf79Q": { - "filaments": [ - "BBL/BETA PETG HF" - ], - "name": "BETA PETG HF", - "filament_type": "PETG", - "filament_vendor": "BETA" - }, - "OFy02QHU": { - "filaments": [ - "BBL/PolyLite PLA Translucent", - "Snapmaker/PolyLite PLA Translucent" - ], - "name": "PolyLite PLA Translucent", - "filament_type": "PLA", - "filament_vendor": "Polymaker" - }, - "OFy14TRA": { - "filaments": [ - "Snapmaker/Snapmaker J1 ABS" - ], - "name": "Snapmaker J1 ABS", - "filament_type": "ABS", - "filament_vendor": "Snapmaker" - }, - "OFy3sW6j": { - "filaments": [ - "WonderMaker/WonderMaker ASA" - ], - "name": "WonderMaker ASA", - "filament_type": "ASA", - "filament_vendor": "WonderMaker" - }, - "OFy48TOp": { - "filaments": [ - "Flashforge/Generic TPU-95A" - ], - "name": "Generic TPU-95A", - "filament_type": "TPU-95A", - "filament_vendor": "Generic" - }, - "OFy8tYJE": { - "filaments": [ - "Cubicon/Cubicon ABS-A100" - ], - "name": "Cubicon ABS-A100", - "filament_type": "ABS", - "filament_vendor": "Cubicon" - }, - "OFyFyLIp": { - "filaments": [ - "SeeMeCNC/SeeMeCNC TPU" - ], - "name": "SeeMeCNC TPU", - "filament_type": "TPU", - "filament_vendor": "SeeMeCNC" - }, - "OFyHgT60": { - "filaments": [ - "OrcaArena/Arena PLA Sparkle" - ], - "name": "Arena PLA Sparkle", - "filament_type": "PLA", - "filament_vendor": "Orca Arena" - }, - "OFyJjkek": { - "filaments": [ - "BBL/addnorth TPU Pro Matte 95A" - ], - "name": "addnorth TPU Pro Matte 95A", - "filament_type": "TPU", - "filament_vendor": "addnorth" - }, - "OFyLWVF3": { - "filaments": [ - "Creality/Generic PETG-GF" - ], - "name": "Generic PETG-GF", - "filament_type": "PETG-GF", - "filament_vendor": "Generic" - }, - "OFyPG8v2": { - "filaments": [ - "Snapmaker/Snapmaker Dual PLA Eco" - ], - "name": "Snapmaker Dual PLA Eco", - "filament_type": "PLA", - "filament_vendor": "Snapmaker" - }, - "OFyPTnSk": { - "filaments": [ - "BBL/BETA PETG Heat Color Change" - ], - "name": "BETA PETG Heat Color Change", - "filament_type": "PETG", - "filament_vendor": "BETA" - }, - "OFyQwdaM": { - "filaments": [ - "Volumic/Volumic ABS Ultra (Performance)" - ], - "name": "Volumic ABS Ultra (Performance)", - "filament_type": "ABS", - "filament_vendor": "Volumic" - }, - "OFyRCIMh": { - "filaments": [ - "FlyingBear/Other PC", - "InfiMech/Other PC" - ], - "name": "Other PC", - "filament_type": "PC", - "filament_vendor": "Other" - }, - "OFyUJI3q": { - "filaments": [ - "Volumic/Volumic ABS Ultra" - ], - "name": "Volumic ABS Ultra", - "filament_type": "ABS", - "filament_vendor": "Volumic" - }, - "OFybzvQN": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PETG Gris Ceniza" - ], - "name": "FilAr PETG Gris Ceniza", - "filament_type": "PETG", - "filament_vendor": "FilAr" - }, - "OFyhjiNs": { - "filaments": [ - "Snapmaker/Snapmaker PVA" - ], - "name": "Snapmaker PVA", - "filament_type": "PVA", - "filament_vendor": "Snapmaker" - }, - "OFyj3m13": { - "filaments": [ - "Snapmaker/Snapmaker Dual PLA Silk" - ], - "name": "Snapmaker Dual PLA Silk", - "filament_type": "PLA", - "filament_vendor": "Snapmaker" - }, - "OFymnal9": { - "filaments": [ - "Sovol/Sovol Zero PETG HS Nozzle" - ], - "name": "Sovol Zero PETG HS Nozzle", - "filament_type": "PETG", - "filament_vendor": "Generic" - }, - "OFyoBZdm": { - "filaments": [ - "LH/LHS PLA" - ], - "name": "LHS PLA", - "filament_type": "PLA", - "filament_vendor": "LH Stinger" - }, - "OFyreocX": { - "filaments": [ - "Tiertime/Tiertime PVA" - ], - "name": "Tiertime PVA", - "filament_type": "PVA", - "filament_vendor": "Tiertime" - }, - "OFyrnlUn": { - "filaments": [ - "Snapmaker/Snapmaker J1 TPU" - ], - "name": "Snapmaker J1 TPU", - "filament_type": "TPU", - "filament_vendor": "Snapmaker" - }, - "OFysxCep": { - "filaments": [ - "OrcaFilamentLibrary/FilAr PETG Coral" - ], - "name": "FilAr PETG Coral", - "filament_type": "PETG", - "filament_vendor": "FilAr" - }, - "OFyxayW4": { - "filaments": [ - "BBL/AliZ PLA", - "OrcaFilamentLibrary/AliZ PLA" - ], - "name": "AliZ PLA", - "filament_type": "PLA", - "filament_vendor": "Aliz" - }, - "OFz1a1fy": { - "filaments": [ - "BBL/BETA PETG Metallic" - ], - "name": "BETA PETG Metallic", - "filament_type": "PETG", - "filament_vendor": "BETA" - }, - "OFz5oHgf": { - "filaments": [ - "MagicMaker/Generic PEEK" - ], - "name": "Generic PEEK", - "filament_type": "PEEK", - "filament_vendor": "Generic" - }, - "OFzAWsca": { - "filaments": [ - "Qidi/Qidi TPU 95A-HF" - ], - "name": "Qidi TPU 95A-HF", - "filament_type": "TPU", - "filament_vendor": "QIDI" - }, - "OFzB4uOs": { - "filaments": [ - "Sovol/Sovol Zero PLA Basic HS Nozzle" - ], - "name": "Sovol Zero PLA Basic HS Nozzle", - "filament_type": "PLA", - "filament_vendor": "Generic" - }, - "OFzRtFM9": { - "filaments": [ - "Prusa/Generic ASA HF" - ], - "name": "Generic ASA HF", - "filament_type": "ASA", - "filament_vendor": "Generic" - }, - "OFzS7zt4": { - "filaments": [ - "Anycubic/Anycubic PA" - ], - "name": "Anycubic PA", - "filament_type": "PA", - "filament_vendor": "Anycubic" - }, - "OFzY7N3Z": { - "filaments": [ - "Artillery/Artillery PLA" - ], - "name": "Artillery PLA", - "filament_type": "PLA", - "filament_vendor": "Artillery" - }, - "OFzaq7Yg": { - "filaments": [ - "BBL/BETA TPU 98A" - ], - "name": "BETA TPU 98A", - "filament_type": "TPU", - "filament_vendor": "BETA" - }, - "OFzk5oAo": { - "filaments": [ - "BBL/addnorth ABS rABS" - ], - "name": "addnorth ABS rABS", - "filament_type": "ABS", - "filament_vendor": "addnorth" - }, - "OFzrUUxc": { - "filaments": [], - "name": "DREMC ABS", - "filament_type": "ABS", - "filament_vendor": "DREMC" - }, - "OFztQ7rO": { - "filaments": [ - "LH/LHS ABS" - ], - "name": "LHS ABS", - "filament_type": "ASA", - "filament_vendor": "LH Stinger" - }, - "OFzwA5Z9": { - "filaments": [ - "Flashforge/FusRock PET-GF" - ], - "name": "FusRock PET-GF", - "filament_type": "PET-GF", - "filament_vendor": "FusRock" - }, - "OFzyIxba": { - "filaments": [ - "BBL/Bambu PVA", - "OrcaFilamentLibrary/Bambu PVA" - ], - "name": "Bambu PVA", - "filament_type": "PVA", - "filament_vendor": "Bambu Lab" - } - } -} diff --git a/scripts/orca_profile_tool.py b/scripts/orca_profile_tool.py index b889a1bc39..100e7cba3f 100755 --- a/scripts/orca_profile_tool.py +++ b/scripts/orca_profile_tool.py @@ -10,23 +10,19 @@ commands: normalize rewrite profile files into their canonical shape trim delete profile files no .json list references update-index regenerate the *_list sections of .json - update-snapshot re-record scripts/filament_id_snapshot.json options shared by several commands: --vendor VENDOR act on one vendor bundle only; repeatable, empty means all - (every command but update-snapshot) --profile-type TYPE one of machine_model/process/filament/machine; repeatable (normalize, trim, update-index) --dry-run report what would change and write nothing (every command that writes) - --profiles DIR act on another profile tree (default: resources/profiles); - check and update-snapshot then need --snapshot PATH too, - since the snapshot describes resources/profiles alone + --profiles DIR act on another profile tree (default: resources/profiles) After adding, renaming or deleting profile files, run: - normalize -> update-index -> generate-id -> update-snapshot -> check + normalize -> update-index -> generate-id -> check normalize supplies missing types; update-index registers presets before id -generation. update-snapshot is needed when filament ids or claims change. +generation. Use trim only for deliberate cleanup, previewed with --dry-run: it judges against the current index and can delete newly added, unindexed presets. @@ -55,8 +51,8 @@ filament_id policy (see docs/HLSD/filament_id.md): filament_id = "OF" + base62_6( uuid5(FILAMENT_ID_NAMESPACE, "filament_product///") ) 8 chars total, which satisfies the AMS length limit. Nobody invents ids by - hand, and nothing but the triple feeds the mint — not the rest of the tree, - not the snapshot. Two products whose triples mint one id (a base62 + hand, and nothing but the triple feeds the mint — not the rest of the tree. + Two products whose triples mint one id (a base62 collision; odds ~1e-5 over the whole tree) is an error --check reports and --generate refuses to write; the remedy is a rename so the triples differ, never a salted or hand-picked second id. @@ -70,12 +66,6 @@ filament_id policy (see docs/HLSD/filament_id.md): the app applies at the printer boundary), the QD_* ids a Qidi box composes at runtime, and the P+7-hex ids CreatePresetsDialog.cpp gives user-created filaments all fail the format rule like any other stray value. - * scripts/filament_id_snapshot.json is the sanctioned-state snapshot: one - entry per id, carrying the product triple it is minted from and the - "Vendor/Filament" presets claiming it. It must exactly equal the tree-derived - state at all times, so any id/claim/triple change shows up as a reviewable - diff to that file (the maintainer gate). It sanctions state, never - exceptions: no check consults it to excuse a preset from the rules above. setting_id policy (see AGENTS.md "Critical Constraints"): * setting_id is a PRESET id, a pure function of the preset's identity: @@ -123,7 +113,6 @@ FILAMENT_ID_LENGTH = 6 # base62 digits after the "OF" prefix -> 8 chars total SCRIPTS_DIR = os.path.dirname(os.path.abspath(__file__)) PROFILES_DIR = os.path.normpath(os.path.join(SCRIPTS_DIR, "..", "resources", "profiles")) -SNAPSHOT_PATH = os.path.join(SCRIPTS_DIR, "filament_id_snapshot.json") # The single source of truth for the map path; update_bambu_filament_ids.py # imports this rather than recomputing it. BAMBU_MAP_PATH = os.path.normpath( @@ -193,7 +182,6 @@ _JSON_STR = r'"(?:[^"\\]|\\.)*"' GENERATE_CMD = "python scripts/orca_profile_tool.py generate-id" SETTING_ID_CMD = '"python scripts/orca_profile_tool.py generate-id --setting-id"' -UPDATE_HINT = 'run "python scripts/orca_profile_tool.py update-snapshot" and commit the diff for maintainer review' BAMBU_MAP_HINT = 'regenerate the map with "python scripts/update_bambu_filament_ids.py" and commit the diff for maintainer review' NORMALIZE_HINT = 'try "python scripts/orca_profile_tool.py normalize" to fix common issues automatically' @@ -246,8 +234,8 @@ def _base62_tail(n, length): """The low `length` base62 digits of n, most-significant first. The shared tail of both id rules. Its output bytes are pinned by the C++ - golden vectors (tests/libslic3r/test_preset_setting_id.cpp) and by the - filament_id snapshot — never change it. + golden vectors (tests/libslic3r/test_preset_setting_id.cpp) and by every + filament_id in the tree — never change it. """ digits = [] for _ in range(length): @@ -483,9 +471,8 @@ def resolve_triple(name, filaments, ofl_filaments): def analyze_tree(profiles_dir): """Load every vendor bundle and derive the full filament_id state. - Returns a dict with the tree-derived snapshot sections plus the working data - the checks and the assign pass need. All claims are "Vendor/Filament" strings - over INSTANTIATED system filaments, tree-wide including OFL and BBL. + Returns a dict of the tree-derived state the checks and the assign pass need, + tree-wide including OFL and BBL. """ profiles_dir = str(profiles_dir) vendor_names = list_vendor_names(profiles_dir) @@ -507,11 +494,6 @@ def analyze_tree(profiles_dir): rec["id_source"] = src vendors[vendor] = filaments - # id -> set of "Vendor/Filament" claims over instantiated presets. Every id - # occurring in the tree is a key; ids only ever DECLARED (e.g. on a root - # none of whose descendants instantiate) keep an empty claim list, so that - # the snapshot exactly equals the tree-derived state. - ids = {} vendor_ids = {} # vendor -> set of ids occurring there (declared or effective) declared_ids = {} # vendor -> set of ids DECLARED in that vendor's own files missing_effective = [] # (vendor, name, file) instantiated presets resolving no id @@ -532,7 +514,6 @@ def analyze_tree(profiles_dir): fid = rec["filament_id"] occurring.add(fid) declared_ids.setdefault(vendor, set()).add(fid) - ids.setdefault(fid, set()) declarer_triples.append((vendor, rec, fid, triple)) triples.setdefault(fid, set()).add(triple) filament_triples.setdefault( @@ -545,11 +526,10 @@ def analyze_tree(profiles_dir): missing_effective.append((vendor, rec["name"], rec["file"])) continue occurring.add(eff) - ids.setdefault(eff, set()).add(f"{vendor}/{base_name(rec['name'])}") if not rec.get("filament_id") and OF_ID_RE.match(eff): inherited.append((vendor, rec, eff, triple)) - # Cross-bundle triple divergence (check 4, warning only): the same filament + # Cross-bundle triple divergence (check 3, warning only): the same filament # name declared in several bundles with different triples cannot converge # on one id until the divergence is fixed. name_bundles = {} @@ -564,7 +544,6 @@ def analyze_tree(profiles_dir): return { "vendors": vendors, "read_errors": read_errors, - "ids": {fid: sorted(claims) for fid, claims in ids.items()}, "vendor_ids": vendor_ids, "declared_ids": declared_ids, "missing_effective": sorted(missing_effective), @@ -578,57 +557,16 @@ def analyze_tree(profiles_dir): } -# --------------------------------------------------------------------------- -# Snapshot IO -# --------------------------------------------------------------------------- - -def snapshot_from_analysis(analysis): - """One entry per id, in id order: the product triple it is minted from and - the "Vendor/Filament" claims on it. Requires exactly one declared triple per - id (update_snapshot refuses any other state; check 3 rejects it anyway).""" - ids = {} - for fid, claims in sorted(analysis["ids"].items()): - [(vendor, ftype, filament_name)] = analysis["triples"][fid] - ids[fid] = {"filaments": sorted(claims), "name": filament_name, - "filament_type": ftype, "filament_vendor": vendor} - return {"ids": ids} - - -def snapshot_triple(entry): - return [entry["filament_vendor"], entry["filament_type"], entry["name"]] - - -def load_snapshot(path): - """Return the snapshot dict, or None when the file does not exist.""" - if not os.path.exists(path): - return None - data = load_json(path) - data.setdefault("ids", {}) - return data - - -def write_snapshot(path, obj): - """Deterministic serialization: snapshot_from_analysis order, indent 1, LF, - trailing newline.""" - with open(path, "w", encoding="utf-8", newline="\n") as f: - json.dump(obj, f, indent=1, ensure_ascii=False) - f.write("\n") - - # --------------------------------------------------------------------------- # filament_id validation # --------------------------------------------------------------------------- -def check_filament_ids(profiles_dir=PROFILES_DIR, snapshot_path=SNAPSHOT_PATH, - map_path=BAMBU_MAP_PATH): +def check_filament_ids(profiles_dir=PROFILES_DIR, map_path=BAMBU_MAP_PATH): """Validate filament_id state across every vendor. Returns the error count. 1. Format: every id occurring in the tree (declared or effective) must - match ^OF[0-9A-Za-z]{6}$. No exceptions: not the snapshot, not BBL. - 2. Snapshot equality, both directions: every id in the tree, the filaments - claiming it and the triple its declarers resolve must equal the snapshot - entry exactly (the snapshot diff is the maintainer gate). - 3. Identity: the id is a function of the triple alone, and there is no + match ^OF[0-9A-Za-z]{6}$. No exceptions, not even BBL. + 2. Identity: the id is a function of the triple alone, and there is no second acceptable value. (a) A declared id must equal the one id the declarer's own triple mints; (b) the id an instantiated preset inherits must equal the one ITS own triple mints — how it inherits it (a root, a @@ -636,31 +574,22 @@ def check_filament_ids(profiles_dir=PROFILES_DIR, snapshot_path=SNAPSHOT_PATH, filament resolves an effective id at all (an id-less one is a hard load error in C++); (d) no two products mint one id (a base62 collision, resolved by renaming one of them). - 4. Triple integrity: (a) every declarer resolves non-empty filament_vendor + 3. Triple integrity: (a) every declarer resolves non-empty filament_vendor and filament_type; (b) declarers of one (bundle, filament) resolve identical triples; cross-bundle divergence on the same filament name is a warning only. - 5. Bambu catalog map: resources/printers/bambu_filament_ids.json must parse, + 4. Bambu catalog map: resources/printers/bambu_filament_ids.json must parse, carry source/bambustudio_commit/generated, key only OF-format ids, map each Bambu id at most once, and for every row whose key the tree claims, the tree's triple for that id must equal the row's (vendor, type, name). - - Nothing is grandfathered: the snapshot sanctions state, never exceptions. """ _utf8_console() errors = 0 analysis = analyze_tree(profiles_dir) - snapshot = load_snapshot(snapshot_path) - if snapshot is None: - print_error(f"filament_id snapshot not found at {snapshot_path}; {UPDATE_HINT}") - return 1 for msg in analysis["read_errors"]: print_error(msg) errors += 1 - snap_ids = snapshot["ids"] - tree_ids = analysis["ids"] - # -- 1. format ---------------------------------------------------------- for vendor in sorted(analysis["vendor_ids"]): for fid in sorted(analysis["vendor_ids"][vendor]): @@ -671,47 +600,7 @@ def check_filament_ids(profiles_dir=PROFILES_DIR, snapshot_path=SNAPSHOT_PATH, f'filament ids must come from "{GENERATE_CMD}"') errors += 1 - # -- 2. snapshot equality (both directions) ----------------------------- - tree_triples = analysis["triples"] - for fid in sorted(tree_ids): - entry = snap_ids.get(fid) - if entry is None: - print_error( - f'filament_id "{fid}" is not sanctioned by ' - f"scripts/filament_id_snapshot.json; {UPDATE_HINT}") - errors += 1 - continue - for claim in tree_ids[fid]: - if claim not in entry["filaments"]: - print_error( - f'filament_id "{fid}" claim "{claim}" is not sanctioned by ' - f"scripts/filament_id_snapshot.json; {UPDATE_HINT}") - errors += 1 - # Every tree id has at least one declarer; the snapshot records one - # triple per id, so a divergent declarer is a mismatch in both directions. - sanctioned = snapshot_triple(entry) - for t in tree_triples[fid]: - if t != sanctioned: - print_error( - f'filament_id "{fid}" triple "{"/".join(t)}" is not sanctioned by ' - f'scripts/filament_id_snapshot.json, which records ' - f'"{"/".join(sanctioned)}"; {UPDATE_HINT}') - errors += 1 - for fid in sorted(snap_ids): - if fid not in tree_ids: - print_error( - f'filament_id stability: snapshot id "{fid}" vanished from the tree; ' - f"{UPDATE_HINT}") - errors += 1 - continue - for claim in snap_ids[fid]["filaments"]: - if claim not in tree_ids[fid]: - print_error( - f'filament_id stability: snapshot claim "{claim}" of id "{fid}" ' - f"vanished from the tree; {UPDATE_HINT}") - errors += 1 - - # -- 3. identity: the id is a function of the triple alone --------------- + # -- 2. identity: the id is a function of the triple alone --------------- # One triple, one id: a declaration must carry exactly the mint of its # triple, and there is no second acceptable value — not a salt, not a # hand-picked one, not whatever another preset of the product carries. Two @@ -727,10 +616,9 @@ def check_filament_ids(profiles_dir=PROFILES_DIR, snapshot_path=SNAPSHOT_PATH, f'filament_id "{fid}" declared by "{rec["name"]}" ({rec["file"]}) does ' f'not match the mint of its triple "{"/".join(triple)}": expected ' f'"{want}"; paste the expected id, or fix the triple and run ' - f'"{GENERATE_CMD} --vendor {vendor}" (preview with --dry-run), then ' - f"--update-snapshot") + f'"{GENERATE_CMD} --vendor {vendor}" (preview with --dry-run)') errors += 1 - # (3b) An inherited id is held to the same single value, and every preset + # (2b) An inherited id is held to the same single value, and every preset # missing it is listed — a variant under a wrong root as much as a preset # riding another product's root. Nothing is folded into the declarer's # error: the report names each preset whose id is wrong. @@ -755,7 +643,7 @@ def check_filament_ids(profiles_dir=PROFILES_DIR, snapshot_path=SNAPSHOT_PATH, f'run "{GENERATE_CMD}" (expected id for filament ' f'"{vendor}/{base_name(name)}": "{expected}")') errors += 1 - # (3d) The mint is injective over the tree's products, or two of them are + # (2d) The mint is injective over the tree's products, or two of them are # indistinguishable to every device that matches on the id. for fid, ts in sorted(analysis["collisions"].items()): print_error( @@ -764,7 +652,7 @@ def check_filament_ids(profiles_dir=PROFILES_DIR, snapshot_path=SNAPSHOT_PATH, f"of them so their triples differ") errors += 1 - # -- 4. triple integrity --------------------------------------------------- + # -- 3. triple integrity --------------------------------------------------- for vendor, rec, fid, triple in sorted( analysis["declarer_triples"], key=lambda x: (x[0], x[1]["file"])): if triple[0] and triple[1]: @@ -797,7 +685,7 @@ def check_filament_ids(profiles_dir=PROFILES_DIR, snapshot_path=SNAPSHOT_PATH, f"({detail}); bundles of one product converge on one id only once " f"their triples agree") - # -- 6. Bambu catalog map -------------------------------------------------- + # -- 4. Bambu catalog map -------------------------------------------------- try: bambu_map = load_json(map_path) if not isinstance(bambu_map, dict): @@ -838,7 +726,7 @@ def check_filament_ids(profiles_dir=PROFILES_DIR, snapshot_path=SNAPSHOT_PATH, errors += 1 else: bambu_id_owners[bambu_id] = fid - claimed = tree_triples.get(fid) + claimed = analysis["triples"].get(fid) if not claimed: continue # a product BambuStudio ships that the tree does not (yet) row_triple = [row.get("vendor", ""), row.get("type", ""), row.get("name", "")] @@ -1404,7 +1292,7 @@ def check_normalized(profiles_dir, vendor): # check # --------------------------------------------------------------------------- -def check_profiles(profiles_dir=PROFILES_DIR, vendors=None, snapshot_path=SNAPSHOT_PATH): +def check_profiles(profiles_dir=PROFILES_DIR, vendors=None): """Validate the whole profile tree. Returns the error count. The per-vendor checks honour `vendors`; the setting_id and filament_id checks are @@ -1468,7 +1356,7 @@ def check_profiles(profiles_dir=PROFILES_DIR, vendors=None, snapshot_path=SNAPSH # Cross-vendor checks: setting_id uniqueness and the whole filament_id state, # both validated over the entire tree regardless of --vendor. errors_found += check_setting_id_uniqueness(profiles_dir) - errors_found += check_filament_ids(profiles_dir, snapshot_path) + errors_found += check_filament_ids(profiles_dir) print("\n==================== SUMMARY ====================") print_info(f"Checked vendors : {len(checked)}") @@ -1486,69 +1374,6 @@ def check_profiles(profiles_dir=PROFILES_DIR, vendors=None, snapshot_path=SNAPSH return errors_found -# --------------------------------------------------------------------------- -# update-snapshot -# --------------------------------------------------------------------------- - -def update_snapshot(profiles_dir=PROFILES_DIR, snapshot_path=SNAPSHOT_PATH, dry_run=False): - """Regenerate the snapshot from the tree. - - Refuses to sanction a tree it could not read whole, and an id declared under - more than one triple: neither state can be recorded truthfully, so writing it - would only hide the mistake until CI. It does not judge the ids themselves — - the snapshot records state and check judges it, so an id that is not a mint - lands in the diff and fails check 1. - Idempotent: a second run over an unchanged tree changes nothing. Returns 0 - on success. - """ - analysis = analyze_tree(profiles_dir) - # A tree that could not be read whole cannot be sanctioned: the snapshot - # would silently drop the unreadable bundle's ids and claims, and the diff - # would read as a deliberate removal. - refusals = len(analysis["read_errors"]) - for msg in analysis["read_errors"]: - print_error(msg) - - for fid, ts in sorted(analysis["triples"].items()): - if len(ts) > 1: - print_error( - f'refusing to sanction filament_id "{fid}": declared under {len(ts)} ' - f'triples ({"; ".join("/".join(t) for t in ts)}); one id names one ' - f"product (check 3)") - refusals += 1 - if refusals: - return 1 - - new_snap = snapshot_from_analysis(analysis) - old_snap = load_snapshot(snapshot_path) - old_ids = old_snap["ids"] if old_snap else {} - - # Diff summary. - added_ids = sorted(set(new_snap["ids"]) - set(old_ids)) - removed_ids = sorted(set(old_ids) - set(new_snap["ids"])) - added_claims = sum( - len(set(entry["filaments"]) - set(old_ids.get(fid, {}).get("filaments", []))) - for fid, entry in new_snap["ids"].items()) - removed_claims = sum( - len(set(entry["filaments"]) - set(new_snap["ids"].get(fid, {}).get("filaments", []))) - for fid, entry in old_ids.items()) - changed = new_snap != (old_snap or {"ids": {}}) - - if changed and not dry_run: - write_snapshot(snapshot_path, new_snap) - - print_info(f"snapshot ids : {len(new_snap['ids'])} (+{len(added_ids)} / -{len(removed_ids)})") - print_info(f"claims added : {added_claims}") - print_info(f"claims removed : {removed_claims}") - if changed and dry_run: - print_success(f"dry run: {snapshot_path} would be rewritten; nothing written") - elif changed: - print_success(f"snapshot written to {snapshot_path}") - else: - print_success("snapshot already up to date; nothing changed") - return 0 - - # --------------------------------------------------------------------------- # Byte-preserving profile edits # --------------------------------------------------------------------------- @@ -1692,9 +1517,9 @@ def generate_filament_ids(profiles_dir=PROFILES_DIR, vendors=None, dry_run=False * an instantiated filament that resolves no id at all gets one inserted into its root(s): the id-less presets of the SAME filament its members inherit, or the member itself (a parent of another filament cannot carry - this filament's id — check 3). + this filament's id — check 2). A declaration is left alone exactly when it already equals the one id its - triple mints (check 3). Two products minting one id (check 3d) are reported + triple mints (check 2). Two products minting one id (check 2d) are reported and left unwritten: nothing salts past a collision, a rename resolves it. `vendors` restricts what is WRITTEN; the id is a function of the triple @@ -1702,9 +1527,7 @@ def generate_filament_ids(profiles_dir=PROFILES_DIR, vendors=None, dry_run=False reports whatever it was not allowed to touch. `changed_paths`, when a set is passed, collects the files that changed. A file whose layout offers no anchor for the edit is reported and counted as an error, so one odd profile - cannot abort the pass over all the others. Never reads or touches the - snapshot — run --update-snapshot afterwards and review the diff. Returns - (files_changed, errors). + cannot abort the pass over all the others. Returns (files_changed, errors). """ _utf8_console() analysis = analyze_tree(profiles_dir) @@ -1959,9 +1782,9 @@ def run_generate_id(profiles_dir, vendors, filament_id, setting_id, dry_run): do_filament = filament_id or not setting_id do_setting = setting_id or not filament_id changed = set() # one file the two passes both touch is still one file - filament_files = errors = 0 + errors = 0 if do_filament: - filament_files, e = generate_filament_ids(profiles_dir, vendors, dry_run, changed) + _n, e = generate_filament_ids(profiles_dir, vendors, dry_run, changed) errors += e if do_setting: _n, e = generate_setting_ids(profiles_dir, vendors, dry_run, changed) @@ -1973,11 +1796,6 @@ def run_generate_id(profiles_dir, vendors, filament_id, setting_id, dry_run): print_error(f"{summary}; {errors} error(s)") else: print_success(summary) - if filament_files and not dry_run: - # A filament_id write may or may not move the sanctioned state (an id repaired - # back to the value the snapshot already records does not), so regenerate and - # let the diff - empty or not - say. - print_warning(f"now {UPDATE_HINT}") return 1 if errors else 0 @@ -2439,13 +2257,11 @@ examples: preview exactly that; writes nothing orca_profile_tool.py generate-id --setting-id --vendor Elegoo setting_id only, and only in that bundle - orca_profile_tool.py update-snapshot - re-record the sanctioned filament_id state after a generate-id run after adding, renaming or deleting profile files, run in this order: - normalize -> update-index -> generate-id -> update-snapshot -> check + normalize -> update-index -> generate-id -> check normalize supplies missing types; update-index registers presets before id -generation. update-snapshot is needed when filament ids or claims change. +generation. Use trim only for deliberate cleanup, previewed with --dry-run: it judges against the current index and can delete newly added, unindexed presets. """ @@ -2473,12 +2289,6 @@ def build_parser(): dry_run_opt.add_argument("--dry-run", "--dryrun", dest="dry_run", action="store_true", help="report what would change and write nothing") - snapshot_opt = argparse.ArgumentParser(add_help=False) - snapshot_opt.add_argument("--snapshot", default=None, metavar="PATH", - help="the sanctioned filament_id state of that tree " - "(default: scripts/filament_id_snapshot.json, which " - "describes resources/profiles and no other tree)") - parser = argparse.ArgumentParser( prog="orca_profile_tool.py", allow_abbrev=False, formatter_class=argparse.RawDescriptionHelpFormatter, @@ -2496,7 +2306,7 @@ def build_parser(): allow_abbrev=False, formatter_class=argparse.RawDescriptionHelpFormatter) add( - "check", [vendor_opt, snapshot_opt, profiles_opt], + "check", [vendor_opt, profiles_opt], "validate the whole profile tree -- what CI runs", "Validate the whole profile tree: preset name uniqueness, index coverage\n" "both ways, compatible_printers, default-material references, obsolete,\n" @@ -2560,11 +2370,6 @@ def build_parser(): "Use trim only for deliberate unindexed-file cleanup, previewed with\n" "--dry-run; it can also delete newly authored presets.") - add("update-snapshot", [dry_run_opt, snapshot_opt, profiles_opt], - "re-record scripts/filament_id_snapshot.json", - "Re-record the sanctioned filament_id state after a generate-id run, and\n" - "commit the diff for maintainer review.") - return parser @@ -2590,29 +2395,14 @@ def main(argv=None): return 1 profile_types = tuple(getattr(args, "profile_type", []) or ()) or None - snapshot_path = getattr(args, "snapshot", None) - if snapshot_path is None: - if (args.command in ("check", "update-snapshot") - and os.path.abspath(profiles_dir) != os.path.abspath(PROFILES_DIR)): - # The repo snapshot is the sanctioned state of resources/profiles alone: - # checking another tree against it is meaningless, and re-recording one - # into it would overwrite the tracked file with a foreign tree's state. - parser.error(f"{args.command} reads and writes the sanctioned state of the " - f"tree it is given, so --profiles needs --snapshot PATH for " - f"that tree too") - snapshot_path = SNAPSHOT_PATH - if args.command == "check": - errors = check_profiles(profiles_dir, vendors, snapshot_path) + errors = check_profiles(profiles_dir, vendors) return 1 if errors else 0 if args.command == "generate-id": return run_generate_id(profiles_dir, vendors, args.filament_id, args.setting_id, args.dry_run) - if args.command == "update-snapshot": - return update_snapshot(profiles_dir, snapshot_path, dry_run=args.dry_run) - if args.command == "normalize": _changed, errors = normalize_profiles(profiles_dir, vendors, profile_types, force=args.force, dry_run=args.dry_run) diff --git a/scripts/tests/test_filament_id.py b/scripts/tests/test_filament_id.py index 548dd9c777..001763fca9 100644 --- a/scripts/tests/test_filament_id.py +++ b/scripts/tests/test_filament_id.py @@ -55,13 +55,12 @@ def preset(name, filament_id=None, inherits=None, instantiation=True, class SyntheticTree: - """A throwaway resources/profiles-shaped directory plus a snapshot path.""" + """A throwaway resources/profiles-shaped directory.""" def __init__(self): self.dir = tempfile.mkdtemp(prefix="filament_id_test_") self.profiles = os.path.join(self.dir, "profiles") os.makedirs(self.profiles) - self.snapshot = os.path.join(self.dir, "filament_id_snapshot.json") def cleanup(self): shutil.rmtree(self.dir, ignore_errors=True) @@ -110,16 +109,6 @@ class SyntheticTree: with open(idx_path, "w", encoding="utf-8") as f: json.dump(index, f, indent=4, ensure_ascii=False) - def remove_preset(self, vendor, name): - os.remove(self.preset_path(vendor, name)) - idx_path = os.path.join(self.profiles, vendor + ".json") - with open(idx_path, encoding="utf-8") as f: - index = json.load(f) - index["filament_list"] = [ - e for e in index["filament_list"] if e["name"] != name] - with open(idx_path, "w", encoding="utf-8") as f: - json.dump(index, f, indent=4, ensure_ascii=False) - def bytes_map(self): """{relative path -> file bytes} over every .json in the tree.""" raw = {} @@ -135,17 +124,11 @@ class SyntheticTree: # -- pipeline wrappers --------------------------------------------------- - def update_snapshot(self, dry_run=False): - buf = io.StringIO() - with contextlib.redirect_stdout(buf): - rc = afi.update_snapshot(self.profiles, self.snapshot, dry_run) - return rc, buf.getvalue() - def check(self, map_path=None): buf = io.StringIO() kwargs = {} if map_path is None else {"map_path": map_path} with contextlib.redirect_stdout(buf): - errors = afi.check_filament_ids(self.profiles, self.snapshot, **kwargs) + errors = afi.check_filament_ids(self.profiles, **kwargs) return errors, buf.getvalue() # assign() and remint() are the same one pass over the tree — every filament @@ -167,8 +150,6 @@ class SyntheticTree: def cli(self, *argv): """Run main() against this tree, capturing stdout.""" flags = [*argv, "--profiles", self.profiles] - if argv and argv[0] in ("check", "update-snapshot"): - flags += ["--snapshot", self.snapshot] buf = io.StringIO() with contextlib.redirect_stdout(buf): rc = afi.main(flags) @@ -178,10 +159,10 @@ class SyntheticTree: def make_clean_tree(apla_id="AX01", generic_id="OGFL99"): """Baseline tree: OFL base+generic, a vendor filament, a clean tuned generic. - apla_id/generic_id default to arbitrary non-OF placeholders (sanctioned by - the snapshot below) since most tests only need "already assigned, don't - touch" and never run the checks. TestAssign and the check tests pass real - OF-format ids instead (OfCleanTreeCase). + apla_id/generic_id default to arbitrary non-OF placeholders since most tests + only need "already assigned, don't touch" and never run the checks. + TestAssign and the check tests pass real OF-format ids instead + (OfCleanTreeCase). """ t = SyntheticTree() t.add_vendor(OFL, [ @@ -199,8 +180,6 @@ def make_clean_tree(apla_id="AX01", generic_id="OGFL99"): preset("Generic PLA @P1", inherits="Generic PLA @System", compatible_printers=["P1 0.4 nozzle"]), ]) - rc, _out = t.update_snapshot() - assert rc == 0 return t @@ -212,10 +191,9 @@ class SyntheticTreeCase(unittest.TestCase): class OfCleanTreeCase(unittest.TestCase): """Like SyntheticTreeCase, but the baseline filament/generic already carry - real OF-format ids (check 1 now rejects "AX01"/"OGFL99" unconditionally, - with no snapshot exemption), so an otherwise-untouched tree still passes - check_filament_ids. Tests that specifically need a non-OF baseline to - remint (TestRemint, TestUpdateSnapshot) keep using SyntheticTreeCase + real OF-format ids (check 1 rejects "AX01"/"OGFL99"), so an + otherwise-untouched tree passes check_filament_ids. Tests that specifically + need a non-OF baseline to remint (TestRemint) keep using SyntheticTreeCase instead. """ def setUp(self): @@ -231,7 +209,7 @@ class OfCleanTreeCase(unittest.TestCase): class TestMint(unittest.TestCase): def test_namespace_literal(self): - # Frozen: derived from the setting_id namespace; baked into the snapshot. + # Frozen: derived from the setting_id namespace; baked into every shipped id. self.assertEqual(afi.FILAMENT_ID_NAMESPACE, uuid.UUID("c4d3ff49-4c32-5534-a3e3-00894157ab97")) @@ -450,22 +428,10 @@ class TestChecks(OfCleanTreeCase): self.assertIn('is not a minted "OF" id', out) self.assertIn("BOGUS_9", out) - def test_check2_new_claim_needs_snapshot_update(self): - self.t.write_preset("VendorA", preset("ANEW @P2", inherits="APLA @base", - compatible_printers=["P2"])) - errors, out = self.t.check() - self.assertGreater(errors, 0) - self.assertIn('claim "VendorA/ANEW" is not sanctioned', out) - self.assertIn("update-snapshot", out) - - def test_check2_vanished_claim_is_stability_error(self): - self.t.remove_preset("VendorA", "APLA @P1") - errors, out = self.t.check() - self.assertGreater(errors, 0) - self.assertIn("stability", out) - self.assertIn('"VendorA/APLA"', out) - - def test_check2_triple_change_needs_snapshot_update(self): + def test_check2_triple_change_needs_a_remint(self): + # Correcting a triple changes the product's identity: the old id is no + # longer its mint, reported on the root and again under the variant + # inheriting it, until generate-id re-mints it. apla_id = afi.generate_filament_id("AVendor", "PLA", "APLA") self.t.write_preset("VendorA", preset("APLA @base", filament_id=apla_id, instantiation=False, @@ -473,26 +439,15 @@ class TestChecks(OfCleanTreeCase): filament_type="PETG"), register=False) errors, out = self.t.check() - self.assertGreater(errors, 0) - self.assertIn('triple "AVendor/PETG/APLA" is not sanctioned', out) - self.assertIn('which records "AVendor/PLA/APLA"', out) - # Sanctioning the new triple is not enough: the old id is no longer its - # mint (check 3, nothing grandfathered) — the identity fix is a re-mint, - # reported on the root and again under the variant inheriting it. - rc, _out = self.t.update_snapshot() - self.assertEqual(rc, 0) - errors, out = self.t.check() self.assertEqual(errors, 2, out) self.assertIn("does not match the mint of its triple", out) self.assertIn('"APLA @P1" (VendorA/filament/APLA @P1.json) inherits filament_id', out) _changed, errors, out = self.t.remint(["VendorA"]) self.assertEqual(errors, 0, out) - rc, _out = self.t.update_snapshot() - self.assertEqual(rc, 0) errors, out = self.t.check() self.assertEqual(errors, 0, out) - def test_check3_of_id_must_match_triple_mint(self): + def test_check2_of_id_must_match_triple_mint(self): self.t.write_preset("VendorA", preset("BNEW @base", filament_id="OFZZZZZZ", instantiation=False, filament_vendor="BV", filament_type="PLA")) @@ -503,39 +458,20 @@ class TestChecks(OfCleanTreeCase): self.assertIn("does not match the mint of its triple", out) self.assertIn(afi.generate_filament_id("BV", "PLA", "BNEW"), out) - def test_check3_no_grandfathering_of_a_wrong_declaration(self): - # Sanctioning the tree does not excuse a declaration from its mint. - self.t.write_preset("VendorA", preset("CNEW @base", filament_id="OFZZZZZZ", - instantiation=False, - filament_vendor="CV", filament_type="PLA")) - self.t.write_preset("VendorA", preset("CNEW @P1", inherits="CNEW @base", - compatible_printers=["P1"])) - rc, _out = self.t.update_snapshot() - self.assertEqual(rc, 0) - errors, out = self.t.check() - self.assertEqual(errors, 2, out) # the declaration, and the variant inheriting it - self.assertIn("does not match the mint of its triple", out) - self.assertIn('"CNEW @P1" (VendorA/filament/CNEW @P1.json) inherits filament_id', out) - - def test_check3_inherited_id_must_be_the_mint_of_own_triple(self): + def test_check2_inherited_id_must_be_the_mint_of_own_triple(self): # A preset of another filament inheriting APLA's root takes APLA's id, # which is not the mint of ITS triple (AVendor/PLA/Tuned PLA). self.t.write_preset("VendorA", preset("Tuned PLA @P1", inherits="APLA @base", compatible_printers=["P1"])) errors, out = self.t.check() - self.assertGreater(errors, 0) + self.assertEqual(errors, 1, out) self.assertIn('"Tuned PLA @P1" (VendorA/filament/Tuned PLA @P1.json) inherits ' 'filament_id "%s"' % afi.generate_filament_id("AVendor", "PLA", "APLA"), out) self.assertIn('mints "%s"' % afi.generate_filament_id("AVendor", "PLA", "Tuned PLA"), out) - # ... and sanctioning the tree does not excuse it either. - rc, _out = self.t.update_snapshot() - self.assertEqual(rc, 0) - errors, out = self.t.check() - self.assertEqual(errors, 1, out) - def test_check3_lists_every_preset_inheriting_a_wrong_id(self): + def test_check2_lists_every_preset_inheriting_a_wrong_id(self): # A wrong declaration is reported under every preset inheriting it, its # own product's variant and another product alike: each one's effective # id is not the mint of its own triple, and each is listed. Nothing is @@ -552,11 +488,10 @@ class TestChecks(OfCleanTreeCase): self.assertIn('"DNEW @P1" (VendorA/filament/DNEW @P1.json) inherits filament_id', out) self.assertIn('"Other DNEW @P1" (VendorA/filament/Other DNEW @P1.json) inherits ' 'filament_id', out) - # The unsanctioned id (check 2), the declaration (3a), and both presets - # inheriting it (3b). - self.assertEqual(errors, 4, out) + # The declaration (2a), and both presets inheriting it (2b). + self.assertEqual(errors, 3, out) - def test_check3_reports_an_inherited_mismatch_even_when_its_own_product_misdeclares_the_id(self): + def test_check2_reports_an_inherited_mismatch_even_when_its_own_product_misdeclares_the_id(self): # "Tuned PLA @P1" inherits APLA's root, so it carries APLA's id: wrong # for its own product however the declarations around it are fixed. # That "Tuned PLA @base" — its own product — misdeclares that same id @@ -573,11 +508,11 @@ class TestChecks(OfCleanTreeCase): 'not match the mint of its triple', out) self.assertIn('"Tuned PLA @P1" (VendorA/filament/Tuned PLA @P1.json) inherits ' 'filament_id', out) - # The unsanctioned claim and triple (check 2), the declaration (3a) and - # the inherited id (3b): four distinct errors, nothing folded away. - self.assertEqual(errors, 4, out) + # The declaration (2a) and the inherited id (2b): two distinct errors, + # nothing folded away. + self.assertEqual(errors, 2, out) - def test_check3_reports_a_collision_between_two_products(self): + def test_check2_reports_a_collision_between_two_products(self): # Two products whose triples mint one id is a base62 collision. There # is no salted or hand-picked second id to fall back on: the check # names both products, and the remedy is a rename so the triples differ. @@ -601,13 +536,12 @@ class TestChecks(OfCleanTreeCase): self.assertIn("V/PLA/X", out) self.assertIn("W/ABS/Y", out) # Each declaration is the mint of its own triple, so the collision is - # the only identity error — no product is pushed off its id — and the - # unsanctioned id (check 2) is the only other one. + # the only error — no product is pushed off its id. self.assertNotIn("does not match the mint", out) self.assertNotIn("inherits filament_id", out) - self.assertEqual(errors, 2, out) + self.assertEqual(errors, 1, out) - def test_check3_renamed_tuned_generic_is_an_identity_error(self): + def test_check2_renamed_tuned_generic_is_an_identity_error(self): # Riding the OFL generic under another base name: same rule, same error. self.t.write_preset("VendorA", preset("Tuned PLA @P1", inherits="Generic PLA @System", @@ -617,7 +551,7 @@ class TestChecks(OfCleanTreeCase): self.assertIn("Tuned PLA @P1", out) self.assertIn("inherits filament_id", out) - def test_check3_own_key_on_an_instantiated_preset_is_fine(self): + def test_check2_own_key_on_an_instantiated_preset_is_fine(self): # Where the id comes from is irrelevant: a variant may carry the key. apla_id = afi.generate_filament_id("AVendor", "PLA", "APLA") self.t.write_preset("VendorA", preset("APLA @P1", filament_id=apla_id, @@ -627,7 +561,7 @@ class TestChecks(OfCleanTreeCase): errors, out = self.t.check() self.assertEqual(errors, 0, out) - def test_check3_inheriting_a_real_filament_of_another_product_is_fine(self): + def test_check2_inheriting_a_real_filament_of_another_product_is_fine(self): # A branded product may inherit the OFL generic (an instantiated # preset) for its settings; it declares its own triple's id. fid = afi.generate_filament_id("BV", "PLA", "Branded PLA") @@ -635,8 +569,6 @@ class TestChecks(OfCleanTreeCase): inherits="Generic PLA @System", filament_vendor="BV", compatible_printers=["P1"])) - rc, _out = self.t.update_snapshot() - self.assertEqual(rc, 0) errors, out = self.t.check() self.assertEqual(errors, 0, out) # With a wrong key it is a plain mint mismatch: the parent plays no @@ -670,22 +602,16 @@ class TestChecks(OfCleanTreeCase): self.assertIn(f'filament_id "{fid}"', out) self.assertIn('is not a minted "OF" id', out) - def test_check3c_unresolvable_instantiated_filament(self): + def test_check2c_unresolvable_instantiated_filament(self): self.t.write_preset("VendorA", preset("DNEW @P1", compatible_printers=["P1"])) errors, out = self.t.check() self.assertGreater(errors, 0) self.assertIn("resolves no filament_id", out) self.assertIn("hard load error", out) - def test_missing_snapshot_is_an_error(self): - os.remove(self.t.snapshot) - errors, out = self.t.check() - self.assertEqual(errors, 1) - self.assertIn("snapshot not found", out) - -class TestCheck5(OfCleanTreeCase): - def test_5a_empty_vendor_is_hard_error(self): +class TestCheck3(OfCleanTreeCase): + def test_3a_empty_vendor_is_hard_error(self): fid = afi.generate_filament_id("", "PLA", "NVPLA") self.t.write_preset("VendorA", preset("NVPLA @base", filament_id=fid, instantiation=False, @@ -693,17 +619,11 @@ class TestCheck5(OfCleanTreeCase): self.t.write_preset("VendorA", preset("NVPLA @P1", inherits="NVPLA @base", compatible_printers=["P1"])) errors, out = self.t.check() - self.assertGreater(errors, 0) - self.assertIn("resolves empty filament_vendor", out) - self.assertIn('filament_vendor "Generic"', out) - # No grandfathering: sanctioning the tree does not silence check 4a. - rc, _out = self.t.update_snapshot() - self.assertEqual(rc, 0) - errors, out = self.t.check() self.assertEqual(errors, 1, out) self.assertIn("resolves empty filament_vendor", out) + self.assertIn('filament_vendor "Generic"', out) - def test_5b_divergent_filament_triples(self): + def test_3b_divergent_filament_triples(self): id1 = afi.generate_filament_id("MV", "PLA", "MPLA") id2 = afi.generate_filament_id("MV", "PETG", "MPLA") self.t.write_preset("VendorA", preset("MPLA @base1", filament_id=id1, @@ -715,18 +635,12 @@ class TestCheck5(OfCleanTreeCase): filament_vendor="MV", filament_type="PETG")) errors, out = self.t.check() - self.assertGreater(errors, 0) + self.assertEqual(errors, 1, out) self.assertIn("divergent triples", out) self.assertIn("MV/PLA/MPLA", out) self.assertIn("MV/PETG/MPLA", out) - # No grandfathering: sanctioning the tree does not silence check 4b. - rc, _out = self.t.update_snapshot() - self.assertEqual(rc, 0) - errors, out = self.t.check() - self.assertEqual(errors, 1, out) - self.assertIn("divergent triples", out) - def test_5_cross_bundle_divergence_is_warning_only(self): + def test_3_cross_bundle_divergence_is_warning_only(self): fid = afi.generate_filament_id("BV", "PETG", "APLA") self.t.add_vendor("VendorB", [ preset("APLA @base", filament_id=fid, instantiation=False, @@ -734,8 +648,6 @@ class TestCheck5(OfCleanTreeCase): preset("APLA @PB", inherits="APLA @base", compatible_printers=["PB 0.4 nozzle"]), ]) - rc, _out = self.t.update_snapshot() - self.assertEqual(rc, 0) errors, out = self.t.check() self.assertEqual(errors, 0, out) self.assertIn("[WARNING]", out) @@ -743,7 +655,7 @@ class TestCheck5(OfCleanTreeCase): self.assertIn('"APLA"', out) -class TestCheck6(OfCleanTreeCase): +class TestCheck4(OfCleanTreeCase): def _write_map(self, rows): path = os.path.join(self.t.dir, "bambu_filament_ids.json") ubfi.write_map(path, rows, "testcommit", "2026-09-04") @@ -845,104 +757,6 @@ class TestCheck6(OfCleanTreeCase): self.assertIn('declares no "bambu_id"', out) -# --------------------------------------------------------------------------- -# --update-snapshot -# --------------------------------------------------------------------------- - -class TestUpdateSnapshot(SyntheticTreeCase): - def test_idempotent_and_deterministic(self): - with open(self.t.snapshot, "rb") as f: - first = f.read() - rc, out = self.t.update_snapshot() - self.assertEqual(rc, 0) - self.assertIn("nothing changed", out) - with open(self.t.snapshot, "rb") as f: - self.assertEqual(f.read(), first) - self.assertTrue(first.endswith(b"\n")) - self.assertNotIn(b"\r", first) - snap = json.loads(first.decode("utf-8")) - self.assertEqual(list(snap), ["ids"]) # state only, no exception lists - self.assertEqual(list(snap["ids"]), sorted(snap["ids"])) - self.assertEqual(snap["ids"]["AX01"], { - "filaments": ["VendorA/APLA"], "name": "APLA", - "filament_type": "PLA", "filament_vendor": "AVendor"}) - self.assertEqual(snap["ids"]["OGFL99"], { - "filaments": ["OrcaFilamentLibrary/Generic PLA", "VendorA/Generic PLA"], - "name": "Generic PLA", "filament_type": "PLA", "filament_vendor": "Generic"}) - # Key order is part of the on-disk format. - self.assertEqual(list(snap["ids"]["AX01"]), - ["filaments", "name", "filament_type", "filament_vendor"]) - - def test_refuses_a_tree_it_could_not_read(self): - # A bundle that does not parse contributes no ids, so sanctioning the - # rest would record the loss as a deliberate removal. - with open(self.t.snapshot, "rb") as f: - before = f.read() - with open(os.path.join(self.t.profiles, "VendorA", - "filament", "APLA @base.json"), "w", - encoding="utf-8") as f: - f.write("{ not json") - rc, out = self.t.update_snapshot() - self.assertEqual(rc, 1, out) - self.assertIn("unreadable filament profile", out) - with open(self.t.snapshot, "rb") as f: - self.assertEqual(f.read(), before) - - def test_refuses_an_id_declared_under_two_triples(self): - # VendorB re-declares APLA's id for a different product: one id, two - # triples. No single entry can describe it, and check 3 rejects it anyway. - self.t.add_vendor("VendorB", [ - preset("BPLA @base", filament_id="AX01", instantiation=False, - filament_vendor="BVendor", filament_type="PLA"), - preset("BPLA @P1", inherits="BPLA @base", compatible_printers=["P1"]), - ]) - with open(self.t.snapshot, "rb") as f: - before = f.read() - rc, out = self.t.update_snapshot() - self.assertEqual(rc, 1) - self.assertIn('refusing to sanction filament_id "AX01": declared under 2 triples ' - '(AVendor/PLA/APLA; BVendor/PLA/BPLA)', out) - with open(self.t.snapshot, "rb") as f: - self.assertEqual(f.read(), before) # nothing written on refusal - - def test_records_an_id_it_cannot_defend_and_lets_check_reject_it(self): - # update-snapshot records state, it does not judge ids: a foreign id - # lands in the diff a maintainer reviews, and fails check 1 straight - # after. Sanctioning it does not grandfather it. - self.t.write_preset("VendorA", preset("CNEW @base", filament_id="GFX99", - instantiation=False, - filament_vendor="CV", - filament_type="PLA")) - self.t.write_preset("VendorA", preset("CNEW @P1", inherits="CNEW @base", - compatible_printers=["P1"])) - rc, out = self.t.update_snapshot() - self.assertEqual(rc, 0, out) - with open(self.t.snapshot, encoding="utf-8") as f: - self.assertIn("GFX99", json.load(f)["ids"]) - errors, out = self.t.check() - self.assertGreater(errors, 0) - self.assertIn('is not a minted "OF" id', out) - - def test_dry_run_reports_without_writing(self): - self.t.write_preset("VendorA", preset("ANEW @P2", inherits="APLA @base", - compatible_printers=["P2"])) - with open(self.t.snapshot, "rb") as f: - before = f.read() - rc, out = self.t.update_snapshot(dry_run=True) - self.assertEqual(rc, 0) - self.assertIn("would be rewritten", out) - self.assertIn("claims added : 1", out) - with open(self.t.snapshot, "rb") as f: - self.assertEqual(f.read(), before) - # the real run writes exactly what the dry run reported - rc, out = self.t.update_snapshot() - self.assertEqual(rc, 0) - self.assertIn("snapshot written", out) - snap = load_json_file(self.t.snapshot) - self.assertEqual(snap["ids"]["AX01"]["filaments"], - ["VendorA/ANEW", "VendorA/APLA"]) - - # --------------------------------------------------------------------------- # --generate: one rule for inserts and rewrites alike # --------------------------------------------------------------------------- @@ -1026,7 +840,7 @@ class TestAssign(OfCleanTreeCase): def test_parent_of_another_filament_never_receives_the_key(self): # Members whose id-less parent belongs to another filament (here one # parent shared by two filaments) carry the key themselves: the - # parent's own triple would mint a different id (check 3). + # parent's own triple would mint a different id (check 2). self.t.write_preset("VendorA", preset("shared_base", instantiation=False, filament_vendor="SV", filament_type="PLA")) @@ -1044,8 +858,6 @@ class TestAssign(OfCleanTreeCase): parent = load_json_file(self.t.preset_path("VendorA", "shared_base")) self.assertNotIn("filament_id", parent) # ... and the tree they leave behind passes the identity check. - rc, _out = self.t.update_snapshot() - self.assertEqual(rc, 0) errors, out = self.t.check() self.assertEqual(errors, 0, out) @@ -1538,33 +1350,10 @@ class TestCli(unittest.TestCase): rc = afi.main([]) self.assertEqual(rc, 0) self.assertIn("usage:", buf.getvalue()) - for command in ("check", "generate-id", "normalize", "trim", "update-index", - "update-snapshot"): + for command in ("check", "generate-id", "normalize", "trim", "update-index"): self.assertIn(command, buf.getvalue()) self.assertEqual(self.t.bytes_map(), before) - def test_another_tree_needs_its_own_snapshot(self): - # --profiles retargets the tree, but the sanctioned state of that tree - # is not the repo snapshot: checking against it is meaningless and - # re-recording into it would overwrite the tracked file. - with open(afi.SNAPSHOT_PATH, "rb") as f: - repo_snapshot = f.read() - for command in ("check", "update-snapshot"): - with self.assertRaises(SystemExit) as caught: - with contextlib.redirect_stderr(io.StringIO()): - afi.main([command, "--profiles", self.t.profiles]) - self.assertEqual(caught.exception.code, 2, command) - with open(afi.SNAPSHOT_PATH, "rb") as f: - self.assertEqual(f.read(), repo_snapshot) - # Named explicitly, both commands run against that tree. - rc, out = self.t.cli("update-snapshot") - self.assertEqual(rc, 0, out) - # generate-id never reads the snapshot, so it keeps working without one. - buf = io.StringIO() - with contextlib.redirect_stdout(buf): - rc = afi.main(["generate-id", "--dry-run", "--profiles", self.t.profiles]) - self.assertEqual(rc, 0, buf.getvalue()) - def test_filament_id_and_setting_id_together_are_rejected(self): # Each flag's help promises it skips the other kind, so the pair cannot # quietly mean "both". @@ -1667,8 +1456,8 @@ class TestCli(unittest.TestCase): "setting_id", load_json_file(self.t.preset_path("VendorA", name))) def test_check_returns_1_on_errors(self): - # What CI keys off: check exits nonzero when the tree does not match the - # snapshot it is validated against. + # What CI keys off: check exits nonzero when the tree breaks a rule, here + # the baseline's ids that are not minted. before = self.t.bytes_map() rc, out = self.t.cli("check") self.assertEqual(rc, 1) @@ -1695,12 +1484,12 @@ class TestCli(unittest.TestCase): ["--check"], # the pre-subcommand flag ["--update-snapshot"], # the pre-subcommand flag ["nonsense"], # not a command + ["update-snapshot"], # removed command ["generate-id", "--filament-id", "--setting-id"], - ["generate-id", "--snapshot", "x"], # check's option ["check", "--materials"], # removed flag ["check", "--obsolete-keys"], # removed flag + ["check", "--snapshot", "x"], # removed flag ["check", "--filament-id"], # generate-id's option - ["normalize", "--snapshot", "x"], # not a snapshot command ["normalize", "--profile-type", "nozzle"]): # not a profile type with self.subTest(argv=argv): with self.assertRaises(SystemExit) as cm, \ @@ -1716,7 +1505,7 @@ class TestCli(unittest.TestCase): @unittest.skipUnless(os.path.isdir(REAL_PROFILES), "resources/profiles not present") class TestRealTree(unittest.TestCase): - def test_shipped_snapshot_matches_tree(self): + def test_shipped_filament_ids_pass(self): buf = io.StringIO() with contextlib.redirect_stdout(buf): errors = afi.check_filament_ids(REAL_PROFILES) @@ -1778,10 +1567,10 @@ class TestReviewFixes(OfCleanTreeCase): self.assertIn(path, str(caught.exception)) self.assertIn("test edit", str(caught.exception)) - def test_check3_skips_of_id_inherited_from_other_vendor(self): + def test_check2_accepts_an_of_id_inherited_from_another_vendor(self): # An OFL filament carries its own minted OF id and a vendor tunes it - # correctly (same base name, non-empty printers). The new claim must - # trip only the snapshot gate, never mint conformance. + # correctly (same base name, non-empty printers): the id it inherits is + # the mint of its own triple. fid = afi.generate_filament_id("Generic", "PLA", "Generic PLA Matte") self.t.write_preset(OFL, preset("Generic PLA Matte @base", filament_id=fid, instantiation=False, @@ -1790,22 +1579,13 @@ class TestReviewFixes(OfCleanTreeCase): self.t.write_preset(OFL, preset("Generic PLA Matte @System", inherits="Generic PLA Matte @base", compatible_printers=[])) - rc, _ = self.t.update_snapshot() - self.assertEqual(rc, 0) self.t.write_preset("VendorA", preset("Generic PLA Matte @P1", inherits="Generic PLA Matte @System", compatible_printers=["P1 0.4 nozzle"])) errors, out = self.t.check() - self.assertNotIn("does not match the mint", out) - self.assertIn("not sanctioned", out) - self.assertEqual(errors, 1, out) - # After sanctioning the claim the tree is fully green again. - rc, _ = self.t.update_snapshot() - self.assertEqual(rc, 0) - errors, out = self.t.check() self.assertEqual(errors, 0, out) - def test_check3c_prints_expected_mint(self): + def test_check2c_prints_expected_mint(self): self.t.write_preset("VendorA", preset("Orphan PLA @P1", compatible_printers=["P1 0.4 nozzle"], filament_vendor="OV", diff --git a/scripts/tests/test_profile_tool.py b/scripts/tests/test_profile_tool.py index 44b8604625..29b62b693e 100644 --- a/scripts/tests/test_profile_tool.py +++ b/scripts/tests/test_profile_tool.py @@ -527,9 +527,7 @@ class TestCheck(TreeCase): # `check`, now that the per-vendor pass no longer skips it. self.t.write(apt.OFL, "filament/Stray.json", {"type": "filament", "name": "Stray"}) - snapshot = os.path.join(self.t.dir, "snapshot.json") - self.run_command("update-snapshot", "--snapshot", snapshot) - rc, out = self.run_command("check", "--snapshot", snapshot) + rc, out = self.run_command("check") self.assertEqual(rc, 1, out) self.assertIn(f"{apt.OFL}/filament/Stray.json: no {apt.OFL}.json list " f"references it", out) @@ -598,9 +596,7 @@ class TestCheck(TreeCase): self.t.write("V", "filament/A.json", { "type": "filament", "name": "A", "silent_mode": "0"}) self.run_command("update-index") - snapshot = os.path.join(self.t.dir, "snapshot.json") - self.run_command("update-snapshot", "--snapshot", snapshot) - rc, out = self.run_command("check", "--snapshot", snapshot) + rc, out = self.run_command("check") self.assertEqual(rc, 1, out) # normalization also rejects the obsolete key self.assertIn("Obsolete key: 'silent_mode' found in V/filament/A.json", out) self.assertIn("Files with warnings : 1", out) @@ -623,9 +619,7 @@ class TestCheck(TreeCase): "type": "machine", "name": "M 0.4 nozzle", "default_filament_profile": ["A", "Nope"]}) self.t.index("V", "machine", "M 0.4 nozzle", "machine/M.json") - snapshot = os.path.join(self.t.dir, "snapshot.json") - self.run_command("update-snapshot", "--snapshot", snapshot) - rc, out = self.run_command("check", "--snapshot", snapshot) + rc, out = self.run_command("check") self.assertEqual(rc, 1, out) self.assertIn("Missing filament profile: 'Nope'", out) @@ -635,9 +629,7 @@ class TestCheck(TreeCase): self.bundle() for sub in apt.PROFILE_SUBDIRS: os.makedirs(os.path.join(self.t.profiles, apt.USER_DIR, "default", sub)) - snapshot = os.path.join(self.t.dir, "snapshot.json") - self.run_command("update-snapshot", "--snapshot", snapshot) - _rc, out = self.run_command("check", "--snapshot", snapshot) + _rc, out = self.run_command("check") self.assertIn("Checked vendors : 1", out) self.assertNotIn("user", out) @@ -743,9 +735,7 @@ class TestCheck(TreeCase): self.t.write("V", f"filament/Stray{n}.json", {"type": "filament", "name": f"Stray{n}"}) self.t.write("V", "filament/NoType.json", {"name": "NoType"}) - snapshot = os.path.join(self.t.dir, "snapshot.json") - self.run_command("update-snapshot", "--snapshot", snapshot) - rc, out = self.run_command("check", "--snapshot", snapshot) + rc, out = self.run_command("check") self.assertEqual(rc, 1, out) self.assertEqual(out.count("update-index\" to add them"), 1, out) self.assertEqual(out.count("or delete them"), 1, out) @@ -797,11 +787,6 @@ class TestNormalized(TreeCase): errors, gaps = apt.check_normalized(self.t.profiles, vendor) return errors, gaps, buf.getvalue() - def snapshot(self): - path = os.path.join(self.t.dir, "snapshot.json") - self.run_command("update-snapshot", "--snapshot", path) - return path - def test_a_bundle_the_two_commands_just_wrote_reports_nothing(self): self.t.write("V", "filament/A.json", {"type": "filament", "name": "A"}) self.t.write("V", "process/B.json", {"type": "process", "name": "B"}) @@ -862,7 +847,7 @@ class TestNormalized(TreeCase): # library included. self.t.write(apt.OFL, "filament/A.json", {"type": "filament", "name": "A", "version": "01.00.00.00"}) - rc, out = self.run_command("check", "--snapshot", self.snapshot()) + rc, out = self.run_command("check") self.assertEqual(rc, 1, out) self.assertIn(f"{apt.OFL}/filament/A.json: normalize would remove version", out) @@ -872,7 +857,7 @@ class TestNormalized(TreeCase): {"type": "filament", "name": f"A{n}", "version": "01.00.00.00"}) self.t.write("W", "filament/B.json", {"type": "filament", "name": "B"}) - rc, out = self.run_command("check", "--snapshot", self.snapshot()) + rc, out = self.run_command("check") self.assertEqual(rc, 1, out) self.assertIn("3 profile file(s) above are not what", out) self.assertEqual(out.count('normalize" writes: run it and commit'), 1, out) @@ -898,8 +883,7 @@ class TestDispatch(TreeCase): def test_an_option_belongs_to_one_command_only(self): for argv in (["trim", "--force"], ["update-index", "--filament-id"], - ["check", "--profile-type", "filament"], - ["update-snapshot", "--vendor", "V"]): + ["check", "--profile-type", "filament"]): with self.subTest(argv=argv): with self.assertRaises(SystemExit) as cm, \ contextlib.redirect_stdout(io.StringIO()), \