jsketcher/web/app/cad/sketch/sketcherPlugin.js

140 lines
4.2 KiB
JavaScript

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)
}
}