import {ReadSketch} from './sketchReader'; import {getSketchBoundaries} from './sketchBoundaries'; import {state, stream} from 'lstream'; import {InPlaceSketcher} from './inPlaceSketcher'; import sketcherUIContrib from './sketcherUIContrib'; import initReassignSketchMode from './reassignSketchMode'; import sketcherStreams from '../../sketcher/sketcherStreams'; export function defineStreams(ctx) { ctx.streams.sketcher = { update: stream(), sketchingFace: state(null) }; ctx.streams.sketcher.sketchingMode = ctx.streams.sketcher.sketchingFace.map(face => !!face); } export function activate(ctx) { let {streams, services} = ctx; sketcherUIContrib(ctx); const onSketchUpdate = evt => { let prefix = services.project.sketchStorageNamespace; if (evt.key.indexOf(prefix) < 0) return; let sketchFaceId = evt.key.substring(prefix.length); let sketchFace = services.cadRegistry.findFace(sketchFaceId); if (sketchFace) { updateSketchForFace(sketchFace); services.viewer.requestRender(); } }; services.storage.addListener(onSketchUpdate); function getAllSketches() { let nm = services.project.sketchStorageNamespace; return services.storage.getAllKeysFromNamespace(nm).map(fqn => ({ fqn, id: fqn.substring(nm.length) })); } function getSketchData(sketchId) { let sketchStorageKey = services.project.sketchStorageKey(sketchId); return services.storage.get(sketchStorageKey); } function setSketchData(sketchId, data) { let sketchStorageKey = services.project.sketchStorageKey(sketchId); return services.storage.set(sketchStorageKey, data); } function removeSketchData(sketchId) { let sketchStorageKey = services.project.sketchStorageKey(sketchId); return services.storage.remove(sketchStorageKey); } function readSketch(sketchId) { let savedSketch = getSketchData(sketchId); if (savedSketch === null) { return null; } try { return ReadSketch(JSON.parse(savedSketch), sketchId, true); } catch (e) { console.error(e); return null; } } function hasSketch(sketchId) { let sketchStorageKey = services.project.sketchStorageKey(sketchId); return !!services.storage.get(sketchStorageKey); } function updateSketchForFace(mFace) { let sketch = readSketch(mFace.defaultSketchId); mFace.setSketch(sketch); streams.sketcher.update.next(mFace); } function updateAllSketches() { let allShells = services.cadRegistry.getAllShells(); allShells.forEach(mShell => mShell.faces.forEach(mFace => updateSketchForFace(mFace))); services.viewer.requestRender(); } function updateSketchBoundaries(sceneFace) { let sketchStorageKey = services.project.sketchStorageKey(sceneFace.id); let sketch = services.storage.get(sketchStorageKey); let data = sketch === null ? {} : JSON.parse(sketch); data.boundary = getSketchBoundaries(sceneFace); services.storage.set(sketchStorageKey, JSON.stringify(data)); } let inPlaceEditor = new InPlaceSketcher(ctx); function sketchFace(face) { updateSketchBoundaries(face); if (inPlaceEditor.inEditMode) { inPlaceEditor.exit(); } inPlaceEditor.enter(face); } function sketchFace2D(face) { updateSketchBoundaries(face); let sketchURL = services.project.getSketchURL(face.id); services.appTabs.show(face.id, 'Sketch ' + face.id, 'sketcher.html#' + sketchURL); } function reassignSketch(fromId, toId) { let sketchData = getSketchData(fromId); if (!sketchData) { return; } setSketchData(toId, sketchData); removeSketchData(fromId); updateSketchForFace(services.cadRegistry.findFace(fromId)); updateSketchForFace(services.cadRegistry.findFace(toId)); services.viewer.requestRender(); } streams.craft.models.attach(updateAllSketches); streams.craft.models.attach(() => { if (inPlaceEditor.inEditMode) { if (!inPlaceEditor.face.ext.view) { inPlaceEditor.exit(); } } }); services.sketcher = { sketchFace, sketchFace2D, updateAllSketches, getAllSketches, readSketch, hasSketch, inPlaceEditor, reassignSketch, reassignSketchMode: initReassignSketchMode(ctx) } }