| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- /**
- * Registry of the available slicing engines.
- *
- * "Engine" here means *where slicing runs*, which is a separate axis from the
- * `preferred_slicer` setting (that one only selects which slicer binary the
- * server-side sidecar drives). Keeping them apart avoids having to represent
- * combinations that don't exist — there is no browser build of BambuStudio, so
- * a single dropdown mixing the two would offer choices that cannot work.
- *
- * Today exactly one engine is registered. The registry exists so that adding a
- * browser/WASM engine is a matter of pushing a second entry: the settings card
- * and the slice modal both derive their UI from `availableEngines()`, so a
- * second engine makes the pickers appear without either of them changing.
- *
- * Deliberately *not* shipping a disabled "In browser" option in the meantime.
- * An option a user can see but never pick reads as a broken feature, and there
- * is nothing behind it yet: the WASM engine returns raw G-code, while dispatch
- * needs a `.gcode.3mf` container, so browser slicing cannot reach a printer
- * until that packaging exists.
- */
- export type SliceEngineId = 'sidecar' | 'browser';
- export interface SliceEngine {
- id: SliceEngineId;
- /** i18n key for the human-readable name. */
- labelKey: string;
- /** i18n key for the one-line explanation shown under the picker. */
- descriptionKey: string;
- /**
- * False while an engine is defined but not yet usable. Unavailable engines
- * are never offered; they exist here so the surrounding code can be written
- * against the full set rather than special-cased later.
- */
- available: boolean;
- }
- const ENGINES: SliceEngine[] = [
- {
- id: 'sidecar',
- labelKey: 'settings.sliceEngineSidecar',
- descriptionKey: 'settings.sliceEngineSidecarHint',
- available: true,
- },
- {
- id: 'browser',
- labelKey: 'settings.sliceEngineBrowser',
- descriptionKey: 'settings.sliceEngineBrowserHint',
- available: false,
- },
- ];
- export const DEFAULT_SLICE_ENGINE: SliceEngineId = 'sidecar';
- /** Engines a user can actually pick right now. */
- export function availableEngines(): SliceEngine[] {
- return ENGINES.filter((e) => e.available);
- }
- /** True when there is a real choice to present. */
- export function hasEngineChoice(): boolean {
- return availableEngines().length > 1;
- }
- /**
- * Resolves a stored or per-job engine id to one that can actually run.
- *
- * A setting can outlive the engine it names — an install that had browser
- * slicing enabled and then loaded a build without it must still be able to
- * slice, so an unavailable id falls back rather than failing.
- */
- export function resolveEngine(id: string | null | undefined): SliceEngineId {
- const match = availableEngines().find((e) => e.id === id);
- return match?.id ?? DEFAULT_SLICE_ENGINE;
- }
|