@omrips/viewstl 0.0.0-stage → 2.0.0-rc.1

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 (35) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +162 -2
  3. package/THIRD-PARTY-NOTICES.txt +1129 -0
  4. package/build/v2/README.md +11 -0
  5. package/build/v2/THIRD-PARTY-NOTICES.txt +1129 -0
  6. package/build/v2/cad/occt-import-js.js +8 -0
  7. package/build/v2/cad/occt-import-js.source.txt +57 -0
  8. package/build/v2/cad/occt-import-js.wasm +0 -0
  9. package/build/v2/cad/prepare-cad.source.txt +112 -0
  10. package/build/v2/chunks/archive-VGS4J4Z7.js +1 -0
  11. package/build/v2/chunks/cad-VY42CMP4.js +1 -0
  12. package/build/v2/chunks/chunk-JH3H3JWA.js +1 -0
  13. package/build/v2/chunks/chunk-JS56KC3I.js +1 -0
  14. package/build/v2/chunks/chunk-R3HNTB5A.js +38 -0
  15. package/build/v2/chunks/chunk-U33KANV7.js +1 -0
  16. package/build/v2/chunks/chunk-ZMK3UZZE.js +1 -0
  17. package/build/v2/chunks/chunk-ZSV4PTIA.js +1 -0
  18. package/build/v2/chunks/export-7OP4ZGGJ.js +29 -0
  19. package/build/v2/chunks/export-cad-QPBT756V.js +13 -0
  20. package/build/v2/chunks/export-zip-EDCWH5PX.js +1 -0
  21. package/build/v2/chunks/print-check-2PU7CSL3.js +1 -0
  22. package/build/v2/chunks/scene-export-KQBS7VRJ.js +1 -0
  23. package/build/v2/chunks/scene-reader-APUJOPUR.js +1 -0
  24. package/build/v2/stl_viewer.min.js +51 -0
  25. package/build/v2/viewstl.cjs +5445 -0
  26. package/build/v2/viewstl.d.cts +446 -0
  27. package/build/v2/viewstl.d.ts +446 -0
  28. package/build/v2/viewstl.js +5426 -0
  29. package/build/v2/viewstl.min.js +51 -0
  30. package/build/v2/viewstl.worker.js +1 -0
  31. package/docs/v2-compatibility.md +204 -0
  32. package/docs/v2-usage.md +723 -0
  33. package/docs/v2-verification.md +423 -0
  34. package/legacy/README.md +43 -0
  35. package/package.json +73 -4
@@ -0,0 +1,446 @@
1
+ export interface Vector3 {
2
+ x: number;
3
+ y: number;
4
+ z: number;
5
+ }
6
+ export interface CameraState {
7
+ position: Vector3;
8
+ up: Vector3;
9
+ target: Vector3;
10
+ }
11
+ export type Display =
12
+ | "flat"
13
+ | "smooth"
14
+ | "wireframe"
15
+ | "edges"
16
+ | "mesh"
17
+ | "xray"
18
+ | "studio"
19
+ | "orientation";
20
+ export interface Section {
21
+ axis: "x" | "y" | "z";
22
+ position: number;
23
+ flip?: boolean;
24
+ }
25
+ export type Units = "mm" | "inch";
26
+ export type ExportFormat =
27
+ "stl" | "obj" | "3mf" | "step" | "stp" | "iges" | "igs";
28
+ export interface ExportProgress {
29
+ /** Number of triangles encoded; completion also includes packaging. */
30
+ loaded: number;
31
+ total: number;
32
+ phase: "exporting" | "complete";
33
+ }
34
+ export interface ExportOptions {
35
+ format: ExportFormat;
36
+ /** Omit for all models. Loading models cause rejection. */
37
+ model_ids?: number[] | "selected";
38
+ filename?: string;
39
+ /** Output coordinates/units; the scene coordinate system is millimeters. */
40
+ units?: Units;
41
+ /** Default true. False exports source coordinates plus unit conversion only. */
42
+ apply_transforms?: boolean;
43
+ /** Default true for OBJ/3MF. Colored OBJ returns a ZIP with OBJ and MTL. */
44
+ colors?: boolean;
45
+ signal?: AbortSignal;
46
+ on_progress?: (progress: ExportProgress) => void;
47
+ }
48
+ export interface ExportResult {
49
+ blob: Blob;
50
+ filename: string;
51
+ format: "stl" | "obj" | "3mf" | "step" | "iges";
52
+ units: Units;
53
+ model_ids: number[];
54
+ triangles: number;
55
+ representation: "mesh";
56
+ }
57
+ export interface Transform {
58
+ x?: number;
59
+ y?: number;
60
+ z?: number;
61
+ rotationx?: number;
62
+ rotationy?: number;
63
+ rotationz?: number;
64
+ scale?: number;
65
+ scalex?: number;
66
+ scaley?: number;
67
+ scalez?: number;
68
+ }
69
+ export interface SceneExportOptions {
70
+ format: "vsb" | "vsj";
71
+ filename?: string;
72
+ /** VSJ only: strip paths/query strings from model references. Default false. */
73
+ force_basename?: boolean;
74
+ signal?: AbortSignal;
75
+ on_progress?: (progress: {
76
+ loaded: number;
77
+ total: number;
78
+ phase: "exporting" | "packaging" | "complete";
79
+ }) => void;
80
+ }
81
+ export interface SceneExportResult {
82
+ blob: Blob;
83
+ filename: string;
84
+ format: "vsb" | "vsj";
85
+ model_ids: number[];
86
+ triangles: number;
87
+ representation: "scene";
88
+ }
89
+ export interface AnimationTrack extends Transform {
90
+ msec?: number;
91
+ loop?: boolean;
92
+ }
93
+ export interface Animation {
94
+ delta?: AnimationTrack;
95
+ exact?: AnimationTrack;
96
+ }
97
+ export interface GeometryData {
98
+ positions: Float32Array | number[];
99
+ colors?: Float32Array | number[] | null;
100
+ }
101
+ export interface ModelOptions extends Transform {
102
+ id?: number;
103
+ filename?: string;
104
+ /** Retrieve a public URL through the explicitly configured same-origin relay. */
105
+ remote_url?: string;
106
+ remote_format?: "" | "stl" | "obj" | "3mf" | "step" | "stp" | "iges" | "igs";
107
+ orig_filename?: string;
108
+ local_file?: File | Blob;
109
+ mesh?: unknown;
110
+ data?: GeometryData;
111
+ display?: Display;
112
+ smooth_shading?: boolean;
113
+ section?: Section | null;
114
+ color?: string | null;
115
+ opacity?: number;
116
+ view_edges?: boolean;
117
+ units?: Units;
118
+ animation?: Animation | null;
119
+ }
120
+ export type ModelClick = (
121
+ id: number | null,
122
+ event: PointerEvent | MouseEvent,
123
+ distance: number,
124
+ type: 1 | 3 | 11 | 20,
125
+ ) => void;
126
+ export interface ViewerOptions {
127
+ models?: ModelOptions[];
128
+ width?: string | number;
129
+ height?: string | number;
130
+ canvas_width?: string | number;
131
+ canvas_height?: string | number;
132
+ bg_color?: string;
133
+ bgcolor?: string;
134
+ camerax?: number;
135
+ cameray?: number;
136
+ cameraz?: number;
137
+ camera_state?: CameraState;
138
+ zoom?: number;
139
+ center_models?: boolean;
140
+ auto_resize?: boolean;
141
+ auto_rotate?: boolean;
142
+ mouse_zoom?: boolean;
143
+ allow_drag_and_drop?: boolean;
144
+ controls?: 0 | 1;
145
+ grid?: boolean;
146
+ send_no_model_click_event?: boolean;
147
+ pixel_ratio?: number;
148
+ worker_url?: string | URL;
149
+ worker_factory?: () => Worker;
150
+ worker_count?: number;
151
+ worker_timeout?: number;
152
+ url_import_endpoint?: string;
153
+ load_three_files?: string | false;
154
+ jszip_path?: string;
155
+ jszip_utils_path?: string;
156
+ three?: unknown;
157
+ max_file_bytes?: number;
158
+ max_triangles?: number;
159
+ max_uncompressed_bytes?: number;
160
+ max_archive_entries?: number;
161
+ max_memory_bytes?: number;
162
+ ready_callback?: () => void;
163
+ all_loaded_callback?: () => void;
164
+ model_loaded_callback?: (id: number) => void;
165
+ load_error_callback?: (message: string) => void;
166
+ loading_progress_callback?: (
167
+ status: Record<
168
+ number,
169
+ { loaded: number; total: number; phase?: "loading-cad" | "parsing-cad" }
170
+ >,
171
+ session: number,
172
+ ) => void;
173
+ on_model_drop?: (filename: string) => void;
174
+ on_model_mouseclick?: ModelClick;
175
+ on_model_mousedown?: ModelClick;
176
+ }
177
+ export interface ModelInfo {
178
+ name: string;
179
+ orig_filename: string | null;
180
+ position: Vector3;
181
+ dims: Vector3;
182
+ rotation: Vector3;
183
+ display: Display;
184
+ smooth_shading: boolean;
185
+ section: Section | null;
186
+ color: string;
187
+ scale: Vector3;
188
+ volume: number;
189
+ area: number;
190
+ triangles: number;
191
+ /** Source-space bounds, copied without exposing geometry buffers. */
192
+ bounds: { min: number[]; max: number[] };
193
+ has_colors: boolean;
194
+ /** Physical units specified by the file; null for unitless STL/OBJ. */
195
+ source_units: string | null;
196
+ units: Units;
197
+ opacity: number;
198
+ file_bytes: number | null;
199
+ }
200
+ export interface Scene {
201
+ canvas_height: string | number;
202
+ bg_color: string;
203
+ camera_state: CameraState;
204
+ auto_rotate: boolean;
205
+ mouse_zoom: boolean;
206
+ auto_resize: boolean;
207
+ center_models: boolean;
208
+ grid?: boolean;
209
+ infinite_grid?: { spacing: number; height: number };
210
+ models: ModelOptions[];
211
+ }
212
+ export interface BinaryScene {
213
+ vsj: Scene;
214
+ files: Array<{ id: number; bin: ArrayBuffer }>;
215
+ }
216
+ export class StlViewer {
217
+ static version: string;
218
+ static workerURL: string | URL | null;
219
+ constructor(container: HTMLElement, options?: ViewerOptions);
220
+ readonly when_ready: Promise<StlViewer>;
221
+ readonly ready: boolean;
222
+ readonly error: string | null;
223
+ readonly models_count: number;
224
+ readonly load_session: number;
225
+ readonly canvas: HTMLCanvasElement;
226
+ readonly controls: { enabled: boolean; noZoom: boolean };
227
+ when_idle(): Promise<StlViewer>;
228
+ add_model(model: ModelOptions): void;
229
+ add_models(models: ModelOptions[]): void;
230
+ remove_model(id: number): void;
231
+ clean(): void;
232
+ dispose(): void;
233
+ set_display(id: number, display: Display): void;
234
+ set_view(
235
+ id: number,
236
+ options: { display?: Display; smooth_shading?: boolean },
237
+ ): void;
238
+ set_smooth(id: number, enabled: boolean): void;
239
+ set_section(id: number, section: Section | null): void;
240
+ set_color(id: number, color: string | null): void;
241
+ set_opacity(id: number, opacity: number): void;
242
+ set_position(id: number, x?: number, y?: number, z?: number): void;
243
+ /** Show a 3D editing frame; null clears it. Excluded from PNG and scene exports. */
244
+ set_selection(id: number | null): void;
245
+ /** Pick the nearest visible surface at viewport coordinates (e.g. event.clientX/Y). */
246
+ pick_model(
247
+ clientX: number,
248
+ clientY: number,
249
+ ): { id: number; distance: number } | null;
250
+ set_scale(
251
+ id: number,
252
+ x: number,
253
+ y?: number,
254
+ z?: number,
255
+ keepPrevious?: boolean,
256
+ ): void;
257
+ set_rotation(
258
+ id: number,
259
+ x?: number,
260
+ y?: number,
261
+ z?: number,
262
+ increment?: boolean,
263
+ ): void;
264
+ rotate(id: number, x?: number, y?: number, z?: number): void;
265
+ set_edges(id: number, enabled: boolean): void;
266
+ set_grid(enabled: boolean, size?: number, divisions?: number): void;
267
+ set_infinite_grid(enabled: boolean, spacing?: number, height?: number): void;
268
+ set_model_units(id: number, units: Units, scale?: boolean): void;
269
+ set_bg_color(color: string): void;
270
+ set_center_models(enabled: boolean): void;
271
+ set_zoom(zoom?: number): void;
272
+ set_auto_zoom(): void;
273
+ set_auto_rotate(enabled: boolean): void;
274
+ set_mouse_zoom(enabled: boolean): void;
275
+ set_auto_resize(enabled: boolean): void;
276
+ do_resize(): void;
277
+ set_on_model_mousedown(callback: ModelClick | null): void;
278
+ set_on_model_mouseclick(callback: ModelClick | null): void;
279
+ set_drag_and_drop(enabled: boolean): void;
280
+ get_camera_state(): CameraState;
281
+ set_camera_state(state: Partial<CameraState>): void;
282
+ set_camera(x?: number, y?: number, z?: number): void;
283
+ get_model_info(id: number): ModelInfo | null;
284
+ get_model_data(id: number): GeometryData | null;
285
+ get_model_mesh(id: number): unknown;
286
+ get_stl_bin(id: number): ArrayBuffer | null;
287
+ check_printability(options?: PrintCheckOptions): Promise<PrintReport>;
288
+ is_printability_current(report: PrintReport): boolean;
289
+ show_printability(
290
+ report: PrintReport,
291
+ options: { issue: string; model_id?: number },
292
+ ): number;
293
+ clear_printability(): void;
294
+ export_models(options: ExportOptions): Promise<ExportResult>;
295
+ download_models(options: ExportOptions): Promise<ExportResult>;
296
+ download_model(id: number, filename?: string): void;
297
+ get_vsj(
298
+ as_js_obj?: false,
299
+ force_basename?: boolean,
300
+ for_vsb?: boolean,
301
+ ): string;
302
+ get_vsj(as_js_obj: true, force_basename?: boolean, for_vsb?: boolean): Scene;
303
+ download_vsj(filename?: string): void;
304
+ /** Whole-scene export. VSB contains STL meshes; VSJ contains references only. */
305
+ export_scene(options: SceneExportOptions): Promise<SceneExportResult>;
306
+ download_scene(options: SceneExportOptions): Promise<SceneExportResult>;
307
+ load_vsj(source: string | File | Blob): void;
308
+ /** Add a scene atomically. URLs/references use the configured same-origin relay. */
309
+ import_scene(
310
+ source: string | File | Blob,
311
+ options?: {
312
+ format?: "vsb" | "vsj";
313
+ files?: File[];
314
+ signal?: AbortSignal;
315
+ on_progress?: (progress: {
316
+ loaded: number;
317
+ total: number;
318
+ phase: string;
319
+ }) => void;
320
+ },
321
+ ): Promise<{
322
+ model_ids: number[];
323
+ scene: Partial<Scene>;
324
+ used_files: File[];
325
+ }>;
326
+ get_vsb(): BinaryScene;
327
+ get_vsb_blob(): Promise<Blob>;
328
+ download_vsb(filename?: string): Promise<void | null>;
329
+ load_vsb(source: string | File | Blob): void;
330
+ animate_model(id: number, animation: Animation | null): void;
331
+ get_image_blob(type?: string): Promise<Blob>;
332
+ }
333
+ export default StlViewer;
334
+
335
+ export interface ViewstlAppOptions {
336
+ url_import_endpoint?: string;
337
+ worker_url?: string | URL;
338
+ worker_factory?: () => Worker;
339
+ worker_timeout?: number;
340
+ /** Optional sample URL; omit to hide the sample button. */
341
+ sample_url?: string;
342
+ sample_name?: string;
343
+ /** Prefix used by this root's control IDs and associated label/ARIA references. */
344
+ id_prefix?: string;
345
+ }
346
+ export interface ViewstlAppState {
347
+ selectedId: number | null;
348
+ busy: boolean;
349
+ arrangement: string;
350
+ memoryBudget: number;
351
+ models: Array<{
352
+ id: number;
353
+ name: string;
354
+ size?: number;
355
+ units: string | null;
356
+ position: Vector3;
357
+ /** Euler XYZ angles in degrees, about the model's own center. */
358
+ rotation: Vector3;
359
+ color: string | null;
360
+ }>;
361
+ }
362
+ export interface ViewstlApp {
363
+ openURL(url: string, format?: ModelOptions["remote_format"]): Promise<void>;
364
+ /** Adds files to the scene; settles when the queue drains or is cancelled.
365
+ * Per-file errors appear in the app notice and preserve existing models. */
366
+ openFiles(
367
+ files: Iterable<File | { name: string; url: string; size?: number }>,
368
+ ): Promise<void>;
369
+ cancelLoading(): void;
370
+ clear(): void;
371
+ select(id: number): void;
372
+ remove(id: number): void;
373
+ /** Detached state snapshot; changing it never mutates the scene. */
374
+ getState(): ViewstlAppState;
375
+ /** Cancels pending work and releases listeners, workers, and WebGL resources. */
376
+ dispose(): void;
377
+ }
378
+ /** Optional complete app controller for the documented HTML control template.
379
+ * No WebGL context, workers or CAD assets are created until a file is opened. */
380
+ export function mountViewstlApp(
381
+ root: Document | HTMLElement,
382
+ options?: ViewstlAppOptions,
383
+ ): ViewstlApp;
384
+
385
+ export interface PrintProfile {
386
+ technology: "fdm";
387
+ build_volume_mm?: [number, number, number];
388
+ min_wall_mm?: number;
389
+ line_width_mm?: number;
390
+ /** Maximum overhang measured from vertical. +Z is print up. */
391
+ overhang_degrees?: number;
392
+ }
393
+ export interface PrintProgress {
394
+ phase: string;
395
+ elapsed_ms?: number;
396
+ model_id?: number;
397
+ model_index?: number;
398
+ total_models: number;
399
+ }
400
+ export interface PrintCheckOptions {
401
+ model_ids?: number[] | "selected";
402
+ level?: "basic" | "detailed";
403
+ apply_transforms?: boolean;
404
+ units_confirmed?: boolean;
405
+ profile?: PrintProfile | null;
406
+ max_time_ms?: number;
407
+ signal?: AbortSignal;
408
+ on_progress?: (progress: PrintProgress) => void;
409
+ }
410
+ export interface PrintCheck {
411
+ code: string;
412
+ label: string;
413
+ severity: "error" | "warning" | "info";
414
+ status: "pass" | "issue" | "inconclusive" | "not_run";
415
+ count: number;
416
+ message: string;
417
+ triangle_ids: number[];
418
+ edge_vertices: number[];
419
+ estimated?: boolean;
420
+ area_mm2?: number;
421
+ samples?: number;
422
+ minimum_sampled_mm?: number | null;
423
+ unresolved_samples?: number;
424
+ }
425
+ export interface PrintModelReport {
426
+ model_id: number;
427
+ name: string;
428
+ triangles: number;
429
+ checks: PrintCheck[];
430
+ dimensions_mm: number[] | null;
431
+ volume_mm3: number | null;
432
+ volume_valid: boolean;
433
+ tolerance_mm?: number;
434
+ elapsed_ms: number;
435
+ limit_reason?: "time";
436
+ summary: "issues_found" | "incomplete" | "no_issues_found";
437
+ }
438
+ export interface PrintReport {
439
+ version: 1;
440
+ model_ids: number[];
441
+ models: PrintModelReport[];
442
+ settings: Omit<PrintCheckOptions, "signal" | "on_progress" | "model_ids">;
443
+ summary: "issues_found" | "incomplete" | "no_issues_found";
444
+ scope: string;
445
+ estimated: boolean;
446
+ }