@chestnutlabs/gcode-preview-react 0.4.0 → 0.5.0
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.
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { BuildVolumeDef, CameraMode, ColorMode, QualityMode, Theme, TubeOptions } from '@chestnutlabs/gcode-renderer-three';
|
|
1
|
+
import type { BuildVolumeDef, CameraMode, CameraState, CameraView, ColorMode, QualityMode, Theme, TubeOptions } from '@chestnutlabs/gcode-renderer-three';
|
|
2
2
|
import type { MachineGeometry, ProgressObservation } from '@chestnutlabs/toolpath-core';
|
|
3
3
|
import type { WireParseOptions, WorkerLike } from '@chestnutlabs/gcode-parser';
|
|
4
4
|
import { type GcodePreviewHandle, type RendererMode, type UseGcodePreviewOptions } from './use-gcode-preview.js';
|
|
@@ -19,6 +19,10 @@ export interface GcodePreviewProps {
|
|
|
19
19
|
quality?: QualityMode | 'auto';
|
|
20
20
|
/** #150 (DD-009 D3): camera projection. */
|
|
21
21
|
cameraMode?: CameraMode;
|
|
22
|
+
/** #268/#275/M6: snap to a preset orientation (top/front/iso/…). Instant; preserves the projection. */
|
|
23
|
+
view?: CameraView;
|
|
24
|
+
/** #268/#275/M6: restore a saved camera pose. Pair with `onCameraChange` for a two-way binding. */
|
|
25
|
+
cameraState?: CameraState | null;
|
|
22
26
|
/** #153 (DD-009 D4): bounded declarative theme. */
|
|
23
27
|
theme?: Theme;
|
|
24
28
|
colorMode?: ColorMode;
|
|
@@ -44,7 +48,11 @@ export interface GcodePreviewProps {
|
|
|
44
48
|
segments: number;
|
|
45
49
|
layers: number;
|
|
46
50
|
complete: boolean;
|
|
51
|
+
capabilities: Record<string, import('@chestnutlabs/toolpath-core').Confidence>;
|
|
52
|
+
warnings: readonly import('@chestnutlabs/toolpath-core').Warning[];
|
|
47
53
|
}) => void;
|
|
54
|
+
/** #275/M6: fires after a user camera interaction settles, with the new serializable state. */
|
|
55
|
+
onCameraChange?: (state: CameraState) => void;
|
|
48
56
|
onParseError?: (e: {
|
|
49
57
|
code: string;
|
|
50
58
|
message: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gcode-preview-component.d.ts","sourceRoot":"","sources":["../src/gcode-preview-component.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EACV,SAAS,EACT,WAAW,EACX,KAAK,EACL,WAAW,EACZ,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACxF,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,EAEL,KAAK,kBAAkB,EAEvB,KAAK,YAAY,EACjB,KAAK,sBAAsB,EAC5B,MAAM,wBAAwB,CAAC;AAEhC,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC;AAExE,MAAM,WAAW,iBAAiB;IAChC,mFAAmF;IACnF,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC;;;OAGG;IACH,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,uGAAuG;IACvG,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2FAA2F;IAC3F,WAAW,CAAC,EAAE,cAAc,GAAG,eAAe,CAAC;IAC/C,OAAO,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC;IAC/B,2CAA2C;IAC3C,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,mDAAmD;IACnD,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,gEAAgE;IAChE,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACrC,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gEAAgE;IAChE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gEAAgE;IAChE,QAAQ,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACtC,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,UAAU,CAAC;IAChC,mFAAmF;IACnF,eAAe,CAAC,EAAE,IAAI,CACpB,WAAW,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC,EAC/C,aAAa,GAAG,SAAS,GAAG,YAAY,GAAG,OAAO,GAAG,WAAW,GAAG,MAAM,CAC1E,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE;
|
|
1
|
+
{"version":3,"file":"gcode-preview-component.d.ts","sourceRoot":"","sources":["../src/gcode-preview-component.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,7 +37,16 @@ function GcodePreviewImpl(props, ref) {
|
|
|
37
37
|
const p = cbRef.current;
|
|
38
38
|
switch (e.type) {
|
|
39
39
|
case 'parse-complete':
|
|
40
|
-
p.onReady?.({
|
|
40
|
+
p.onReady?.({
|
|
41
|
+
segments: e.segments,
|
|
42
|
+
layers: e.layers,
|
|
43
|
+
complete: e.complete,
|
|
44
|
+
capabilities: e.capabilities,
|
|
45
|
+
warnings: e.warnings
|
|
46
|
+
});
|
|
47
|
+
break;
|
|
48
|
+
case 'camera-changed':
|
|
49
|
+
p.onCameraChange?.(e.state);
|
|
41
50
|
break;
|
|
42
51
|
case 'parse-error':
|
|
43
52
|
p.onParseError?.({ code: e.code, message: e.message });
|
|
@@ -73,7 +82,7 @@ function GcodePreviewImpl(props, ref) {
|
|
|
73
82
|
});
|
|
74
83
|
}, []);
|
|
75
84
|
// ---- prop wiring: each prop is a thin call into the hook (D1 shell rule) ----
|
|
76
|
-
const { source, layerRange, scrub, scrubTime, showTravel, showWipe, showRetractions, colorMode, quality, cameraMode, theme, buildVolume, progress } = props;
|
|
85
|
+
const { source, layerRange, scrub, scrubTime, showTravel, showWipe, showRetractions, colorMode, quality, cameraMode, view, cameraState, theme, buildVolume, progress } = props;
|
|
77
86
|
useEffect(() => {
|
|
78
87
|
if (source !== null && source !== undefined)
|
|
79
88
|
void preview.parse(source, cbRef.current.parseOptions);
|
|
@@ -111,6 +120,14 @@ function GcodePreviewImpl(props, ref) {
|
|
|
111
120
|
if (cameraMode !== undefined)
|
|
112
121
|
preview.controls.setCameraMode(cameraMode);
|
|
113
122
|
}, [cameraMode]);
|
|
123
|
+
useEffect(() => {
|
|
124
|
+
if (view !== undefined)
|
|
125
|
+
preview.controls.setView(view);
|
|
126
|
+
}, [view]);
|
|
127
|
+
useEffect(() => {
|
|
128
|
+
if (cameraState !== undefined && cameraState !== null)
|
|
129
|
+
preview.controls.setCameraState(cameraState);
|
|
130
|
+
}, [cameraState]);
|
|
114
131
|
useEffect(() => {
|
|
115
132
|
if (theme !== undefined)
|
|
116
133
|
preview.controls.setTheme(theme);
|
|
@@ -128,6 +145,7 @@ function GcodePreviewImpl(props, ref) {
|
|
|
128
145
|
return createElement('canvas', {
|
|
129
146
|
ref: preview.canvasRef,
|
|
130
147
|
style: { width: '100%', height: '100%', display: 'block', touchAction: 'none' },
|
|
148
|
+
tabIndex: 0, // focusable → keyboard camera (DD-004 a11y, #275/M4)
|
|
131
149
|
'aria-label': '3D G-code toolpath preview'
|
|
132
150
|
});
|
|
133
151
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chestnutlabs/gcode-preview-react",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Thin React integration for the Chestnut Labs G-code viewer (DD-007 D1 amendment): useGcodePreview hook + GcodePreview component as a reactivity bridge over @chestnutlabs/gcode-preview-core.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"gcode",
|
|
@@ -49,10 +49,10 @@
|
|
|
49
49
|
"test": "vitest run"
|
|
50
50
|
},
|
|
51
51
|
"dependencies": {
|
|
52
|
-
"@chestnutlabs/gcode-parser": "0.
|
|
53
|
-
"@chestnutlabs/gcode-preview-core": "0.
|
|
54
|
-
"@chestnutlabs/gcode-renderer-three": "0.
|
|
55
|
-
"@chestnutlabs/toolpath-core": "0.
|
|
52
|
+
"@chestnutlabs/gcode-parser": "0.5.0",
|
|
53
|
+
"@chestnutlabs/gcode-preview-core": "0.5.0",
|
|
54
|
+
"@chestnutlabs/gcode-renderer-three": "0.5.0",
|
|
55
|
+
"@chestnutlabs/toolpath-core": "0.5.0"
|
|
56
56
|
},
|
|
57
57
|
"peerDependencies": {
|
|
58
58
|
"react": "^18.0.0 || ^19.0.0"
|