three-slicer 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/README.md +342 -24
  2. package/components/README.md +1 -1
  3. package/components/dist/SettingsPanel.js +111 -112
  4. package/components/styles.css +9 -9
  5. package/data/invalidation-map.json +1 -1
  6. package/engine/examples/headless.mjs +2 -2
  7. package/engine/index.d.ts +3 -1
  8. package/engine/index.js +2 -2
  9. package/engine/src/data.js +12 -0
  10. package/engine/src/settings.js +35 -35
  11. package/engine/src/slicer.worker.js +25 -22
  12. package/engine/src/slicer_core.js +0 -0
  13. package/engine/src/slicer_core.mt.js +0 -0
  14. package/engine/src/toggle_eval.js +12 -13
  15. package/package.json +54 -26
  16. package/types/components.d.ts +19 -0
  17. package/types/data/config-schema.json.d.ts +55 -0
  18. package/types/data/invalidation-map.json.d.ts +15 -0
  19. package/types/data/toggle-rules.json.d.ts +20 -0
  20. package/types/data/ui-tree.json.d.ts +19 -0
  21. package/types/data.d.ts +17 -0
  22. package/types/gen_settings_types.mjs +70 -0
  23. package/types/settings-keys.d.ts +1704 -0
  24. package/types/settings.d.ts +19 -0
  25. package/types/toggle.d.ts +22 -0
  26. package/types/viewer-loaders.d.ts +33 -0
  27. package/types/viewer-toolpath.d.ts +105 -0
  28. package/types/viewer.d.ts +15 -0
  29. package/types/wasm.d.ts +5 -0
  30. package/types/worker.d.ts +3 -0
  31. package/viewer/README.md +1 -1
  32. package/viewer/dist/Viewport.js +1774 -923
  33. package/viewer/dist/make_worker.js +6 -6
  34. package/viewer/dist/model_loaders.js +221 -109
  35. package/viewer/dist/toolpath_gpu.js +146 -147
  36. package/viewer/styles.css +27 -25
  37. package/data/config-schema-builddump.json +0 -12921
  38. package/viewer/src/Viewport.jsx +0 -1353
  39. package/viewer/src/assets/add.svg +0 -1
  40. package/viewer/src/assets/arrange.svg +0 -1
  41. package/viewer/src/assets/boolean.svg +0 -1
  42. package/viewer/src/assets/cut.svg +0 -1
  43. package/viewer/src/assets/delete.svg +0 -1
  44. package/viewer/src/assets/deleteall.svg +0 -1
  45. package/viewer/src/assets/duplicate.svg +0 -1
  46. package/viewer/src/assets/measure.svg +0 -1
  47. package/viewer/src/assets/mmu.svg +0 -1
  48. package/viewer/src/assets/move.svg +0 -1
  49. package/viewer/src/assets/negative.svg +0 -1
  50. package/viewer/src/assets/onbed.svg +0 -1
  51. package/viewer/src/assets/open.svg +0 -1
  52. package/viewer/src/assets/orient.svg +0 -1
  53. package/viewer/src/assets/paint.svg +0 -1
  54. package/viewer/src/assets/rotate.svg +0 -1
  55. package/viewer/src/assets/scale.svg +0 -1
  56. package/viewer/src/assets/seam.svg +0 -1
  57. package/viewer/src/assets/split.svg +0 -1
  58. package/viewer/src/assets/textmark.svg +0 -1
  59. package/viewer/src/assets/varlayer.svg +0 -1
  60. package/viewer/src/icons.js +0 -23
  61. package/viewer/src/make_worker.js +0 -9
  62. package/viewer/src/model_loaders.js +0 -178
  63. package/viewer/src/shadow_host.jsx +0 -30
  64. package/viewer/src/toolpath_gpu.js +0 -430
@@ -0,0 +1,19 @@
1
+ // three-slicer/settings
2
+ import type { SlicerSettings, SettingKey, Point } from './settings-keys.d.ts'
3
+ export type { SlicerSettings, SettingKey, Point }
4
+
5
+ /** The config-schema default value (undefined for unknown keys) */
6
+ export function schemaDefault(key: string): unknown
7
+
8
+ /** Settings map first, schema default otherwise. Vector types are returned as-is. */
9
+ export function settingRaw(settings: SlicerSettings | null | undefined, key: string): unknown
10
+
11
+ /** Normalizes settingRaw to a scalar — [0] for vectors. */
12
+ export function settingScalar(settings: SlicerSettings | null | undefined, key: string): unknown
13
+
14
+ /**
15
+ * Settings map -> kernel slice params. Derived from schema keys; missing keys are filled with internal defaults.
16
+ * ponytail: 53 returned keys, so Record instead of listing each — kernel params are passed straight to slice(),
17
+ * not an API consumers read field by field. Expand it when field access is actually needed.
18
+ */
19
+ export function deriveKernelParams(settings: SlicerSettings | null | undefined): Record<string, unknown>
@@ -0,0 +1,22 @@
1
+ // three-slicer/toggle — partial evaluation of the enable_if expressions in toggle-rules.json.
2
+ import type { SlicerSettings } from './settings-keys.d.ts'
3
+
4
+ /** Settings accessor — schema default when a value is missing, [0] for vector types. */
5
+ export interface ToggleCfg {
6
+ bool(key: string): boolean
7
+ int(key: string): number
8
+ float(key: string): number
9
+ /** Whether the key exists in config-schema */
10
+ has(key: string): boolean
11
+ }
12
+
13
+ export function makeCfg(settings: SlicerSettings | null | undefined): ToggleCfg
14
+
15
+ /**
16
+ * Evaluates a single enable_if expression. Untranslatable expressions return `null` (= fail-open, stays enabled) —
17
+ * make sure to treat that as distinct from `false`.
18
+ */
19
+ export function evalEnableIf(expr: string, locals: Record<string, unknown>, cfg: ToggleCfg): boolean | null
20
+
21
+ /** Keys that must be disabled under the current settings -> the enable_if expression that disabled them. Only rules that are unambiguously false. */
22
+ export function disabledKeys(cfg: ToggleCfg): Record<string, string>
@@ -0,0 +1,33 @@
1
+ // three-slicer/viewer/loaders — pure loaders, independent of the kernel.
2
+
3
+ /** The 5 built-ins plus any extension registered via `registerLoader()`, which pushes onto this array. */
4
+ export const SUPPORTED_EXT: string[]
5
+
6
+ /** Lowercased extension. Empty string when there is no dot. */
7
+ export function fileExt(name: string): string
8
+
9
+ export interface LoadedObject {
10
+ name: string
11
+ /** Triangle vertex coordinates (N*9, model z-up) */
12
+ modelPos: Float32Array
13
+ }
14
+
15
+ /** A single file may contain several objects (3mf/amf/step) -> always an array. */
16
+ export function loadModel(name: string, buffer: ArrayBuffer): Promise<LoadedObject[]>
17
+
18
+ /**
19
+ * Registers an extra format. Formats needing heavy dependencies (STEP=OCCT WASM, etc.) are not bundled here,
20
+ * so the app wires them up itself. The `<Viewport/>` file dialog and drag-and-drop filters pick them up automatically.
21
+ *
22
+ * ```js
23
+ * import { registerLoader } from 'three-slicer/viewer/loaders'
24
+ * registerLoader('step,stp', async (buffer, name) => [{ name, modelPos }])
25
+ * ```
26
+ */
27
+ export function registerLoader(
28
+ exts: string | string[],
29
+ fn: (buffer: ArrayBuffer, name: string) => LoadedObject[] | Promise<LoadedObject[]>,
30
+ ): void
31
+
32
+ /** Connected-component split. Returns `null` when there is only one component (cannot split) — not an empty array. */
33
+ export function splitConnectedComponents(localPos: Float32Array): Float32Array[] | null
@@ -0,0 +1,105 @@
1
+ // three-slicer/viewer/toolpath — kernel layers -> GPU-instanced toolpath.
2
+ // Does not import three: makeToolpath takes the THREE namespace as an argument (guaranteeing a single instance).
3
+
4
+ /** The 24 triangle indices of the 8-vertex diamond cross-section (from SegmentTemplate.cpp:18) */
5
+ export const VERTEX_DATA: number[]
6
+
7
+ /** Toolpath type -> color. 0=travel, 1=wall … 11=prime */
8
+ export const TYPE_COLOR: Record<number, number[]>
9
+ export const TYPE_LABEL: Record<number, string>
10
+
11
+ /** Blue-to-red 11-color heatmap (libvgcode ColorRange.hpp:14) */
12
+ export const DEFAULT_RANGES_COLORS: number[][]
13
+
14
+ export interface ViewTypeDef {
15
+ key: 'feature' | 'speed' | 'height' | 'width' | 'fan' | 'temp'
16
+ label: string
17
+ /** Whether values are continuous (heatmap). False means a fixed color. */
18
+ cont: boolean
19
+ unit: string
20
+ }
21
+ export const VIEW_TYPES: ViewTypeDef[]
22
+
23
+ /** Per-vertex extra data */
24
+ export interface SegmentMeta {
25
+ vType: Uint8Array
26
+ vWidth: Float32Array
27
+ vHeight: Float32Array
28
+ vLayer: Int32Array
29
+ }
30
+
31
+ export interface SegmentData {
32
+ position: Float32Array
33
+ hwa: Float32Array
34
+ segIndex: Uint32Array
35
+ nV: number
36
+ nSeg: number
37
+ layerSegPrefix: Uint32Array
38
+ travelPos: Float32Array
39
+ travelPrefix: Uint32Array
40
+ nTrav: number
41
+ layerCount: number
42
+ maxAbs: number
43
+ hasNaN: boolean
44
+ meta: SegmentMeta
45
+ /** Total extruded length per type (index = toolpath type, length 16) */
46
+ typeLengths: Float64Array
47
+ /** Null when there is not a single vertex */
48
+ bbox: { min: [number, number, number]; max: [number, number, number] } | null
49
+ }
50
+
51
+ /** Kernel layers[{z, paths(stride8), widths[]}] -> GPU stream. */
52
+ export function buildSegmentData(layers: unknown[], defaultLineWidth: number): SegmentData
53
+
54
+ /** Length share per type (%), descending by pct. The kernel does not expose time per role, so length is used as an approximation. */
55
+ export function roleRatios(typeLengths: Float64Array | number[]): Array<{
56
+ type: number
57
+ label: string
58
+ pct: number
59
+ color: number[]
60
+ }>
61
+
62
+ /**
63
+ * speed/fan/temp are absent from the kernel toolpath and derived from settings — these are the values used for that.
64
+ */
65
+ export interface ColorContext {
66
+ speedByType?: Record<number, number>
67
+ firstLayerSpeed?: number
68
+ fanByType?: Record<number, number>
69
+ fanFirstLayers?: number
70
+ tempNormal?: number
71
+ tempFirst?: number
72
+ closeFanLayers?: number
73
+ }
74
+
75
+ export interface ColorResult {
76
+ /** Per-vertex RGBA (nV*4). The color is packed into `.r`. */
77
+ color: Float32Array
78
+ min: number
79
+ max: number
80
+ viewType: ViewTypeDef['key']
81
+ label: string
82
+ unit: string
83
+ /** False means fixed colors — min/max are 0 and no legend should be drawn. */
84
+ cont: boolean
85
+ }
86
+
87
+ export function computeColors(data: SegmentData, viewType: ViewTypeDef['key'], ctx: ColorContext): ColorResult
88
+
89
+ export interface ToolpathHandle {
90
+ /** THREE.Mesh — typed by the THREE namespace passed in */
91
+ mesh: any
92
+ /** THREE.LineSegments (travel) */
93
+ travLines: any
94
+ setLayerRange(lo: number, hi: number): void
95
+ /** Backwards compatible — same as setLayerRange(0, n-1). */
96
+ setVisibleLayers(n: number): void
97
+ setTravelVisible(visible: boolean): void
98
+ setColors(color: Float32Array): void
99
+ dispose(): void
100
+ nSeg: number
101
+ layerCount: number
102
+ }
103
+
104
+ /** @param THREE - the `import * as THREE from 'three'` namespace. The consumer's instance is used as-is. */
105
+ export function makeToolpath(THREE: any, data: SegmentData): ToolpathHandle
@@ -0,0 +1,15 @@
1
+ // three-slicer/viewer
2
+ import type * as React from 'react'
3
+ import type { SlicerSettings } from './settings-keys.d.ts'
4
+
5
+ export interface ViewportProps {
6
+ /** Sparse settings map. Defaults to `{}`. */
7
+ settings?: SlicerSettings
8
+ /** React setState shape. Defaults to a no-op. */
9
+ setSettings?: React.Dispatch<React.SetStateAction<SlicerSettings>>
10
+ /** Left process-panel slot — usually `<SettingsPanel embedded/>`. Defaults to null. */
11
+ processPanel?: React.ReactNode
12
+ }
13
+
14
+ declare const Viewport: React.FC<ViewportProps>
15
+ export default Viewport
@@ -0,0 +1,5 @@
1
+ // three-slicer/wasm, three-slicer/wasm-mt — emscripten glue (generated, 3.5MB+).
2
+ // ponytail: no precise types here. The glue changes on every rebuild, and the public API is
3
+ // createSlicer() from three-slicer. Anyone using this directly already knows the kernel internals.
4
+ declare const factory: (opts?: Record<string, unknown>) => Promise<any>
5
+ export default factory
@@ -0,0 +1,3 @@
1
+ // three-slicer/worker — the slice worker script. Not a module you import, but the target of
2
+ // `new Worker(new URL('three-slicer/worker', import.meta.url), { type: 'module' })`.
3
+ export {}
package/viewer/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # three-slicer/viewer
2
2
 
3
- 3D slicer viewer as a React component: three.js viewport (orbit/transform gizmos), model import (STL/OBJ/3MF/AMF/PLY, multi-object, drag & drop), Web Worker slicing via `three-slicer`, support painting, multi-plate, and a GPU-instanced volumetric toolpath preview ported from OrcaSlicer's libvgcode (millions of segments in a single draw path, per-feature colors, layer range slider, G-code export).
3
+ 3D slicer viewer as a React component: three.js viewport (orbit/transform gizmos), model import (STL/OBJ/3MF/AMF/PLY + pluggable formats such as STEP, multi-object, drag & drop), Web Worker slicing via `three-slicer`, support painting, multi-plate, and a GPU-instanced volumetric toolpath preview ported from OrcaSlicer's libvgcode (millions of segments in a single draw path, per-feature colors, layer range slider, G-code export).
4
4
 
5
5
  ```bash
6
6
  npm i three-slicer/viewer react react-dom three@^0.160.0