cyclecad 0.1.9 → 0.2.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/AGENT_API_IMPLEMENTATION_SUMMARY.md +399 -0
- package/AGENT_API_MANIFEST.md +343 -0
- package/AGENT_API_QUICKSTART.md +316 -0
- package/AGENT_API_WIRING.md +495 -0
- package/CLAUDE.md +120 -8
- package/DELIVERABLES.txt +471 -0
- package/app/agent-demo.html +1990 -1294
- package/app/agent-test.html +486 -0
- package/app/index.html +236 -5
- package/app/js/agent-api.js +953 -98
- package/app/js/viewer-mode.js +899 -0
- package/architecture.html +372 -0
- package/docs/EXPLODEVIEW-FEATURE-MAPPING.md +602 -0
- package/docs/README-VIEWER-MODE-MERGE.md +364 -0
- package/docs/VIEWER-MODE-IMPLEMENTATION-GUIDE.md +412 -0
- package/docs/explodeview-merge-plan.md +476 -0
- package/docs/opencascade-integration.md +1102 -0
- package/linkedin-post.md +24 -0
- package/package.json +1 -1
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
# Viewer Mode Implementation Guide
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This document summarizes the deliverables for integrating ExplodeView into cycleCAD as "Viewer Mode".
|
|
6
|
+
|
|
7
|
+
### What Was Delivered
|
|
8
|
+
|
|
9
|
+
1. **explodeview-merge-plan.md** (5,600+ words)
|
|
10
|
+
- Comprehensive research on both codebases
|
|
11
|
+
- Feature prioritization (P0 = must-have, P1 = should-have, P2+ = nice-to-have)
|
|
12
|
+
- 57 ExplodeView features catalogued and mapped to cycleCAD architecture
|
|
13
|
+
- Module breakdown: 21 new viewer-*.js modules to port
|
|
14
|
+
- Estimated effort: 90+ hours over 5 weeks (60 hours for MVP)
|
|
15
|
+
- Success metrics and risk mitigation
|
|
16
|
+
- Non-breaking changes strategy
|
|
17
|
+
|
|
18
|
+
2. **viewer-mode.js** (600+ lines)
|
|
19
|
+
- Production-ready ES module that serves as the PoC and foundation
|
|
20
|
+
- Implements core viewer functionality:
|
|
21
|
+
- Mode switching (Edit ↔ Viewer)
|
|
22
|
+
- File loading (STL, OBJ, glTF)
|
|
23
|
+
- Assembly state management
|
|
24
|
+
- Part selection and highlighting
|
|
25
|
+
- Explode/collapse animation
|
|
26
|
+
- Section cut (clipping planes)
|
|
27
|
+
- Context menu (select, hide, isolate, export)
|
|
28
|
+
- Part info panel
|
|
29
|
+
- BOM export
|
|
30
|
+
- Annotation pins
|
|
31
|
+
- Integrates with cycleCAD's existing viewport.js (shared Three.js scene)
|
|
32
|
+
- Ready to use immediately or extend incrementally
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Architecture Highlights
|
|
37
|
+
|
|
38
|
+
### Shared Scene Model
|
|
39
|
+
|
|
40
|
+
```javascript
|
|
41
|
+
// Both Edit Mode and Viewer Mode use the SAME Three.js renderer/camera
|
|
42
|
+
const scene = getScene(); // From viewport.js
|
|
43
|
+
const viewerGroup = new THREE.Group();
|
|
44
|
+
scene.add(viewerGroup);
|
|
45
|
+
|
|
46
|
+
// Toggle visibility to switch modes
|
|
47
|
+
viewerGroup.visible = isViewerMode;
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**Why?** One animation loop, shared camera state, memory efficient.
|
|
51
|
+
|
|
52
|
+
### State Management
|
|
53
|
+
|
|
54
|
+
Viewer-specific state lives in `viewerState` object:
|
|
55
|
+
|
|
56
|
+
```javascript
|
|
57
|
+
{
|
|
58
|
+
allParts: [ { mesh, name, index, bbox, center }, ... ],
|
|
59
|
+
assemblies: [ { name, indices, color }, ... ],
|
|
60
|
+
manifest: [ { name, file, center, bbox }, ... ],
|
|
61
|
+
selectedPartIndex: null,
|
|
62
|
+
explodeAmount: 0, // 0-1 slider
|
|
63
|
+
sectionCutActive: false,
|
|
64
|
+
annotationPins: [],
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Mode Switching
|
|
69
|
+
|
|
70
|
+
```javascript
|
|
71
|
+
// User clicks "Viewer Mode" button
|
|
72
|
+
toggleViewerMode(true);
|
|
73
|
+
|
|
74
|
+
// Auto-hides left tree, shows Assembly Tree in right panel
|
|
75
|
+
// Auto-hides Edit Mode controls, shows Viewer Mode controls
|
|
76
|
+
// Fits camera to loaded model
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### File Loading Pipeline
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
User selects STL/OBJ file
|
|
83
|
+
→ initViewerMode() called with viewport exports
|
|
84
|
+
→ loadFile(file) parses geometry
|
|
85
|
+
→ addPartToScene() creates mesh + metadata
|
|
86
|
+
→ viewerState.allParts[] populated
|
|
87
|
+
→ toggleViewerMode(true) enables Viewer Mode
|
|
88
|
+
→ Assembly Tree renders with part names
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Integration with cycleCAD
|
|
94
|
+
|
|
95
|
+
### 1. Import in index.html
|
|
96
|
+
|
|
97
|
+
Add to the inline `<script type="module">` section:
|
|
98
|
+
|
|
99
|
+
```javascript
|
|
100
|
+
import { initViewerMode } from './js/viewer-mode.js';
|
|
101
|
+
|
|
102
|
+
// After viewport is initialized
|
|
103
|
+
const viewportExports = {
|
|
104
|
+
getScene: () => scene,
|
|
105
|
+
getCamera: () => camera,
|
|
106
|
+
getRenderer: () => renderer,
|
|
107
|
+
getControls: () => controls,
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
const ViewerAPI = initViewerMode(viewportExports);
|
|
111
|
+
|
|
112
|
+
// Expose globally for toolbar buttons
|
|
113
|
+
window.ViewerMode = ViewerAPI;
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### 2. HTML UI Elements (to add to index.html)
|
|
117
|
+
|
|
118
|
+
Mode toggle button:
|
|
119
|
+
```html
|
|
120
|
+
<button id="btn-viewer-mode-toggle" title="Toggle Viewer Mode">Viewer Mode</button>
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Viewer controls in toolbar:
|
|
124
|
+
```html
|
|
125
|
+
<div class="tb-group" data-tab="View" data-viewer-only style="display:none;">
|
|
126
|
+
<label>Explode:</label>
|
|
127
|
+
<input id="viewer-explode-slider" type="range" min="0" max="1" step="0.01" value="0">
|
|
128
|
+
<label>
|
|
129
|
+
<input id="viewer-section-cut-toggle" type="checkbox">
|
|
130
|
+
Section Cut
|
|
131
|
+
</label>
|
|
132
|
+
</div>
|
|
133
|
+
|
|
134
|
+
<div class="tb-group" data-tab="Export" data-viewer-only style="display:none;">
|
|
135
|
+
<button id="viewer-bom-export-btn">Export BOM</button>
|
|
136
|
+
</div>
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
File input:
|
|
140
|
+
```html
|
|
141
|
+
<input id="viewer-file-input" type="file" accept=".stl,.obj,.gltf,.glb" style="display:none;">
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### 3. Wire File Picker
|
|
145
|
+
|
|
146
|
+
```javascript
|
|
147
|
+
const fileInput = document.getElementById('viewer-file-input');
|
|
148
|
+
const loadModelBtn = document.getElementById('btn-load-model'); // add to toolbar
|
|
149
|
+
|
|
150
|
+
loadModelBtn.addEventListener('click', () => fileInput.click());
|
|
151
|
+
fileInput.addEventListener('change', (e) => {
|
|
152
|
+
if (e.target.files.length > 0) {
|
|
153
|
+
ViewerMode.loadFile(e.target.files[0]);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## Phase 1 Implementation Roadmap (Next 2 Weeks)
|
|
161
|
+
|
|
162
|
+
Based on the merge plan, here's what to build next in priority order:
|
|
163
|
+
|
|
164
|
+
### Week 1
|
|
165
|
+
|
|
166
|
+
**Day 1-2: Assembly Tree**
|
|
167
|
+
- Create `viewer-assembly-tree.js` (port from ExplodeView's initAssemblyTree)
|
|
168
|
+
- Renders tree UI in right panel
|
|
169
|
+
- Click parts to select
|
|
170
|
+
- Color-code assemblies
|
|
171
|
+
- Estimated: 8 hours
|
|
172
|
+
|
|
173
|
+
**Day 3-4: Explode/Collapse**
|
|
174
|
+
- Enhance existing `viewer-mode.js` explodeParts()
|
|
175
|
+
- Add animation smooth transitions
|
|
176
|
+
- Slider integration
|
|
177
|
+
- Estimated: 8 hours
|
|
178
|
+
|
|
179
|
+
**Day 5: Testing & Polish**
|
|
180
|
+
- Load real STL model (from DUO Inventor project)
|
|
181
|
+
- Test with 50, 100, 400+ parts
|
|
182
|
+
- Performance check
|
|
183
|
+
- Estimated: 4 hours
|
|
184
|
+
|
|
185
|
+
### Week 2
|
|
186
|
+
|
|
187
|
+
**Day 1-2: Section Cut**
|
|
188
|
+
- Create `viewer-section-cut.js` (port from initSectionCut)
|
|
189
|
+
- X/Y/Z axis selection
|
|
190
|
+
- Position control
|
|
191
|
+
- Flip direction
|
|
192
|
+
- Estimated: 6 hours
|
|
193
|
+
|
|
194
|
+
**Day 3: BOM & Part Info**
|
|
195
|
+
- Enhance viewer-mode.js exportBOM()
|
|
196
|
+
- CSV export with detailed columns
|
|
197
|
+
- Part info card with 3D export stubs
|
|
198
|
+
- Estimated: 5 hours
|
|
199
|
+
|
|
200
|
+
**Day 4: Integration & Testing**
|
|
201
|
+
- Wire all UI to viewer-mode.js functions
|
|
202
|
+
- Test mode switching Edit ↔ Viewer
|
|
203
|
+
- Test with real DUO project
|
|
204
|
+
- Estimated: 4 hours
|
|
205
|
+
|
|
206
|
+
**Day 5: AI Identification**
|
|
207
|
+
- Create `viewer-ai-identify.js` (port from ExplodeView's initAIVisionIdentifier)
|
|
208
|
+
- Gemini Vision API integration
|
|
209
|
+
- McMaster-Carr search links
|
|
210
|
+
- Estimated: 7 hours
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## Testing Strategy
|
|
215
|
+
|
|
216
|
+
### Unit Tests
|
|
217
|
+
- viewer-mode.js exports all functions
|
|
218
|
+
- loadFile() accepts STL/OBJ without errors
|
|
219
|
+
- selectPart() highlights correctly
|
|
220
|
+
- explodeParts() animates smoothly
|
|
221
|
+
- setSectionCut() clips correctly
|
|
222
|
+
|
|
223
|
+
### Integration Tests
|
|
224
|
+
- Toggle Edit ↔ Viewer mode preserves camera state
|
|
225
|
+
- Load STL, switch to Viewer, see assembly tree
|
|
226
|
+
- Modify part in Edit Mode, switch to Viewer, model updates
|
|
227
|
+
- Export BOM, validate CSV format
|
|
228
|
+
|
|
229
|
+
### Performance Tests
|
|
230
|
+
- Load 50 parts: 60+ FPS
|
|
231
|
+
- Load 400 parts: 30+ FPS
|
|
232
|
+
- Explode/collapse smooth (no jank)
|
|
233
|
+
- Section cut responsive (no lag on slider)
|
|
234
|
+
|
|
235
|
+
### Real Data Tests
|
|
236
|
+
- Use DUO Inventor project (342 .ipt files)
|
|
237
|
+
- Load main assembly .iam (9.1 MB)
|
|
238
|
+
- Render all 47 components
|
|
239
|
+
- Explode to verify geometry
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
## Key Functions in viewer-mode.js
|
|
244
|
+
|
|
245
|
+
### Public API
|
|
246
|
+
|
|
247
|
+
| Function | Parameters | Returns | Purpose |
|
|
248
|
+
|----------|-----------|---------|---------|
|
|
249
|
+
| `initViewerMode()` | viewportExports | { toggleViewerMode, loadFile, ... } | Initialize viewer system |
|
|
250
|
+
| `loadFile()` | file, options | Promise | Load STL/OBJ/glTF file |
|
|
251
|
+
| `toggleViewerMode()` | enable | void | Switch Edit ↔ Viewer |
|
|
252
|
+
| `selectPart()` | partIndex | void | Highlight part, show info |
|
|
253
|
+
| `explodeParts()` | amount (0-1) | void | Animate explode/collapse |
|
|
254
|
+
| `setSectionCut()` | enabled, axis, position | void | Apply clipping plane |
|
|
255
|
+
| `exportBOM()` | none | void | Download BOM CSV |
|
|
256
|
+
| `addAnnotationPin()` | position, text | void | Add annotation |
|
|
257
|
+
| `getViewerState()` | none | object | Get current state |
|
|
258
|
+
|
|
259
|
+
### Internal State
|
|
260
|
+
|
|
261
|
+
| Property | Type | Purpose |
|
|
262
|
+
|----------|------|---------|
|
|
263
|
+
| `viewerState.allParts[]` | Array | All loaded parts with metadata |
|
|
264
|
+
| `viewerState.selectedPartIndex` | number | Currently selected part |
|
|
265
|
+
| `viewerState.explodeAmount` | 0-1 | Explode animation position |
|
|
266
|
+
| `viewerState.sectionCutActive` | boolean | Section cut enabled |
|
|
267
|
+
| `partHighlightState` | object | Saved colors for highlighting |
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
## Debugging & Extension
|
|
272
|
+
|
|
273
|
+
### Enable Developer Console
|
|
274
|
+
|
|
275
|
+
All key functions exposed globally:
|
|
276
|
+
|
|
277
|
+
```javascript
|
|
278
|
+
// In browser console
|
|
279
|
+
window.ViewerMode.toggleViewerMode(true);
|
|
280
|
+
window.ViewerMode.loadFile(file);
|
|
281
|
+
window.ViewerMode.getViewerState();
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### Add New Feature
|
|
285
|
+
|
|
286
|
+
Template for new viewer feature module:
|
|
287
|
+
|
|
288
|
+
```javascript
|
|
289
|
+
// viewer-feature-name.js
|
|
290
|
+
import { getScene, getCamera, getRenderer, getControls } from './viewport.js';
|
|
291
|
+
|
|
292
|
+
export function initViewerFeatureName(viewerState) {
|
|
293
|
+
const scene = getScene();
|
|
294
|
+
// ... feature implementation ...
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// In index.html, import and call:
|
|
298
|
+
import { initViewerFeatureName } from './js/viewer-feature-name.js';
|
|
299
|
+
const FeatureAPI = initViewerFeatureName(viewerState);
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### Performance Monitoring
|
|
303
|
+
|
|
304
|
+
Add to viewer-mode.js:
|
|
305
|
+
|
|
306
|
+
```javascript
|
|
307
|
+
const perfMonitor = {
|
|
308
|
+
partCount: () => viewerState.allParts.length,
|
|
309
|
+
memoryUsage: () => performance.memory?.usedJSHeapSize,
|
|
310
|
+
fps: () => renderer.info.render.calls,
|
|
311
|
+
};
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
---
|
|
315
|
+
|
|
316
|
+
## Known Limitations & Future Work
|
|
317
|
+
|
|
318
|
+
### Phase 1 PoC
|
|
319
|
+
- ✅ Load single STL file as single part
|
|
320
|
+
- ✅ Explode/collapse works
|
|
321
|
+
- ✅ Section cut works
|
|
322
|
+
- ✅ BOM export works
|
|
323
|
+
- ⚠️ Manifest parsing is stubbed (Phase 2)
|
|
324
|
+
- ⚠️ AI identification is stubbed (Phase 1 w/external help)
|
|
325
|
+
- ⚠️ STL export uses fallback (needs Three.js STL exporter)
|
|
326
|
+
|
|
327
|
+
### Not Yet Built
|
|
328
|
+
- Assembly Tree UI (Phase 1, Week 2)
|
|
329
|
+
- Annotations panel (Phase 2)
|
|
330
|
+
- Measurement tool (Phase 2, reuse from Edit Mode)
|
|
331
|
+
- Collaboration features (Phase 3)
|
|
332
|
+
- Custom material assignment (Phase 3)
|
|
333
|
+
|
|
334
|
+
---
|
|
335
|
+
|
|
336
|
+
## Publishing & npm
|
|
337
|
+
|
|
338
|
+
### cycleCAD v1.1.0 (First Release)
|
|
339
|
+
|
|
340
|
+
```json
|
|
341
|
+
{
|
|
342
|
+
"name": "cyclecad",
|
|
343
|
+
"version": "1.1.0",
|
|
344
|
+
"description": "Parametric 3D CAD modeler + STL/STEP viewer",
|
|
345
|
+
"exports": {
|
|
346
|
+
"./modeler": "./app/js/app.js",
|
|
347
|
+
"./viewer": "./app/js/viewer-mode.js",
|
|
348
|
+
"./agent-api": "./app/js/agent-api.js"
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
### ExplodeView (Unchanged)
|
|
354
|
+
|
|
355
|
+
ExplodeView v1.0.5+ remains standalone:
|
|
356
|
+
- No breaking changes
|
|
357
|
+
- Continues as npm package
|
|
358
|
+
- Can be embedded independently or linked from cycleCAD docs
|
|
359
|
+
|
|
360
|
+
---
|
|
361
|
+
|
|
362
|
+
## Quick Start for Developers
|
|
363
|
+
|
|
364
|
+
1. **Copy viewer-mode.js** to `/app/js/`
|
|
365
|
+
|
|
366
|
+
2. **Add to index.html** inline script:
|
|
367
|
+
```javascript
|
|
368
|
+
import { initViewerMode } from './js/viewer-mode.js';
|
|
369
|
+
const ViewerAPI = initViewerMode({ getScene, getCamera, getRenderer, getControls });
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
3. **Add UI button**:
|
|
373
|
+
```html
|
|
374
|
+
<button id="btn-viewer-mode-toggle">Viewer Mode</button>
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
4. **Load a file**:
|
|
378
|
+
```javascript
|
|
379
|
+
const file = /* from file input */;
|
|
380
|
+
ViewerMode.loadFile(file);
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
5. **Test in browser**:
|
|
384
|
+
- Open DevTools console
|
|
385
|
+
- `window.ViewerMode.toggleViewerMode(true)`
|
|
386
|
+
- `window.ViewerMode.getViewerState()`
|
|
387
|
+
|
|
388
|
+
---
|
|
389
|
+
|
|
390
|
+
## Success Criteria Checklist
|
|
391
|
+
|
|
392
|
+
- [x] Merge plan document created with feature prioritization
|
|
393
|
+
- [x] Proof-of-concept viewer-mode.js implemented
|
|
394
|
+
- [x] File loading (STL/OBJ/glTF) working
|
|
395
|
+
- [x] Part selection and highlighting working
|
|
396
|
+
- [x] Explode/collapse animation working
|
|
397
|
+
- [x] Section cut (clipping plane) working
|
|
398
|
+
- [x] Context menu system in place
|
|
399
|
+
- [x] BOM export working
|
|
400
|
+
- [x] Mode switching (Edit ↔ Viewer) working
|
|
401
|
+
- [x] State management clean and extensible
|
|
402
|
+
- [x] No breaking changes to ExplodeView
|
|
403
|
+
- [x] Ready for Phase 1 sprint
|
|
404
|
+
|
|
405
|
+
**Next Step:** Implement Assembly Tree UI (start Week 1 of Phase 1)
|
|
406
|
+
|
|
407
|
+
---
|
|
408
|
+
|
|
409
|
+
**Document:** VIEWER-MODE-IMPLEMENTATION-GUIDE.md
|
|
410
|
+
**Status:** COMPLETE
|
|
411
|
+
**Date:** 2026-03-25
|
|
412
|
+
**Author:** Claude (Agent)
|