cyclecad 2.1.0 → 3.0.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.
- package/DELIVERABLES.txt +296 -445
- package/ENHANCEMENT_COMPLETION_REPORT.md +383 -0
- package/ENHANCEMENT_SUMMARY.txt +308 -0
- package/FEATURE_INVENTORY.md +235 -0
- package/FUSION360_FEATURES_SUMMARY.md +452 -0
- package/FUSION360_PARITY_ENHANCEMENTS.md +461 -0
- package/FUSION360_PARITY_SUMMARY.md +520 -0
- package/FUSION360_QUICK_REFERENCE.md +351 -0
- package/MODULE_API_REFERENCE.md +712 -0
- package/MODULE_INVENTORY.txt +264 -0
- package/app/index.html +1342 -5031
- package/app/js/app.js +1312 -514
- package/app/js/modules/animation-module.js +497 -3
- package/app/js/modules/cam-module.js +507 -2
- package/app/js/modules/collaboration-module.js +513 -0
- package/app/js/modules/constraint-module.js +1266 -0
- package/app/js/modules/data-module.js +544 -1146
- package/app/js/modules/formats-module.js +438 -738
- package/app/js/modules/inspection-module.js +393 -0
- package/app/js/modules/mesh-module-enhanced.js +880 -0
- package/app/js/modules/plugin-module.js +597 -0
- package/app/js/modules/rendering-module.js +460 -0
- package/app/js/modules/scripting-module.js +593 -475
- package/app/js/modules/sketch-module.js +998 -2
- package/app/js/modules/surface-module.js +312 -0
- package/app/js/modules/version-module.js +420 -0
- package/cycleCAD-Architecture-v2.pptx +0 -0
- package/package.json +1 -1
- package/~$cycleCAD-Architecture-v2.pptx +0 -0
|
@@ -0,0 +1,712 @@
|
|
|
1
|
+
# Module API Reference — cycleCAD v2.0
|
|
2
|
+
|
|
3
|
+
Complete API documentation for three enhanced modules: scripting, formats, and data management.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## SCRIPTING MODULE API
|
|
8
|
+
|
|
9
|
+
**Import:**
|
|
10
|
+
```javascript
|
|
11
|
+
import scripting from './modules/scripting-module.js';
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
### Initialization
|
|
15
|
+
```javascript
|
|
16
|
+
scripting.init(viewport, kernel, containerEl);
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### Script Execution
|
|
20
|
+
```javascript
|
|
21
|
+
// Execute code with cad context
|
|
22
|
+
await scripting.execute(code, context, options);
|
|
23
|
+
|
|
24
|
+
// With parameters
|
|
25
|
+
await scripting.execute(code, {}, {
|
|
26
|
+
params: { width: 100, height: 50 },
|
|
27
|
+
withDebugger: false
|
|
28
|
+
});
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Script Library
|
|
32
|
+
```javascript
|
|
33
|
+
// Save script
|
|
34
|
+
scripting.saveScript(name, code, {
|
|
35
|
+
description: 'My script',
|
|
36
|
+
tags: ['box', 'basic'],
|
|
37
|
+
version: '1.0'
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
// Load script
|
|
41
|
+
const script = scripting.loadScript(name);
|
|
42
|
+
|
|
43
|
+
// List scripts
|
|
44
|
+
const scripts = scripting.listScripts(tag);
|
|
45
|
+
|
|
46
|
+
// Delete script
|
|
47
|
+
scripting.deleteScript(name);
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Macro Recording
|
|
51
|
+
```javascript
|
|
52
|
+
scripting.startRecording();
|
|
53
|
+
// ... user performs actions ...
|
|
54
|
+
const macro = scripting.stopRecording();
|
|
55
|
+
// macro.code contains auto-generated JavaScript
|
|
56
|
+
|
|
57
|
+
// Record action (called by UI)
|
|
58
|
+
scripting.recordAction('box', { w: 100, h: 50, d: 30 });
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Batch Operations
|
|
62
|
+
```javascript
|
|
63
|
+
// Apply script to multiple parts
|
|
64
|
+
const results = await scripting.batchExecute('selectedParts', `
|
|
65
|
+
cad.fillet(5);
|
|
66
|
+
cad.color(0x888888);
|
|
67
|
+
`);
|
|
68
|
+
|
|
69
|
+
// results: [{success: true, object, result}, ...]
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Debugging API
|
|
73
|
+
```javascript
|
|
74
|
+
// Set breakpoint at line
|
|
75
|
+
scripting.setBreakpoint('script_name', 42);
|
|
76
|
+
|
|
77
|
+
// Get breakpoints
|
|
78
|
+
const breakpoints = scripting.getBreakpoints('script_name');
|
|
79
|
+
|
|
80
|
+
// Remove breakpoint
|
|
81
|
+
scripting.removeBreakpoint('script_name', 42);
|
|
82
|
+
|
|
83
|
+
// Step through code
|
|
84
|
+
await scripting.stepInto('script_name', 42);
|
|
85
|
+
await scripting.stepOver('script_name', 42);
|
|
86
|
+
|
|
87
|
+
// Debug history
|
|
88
|
+
const history = scripting.getDebugHistory();
|
|
89
|
+
scripting.clearDebugHistory();
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Script Parameters
|
|
93
|
+
```javascript
|
|
94
|
+
// Define parameters for script UI dialog
|
|
95
|
+
scripting.setScriptParameters('my_script', {
|
|
96
|
+
width: { type: 'slider', default: 100, min: 10, max: 500 },
|
|
97
|
+
material: { type: 'dropdown', options: ['steel', 'aluminum'], default: 'steel' },
|
|
98
|
+
description: { type: 'text', default: '' }
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
// Create parameter dialog
|
|
102
|
+
const values = await scripting.createParameterDialog(parameters);
|
|
103
|
+
// values: { width: 150, material: 'aluminum', description: '...' }
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Console API
|
|
107
|
+
```javascript
|
|
108
|
+
// Get console output
|
|
109
|
+
const output = scripting.getConsoleOutput();
|
|
110
|
+
// output: [{type: 'log', text: '...', time: Date}, ...]
|
|
111
|
+
|
|
112
|
+
// Clear console
|
|
113
|
+
scripting.clearConsole();
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Examples
|
|
117
|
+
```javascript
|
|
118
|
+
// Get example scripts
|
|
119
|
+
const examples = scripting.getExampleScripts();
|
|
120
|
+
|
|
121
|
+
// Load example script
|
|
122
|
+
const script = scripting.loadExampleScript('gear_generator');
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Events
|
|
126
|
+
```javascript
|
|
127
|
+
scripting.onEvent('script_executed', (data) => {
|
|
128
|
+
console.log('Script ran:', data.code, data.result);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
scripting.onEvent('script_error', (data) => {
|
|
132
|
+
console.error('Error:', data.error);
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
scripting.onEvent('recording_started', () => {});
|
|
136
|
+
scripting.onEvent('recording_stopped', (data) => {
|
|
137
|
+
console.log('Macro:', data.macro.code);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
scripting.onEvent('console_output', (data) => {
|
|
141
|
+
console.log(`[${data.type}] ${data.text}`);
|
|
142
|
+
});
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Error Handling
|
|
146
|
+
```javascript
|
|
147
|
+
try {
|
|
148
|
+
await scripting.execute(code);
|
|
149
|
+
} catch (error) {
|
|
150
|
+
console.error(error.message);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Get last error
|
|
154
|
+
const lastError = scripting.getLastError();
|
|
155
|
+
if (lastError) {
|
|
156
|
+
console.error(lastError);
|
|
157
|
+
scripting.clearError();
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### CAD Helper Methods
|
|
162
|
+
|
|
163
|
+
#### Shapes
|
|
164
|
+
```javascript
|
|
165
|
+
cad.createBox(width, height, depth);
|
|
166
|
+
cad.createCylinder(radius, height, segments);
|
|
167
|
+
cad.createSphere(radius, segments);
|
|
168
|
+
cad.createCone(radius, height, segments);
|
|
169
|
+
cad.createTorus(majorRadius, minorRadius, segments);
|
|
170
|
+
cad.createWedge(width, height, depth);
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
#### Sketching
|
|
174
|
+
```javascript
|
|
175
|
+
cad.sketch.line(p1, p2);
|
|
176
|
+
cad.sketch.circle(center, radius);
|
|
177
|
+
cad.sketch.arc(center, radius, startAngle, endAngle);
|
|
178
|
+
cad.sketch.rectangle(corner1, corner2);
|
|
179
|
+
cad.sketch.polygon(center, radius, sides);
|
|
180
|
+
cad.sketch.polyline(points);
|
|
181
|
+
cad.sketch.spline(points);
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
#### Positioning
|
|
185
|
+
```javascript
|
|
186
|
+
cad.position(x, y, z);
|
|
187
|
+
cad.move(dx, dy, dz);
|
|
188
|
+
cad.rotate(x, y, z);
|
|
189
|
+
cad.rotateAround(axis, angle, point);
|
|
190
|
+
cad.scale(sx, sy, sz);
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
#### Operations
|
|
194
|
+
```javascript
|
|
195
|
+
cad.extrude(distance, options);
|
|
196
|
+
cad.revolve(angle, axis);
|
|
197
|
+
cad.sweep(profileId, pathId, options);
|
|
198
|
+
cad.loft(profileIds, options);
|
|
199
|
+
cad.fillet(radius, edges);
|
|
200
|
+
cad.chamfer(distance, edges);
|
|
201
|
+
cad.hole(diameter, depth);
|
|
202
|
+
cad.counterbore(holeRadius, cboreRadius, cboreDist);
|
|
203
|
+
cad.countersink(holeRadius, cskRadius, cskAngle);
|
|
204
|
+
cad.union(otherIds);
|
|
205
|
+
cad.cut(otherIds);
|
|
206
|
+
cad.intersect(otherIds);
|
|
207
|
+
cad.shell(thickness);
|
|
208
|
+
cad.pattern(countX, countY, spacingX, spacingY);
|
|
209
|
+
cad.circularPattern(count, angle);
|
|
210
|
+
cad.mirrorBody(plane);
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
#### Assembly
|
|
214
|
+
```javascript
|
|
215
|
+
cad.assembly.mate(body1Id, body2Id, type, options);
|
|
216
|
+
cad.assembly.hideAll();
|
|
217
|
+
cad.assembly.showAll();
|
|
218
|
+
cad.assembly.explode(scale);
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
#### Inspection
|
|
222
|
+
```javascript
|
|
223
|
+
cad.measure(a, b);
|
|
224
|
+
cad.getMass(options);
|
|
225
|
+
cad.getVolume();
|
|
226
|
+
cad.getBounds();
|
|
227
|
+
cad.getSurfaceArea();
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
#### Materials
|
|
231
|
+
```javascript
|
|
232
|
+
cad.material(name);
|
|
233
|
+
cad.color(hex);
|
|
234
|
+
cad.opacity(value);
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
#### Selection
|
|
238
|
+
```javascript
|
|
239
|
+
cad.select(name);
|
|
240
|
+
cad.selectAll();
|
|
241
|
+
cad.selectByTag(tag);
|
|
242
|
+
cad.hide(name);
|
|
243
|
+
cad.show(name);
|
|
244
|
+
cad.isolate(name);
|
|
245
|
+
cad.showAll();
|
|
246
|
+
cad.delete(name);
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
#### Export
|
|
250
|
+
```javascript
|
|
251
|
+
cad.exportSTL(filename);
|
|
252
|
+
cad.exportOBJ(filename);
|
|
253
|
+
cad.exportGLTF(filename);
|
|
254
|
+
cad.exportSTEP(filename);
|
|
255
|
+
cad.exportJSON(filename);
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
#### View
|
|
259
|
+
```javascript
|
|
260
|
+
cad.view.fitAll();
|
|
261
|
+
cad.view.fitSelection();
|
|
262
|
+
cad.view.setView('front', 'top', 'isometric', etc.);
|
|
263
|
+
cad.view.showGrid();
|
|
264
|
+
cad.view.hideGrid();
|
|
265
|
+
cad.view.setZoom(factor);
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## FORMATS MODULE API
|
|
271
|
+
|
|
272
|
+
**Import:**
|
|
273
|
+
```javascript
|
|
274
|
+
import formats from './modules/formats-module.js';
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
### Initialization
|
|
278
|
+
```javascript
|
|
279
|
+
formats.init(viewport, kernel, containerEl);
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
### Format Detection
|
|
283
|
+
```javascript
|
|
284
|
+
// Auto-detect from file
|
|
285
|
+
const format = await formats.detectFormat(file);
|
|
286
|
+
|
|
287
|
+
// From filename string
|
|
288
|
+
const format = formats.detectFormat('model.step');
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
### Import
|
|
292
|
+
```javascript
|
|
293
|
+
const result = await formats.import_(file, format, options);
|
|
294
|
+
// Result: {success, name, meshCount, meshes, boundingBox, format, filename}
|
|
295
|
+
|
|
296
|
+
// With options
|
|
297
|
+
await formats.import_(file, 'step', {
|
|
298
|
+
scale: 1.0,
|
|
299
|
+
position: [0, 0, 0],
|
|
300
|
+
centerModel: true,
|
|
301
|
+
unitFrom: 'mm',
|
|
302
|
+
unitTo: 'mm',
|
|
303
|
+
mergeGeometry: false,
|
|
304
|
+
fitCamera: true
|
|
305
|
+
});
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### Export
|
|
309
|
+
```javascript
|
|
310
|
+
const blob = await formats.export_(format, options);
|
|
311
|
+
// Downloads automatically
|
|
312
|
+
|
|
313
|
+
// With options
|
|
314
|
+
await formats.export_('stl', {
|
|
315
|
+
filename: 'part.stl',
|
|
316
|
+
binary: true,
|
|
317
|
+
scale: 1.0,
|
|
318
|
+
resolution: 1.0,
|
|
319
|
+
quality: 85,
|
|
320
|
+
includeNormals: true,
|
|
321
|
+
includeMaterials: true
|
|
322
|
+
});
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
### Batch Conversion
|
|
326
|
+
```javascript
|
|
327
|
+
const results = await formats.batchConvert(files, outputFormat, options);
|
|
328
|
+
// results: {success: count, failed: count, results: [{file, filename, status, error}, ...]}
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
### Server Configuration
|
|
332
|
+
```javascript
|
|
333
|
+
// Set converter service URL
|
|
334
|
+
formats.setConverterUrl('http://localhost:8787');
|
|
335
|
+
|
|
336
|
+
// Get current URL
|
|
337
|
+
const url = formats.getConverterUrl();
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
### Supported Formats
|
|
341
|
+
```javascript
|
|
342
|
+
// Get all supported formats
|
|
343
|
+
const supported = formats.getSupportedFormats();
|
|
344
|
+
// {import: ['step', 'stl', ...], export: ['stl', 'obj', ...]}
|
|
345
|
+
|
|
346
|
+
// Get format info
|
|
347
|
+
const info = formats.getFormatInfo('step');
|
|
348
|
+
// {name, ext, binary, category}
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
### Recent Imports
|
|
352
|
+
```javascript
|
|
353
|
+
// Get recent imports
|
|
354
|
+
const recent = formats.getRecentImports();
|
|
355
|
+
// [{filename, format, timestamp}, ...]
|
|
356
|
+
|
|
357
|
+
// Clear recent list
|
|
358
|
+
formats.clearRecentImports();
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
### Error Handling
|
|
362
|
+
```javascript
|
|
363
|
+
try {
|
|
364
|
+
await formats.import_(file);
|
|
365
|
+
} catch (error) {
|
|
366
|
+
console.error(error.message);
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
const lastError = formats.getLastError();
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
---
|
|
373
|
+
|
|
374
|
+
## DATA MODULE API
|
|
375
|
+
|
|
376
|
+
**Import:**
|
|
377
|
+
```javascript
|
|
378
|
+
const data = (await import('./modules/data-module.js')).default;
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
### Initialization
|
|
382
|
+
```javascript
|
|
383
|
+
await data.init();
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
### Project Management
|
|
387
|
+
```javascript
|
|
388
|
+
// Create new project
|
|
389
|
+
const proj = await data.newProject({
|
|
390
|
+
name: 'My Design',
|
|
391
|
+
description: '...',
|
|
392
|
+
units: 'mm',
|
|
393
|
+
templateName: 'Mechanical Part'
|
|
394
|
+
});
|
|
395
|
+
// Returns: {id, name, description, created, units}
|
|
396
|
+
|
|
397
|
+
// Load project
|
|
398
|
+
await data.load({ projectId: 'proj-123' });
|
|
399
|
+
|
|
400
|
+
// Save current project
|
|
401
|
+
await data.save();
|
|
402
|
+
|
|
403
|
+
// Delete project
|
|
404
|
+
await data.delete({
|
|
405
|
+
projectId: 'proj-123',
|
|
406
|
+
permanent: false // true for permanent delete
|
|
407
|
+
});
|
|
408
|
+
|
|
409
|
+
// Duplicate project
|
|
410
|
+
const cloned = await data.duplicate({
|
|
411
|
+
projectId: 'proj-123',
|
|
412
|
+
newName: 'My Design v2'
|
|
413
|
+
});
|
|
414
|
+
|
|
415
|
+
// List all projects
|
|
416
|
+
const projects = await data.listProjects({
|
|
417
|
+
limit: 20,
|
|
418
|
+
offset: 0,
|
|
419
|
+
sortBy: 'modified', // 'name', 'created', 'modified', 'size'
|
|
420
|
+
search: 'pump'
|
|
421
|
+
});
|
|
422
|
+
// Returns: [{id, name, description, created, modified, fileCount, sizeBytes, thumbnail, author}]
|
|
423
|
+
|
|
424
|
+
// Get recent projects
|
|
425
|
+
const recent = await data.getRecent({ limit: 20 });
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
### File Management
|
|
429
|
+
```javascript
|
|
430
|
+
// Create folder
|
|
431
|
+
await data.createFolder({
|
|
432
|
+
path: '', // parent folder path
|
|
433
|
+
name: 'parts'
|
|
434
|
+
});
|
|
435
|
+
|
|
436
|
+
// Import file into project
|
|
437
|
+
await data.importFile({
|
|
438
|
+
file: userSelectedFile,
|
|
439
|
+
folder: 'parts/',
|
|
440
|
+
name: 'optional_override',
|
|
441
|
+
tags: ['purchased', 'plastic']
|
|
442
|
+
});
|
|
443
|
+
|
|
444
|
+
// Delete file
|
|
445
|
+
await data.deleteFile({
|
|
446
|
+
fileKey: 'parts/pump-body.ipt'
|
|
447
|
+
});
|
|
448
|
+
|
|
449
|
+
// List files in project
|
|
450
|
+
const files = await data.listFiles({ folder: 'parts/' });
|
|
451
|
+
// Returns: [{key, name, type, size, imported, tags}]
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
### Sharing
|
|
455
|
+
```javascript
|
|
456
|
+
// Generate share link
|
|
457
|
+
const share = await data.shareLink({
|
|
458
|
+
projectId: 'proj-123',
|
|
459
|
+
role: 'viewer', // 'viewer' or 'editor'
|
|
460
|
+
expiresIn: 604800 // 1 week in seconds, null = never
|
|
461
|
+
});
|
|
462
|
+
// Returns: {link, code, role, expiresAt}
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
### Export/Import Projects
|
|
466
|
+
```javascript
|
|
467
|
+
// Export project as JSON
|
|
468
|
+
const blob = await data.exportProject({
|
|
469
|
+
projectId: 'proj-123'
|
|
470
|
+
});
|
|
471
|
+
|
|
472
|
+
// Import exported project
|
|
473
|
+
const imported = await data.importProject({
|
|
474
|
+
file: userSelectedFile,
|
|
475
|
+
asCopy: true // create new project or overwrite
|
|
476
|
+
});
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
### Templates
|
|
480
|
+
```javascript
|
|
481
|
+
// Create template from current project
|
|
482
|
+
await data.createTemplate({
|
|
483
|
+
projectId: 'proj-123',
|
|
484
|
+
name: 'Modular Pump',
|
|
485
|
+
description: 'Reusable pump with customizable bore'
|
|
486
|
+
});
|
|
487
|
+
|
|
488
|
+
// Create project from template
|
|
489
|
+
const proj = await data.fromTemplate({
|
|
490
|
+
templateName: 'Modular Pump',
|
|
491
|
+
newProjectName: 'Pump v2'
|
|
492
|
+
});
|
|
493
|
+
|
|
494
|
+
// List all templates
|
|
495
|
+
const templates = await data.listTemplates();
|
|
496
|
+
// Returns: [{name, description, created}]
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
### Trash & Recovery
|
|
500
|
+
```javascript
|
|
501
|
+
// List deleted projects
|
|
502
|
+
const trash = await data.listTrash({ limit: 50 });
|
|
503
|
+
// Returns: [{id, name, deletedAt, recoveryUntil}]
|
|
504
|
+
|
|
505
|
+
// Restore project from trash
|
|
506
|
+
await data.restoreFromTrash({ projectId: 'proj-123' });
|
|
507
|
+
|
|
508
|
+
// Empty trash (permanent delete)
|
|
509
|
+
await data.emptyTrash({ permanentDelete: true });
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
### Backups
|
|
513
|
+
```javascript
|
|
514
|
+
// Create manual backup
|
|
515
|
+
const backup = await data.createBackup({
|
|
516
|
+
projectId: 'proj-123'
|
|
517
|
+
});
|
|
518
|
+
// Returns: {id, projectId, timestamp, data}
|
|
519
|
+
|
|
520
|
+
// List backups for project
|
|
521
|
+
const backups = await data.listBackups({
|
|
522
|
+
projectId: 'proj-123'
|
|
523
|
+
});
|
|
524
|
+
// Returns: [{id, timestamp, sizeBytes}]
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
### Document Properties
|
|
528
|
+
```javascript
|
|
529
|
+
// Set properties
|
|
530
|
+
await data.setDocumentProperties({
|
|
531
|
+
title: 'Pump Assembly',
|
|
532
|
+
author: 'John Smith',
|
|
533
|
+
description: '...',
|
|
534
|
+
tags: ['mechanical', 'water'],
|
|
535
|
+
version: '2.0'
|
|
536
|
+
});
|
|
537
|
+
|
|
538
|
+
// Get properties
|
|
539
|
+
const props = await data.getDocumentProperties();
|
|
540
|
+
// Returns: {title, description, author, created, modified, revision, tags, version}
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
### Units
|
|
544
|
+
```javascript
|
|
545
|
+
// Set project units
|
|
546
|
+
await data.setUnits('mm');
|
|
547
|
+
|
|
548
|
+
// Convert between units
|
|
549
|
+
const converted = data.convertUnits(100, 'mm', 'inch');
|
|
550
|
+
// Result: 3.937...
|
|
551
|
+
```
|
|
552
|
+
|
|
553
|
+
### Search
|
|
554
|
+
```javascript
|
|
555
|
+
// Full-text search
|
|
556
|
+
const results = await data.searchProjects({
|
|
557
|
+
query: 'pump',
|
|
558
|
+
limit: 20
|
|
559
|
+
});
|
|
560
|
+
// Returns: [{id, name, description, match}]
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
### Events
|
|
564
|
+
```javascript
|
|
565
|
+
// Listen for data events
|
|
566
|
+
window.addEventListener('data:projectCreated', (e) => {
|
|
567
|
+
console.log('Project created:', e.detail);
|
|
568
|
+
});
|
|
569
|
+
|
|
570
|
+
window.addEventListener('data:projectLoaded', (e) => {
|
|
571
|
+
console.log('Project loaded:', e.detail);
|
|
572
|
+
});
|
|
573
|
+
|
|
574
|
+
window.addEventListener('data:projectSaved', (e) => {
|
|
575
|
+
console.log('Project saved:', e.detail.projectId);
|
|
576
|
+
});
|
|
577
|
+
|
|
578
|
+
window.addEventListener('data:crashDetected', (e) => {
|
|
579
|
+
console.log('Crash detected — offer recovery');
|
|
580
|
+
});
|
|
581
|
+
|
|
582
|
+
window.addEventListener('data:notification', (e) => {
|
|
583
|
+
console.log(`[${e.detail.type}] ${e.detail.message}`);
|
|
584
|
+
});
|
|
585
|
+
```
|
|
586
|
+
|
|
587
|
+
### State Access
|
|
588
|
+
```javascript
|
|
589
|
+
// Current project
|
|
590
|
+
if (data.state.currentProject) {
|
|
591
|
+
console.log(data.state.currentProject.name);
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
// Recent files
|
|
595
|
+
console.log(data.state.recentFiles);
|
|
596
|
+
|
|
597
|
+
// Storage usage
|
|
598
|
+
console.log(`Using ${data.state.usageBytes / 1e6}MB of ${data.state.quotaBytes / 1e9}GB`);
|
|
599
|
+
|
|
600
|
+
// Auto-save interval
|
|
601
|
+
console.log(`Auto-save every ${data.state.autoSaveFrequency}ms`);
|
|
602
|
+
```
|
|
603
|
+
|
|
604
|
+
---
|
|
605
|
+
|
|
606
|
+
## HELP ENTRIES
|
|
607
|
+
|
|
608
|
+
All three modules export comprehensive help documentation:
|
|
609
|
+
|
|
610
|
+
```javascript
|
|
611
|
+
import scripting from './modules/scripting-module.js';
|
|
612
|
+
console.log(scripting.helpEntries);
|
|
613
|
+
// Each entry: {id, title, category, description, content}
|
|
614
|
+
|
|
615
|
+
import formats from './modules/formats-module.js';
|
|
616
|
+
console.log(formats.helpEntries);
|
|
617
|
+
|
|
618
|
+
import data from './modules/data-module.js';
|
|
619
|
+
console.log(data.helpEntries);
|
|
620
|
+
```
|
|
621
|
+
|
|
622
|
+
---
|
|
623
|
+
|
|
624
|
+
## INTEGRATION EXAMPLE
|
|
625
|
+
|
|
626
|
+
```javascript
|
|
627
|
+
// Complete workflow
|
|
628
|
+
import scripting from './modules/scripting-module.js';
|
|
629
|
+
import formats from './modules/formats-module.js';
|
|
630
|
+
import data from './modules/data-module.js';
|
|
631
|
+
|
|
632
|
+
// Initialize
|
|
633
|
+
scripting.init(viewport, kernel);
|
|
634
|
+
formats.init(viewport, kernel);
|
|
635
|
+
await data.init();
|
|
636
|
+
|
|
637
|
+
// Create project
|
|
638
|
+
const proj = await data.newProject({
|
|
639
|
+
name: 'New Design',
|
|
640
|
+
units: 'mm'
|
|
641
|
+
});
|
|
642
|
+
|
|
643
|
+
// Import CAD file
|
|
644
|
+
const imported = await formats.import_(file, 'step', {
|
|
645
|
+
unitFrom: 'mm',
|
|
646
|
+
centerModel: true
|
|
647
|
+
});
|
|
648
|
+
|
|
649
|
+
// Run script on imported geometry
|
|
650
|
+
await scripting.execute(`
|
|
651
|
+
cad.fillet(2);
|
|
652
|
+
cad.color(0x8899aa);
|
|
653
|
+
`);
|
|
654
|
+
|
|
655
|
+
// Save project
|
|
656
|
+
await data.save();
|
|
657
|
+
|
|
658
|
+
// Export result
|
|
659
|
+
await formats.export_('stl', {
|
|
660
|
+
filename: 'final.stl',
|
|
661
|
+
binary: true
|
|
662
|
+
});
|
|
663
|
+
|
|
664
|
+
// Create share link
|
|
665
|
+
const share = await data.shareLink({
|
|
666
|
+
role: 'viewer',
|
|
667
|
+
expiresIn: 604800
|
|
668
|
+
});
|
|
669
|
+
|
|
670
|
+
console.log('Share:', share.link);
|
|
671
|
+
```
|
|
672
|
+
|
|
673
|
+
---
|
|
674
|
+
|
|
675
|
+
## ERROR HANDLING PATTERNS
|
|
676
|
+
|
|
677
|
+
```javascript
|
|
678
|
+
// Scripting errors
|
|
679
|
+
try {
|
|
680
|
+
await scripting.execute(code);
|
|
681
|
+
} catch (error) {
|
|
682
|
+
const lastErr = scripting.getLastError();
|
|
683
|
+
console.error(lastErr.message);
|
|
684
|
+
scripting.clearError();
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
// Format errors
|
|
688
|
+
try {
|
|
689
|
+
await formats.import_(file);
|
|
690
|
+
} catch (error) {
|
|
691
|
+
const err = formats.getLastError();
|
|
692
|
+
console.error(`Import failed: ${err.message}`);
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
// Data errors
|
|
696
|
+
try {
|
|
697
|
+
await data.newProject({name: ''});
|
|
698
|
+
} catch (error) {
|
|
699
|
+
console.error(`Project error: ${error.message}`);
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
// Event-based errors
|
|
703
|
+
window.addEventListener('data:notification', (e) => {
|
|
704
|
+
if (e.detail.type === 'error') {
|
|
705
|
+
showUserAlert(e.detail.message);
|
|
706
|
+
}
|
|
707
|
+
});
|
|
708
|
+
```
|
|
709
|
+
|
|
710
|
+
---
|
|
711
|
+
|
|
712
|
+
**End of API Reference**
|